From 935fd44f78f19c9a0ccfacf2a6b55bcd0e6a3bdb Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Fri, 13 Jun 2025 15:57:26 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8A=E6=96=99?= =?UTF-8?q?=E4=B8=8B=E6=96=99=E6=8C=89=E9=92=AE=E4=BB=A5=E5=8F=8A=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 2 +- db/jtDB.db | Bin 49152 -> 49152 bytes ui/main_window_ui.py | 20 +++++++++--------- .../__pycache__/config_loader.cpython-310.pyc | Bin 4192 -> 4192 bytes widgets/main_window.py | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/config/app_config.json b/config/app_config.json index e96b4c6..7e456a2 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -4,7 +4,7 @@ "version": "1.0.0", "features": { "enable_serial_ports": false, - "enable_keyboard_listener": true, + "enable_keyboard_listener": false, "enable_camera": false } }, diff --git a/db/jtDB.db b/db/jtDB.db index 6a8557740368ceeb931b8420974a3dadda91e267..a85b1d6972e44eaf98e754d9e5c193eff95d0d62 100644 GIT binary patch delta 1032 zcmZo@U~Xt&o*>P*Vxo*QT)04Ta^m{M%yR77li4?Dig5OD`f~DdoaV^k&}aX^zL7nTU3;^jz;iZc zhbFGc+PfsRfbmn1SX^vmU}UOmV5Vybk0aE`b!g&*DCg!TM!8KB$K;PoCDaWqnVAV0 zZPUaKRm;RgNUc>9+vJT)BvmX4DU4}iovgT5qTaxehsV&+2;I#_RwhPP1_qF1h-?;6 z!oOQX`+lX`)~#iq;pj&(h&7t8C- zE(>IsSojPWVkQd;L~P!(NS}#0rZIN1;$8`E14|wrLnDKN#Ny(~AC@XjR#?RCKOp2e5H6iZTE}WTWZiglfsjA?s$d8Zt023QRt*NPKe59-hg`>-3nD8qtO=rFT7L1pwVOsI&k8 diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index 66cf74b..c6151f3 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -285,13 +285,13 @@ class MainWindowUI(QMainWindow): } """ - # self.input_button = QPushButton("上料") - # self.input_button.setFont(self.normal_font) - # self.input_button.setStyleSheet(button_style + "background-color: #e3f2fd; border: 1px solid #2196f3;") + self.input_button = QPushButton("上料") + self.input_button.setFont(self.normal_font) + self.input_button.setStyleSheet(button_style + "background-color: #e3f2fd; border: 1px solid #2196f3;") - # self.output_button = QPushButton("下料") - # self.output_button.setFont(self.normal_font) - # self.output_button.setStyleSheet(button_style + "background-color: #fff8e1; border: 1px solid #ffc107;") + self.output_button = QPushButton("下料") + self.output_button.setFont(self.normal_font) + self.output_button.setStyleSheet(button_style + "background-color: #fff8e1; border: 1px solid #ffc107;") self.start_button = QPushButton("开始") self.start_button.setFont(self.normal_font) @@ -302,10 +302,10 @@ class MainWindowUI(QMainWindow): self.stop_button.setStyleSheet(button_style + "background-color: #ffebee; border: 1px solid #f44336;") # 使用网格布局排列按钮 - # self.button_layout.addWidget(self.input_button, 0, 0) - # self.button_layout.addWidget(self.output_button, 0, 1) - self.button_layout.addWidget(self.start_button, 0, 1) - self.button_layout.addWidget(self.stop_button, 0, 2) + self.button_layout.addWidget(self.input_button, 0, 0) + self.button_layout.addWidget(self.output_button, 0, 1) + self.button_layout.addWidget(self.start_button, 0, 2) + self.button_layout.addWidget(self.stop_button, 0, 3) self.control_layout.addWidget(self.button_container) diff --git a/utils/__pycache__/config_loader.cpython-310.pyc b/utils/__pycache__/config_loader.cpython-310.pyc index 924dd845c2a6ac61a000d1d7414167c9605ccde9..b0dd2df2521dd8fb951de060fbab575e7cdaee4d 100644 GIT binary patch delta 20 acmaE$@IZk(pO=@50SFe>d2i$n6#xJ`O$90d delta 20 acmaE$@IZk(pO=@50SJtWy*6@(3IG5%{RFQ7 diff --git a/widgets/main_window.py b/widgets/main_window.py index 52fc53a..159d05a 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -243,8 +243,8 @@ class MainWindow(MainWindowUI): self.tray_edit.activated.connect(self.load_finished_inspection_data) # 当用户选择一项时触发 # 连接按钮事件 - # self.input_button.clicked.connect(self.handle_input) - # self.output_button.clicked.connect(self.handle_output) + self.input_button.clicked.connect(self.handle_input) + self.output_button.clicked.connect(self.handle_output) self.start_button.clicked.connect(self.handle_start) self.stop_button.clicked.connect(self.handle_stop) From e9f94db1d647431e53bbe46ae3d7cfe227b5de87 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Fri, 13 Jun 2025 17:14:03 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A4=9A=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 30 ++- main.py | 12 +- ui/settings_ui.py | 34 ++-- .../__pycache__/config_loader.cpython-310.pyc | Bin 4192 -> 6491 bytes utils/__pycache__/sql_utils.cpython-310.pyc | Bin 2678 -> 5714 bytes utils/config_loader.py | 153 ++++++++++++++- utils/init_db.py | 13 +- utils/sql_utils.py | 165 ++++++++++++++-- .../__pycache__/login_widget.cpython-310.pyc | Bin 3474 -> 3456 bytes widgets/login_widget.py | 6 +- widgets/settings_widget.py | 182 ++++++++++++++---- 11 files changed, 505 insertions(+), 90 deletions(-) diff --git a/config/app_config.json b/config/app_config.json index 7e456a2..33a27f1 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -9,13 +9,29 @@ } }, "database": { - "type": "sqlite", - "path": "db/jtDB.db", - "host": "", - "port": "", - "user": "", - "password": "", - "name": "" + "default": "sqlite", + "sources": { + "sqlite": { + "path": "db/jtDB.db", + "description": "默认SQLite数据库" + }, + "postgresql": { + "host": "localhost", + "port": "5432", + "user": "postgres", + "password": "", + "name": "jtDB", + "description": "PostgreSQL数据库" + }, + "mysql": { + "host": "localhost", + "port": "3306", + "user": "root", + "password": "", + "name": "jtDB", + "description": "MySQL数据库" + } + } }, "camera": { "enabled": false, diff --git a/main.py b/main.py index 59eca21..7d3ee9f 100644 --- a/main.py +++ b/main.py @@ -179,8 +179,13 @@ def main(): # 创建db目录(如果不存在) os.makedirs('db', exist_ok=True) + # 从配置获取SQLite数据库路径 + config_loader = ConfigLoader.get_instance() + sqlite_config = config_loader.get_database_config('sqlite') + sqlite_db_path = sqlite_config.get('path', 'db/jtDB.db') + # 检查数据库是否存在,如果不存在则初始化 - if not os.path.exists('db/jtDB.db'): + if not os.path.exists(sqlite_db_path): from utils.init_db import init_database init_database() logging.info("初始化数据库完成") @@ -190,6 +195,11 @@ def main(): exit_code = app.exec() logging.info(f"应用程序退出,退出码: {exit_code}") + + # 关闭所有数据库连接 + from utils.sql_utils import SQLUtils + SQLUtils.close_all_connections() + sys.exit(exit_code) except Exception as e: diff --git a/ui/settings_ui.py b/ui/settings_ui.py index 5ad530a..622fe21 100644 --- a/ui/settings_ui.py +++ b/ui/settings_ui.py @@ -205,25 +205,31 @@ class SettingsUI(QWidget): self.database_layout = QVBoxLayout(self.database_tab) self.database_layout.setContentsMargins(20, 20, 20, 20) - # 数据库类型选择 - self.db_type_group = QGroupBox("数据库类型") + # 数据源类型选择 + self.db_type_group = QGroupBox("数据源类型") self.db_type_group.setFont(self.normal_font) self.db_type_layout = QHBoxLayout() - self.sqlite_radio = QCheckBox("SQLite") - self.sqlite_radio.setFont(self.normal_font) - self.sqlite_radio.setChecked(True) + self.db_type_combo = QComboBox() + self.db_type_combo.setFont(self.normal_font) + self.db_type_combo.addItem("SQLite") + self.db_type_combo.addItem("PostgreSQL") + self.db_type_combo.addItem("MySQL") - self.pgsql_radio = QCheckBox("PostgreSQL") - self.pgsql_radio.setFont(self.normal_font) - - self.mysql_radio = QCheckBox("MySQL") - self.mysql_radio.setFont(self.normal_font) - - self.db_type_layout.addWidget(self.sqlite_radio) - self.db_type_layout.addWidget(self.pgsql_radio) - self.db_type_layout.addWidget(self.mysql_radio) + self.db_type_layout.addWidget(QLabel("当前配置类型:")) + self.db_type_layout.addWidget(self.db_type_combo) self.db_type_layout.addStretch(1) + + # 添加当前使用的数据源选择 + self.current_source_label = QLabel("当前使用的数据源:") + self.current_source_label.setFont(self.normal_font) + self.current_source_combo = QComboBox() + self.current_source_combo.setFont(self.normal_font) + self.current_source_combo.addItems(["SQLite", "PostgreSQL", "MySQL"]) + + self.db_type_layout.addWidget(self.current_source_label) + self.db_type_layout.addWidget(self.current_source_combo) + self.db_type_group.setLayout(self.db_type_layout) self.database_layout.addWidget(self.db_type_group) diff --git a/utils/__pycache__/config_loader.cpython-310.pyc b/utils/__pycache__/config_loader.cpython-310.pyc index b0dd2df2521dd8fb951de060fbab575e7cdaee4d..871a615370ce2fe79cf1dc38d49691f0cc5f2b5e 100644 GIT binary patch delta 2982 zcmaJ@Ym5`u6`p%%Jf0n|$7X?L*%t-^&S;54*(@QHrWFJ=646G@l9!3(diM^F!Pw5V zCuBF?II5s538alCkTx;tT6rRc6?B_~>=L#8QAMg$sY?25TB-f9_OgA5R(<@S1$xfR z*eomB8O@n{&pnTO&OPUw`9tKlTeMs-s0wiX{EvH{{ngsIknn@&Ks5=ji^^mRTaUYX zQ#eDbq_G)ED7KD%NQ7}pgs}}E6=ZjmXhY_n!D%P&>ek!U#|2i|Jg}Zpq|El9{J-g`zDD+|$1$uH<2y;zq$1Yzb|im8~A% z+A?2*x>A4t=B>8GbGf1}@-Ael4TWbiao?fQ!ZR72+Wrxfb0b@{{e_&#M~p%`G6>tk z5?Sa4qD!{ljf2I*%-EkaGsT4Q9GEh>0oCDgQpt2Sz6@t&6xh$5n2SbS8rZyLvrhR2 zu*Ek5i7N+<(cxT@v$4P)V>Fgeri_G{*J(UZg2B_tjM)RywNHLrn|QNk?eh(2;P5Nxa0^<|tk-?_cdiB}DV}6- z9=YuPbSjbFpU4^pGnn-o-|q5DAW5l4+K5KFZ?sWOq&`Y0g@;Jjq-#{AB8;v(T;MtU ztF*-(xijhSu-@sd{fGK*$^-v~@};u11FVM$l|W{(Wl96+285*R?fRbMaywJSU;@Xzth$ZBDnFj^wO8D}EA2_G*)-!TbmyF?~MMwzcl$7zYCq2(%c zTr2_SAmszjDzspgvKDARS`wMKT425%Lbear%Gi%pFb+n7prnD)E*8oX7WTN%q237k z)Eli}E5TqpHV<2M2D?;t4VUN+Fz$|Fn>nXvp0%<*f90QTkX{m6QnU_EbUB$%epx$$EhgaY2TD#WZhB_^%!PHLgCcPx@G|V*_)b zfgMtYxVx)_^+Mb~b5s|Z2Mk*~gh+N<3UDHi{srJf0yqhQD?f{rqz0TkE<6c(TRs=xhW{iBy_6XzGJG(o1Jd!l~s?ONpn z*KsTsbFe}$12TBM?HF_biFc#vJAlm1zS1=6YQk=opcqH^aQi-jBW!-&hh!}h9Z3|) zIwW@@=|Hj`h*?H(ysa0r1y-6-aNG^Y_BYX8lkY|ckWioae(j|nxqIZBQ1}59?gvsk z|J^0>a~ID+98rM8GGb!1{@SN=7iXegBBGET+m}xPaGLl0KYd4}p?ni`QQwT9qIbwk z&$#x^h08yAcY9<|SIS%gLB1WySAp1K$|&-$Iiq|o&+o^DuLIG2JPfaR3mf);4GwNN zft3&sW{ty%CZF#_9mExv$T->oj{%_oaw-XnDrqf?2vYKOMOFc*!q-)~ov7Ze zU2O#>B^q!Q;Gu#>6cT}VJJF~DGx_tjeog5m%8T^I*v4HB;y#oE^yRVtiNhm+a*b>H zxO^A+=DjfGK_uIN*b*}j<(DMpW+wPIP;g0nn6a7ZYyLkGpL6im-&!`2UrhI^r^z<> z&IyAHH{gOVW3^msuwf-FFA@;P|x{tK;0pJgwC5|e5b?_|s zqt*+-Uh~n!z*WFR z0l-`YFh{790F}bb2V>;RC4%UZ7OMC|<~RQhifY8WF2C|g?R%%|Cyv#o-k85ITYKwe zsPLO*Z_T#q-}dTdd!)&CC9hmMQG4$@QK)zLJBeJXE%$#3{=={0kAUAjMr0b(L z@x!^#emei!2kxJZ(}&iKwyDh0BgI7?+y-rKb8sx&_{hf^xPw0}d^ZwAjj?4-0q;*G zrW1~3+erI^D0=Jp+smPC5~#Qv{~x>#>3~8j;Kx-7v=T*>NSinoxur%MT8or)GN^|w zGxYEp>=~yO9q;@JoW_ytL-Ldr3$L>N8dCcaEfql`5;TiS6j=!oM_9CzXrINxsR;d}oJN!*4Q delta 741 zcmZ9K&ubGw6vyYyZnBfz>^46(H8l#YqIOMepr}-|rH!G2LOir8L{t(cVq(Ow-3pDV zUUJJp%0N9dLUZg<@{f34FTIN5#e)cKxxvG2DC*qgR+|(JKE@+Bhk2C8a5gzzA&&j|$0`*c%#eM67R`qq zslhI7k($y2cUC-63hy5guC5RsmF+<6~WHe5SR?uHGX+JhmI+ z5oxtUKG7Zk89AxMGd4DXY*HZ26sqt>EqbisvHwp}svtV*S%`~0^$k!l8OVyKf%B=R z&db@Fm(R`cvQHe%SG|o!#WnCd#C~8Z>QG-PH5xwSC9hO2tyRRY;F9K^!@6UNoVFl# zwEXfiE-AGj1{RzdBq4VZT`-iMj|-Ww`%OXAeY`rTZN-19vW< zpKD57MEELSf7NiATu)0l5^0Hy#1)Ca34$`ajJVrBvc5ye*LdZ5X}#`=pOFka=%=FF zFn0~>g>M5Kj^bXI9YcHB<^F=a#r6`xiI7GwsS(G8Yhr^7LqV$o4u`4bNxZS+zU8&8SFiPT>dhMv*@ diff --git a/utils/__pycache__/sql_utils.cpython-310.pyc b/utils/__pycache__/sql_utils.cpython-310.pyc index a1332ee6721597b8551b654da373c3299670a65b..a3bc11cda7dce61260774948859039070534eed2 100644 GIT binary patch literal 5714 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 literal 2678 zcmZ`*&2Jk;6rY)0uQwYzbwZM+Egz;I6jP}dAOWgS)l%B3fQ%q56~3%CI}_K5z3a}b zNxgDW)#gN{!kG$WOO;Sg+zSW(j=j=U;+z`?%6qd}%W0go=FQvL_h#PjeT~Cn(IN2s zmA`oFcbkyE@n!shHF5!lS^>fdr!7(^v86d$r#DG3Z4$wH3zXoG!`inbpc|QtQ8z|1 zr$;hIDsz=^#*IzFjR&l5a=J_^=09)_srg999|K-4z)-6|1gTR_>Wov)Hc8#!1~*|g z`C)GH{3fmEfV24&a28+U)4Z^0*7Lv>`3!J2aEEvaxG6r%=Rnipukd-8r}+Y3gt@?T zV9SxjUjFKf8&R{Rd!;AcmFZeN*J%LUy3+|&)Q|%B_((_f{IJt_uiRASAdJe*Kt*1wC3s@N_huxL zd^*1$FYPk>MQ!dy-ioJ0Y@ch3b|`!2;)NT5>UKJzj07+52J~E6$EV`xkR^6@crtyh zjgpt845gd`=jm`t^rysFBt}C-iSv!u>WWk-535^LVvO{jDJkG9>Mz1j^FZdQNo~4F z(|L)OSc%4^Q7Cs)spezmW)Jcv3>`|H#gMmMA}vnuLgucK0qxU18#0Q)V*?}0;tH#! z08NSZC3$g2_}xfoAdtslyWNDe)mA44xHGXjp7h%4B?w7zSJA!Q6|#2%_EMPNHh`Id zU%WU1ut#tY3PgbJ(I~C}6CXOr_M5r}O%j>CiaUZJpuJOIG0o_ZY zcPf?!DACPnlnw)zOkKX?i%!%GgT$6$tF_|!>lHH%(h`auK`AO;hC7p?=yo8JL#!MGVDZrr(tV=) zKw`&5kUJU30mY0&Pym<864zM^01X6-cZml1{Kuc3J$;gblx5i9IzrJ!hv7^?y@}i; z409>IaS$JY><%WX!yHRS~ZG06i(~dvT#`!D@ z$E`e%dZ&QIuZ^smBzK^FJ6KkjOz7w3-HKpo$=jn<_8bMxdg4*Nys#S`3D+gX%xNhRO zZad`N7V-rbnxofBzsMrUrWc1U!q@TjI1(%g`4$rNy+p5QJH{$f*QUNXFe+H;3j3N3 z?bgmaMaOb%C+}FcWg7)UqD&GEy%@0ktZ9-b3v=Thni^YSW9>rskpdib#yJ;3;Qf4wb5+ z^0k-;yNB0tEhawr^c75KLXW{`avK`A`4HMwOZa>8fqn!a zZSs)#e8La7ukZe|Mld2RLmt6K@e@2MM1!I50;lgjk>B7Hs`4FuZ0BhiOk8;=LK(Mt zNdE|18mwWzP)L{NNRU8=bc@y7wS+391Pl3^uXXqw@D2hp1gvI&dcw{C7h`n=YfRVy zL)7fdP)+%THRTWX+*Q+QaZ$oURFqs$a#2ZjF3V`8)?N@h!zd6=*zXKh&=u8CD9uxB z1{Vh%+fvP~&YD}r-`<-_b^4ue0uR z+OXl~^u*v4R;HhG4`62<<5C_6PvcaJViE3(4fT>Lw=r@>KkV-bTe%cU%DbT-2uto1 zu3c6&Q_~Y+9C~gq?Wyc5*zzV+CmT-Pq~#+@#0OW5-jMl$=fv1kkq#uqhS+z z@S^BJUoRp;d-SL|cr5-2-emt1MZ`B-EfKm8zHess&CF-!u>7`c^-VKH)c0g-r~Nhi z$x1<~r`%E5CmcBC+G{$d0X+uJ-B8FVE?KU6Tt-i1a2Wro*SDPLs7=_aGUGgr}mQ`ZNeD|pz#ynqi4#WzU zq8LsL9ntIb_C*mx$QH78hr7a(YsNJ&dK^~kl%?n+^Z~ diff --git a/widgets/login_widget.py b/widgets/login_widget.py index 7007981..1a88fea 100644 --- a/widgets/login_widget.py +++ b/widgets/login_widget.py @@ -10,7 +10,8 @@ import threading def check_user_login(user_id, password): """验证用户登录""" try: - db = SQLUtils('sqlite', database='db/jtDB.db') + # 始终使用SQLite数据源验证登录 + db = SQLUtils(source_name='sqlite') db.execute_query("SELECT id FROM user WHERE username = ? AND password = ? AND is_deleted = 0", (user_id, password)) result = db.fetchone() db.close() @@ -22,7 +23,8 @@ def check_user_login(user_id, password): def get_user_info(user_id): """获取用户信息""" try: - db = SQLUtils('sqlite', database='db/jtDB.db') + # 始终使用SQLite数据源获取用户信息 + db = SQLUtils(source_name='sqlite') db.execute_query("SELECT username, 'Default Corp', 1, 1 FROM user WHERE username = ?", (user_id,)) result = db.fetchone() db.close() diff --git a/widgets/settings_widget.py b/widgets/settings_widget.py index d15f8b7..784dc81 100644 --- a/widgets/settings_widget.py +++ b/widgets/settings_widget.py @@ -1,9 +1,12 @@ from PySide6.QtWidgets import QMessageBox, QVBoxLayout import logging +import json +import os from ui.settings_ui import SettingsUI from utils.sql_utils import SQLUtils from widgets.inspection_settings_widget import InspectionSettingsWidget from widgets.pallet_type_settings_widget import PalletTypeSettingsWidget +from utils.config_loader import ConfigLoader class SettingsWidget(SettingsUI): def __init__(self, parent=None): @@ -52,19 +55,23 @@ class SettingsWidget(SettingsUI): else: logging.error("无法找到pallet_type_layout布局") + # 加载配置文件 + self.config_loader = ConfigLoader.get_instance() + # 连接信号和槽 self.connect_signals() # 初始化数据库类型UI状态 - self.update_db_ui_state() + self.load_db_config() logging.info("SettingsWidget初始化完成") def connect_signals(self): # 数据库类型选择 - self.sqlite_radio.toggled.connect(self.update_db_ui_state) - self.pgsql_radio.toggled.connect(self.update_db_ui_state) - self.mysql_radio.toggled.connect(self.update_db_ui_state) + self.db_type_combo.currentTextChanged.connect(self.update_db_ui_state) + + # 更新当前使用的数据源 + self.current_source_combo.currentTextChanged.connect(self.update_default_source) # 按钮动作 self.test_conn_button.clicked.connect(self.test_connection) @@ -80,10 +87,67 @@ class SettingsWidget(SettingsUI): if hasattr(self, 'back_button'): self.back_button.clicked.connect(self.back_to_main) + def load_db_config(self): + """加载数据库配置""" + try: + # 获取默认数据源 + default_source = self.config_loader.get_value('database.default', 'sqlite').lower() + + # 设置当前使用的数据源组合框 + self._update_source_combo_items() # 更新组合框项目 + + index = self.current_source_combo.findText(default_source.capitalize(), Qt.MatchFixedString) + if index >= 0: + self.current_source_combo.setCurrentIndex(index) + + # 默认选择当前使用的数据源类型 + index = self.db_type_combo.findText(default_source.capitalize(), Qt.MatchFixedString) + if index >= 0: + self.db_type_combo.setCurrentIndex(index) + + # 更新UI状态 + self.update_db_ui_state() + + except Exception as e: + logging.error(f"加载数据库配置失败: {e}") + + def _update_source_combo_items(self): + """更新数据源下拉框项目""" + try: + # 清空当前项目 + self.current_source_combo.clear() + + # 获取所有配置的数据源 + sources = self.config_loader.get_value('database.sources', {}) + + # 添加数据源到下拉框 + for source_name in sources.keys(): + # 处理特殊情况:postgresql显示为PostgreSQL + display_name = source_name.capitalize() + self.current_source_combo.addItem(display_name, source_name) + + except Exception as e: + logging.error(f"更新数据源下拉框失败: {e}") + # 添加默认项 + self.current_source_combo.addItem("SQLite", "sqlite") + def update_db_ui_state(self): """根据选择的数据库类型更新UI状态""" - if self.sqlite_radio.isChecked(): - # SQLite模式下,只需要数据库文件路径 + db_type = self.db_type_combo.currentText().lower() + + # 处理特殊情况:PostgreSQL对应postgresql + if db_type == "postgresql": + db_type = "postgresql" + + # 加载选定类型的数据源配置 + config_path = f"database.sources.{db_type}" + db_config = {} + + if db_type == "sqlite": + # SQLite模式下,只需要数据库文件路径和说明 + path = self.config_loader.get_value(f"{config_path}.path", "db/jtDB.db") + description = self.config_loader.get_value(f"{config_path}.description", "") + self.host_input.setEnabled(False) self.host_input.setText("") self.user_input.setEnabled(False) @@ -93,41 +157,60 @@ class SettingsWidget(SettingsUI): self.port_input.setEnabled(False) self.port_input.setText("") self.database_input.setEnabled(True) - self.database_input.setText("db/jtDB.db") - elif self.pgsql_radio.isChecked(): + self.database_input.setText(path) + self.desc_input.setText(description) + + elif db_type == "postgresql": # PostgreSQL模式下,需要完整的连接信息 + host = self.config_loader.get_value(f"{config_path}.host", "localhost") + port = self.config_loader.get_value(f"{config_path}.port", "5432") + user = self.config_loader.get_value(f"{config_path}.user", "postgres") + password = self.config_loader.get_value(f"{config_path}.password", "") + name = self.config_loader.get_value(f"{config_path}.name", "jtDB") + description = self.config_loader.get_value(f"{config_path}.description", "") + self.host_input.setEnabled(True) - self.host_input.setText("localhost") + self.host_input.setText(host) self.user_input.setEnabled(True) - self.user_input.setText("postgres") + self.user_input.setText(user) self.password_input.setEnabled(True) - self.password_input.setText("") + self.password_input.setText(password) self.port_input.setEnabled(True) - self.port_input.setText("5432") + self.port_input.setText(port) self.database_input.setEnabled(True) - self.database_input.setText("jtDB") - elif self.mysql_radio.isChecked(): + self.database_input.setText(name) + self.desc_input.setText(description) + + elif db_type == "mysql": # MySQL模式下,需要完整的连接信息 + host = self.config_loader.get_value(f"{config_path}.host", "localhost") + port = self.config_loader.get_value(f"{config_path}.port", "3306") + user = self.config_loader.get_value(f"{config_path}.user", "root") + password = self.config_loader.get_value(f"{config_path}.password", "") + name = self.config_loader.get_value(f"{config_path}.name", "jtDB") + description = self.config_loader.get_value(f"{config_path}.description", "") + self.host_input.setEnabled(True) - self.host_input.setText("localhost") + self.host_input.setText(host) self.user_input.setEnabled(True) - self.user_input.setText("root") + self.user_input.setText(user) self.password_input.setEnabled(True) - self.password_input.setText("") + self.password_input.setText(password) self.port_input.setEnabled(True) - self.port_input.setText("3306") + self.port_input.setText(port) self.database_input.setEnabled(True) - self.database_input.setText("jtDB") + self.database_input.setText(name) + self.desc_input.setText(description) + + def update_default_source(self): + """更新默认使用的数据源""" + default_source = self.current_source_combo.currentText().lower() + self.config_loader.set_value('database.default', default_source) + logging.info(f"已更新默认使用的数据源为: {default_source}") def get_db_type(self): """获取当前选择的数据库类型""" - if self.sqlite_radio.isChecked(): - return "sqlite" - elif self.pgsql_radio.isChecked(): - return "pgsql" - elif self.mysql_radio.isChecked(): - return "mysql" - return "sqlite" # 默认返回sqlite + return self.db_type_combo.currentText().lower() def get_connection_params(self): """获取数据库连接参数""" @@ -174,19 +257,42 @@ class SettingsWidget(SettingsUI): params = self.get_connection_params()[1] desc = self.desc_input.text().strip() - # 这里应该将设置保存到配置文件中 - # 为了简单起见,这里只显示一个消息框 - settings_info = f"数据库类型: {db_type}\n" - for key, value in params.items(): - if key != "password": - settings_info += f"{key}: {value}\n" + try: + # 构建要保存的配置数据 + config_path = f"database.sources.{db_type}" + + if db_type == "sqlite": + self.config_loader.set_value(f"{config_path}.path", params["database"]) + self.config_loader.set_value(f"{config_path}.description", desc) else: - settings_info += f"{key}: {'*' * len(value)}\n" - - settings_info += f"说明: {desc}" - - QMessageBox.information(self, "设置已保存", f"数据库设置已保存!\n\n{settings_info}") - logging.info(f"数据库设置已保存,类型: {db_type}") + self.config_loader.set_value(f"{config_path}.host", params["host"]) + self.config_loader.set_value(f"{config_path}.port", params["port"]) + self.config_loader.set_value(f"{config_path}.user", params["user"]) + self.config_loader.set_value(f"{config_path}.password", params["password"]) + self.config_loader.set_value(f"{config_path}.name", params["database"]) + self.config_loader.set_value(f"{config_path}.description", desc) + + # 更新数据源下拉框 + self._update_source_combo_items() + + # 构建要显示的消息 + settings_info = f"数据库类型: {db_type}\n" + for key, value in params.items(): + if key != "password": + settings_info += f"{key}: {value}\n" + else: + settings_info += f"{key}: {'*' * len(value)}\n" + + settings_info += f"说明: {desc}" + + # 显示成功消息 + QMessageBox.information(self, "设置已保存", f"数据库设置已保存!\n\n{settings_info}") + logging.info(f"数据库设置已保存,类型: {db_type}") + + except Exception as e: + # 显示错误消息 + QMessageBox.critical(self, "保存失败", f"保存数据库设置失败!\n\n错误: {str(e)}") + logging.error(f"保存数据库设置失败: {str(e)}") def handle_inspection_configs_changed(self): """处理检验配置变更""" From 7b0d0a28f24ab97fe2608d813419489c5dd79637 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Sat, 14 Jun 2025 00:34:40 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=87=80=E9=87=8D?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/inspection_dao.py | 9 ++-- db/jtDB.db | Bin 49152 -> 49152 bytes from pymodbus.py | 6 +-- ui/main_window_ui.py | 17 ++++--- .../__pycache__/config_loader.cpython-310.pyc | Bin 4192 -> 4192 bytes utils/__pycache__/sql_utils.cpython-310.pyc | Bin 2678 -> 2678 bytes .../__pycache__/login_widget.cpython-310.pyc | Bin 3474 -> 3474 bytes widgets/main_window.py | 48 ++++++++++++++---- 8 files changed, 56 insertions(+), 24 deletions(-) diff --git a/dao/inspection_dao.py b/dao/inspection_dao.py index 274531f..cf01c0c 100644 --- a/dao/inspection_dao.py +++ b/dao/inspection_dao.py @@ -403,6 +403,7 @@ class InspectionDAO: tray_id, COALESCE(axis_package_id, '') as axis_package_id, COALESCE(weight, 0) as weight, + COALESCE(net_weight, 0) as net_weight, STRFTIME('%Y-%m-%d %H:%M:%S', pack_time) as pack_time FROM inspection_pack_data WHERE tray_id = ? @@ -416,7 +417,7 @@ class InspectionDAO: except Exception as e: logging.error(f"获取包装记录失败: {str(e)}") return [] - def save_package_record(self, order_id, tray_id, label_value, weight_value, finish_time): + def save_package_record(self, order_id, tray_id, label_value, weight_value,net_weight_value, finish_time): """保存包装记录 Args: @@ -429,10 +430,10 @@ class InspectionDAO: # TODO:调用接口,获取到工程号对应的其他信息,比如材质,规格,后续完成 try: sql = """ - INSERT INTO inspection_pack_data (order_id, tray_id, axis_package_id, weight, pack_time, create_time, create_by, update_time, update_by, is_deleted) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + INSERT INTO inspection_pack_data (order_id, tray_id, axis_package_id, weight, net_weight, pack_time, create_time, create_by, update_time, update_by, is_deleted) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """ - params = (order_id, tray_id, label_value, weight_value, finish_time, datetime.now(), 'system', datetime.now(), 'system', False) + params = (order_id, tray_id, label_value, weight_value, net_weight_value, finish_time, datetime.now(), 'system', datetime.now(), 'system', False) self.db.cursor.execute(sql, params) self.db.conn.commit() except Exception as e: diff --git a/db/jtDB.db b/db/jtDB.db index a85b1d6972e44eaf98e754d9e5c193eff95d0d62..8b0a9fbd793b158fd127fdf187cde47179098f13 100644 GIT binary patch delta 1655 zcmah}U2Icj7(Qp`ujjX|W!gg}Y>W|!Yx%y@ztgIj%@n-=mLQ-PtGGdfKXXjCXf%=b zG>WcMv*ryE!%a7wBpMiaLSV?2NYqG_pcl%8CVHirH*k*^o^#r6J%B_e?jdpMd<2Bq3+Si{qGykIaPmj(jFvl`@Wwz4<~}#q+Kf@tXwxr-Vuj!97{;kAMln6D>lv@%RVafRhTIzO#0@$K-+T~; z7p4Mmq#~Hlzkf13Z0%W;%oF}u{{erma#a~s6#2S5BX>zxr1zxl5+{Bl>cVZ|vha=& z<`?+`yy!E1ySSU&r(BL*A@gj7-N`D?M8q|eiNnxSe`j-orh>p0rcOM6!xIy5YkpH}k8kIf;O3cq*3sweqa4zmqfq;N%lhUlwMH6^Nsk!M z+Nxxvi(+&5nq5%u>!b*MrXcBj(Dfr&vzr9wvI|Y2eQGZekFBmH&|6 z$t&z3->7dJcZ)m6?Vx{Qe`33t-QOd z!ikIO>Iz^t-%we!x8-Ss?_$(?`Px5f&i!&}_x(t8S92Svkuq;jU&^daAKS5oJm&2O z6+XMLLSp#%;+9BrNj(aMhlqiy(GSYvAB+L=6J)gmcxVnB~u#vM0QKIyKIeo z@7Xk2FS3@hO0ukD$!9TOKFyrNzlvFeX%D|E6C>jW#zICTpuv}sAj4$EMX8eyEsUSs zwrIBqQv!nsEEHh$WXHwvd@QdS*ccds8${(e_SRqxqhY9WY#4cHghknXJp|s zV9=Y`sKp%F7&|$kT9Vn4hi9_j3gOB5%Ryo>5HW6UnAqf(%QgVTBf#PoV6|$KeO8JC z#lj(CV6|Ye$(vVf*t~P4I~zC9Mf*Xnifl9mDUvee;VDQgE;ceSGSxLO(>1VEFf_F? zG_o?Xm@L>KB5G)9Wn@%bSzMBu`>b=u^Vu^DBO6U18o9agXcWZIICU5IN9fdK?^!sH9v6@cnEajSzk6{t>W^5*Tg7>y?PZ&NcfRsed_ z#Kg+P6vclIO)R(!GB5;&X#X}@c4$yc=G%FP)d=i_1$!l(VPR-!tYBbiWol$)V1jCL bV?8dD4b7lVT(DP(v2L>9GRe*DyDC`$CeZrI diff --git a/from pymodbus.py b/from pymodbus.py index 35d88c5..a13ebc9 100644 --- a/from pymodbus.py +++ b/from pymodbus.py @@ -2,12 +2,12 @@ from pymodbus.client import ModbusTcpClient client = ModbusTcpClient('localhost', port=5020) client.connect() -client.write_registers(address=11, values=[112]) +# client.write_registers(address=11, values=[110]) # client.write_registers(address=6, values=[1]) # client.write_registers(address=5, values=[16]) -# client.write_registers(address=13, values=[1]) +client.write_registers(address=13, values=[1]) -result = client.read_holding_registers(address=4, count=1) +result = client.read_holding_registers(address=13, count=1) print(result.registers[0],"123===") client.close() \ No newline at end of file diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index c6151f3..db87a8e 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -501,13 +501,13 @@ class MainWindowUI(QMainWindow): self.record_layout.addWidget(self.record_title) # 创建表格 - self.record_table = QTableWidget(14, 8) # 14行7列:序号、订单、品名、规格、托号、轴包装号、重量 + self.record_table = QTableWidget(14, 9) # 14行9列:序号、订单、品名、规格、托号、轴包装号、重量、净重、完成时间 # 应用通用表格设置 self.setup_table_common(self.record_table) # 设置列标题 - record_headers = ["序号", "订单", "品名", "规格", "托号", "轴包装号", "重量", "完成时间"] + record_headers = ["序号", "订单", "品名", "规格", "托号", "轴包装号", "毛重", "净重", "完成时间"] for col, header in enumerate(record_headers): self.record_table.setItem(0, col, self.create_header_item(header)) @@ -520,7 +520,7 @@ class MainWindowUI(QMainWindow): self.record_table.setRowHeight(row, 35) # 设置列宽 - column_widths = [70, 220, 160, 160, 160, 160, 160, 190] # 各列的默认宽度 + column_widths = [70, 200, 130, 130, 160, 120, 120, 120, 160] # 各列的默认宽度 for col, width in enumerate(column_widths): self.record_table.setColumnWidth(col, width) @@ -593,7 +593,7 @@ class MainWindowUI(QMainWindow): self.inspection_headers = self.inspection_headers[:columns] # 计算总列数 - total_columns = 2 + self.inspection_columns + 2 # 上料2列 + 检验N列 + 包装2列 + total_columns = 2 + self.inspection_columns + 3 # 上料2列 + 检验N列 + 包装3列 self.process_table.setColumnCount(total_columns) # 重新设置列宽 @@ -614,9 +614,9 @@ class MainWindowUI(QMainWindow): self.process_table.setSpan(0, 2, 1, self.inspection_columns) self.process_table.setItem(0, 2, self.create_header_item("检验")) - # 包装区域(2列) + # 包装区域(3列) packaging_start_col = 2 + self.inspection_columns - self.process_table.setSpan(0, packaging_start_col, 1, 2) + self.process_table.setSpan(0, packaging_start_col, 1, 3) self.process_table.setItem(0, packaging_start_col, self.create_header_item("包装")) # 第二行:列标题 @@ -636,7 +636,7 @@ class MainWindowUI(QMainWindow): self.process_table.setItem(1, 2 + i, self.create_header_item(header_text)) # 包装区域列标题 - packaging_headers = ["贴标", "称重"] + packaging_headers = ["贴标", "毛重", "净重"] for i, header in enumerate(packaging_headers): self.process_table.setItem(1, packaging_start_col + i, self.create_header_item(header)) @@ -653,4 +653,5 @@ class MainWindowUI(QMainWindow): # 包装区域列宽 packaging_start_col = 2 + self.inspection_columns self.process_table.setColumnWidth(packaging_start_col, 140) # 贴标 - self.process_table.setColumnWidth(packaging_start_col + 1, 140) # 称重 \ No newline at end of file + self.process_table.setColumnWidth(packaging_start_col + 1, 140) # 毛重 + self.process_table.setColumnWidth(packaging_start_col + 2, 140) # 净重 \ No newline at end of file diff --git a/utils/__pycache__/config_loader.cpython-310.pyc b/utils/__pycache__/config_loader.cpython-310.pyc index b0dd2df2521dd8fb951de060fbab575e7cdaee4d..fce5f6b31674701fa7ad8720f8bde0abd391b254 100644 GIT binary patch delta 19 ZcmaE$@IZkppO=@50SG?4-pCau0024z1)2Z= delta 19 ZcmaE$@IZkppO=@50SFe>ZR83Q001@!1l|Au diff --git a/utils/__pycache__/sql_utils.cpython-310.pyc b/utils/__pycache__/sql_utils.cpython-310.pyc index a1332ee6721597b8551b654da373c3299670a65b..f1020e0deaf6920ded66acb6a8fa82e69f4ff0b6 100644 GIT binary patch delta 20 acmew+@=b(0pO=@50SG?4_TI>y%>@8Kz6J^a delta 20 acmew+@=b(0pO=@50SFGTJ8tC8<^ljZ Date: Mon, 16 Jun 2025 09:10:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=5F=5Fpycache=5F=5F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=B9=B6=E6=9B=B4=E6=96=B0.gitignor?= =?UTF-8?q?e=E4=BB=A5=E5=BF=BD=E7=95=A5=E8=BF=99=E4=BA=9B=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +++++ .../CamOperation_class.cpython-310.pyc | Bin 9574 -> 0 bytes .../CameraParams_const.cpython-310.pyc | Bin 1701 -> 0 bytes .../CameraParams_header.cpython-310.pyc | Bin 24670 -> 0 bytes .../MvCameraControl_class.cpython-310.pyc | Bin 29747 -> 0 bytes .../MvErrorDefine_const.cpython-310.pyc | Bin 1997 -> 0 bytes .../PixelType_header.cpython-310.pyc | Bin 6032 -> 0 bytes ui/__pycache__/login_ui.cpython-310.pyc | Bin 2362 -> 0 bytes utils/__pycache__/config_loader.cpython-310.pyc | Bin 4192 -> 0 bytes .../__pycache__/menu_translator.cpython-310.pyc | Bin 1045 -> 0 bytes utils/__pycache__/sql_utils.cpython-310.pyc | Bin 2678 -> 0 bytes .../__pycache__/version_manager.cpython-310.pyc | Bin 7036 -> 0 bytes .../__pycache__/camera_manager.cpython-310.pyc | Bin 7948 -> 0 bytes .../__pycache__/login_widget.cpython-310.pyc | Bin 3474 -> 0 bytes 14 files changed, 5 insertions(+) delete mode 100644 camera/__pycache__/CamOperation_class.cpython-310.pyc delete mode 100644 camera/__pycache__/CameraParams_const.cpython-310.pyc delete mode 100644 camera/__pycache__/CameraParams_header.cpython-310.pyc delete mode 100644 camera/__pycache__/MvCameraControl_class.cpython-310.pyc delete mode 100644 camera/__pycache__/MvErrorDefine_const.cpython-310.pyc delete mode 100644 camera/__pycache__/PixelType_header.cpython-310.pyc delete mode 100644 ui/__pycache__/login_ui.cpython-310.pyc delete mode 100644 utils/__pycache__/config_loader.cpython-310.pyc delete mode 100644 utils/__pycache__/menu_translator.cpython-310.pyc delete mode 100644 utils/__pycache__/sql_utils.cpython-310.pyc delete mode 100644 utils/__pycache__/version_manager.cpython-310.pyc delete mode 100644 widgets/__pycache__/camera_manager.cpython-310.pyc delete mode 100644 widgets/__pycache__/login_widget.cpython-310.pyc diff --git a/.gitignore b/.gitignore index 42df938..185e280 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,11 @@ __pycache__/ *.py[cod] *$py.class +# 确保所有层级的__pycache__目录都被忽略 +**/__pycache__/ +*/__pycache__/ +*/**/__pycache__/ + # IDE相关 .idea/ .vscode/ diff --git a/camera/__pycache__/CamOperation_class.cpython-310.pyc b/camera/__pycache__/CamOperation_class.cpython-310.pyc deleted file mode 100644 index 8323c12e760823a6c16155524d64e2bd633e9cd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9574 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 diff --git a/camera/__pycache__/CameraParams_const.cpython-310.pyc b/camera/__pycache__/CameraParams_const.cpython-310.pyc deleted file mode 100644 index 4f01d68531a5b882f918469cf5fdf2c049e6ed1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmZuxTT|0O6i!Qk0v5TeD1vwKLR-KKGmb;L-9l`dbdt2z^RiRfDp6>iwut(~_%Hkk z{u`fp^{IcsC(lVz+CtmeZ})uXoNsqePEwD@#})kj{FUB+v#cn8$>{w>(AdV&{DUAB zP-FxmG73>S1Vd5vG;vRu|fME2T}BY)1)Hf*8RR z!3x1P!3lwafu4ea?IALU2}TG;5j-5j1S140!L}DUK}Qt9T-|`Fd`T3|oN2uk8D7#E zhe>31^c~)7r#7}WJ9eBhoOH*WLz8KFZfk~a<~r;QvL)T_6PgaWbICj0bdA2iMGOqs zi^8*AU%AlPtxJ}zY=@-n{Cnu8%k8X&SG$5#k7UI@s zw}qoaP%YwI!x3gN540=UK{0)bDn!(ol+P}Ntix?xGep6%U7x4BP;^iLJ=-S{kf=@U zDTQi`amNw-+up%Z)B9S5r2*tyueI+Sd#$~F|9oK%tJhkM`T<<;W`tBve2-k{41{>C z^8TO-cQ54jx=ANj{ocE2zFzZM^#)wU#JuLRUE#hfaA9&6OXhOsp7#XZ;(O>R=>@^E zJHl}_S7&~&hD>Ic6@Yp(v<*W8DiA5Vwq`maW9ubupCcWM<+uy;7>S)>h_qJB*qY15 z*7IZ%=ppsfsjc;a{Km`8f&8-%;;%6vTEp%VDXo5qSw;P+{UL9&|jN zjQBEE%XybiTZYd1I`@n;xaogiDB39)y5Hcxl?HvreE7GWC^oB&X5z3~`p9+;m<*+IC>a}KT?aTMm*sH_3JUXbprtf9*1A?lm hkpcgqkc+BOToKZ&hO59PCWs^KWOUVtp_oW4`X6#Iz#aeq diff --git a/camera/__pycache__/CameraParams_header.cpython-310.pyc b/camera/__pycache__/CameraParams_header.cpython-310.pyc deleted file mode 100644 index ff7ea122515ec091f4a703eb57cd445f95c3e5ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24670 zcmdU0cYI^TwYFthmdkp*y-}8Bfn5S@qb+r1S@sHS%SiH;0V1@zV_RTL;!0jH>5xu% zln_ElBcu~TLP$aiAt5A$P*NczN+5-_4FnQ;=Y8Lqt1HR&TF!gF_s84)>D)PUXU;iu z=FFKhXRfnz=Cst|--RFQ9EsZXb&n9K{I?Lu7X0#0F0HGx>a6deuR^{}$%GP;R(Bo>iK2M#mC)5S{4eE_}|0dMG8NavS_g1`r8|p8_?;`x( zj=Fc?`A$6Fh3C6_>a0c9;CqzTW!5on&;Oh&HF2!aZ_<~6{$=WN(BEtw2l~ee{VS~F zUHa3F?*#X4d3@82>O{94dHRKCv%Ug6uTbv?&y%c^!SiI{dFB5p&nv<6O7#Ko++qd5 zGax*#`ak7)6?k5yJ_w$jRuDXc!t-k2T~-KqNPh^He~s0x-v{gJ(U$^l)t3W?_4@%& z(H{UjReumR>(kdHF1C8b0{aB^i>*Wi4hTHWwVo!i%&5KwJ^lJ>$Z@s$F!;u-IQYgz zj*nP_(tex%sQ&Op_4;EnJ0ATJwEl?tI9hMFcA)hRX?<;lrgplss@&4)F7H;M)2Ocn zoom%6K<5nWOwc(~=v-&LURox=^%LOwNr&roXnmdf6k4BUCDA%5tv_ACwQNh%S>$vw zl~-5UHp})pS>jgxX~^(t^%=;p%Su6pl*sVe3O#)W5`WH-__JvJS@n6ewk(a-T3TOk z4Pj*C7u93thGnE9lQiSi*Q4k4>I>+Zw$4V+v!&+^@T^}%-8t4M>PE#jZnVZg?F&LJ zqbVACZE{0>-gy?B=eYCSO)7YQo`b`G3qIjIFL0i3 z&|i}JH#*NZIrVRLo^NrUZ*`t;bDkGE&x@Sr+nwh-968_VJm2L!-|al#$DP3kM4^#SWD(7H-!-E4i(?RmBSGN`hT>@UL&`eyXGS$!4r_BH)A^>y_9 zkaZ3EUL$>Pu|7;)TOZNq0)A9DeoSgUE;HGvZ$bZC)Hl%YTI&<&_X+9uP3t;o`$_#R z^!pUc;Pp+k{igah+J4&l4BCE1+TQB$_^i^)w68+zTQzKdR8v~EPN8>QFxtS^aVUv@Qflk^meH1=p2txwjnUw;o2 zzo%}8#=Z}#U$Jfm)tiOt9oAQc%GU&boz`sK;&S+g)PB>&za{v$1>UN^kG7QCc%Bx0 z2e{m!egG~%1efnvw}H!T!sSkDveZV>O4+~ba`~Rnzg^(>^$)@24k`aYAUPWAY14Ot zyt-VIW{wjAB+5V z>wBzw=*uicaxD)s*xdQ+-FmgK=lFjD^PpLdKlCm7HSVpv88gK2K^xVJg9yRNq(b$ql$R`R{vK04$p`5L+W8X zf3JV9{($En^&i!r@O(r+qW+BMU-VzpU-A5#{+s$cc>dn{19<*HcIsbEU;1C_-{|+G^%VL& zCHeo+$+SBTpp1RBGE&l4?E>LJb3*1vWm7v_V(#O^j#pd7LXR| z>xCM2NId6Kr+9Wa&w1_~8yjl8tX|hAE+#}zk5F8Q_KSq#B8MWV;xvgBhUXIJxl~qM z#Rx&8K`2oMuTWZs_REFRa)%Q5Su0BZ5#@bcdCcC3zPeGUpr!H&m3`4}KcTXpL#4@* z=*p7V%96;+lDNu}sLGO<%94o6l6cCJXv&gU%92RRk~qqeD9Vx;%902Qy!NLh}SIk4nIQC=thM!t2BRL4N9xNj{ z*cr(Z*Uy%B)xAd!CT5WM0hA5_?e;0-SR&(C0-j5S=NhzJD?HaaJeU11cpeI#9aDHN z6P~a{wOn|<4m=MNo`*R+SD@x_^qnuWeuQJ+>ni4Oz06^GU*M`)A#~AK?IUzIfXYUp zyV0RbyWNDA`w876^|@A?c!e?@TKm322W{2v2NS#BS5tDcT=Di7PF1m2h1Jt_KR&6VUEN;d-LO zbv0^EVoy9z*7u;#L6dwWwXs_0pshMs=xjl2WEBVb9EHedu$zPzMEd zgizlOTF5{UI@H&pywjzw+|u5q<{DThbkSF>7rLi|${9lU42SN9N?S8)8*R?4SX+{{ zKwV;zRZ%M&gg#c5+9>qTLObLz2p#&HrqZ8$xf1&S9?9V?`2p1+`fu$>MEJ zB*{6F9A`2~s6SVK6g@UygxEkIFBGtP^>ISsI8Zo2DA;J37YccY!ilIUAi_0yT>3ks zUG_dvdZUFpNqUc??QZG4+v$BWY9xz-=lSSy5`J4I%@fz<$wCRORbZGlF>xJZm`;=~ zh}ErmLw#M{9$tv7tuNLey2pdk9#qxs@ewoun;y0xC-qD0@eL{GRUl;{d=3kO4q zaDR6s(f|2|qCb(yB*%0jQEW*h#2+tPlPo6A%dbm;qMck9l*d5QPLAahBRXkm`-t3xJr~5@MnS0z zf1S5pYE)Y$oC^*OM{KQ+>q%#05uQ-yI`+x?Ja&q}aUt$2~O^eAi8+|)>y-knbAZ5R@{F0bwu z%jr~lD4hythO&FsvwM4LB&O|jaYJ^IG1ZgDpgmOy;l7-ICW$l7$ z&O|j{BU`uEIkVeAr!-H4vCd7^^JJ4vc@j)%5$l!%e1L_;B}}yk?ZRj{6UtZv*)&u) zmw05n;8wK93bsy;x%iyWZm8Hr{b_5P&RAJnHK(ls8zzw|U^?C>h-8MS>VRe8&M9A074vDbu%KS5!m-!A>tO|kf1|4hV#=Qy z8G!o3U3(4&T9e;G;nyeZ$}42=9QOs$TV0OC)ST2vI8)FztWHBMlWdSiq*_Xf3wO;@ zq8$UXwT1m4!@aIV#Ae50N2GhUEcOS{-?=P^)nu_i^ctKkhn1lDn9G4!O%D6^Z`eEy zlTBTbcw&91fA3Rx0H{CV@*<{M@`axCa7gB=HD4Ia@7lD@OkBP|W0Z0;%6;YHj)79` zj%>FnX8Mw6XKi>DEdIW9#uVF7o1*z|O%IQ#))Lm6J+IiBiT5Tav>l(wX*fcxHI{@{ zt2m(~R`gJ|rYe?BqleybES{J_3kPD{P1rn)3n2z?>#laynlt5D@s~y06Y7umCc@n{ z7wu~B>To#|L&0FcWk*ac$_-|6NjtAC8D=mG zOTtdvoC%DkhcoHSu<~WLr>(+>YRYWY@CF6dsxt%W^Yy6MesiW9F_Wg<%@b#k9@DWx zax5pFqob+{?gQ(!6k)8#KD#xWFT_hdz*J~K)o?5^oyumcV0IkRv}S@6sZni^HiJZl zhVr_g8i#t4X~bYdj9~HzphymJS70~7x?$aEQ{)VGapeVP3!~|=H5fEzI!DJfmX5F# z%5Z^mGI4Ym*0wBPG!AES;{^;IK?w`~jA6UOE$yUmG!UaC2uGx(sZ1{hIFL-814-v) zsx&PctE%Zu=L;Bk=zPq8WysBOFhg(8s@WLGa#}}MI5yB5*y&iKgwQiv;$a|tp=%n% zRC6voMiq_^G2nHIGC3NmgnzRco{C;;$4KqfHamlpKODR-b0s0B{5c50?Wl;2P9|*j zF1|k$k4FRjv6?P^9XNf=Y@U{l~H(RG)<`o51~cR~BMw zL1|j8GIt0VvhA#0uBj=H>^jpdv>9ysNU*=x6^2;RJF-1v6&rKTw!_D4_L>!3PqDzZ zP+}kw##R^XjSO}r1_Ic9X4-I$0n3M70f@nW_2MizkSWk3`2|6#*se1%J5_e{{v1#d zvXw6!IT37h?Ri^(5kvM0dEiq@)?_?|9H& z;c_B|883~r#b|0ESs2-aoK9^aR!$mhwHPzc)QRAIxGM=UgzqVt0}4=60sE47Fqjw! z?+EoW;M*38#$79!K?Ns)Rj13C7_NqBu4Pkiacr6f)5KRa7o=^(q#cWyoq*Fx2ffVb zJWqy5QCC1>HF-(k31vh>!AP{^1!iQj1!RX^Cd5?BkodkR(o!&r&U8UabGg^2vbNPd zRxpbrU$D7~XEjT*iXm9Ie*gio35_KfnNhd^#M$i%N35m>WQz=KW662>#nMCIJ;3NoF#76md}JXf}0D*mBOr4#vQ?J;TT|?}okzB}=%( zy*Z&N4z%6SXL(keu*vrX%^D8`gP~X~5uagnL5$}ncXY(moE+1BoHvvB;z_xL)l_b2 zt%;9u_zy%QJ<(c%bbmZR550(ZcG^xwarps60W8+lAsO*J%{Y-{$8#*Un4+YK=j{rlm|mt8g)+%qqZ&I_xk}B;b=ujal}hFd zPM#90mW^>#sW}GGXvG*XlY_nS88zAixgT*yK}>bP6_|`mNrEPq1 zNN!*zU2X;6CtWFsK`RJX5L6?jp2tbSDb-ZLJV*e~6zU)B+ZN~@oY|bhU{v2w+M$VI z+K}d#pa7@F*m#clb7a&JL%HbeLWT|_2!goUa-0IrZLS=|aQx~^o==EVuor=Ss^-Y) zE5#=}47nlA;7v{im!&RGVl_E1w+0T~y^+8y2Gt9at6c`fRP&IlTHB==K7c;nCXRb}7E-?hOyjp7Uwob*aml7``0J zbdRQUvpSl{27m$g1p4{{vk5t);Bc+Wj~H`kJ;|}LBpDW4k;6jSIFt6AAh5#Sl6skE z8kX?c%!mX-5HJ|*n~ivJ2y}xh9x>Ij3w@nk$Cp7lS$j_@1)*iGwIba?u=={om>9ik zurHQM&SLIM7YI!DMgzDwC>;@Ju(@sEal6Zr81`Ia@KCIpi{KvxI2tA`aXLO|7(eW29b7Dnb#!NcgPHbXqS9UaA+kLkg=NgRkMxxy_ zjCCg%Jmj(?raVJY{Ce=~RKB6WXl^7~bBGQ*$ui8uPJzKcU3SF4W(R&dYqFSYMugLg zNt(|vsMA6B1(ypk2)k6ggFDl9ECR~7JM{z^kBAE?wtu+O5 zrZpIj263vUBcDN}Gay8(w-g%?Q**!+S#)iiYwd=i=mrI_u_j|D7U&K4hfKn92EJ#4 z({h(DG1ZnYApWuohAl1#L(a{5O~$f#adP4@&3N!y+t=&C@L-ocG38~N78?g3R}&7A z<3qDL;K&xj!)rgb?m=2X#U?U?3KHOYq$>k4$)B5x0ES`<%;`0QKoy?`m_!b>WRCJo zxYyLobce5*?pV%(6kV=N#E^n29lofawj2*$j%twfaIjfBb_9x{Xm`Nt7H5ZBK($@z_Mb|zrm_0Xu zZysWyXgJV|tS8bvGnj@2HfOs`iSgSH^Fhq4j(H}un9Q-(STz{sUADxSLy*sK$dxw9 zMe0_pS&A*imK^lk9a(g(wm8lXeyKTiKXosM=rzaFm#3F-H7#Dre`r-<_sLtLd266Kv zUk~lA*T%iQ*i>wXz;cz>g#8|8!vU{1Bz0B8jPzFwl=E-%mbS%kzeUPlHJlr-ah-M@DG2e7muCIicl9OWXjzn=QCV40s2aKlTbH!qt*a$LRV@X`@ z$l-8m$3)Q_+Q1|bJZ&%>3rkK(rpxAOw76!f*nP;;OkKb>@7RiSs?PNy?xeLF={%(< zR|n;(uUtC`dkg5;t4WMYA+%#45*v($jLzfXzEGD~-&pc|m=LYfU1C%3!R#)QF`wB) z1Dy$M?KmIy>`d6acd(iAFSxgSHm* zL?K*h6o)xHo7b{7(`w>XrZ^or+1V@k-mI+7Y!)+{k=d`foi5)9PdDEKy*rET)k(i% zt7r_{5B40H0jxx0?PYIOTwP%qj`F*0Uhrp96F4y9OB2L0Meg4v`*B(YBZCaq)|;s+ zZPbZKcei~Y2SY82!YX`+&09;Gmw>V-^am=vytpPhUih17?v{%C?DZ8))6fgsOyL!q zISFPLVO(KsJf0pZ&YhIH6K6hYRx$ITXrL?9jToWJK8W-fj#PbWQJf>Hjp|`U*-#Iq zE|aPBI-TZ=0Ows2U^jz{cp@N*IWt`h1#a6r*ht6dut4k6#C1X#-qCK4z zyM?Thm6WnFAn8S1f*S&U{gRJlMkiz((+LY_ArmvL7bueMG`%W}j3F3T)a0$8*oMk- z%te1!VewG8^9_U@gc@x5q=0Rz1`)~V&Iy3&Y%~_>j&Bb{LlT-)Y{zAm9M%-~YJ9O+ zk=YGgS1xPZB!en-VVogFn}!yY$K6DxfDY1_V_5_$r@ReRXssOV$y@ zcEXC0P}9xA7xx2e*GNQPrEzQzcg45P6wNzpQI18z(gc}-K1O(q)_6Fm-d$usw74pk zj#w2bba;f_J-hQc_kLW~Qgy&%Hif;MA~sZn-PHwV%#;7N!R{m^rv`oTqS7?F-?w)m3DEr?MhZToS`U!XzdV=2(a`BK};XIIrRb(+A(sH3WG!?Dv; zZaika3HL}a_s;WwwuV~aC z=?|4`w4z$>gXBP4MIb>lNdyO@+d|?Vt6%nFkJu<1g>yWwAjs;CY)~SKMH7mfMziyWMR+HK+FW6v4-P` z&YhBvD7K2vG^uZ!DQ%mHW~bVusBI>Noj4C;G8tu?X<5g$Rb+K-W=)-lr<`-OnamXL zI3*z}79yI$L`+Il+RQ)NlGZOrnQ|*&^P-_-k=(p0uPbccdz5yG%DWTFMg6*UHm_z% z#}8wNW;@}HQi=TJn=qT#TQ+ak%u#8&dpffdRDWNBt?exKLKNx0C*sM=o1r6w{;^Z6+^e=+!T6X4pz+!0Ox}7lzHepLj3q zb5*bV*94JxEBaCeT)^dv^Q->;4>;?8AV=^R!LJEENbo6wTM6Dv z@EL+X5PXQ>j|AT*_$|TD2!2EGOM>4Myqkbu_1U+v^jCsk5lj%g3qZBIr^gU3!6xii z_~s`BeNpJwcDuM$ERudco z024^?9AW` z&2qL`DAz=NfgOp?!R~HmkHactd#T+OY;-dL9fEx<>%;?WW{GaVK8~f8C>0wAGe}oR zp4+~huMT8wlelz5ag1Kc#5pJ9n;rW_wpvZ_9s)Up@;uFEZo+~MzslFl+}O_&Ncw}B z<8nh#O|az+e7}ZZoM0`%3j~J(&^CsciMF3$)nNqkXG#n|?O}qC65L3zj^I9m^#Gi& z-PyF2$k}PuF-{CIF8_r1jhr=mgth~S6Oo+ z!D|F35!^{|GQp1s-cN8D!4`sl69fp(Be;^_cLbLbj1c^V;5mZN6BG$9B={PEhm-de zmi|R>9l;j~9wq1mfak?zn52C_|0+t1!{+NC!RH9N2!;r*Cip2qh#*hUP4ESR9)jHj zTM6Dt@MeOK6NCZe1WS(0A;xz0bw+x_L7CX^u*oR|R}q{_@FYPm!94_h1kV%n6Et#g z5te)``3dAN59hGdPB5Qf0l{K|B?S8s>`NejD0eVR1Eg{kOQ*4PBui12Hn9{(Njw5F zTJ}cP4D#IumbS69o~7+DX@ilwzIozBvsESsUIIrNdZy zJxhnPlt4)$Eo#n0TU-lA@ZDK#bu>#!mQG+P#rCE3Q{Ii)=Xk!i*zzQnG+Q$7B9tqy z?a=l_v?w+u63NlgL}I$X7ccrx7?Z#8C#|~tyM6cr{04u$zuxP?|N8$||Nn>bb~N}J zeD&skOMUsj4`ts|-no_U*{a;aluVuPaqq&8hL(oPx4sv=&6Df+-uIlh^*^tlB*%-s zmXg#WX}#}xZwuSB*ZW@edQ0@>-Amr4sc)(zrBu&&=Tx_HM)tDT*U{i@=pR#}Y&pdD8}HhZE+DncNJ-N&+E=`d-Ue@dsf}pK z(SVfkzUp1Q??tb_R0E1KULR&sT9-ILyU>ASD|}aakLR=AHog=6l-ieilg^Xg4o7=? zdkeZHdd`T5KkaSr@Q8JK@UPqv29tXT*?VaYI{!--kX@_BXVNEkllm#SQdJZIlqb4Msl& z{3T!0Qh94||4V)sZ>jgc?Ds7tRkZZK;%{8q;Di0T|2=Mrb-)}NkNTIGUVIN8@?U5? z>u>Xc+H^nA7Ei+VrVrPcA3bJz(<0*%+9G)iMqQGXWqBi`Aa&v;>LqzN`u6%3j~OfU z9CDw@X0utyCQCLUFbKo!yxwHO?95Ozn`D;& zfgs3zc%g_UieeBE6g&YB!~^jFL2*D)IRq3Hqkew+`SJZ1hy(P&5}w+B}+!%FnT63_O;L zt>*i&T-@Oe4sUdL6L>t?JU){etk{OchL#PJHneVxh$F3p)r^#lH^h={`3C;9Et+gw z8_Dn45V0nY4MZc!_Gn~$vNeU8toGX@cf__uqmi|dbATqRFr8W>N!nKE*V+65Ed#eAe)WA8Zm5WdB>0X^$(G{;GQmH(Uq*9ehsT4{d z&2hLbmAYs&owL8$84(HOCCNX#7p^H;qO@?t%CB3vsUR*~SVm}keRko7Y?_0qO{Iky zDceE~b}Exgmr4tYW1<1s?Zp^5kcc!y<(*1mU~J{k1}jqz2*ver8Yf6JdWE9cm62q; zC1N#DoEol-pg|iEZlop|ZbDc#6Ye)7+(MJ&{RG0T)F#6%2v4SV8J>jj6zY)SR)nY0 zG#PF~csk9H;mI_UW}(z}+Jk0;PoX_&4tNLcMRUQY(%v)=d>ZXTo#4}HKJ5!WgZ88S z!DrF|bRhUFI*1Mi-@}?sUBfXtgx+ywG`S}oN{8X@99lpN!S|xW=?L(-bR-=GzBj#- zjs~Ac$I!9h`_OT8Ja{LaKqrFFr<3Sp@O|kNIu(3BI*k^A?|*ZY_N8uGf-(-E9$Jcf z2U0IB13!rR=ydRd=?q#9-bMYi0{jqKNdw^TpfhO|_@OjNtHBSWHFOsEf|dxarLz%Q zNas)z{BSy#-UWUHok!<`A4w^?0Q@LQ(-8PODMJK)G+8tZehjUn_29=+mNtMNM;B5K z{CFCnJopJzpd$E*bP);glc+>x@RMnjHiDl*n`krmsWe98;HS~Wv;}+-T|$?FFQ&_A zD|k0uPFH|0p>1>}cn`gst^!|5SJQjId+8dw7JM09N7sY*(G7GX`00@FCb}7+Gw2q& z6?{4FyqDgGP(Qt&J^;RgK1jELucQyrhrtKvcKQhTnTUA@eH5Wp^fB5FK1e(02zZ*lPTv3@qHof-z%%qHeH)zUG5QX;Mc<|G zfe!=i_vvwj*3l2>3GnswL;4YTmVQh>0pCDR(o^6U(ogAW@ElS+Lq9`kgnmxXg6HWM zQ~@v0bM!oTk$y?P0>6k}pkIRv`VIXSyhJb3OWLu1N@A4c>~Y z4dM5IPsY`b@HOC5aCIPjE%;Pi(-6K6d^)Zf2wx9A6W1(+Zvfu|*KCAu1m6?a9E5KI z-wW4Vgl`7l8`nI9Zvo#2S0}=^g3lj}9K1hleI?;q*$i8L_m9IdT-~@zvq8#{ZILaJ zRJ0u164?;l7DYHtk-^B$=!&j}N+OfmSjbYUSZPkJPv^IL z@bCp>jTvNLuC&SQy2~QRBV`AMvF`3vAIi<9bJ=mA6;`P{Rz}xUWT@B ziX=|x#`ykPBT%{(Ewpb!MBQ`$AAe~cMCXQ(CABUT9b>k`>3Btlb zym)Q#w#2qKQ*=jkM;zTbwxZIQE@iUWu7obDqbOXrPU$_HMJI}}TWLN*l_o2nVHY$m z_T?}3<9pK~Wq&$9I-JgwM};L;uy?0CLTLrWfrz*oSBV|@c8J{(PedEu8rK!fS9pf| zqx;8UCHx8aU<+T43^z^3MpgbDg}Vc=1D>?RUDSV)Ey5)QAIEG8F6E~sEkUXuuH7t z+%9sMYLL8MgSXk;ZVzmPtet(OI$ad0NY8Wd`KqMwNQ!n$s}(wnVolq@7`ND!W*VN5Vag5-uL= zTM{az-Ps&bTUD(fg=SqA0^(M$n6qQ!`_>kd3l4Zhs*AA(nwk;~*#r?GU{`E~U?-}p z*(0N4L01;7yh5u>$IU0EGSP%!59DfGyST!+t=eM&^XSVt06&g|+)}%E5D$aD15xE91W%hsMH@Zv;atp3V98o9oo zbABht_&%C$=-CGPfNPp|Iek0=mm<*5Svktheuu)_$LHEIc!oGAp=-p9YQp{9>FRQ* z)m4W5#gE{U_1*@RnHC#AK$Fc}T&RSlPUL6Qo#=K}ef+z<+o1V_(#c$2ST~R^uh&JA zL#NZ5C&3qWqiOx%cmVhWE@iVYn&@tVubfa>cJaUjS&XeU5v%NYthR+*Cg(l6P|76l zv?UYoK$&_worrsP<5KMeGpxI`-aju&v>LU`G5FE(4Gowc zG)dlEj&E;3pH6IvZi%t)Y}dOzrtyrJr&vcF>4uIt#-1@ab5FL^wu7bDKT8Jxna6K& zC`htBKe#Dd&a5wNw8RKdqKlZ(BGM9BG}y@fruLB>?pp zE^!)2U=riWv0hAj*oM+|8L`6(en)CqE4;Y*@_??>e zeVmzQ-Ffc&9N#|!Wc-kc;I&Kmf5yDHch!V3_XFxnbz?>e^(ww&7zfK~QSKG#p`mO( zV7@~&egzP|!6;7y37AA*p7r8##=*gIp;$Mpl|Zvg!O}-PZ(AR{n4wxa*`!0n1}V9 zjnYV?`z=YA)0LJyvq7vTCRCR%4)i+hb29>rM*1Uz;RJl5qn;<$et<`&}CDY;&jXC+E& z8QUxNj-tD3mBpjO!!UWB$lqh=xmBE@v(oIefmp+FG{MfsJ#5xiZ6j9M^yL;;JiDlH zm+KhLUz$X(%jHbimkP_0YUBkho5x@Mt`~of0qnWBH;Y^0I0ORIbFGBeUPax%Emd*W zeIWMAyd~9lb#}ypk7%l8qq>|2eDjpL=qo(IjO#Ts&LpopXQl12vPPwvX3*yY-+_$J zILXtqt+&M;bP)3_Eaj7I^%bKd#!+NGkhp6!?RkHEO;uBfdYEc`eP*hcRxfBrO_yX# z#aw#KZTQ_`u1v=IwVi}boZh=G0OX?;WPLqJD=T0()OwP#8#O#DSPmSssCwVtF6g+4 zT6t!_O2`&*oU4ZQYx5-1kV2Pi2=`85$&v_+>t17^q|nxIy~gU+gKiPAM(f{rkZUnj z!|pU3Cc3twVcAtFn=&n~iZ$fc zb%=bPs(gL1#g}ot;2b?h9*c6h{xqh!HQ~A1(!>kfLCdoqKuH1BEss`6sO8ypII@xc zWDUz>@0pbo%Kq$+L|xt$?P|Sa6%RIk)C#dZyznI}-)ta~GE={}zjX4Wei|sv=vR3nso-JZra@OLA#Ae%3ws4UO25AKDZ3~sglWnLp zA$9G{4N)Jw(rmYMCj-#DU{%?U18?gFW>VE;S_71j%e4x!K6CUI7>@ZOM&j+c)f#mt zwG#qvs?sv@z9keNs#Hl9j?b*WbL{mNN5meSofH8fO@% zt4YIQ>s_MKoJkFHk+z|!n)qsFq4<6J)--Ia_)7r#-cZn}@@hHZpw0cHYI_!AMYvwu z(^5^O)$^r*{GfttuskYdDB{wg$V2)VyS4q!x`@|GEk$CxIjUAll{vxI7&5lTWytv< zh$dZ9UNtssMWIbpVW9$ssDE{J&F-`HHcG2Enbs^@f&Ed{EQa+QPuc)(*HDQ~T(@5L zMw%T5H$?Yj5?a%O4^`+k^>W;MoZ*cl5Lj;V=NxdOU8}O|U?gU}3EN?Y$I$FQW#OF@ zSEr5Lg^>~LSk|t8$K94=u`bRw0C^JP$RUC!FIYp#iWJb!?F zX-%!J0=8#eK|Aa&p>MEN%L|oJyc_w1%#+hV0pngMy0uJrggS!0p}IQCD++>ozQX()R)^4OUh%ws{ZbD z!d};}>P28?!u|K`{^cn+ExkB>gQsWk$?m`Y2`~=tP2;*AWU?A0*;14%`%n(O0j|T> zZ$MCKELk(=Xp8uP5(8$(?ExX?k{4y2Ot=j^XY4u|pVk=c>v&hPcoAG4w@gmPcC#n3 zrbyQ#-QT#uHX`6(fiM&Opi)Vk;z@PGcQ% z`@40>Zm&wAW4#p-r!&^$5C{yc)pT4^y>OjXeSan)>o{J(?Owo$uT}5+fOL+6tgq_p zrPT}CvES8fP00qa*wP?#)*SbtA52T`xdqXkAlJ2|GoV7b_FYFHX9KBQ+dS|39C;~2IyTKe?ITT}q;Zj6JY z7pQUvD{799pBo{|@xigNiM$(AtKts>>#3@WbsY&56d2hQ;9jmYug@u`1^d`K;+~`F z*_^S8WjsLR9?vlWcgD2jj6iH0<`JiJIhqi+l9oD1>@Nn&%e@ z%kn)Nt$cX`5>+~UF~g*}1JVp|lkm~h@qpU%)iwAAs6`EaU>_JOnUBwU7AO97=}AH?RwU zO%Zi$zR@C^mC)0>^Rcb&rK8~sdKhT~(cu}44eYLbG6anyx2q3zq|qIv)JZWMEC4ZK=8 z0laQ!6`xRez1@*#)2`e&tdZdp)nop;bbBLC?P0#H*XL)D?S~kj?1#RsdSku;fD_S3 zo^rUk^=>Q`U7OI!G6j^fh0R7TYdB(f58`iEmFb&f7_twCYHoXl5^WMdsX3S4iP5BD zDBybm_^uj&{UwD1uF=~SY8d3+jhT?T6`$p**80+YxOZ<2bp9N}(M_Z}HDHG76rVFd zydU=-tN~G0pvpTOVvP#)j%ceaY&^QP==kVLKi!TrC9g%(s`c~0{E))zb0%CZ^=A+c z+g!5>F{JnBWb`Gxvx<)5Zoq#5;2*64K2T)6E3ws`-j$eFjHGh|cr*Ze5bDs8rW#WX zTJZqxJPLuAa!I@K2+$=~StSdH={h-fRX5y4_@SPB z8c!A{r{??9o9(Cr7QBdj8Be{~pIz&xsm+&=;gb+bxzaP@P3%hh&S6v)h(UxaP7QtM z*^oaQi4=;@z;vZ|J%v_VZ|o=<@-G85 zO|@$pSRMl4Kh*$iETUe(yqM*RFI~uyES~Bw*dA>s5a+E*%#VwqX4$k_Xxy3LnjI_G{n z;FUU&M~MB{_Y^W$Gk#Kf(SVGDaAsD4;QpQsuekAo^gD0sV7b z?_IumvS%5_dA)&}Cwm_tlPeXA?CrThOW>tE19)AAd?7<8pm}tYMRToe2jurh*2MZ2 zBDb?x!D(~1v9wUB#5Wm+u}x%7&iuX#$Ji#~QO-pJ`EA^rsX+SbJ|yb^%8AS>R22iN zeGYhWdK9PJu@%?JsH%grvjo(VR}nPCk0JhCMtmFs{?!NtM zfi;ou0{$TizR%Dqoz@Bs7a+sc=hbRCW=V4+m*QCpp4V9U?g1X)aGqV$7UK~7J!E@? z!suIea23Rx<=eu?Gr2W`iy59A&+s@{)hiAt^W?lQlBUq#2i_ADUf)dFP((Ofvo^a( zp;$f;om}|_C&8ULwHIrGejLdcg@e{g3kO|82VCTyI>suU?)18Nt92|RX?6Sqz+Dy& zS1TeM?u6^OigaRiYy$lRK(7o3?Wto<9X_J>a#MTzne1W*Ix6gL-3*q6l^zM~3K?x) zALpo5@egtDY@k)1NJrzidWq_Si4_)J@e|V%XHC7<(@2x^zDSx7KY|cL;Z+Vj@uq%T zaCv*&>DPl}`Hb1HxlTrtT&@aueLn`wtb*y=9uH<6j?%2nEplMxvAkA~eTW2pgIUGJ&1Kk^7aTIu+&#tDb>?5wlJ z!><9XA!1j|mQJpe@5eH0Lj4r?wn8Y`kNIS!;eBbrq5?}xO0G^@F2lhd!HzKsD(cU(V?!O7fW{&S>983!ZTaeodNI<#kTZ~H``9aS$h=ZKS%ZgqhV z>4c(l>k&s=I0?r!*5xk%_$~$5XV%g9T50uSc22iwxw!kKhSnDqL!CZ{d-o}be&;#> z5zYjbCe$B?U9%AKw5ZeV8RP)J!58o886|$RMQGi+{vW2}G6hFAR_^mC{YwhDZ}-fp zTz`r6LU+z)t}0-S!`AuTV#b5)c61})UjpzW3b1c!nNQqQ%c&RX6nG%WVQDT~lznrz zIQfkth-^gpE1-N#p`5Lqr%`3pi;(`0Jn?b{97cTLFTAzw^QzL${wi%LHKN*OGlBcC^iPzlA03{|#^ zgMEv_uC+^V8V|~ZJ|^QL?--VXdLnD!Uq=3~EAYBXx!|km1CvSRk~`1J;OUsKH_|!h zcVg;kZ7Hbp%7iJZ*SffS#9TNXzVr?bU*9+S*t!|@tclXx@ z?V47+4?xA$s`^zxeoH~t&8l8fy@0iPc0trKtFLhbXdqw5y(VlF*q&-wAE@SDFHA?5 z<&X*^T^86OG3l~z#Taf2;vym<8@1v0Ks{NZ*7es{Se<~AjvugWacYUh?@iw=Sbp)2 zjA=sZ{+PhB#de$-3bg)n0d9;s@wx>p5$R2<@XE#A!iBRzD$-4f~r z=sf<%$-A>6Q)5QpF$8u@6UaXT`cp;Cgl`=2F}A3PTiUIlv6KKx7X+KN}h?n z!77Pf-^U5md-`-+^(NpRtKbHDy|=Ky$_wnUJTn~fvT8?3`Q3&!YSwg==P$_k6b2=a z^62_l&9GiXP8ITNVrAQvde`(BJGTkcE`aJ$p!AyZ_TMv8i{W(nLGTEESK1>c|(#7NuCWkR$&rU34ayXNtm>kXISSH6aIg!aJOil$! za>Fg^?(P{JOkt{@8!crqS?lJnmoVvJvW&@cCjCrSFj>juOeSlYoXzB1Cg(9ZpGk_z z1x$vR5EF~ZFq3sm)-&0_B+sPCL@+5aDKi;mvYE-nOfF$^DU-{XY-MselWk0{VsZ_W zYnkxlwc>gvH!``2$t_H7W%52IA7Ju9Cbu!+CzHg7ncU9g4kjOCvYpAtncT_bQ%vq+ zvXjZ(O!#cCxQEHTOzvZHKaz%H(M#&oKEJlV_Rma+P?F$@5Hp z$%K~!#0yM#7AtsCC|+XnGLu)B{Eo@1OkQWg4vzQ(6CRYsADR4#37c&3CX>G~*~R3q zOcH+5!XH~f4!~7f66GJ|OT=OgvBpW!Sd(@&<8zC1A)H7gn)UzoCfwnxMgBJ-&Lo5q zZ3y6QLf&PLl(D8n19SCn$WMO9X?@=zWn89@%Wqm_m`l~-**Ui{8c!*9YWI%kQwy-# zxHxx~kTG%@-W*ycHMiCLpVlmEv};x+UK%S^8Zw3A7~XAN#v{|EWQUr6rPkx2R!bzO z*}n&ATkn)Km&xhAdrn0BbYzbZ1%W3o;855xE6w;-tUO*=n`~N}%`aKL+_q%+X)bn3 z@q3P~nL=t~T5yz-J;85L+mw~4g;(I>{X6AK%b>K;qxg}Z253U1r8t%<$X{f{&wLGM ztsIq7$u^iQ^&65>Mw2>K5+{wwUz6n5Ek;TUKzQc>|M>ka$)gQ;c&a0c6IZc@t?kh{ U(Ztr+TOCbJjZJSg#HYpo4-)Kec>n+a diff --git a/camera/__pycache__/MvErrorDefine_const.cpython-310.pyc b/camera/__pycache__/MvErrorDefine_const.cpython-310.pyc deleted file mode 100644 index c2cda859c117b2cd9c4872e502bff770e3ce73a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1997 zcma)+S#RV-5P+RIlF2c-lf5^ay|YJVZ(b0h$L>s8vD;SLPBismMOyWeG;tCpaSEoe1udM0X`F!>oP}AOgE?$N8|Psj7hnMwVG);L z3726RS6~HKVHMY44cB2EufP?&3Rm$OT*K>d9dE!5ya_k)7Tm(ya2q#Z1Mk2c+=NZM z3wQAz+{62DA0NO2dD{Ye#i$922XQ>)O{@36*bjhwc@ILSE0*kYV!v|V=|W*O%g z+l=#!3yh15ON`5mD~zj*YmDcN9@ROnn6buKXKXMw87CR17+Z|zj1=l38e@&I&e&jV zGEOosFm5t>bVcKW7;B7m#s*`P@to14OCCF8tTEOZ&r8%>@1Pm&7x5m<(w{7Lg$_aq zbES~xNfMjPN!@%W-j@dE%ROI&VQhj6IT1!gG9$TN?i-oLx$&j*tK&dq0+!0X#7IBZ zfyz{@opW-WTB$P7vD9(i+bt+2tdwU&SH~t2VWA??lg=)TMNovQYlP{$xH^vW%pR*s zklHu>By*c_BK3}<`W8x`WL79$QcI(J=Ytf&^zumRal)iALQ}m}ek3M_iZEH9eVANl zDjL^BCSlxDbUp5(tW)2YY04+8Id#c(mJEWv7LoFOk!F0#<+|#srs|?3lr}jTK&4f> z>{TIxfbKhms_+A&GHDadq@Ouml>&7`D>^;xx}El2UlQT($qZ(ySmhX1-QJV^f@VYQ zP(|gqRE8vg?o zWV@G-8D+=58X0Tk8na#|n&oPOQ;bT<69^O5MM4@aGEjt(srpGKYchbM#K zVJG@Q4u@yMVDQz^>7aOjb~^gF{oRkhwLU*N!|#s=U(mPC8y(ZqsM9;~zu*6|{kQI) J8Yi_T{sv?qkKO

E=eV58xPr>Lk}9~0D)~HB@dY~17wH05 z(?zbKYQ97@e3>qBEnVg-RLfWC3fIw9uBSR~pnASW4ctiAxQQCMnVPtTnz@x)xQ$x5 zo!a<1wQ~nu=T7S2F6!iN>f#>i=3eUI8`R5vbc1hFANSKu9-w|6qyfG~gM6EA@g2I& zLv)8dG{j!=u#dd#Cm#=!p93_^BNX5ujqoT1IYgs8Mj^gSV|pXM>NZi=@HM-V}3$&JWo$}f#!LU7I=vk z`6(@NjGpo`#dw95d6iapjaK;?t?_eu#&LSiL~(vW#4qUuzoM7?nqIL=uX&wRPS85P zp#*Qx8)n+zBr$JNlDBA+w`q$t+UB>U@eaM^UE1M2+U0%P;}q?4no|6Z(ww1poTUsO zP?q1*0e_(Pd`KVoBOUS)edJGc#GmOCf1%I(mA>#d`pVzw8z0m6Ers!OY`H~m{R7_1~JyKaL-Nn;5RQ`^sIw1W8 zGj{`BkT&6|!rQ59!+4576*o>2OPj1v;G8F})7cbgZGnDjmagETm&09WLkyjt&cSn5M%I z9Tw>DSI6Qy0;?k=Ix?-JRCI)0hnG4sm_sq-5U?BqmP4F#$W{&+%xQA~D!Nf3{OBe8(ruZHq%k|>f&Wq5d6oeD>W{bxvr z{hRqddF^L%RhOQuF01oX%X9fwNiP-+`@HH>Vq+)C`F1wXOGJ4w8bl3+;{oH{G)4Z&G> z8_(O?EGogWS$5fq2V!qO97da7$u3*N!=jL7VK^E)9cgb_?6gMZ(bm-H5m|`p7Dg3H zRIcvR;27N}7pXAID&RV)h#setTP0B_wq#Qc25jp_EOpWpvaR!}{ZvR@*0%OVC)y@o zbcI9mg(PUd6>DFNz z2oy|7bYZx29a+gXx*!tE%jveVC(6jSQi5JzVb5?JiVEzO!eXq8-J+=bWS>^|Ik~AJ z?M~Hi6^*>j8`B$>{kVi&TqoOnA?5P=Ms7u?I3-D(5Dw`R-BpqYk-m}Oh*{-!<>gD4 z46>phjtDd4-3J?PAYe|}C5Ko@MO(#J<7=jh?dcm9r>`6rb6sOwlZDurtaHRZHARP~ ze9)Lv8>hE*Udg5PqgK9C_RYE-IGt1{TU_BVwT-qvZ~NJ6|2b&;*`K!k>8{t8s?r}DdbEWP3#zRtJ=*bw#{=iT$*QNq&Z4nRM=Ehv2q@*MSr+3$aA1X{odsz zbz#k>CyJzgpY#49N?*Pn7WUn6RMf8Q>}*&y&Ww`YJQ0Ylm5bJrn2jQD1*U@Eaj2D9 zr=h_T|HPz)Ek>M0^0sTra5Z+4A)!t(G_{-yYfd9A>rs>A?A)>EQ7GnNIOt@(g=^ zI*+i&(y{3Uqb)53x$#ACP85od7I{MxT4MhQnI74Qi!YMbrTx7y`t-VEBmdz#WFyCp zYW+H4BgZLb$!&rl#!sE800S(Ag#kTZv2h@Nugzwzi$AqwssQ}SF4G2d0d+tGhyvw6 zH}C{_1l$Csf!n}cpaQ4_nt>}oI}ir~Kr8SJ2mz0QJ|GN?0~dkwz$nlF%mMcRAJ7W~ zfrmf~&;-l^%fKyQ5?BQKfg3R)PCKColk925NyCpa<{(9l#Lq6qo?UfHL3# zFbvE9^}rOc1Uv^~z%^h65Pu(4GHZYz@B)p%C13?= zFpvZ`fh}Mg(15qV4zLUC0sBA-NCWSH43Gs5fcL-$;1Ku-908wz&%hVpEAS2Y4jcnI zkQ2yPs%m0)S5^O_Wd4Ycz<(w@tJ!2G>)A{0Z+Q+=nH|r8c>1)hdEROXJgSFT&qiV| snMrs~`*1s%;ACbfeUz^n-%IiP-Q6h) z-xvCs&L2fW{z78>(}DN^Msx)xMwsFeU!jVxQq|X}=Id1V4Qlu%HT@jT`FWaGP*3#= zzC|s8HLvKGXh|U#2-BHyhcLrYHZ)phW|P!&DR?IJe3ENiciED|6SFbjy5V?9p)v1v zopa3PNwIM`jyh*!&Vw%S=K}vma5lIF{0pJW=38q)j7k@QHzKZ$h`N#(jq^d515g{h zjSG%{xJmq?w_$P!RT!ZvGw+c_g{e%tQ=pm*oa*<8PN;!lC%O4x$?abKaG|XVYdIlC ze;SNv1}086NMGqGTZ%$@q_46e($M#oD!BRu#3?t5;m^If)rMk-P3BIU$eTx|-;b<1HrU zN-K1_{E?CrY`g8XqR6%%k$+CiUX7eEn)RLT((Gywelp7et#{nnWw(XUUX5mBch%HH{qB#WD`?4S%zG=tq4ln zP;UbV_=q%tbU->+nX#eth^_U=vews!#|hYAraW4}CeJPBM^u635QA-A*jiv~fvuWp zSp6a^2#wMPT#a1@c^TwdCNK93%*s3zg@+1gRK`41{^y|z^6Hp}YQM%y%X>0^)sepm zRucXu`2;HqGzFHE;H{GBPL1J7u&a*v8RmO8$Zex%^!KrvkQx2`=p(}iG7HI_%D9;> zoX8%r>OrtL2=VGdj@V!mBaEl{8dCfatY!Ah{$VEloBh|BJVjHiYOxxd+R`AEC0z!( zHbz(2-v7v}KnpoP0-kfdT>k)*G310lc>~DZC!)#q-{{F(MxKlTc}6B3o`JMJm~n^J zq(9vgnIIn6e)+(5UOayF{7L%oZo2(-IsrME;>GUXC6=2$V_Vdn{&;I`X`}71*>ERLo z$>yN{8SrBhSn#aV2b%)!+Wa2U^eSZJt55Jz8K0b47=Gg9%C&hO< z#j+iua*7ov#g|ooGej=c&jua~u>jGchn3XkqB7*5QeYKK$^e>t&2yR^$KkXDOu+NA#?$f6a_s8G}IcbFz4M{4!h{MOC3%v=`@D2AzTR=)NbAhvGOGa2THb$Vp@=@ zE2}KY3oam91b^q+o#0Zy9Gbrjg$T+H3vmlc;Rf&8qSQ#(_5$#Ow?eHJV@)19yxpM% zz_MFN_DZYmc9)X!O{ipU03JjGvBWMu!l1((x|o8MF9xBz4yVxan$n6+0QZ^`a<@I= zg?O1_m8_i&8kEkXpJl(TNrc0A9v z$M&}u_a`=qPY*9B!q<_9ZPv^Xc?PNh;$cgjRhvI00T?%@5$}Gk1tJhyQ8E8M?R(g3#_th AR{#J2 diff --git a/utils/__pycache__/config_loader.cpython-310.pyc b/utils/__pycache__/config_loader.cpython-310.pyc deleted file mode 100644 index fce5f6b31674701fa7ad8720f8bde0abd391b254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4192 zcmc&%-ESMm5x?C#lER0A;r3={cV~BJ<~KX*w6_}yJRkk_mC^ovit-n%G(Rd-o`cW*G89Z}Gb$s;l$5p&{guHSmd#HnF9TdlK^Ym!2#lf`&5AIUX;aEsl8Lei zi%uz-7>h9-{yK{@1O9Q=%@V9_iewDd&XT}MunyJ<|2Fmr>w!3hIlH;Cym|f?{^~sNgU*9F z(zJS{DSR)&=k`ERRq~*cvclsYISVyYa$tH|?tLYWL^uERyE9+h6wV zg4>^y8#D`Yhw0LUXdAJ-P&nGvjY46lI*F1>Z?itq%{_PRQG-!(kB5P<<-R0!HI34JVk(qcAuMFN#jmj-e) z*D4H4eFg=pLFgvv#`a9}5vaK+JxV)CQf*T!`&)F==+~kbbX-)a)XTqssQlPd@?;6L zkyn=q|Ei}Ug&Jb&ocd03l6aA&Xq7Az&{yn)!Zc0Ml(Q;PiuyB(`{XzwpfRGn2A`)d z#aRT$Us5j9WoW_v#}pPt_lGyWNSU#yqU(d(H{Rr8jCCxcJz`)111%sWb?%m=DPCe? zk|>j4t;*-17r>=T8?&*loio|>Rlf%7n4~|Yay60~C*w-0Tl#kZoWQ`fg*P_V{wN6l zI8ye8pZ?Yjv}Q5qFuOQ1Sbh`~=HLF^?g0aR9gWA%g0)%*VJ z^wzJYH-Epjx%Pe~@=W@0`tZvDo^Gp{9V%ERV8qTA%#y=BSM=1GC#{JgC(D^x057tN z7Eh@{D`v+m5jzc-vYn#Phpntv=9Vj>?x}+9Srvl~_2<2#FQnO!P*O3Wc@rgzCty)R z8+BX{+z%!ZS{bGkdMWF=fJ(;E$6-Axc(Kq~*2@lMU90^0`aWka`D?4&YZtawt~RR& zcKaCikRhnK!N2<3tv~#FppPF!vF#i^Em%WTLc-)Xn7ny_hl$3O_DB> zB#%Gnp)^7XrIcu&YM;Lq$lt%Av1-= zSFm^ri>I-`v*lqdJGlS#A`nbaz6RrRRyljvlms#PPs%A|HGQPoZ;(gxI1hv~$VK_slwDCqr| z0`Y~GyWy}k`sz<`kk%D`=5ELjiRbx9;EjOEC*X8GHWvk=Y{4iO}s(nQ29LF@{^ufJkVyoA6O@#7G= zB$;rH4u|Y=jWCrM+`~1hko7Tjn)WK-AW3i#aFNr5_dv=4u5v_{(qWQS3LKTGy$W!Z zCAti5lG4f_;o?FkSy_klE>vI04~hSUlSsu4^le@H*_K?+=6h5Bo%x3xr!df0yYQiZ z{#qcSHgn#8>-}&S{2Q?8!R-g|q*VS*s07eQNZ0Mozm41@SbQgJ|1MIkVL-&)hOP6^ z>f*V8w(f+C5v|>(>gob;^ua+NSasvhInZZq_6>jKy?_&T4v9UD+!O>t_#YZ$l|xVU z9m-V>ZQgt{9FN`EfHD+Pl!FOfr%@$p!Scz{Y~os z?>Jj4p8g;D5B6kYR@DlnKATJa~LRxC4ogVf~k-=0FZz7nLnx-&JbIf67NN7#bW}2tU*+RV~W}3{& znI=a|!nLOWiRYN*jXI3SaD8}*k?EQ|%lWfdeGUu6AjgBaX~7cqcv8z7C)VWkRaZ2k zK~`rFJ*p@4w2{#F>yNc{1@}@d$U@P9g1iDzzL!v;9|<<`EMAbMB6I~KNEiJ#kGb6Y diff --git a/utils/__pycache__/menu_translator.cpython-310.pyc b/utils/__pycache__/menu_translator.cpython-310.pyc deleted file mode 100644 index cd70295f2d7557c94ebe7533304d0e976968571b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 zcmZ`%%}*0S6rY*hepsMEgVA{KWK5bEdNH1eL5X-0CFo@@o24_9E!*8XJ1ask(NLqP zKujR<>j04h9>hcw2(6L-W3RGpIeGWwo7tk3=u771&HH}8_q?8-3`;@ceVY7&0(L2BFx{7^I?F70qKKL3Ns_A|pwYkUSM;Z!kBw z%`Mk=EaCCsDulL{-$je7&Aoc-)63}f=8vy0nk$?8wWYRZ`OCq|R@>*}LiB92@$gaf z^lenHHQ!WYeE~z7LjpXIY;6dhe-@ZP^XLJdLu+^ruVah^S<|SJ)WlkF5}cx~h1UDW zM_LI^OUusZe;P+}I+r+yCv4Xjmg6XxhHXbM9;O_xShU?@sN3#@2XJaur4nYu@5w(P zE?4+-Ab-ba+|QSpTg*>;d@3(Mnw_-sCEJpsIql~IVLQqtF#lxeugrv}+NDhh@3f^L zwVwo*)G|1WXV3o)d;fpJ3KF+NlCs27;n)Yl99cu_NZ=BgB0PNzt_oI4)C%`&&-d%w zt-U9W`bOsp8;h&0rJWen#;b45jauv(?QX~0jZFvZyTdsx)WuANaaq^s8uDDh?hDzs zwD`=K2sLlK6egIwMg?BXy1+l|QrZ~&EGX3QSwe`8XU`lNzQc6{PBLwpu2p8H8D>ng z?9srHa<^&T4J@Z^Ntq_~3Q`T57IvY`#H2@gH&o)sC6l}CV6rE59P&VXX-p#>6OzH* yNu|#v!tAY?F`KeW{i9;Y4CV(%kt>eoV_TG`^YaBFHR`{ diff --git a/utils/__pycache__/sql_utils.cpython-310.pyc b/utils/__pycache__/sql_utils.cpython-310.pyc deleted file mode 100644 index f1020e0deaf6920ded66acb6a8fa82e69f4ff0b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 zcmZ`*&2Jk;6rY)0uQwYzbwZM+Egz;I6jP}dAOWgS)l%B36d6HMDtuXOcBZZqd)J*= zlX~T%s?CW?g)I!j1c^ZgRRzD&}8s4ypM_#~%Y;&cRSOfCy5joYWbooNbc2!3}Q0 zZ1RKL;`vQl&jDxiDc~%=#HV>-)2!!#EAkoOY~T*?5^z&|md}Bv!(ZX^Fi-OZz6f)H z=fIXjiM{;g=hvcUOZg0r%^tJ`->ylE+oyM-?M6m1y0NIXFmSIJStK zhUwoAs@If|s@fJoqq-5w^=brMe6v|yYkJ7K8>-qx>#OQk%hlZJPA{=tw;41e*F6Bc zC=9J(^MTFV+3s4>X%Jhz8znCjUP1Qj(Nk)IjL z0iPR8Y1dDogDcaudaly|xOJx!s;D6a@bRIJ>iJ=(@m{&9%0U>Fn}LeFR!i{2g73{p zB>8lHKVI5p_KMovi@a4&iP%2V7VS{>&cqAX0@dwwLKz8O-VNxPvW`#1(IHFh?C@mz zN*g6FN*PKy1(uhkW)P##vdsKglQJyTM^SJYpGq2__iQJqbdN@H37Gi6ezsrNHE5E^>>Z`#jzLMB*T{5z_KkZ`y?2c7j1A~s z61`KgG(d@NPNQ@XxMb?$ZC`YvW*8*43|p;L&tI>YX^@ss^bkr>@iN?*3`MsCnItM8 zrAj~;U@gILFo<{AfAPURxKoY9k|OHLU{6J&vDyL0fkF73eoJHlS`ReHA%*5+E<=+= zur9PpsFPe5lW6;oyW77$c>3hQ_V>drCTCztCt^JN$;Hc8YUP!$&exXDUs$>FMeR}z zAnF!$7^N_06UXaDVH$3^fUDS+Qi8iDv#X-f4BSY1f%1HG*t@W-P}gBIw7}xSBcyvo z_khHXiy(J0kOPVtiJ$;3l_jpT762Lu7Vi=b^4SkRK7H~y1u4t0!3sjrMTg-`LA{CG zBn)#YzHtyAf$R<@s>2*wpyu=V$Oy(>>3wm?W3a`pjoXiYdG`BH6K#AIEz^$Q*T(rQ z3&*WIi+U%3#IKF4nqH0y~+y#wNxQ3b1M?DEnFfzrMQrS~?VlXiwN%_TX98I|T1UMVm~;;kHbZQ;6! zMyectObk diff --git a/utils/__pycache__/version_manager.cpython-310.pyc b/utils/__pycache__/version_manager.cpython-310.pyc deleted file mode 100644 index 04c96b8ac5edddc71dd89bcc49988c9ba201fc04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7036 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 TP+G3_N3M&U7af5tc1!;UFNOZh diff --git a/widgets/__pycache__/camera_manager.cpython-310.pyc b/widgets/__pycache__/camera_manager.cpython-310.pyc deleted file mode 100644 index 4834915b0441c5933758602fc271f28854d40a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7948 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 JE9pC^{vT)df)W4# diff --git a/widgets/__pycache__/login_widget.cpython-310.pyc b/widgets/__pycache__/login_widget.cpython-310.pyc deleted file mode 100644 index 8907f222d9e6a4bb852cc341af697a07ea98dd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3474 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