From d2cdd55164619948300949e46d409468ffa7656b Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 26 May 2020 00:46:28 +0300 Subject: [PATCH] - working on Isolation Tool: made to work the tool parameters data to GUI and GUI to data - Isolation Tool: reworked the GUI - if there is a Gerber object selected then in Isolation Tool the Gerber object combobox will show that object name as current --- AppGUI/preferences/PreferencesUIManager.py | 2 +- .../gerber/GerberOptPrefGroupUI.py | 19 +- AppTools/ToolIsolation.py | 212 +++++++++++------- AppTools/ToolPDF.py | 2 +- App_Main.py | 2 +- CHANGELOG.md | 6 + assets/resources/contribute256.png | Bin 0 -> 9823 bytes .../dark_resources/contribute256.png | Bin 0 -> 19944 bytes defaults.py | 4 +- 9 files changed, 150 insertions(+), 97 deletions(-) create mode 100644 assets/resources/contribute256.png create mode 100644 assets/resources/dark_resources/contribute256.png diff --git a/AppGUI/preferences/PreferencesUIManager.py b/AppGUI/preferences/PreferencesUIManager.py index db1d738b..33a3cec4 100644 --- a/AppGUI/preferences/PreferencesUIManager.py +++ b/AppGUI/preferences/PreferencesUIManager.py @@ -131,7 +131,7 @@ class PreferencesUIManager: "gerber_isopasses": self.ui.gerber_defaults_form.gerber_opt_group.iso_width_entry, "gerber_isooverlap": self.ui.gerber_defaults_form.gerber_opt_group.iso_overlap_entry, "gerber_combine_passes": self.ui.gerber_defaults_form.gerber_opt_group.combine_passes_cb, - "gerber_iso_scope": self.ui.gerber_defaults_form.gerber_opt_group.iso_scope_radio, + "gerber_iso_scope": self.ui.gerber_defaults_form.gerber_opt_group.select_combo, "gerber_milling_type": self.ui.gerber_defaults_form.gerber_opt_group.milling_type_radio, "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry, "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb, diff --git a/AppGUI/preferences/gerber/GerberOptPrefGroupUI.py b/AppGUI/preferences/gerber/GerberOptPrefGroupUI.py index e3269322..2a57a640 100644 --- a/AppGUI/preferences/gerber/GerberOptPrefGroupUI.py +++ b/AppGUI/preferences/gerber/GerberOptPrefGroupUI.py @@ -1,7 +1,7 @@ from PyQt5 import QtWidgets from PyQt5.QtCore import QSettings -from AppGUI.GUIElements import FCDoubleSpinner, FCSpinner, RadioSet, FCCheckBox +from AppGUI.GUIElements import FCDoubleSpinner, FCSpinner, RadioSet, FCCheckBox, FCComboBox from AppGUI.preferences.OptionsGroupUI import OptionsGroupUI import gettext @@ -79,17 +79,20 @@ class GerberOptPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.iso_overlap_entry, 2, 1) # Isolation Scope - self.iso_scope_label = QtWidgets.QLabel('%s:' % _('Scope')) - self.iso_scope_label.setToolTip( + self.select_label = QtWidgets.QLabel('%s:' % _('Selection')) + self.select_label.setToolTip( _("Isolation scope. Choose what to isolate:\n" "- 'All' -> Isolate all the polygons in the object\n" - "- 'Selection' -> Isolate a selection of polygons.") + "- 'Selection' -> Isolate a selection of polygons.\n" + "- 'Reference Object' - will process the area specified by another object.") + ) + self.select_combo = FCComboBox() + self.select_combo.addItems( + [_("All"), _("Area Selection"), _("Reference Object")] ) - self.iso_scope_radio = RadioSet([{'label': _('All'), 'value': 'all'}, - {'label': _('Selection'), 'value': 'single'}]) - grid0.addWidget(self.iso_scope_label, 3, 0) - grid0.addWidget(self.iso_scope_radio, 3, 1, 1, 2) + grid0.addWidget(self.select_label, 3, 0) + grid0.addWidget(self.select_combo, 3, 1, 1, 2) # Milling Type milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type')) diff --git a/AppTools/ToolIsolation.py b/AppTools/ToolIsolation.py index adbbba79..d12a3e9f 100644 --- a/AppTools/ToolIsolation.py +++ b/AppTools/ToolIsolation.py @@ -370,22 +370,21 @@ class ToolIsolation(AppTool, Gerber): self.grid3.addWidget(self.milling_type_label, 15, 0) self.grid3.addWidget(self.milling_type_radio, 15, 1) - # Combine All Passes - self.combine_passes_cb = FCCheckBox(label=_('Combine')) - self.combine_passes_cb.setToolTip( - _("Combine all passes into one object") - ) - self.combine_passes_cb.setObjectName("i_combine") - - self.grid3.addWidget(self.combine_passes_cb, 16, 0) - # Follow - self.follow_cb = FCCheckBox(label=_('"Follow"')) + self.follow_label = QtWidgets.QLabel('%s:' % _('Follow')) + self.follow_label.setToolTip( + _("Generate a 'Follow' geometry.\n" + "This means that it will cut through\n" + "the middle of the trace.") + ) + + self.follow_cb = FCCheckBox() self.follow_cb.setToolTip(_("Generate a 'Follow' geometry.\n" "This means that it will cut through\n" "the middle of the trace.")) self.follow_cb.setObjectName("i_follow") + self.grid3.addWidget(self.follow_label, 16, 0) self.grid3.addWidget(self.follow_cb, 16, 1) # Isolation Type @@ -435,7 +434,6 @@ class ToolIsolation(AppTool, Gerber): # Rest Machining self.rest_cb = FCCheckBox('%s' % _("Rest Machining")) self.rest_cb.setObjectName("i_rest_machining") - self.rest_cb.setToolTip( _("If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" @@ -448,6 +446,57 @@ class ToolIsolation(AppTool, Gerber): self.grid3.addWidget(self.rest_cb, 25, 0, 1, 2) + # Combine All Passes + self.combine_passes_cb = FCCheckBox(label=_('Combine')) + self.combine_passes_cb.setToolTip( + _("Combine all passes into one object") + ) + self.combine_passes_cb.setObjectName("i_combine") + + self.grid3.addWidget(self.combine_passes_cb, 26, 0, 1, 2) + + # Exception Areas + self.except_cb = FCCheckBox(label=_('Except')) + self.except_cb.setToolTip(_("When the isolation geometry is generated,\n" + "by checking this, the area of the object below\n" + "will be subtracted from the isolation geometry.")) + self.except_cb.setObjectName("i_except") + self.grid3.addWidget(self.except_cb, 27, 0, 1, 2) + + # Type of object to be excepted + self.type_excobj_combo_label = QtWidgets.QLabel('%s:' % _("Obj Type")) + self.type_excobj_combo_label.setToolTip( + _("Specify the type of object to be excepted from isolation.\n" + "It can be of type: Gerber or Geometry.\n" + "What is selected here will dictate the kind\n" + "of objects that will populate the 'Object' combobox.") + ) + + self.type_excobj_radio = RadioSet([{'label': _("Geometry"), 'value': 'geometry'}, + {'label': _("Gerber"), 'value': 'gerber'}]) + + self.grid3.addWidget(self.type_excobj_combo_label, 28, 0) + self.grid3.addWidget(self.type_excobj_radio, 28, 1) + + # The object to be excepted + self.exc_obj_combo = FCComboBox() + self.exc_obj_combo.setToolTip(_("Object whose area will be removed from isolation geometry.")) + + # set the model for the Area Exception comboboxes + self.exc_obj_combo.setModel(self.app.collection) + self.exc_obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) + self.exc_obj_combo.is_last = True + self.exc_obj_combo.obj_type = self.type_excobj_radio.get_value() + + self.grid3.addWidget(self.exc_obj_combo, 29, 0, 1, 2) + + self.e_ois = OptionalHideInputSection(self.except_cb, + [ + self.type_excobj_combo_label, + self.type_excobj_radio, + self.exc_obj_combo + ]) + # Isolation Scope self.select_label = QtWidgets.QLabel('%s:' % _("Selection")) self.select_label.setToolTip( @@ -462,8 +511,8 @@ class ToolIsolation(AppTool, Gerber): ) self.select_combo.setObjectName("i_selection") - self.grid3.addWidget(self.select_label, 26, 0) - self.grid3.addWidget(self.select_combo, 26, 1) + self.grid3.addWidget(self.select_label, 30, 0) + self.grid3.addWidget(self.select_combo, 30, 1) self.reference_combo_type_label = QtWidgets.QLabel('%s:' % _("Ref. Type")) self.reference_combo_type_label.setToolTip( @@ -473,8 +522,8 @@ class ToolIsolation(AppTool, Gerber): self.reference_combo_type = FCComboBox() self.reference_combo_type.addItems([_("Gerber"), _("Excellon"), _("Geometry")]) - self.grid3.addWidget(self.reference_combo_type_label, 27, 0) - self.grid3.addWidget(self.reference_combo_type, 27, 1) + self.grid3.addWidget(self.reference_combo_type_label, 31, 0) + self.grid3.addWidget(self.reference_combo_type, 31, 1) self.reference_combo_label = QtWidgets.QLabel('%s:' % _("Ref. Object")) self.reference_combo_label.setToolTip( @@ -485,8 +534,8 @@ class ToolIsolation(AppTool, Gerber): self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.reference_combo.is_last = True - self.grid3.addWidget(self.reference_combo_label, 28, 0) - self.grid3.addWidget(self.reference_combo, 28, 1) + self.grid3.addWidget(self.reference_combo_label, 32, 0) + self.grid3.addWidget(self.reference_combo, 32, 1) self.reference_combo.hide() self.reference_combo_label.hide() @@ -502,58 +551,16 @@ class ToolIsolation(AppTool, Gerber): self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, {'label': _("Polygon"), 'value': 'polygon'}]) - self.grid3.addWidget(self.area_shape_label, 29, 0) - self.grid3.addWidget(self.area_shape_radio, 29, 1) + self.grid3.addWidget(self.area_shape_label, 33, 0) + self.grid3.addWidget(self.area_shape_radio, 33, 1) self.area_shape_label.hide() self.area_shape_radio.hide() - # Exception Areas - self.except_cb = FCCheckBox(label=_('Except')) - self.except_cb.setToolTip(_("When the isolation geometry is generated,\n" - "by checking this, the area of the object below\n" - "will be subtracted from the isolation geometry.")) - self.except_cb.setObjectName("i_except") - self.grid3.addWidget(self.except_cb, 30, 0) - - # Type of object to be excepted - self.type_excobj_combo_label = QtWidgets.QLabel('%s:' % _("Obj Type")) - self.type_excobj_combo_label.setToolTip( - _("Specify the type of object to be excepted from isolation.\n" - "It can be of type: Gerber or Geometry.\n" - "What is selected here will dictate the kind\n" - "of objects that will populate the 'Object' combobox.") - ) - - self.type_excobj_radio = RadioSet([{'label': _("Geometry"), 'value': 'geometry'}, - {'label': _("Gerber"), 'value': 'gerber'}]) - - self.grid3.addWidget(self.type_excobj_combo_label, 31, 0) - self.grid3.addWidget(self.type_excobj_radio, 31, 1) - - # The object to be excepted - self.exc_obj_combo = FCComboBox() - self.exc_obj_combo.setToolTip(_("Object whose area will be removed from isolation geometry.")) - - # set the model for the Area Exception comboboxes - self.exc_obj_combo.setModel(self.app.collection) - self.exc_obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) - self.exc_obj_combo.is_last = True - self.exc_obj_combo.obj_type = self.type_excobj_radio.get_value() - - self.grid3.addWidget(self.exc_obj_combo, 32, 0, 1, 2) - - self.e_ois = OptionalHideInputSection(self.except_cb, - [ - self.type_excobj_combo_label, - self.type_excobj_radio, - self.exc_obj_combo - ]) - separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.grid3.addWidget(separator_line, 33, 0, 1, 2) + self.grid3.addWidget(separator_line, 34, 0, 1, 2) self.generate_iso_button = QtWidgets.QPushButton("%s" % _("Generate Isolation Geometry")) self.generate_iso_button.setStyleSheet(""" @@ -947,6 +954,13 @@ class ToolIsolation(AppTool, Gerber): self.units = self.app.defaults['units'].upper() self.old_tool_dia = self.app.defaults["tools_nccnewdia"] + # try to select in the Gerber combobox the active object + try: + current_name = self.app.collection.get_active().options['name'] + self.object_combo.set_value(current_name) + except Exception: + pass + app_mode = self.app.defaults["global_app_level"] # Show/Hide Advanced Options @@ -954,7 +968,7 @@ class ToolIsolation(AppTool, Gerber): self.level.setText('%s' % _('Basic')) # override the Preferences Value; in Basic mode the Tool Type is always Circular ('C1') - self.tool_type_radio.set_value('circular') + self.tool_type_radio.set_value('C1') self.tool_type_label.hide() self.tool_type_radio.hide() @@ -967,11 +981,40 @@ class ToolIsolation(AppTool, Gerber): self.follow_cb.setChecked(False) self.follow_cb.hide() + self.follow_label.hide() + self.rest_cb.setChecked(False) + self.rest_cb.hide() self.except_cb.setChecked(False) self.except_cb.hide() + self.select_combo.setCurrentIndex(0) + self.select_combo.hide() + self.select_label.hide() else: self.level.setText('%s' % _('Advanced')) + # TODO remember to set the GUI elements to values from app.defaults dict + self.tool_type_radio.set_value(self.app.defaults["gerber_tool_type"]) + self.tool_type_label.show() + self.tool_type_radio.show() + + self.milling_type_label.show() + self.milling_type_radio.show() + + self.iso_type_label.show() + self.iso_type_radio.set_value(self.app.defaults["gerber_iso_type"]) + self.iso_type_radio.show() + + self.follow_cb.setChecked(False) + self.follow_cb.show() + self.follow_label.show() + self.rest_cb.setChecked(False) + self.rest_cb.show() + self.except_cb.setChecked(False) + self.except_cb.show() + self.select_combo.setCurrentIndex(0) + self.select_combo.show() + self.select_label.show() + if self.app.defaults["gerber_buffering"] == 'no': self.create_buffer_button.show() try: @@ -992,15 +1035,15 @@ class ToolIsolation(AppTool, Gerber): self.on_reference_combo_changed() self.order_radio.set_value(self.app.defaults["tools_nccorder"]) - self.passes_entry.set_value(1) - self.iso_overlap_entry.set_value(10) - self.milling_type_radio.set_value(self.app.defaults["tools_nccmilling_type"]) - self.combine_passes_cb.set_value(True) - self.follow_cb.set_value(False) + self.passes_entry.set_value(self.app.defaults["gerber_isopasses"]) + self.iso_overlap_entry.set_value(self.app.defaults["gerber_isooverlap"]) + self.milling_type_radio.set_value(self.app.defaults["gerber_milling_type"]) + self.combine_passes_cb.set_value(self.app.defaults["gerber_combine_passes"]) + self.follow_cb.set_value(self.app.defaults["gerber_follow"]) self.except_cb.set_value(False) - self.iso_type_radio.set_value('full') + self.iso_type_radio.set_value(self.app.defaults["gerber_iso_type"]) self.rest_cb.set_value(False) - self.select_combo.set_value(_("All")) + self.select_combo.set_value(self.app.defaults["gerber_iso_scope"]) self.area_shape_radio.set_value('square') self.cutz_entry.set_value(self.app.defaults["tools_ncccutz"]) @@ -1046,23 +1089,24 @@ class ToolIsolation(AppTool, Gerber): "area_strategy": self.app.defaults["geometry_area_strategy"], "area_overz": float(self.app.defaults["geometry_area_overz"]), - "tools_nccoperation": self.app.defaults["tools_nccoperation"], - "tools_nccmargin": self.app.defaults["tools_nccmargin"], - "tools_nccmethod": self.app.defaults["tools_nccmethod"], - "tools_nccconnect": self.app.defaults["tools_nccconnect"], - "tools_ncccontour": self.app.defaults["tools_ncccontour"], - "tools_nccoverlap": self.app.defaults["tools_nccoverlap"], + "tools_iso_passes": self.app.defaults["gerber_isopasses"], + "tools_iso_overlap": self.app.defaults["gerber_isooverlap"], + "tools_iso_milling_type": self.app.defaults["gerber_milling_type"], + "tools_iso_combine": self.app.defaults["gerber_combine_passes"], + "tools_iso_follow": self.app.defaults["gerber_follow"], + "tools_iso_type": self.app.defaults["gerber_iso_type"], + "nccrest": self.app.defaults["tools_nccrest"], - "nccref": self.app.defaults["tools_nccref"], - "tools_ncc_offset_choice": self.app.defaults["tools_ncc_offset_choice"], - "tools_ncc_offset_value": self.app.defaults["tools_ncc_offset_value"], - "tools_nccmilling_type": self.app.defaults["tools_nccmilling_type"], + "nccref": self.app.defaults["gerber_iso_scope"], + + "tools_iso_exclusion": True, + } try: - dias = [float(self.app.defaults["tools_ncctools"])] + dias = [float(self.app.defaults["gerber_isotooldia"])] except (ValueError, TypeError): - dias = [float(eval(dia)) for dia in self.app.defaults["tools_ncctools"].split(",") if dia != ''] + dias = [float(eval(dia)) for dia in self.app.defaults["gerber_isotooldia"].split(",") if dia != ''] if not dias: log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> TOOLS -> Isolation Tools.") @@ -1219,7 +1263,7 @@ class ToolIsolation(AppTool, Gerber): current_widget.stateChanged.connect(self.form_to_storage) if isinstance(current_widget, RadioSet): current_widget.activated_custom.connect(self.form_to_storage) - elif isinstance(current_widget, FCDoubleSpinner): + elif isinstance(current_widget, FCDoubleSpinner) or isinstance(current_widget, FCSpinner): current_widget.returnPressed.connect(self.form_to_storage) elif isinstance(current_widget, FCComboBox): current_widget.currentIndexChanged.connect(self.form_to_storage) @@ -1260,7 +1304,7 @@ class ToolIsolation(AppTool, Gerber): current_widget.activated_custom.disconnect(self.form_to_storage) except (TypeError, ValueError): pass - elif isinstance(current_widget, FCDoubleSpinner): + elif isinstance(current_widget, FCDoubleSpinner) or isinstance(current_widget, FCSpinner): try: current_widget.returnPressed.disconnect(self.form_to_storage) except (TypeError, ValueError): diff --git a/AppTools/ToolPDF.py b/AppTools/ToolPDF.py index 4b4e88ad..59f4f7a6 100644 --- a/AppTools/ToolPDF.py +++ b/AppTools/ToolPDF.py @@ -130,7 +130,7 @@ class ToolPDF(AppTool): raise grace stream_nr += 1 - log.debug(" PDF STREAM: %d\n" % stream_nr) + log.debug("PDF STREAM: %d\n" % stream_nr) s = s.strip(b'\r\n') try: self.pdf_decompressed[short_name] += (zlib.decompress(s).decode('UTF-8') + '\r\n') diff --git a/App_Main.py b/App_Main.py index 4d7ea3da..d5b129f0 100644 --- a/App_Main.py +++ b/App_Main.py @@ -2939,7 +2939,7 @@ class App(QtCore.QObject): self.resize(720, 330) logo = QtWidgets.QLabel() - logo.setPixmap(QtGui.QPixmap(self.app.resource_location + '/flatcam_icon256.png')) + logo.setPixmap(QtGui.QPixmap(self.app.resource_location + '/contribute256.png')) content = QtWidgets.QLabel( "This program is %s and free in a very wide meaning of the word.
" diff --git a/CHANGELOG.md b/CHANGELOG.md index b296e4c3..0bee5dcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ CHANGELOG for FlatCAM beta ================================================= +26.05.2020 + +- working on Isolation Tool: made to work the tool parameters data to GUI and GUI to data +- Isolation Tool: reworked the GUI +- if there is a Gerber object selected then in Isolation Tool the Gerber object combobox will show that object name as current + 25.05.2020 - updated the GUI fields for the Scale and Offset in the Object UI to allow only numeric values and operators in the list [/,*,+,-], spaces, dots and comma diff --git a/assets/resources/contribute256.png b/assets/resources/contribute256.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1bc4792becdef044cdf1b1990f2cd3161b2c19 GIT binary patch literal 9823 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 F{{^zGhKT?G literal 0 HcmV?d00001 diff --git a/assets/resources/dark_resources/contribute256.png b/assets/resources/dark_resources/contribute256.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1739ddc3f1039328d3d3f5b115affd4e30cca6 GIT binary patch literal 19944 zcmX_n1yCGa)AcOw?hxGF-Q6v?OK=T=;IKHs32czy`e4C=+XBHo1SdcU8iKp-zj?o^ zpDJo#cIVEWx!rxc&pG`;S6c-eg8~Bp0Bki?MSTDO!T$sSXejW5h0lME@B@;QoR%B_ zG^S!c*&@ULr?pqr*8+ebW&i+31Hc3P6!-uD{CEN2j|~8bX9EDKcV4HSB>V#uI}H^@ z_!0hduh10^KcIW7n!W=7oNxbrK@bicO87}sUo|Zy)E#7ULL?qPt_UUo&}>pulrsoe zJK=8P4%;e_edNjiLiaf5* z3ezvbEO(DVaKMgkh^@oJz)myy_$s+9{S_(!PwxGTwQ4M$-Bd}sV9IqMwH4lG$Gg+U znVjGmsaq3iD3!taukl0dn(f=#h0 z`lPeRaZMX1g=nc&xG1(ok;CXR$@TLq_4%S+t)AUks2DaPZ|h3&2IAQ$8HH$>EilYW z;^cgYg46Iu7nTHp3sCisu#|gMk+zy&$1q1 zs6N$)be1+}T_I=$*k=xt*kH-)gG_IpeiofKnV$+cciZt7d8j@7;mSg}aUlcqsnX|f z5j zyz?*nzIw>$#;g$|h}ml@82aajRoh0JEo}o9w4^E7q$>mX*lS?+sHea1(gb#|UI<=N zra*zxF^0~$zr2@CsoWB&(hLh*(ywC{`HjWu5aopyIQQI^>%r#w8||-I^_059#f;vW z8(^LM-~A&gmz@UJMvw4!UI52LR=Ax1zAr=cJtTZXPw&o*KL1fks8_wp{r&HJ=X1O4eg|1`qdH3H0&Hq=i}XIiKQ+&*D- zh@H0N$ATInly+%~fiqXEx^79F zc+9?iLeIE-2L6V*V1o(-S;H;9v~1X`$YqS}h&x;DBgjsJ%d;V|_zfC^fJt;&y~O9f zcP$Qm5EdD{sLezzx8P2T8l_y}zyV%u;LILvn;7f5Jb1%wbhlK5>9aRO1L-2+%MqL2nKlbZJ1;@wr10_m&v!n39v zS?XTqnO6ROePh<;C=dFH_tYxCi^^JWa20aj%aOpv8beq(Q}K&w?CblfkM8eR|9CX5 z{4LAO?b-nLSB%1nei1gP4FcI`Rc)K!o5BT&z%00A<6R$oPjrEUKSyp_)vL(T3W2zh zuR*o@!vRX`iNKS^rgz=xHLd7^6YD9<{HoBQuQ(PkmejflF7DPE#nqeplNqOlvv=y2 zhm$?OjF8#CSFkDmZ4fVn9BPmiw~jj3mKZm9YOFv#rs>Eqd#g@7+=B(Z1aAD>)?#&_ zNwFZZm}<7Zu3CVP6a&U}B{h#<@bD>~4B{^#&Irj|mB38kLxoBg{l&5Q8H8!)OQBpu zg^k#N;?5zH9&N)8R{OMS9Nmq37KZ$EoA9#L9VF33!euw{ZETer<&8Bs4zbA=+iDHB z2v@eUWe=NymjZq<#rvLT1Wt0{%%7nz18HQvlmN9^j4c=9P9a9p+S*`0i&8Yi-}F^y z(~1X?Ts zJNfTdFp>o1#PGCV_M&n10`#5C&1e3|uv0_~t3%na5dr_+CpWm+qyRfXfL@|PM_eYR zcxgo25m$z5n&y5V+OK;c*{LY65v(TuAdh`&t zAIg!&Sfk|ggAx0#d`=%fnzXwAsfI0zIjCFLg;)Qd5WtC|)dtYmd zl*ji4TebxfZb(qwnu_pL0DY)=dWVtLZ2xOfrmHH1X6N!XGnW0ksC5IR&j?NU{b*n^ zFfVw{lLH4d3LKEcV|e3#@K87#TwG{(hx;_O>fj zI0+m&TnGBE{311N?9C#j;8T`d00G#|T(OUr3Mbs)(Bc!f<%W@N>@8i=3c?CGl(U^? zw+bD8wSOrQW^{PZ(#h_)cb^Ri1gP7)OHxnr?(qz0cX z3#Ev9ypR3gwAD@DQ)TEr3LBJp3$me>niSSA+WzbWcyxD)Bf0(S#>idc;J&|7N31-E zX5zF?4i4f7XUg=%qGpKn!doWaxPQjqX*SroakRhtqTajZIme4Y;$(RW`avL)`rxWY z|Jj37K@1;S1(+R)kzig$wNE*XE$0Yp0F*72H! z@QJvw2jsssr1DjEbF+r;g;-nP_@_!TBH`JMO zKg=et4xX)5?X>}Sjvc}XlB9`9{#7?71n?EXNa~8eh>_Mh0PRxi_KA>SPu1L9K+5{e z7v7h$#vw`)ES`$he#i>#^zjW2b~6?l!2;9_gI__7cK4aBEzD1ClZM*`03gkv#R-&Y z=pE5y$oc)DVu<@Vl`caD*va>PU+V-8$m9*9NsWFnte0}*tB{u1`t0==`3qj%VtsHq2)zvMAfPK}3B?C(QdGs#Rd986rM(pTzyzj3 zT?@DN3FTZ5%KfZdM}`U>Vm-A!Oo&0GOkp{Nq5bwjZm1jO1%KAc)w;qy*z`HdPbB3j zNE^S}KztmRnW-dO8!GKT4Y0fi74`JAa8RR%=A-!2@@{U-ONv3pHjf>}y%e%&pg%g; zMUqr@QHKvP09KNnGjes(@q(7iC==24x8*tSNx9!#?g$@K>*6$>o5;jp+NDGN7N)Pv zxm4BtD{h04>LYuit5Qjfu4t@WD8A~8H6tY$7pd5nV~Gs?Y+n&2F+IYTJ@=G!I?UA8 z<9#J)wBkQ;4v3Gxr(Kqz#*zMW^_)o3=rBl<>k5|JU)J?w7*z%2qlgi6MO~ zRD(5K(501ZYZG}}L=lBJN(}8?Y=r-H#I9Fzi$&6V(<3bC_D~|r9kceTjv@|1BOzEz zcg#rTPFIpje0i*t5n{j`E>gQh!V6eXVWM(ZU)A(Ex&_%?TgJaGH?pqi6{lK zZU|rBw;ZQH&Fp~$rn1mV1WBxuy?qhd2j+9{fb?U&s?~bryY!*G2{fvoYi{ zPd}BtWk*s$$lm^lMIiqYrg~*A60i6pVK{4wMl~utW_J@moH#Xl`s-r>x8a&Oi2dU( zg$c$M$@y;*9t&LmC_XQsb79>IWyb>OGCCJ}2Exppjl%4OR4nN;BurWRnwP^PGZ8t^ z<=OK63RCUW&RzKoCRYV~)dVS~M2{KEZ#>n=aEr4`CW#`RXi3o5-;{g6*Iol9`JJwX zpW(!qC3s8t{MSIEC)#i=h;^~*(%P_Go~m>XbK9v=b!*XQ;`_g>4J3{2mK8{%&v#?` zdfbhJ(`vP=*P1U3d5c3Rb5I4ZLvV312r|#~_AuZC9k6bg4ME%aa_)RkK1ac6+1Xu3 ztI!v{h4ka(G)NZ7xXyy4{Y~v29@#q-a2aFsDsGGq6WH$$KU#W6XK_gI^TCgy8rXl? zgX$3Ot41f>a`vTc#(A}~ zC)DTUosX*9Nc@)a4<6HTdG_Hp@wHWwABWE=!{7S0 z=eAh-9t#QzK6HNfd4;t3r40|jLf^?WVYDH!-ewz40wUwWGQ4pX%K{1 zG)2H2jL~$0=G|B_LE}raiNL#3cCQj^H~H3wMmlHAo$*Sl*USS1PemJcUW;wn6D0=3 zg52XVzAzGYvr*#|{M{MlZ4_+FXXPh_DrQtX$Bsr|1ag3rInoBzF+QO&a=nQd>Pyu< z>`Mj&jc0GI?SDZM9M*hr2s7Meipr z^uMTEynwkVnd|B}nc97B#;(tp%MBIyP?&}b?M#sNmg3vHbJZh>QnrHtKv zN7fRmy@TAQE!@Ud=m%{hgz|yv@TS?!23T8-!j37l-T2`15u z+eAhcfRL3|DsUHkevMYC+gD#fs&AT)6N)F>?uRrop7Qmbd&gV?oY?D*Rr|?-6rb11 z2peRH(P7TPl2tFX&x12^4Ih$61o78Jv7R5ue|fKt1q3&()cFnii$m-ChcP}t1M}0j zhO{?KCu8C>@+2iNCV&^KC!hRzhORH=tDH*xF07yYoAWA?p714?)bLcqxC((^!NUFa0aJkm`ntI32B8C{*)ha&(O@Qt6-`;Ag1kh1mKCee16-noAm0{@uT6fBtUBB z-W!jSdXz^JRF2`p`l@f+HBk)V(eI(vY+kR5oGBc7>CJtLq;wzT)P8LmHo5}j%gPkTwCA=MVuLr`XSLtTCMNl40ScT{q7@_}t#)&>uZ#Ys z*j-ylF!FX^(083OR2>+2Mwa)8oF>H}qPDfPaMkxxMe@jBS=N;;li2LPsaTo|+i=3N z#DeY>SW>gr9&EBu7k;d7rP@x1h9CTP2Vl*!A&H;VR&}bSm{|g*0Zp9i0#7D>P4Jrd zKtHUeJWGfgyBm4jigg3KA^u77UlsoNdg(W8m`TCxoP-I#sQx6{KZ^Y+1p?k6r`Z(SHJ|{GGG1;^F7{L?f`i14%Z8pT& z`FR0+-ddA!Cy9ZGQ?VXqGxT%kEiSYaxkigtaPr3*n4ntVj5W!5J$04@QgsY=Dkb|U!H%@&A06et z7+eeR!toNeB9|sy{mIw*_407MYF$1LX5QFZ@WES$`|Kq$o)hu-<*s zeW*_Yz-@>I;cTc$>cjeBc|DB9Cz~WFCv9mw5%j4yWN4oDuho}iuz%p;k&L{G`C2eg zAWR-?kKDi>J@XZ>(vx-L@lP=sor>NGzst?8CbK<-u-O^*RID11iMy>PRwU}(oG|{m zV%}w50@f+$g<~VXqKqQNfjVn|Gq1nm&SacpIY@{i>zupuTY+Uvz%|D1OfG}DS5ASi zXT2nQLe9OabIb2O13UjHcK@7nl{ z)NKdQGB2j_ECwg-s;VH=4+!EZYQDoFvtvf>{=56QJ0ID9i^TeQds6>J2H6p1%a4cj zFRNuAHzmEh8jcW@5Cy!2vTGg>2{`K1s}^#;a1eg3mYYnGLq1&y{^BsgBTrDDE7QWw+bKTrWLz^hiOWNX}m>WmU`5u*@o#7_Z%MA^~mod)KXWM(0b zkvm$>mKCA%q3i&BY>f8Yab{b@h`Nh%%$c1rfo4j4u+p!(<#7(Xy5r{iE~>4e<)gxusil|`g_GVsOyvy%H}MU7B&ReG-LMq*N+7}`|kYd#)yHwqhJs7VI$5K^@~>60u+K|BZ646Q7FH&V?oZdHdMd=&D);c z9va2XY-P!Ji}86JM14+WEUNrkEPHHRbI}SquvyDOum&GJ6FZmJ*Go|g5*6!GG}ENM zE1RmA3Q7f^g>$)-nsD0~sqyCamY&3C zzf1*fE0>C3fe$T%0v|^20DARq zMk14&S87?f=QI0vqHL6K7DnK9B)GxrLcnb}e$B{*e1b`6N`Yc60zo7a5UZW9bM0CP z?k&Zi-tmu9)CMvXJhnomGB5hb8G4lw0CtZPB zdAB%Yim=Oto|B+W?t=5|hzKZ?D^U6T3)MHtpV!{acG*VfdJJ`^1Ko=SPP;{{6@3gO zMSYG{&912}8;F3qp^@#4Lz;b0`;%7rLll6+>vHoS#4J`Isy_^H^gB*vEuXp}I`j>) zM8n}(iiHXox!ytaYoFK3RwA^kag0C1HxjL+3|Xs7`9KLM1Dw=B3W1iXIq}z+R#6+g zPTCtF=T&o-AMaU2?tj!WL&7fKEeo0n_KPjQj{~o~t@9H@)7<6NBmbdOf7@-$QnJ^F zo;l-!MzIK^u1<2o0$6Wzgz(vAZojkB=2(#6UBEPRu@AW};uoYLwjDIgYjhZ4pEQ}5 z8W-)a4-XG>ShrHOa>=&^UR+vqdWK+lnn!FrS>thvyrz$0)N@(PcHSu>6$O@*>B#Xoc+CW>G%IPCOldLve25T zRo$JZH{xEoc3rE!RjV6BArrOv^y6Oe?dkIb2%6f(f8R-(rCPPBjd1C+M`V&S@5*XC z@bwRG@8?Np$7`Y*ZT%@P(AIv1Pth+~oQ1*HS?sFpaF`|-(3<|y*f3i=*?Q^Vm%(({ zOCC07&HMNVKcGZ_z}EnkyL^unPcSjuL^5eWn^KX!x?KC`Ck0`NDJNDQAls^yu921+ z+jD>C6&!j&fEF-MeR}Y9sJyvZ>?}(?g#+P+C|CP*yfp|ttRy(@+vVHb8)l$*GJ3(5 z62S2u_4f6{5@r+xv$^YU7(KmO*rVSwnG#yD=kB>cs3QawpTuxL^y z{9WW%>gxIw{safz*Dbbw1HvM3WbIRc;MK=@e?LWe9iV;90%!TXiAz`mQL+i)Kh)N* z{N5Ij$i~s}HioApKMuS8)pqT!`fn) zkKH+$8q8bzSvNElT$fZ(uyHtEB#ldNL{E_QnosH#?@*;kKB8>%tZ!T-|5FHmMpe*C z9j>7ee^NyU9+mS(Zd3_br9rT!c3N5W?kmYG(AlM{+1EGB{ur!FX6^;d_s`SLqnw|h z!i?n-^N&)I#{Fh|sEG8aBZCofmg!NsGSpkINIvh&i7`=QKMi?^We)pLL62;LHe~1} z?#-M8&x}Pje&$cpxTDd4h58I-;tRjgN65s-AAJxZa6REg_Q{Cxu+hUwqj|54Akry? zBLbg?A$?J$s#u)>ML-utlty)j4B~~*k)lCjbmi*5%AaTnjFNPq7=E` z!4da#3KY0MqjzjpP8@oQ4Fv^VzlxeKzPsURH>%XPLi0s{RFbvHPV6c$tLDr(BYc z2Y*OZWtb}e>5U#J6GI`#SuAzq|-Axb;V;6j9H)~ftWXEQF}f# zWC>mxT>emX8`6L+96Gy6(STot4@eiC9xIAFjW{PU$DQ6`?MelY&%n_+=QJ>p? zA)YDRg^w4#gz?wqD}Uc#+$xzn7zry4qyZ{ORgG*v&W`uiN+M7p7p)94%m~}w9k>Pr zI!%2nhJ;a}K~rA8eWi<2_jD{t<=8?gGm(fGMrDw&?@x?B$Mhf_8F2?!{I3oLd1I#&Y9|i=n5@;an=4T%yuM_dyAwC@rc!!bi;p! zIt#kKkDB6xN9mVh<`q)t#C5@6XS|EtxowFe->NG1Z@K5^tvidH9;&g(F{K$e&&Oi2+bAv>Z zh~5a{jVlObHHYsh)tzhovf$$7WsRST)W@8bVH4)^pV4}4EaGEo3=a%#AqCL{HBBJy zAef`dRmEsEC;s4E^?*~pmO9ZeGAF%*ks8NBFY0Zr8ctFiqOq*ErPM|rJCOw;97d}) zjyC5cXeWm{2xYt6Q|3Yox6`-O7S2Kq2sw=1cnH`|`qbQUwpbcW*Ycnbz)QM8OQo!s z6gBqp+drW=d}EZ>n9fYHmE&j)-6$HxP4&75$(u?&JS}MDCq87waQtXNq^wYG8`IH4 z3mcp^^NqeZz32Al&!4L_%h4PfE)9RjLvhipH7YJeY?uARB&COZ@bq-4H&oh|wT0*5m6z650F!`eq*>{^d`mxmzPSRy0pwWmq$ zYfr@Z{K3LgBc``U^@IsJ&5Jd|hzL4E21ud2TZN(>Y5JF51jB?FXWwQMc4s;q@Qfgc zHj^lqU6I-DFK*T30;*4uY1YuCiz=%BCavebIaMFh{G-VQdRVZcNWl$;0{wynx}#F| zbF&mZr;L!3r1z3^#t7adsXE;n{fA+p-W$~zJPa78Nx|@C)`Or4Rqa_J?r7l9Sj$1v zbD!fm>A`k4_Vs~^o` zA$C^x-v_#SKjrJPPG?aPCMIx5P(pJEnfGP1t5z>*_Y+3f%YQ*R7^X{<5|_X8mwTZW z^P$qegU8Agj7&cuh`|)mbS!tmdeVhT>jZn~WH9cq?VsLMBAZraZk z4i{_bROy3R#H>domUtU!(HuT_cJd$vHp5`@$PQjnW4>6chGqv^wyLD}ChQq~WYAjm zo!{zVJ>OSOt3LR?IO4yMEPhe>qMbo$f6jVDuuMrGOeo8k0TZoqy#(DwJZak;Vp^wv zNk(5}t7CpoN|DVg*2iDv$^)>{W^Aqii`TOsdvgT|v$5@j6~l@j%@R;R0l7PUcIjIa zrIvPojNS#qIXex|%0_ZTd#+8hFPn3HS+0aUt#MX23|o4p6Oc4twiBv$fh>X=RC-tr zK=1*wvD4qZ&IvK5&xdKq#nzLL-DLigK8%*fHm4r_XTXF*OO5_>qL}zIz9_D2T~9G0 zAoJf>!iaNj%>>_oJi5q=A=OFRb~F+nfq?8t@TuVj_9m)s1|beGuN3f}@QH>Q&gH8K zh0`cnfhWds4GxgL%JXL(fxlSboCO#-3EYyaWbl3U36rF@K2#q0mj_!uNsy)w+6s5E!)+qIb6LopI4_-oaq`el{qwni7mpkn_YXZ-r@7 zgV99++!HA74e;)fphyQb8ad76Xgc=D-8l|!dE(_D+L*U@CpY!uMHmzH&$mbizqo6n z?BOj_UkfB51DJp`VtNPHY+=n%57t&QA36L2AC>GM%C*D@fy4tUs+m(7rUHlnz!>^7 zXXBKh8;N;{aN>+6;mO)bl($~Iq**%|dms(qQQ&PW=x25-8Ad7o?`+3{^+J=2cmqp^ z3~Ad^&)ZYQe5=6Ia4nx+=aZY&YeZgozT~Ds`@!#mO5Rymzn#jVj5=wfj%&mUfm5#4 ztb~#^XO0FFv}i>X35|Ym@?EEA-#LbYGMXEMJE;xXlNA3IpntedT_6ZB{DY)9M1_$O zKq7sa#l*%PEvNn%YT@h|;a?*=l1yVn2DPGSp}$}Kf`W_^>VlFD?WEtcH29Cj>9UdI zWnpvTu73?`$l1q+qNxe_BheazvVS!s4gui=snLIoeED*wEv-6B+~P!(&bC%7&K%)% zo2FpqUVhOi6+s-ZJTQGp@8iNr{e=T#eQpt1-zyJHK}Re= z*Mj?gG3Sa9UyM@Ni}K4rMp>R!9b1*2F%!YmqWQ5Gu{3lrdTcYrBPM=_~%F76NJh7MuY$c zcp@&*w0X_{)76tlVTV6ah)LN#d#g@2pwW;fo)~efV}SP6tNu6e+?hQwhGoNhHil;4 zH9X@DXA=tl_*qSTNzq^Vk)oCjHb@vUe1pA9lW$UXJq40!jcb|gGcSj$3l@VXcU3Fi zNiZ57t07(lAdhBYQe55KE;YZS)$d)`@odX~8jYV2H>j`g97TYen5zGGlUw+M@fbf2hbv*5u7G!sWBY zmk)y~3y+z0ocO6D#_U1!zgUfm*hgv$G{Y)`QvIU~3PPOp7s7Z3L;$0YAD;tR$MdGW z57N||opOG;z}=(Bwj3otCTxec&yG_Qo<@$n`3^bLDz>#^jPx-Rq!4;k@NA$sKF)ZD z@bazpl^kV^c=aHhOEOcRvaEk>M}vL<@;oFyAS2x*t3*nSteF*74J}J~0Z7@u?feOm z+tH>7VOjd`h_l=XE-6D3?a~+f3=L)7_+I_mDg*`gSy0MXt<{agw~EEGYRfHw%v-d3 zx;zvK{L_T30~5xEP$$Ma6R!O&7sLiQGYJ^je;{Sp(ScWJ^y$-|KRs9xN=e;o&%d+S z4ys>>qS1(tr`y5aHGf+QSI@YLeeo6V@np}JP$B;zgXAs!*AUAL!i~}UDiKLIH73g6 zxHPSbyg(S>dj0SoJm$fH(aROt*T2$pEv3?`B{n$b8J5<^8<0gg z65C-hU11Gf{%>6eS=ZjfgLrd<=9DO^JR8o$x2F%CP|1DI8sF&^W6BK2&2-~vKWa?c z>EJ5yB1=W7f6MXKohe`y$UcT42Lv*PwEDWYCxbVmJ8tjZU0uigW$GzH(o`<2Zfsw4 z9H02!@CjiJy`0FR{-cjMa&eae;OV)2Hk>~<%VgEjgZAT;yNhk;xo-?VbyT46*?M11 zU1W9CGmuT2lk`7TUGwM7e^fK2)_R_xBRC#09=$AiNNR^MvsEJciVe^RbuQXrwJ6bj zVUZ5i3ue9QH|fUuO%$;+etfD(b=t4uz!)_1-`gvzy7O9)bI$j+L6$Lo6*=cg%lSSD zRsHHU|HTh0e_ZmTb0svv`M?SZG|QK)ZpbyPkRnCs*%tF|B|OV6)&@gPL5@AcI$ghI z3Fy}Je$mai*ny|t{KiP9a;jKaxELbOmL?UM!KeI)%cYU-@hH$ff|tu0V(4#@0wKWY z23CR#>A~XvSSDD$*Qawf%&%3WH{(GX@mHVeQ1glL1LIE8o-N78!}So>afXD0TmP>u z9chSOA$r}pDH`lpTc8-+gkm@yfo&uN9^sO7114`^NLGzOp^Lmp#!76D=#4Ef>%1{V zVxY1B*ak)Bv!+>yPkqo^X2NT|mBz3BoA5a0Rmz$@x=PIC`&k=JTZp!@ zg8$xEet{bB_F|?A2&#oNy^pdJ?;M!H;P+*x)xOjYVZODJLI_wN$UuQ6Kf}<<+hJnN zQz#j(Co|x`NaEA#g8x)n1mFz%oDeVlDH$ZPTU+PdQnyEk@_(KPdYKpf4@N})n&Y54 zJDBIm<)o)Ei3J;+e;NMTY%w44JLjm=J6Wn2q*PloP}r-q`qIGd@i)x3WqAI$B9AYJ zM%1A^XF1~?4aQ>rLOysM)o15TZmy8nUJ^LDBq|2uNsM@wYB#r5-%X9vh#~YjXkpOQQBGZ ztQEf# z_!gEksoBu^cDtq+F~A(U59&sX;pq&dDY`-qYQ5St#2l?~78hC5&5R=6I%6lb&j)N! z@gx9I>?uNHW0KEycJ0vQ zIoA`{lDh@eLbqzS+XSo&YB8Dp0L|I7$t6Un`iX7^ha6c*07IItPiKi~cLtygG{m-1Id!(?4)gg|_XdCAE z*K?9@mH6wXVg^)Po5b;`bjN<%a|O+4Njd=Q>#(d87`qzFqRy5BXpbY)7?Ut_-!E(9Etc7)b6UOB&3q^BmKipY7%&c? zC5tg@#fEU2V772l!%VTSW$vmGlG{jo{{Net&BYMO)~>VQLt}Y?W-3fnb(;V=pm%7*c-U_I z#I7V^!~V7F3n{hXlTc#{5FD|tp?5ZczX?LdotRBfqET|Y{!IV{dVLw5@mnTB zk}?&Ar|PylUl)033B*YI9a$gI25dqai33oAOxhCWbI|)W`<+5iQ!yB^0hC7c1Q8kz z+q#5}cZ4%!{|v(@1s2bjRX^h}w1l?7Rr2%>I&%LH<(S*(5X@TB7YPYQSjSazsBQmo z%NnvRL3S@`?7XI2m$z0F@AN+-fDeFyQkPkHfyB-65{J+csX((i=VIGo`C!*;^l&=v zE-c|vP8W>vCLDMK9n`jkEJ7>ig7IfWsiZ!@N2oc65eXnR1U%o&h95~e&AYT8tsfDL zI=uR|2s0joY<;ZXdHEiGp#La**1w!+M}=i~ic!C4G>!*e%M}grEG0`6lC%YC*I{us zUm(5eBjH`2PRAt|e5KAywo`|%Mt|Uf*0Hws{%J$5gu+*fsIdBrfr=&7H-o^7>QKA4 zq$1p$S>W@yh1F5P^v=sbWEu&5%<3FpS=3?qMo|k9pe^e7m&*Xr?*B;MS*)E!gS`D< zUcc^UQf((zqFwnz^*_3v^1*GYmohj6gZo1p^2vYxH-(1AsQ>B=5PLAFsStQ9mEY`# zKlTDwK}YLvbi}PcFPj7Bg}Ww^6tgV`Yn(Y_o1BsP9Dm0J{@r^n{MP=Pe}lniCXAb` z5{9>=CQ_zkr5(53>OZl;Etlbmk1)RXPgw>n44`!sn;wkL^RNG&)ulfMAVFwn&lsx} zv0)9Ce-jRJ#CU@N;N^jJGzQDjEtbh~etZqsTh;!*VQTJSlc})UAGtNiOuK!U+8Sz0 zwyD-!aDPBmhY9^h=O+SuIe|@i!ML~=b8C1kbDrGO!eaz>X)>&zP&Ud=P@r|seUP2P z$Olvy=l8E;y$GkYvu`fvVz))S^E)X3jmL14NthSYJqsl6NX!~AsRS1;Pp&sFa$Zvg zr2gL*&P+A(lOulj;a=RcQSGJHw(Ox2b$m6me#%_!Vv2#sxs=GMXlEt9<0XDT15}0< zI9_yd@Gw`Ec*NF*vQXM<4v5^s?6>aftDp=vC+9psy8$*TkDmnQ=|GHo0nwl5FJKnJ zVMm4*ZKEzS3F2}zX;A9Lhm^AF9=ga0iB$wxgSBFdTo13}ePlM#*Qy$jw+Bo{IR!>E zZtF-Ki{zsY$F9bvZa*O;rx1@><2e25Fi&sifQbhgQe=m0p#`Nw5 zS2Qwxff%-GyoKQ!Ps2b%g13btDX{h^wW!KcL^ z&}+*&!!$1@08@^_sCrWcGtEZcnIz#8{%?ZqU!;I9G%m2{KsslmIN zN{me9H(|ucR!aL2FH-yf)p&o!etum9lshI64$7=&V=A6vfu_Ud$T#?cSLf)Cpce*R zbM)|ya~4@F&_7`R@;+cFvKj%y-*zhGw@gvCIZu`APuAZbSa#lgY%^Cg%~#zQ(WzQJ zrQQB|H%1>RlNc9;TYDJFsB<#yJc18b%QeKjESC2_66UPmiVqgAxiT)cFDttMMi0O=diM+Z2c!yc?ug0xeOm7+knefg+Ijf(H~pZ-N%8ifM&7j)pfb?X%^$&W3=+Xvqj zMrw4ctwmB3MY2>R9`KnUk-$Z+!n6zZo`6P^X=Npm+pEIA=a!-)JlxmU^u;b@T|JDTz$E|rz6?UKji~(<`3Ar_vh5Sf&?AL_tZ3E04dI$14FY^FS!uBxY&l-{(6$h8Jk2Jr-7mC!4CTL z4&2?2^uYCicQgI@2)$&b%#t_wMOwT~Hw=EJQ{;)OE#a6S^#q1`1I%~PpS zvCVRWuE9%^K(g9wB2>Wc*P@8;1DuqVNldN9yogX_zO4&NY9mQP9-@)^Snaqpl!v!P zLwj-(k7U(E(1JpA3xfl*!FrCEw2>NizqUGdAJmvLj*0?Hj9O{VVoex*o7M)ZnJqP1 zOcMs00Wq|pTFFv5gc;18VYu|D-fC>N+4u0GHIn}d4}8oeEgzpph>IF#dfM1EH2St6 zI6XLqvby-HX8RjZo8VxdHhOi!E;xR28nZsZxu(gVu}QNtxcitMWj_a1SRkU(?S9u+ zQsnzUtSzAEf|CBxHr$_6*!11%K0;F!S4JTNlmzcvbUYfLtZl5p#ua6@b$xvg`9D(A z)}@n@_ucFlgxyX!zT;a@#?O+ZG(=OZkJ!NOkSwRaFpcPKo3kGm@?cZ5LPDD}ZH@Vh z%^_NJ`I~%$84HjY99$`kO~Im@t{^)-yl>B@I(md4{U4FHn~DmrY4Y0u2=beZIxro; z_#)jdd6wKr!YlZRI2=g?8(JMQP4*8u0)mso@wPfl7~2y~N7RJ+{#!=}1F0kQ{h{jx zx^FS(gDIc_pls$_Rz6zjb(EIRc>qQ<-9KnrjMm943@+EFlfj|E^zku2|19bo+LKbt zROJc-oei<~GSER~(4GLu2}~d-S=M@me^x#ZKM^JT_Z||76ThBJ=q+e@&XyE5??>Gl z7Cd@kxY-f`CsWy3`y#G??}_*gEr&n13fEL(2swD@KjCM>o6=%tMzqlLP}?&;x(bPF zWEr!k!0J_w``}xoW7vaL#5;J4NOGuj;M?x}h!MEsD4iLCjk0dcAFv#Hmk?stZ~llh z@-k4PKUHsx<8ED+3kLagXkm1QC?!O&FIbS*CbT^FRZAsZ;8Z~HLK6c-pL!{y{+LyJ z?7cqAH09T+K`UbKY*K*tL1YD&TuQ?=akvTVs5VVQDn7gcHX&xCe}s0b8-&BojVu4= zgkdN5tAjj&^VB(QLU<&Hkl}5q&-n#nOwYULOzNd1svw3}sc%v{o`2uCeoi=N1!^=xUVX!btDd=9 z$gGW-Wz6Y#6v>@hl+@cU&)h@?{Axaw{?|+K1xs2?i#K|cX!O?OR#sB;Jb(3{<`A-n z)Auw8V9T1-3T55GJEM|E*4TkFN9b(8!*;#)5Z{a61^M#O_f}}cg^WwQ#q7%BLw7tG z+@g@7%|OV)Upb2P-gjmPkRZ$octxd+5RiwA^=s9H@r*$PG4|h16`iMJ^FHPy*}DXp zNRF%!<+DycJev=41smkpQVkC?f7xaFKX3oq8gqMy`iBN0SQzvozVK6HC$FprR%xEN zQ}72Dp=W- zB@)K_hM6SQ4yUhr<-I@8N&Hec_deJPN*q8(7xK@RJ&`*P2`>h1(#hK1(M^wge%JdONDfde;(4Te_r^}RUqF2cu+4=Rz(f4Gpk zGQ00D&sO;N#S(np{FB_Wgo>k)1t}OOA=aW`2@!?+y4nFouce+TJ$m2cm`ew=UqlzJ`l437X(K~DzYJ~H_0KtHojNaGe$IkGy z!@ta~k##t%v9(pNo=${lGcT7CZ1{G9j5SjMi!T?r$6kCIG39%oNdv$eBjOOOypEW@ zb(L&&r?f(4y5Gw;1e|Z9!>(I4k-sGJIerW;oR&M2!<|tN^a=h3A5+F8R`+g3{EHVTEGPwmn_+@}7rR zU@E6$kmTPVVh5ZyXevX4{VJ3RUNkdgV8cdxtVQ2P9>|oZra}h^v=@Ro+Izvm-{EDd z@oZ^@WssyGv9{`(F4xX!85&v#mu-+jNrb6`N5H2xEYtn}BsJ1=G{_B&Ln^UAH|VGl zxs*2y?m%!j%kU6h1%mn4#aCxS6H107`+wwyeKL5bV(^s0O zy0&KQ8;dAI8e5RqSX@HYfhQo5A$ETZJh8M>OsIm7mF9Ia|6(cK{#*Gi>Lw8}B z#0E(@a6zykJF{J(r{N=iM6kz3PQV*zs{OGz>MLZdx{k`Xup#UGmN4W7aX2@>!HnY- zyL}%{E;^?kj*|&9>ra{k5zZ^Fi#bQU+t;)s_(dDRN%wc_euHE zir?Z@6r3>cl3gWG;rbFf{7J6OgjC^A4~t}N9N>Rqqs|!OM>0&xSwgKmC1kAjYQl1kO%r-A5;V7M+?k- z8})@3)h+YVwyk{lq8&j-9lLowvEh88;qfV}GNlos`MC83atIRi<0byk*VnfneJtVX zqSl}N4$UiSh_U=My9`{XH-}N1O)?C^`^{N$~tLex}&7*C0qQi`9J$V_&qvL&ULQydYyA!*LV56KQ!AI$aFr$sjnR@ zZqQhfiUL(Rtt#6;hSW{joSbZfzWtH@OFVN4gse8_gGioVD_c7MI*eE6SA zkLDJC*n6yQWXk(ig*A_FXf<_!+!8#N*d^$^jSaQ?GUwk3q!lfX0y)p$n#flZpu90e zK``5+T>ZA{$KpOlM^OtI{-z3(W0J}`nEdaJ$-b;NF@5X z%=L2wG%))9coIfDqXv9+Vc{>T15VzVbxTVIGh?^dZaKLBz_kvoci_8%Wd8-RSm!Rl3txEM@hmFU7WLZ`jjp^;?9H6wFAW=M=es8FeNB+ zfUAV(@Ap5ZSo>Py;en=W^^JFo?i`-TWb1OTyvj}~MzkH3Qh~ZWuB-j=);rb|mEO#R zvDkifao6XH@=c;b>Z6LgtpF!eGrJV@@+}GyH1pWV<+^E^FRS)i+HicSOEc$Cn#(dB zw4B8U8>T0xr>l8Ro;XKL9emNJPDiTU@=w4eGKiIV8!V!~6!IiN|5c;KWD=96y z)5mCVJeEgQ)2Gozu{P&oo{!zmo@?;vNbp)_jV!G||Audnp0IWf8Yvoh&CbohDU@FU zXnV3ab%aQh@_je3Ytx{YXF4{;UP(NH32fRN^8G2F-6u?0Eda&~sVR<6eM=c?e(g)< zW4X5Enq_$dKeHq2 zF66>^knT&)Y89wV4*)u~sfGON%Y_OgA0>o zdTqdh8tddscGtMRh)&qME_GXp$uWA`WJcX>i~I3^x6x(WRX1%qpE=12@?u}%6np|o znZwsx)4D<$EIv@Wn4w5}W<+n>2BI5RvRYZ>AMQsDjaWGqrJpk_o@ZIrC-a9H9v`a? zPpYGGqiVj%Zxf7mYE0Z&8KeiFmy97f9BtBEax3M0yxQgH68mxhQ|#fR2NGVw=EB1j zx3#bH>h?oh`C^>Kc~ z)HHNd;p6?(gqtYGZAqSx79Lff8em4g3kC3xaRSd zc;15e#~kbBc=YxM#gP^ma9Z#UBi!opcq<h|`Th``;sA-AEs2^h zZxHGc#{`oSlaZK_3=?>BVL_!|{~?5`y!Oea4x|KCIJy-pt zSYixjMn$7`=J*V@T;d~GyyIhF%7O}svuta<<2tb?~6@~aaSoJ)q=5GW=K9sncrxK1-|)6CkhL2 zR$9TP0d&ge5{{+F8oT48Oy5nKC5UKOePVeg#Ud_$7>eaFD6*<}k$i7|KH|Q)-(TjN z?VF6Ujog9ItjPxM`ptUuD?oNT(H_27^AV{vATfkl)jKqf(K|}_$yE*TCsKoz?{%#C zYq;*8cylez1`1bS#)AV4KbG}j;%iofzoom5 nEojlu3xf~5NT)A{H@`$pZg=XXL ziDIw;rv6h!9%e<2UfYCv0<4+evdikRZr*?l-$G}_!NMxC9(9eBuUWO=t$=Aqg3wLg7X>0;0Qo-SSF#O_^ zBa9#i`-44>eSQqtHb6xU(^X;~t;Kx#i9AraYXH&jX^E@sYaArE?^aZ9oYRc`fm=$9 z7eR)YW6g`Gr!U{MBUY;|ED~r{Q891Ih+vU zjPd&wduZ(-eG!z6C=X(ecAswuX7n24#Dm80Fe2BPK}w%HGsidHdx}V&dzBx|i1gd- zVY{E=n}S!op~>YUb0pIwu33pw>xn25!H~pm-!;qfa(Qh8>PEx3Lqo;!j+{@QHR?Uc<=;vom8L!>3Ckcz%}d%iDK0+y&YFf;SRUMSF-0349qW$c$_ zVV2cP7AdTKw%TugZn>TbFBS2uL&s|aL!pnhC*00HVb0^uZ>=qkxgov4@^;AgqHbv}c412e(?C40ENnFR26AoE0j)KGz zD-6J?2QeZAB5*;gC; zEQ=`IitU4l1$dd@th$pLtS|XWa+GzctS?I?b_a|u(geG+98L;KZb&P=PC>rB=+2Ew zdgJvXi;c%qoIfiuybK?O#e9JlRN$L(@`=g4pVmyIN0pu5d>NEn#$hrd{7%V?GDESa zEqcQCmcUpGVQOwZsT$uJ+>UV;Nn^1LO88wT3hcDBfz1pr`}`4<(%>s&Z4Qb;dPy-k zE$N8sDZb2vmH14jY_40p_^2U>Na$G$7_&YggRsc8piw*Pj^?{qj-F^kf3_Yp|M%Tr zc5hYK^ecKz_E{Htwze>3A3q0Jiyj#0qFmqt$}5o&1f32$j}P;33-i=<5Ag&SNFAk) zQbCfJ5ai+Gb@P7@=xX#Ng8@R!8SH|*!Xn&4 lJfVn)2vwgzzfgC#U{BSc5W=GsJz;PYWOm*XTX)Vi?!Tn3s8Ij_ literal 0 HcmV?d00001 diff --git a/defaults.py b/defaults.py index e2db25b4..5f6178fd 100644 --- a/defaults.py +++ b/defaults.py @@ -177,7 +177,7 @@ class FlatCAMDefaults: "gerber_isooverlap": 10, "gerber_milling_type": "cl", "gerber_combine_passes": False, - "gerber_iso_scope": 'all', + "gerber_iso_scope": _("All"), "gerber_noncoppermargin": 0.1, "gerber_noncopperrounded": False, "gerber_bboxmargin": 0.1, @@ -188,7 +188,7 @@ class FlatCAMDefaults: "gerber_aperture_scale_factor": 1.0, "gerber_aperture_buffer_factor": 0.0, "gerber_follow": False, - "gerber_tool_type": 'circular', + "gerber_tool_type": 'C1', "gerber_vtipdia": 0.1, "gerber_vtipangle": 30, "gerber_vcutz": -0.05,