From 5caaaacd284a55c0e77b01a9905aacacf0db8c77 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 13:06:51 -0400 Subject: [PATCH 01/61] adding polar plot --- circuitpython_uplot/polar.py | 155 ++++++++++++++++++ circuitpython_uplot/uscatter.py | 5 +- docs/api.rst | 5 +- docs/examples.rst | 26 ++- docs/polar_example.jpg | Bin 0 -> 37528 bytes docs/polar_plots.jpg | Bin 0 -> 59396 bytes docs/quick_start.rst | 6 +- docs/{uplot_ex7.jpg => scatter.jpg} | Bin examples/uplot_polar_example.py | 21 +++ examples/uplot_polar_plots.py | 98 +++++++++++ .../{uplot_uscatter.py => uplot_scatter.py} | 4 +- 11 files changed, 308 insertions(+), 12 deletions(-) create mode 100644 circuitpython_uplot/polar.py create mode 100644 docs/polar_example.jpg create mode 100644 docs/polar_plots.jpg rename docs/{uplot_ex7.jpg => scatter.jpg} (100%) create mode 100644 examples/uplot_polar_example.py create mode 100644 examples/uplot_polar_plots.py rename examples/{uplot_uscatter.py => uplot_scatter.py} (90%) diff --git a/circuitpython_uplot/polar.py b/circuitpython_uplot/polar.py new file mode 100644 index 0000000..f274284 --- /dev/null +++ b/circuitpython_uplot/polar.py @@ -0,0 +1,155 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +""" + +`polar` +================================================================================ + +CircuitPython Polar graph + +* Author(s): Jose D. Montoya + + +""" +try: + from typing import Optional, Union + from circuitpython_uplot.uplot import Uplot +except ImportError: + pass +from bitmaptools import draw_line, draw_circle +from ulab import numpy as np + +__version__ = "0.11.0" +__repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" + + +class Polar: + """ + Class to draw polar plots + """ + + def __init__( + self, + plot: Uplot, + radius: Union[list, np.linspace, np.ndarray], + theta: Union[list, np.linspace, np.ndarray], + rangex: Optional[list] = None, + rangey: Optional[list] = None, + line_color: Optional[int] = None, + polar_plot_line_color: int = 0x647182, + nudge: bool = True, + radius_ticks: list = [1.0, 2.0], + ) -> None: + """ + + :param Uplot plot: Plot object for the scatter to be drawn + :param list|ulab.numpy.linspace|ulab.numpy.ndarray radius: radius points + :param list|ulab.numpy.linspace|ulab.numpy.ndarray theta: theta points + :param list|None rangex: x range limits. Defaults to None + :param list|None rangey: y range limits. Defaults to None + :param int|None line_color: line color. Defaults to None + :param bool fill: Show the filling. Defaults to `False` + :param bool nudge: moves the graph a little for better displaying. Defaults to `True` + + """ + + angles_list = [45, 90, 135, 180, 225, 270, 315, 360] + angles = np.ndarray(angles_list, dtype=np.int16) + + self.angle_radians = np.radians(angles) + self._color_index = plot._index_colorused + 1 + + if line_color is not None: + plot._plot_palette[plot._index_colorused] = line_color + + plot._plot_palette[self._color_index] = polar_plot_line_color + + if nudge: + nudge_factor = 1 + else: + nudge_factor = 0 + + if rangex is None: + xmin = np.min(radius) - nudge_factor * ( + abs(np.max(radius) - np.min(radius)) / 10 + ) + xmax = np.max(radius) + nudge_factor * ( + abs(np.max(radius) - np.min(radius)) / 10 + ) + else: + xmin = min(rangex) + xmax = max(rangex) + + if rangey is None: + ymin = np.min(theta) - nudge_factor * ( + abs(np.max(theta) - np.min(theta)) / 10 + ) + ymax = np.max(theta) + nudge_factor * ( + abs(np.max(theta) - np.min(theta)) / 10 + ) + else: + ymin = min(rangey) + ymax = max(rangey) + + xnorm = np.array( + plot.transform( + xmin, + xmax, + plot._newxmin, + plot._newxmax, + np.cos(np.array(radius)) * np.array(theta), + ), + dtype=np.int16, + ) + ynorm = np.array( + plot.transform( + ymin, + ymax, + plot._newymin, + plot._newymax, + np.sin(np.array(radius)) * np.array(theta), + ), + dtype=np.int16, + ) + + rnorm = np.array( + plot.transform( + 0, xmax, plot._newxmin, plot._newxmax, np.array(radius_ticks) + ), + dtype=np.int16, + ) + + self.originx = int(plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, 0)) + self.originy = int(plot.transform(ymin, ymax, plot._newymin, plot._newymax, 0)) + + for index, _ in enumerate(xnorm): + if index + 1 >= len(xnorm): + break + if theta[index] >= ymax: + continue + draw_line( + plot._plotbitmap, + xnorm[index], + ynorm[index], + xnorm[index + 1], + ynorm[index + 1], + plot._index_colorused, + ) + for radius_norm in rnorm: + draw_circle( + plot._plotbitmap, + self.originx, + self.originy, + radius_norm // 2, + self._color_index, + ) + + for element in self.angle_radians: + x = self.originx + int(np.cos(element) * rnorm[-1] // 2) + y = self.originy + int(np.sin(element) * rnorm[-1] // 2) + + draw_line( + plot._plotbitmap, self.originx, self.originy, x, y, self._color_index + ) diff --git a/circuitpython_uplot/uscatter.py b/circuitpython_uplot/uscatter.py index 64fdb93..944c513 100644 --- a/circuitpython_uplot/uscatter.py +++ b/circuitpython_uplot/uscatter.py @@ -5,7 +5,7 @@ """ -`uscatter` +`scatter` ================================================================================ CircuitPython scatter graph @@ -29,8 +29,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -# pylint: disable=too-few-public-methods, invalid-name, duplicate-code, too-many-locals, too-many-arguments -class uscatter: +class Scatter: """ Main class to display different graphics """ diff --git a/docs/api.rst b/docs/api.rst index 5b85315..34042c3 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4,7 +4,7 @@ Uplot Library .. automodule:: circuitpython_uplot.uplot :members: -.. automodule:: circuitpython_uplot.uscatter +.. automodule:: circuitpython_uplot.scatter :members: .. automodule:: circuitpython_uplot.ubar @@ -30,3 +30,6 @@ Uplot Library .. automodule:: circuitpython_uplot.shade :members: + +.. automodule:: circuitpython_uplot.polar + :members: diff --git a/docs/examples.rst b/docs/examples.rst index 4f24965..117cfe4 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -46,10 +46,10 @@ Scatter Example Scatter plot Example -.. literalinclude:: ../examples/uplot_uscatter.py - :caption: examples/uplot_uscatter.py +.. literalinclude:: ../examples/uplot_scatter.py + :caption: examples/uplot_scatter.py :lines: 5- -.. image:: ../docs/uplot_ex7.jpg +.. image:: ../docs/scatter.jpg Display_shapes Example ----------------------- @@ -150,6 +150,7 @@ Example showing how to add a data table to the plot .. literalinclude:: ../examples/uplot_ucartesian_table.py :caption: examples/uplot_ucartesian_table.py :lines: 5- + Lissajous Curves Example --------------------------- @@ -161,6 +162,15 @@ Example showing how to draw lissajous curves :lines: 5- .. image:: ../docs/uplot_lissajous.jpg +Cartesian Polar Plots Example +-------------------------------- + +Example showing how to draw polar plots using Cartesian + +.. literalinclude:: ../examples/uplot_polar_plots.py + :caption: examples/uplot_polar_plots.py + :lines: 5- +.. image:: ../docs/polar_plots.jpg Stackplot Example --------------------------- @@ -299,3 +309,13 @@ Shade example :caption: examples/uplot_shade_example.py :lines: 5- .. image:: ../docs/uplot_shade.jpg + +Polar example +--------------------------- + +Show how to use the Polar Plot + +.. literalinclude:: ../examples/uplot_polar_example.py + :caption: examples/uplot_polar_example.py + :lines: 5- +.. image:: ../docs/polar_example.jpg diff --git a/docs/polar_example.jpg b/docs/polar_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d4b577081cf517d293cd519bc7f336681ac7483 GIT binary patch literal 37528 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 Date: Fri, 28 Jul 2023 13:24:43 -0400 Subject: [PATCH 02/61] map name change --- .pylintrc | 2 +- circuitpython_uplot/{umap.py => map.py} | 4 ++-- circuitpython_uplot/polar.py | 1 + circuitpython_uplot/{uscatter.py => scatter.py} | 0 docs/api.rst | 2 +- docs/examples.rst | 11 +++++------ docs/{uplot_ex17.jpg => map.jpg} | Bin docs/quick_start.rst | 4 ++-- examples/{uplot_umap.py => uplot_map.py} | 4 ++-- examples/uplot_polar_example.py | 1 - examples/uplot_polar_plots.py | 2 +- examples/uplot_readme_example.py | 4 ++-- 12 files changed, 17 insertions(+), 18 deletions(-) rename circuitpython_uplot/{umap.py => map.py} (99%) rename circuitpython_uplot/{uscatter.py => scatter.py} (100%) rename docs/{uplot_ex17.jpg => map.jpg} (100%) rename examples/{uplot_umap.py => uplot_map.py} (89%) diff --git a/.pylintrc b/.pylintrc index b7af89b..4a66b63 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,umap,upie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,map,upie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/umap.py b/circuitpython_uplot/map.py similarity index 99% rename from circuitpython_uplot/umap.py rename to circuitpython_uplot/map.py index 48115bb..e8526e1 100644 --- a/circuitpython_uplot/umap.py +++ b/circuitpython_uplot/map.py @@ -5,7 +5,7 @@ """ -`umap` +`map` ================================================================================ CircuitPython color map graph @@ -27,7 +27,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class umap: +class Map: """ Main class to display different graphics """ diff --git a/circuitpython_uplot/polar.py b/circuitpython_uplot/polar.py index f274284..ec90947 100644 --- a/circuitpython_uplot/polar.py +++ b/circuitpython_uplot/polar.py @@ -25,6 +25,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" +# pylint: disable=dangerous-default-value class Polar: """ Class to draw polar plots diff --git a/circuitpython_uplot/uscatter.py b/circuitpython_uplot/scatter.py similarity index 100% rename from circuitpython_uplot/uscatter.py rename to circuitpython_uplot/scatter.py diff --git a/docs/api.rst b/docs/api.rst index 34042c3..16fcb0f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -19,7 +19,7 @@ Uplot Library .. automodule:: circuitpython_uplot.ufillbetween :members: -.. automodule:: circuitpython_uplot.umap +.. automodule:: circuitpython_uplot.map :members: .. automodule:: circuitpython_uplot.ulogging diff --git a/docs/examples.rst b/docs/examples.rst index 117cfe4..9a3f2bd 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -150,7 +150,6 @@ Example showing how to add a data table to the plot .. literalinclude:: ../examples/uplot_ucartesian_table.py :caption: examples/uplot_ucartesian_table.py :lines: 5- - Lissajous Curves Example --------------------------- @@ -212,15 +211,15 @@ example of uboxplot integration with uplot :lines: 8- .. image:: ../docs/uplot_ex16.jpg -Umap Example +Map Example --------------------------- -umap simple example +map simple example -.. literalinclude:: ../examples/uplot_umap.py - :caption: examples/uplot_umap.py +.. literalinclude:: ../examples/uplot_map.py + :caption: examples/uplot_map.py :lines: 5- -.. image:: ../docs/uplot_ex17.jpg +.. image:: ../docs/map.jpg Sparkline Animation Example --------------------------- diff --git a/docs/uplot_ex17.jpg b/docs/map.jpg similarity index 100% rename from docs/uplot_ex17.jpg rename to docs/map.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 741701a..efce62c 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -426,7 +426,7 @@ You can choose the initial and final colors for the color map. import board from ulab import numpy as np from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.umap import umap + from circuitpython_uplot.map import Map display = board.DISPLAY @@ -445,7 +445,7 @@ You can choose the initial and final colors for the color map. dtype=np.int16, ) - umap(plot, x, 0xFF0000, 0x0000FF) + Map(plot, x, 0xFF0000, 0x0000FF) display.show(plot) diff --git a/examples/uplot_umap.py b/examples/uplot_map.py similarity index 89% rename from examples/uplot_umap.py rename to examples/uplot_map.py index 7d04a8b..088feba 100644 --- a/examples/uplot_umap.py +++ b/examples/uplot_map.py @@ -7,7 +7,7 @@ import board from ulab import numpy as np from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.umap import umap +from circuitpython_uplot.map import Map # Setting up the display @@ -23,7 +23,7 @@ y1 = np.array(b).reshape((10, 10)) # Plotting and showing the plot -umap(plot, y1, 0xFF0044, 0x4400FF) +Map(plot, y1, 0xFF0044, 0x4400FF) # Plotting and showing the plot display.show(plot) diff --git a/examples/uplot_polar_example.py b/examples/uplot_polar_example.py index 8098404..d3932ec 100644 --- a/examples/uplot_polar_example.py +++ b/examples/uplot_polar_example.py @@ -6,7 +6,6 @@ import ulab.numpy as np from circuitpython_uplot.uplot import Uplot, color from circuitpython_uplot.polar import Polar -import ulab.numpy as np # Setting up the display display = board.DISPLAY diff --git a/examples/uplot_polar_plots.py b/examples/uplot_polar_plots.py index 5c76097..d9e8b3b 100644 --- a/examples/uplot_polar_plots.py +++ b/examples/uplot_polar_plots.py @@ -11,7 +11,7 @@ # Inspired by # https://github.com/CodeDrome/polar-plots-python - +# pylint: disable=dangerous-default-value # Setting up the display display = board.DISPLAY plot = Uplot(0, 0, display.width // 2, display.height // 2, padding=1) diff --git a/examples/uplot_readme_example.py b/examples/uplot_readme_example.py index 9115338..2f10e6e 100644 --- a/examples/uplot_readme_example.py +++ b/examples/uplot_readme_example.py @@ -8,7 +8,7 @@ from ulab import numpy as np from circuitpython_uplot.uplot import Uplot from circuitpython_uplot.ubar import ubar -from circuitpython_uplot.uscatter import uscatter +from circuitpython_uplot.scatter import Scatter from circuitpython_uplot.upie import upie from circuitpython_uplot.ucartesian import ucartesian @@ -59,7 +59,7 @@ plot5.axs_params(axstype="cartesian") a = np.linspace(3, 98) b = [choice(a) for _ in a] -uscatter(plot5, a, b, rangex=[0, 102], rangey=[0, 102], radius=2) +Scatter(plot5, a, b, rangex=[0, 102], rangey=[0, 102], radius=2) plot.append(plot5) From 3a89109864d3656f92834ec5ba3b7381457611c3 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 13:29:41 -0400 Subject: [PATCH 03/61] renaming Pie --- .pylintrc | 2 +- circuitpython_uplot/{upie.py => pie.py} | 6 +++--- docs/api.rst | 2 +- docs/examples.rst | 10 +++++----- docs/quick_start.rst | 4 ++-- docs/{uplot_ex9.jpg => uplot_pie.jpg} | Bin .../{uplot_upie_example.py => uplot_pie_example.py} | 2 +- examples/uplot_readme_example.py | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) rename circuitpython_uplot/{upie.py => pie.py} (96%) rename docs/{uplot_ex9.jpg => uplot_pie.jpg} (100%) rename examples/{uplot_upie_example.py => uplot_pie_example.py} (91%) diff --git a/.pylintrc b/.pylintrc index 4a66b63..db3e6aa 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,map,upie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/upie.py b/circuitpython_uplot/pie.py similarity index 96% rename from circuitpython_uplot/upie.py rename to circuitpython_uplot/pie.py index 989462d..85e5653 100644 --- a/circuitpython_uplot/upie.py +++ b/circuitpython_uplot/pie.py @@ -4,7 +4,7 @@ """ -`upie` +`pie` ================================================================================ CircuitPython pie graph @@ -26,7 +26,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class upie: +class Pie: """ Class to draw pie """ @@ -36,7 +36,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the upie to be drawn + :param Uplot plot: Plot object for the pie to be drawn :param list data: data to make the pie :param int x: pie center x coordinate :param int y: pie center y coordinate diff --git a/docs/api.rst b/docs/api.rst index 16fcb0f..54ca31c 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -10,7 +10,7 @@ Uplot Library .. automodule:: circuitpython_uplot.ubar :members: -.. automodule:: circuitpython_uplot.upie +.. automodule:: circuitpython_uplot.pie :members: .. automodule:: circuitpython_uplot.ucartesian diff --git a/docs/examples.rst b/docs/examples.rst index 9a3f2bd..c3d58d7 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -122,15 +122,15 @@ ubar 3D example :lines: 5- .. image:: ../docs/uplot_3DBars.jpg -Upie Example +Pie Example ---------------- -upie example +Pie example -.. literalinclude:: ../examples/uplot_upie_example.py - :caption: examples/uplot_upie_example.py +.. literalinclude:: ../examples/uplot_pie_example.py + :caption: examples/uplot_pie_example.py :lines: 5- -.. image:: ../docs/uplot_ex9.jpg +.. image:: ../docs/uplot_pie.jpg Cartesian Advanced Example --------------------------- diff --git a/docs/quick_start.rst b/docs/quick_start.rst index efce62c..82a2dcb 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -230,12 +230,12 @@ To make the Pie Chart the data needs to be in a python list form. The library wi import board from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.upie import upie + from circuitpython_uplot.pie import Pie display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) a = [5, 2, 7, 3] - upie(plot, a) + Pie(plot, a) display.show(plot) There are no other special parameters to customize diff --git a/docs/uplot_ex9.jpg b/docs/uplot_pie.jpg similarity index 100% rename from docs/uplot_ex9.jpg rename to docs/uplot_pie.jpg diff --git a/examples/uplot_upie_example.py b/examples/uplot_pie_example.py similarity index 91% rename from examples/uplot_upie_example.py rename to examples/uplot_pie_example.py index be32246..0b92747 100644 --- a/examples/uplot_upie_example.py +++ b/examples/uplot_pie_example.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.upie import upie +from circuitpython_uplot.pie import upie # Setting up the display diff --git a/examples/uplot_readme_example.py b/examples/uplot_readme_example.py index 2f10e6e..28385fe 100644 --- a/examples/uplot_readme_example.py +++ b/examples/uplot_readme_example.py @@ -9,7 +9,7 @@ from circuitpython_uplot.uplot import Uplot from circuitpython_uplot.ubar import ubar from circuitpython_uplot.scatter import Scatter -from circuitpython_uplot.upie import upie +from circuitpython_uplot.pie import Pie from circuitpython_uplot.ucartesian import ucartesian @@ -69,7 +69,7 @@ plot6.axs_params(axstype="box") a = [5, 2, 7, 3] -upie(plot6, a, 0, 0) +Pie(plot6, a, 0, 0) plot.append(plot6) From 3044245ee7bcdf2ce474dd3f2e29af892fdcb6ee Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 13:38:59 -0400 Subject: [PATCH 04/61] logging rename --- .pylintrc | 2 +- circuitpython_uplot/{ulogging.py => logging.py} | 4 ++-- docs/api.rst | 2 +- docs/examples.rst | 10 +++++----- docs/{uplot_ex22.jpg => logging_fill.jpg} | Bin docs/quick_start.rst | 2 +- examples/{uplot_ulogging.py => uplot_logging.py} | 4 ++-- ...ging_animation.py => uplot_logging_animation.py} | 4 ++-- examples/uplot_logging_changing_values.py | 4 ++-- examples/uplot_logging_fill.py | 6 +++--- examples/uplot_logging_table.py | 6 +++--- 11 files changed, 22 insertions(+), 22 deletions(-) rename circuitpython_uplot/{ulogging.py => logging.py} (99%) rename docs/{uplot_ex22.jpg => logging_fill.jpg} (100%) rename examples/{uplot_ulogging.py => uplot_logging.py} (96%) rename examples/{uplot_ulogging_animation.py => uplot_logging_animation.py} (95%) diff --git a/.pylintrc b/.pylintrc index db3e6aa..ca4c595 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,map,pie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,logging,ufillbetween,ucartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/ulogging.py b/circuitpython_uplot/logging.py similarity index 99% rename from circuitpython_uplot/ulogging.py rename to circuitpython_uplot/logging.py index 95fdac3..9037812 100644 --- a/circuitpython_uplot/ulogging.py +++ b/circuitpython_uplot/logging.py @@ -4,7 +4,7 @@ """ -`ulogging` +`logging` ================================================================================ CircuitPython logging data graph @@ -25,7 +25,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ulogging: +class Logging: """ Class to log data """ diff --git a/docs/api.rst b/docs/api.rst index 54ca31c..b39c137 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -22,7 +22,7 @@ Uplot Library .. automodule:: circuitpython_uplot.map :members: -.. automodule:: circuitpython_uplot.ulogging +.. automodule:: circuitpython_uplot.logging :members: .. automodule:: circuitpython_uplot.usvg diff --git a/docs/examples.rst b/docs/examples.rst index c3d58d7..e9c3d6c 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -245,8 +245,8 @@ Logging Example Logging example -.. literalinclude:: ../examples/uplot_ulogging.py - :caption: examples/uplot_ulogging.py +.. literalinclude:: ../examples/uplot_logging.py + :caption: examples/uplot_logging.py :lines: 5- Logging Fill Example @@ -257,7 +257,7 @@ Logging fill example .. literalinclude:: ../examples/uplot_logging_fill.py :caption: examples/uplot_logging_fill.py :lines: 5- -.. image:: ../docs/uplot_ex22.jpg +.. image:: ../docs/logging_fill.jpg Logging Changing Values Example @@ -285,8 +285,8 @@ Logging Animation Example This example shows how to animate a plot -.. literalinclude:: ../examples/uplot_ulogging_animation.py - :caption: examples/uplot_ulogging_animation.py +.. literalinclude:: ../examples/uplot_logging_animation.py + :caption: examples/uplot_logging_animation.py :lines: 5- SVG Images examples diff --git a/docs/uplot_ex22.jpg b/docs/logging_fill.jpg similarity index 100% rename from docs/uplot_ex22.jpg rename to docs/logging_fill.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 82a2dcb..10a993e 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -472,7 +472,7 @@ There are some parameters that you can customize: x = [10, 20, 30, 40, 50] temp_y = [10, 15, 35, 10, 25] - my_log = ulogging(plot, x, y, rangex=[0, 200], rangey=[0, 100], ticksx=[10, 50, 80, 100], ticksy=[15, 30, 45, 60],) + my_log = Logging(plot, x, y, rangex=[0, 200], rangey=[0, 100], ticksx=[10, 50, 80, 100], ticksy=[15, 30, 45, 60],) if you want to redraw new data in the same plot, you could do something like this: diff --git a/examples/uplot_ulogging.py b/examples/uplot_logging.py similarity index 96% rename from examples/uplot_ulogging.py rename to examples/uplot_logging.py index 7b9a428..404cb25 100644 --- a/examples/uplot_ulogging.py +++ b/examples/uplot_logging.py @@ -7,7 +7,7 @@ import board from adafruit_display_text import label from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY @@ -63,7 +63,7 @@ dist = 3 -ulogging( +Logging( plot_1, x[0:dist], temp_y[0:dist], diff --git a/examples/uplot_ulogging_animation.py b/examples/uplot_logging_animation.py similarity index 95% rename from examples/uplot_ulogging_animation.py rename to examples/uplot_logging_animation.py index 78ab5af..f824bd6 100644 --- a/examples/uplot_ulogging_animation.py +++ b/examples/uplot_logging_animation.py @@ -7,7 +7,7 @@ import random import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY @@ -67,7 +67,7 @@ dist = 1 # Creating the loggraph -my_loggraph = ulogging( +my_loggraph = Logging( my_plot, x[0:dist], y[0:dist], diff --git a/examples/uplot_logging_changing_values.py b/examples/uplot_logging_changing_values.py index 0993c69..37782cc 100644 --- a/examples/uplot_logging_changing_values.py +++ b/examples/uplot_logging_changing_values.py @@ -6,7 +6,7 @@ import displayio import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY @@ -51,7 +51,7 @@ display.show(g) display.refresh() -my_log = ulogging( +my_log = Logging( plot_1, x, temp_y, diff --git a/examples/uplot_logging_fill.py b/examples/uplot_logging_fill.py index d74f7d9..ee22c09 100644 --- a/examples/uplot_logging_fill.py +++ b/examples/uplot_logging_fill.py @@ -5,7 +5,7 @@ import displayio import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY @@ -51,7 +51,7 @@ x = [10, 20, 30, 40, 50] temp_y = [26, 25, 24, 23, 28] -ulogging( +Logging( plot_1, x, temp_y, @@ -62,7 +62,7 @@ ticksy=[15, 30, 45, 60], fill=True, ) -ulogging( +Logging( plot_2, x, temp_y, diff --git a/examples/uplot_logging_table.py b/examples/uplot_logging_table.py index aa1016c..c1e5c15 100644 --- a/examples/uplot_logging_table.py +++ b/examples/uplot_logging_table.py @@ -12,7 +12,7 @@ import board from table import Table from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.logging import Logging # Create a display object display = board.DISPLAY @@ -58,8 +58,8 @@ x = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] temp_y = [26, 25, 24, 23, 28, 24, 54, 76, 34, 23] -# Create a ulogging object -my_log = ulogging( +# Create a logging object +my_log = Logging( plot_1, x, temp_y, From c4cbec04a3ce46ca469494bac461d63d0a073df7 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 14:00:33 -0400 Subject: [PATCH 05/61] bar name change --- .pylintrc | 2 +- circuitpython_uplot/{ubar.py => bar.py} | 4 +- docs/api.rst | 2 +- docs/{uplot_ex8.jpg => bar_example.jpg} | Bin docs/examples.rst | 38 +++++++++--------- docs/quick_start.rst | 26 ++++++------ ...lot_ubar_3Dbars.py => uplot_bar_3Dbars.py} | 4 +- ...hanging.py => uplot_bar_color_changing.py} | 8 ++-- ...orpalette.py => uplot_bar_colorpalette.py} | 4 +- ...t_ubar_example.py => uplot_bar_example.py} | 4 +- ..._example.py => uplot_bar_scale_example.py} | 6 +-- ...values.py => uplot_bar_updating_values.py} | 8 ++-- examples/uplot_readme_example.py | 4 +- 13 files changed, 55 insertions(+), 55 deletions(-) rename circuitpython_uplot/{ubar.py => bar.py} (99%) rename docs/{uplot_ex8.jpg => bar_example.jpg} (100%) rename examples/{uplot_ubar_3Dbars.py => uplot_bar_3Dbars.py} (79%) rename examples/{uplot_ubar_color_changing.py => uplot_bar_color_changing.py} (88%) rename examples/{uplot_ubar_colorpalette.py => uplot_bar_colorpalette.py} (94%) rename examples/{uplot_ubar_example.py => uplot_bar_example.py} (86%) rename examples/{uplot_ubar_scale_example.py => uplot_bar_scale_example.py} (80%) rename examples/{uplot_ubar_updating_values.py => uplot_bar_updating_values.py} (88%) diff --git a/.pylintrc b/.pylintrc index ca4c595..fc40d91 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,logging,ufillbetween,ucartesian,y2,map,pie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,ufillbetween,ucartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/ubar.py b/circuitpython_uplot/bar.py similarity index 99% rename from circuitpython_uplot/ubar.py rename to circuitpython_uplot/bar.py index b892303..2e28749 100644 --- a/circuitpython_uplot/ubar.py +++ b/circuitpython_uplot/bar.py @@ -4,7 +4,7 @@ """ -`ubar` +`bar` ================================================================================ CircuitPython scatter graph @@ -30,7 +30,7 @@ # pylint: disable=no-self-use -class ubar: +class Bar: """ Main class to display different graphics """ diff --git a/docs/api.rst b/docs/api.rst index b39c137..60e3ad7 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -7,7 +7,7 @@ Uplot Library .. automodule:: circuitpython_uplot.scatter :members: -.. automodule:: circuitpython_uplot.ubar +.. automodule:: circuitpython_uplot.bar :members: .. automodule:: circuitpython_uplot.pie diff --git a/docs/uplot_ex8.jpg b/docs/bar_example.jpg similarity index 100% rename from docs/uplot_ex8.jpg rename to docs/bar_example.jpg diff --git a/docs/examples.rst b/docs/examples.rst index e9c3d6c..e75dcd2 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -61,34 +61,34 @@ Display Shapes integration example :lines: 5- .. image:: ../docs/uplot_ex6.jpg -Ubar Example +Bar Example ---------------- -ubar example +Bar example -.. literalinclude:: ../examples/uplot_ubar_example.py - :caption: examples/uplot_ubar_example.py +.. literalinclude:: ../examples/uplot_bar_example.py + :caption: examples/uplot_bar_example.py :lines: 5- -.. image:: ../docs/uplot_ex8.jpg +.. image:: ../docs/bar_example.jpg -Ubar Scale Example +Bar Scale Example --------------------- Bar plot example showing how to use the scale -.. literalinclude:: ../examples/uplot_ubar_scale_example.py - :caption: examples/uplot_ubar_scale_example.py +.. literalinclude:: ../examples/uplot_bar_scale_example.py + :caption: examples/uplot_bar_scale_example.py :lines: 5- .. image:: ../docs/bar_scale.jpg -Ubar Color Palette Example +Bar Color Palette Example ---------------------------- Bar plot example showing how to pass a user color Palette -.. literalinclude:: ../examples/uplot_ubar_colorpalette.py - :caption: examples/uplot_ubar_colorpalette.py +.. literalinclude:: ../examples/uplot_bar_colorpalette.py + :caption: examples/uplot_bar_colorpalette.py :lines: 5- .. image:: ../docs/bar_palette.jpg @@ -98,8 +98,8 @@ Bar plot updating values Example Bar Plot example showing how to update values for a filled bars bar plot -.. literalinclude:: ../examples/uplot_ubar_updating_values.py - :caption: examples/uplot_ubar_updating_values.py +.. literalinclude:: ../examples/uplot_bar_updating_values.py + :caption: examples/uplot_bar_updating_values.py :lines: 5- Bar plot updating bar colors Example @@ -107,18 +107,18 @@ Bar plot updating bar colors Example Bar Plot example showing how to update colors for a filled bars bar plot -.. literalinclude:: ../examples/uplot_ubar_color_changing.py - :caption: examples/uplot_ubar_color_changing.py +.. literalinclude:: ../examples/uplot_bar_color_changing.py + :caption: examples/uplot_bar_color_changing.py :lines: 5- -Ubar 3D Example +Bar 3D Example ---------------- -ubar 3D example +Bar 3D example -.. literalinclude:: ../examples/uplot_ubar_3Dbars.py - :caption: examples/uplot_ubar_3Dbars.py +.. literalinclude:: ../examples/uplot_bar_3Dbars.py + :caption: examples/uplot_bar_3Dbars.py :lines: 5- .. image:: ../docs/uplot_3DBars.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 10a993e..bec02bb 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -288,7 +288,7 @@ You can choose to create shell or filled bars. import board from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.bar import Bar display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) @@ -296,21 +296,21 @@ You can choose to create shell or filled bars. a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - ubar(plot, a, b) + Bar(plot, a, b) You can select the color or and if the bars are filled .. code-block:: python - ubar(plot, a, b, 0xFF1000, True) + Bar(plot, a, b, 0xFF1000, True) You can also select the bar spacing and the xstart position: .. code-block:: python - ubar(plot, a, b, 0xFF1000, fill=True, bar_space=30, xstart=70) + Bar(plot, a, b, 0xFF1000, fill=True, bar_space=30, xstart=70) For bar filled graphs you can pass a color_palette list. This will allow you to select the color of each bar This will not work for shell bars sadly. @@ -319,11 +319,11 @@ This will not work for shell bars sadly. import board from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.bar import Bar display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) - ubar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) + Bar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) with the projection argument you can show the bars with projection. This will give them a 3D @@ -333,7 +333,7 @@ appearance import board from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.bar import bar display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) @@ -341,7 +341,7 @@ appearance a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - ubar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) + Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) For filled unprojected bars you can update their values. This is useful for data logging. @@ -352,7 +352,7 @@ according to this max value, and bar plot will update their values accordingly import board from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.bar import Bar display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) @@ -360,13 +360,13 @@ according to this max value, and bar plot will update their values accordingly a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - my_ubar = ubar(plot, a, b, color=0xFF1000, fill=True, color_palette=[0xFF1000, 0x00FF00, 0xFFFF00, 0x123456], max_value=10) + my_bar = Bar(plot, a, b, color=0xFF1000, fill=True, color_palette=[0xFF1000, 0x00FF00, 0xFFFF00, 0x123456], max_value=10) Then you can update the values of the bar plot: .. code-block:: python - my_ubar.update_values([1, 2, 3, 4]) + my_bar.update_values([1, 2, 3, 4]) Also for Filled unprojected bars you can change all bars color at once. The following @@ -374,13 +374,13 @@ code will change all the bar's color to red .. code-block:: python - my_ubar.update_colors(0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000) + my_bar.update_colors(0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000) If you prefer, you can change the color of a single bar using the following code: .. code-block:: python - my_ubar.update_bar_color(0, 0x0000FF) + my_bar.update_bar_color(0, 0x0000FF) This will change the first bar to Blue. diff --git a/examples/uplot_ubar_3Dbars.py b/examples/uplot_bar_3Dbars.py similarity index 79% rename from examples/uplot_ubar_3Dbars.py rename to examples/uplot_bar_3Dbars.py index f6088cf..a2c626c 100644 --- a/examples/uplot_ubar_3Dbars.py +++ b/examples/uplot_bar_3Dbars.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # Setting up the display @@ -19,7 +19,7 @@ b = [3, 5, 1, 9, 7] # Creating a 3D bar -ubar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) +Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) # Plotting and showing the plot display.show(plot) diff --git a/examples/uplot_ubar_color_changing.py b/examples/uplot_bar_color_changing.py similarity index 88% rename from examples/uplot_ubar_color_changing.py rename to examples/uplot_bar_color_changing.py index 8b39cbd..0eb03cc 100644 --- a/examples/uplot_ubar_color_changing.py +++ b/examples/uplot_bar_color_changing.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -35,7 +35,7 @@ display.show(plot) # Creating the bar -my_ubar = ubar( +my_bar = Bar( plot, a, some_values, @@ -46,11 +46,11 @@ ) time.sleep(2) # Changing all the bars to Yellow -my_ubar.update_colors( +my_bar.update_colors( [color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW] ) time.sleep(2) # Changing the 3 bar to Purple -my_ubar.update_bar_color(2, color.PURPLE) +my_bar.update_bar_color(2, color.PURPLE) diff --git a/examples/uplot_ubar_colorpalette.py b/examples/uplot_bar_colorpalette.py similarity index 94% rename from examples/uplot_ubar_colorpalette.py rename to examples/uplot_bar_colorpalette.py index cdac994..cabe811 100644 --- a/examples/uplot_ubar_colorpalette.py +++ b/examples/uplot_bar_colorpalette.py @@ -4,7 +4,7 @@ import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -29,7 +29,7 @@ a = ["a", "b", "c", "d", "e", "f"] # Creating the Bar Plot -ubar( +Bar( plot, a, activities_latest_heart_value, diff --git a/examples/uplot_ubar_example.py b/examples/uplot_bar_example.py similarity index 86% rename from examples/uplot_ubar_example.py rename to examples/uplot_bar_example.py index 8d2af39..3c8b5bc 100644 --- a/examples/uplot_ubar_example.py +++ b/examples/uplot_bar_example.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # Setting up the display @@ -17,7 +17,7 @@ plot.axs_params(axstype="box") a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] -ubar(plot, a, b, 0xFF1000, True) +Bar(plot, a, b, 0xFF1000, True) # Plotting and showing the plot display.show(plot) diff --git a/examples/uplot_ubar_scale_example.py b/examples/uplot_bar_scale_example.py similarity index 80% rename from examples/uplot_ubar_scale_example.py rename to examples/uplot_bar_scale_example.py index 02f5384..635d1ed 100644 --- a/examples/uplot_ubar_scale_example.py +++ b/examples/uplot_bar_scale_example.py @@ -6,7 +6,7 @@ import board import displayio from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # from uplot_examples import u8 # Setting up the display @@ -24,8 +24,8 @@ b = [3, 5, 1, 7] # Creating the bar plot -ubar(plot_scale1, a, b, 0xFF1000, True, bar_space=8, xstart=10) -ubar(plot_scale2, a, b, 0xFF1000, True, bar_space=4, xstart=5) +Bar(plot_scale1, a, b, 0xFF1000, True, bar_space=8, xstart=10) +Bar(plot_scale2, a, b, 0xFF1000, True, bar_space=4, xstart=5) # Plotting and showing the plot group.append(plot_scale1) diff --git a/examples/uplot_ubar_updating_values.py b/examples/uplot_bar_updating_values.py similarity index 88% rename from examples/uplot_ubar_updating_values.py rename to examples/uplot_bar_updating_values.py index 0ff6dd7..63684d1 100644 --- a/examples/uplot_ubar_updating_values.py +++ b/examples/uplot_bar_updating_values.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -34,7 +34,7 @@ display.show(plot) # Creating the bar -my_ubar = ubar( +my_bar = Bar( plot, a, some_values, @@ -53,12 +53,12 @@ for i in range(20): values_changed = [j + add for j in some_values] - my_ubar.update_values(values_changed) + my_bar.update_values(values_changed) add += 1 time.sleep(0.1) for i in range(20): values_changed = [j + add for j in some_values] - my_ubar.update_values(values_changed) + my_bar.update_values(values_changed) add -= 1 time.sleep(0.1) diff --git a/examples/uplot_readme_example.py b/examples/uplot_readme_example.py index 28385fe..2dd23bc 100644 --- a/examples/uplot_readme_example.py +++ b/examples/uplot_readme_example.py @@ -7,7 +7,7 @@ import displayio from ulab import numpy as np from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.bar import Bar from circuitpython_uplot.scatter import Scatter from circuitpython_uplot.pie import Pie from circuitpython_uplot.ucartesian import ucartesian @@ -49,7 +49,7 @@ plot4.axs_params(axstype="box") a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] -ubar(plot4, a, b, 0xFF1000, fill=True) +Bar(plot4, a, b, 0xFF1000, fill=True) plot.append(plot4) From f52048e649c70659a6899d78504f8053a094692b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 14:13:30 -0400 Subject: [PATCH 06/61] fillbetween name change --- .pylintrc | 2 +- .../{ufillbetween.py => fillbetween.py} | 4 ++-- docs/api.rst | 2 +- docs/examples.rst | 10 +++++----- docs/{uplot_ex15.jpg => fillbetween_example.jpg} | Bin docs/quick_start.rst | 6 +++--- .../{uplot_ufillbetween.py => uplot_fillbetween.py} | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) rename circuitpython_uplot/{ufillbetween.py => fillbetween.py} (98%) rename docs/{uplot_ex15.jpg => fillbetween_example.jpg} (100%) rename examples/{uplot_ufillbetween.py => uplot_fillbetween.py} (83%) diff --git a/.pylintrc b/.pylintrc index fc40d91..0d186f0 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,ufillbetween,ucartesian,y2,map,pie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,fillbetween,ucartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/ufillbetween.py b/circuitpython_uplot/fillbetween.py similarity index 98% rename from circuitpython_uplot/ufillbetween.py rename to circuitpython_uplot/fillbetween.py index 3592f3e..094711f 100644 --- a/circuitpython_uplot/ufillbetween.py +++ b/circuitpython_uplot/fillbetween.py @@ -4,7 +4,7 @@ """ -`ufillbetween` +`fillbetween` ================================================================================ CircuitPython fillbetween graph @@ -26,7 +26,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ufillbetween: +class Fillbetween: """ Class to draw a fillbetween graph """ diff --git a/docs/api.rst b/docs/api.rst index 60e3ad7..412e04b 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -16,7 +16,7 @@ Uplot Library .. automodule:: circuitpython_uplot.ucartesian :members: -.. automodule:: circuitpython_uplot.ufillbetween +.. automodule:: circuitpython_uplot.fillbetween :members: .. automodule:: circuitpython_uplot.map diff --git a/docs/examples.rst b/docs/examples.rst index e75dcd2..50fadd3 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -191,15 +191,15 @@ plot different ulements in a single display :lines: 5- .. image:: ../docs/readme.png -Ufillbetween Example +Fillbetween Example --------------------------- -example of ufillbetween plot +Example of fillbetween plot -.. literalinclude:: ../examples/uplot_ufillbetween.py - :caption: examples/uplot_ufillbetween.py +.. literalinclude:: ../examples/uplot_fillbetween.py + :caption: examples/uplot_fillbetween.py :lines: 5- -.. image:: ../docs/uplot_ex15.jpg +.. image:: ../docs/fillbetween_example.jpg Uboxplot Example --------------------------- diff --git a/docs/uplot_ex15.jpg b/docs/fillbetween_example.jpg similarity index 100% rename from docs/uplot_ex15.jpg rename to docs/fillbetween_example.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index bec02bb..25cfd8d 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -60,7 +60,7 @@ At the moment the following objects can be added to the plot area: * Elements in the library * Cartesian Plane - * Ufillbetween graph + * Fillbetween graph * Stackplot * Bar graph * Pie Chart @@ -398,7 +398,7 @@ it will fill the area between two curves: import board from ulab import numpy as np from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ufillbetween import ufillbetween + from circuitpython_uplot.fillbetween import Fillbetween display = board.DISPLAY @@ -410,7 +410,7 @@ it will fill the area between two curves: y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x - ufillbetween(plot, x, y1, y2) + Fillbetween(plot, x, y1, y2) display.show(plot) diff --git a/examples/uplot_ufillbetween.py b/examples/uplot_fillbetween.py similarity index 83% rename from examples/uplot_ufillbetween.py rename to examples/uplot_fillbetween.py index 6050c7f..340e6e9 100644 --- a/examples/uplot_ufillbetween.py +++ b/examples/uplot_fillbetween.py @@ -6,7 +6,7 @@ import board from ulab import numpy as np from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ufillbetween import ufillbetween +from circuitpython_uplot.fillbetween import Fillbetween # Setting up the display @@ -19,7 +19,7 @@ y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x -ufillbetween(plot, x, y1, y2) +Fillbetween(plot, x, y1, y2) display.show(plot) From 8fc78d5207f0285ab743b32bccfc7db1f5afb0f5 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 14:18:10 -0400 Subject: [PATCH 07/61] usvg name change --- circuitpython_uplot/{usvg.py => svg.py} | 4 ++-- docs/api.rst | 2 +- docs/examples.rst | 6 +++--- docs/quick_start.rst | 4 ++-- docs/{uplot_ex23.jpg => uplot_svg.jpg} | Bin .../{uplot_usvg_example.py => uplot_svg_example.py} | 10 +++++----- 6 files changed, 13 insertions(+), 13 deletions(-) rename circuitpython_uplot/{usvg.py => svg.py} (99%) rename docs/{uplot_ex23.jpg => uplot_svg.jpg} (100%) rename examples/{uplot_usvg_example.py => uplot_svg_example.py} (60%) diff --git a/circuitpython_uplot/usvg.py b/circuitpython_uplot/svg.py similarity index 99% rename from circuitpython_uplot/usvg.py rename to circuitpython_uplot/svg.py index 2cee46b..9293ba4 100644 --- a/circuitpython_uplot/usvg.py +++ b/circuitpython_uplot/svg.py @@ -4,7 +4,7 @@ """ -`usvg` +`svg` ================================================================================ CircuitPython svg icon utility for CircuitPython_uplot @@ -26,7 +26,7 @@ # pylint: disable=too-many-arguments, invalid-name, no-self-use, too-few-public-methods # pylint: disable=too-many-locals, too-many-branches, protected-access, unnecessary-list-index-lookup -class usvg: +class SVG: """ class to render svg images in the plot area """ diff --git a/docs/api.rst b/docs/api.rst index 412e04b..3bb2cfc 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -25,7 +25,7 @@ Uplot Library .. automodule:: circuitpython_uplot.logging :members: -.. automodule:: circuitpython_uplot.usvg +.. automodule:: circuitpython_uplot.svg :members: .. automodule:: circuitpython_uplot.shade diff --git a/docs/examples.rst b/docs/examples.rst index 50fadd3..c1ac8ef 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -294,10 +294,10 @@ SVG Images examples SVG Images example -.. literalinclude:: ../examples/uplot_usvg_example.py - :caption: examples/uplot_usvg_example.py +.. literalinclude:: ../examples/uplot_svg_example.py + :caption: examples/uplot_svg_example.py :lines: 5- -.. image:: ../docs/uplot_ex23.jpg +.. image:: ../docs/uplot_svg.jpg Shade examples --------------------------- diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 25cfd8d..b41cc8b 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -497,10 +497,10 @@ For example, if you want to load the Temperature icon with a scale of 2 .. code-block:: python - from circuitpython_uplot.usvg import usvg + from circuitpython_uplot.svg import SVG from circuitpython_uplot.icons import Temperature display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) - usvg(plot, Temperature, 250, 50, 2) + SVG(plot, Temperature, 250, 50, 2) display.show(plot) diff --git a/docs/uplot_ex23.jpg b/docs/uplot_svg.jpg similarity index 100% rename from docs/uplot_ex23.jpg rename to docs/uplot_svg.jpg diff --git a/examples/uplot_usvg_example.py b/examples/uplot_svg_example.py similarity index 60% rename from examples/uplot_usvg_example.py rename to examples/uplot_svg_example.py index 33faeec..65c7d4e 100644 --- a/examples/uplot_usvg_example.py +++ b/examples/uplot_svg_example.py @@ -4,7 +4,7 @@ import board from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.usvg import usvg +from circuitpython_uplot.svg import SVG from circuitpython_uplot.icons import FULL, Humidity, Temperature, Temperature2 @@ -12,9 +12,9 @@ display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) -usvg(plot, FULL, 50, 50, 2, color.YELLOW) -usvg(plot, Humidity, 150, 50, 2, color.TEAL) -usvg(plot, Temperature, 250, 50, 2, color.GREEN) +SVG(plot, FULL, 50, 50, 2, color.YELLOW) +SVG(plot, Humidity, 150, 50, 2, color.TEAL) +SVG(plot, Temperature, 250, 50, 2, color.GREEN) -usvg(plot, Temperature2, 300, 50, 0.25, color.BLUE) +SVG(plot, Temperature2, 300, 50, 0.25, color.BLUE) display.show(plot) From 0693e3c8c5d61aa33af91fbecf7e5e916efde997 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 14:35:52 -0400 Subject: [PATCH 08/61] cartesian name change --- .pylintrc | 2 +- circuitpython_uplot/bar.py | 8 ++++---- .../{ucartesian.py => cartesian.py} | 6 +++--- circuitpython_uplot/fillbetween.py | 2 +- circuitpython_uplot/logging.py | 2 +- circuitpython_uplot/map.py | 2 +- circuitpython_uplot/pie.py | 2 +- circuitpython_uplot/{uplot.py => plot.py} | 4 ++-- circuitpython_uplot/polar.py | 2 +- circuitpython_uplot/scatter.py | 2 +- circuitpython_uplot/shade.py | 2 +- circuitpython_uplot/svg.py | 2 +- docs/api.rst | 2 +- docs/examples.rst | 14 +++++++------- docs/quick_start.rst | 10 +++++----- ...uplot_ex11.jpg => uplot_cartesian_advance.jpg} | Bin examples/uplot_bar_3Dbars.py | 2 +- examples/uplot_bar_color_changing.py | 2 +- examples/uplot_bar_colorpalette.py | 2 +- examples/uplot_bar_example.py | 2 +- examples/uplot_bar_scale_example.py | 2 +- examples/uplot_bar_updating_values.py | 2 +- ...an_advanced.py => uplot_cartesian_advanced.py} | 8 ++++---- ...gin_data.py => uplot_cartesian_loggin_data.py} | 8 ++++---- ...artesian_table.py => uplot_cartesian_table.py} | 6 +++--- examples/uplot_display_shapes.py | 2 +- examples/uplot_fillbetween.py | 2 +- examples/uplot_integration_example.py | 6 +++--- examples/uplot_lissajous_curves.py | 12 ++++++------ examples/uplot_logging.py | 2 +- examples/uplot_logging_animation.py | 2 +- examples/uplot_logging_changing_values.py | 2 +- examples/uplot_logging_fill.py | 2 +- examples/uplot_logging_table.py | 2 +- examples/uplot_map.py | 2 +- examples/uplot_pie_example.py | 2 +- examples/uplot_plot_example.py | 6 +++--- examples/uplot_polar_example.py | 2 +- examples/uplot_polar_plots.py | 12 ++++++------ examples/uplot_readme_example.py | 14 +++++++------- examples/uplot_scatter.py | 2 +- examples/uplot_shade_example.py | 6 +++--- examples/uplot_simpletest.py | 2 +- examples/uplot_sparkline.py | 2 +- examples/uplot_stackplot.py | 10 +++++----- examples/uplot_svg_example.py | 2 +- examples/uplot_tickparameters.py | 6 +++--- examples/uplot_uboxplot.py | 2 +- 48 files changed, 99 insertions(+), 99 deletions(-) rename circuitpython_uplot/{ucartesian.py => cartesian.py} (98%) rename circuitpython_uplot/{uplot.py => plot.py} (99%) rename docs/{uplot_ex11.jpg => uplot_cartesian_advance.jpg} (100%) rename examples/{uplot_ucartesian_advanced.py => uplot_cartesian_advanced.py} (72%) rename examples/{uplot_ucartesian_loggin_data.py => uplot_cartesian_loggin_data.py} (94%) rename examples/{uplot_ucartesian_table.py => uplot_cartesian_table.py} (92%) diff --git a/.pylintrc b/.pylintrc index 0d186f0..4408bdc 100644 --- a/.pylintrc +++ b/.pylintrc @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,fillbetween,ucartesian,y2,map,pie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,fillbetween,cartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ diff --git a/circuitpython_uplot/bar.py b/circuitpython_uplot/bar.py index 2e28749..04e8e4b 100644 --- a/circuitpython_uplot/bar.py +++ b/circuitpython_uplot/bar.py @@ -15,7 +15,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from math import sin, cos, ceil @@ -37,7 +37,7 @@ class Bar: def __init__( self, - plot: Uplot, + plot: Plot, x: list, y: list, color: int = 0xFFFFFF, @@ -49,7 +49,7 @@ def __init__( max_value=None, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list x: x data :param list y: y data :param int color: boxes color. Defaults to const:``0xFFFFFF`` @@ -233,7 +233,7 @@ def _create_projections(self, xstart: int, indice: int, color_lenght: int): ) def _draw_rectangle( - self, plot: Uplot, x: int, y: int, width: int, height: int, color: int + self, plot: Plot, x: int, y: int, width: int, height: int, color: int ) -> None: """ Helper function to draw bins rectangles diff --git a/circuitpython_uplot/ucartesian.py b/circuitpython_uplot/cartesian.py similarity index 98% rename from circuitpython_uplot/ucartesian.py rename to circuitpython_uplot/cartesian.py index e16bf04..9f672ab 100644 --- a/circuitpython_uplot/ucartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -4,7 +4,7 @@ """ -`ucartesian` +`cartesian` ================================================================================ CircuitPython cartesian graph @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from bitmaptools import draw_line, fill_region @@ -26,7 +26,7 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ucartesian: +class Cartesian: """ Class to draw cartesian plane """ diff --git a/circuitpython_uplot/fillbetween.py b/circuitpython_uplot/fillbetween.py index 094711f..195af92 100644 --- a/circuitpython_uplot/fillbetween.py +++ b/circuitpython_uplot/fillbetween.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from ulab import numpy as np diff --git a/circuitpython_uplot/logging.py b/circuitpython_uplot/logging.py index 9037812..c0c38b1 100644 --- a/circuitpython_uplot/logging.py +++ b/circuitpython_uplot/logging.py @@ -15,7 +15,7 @@ """ try: from typing import Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from bitmaptools import draw_line, fill_region diff --git a/circuitpython_uplot/map.py b/circuitpython_uplot/map.py index e8526e1..fddb493 100644 --- a/circuitpython_uplot/map.py +++ b/circuitpython_uplot/map.py @@ -15,7 +15,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass diff --git a/circuitpython_uplot/pie.py b/circuitpython_uplot/pie.py index 85e5653..d5461e0 100644 --- a/circuitpython_uplot/pie.py +++ b/circuitpython_uplot/pie.py @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass diff --git a/circuitpython_uplot/uplot.py b/circuitpython_uplot/plot.py similarity index 99% rename from circuitpython_uplot/uplot.py rename to circuitpython_uplot/plot.py index 20e1eb4..1ef9705 100644 --- a/circuitpython_uplot/uplot.py +++ b/circuitpython_uplot/plot.py @@ -4,7 +4,7 @@ """ -`uplot` +`plot` ================================================================================ CircuitPython Plot Class @@ -41,7 +41,7 @@ __repo__ = "https://github.com/jposada202020/CircuitPython_uplot.git" -class Uplot(displayio.Group): +class Plot(displayio.Group): """ Canvas Class to add different elements to the screen. The origin point set by ``x`` and ``y`` properties diff --git a/circuitpython_uplot/polar.py b/circuitpython_uplot/polar.py index ec90947..e161985 100644 --- a/circuitpython_uplot/polar.py +++ b/circuitpython_uplot/polar.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from bitmaptools import draw_line, draw_circle diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index 944c513..1f55a5f 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -16,7 +16,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass diff --git a/circuitpython_uplot/shade.py b/circuitpython_uplot/shade.py index 5034198..f6953f3 100644 --- a/circuitpython_uplot/shade.py +++ b/circuitpython_uplot/shade.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from ulab import numpy as np diff --git a/circuitpython_uplot/svg.py b/circuitpython_uplot/svg.py index 9293ba4..6abaf6d 100644 --- a/circuitpython_uplot/svg.py +++ b/circuitpython_uplot/svg.py @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Uplot except ImportError: pass from bitmaptools import draw_line diff --git a/docs/api.rst b/docs/api.rst index 3bb2cfc..1e052b5 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -13,7 +13,7 @@ Uplot Library .. automodule:: circuitpython_uplot.pie :members: -.. automodule:: circuitpython_uplot.ucartesian +.. automodule:: circuitpython_uplot.cartesian :members: .. automodule:: circuitpython_uplot.fillbetween diff --git a/docs/examples.rst b/docs/examples.rst index c1ac8ef..1554c70 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -137,18 +137,18 @@ Cartesian Advanced Example Showing the ability to display to graphs in the same plot with different colors -.. literalinclude:: ../examples/uplot_ucartesian_advanced.py - :caption: examples/uplot_ucartesian_advanced.py +.. literalinclude:: ../examples/uplot_cartesian_advanced.py + :caption: examples/uplot_cartesian_advanced.py :lines: 5- -.. image:: ../docs/uplot_ex11.jpg +.. image:: ../docs/uplot_cartesian_advance.jpg Cartesian Table Example --------------------------- Example showing how to add a data table to the plot -.. literalinclude:: ../examples/uplot_ucartesian_table.py - :caption: examples/uplot_ucartesian_table.py +.. literalinclude:: ../examples/uplot_cartesian_table.py + :caption: examples/uplot_cartesian_table.py :lines: 5- Lissajous Curves Example @@ -235,8 +235,8 @@ Cartesian Animation Example Cartesian animation example -.. literalinclude:: ../examples/uplot_ucartesian_loggin_data.py - :caption: examples/uplot_ucartesian_loggin_data.py +.. literalinclude:: ../examples/uplot_cartesian_loggin_data.py + :caption: examples/uplot_cartesian_loggin_data.py :lines: 5- .. image:: ../docs/uplot_cartesian.gif diff --git a/docs/quick_start.rst b/docs/quick_start.rst index b41cc8b..a16c8de 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -172,7 +172,7 @@ to the `ulab` library from ulab import numpy as np from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ucartesian import ucartesian + from circuitpython_uplot.cartesian import Cartesian display = board.DISPLAY plot = Uplot(0, 0, display.width, display.height) @@ -184,7 +184,7 @@ After the initial setup we add our xy plane and show our plot .. code-block:: python - ucartesian(plot, x, y) + Cartesian(plot, x, y) display.show(plot) @@ -203,7 +203,7 @@ the y axis to [0, 1], line color to Green :const:`0x00FF00` and no filling x = np.linspace(-3, 3, num=50) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 2.0) - ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) + Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) if you want to add more than un line to your plot, you could do something like this: @@ -214,8 +214,8 @@ if you want to add more than un line to your plot, you could do something like t x = np.linspace(-4, 4, num=25) y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x - ucartesian(plot, x, y1) - ucartesian(plot, x, y1) + Cartesian(plot, x, y1) + Cartesian(plot, x, y1) display.show(plot) diff --git a/docs/uplot_ex11.jpg b/docs/uplot_cartesian_advance.jpg similarity index 100% rename from docs/uplot_ex11.jpg rename to docs/uplot_cartesian_advance.jpg diff --git a/examples/uplot_bar_3Dbars.py b/examples/uplot_bar_3Dbars.py index a2c626c..4b5aa75 100644 --- a/examples/uplot_bar_3Dbars.py +++ b/examples/uplot_bar_3Dbars.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.bar import Bar diff --git a/examples/uplot_bar_color_changing.py b/examples/uplot_bar_color_changing.py index 0eb03cc..3223432 100644 --- a/examples/uplot_bar_color_changing.py +++ b/examples/uplot_bar_color_changing.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.bar import Bar # Setting up the display diff --git a/examples/uplot_bar_colorpalette.py b/examples/uplot_bar_colorpalette.py index cabe811..98056f6 100644 --- a/examples/uplot_bar_colorpalette.py +++ b/examples/uplot_bar_colorpalette.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.bar import Bar # Setting up the display diff --git a/examples/uplot_bar_example.py b/examples/uplot_bar_example.py index 3c8b5bc..49e3cd6 100644 --- a/examples/uplot_bar_example.py +++ b/examples/uplot_bar_example.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.bar import Bar diff --git a/examples/uplot_bar_scale_example.py b/examples/uplot_bar_scale_example.py index 635d1ed..4cf9c45 100644 --- a/examples/uplot_bar_scale_example.py +++ b/examples/uplot_bar_scale_example.py @@ -5,7 +5,7 @@ import time import board import displayio -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.bar import Bar # from uplot_examples import u8 diff --git a/examples/uplot_bar_updating_values.py b/examples/uplot_bar_updating_values.py index 63684d1..7b69fbd 100644 --- a/examples/uplot_bar_updating_values.py +++ b/examples/uplot_bar_updating_values.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.bar import Bar # Setting up the display diff --git a/examples/uplot_ucartesian_advanced.py b/examples/uplot_cartesian_advanced.py similarity index 72% rename from examples/uplot_ucartesian_advanced.py rename to examples/uplot_cartesian_advanced.py index 69d26dc..9a1c2bc 100644 --- a/examples/uplot_ucartesian_advanced.py +++ b/examples/uplot_cartesian_advanced.py @@ -5,8 +5,8 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY @@ -18,13 +18,13 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000) +Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000) # Creating some points to graph x = np.linspace(-3, 3, num=50) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 2.0) -ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) +Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) # Plotting and showing the plot display.show(plot) diff --git a/examples/uplot_ucartesian_loggin_data.py b/examples/uplot_cartesian_loggin_data.py similarity index 94% rename from examples/uplot_ucartesian_loggin_data.py rename to examples/uplot_cartesian_loggin_data.py index dbe890a..c7ddd79 100644 --- a/examples/uplot_ucartesian_loggin_data.py +++ b/examples/uplot_cartesian_loggin_data.py @@ -8,8 +8,8 @@ import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY @@ -83,7 +83,7 @@ display.refresh() for i, element in enumerate(x): - ucartesian( + Cartesian( plot_1, x[0:i], temp_y[0:i], @@ -93,7 +93,7 @@ line_color=color.BLACK, logging=True, ) - ucartesian( + Cartesian( plot_2, x[0:i], humidity_y[0:i], diff --git a/examples/uplot_ucartesian_table.py b/examples/uplot_cartesian_table.py similarity index 92% rename from examples/uplot_ucartesian_table.py rename to examples/uplot_cartesian_table.py index f7850a6..cf042fb 100644 --- a/examples/uplot_ucartesian_table.py +++ b/examples/uplot_cartesian_table.py @@ -6,8 +6,8 @@ import board from ulab import numpy as np from table import Table -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade @@ -101,7 +101,7 @@ def heat_index(temp, humidity): # Drawing the graphs for i in range(40, 110, 10): - ucartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) + Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) g.append(plot) diff --git a/examples/uplot_display_shapes.py b/examples/uplot_display_shapes.py index bb215c1..0994a2f 100644 --- a/examples/uplot_display_shapes.py +++ b/examples/uplot_display_shapes.py @@ -6,7 +6,7 @@ import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot # Setting up the display display = board.DISPLAY diff --git a/examples/uplot_fillbetween.py b/examples/uplot_fillbetween.py index 340e6e9..c530f02 100644 --- a/examples/uplot_fillbetween.py +++ b/examples/uplot_fillbetween.py @@ -5,7 +5,7 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.fillbetween import Fillbetween diff --git a/examples/uplot_integration_example.py b/examples/uplot_integration_example.py index 2252395..3ee22b1 100644 --- a/examples/uplot_integration_example.py +++ b/examples/uplot_integration_example.py @@ -5,8 +5,8 @@ import board from ulab import numpy as np from uhistogram import Histogram -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.cartesian import Cartesian # Setting Up the histogram data = [5, 4, 3, 2, 7, 5, 3, 3, 3, 3, 2, 9, 7, 6] @@ -25,7 +25,7 @@ y = constant * np.exp((-(x**2)) / 2.0) # Plotting and showing the plot -ucartesian(plot, x, y) +Cartesian(plot, x, y) # Adding a circle plot.draw_circle(radius=8, x=120, y=120) diff --git a/examples/uplot_lissajous_curves.py b/examples/uplot_lissajous_curves.py index bbdf3c7..34ddbc7 100644 --- a/examples/uplot_lissajous_curves.py +++ b/examples/uplot_lissajous_curves.py @@ -5,8 +5,8 @@ import math import board import displayio -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.cartesian import Cartesian # Inspired by Paul McWhorter Raspberry Pi Pico W LESSON 27: Creating Lissajous Patterns # on an OLED Display @@ -57,7 +57,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): # Creating the Plots x_number_list, y_number_list = create_curve(1, 2, 10) -ucartesian( +Cartesian( plot, x_number_list, y_number_list, @@ -67,7 +67,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(3, 2, 10) -ucartesian( +Cartesian( plot2, x_number_list, y_number_list, @@ -77,7 +77,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(3, 4, 10) -ucartesian( +Cartesian( plot3, x_number_list, y_number_list, @@ -87,7 +87,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(5, 4, 10) -ucartesian( +Cartesian( plot4, x_number_list, y_number_list, diff --git a/examples/uplot_logging.py b/examples/uplot_logging.py index 404cb25..deebad6 100644 --- a/examples/uplot_logging.py +++ b/examples/uplot_logging.py @@ -6,7 +6,7 @@ import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.logging import Logging # Setting up the display diff --git a/examples/uplot_logging_animation.py b/examples/uplot_logging_animation.py index f824bd6..7296201 100644 --- a/examples/uplot_logging_animation.py +++ b/examples/uplot_logging_animation.py @@ -6,7 +6,7 @@ import time import random import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.logging import Logging # Setting up the display diff --git a/examples/uplot_logging_changing_values.py b/examples/uplot_logging_changing_values.py index 37782cc..cc1f277 100644 --- a/examples/uplot_logging_changing_values.py +++ b/examples/uplot_logging_changing_values.py @@ -5,7 +5,7 @@ import time import displayio import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.logging import Logging # Setting up the display diff --git a/examples/uplot_logging_fill.py b/examples/uplot_logging_fill.py index ee22c09..15be1c9 100644 --- a/examples/uplot_logging_fill.py +++ b/examples/uplot_logging_fill.py @@ -4,7 +4,7 @@ import displayio import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.logging import Logging # Setting up the display diff --git a/examples/uplot_logging_table.py b/examples/uplot_logging_table.py index c1e5c15..d8d399a 100644 --- a/examples/uplot_logging_table.py +++ b/examples/uplot_logging_table.py @@ -11,7 +11,7 @@ import displayio import board from table import Table -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.logging import Logging # Create a display object diff --git a/examples/uplot_map.py b/examples/uplot_map.py index 088feba..462a934 100644 --- a/examples/uplot_map.py +++ b/examples/uplot_map.py @@ -6,7 +6,7 @@ from random import choice import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.map import Map diff --git a/examples/uplot_pie_example.py b/examples/uplot_pie_example.py index 0b92747..6ea238f 100644 --- a/examples/uplot_pie_example.py +++ b/examples/uplot_pie_example.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.pie import upie diff --git a/examples/uplot_plot_example.py b/examples/uplot_plot_example.py index 2c64ac8..afa844d 100644 --- a/examples/uplot_plot_example.py +++ b/examples/uplot_plot_example.py @@ -5,8 +5,8 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY @@ -20,7 +20,7 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y) +Cartesian(plot, x, y) display.show(plot) while True: diff --git a/examples/uplot_polar_example.py b/examples/uplot_polar_example.py index d3932ec..9a2865b 100644 --- a/examples/uplot_polar_example.py +++ b/examples/uplot_polar_example.py @@ -4,7 +4,7 @@ import board import ulab.numpy as np -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.polar import Polar # Setting up the display diff --git a/examples/uplot_polar_plots.py b/examples/uplot_polar_plots.py index d9e8b3b..24665ad 100644 --- a/examples/uplot_polar_plots.py +++ b/examples/uplot_polar_plots.py @@ -5,8 +5,8 @@ import board import displayio import ulab.numpy as np -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.cartesian import Cartesian # Inspired by # https://github.com/CodeDrome/polar-plots-python @@ -86,13 +86,13 @@ def circle_function(angle_range=[0, 360], radius=35): x, y = rose_function(n=3, angle_range=[0, 360], radius=35) -ucartesian(plot, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=0xE30B5D) +Cartesian(plot, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=0xE30B5D) x, y = spiral_function(a=1, b=3, angle_range=[0, 900]) -ucartesian(plot2, x, y, rangex=[-50, 50], rangey=[-50, 50], line_color=color.YELLOW) +Cartesian(plot2, x, y, rangex=[-50, 50], rangey=[-50, 50], line_color=color.YELLOW) x, y = cardioid_function(angle_range=[0, 360], radius=35) -ucartesian(plot3, x, y, rangex=[-15, 75], rangey=[-50, 50], line_color=color.TEAL) +Cartesian(plot3, x, y, rangex=[-15, 75], rangey=[-50, 50], line_color=color.TEAL) x, y = circle_function(angle_range=[0, 360], radius=35) -ucartesian(plot4, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=color.ORANGE) +Cartesian(plot4, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=color.ORANGE) diff --git a/examples/uplot_readme_example.py b/examples/uplot_readme_example.py index 2dd23bc..8b6efa4 100644 --- a/examples/uplot_readme_example.py +++ b/examples/uplot_readme_example.py @@ -6,11 +6,11 @@ import board import displayio from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.bar import Bar from circuitpython_uplot.scatter import Scatter from circuitpython_uplot.pie import Pie -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.cartesian import Cartesian display = board.DISPLAY @@ -26,7 +26,7 @@ x = np.linspace(-4, 4, num=25) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 4.0) -ucartesian(plot2, x, y, rangex=[-5, 5], rangey=[0, 1]) +Cartesian(plot2, x, y, rangex=[-5, 5], rangey=[0, 1]) plot.append(plot2) plot3 = Uplot(130, 0, 160, 160) @@ -40,7 +40,7 @@ y = constant * np.exp((-(x**2)) / 2.0) # Plotting and showing the plot -ucartesian(plot3, x, y, rangex=[-5, 5], rangey=[0, 0.5]) +Cartesian(plot3, x, y, rangex=[-5, 5], rangey=[0, 0.5]) plot.append(plot3) plot4 = Uplot(290, 0, 150, 150) @@ -80,13 +80,13 @@ x = np.linspace(1, 10, num=10) y = [6, 7, 9, 6, 9, 7, 6, 6, 8, 9] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) y = [4, 3, 7, 8, 3, 9, 3, 2, 1, 2] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) y = [1, 4, 6, 3, 6, 6, 5, 0, 9, 2] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) plot.append(plot7) diff --git a/examples/uplot_scatter.py b/examples/uplot_scatter.py index 9994bd0..8782450 100644 --- a/examples/uplot_scatter.py +++ b/examples/uplot_scatter.py @@ -6,7 +6,7 @@ from random import choice import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot from circuitpython_uplot.scatter import Scatter diff --git a/examples/uplot_shade_example.py b/examples/uplot_shade_example.py index e6ec3e6..f3bf477 100644 --- a/examples/uplot_shade_example.py +++ b/examples/uplot_shade_example.py @@ -5,8 +5,8 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade # This example is based in the following Library @@ -97,7 +97,7 @@ def heat_index(temp, humidity): # Drawing the graphs for i in range(40, 110, 10): - ucartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) + Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) display.show(plot) while True: diff --git a/examples/uplot_simpletest.py b/examples/uplot_simpletest.py index 80a2726..0063af9 100644 --- a/examples/uplot_simpletest.py +++ b/examples/uplot_simpletest.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot # Setting up the display display = board.DISPLAY diff --git a/examples/uplot_sparkline.py b/examples/uplot_sparkline.py index 2fd105e..b5366f7 100644 --- a/examples/uplot_sparkline.py +++ b/examples/uplot_sparkline.py @@ -6,7 +6,7 @@ import board from ulab import numpy as np from adafruit_display_shapes.sparkline import Sparkline -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color # Setting up the display diff --git a/examples/uplot_stackplot.py b/examples/uplot_stackplot.py index 4e03bb6..6239758 100644 --- a/examples/uplot_stackplot.py +++ b/examples/uplot_stackplot.py @@ -8,8 +8,8 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY @@ -19,13 +19,13 @@ x = np.linspace(1, 10, num=10) y = [6, 7, 9, 6, 9, 7, 6, 6, 8, 9] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) y = [4, 3, 7, 8, 3, 9, 3, 2, 1, 2] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) y = [1, 4, 6, 3, 6, 6, 5, 0, 9, 2] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) display.show(plot) diff --git a/examples/uplot_svg_example.py b/examples/uplot_svg_example.py index 65c7d4e..7aba1d1 100644 --- a/examples/uplot_svg_example.py +++ b/examples/uplot_svg_example.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT import board -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Uplot, color from circuitpython_uplot.svg import SVG from circuitpython_uplot.icons import FULL, Humidity, Temperature, Temperature2 diff --git a/examples/uplot_tickparameters.py b/examples/uplot_tickparameters.py index 0d99895..a77d414 100644 --- a/examples/uplot_tickparameters.py +++ b/examples/uplot_tickparameters.py @@ -5,8 +5,8 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.cartesian import Cartesian # Setting up the display @@ -30,7 +30,7 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y, line_color=color.BLACK) +Cartesian(plot, x, y, line_color=color.BLACK) # Plotting and showing the plot display.show(plot) diff --git a/examples/uplot_uboxplot.py b/examples/uplot_uboxplot.py index 7f6ae46..eb245bd 100644 --- a/examples/uplot_uboxplot.py +++ b/examples/uplot_uboxplot.py @@ -7,7 +7,7 @@ import board from uboxplot import Boxplot -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Uplot display = board.DISPLAY From a39ec1e4980fd6d500d7859eb2e0a5940d6668a2 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 15:02:05 -0400 Subject: [PATCH 09/61] plot name change --- circuitpython_uplot/cartesian.py | 6 +- circuitpython_uplot/fillbetween.py | 6 +- circuitpython_uplot/logging.py | 14 ++--- circuitpython_uplot/map.py | 6 +- circuitpython_uplot/pie.py | 6 +- circuitpython_uplot/polar.py | 6 +- circuitpython_uplot/scatter.py | 4 +- circuitpython_uplot/shade.py | 6 +- circuitpython_uplot/svg.py | 6 +- docs/api.rst | 2 +- docs/quick_start.rst | 68 +++++++++++------------ examples/uplot_bar_3Dbars.py | 4 +- examples/uplot_bar_color_changing.py | 4 +- examples/uplot_bar_colorpalette.py | 4 +- examples/uplot_bar_example.py | 4 +- examples/uplot_bar_scale_example.py | 7 +-- examples/uplot_bar_updating_values.py | 4 +- examples/uplot_cartesian_advanced.py | 4 +- examples/uplot_cartesian_loggin_data.py | 8 +-- examples/uplot_cartesian_table.py | 4 +- examples/uplot_display_shapes.py | 4 +- examples/uplot_fillbetween.py | 4 +- examples/uplot_integration_example.py | 4 +- examples/uplot_lissajous_curves.py | 10 ++-- examples/uplot_logging.py | 6 +- examples/uplot_logging_animation.py | 4 +- examples/uplot_logging_changing_values.py | 6 +- examples/uplot_logging_fill.py | 6 +- examples/uplot_logging_table.py | 4 +- examples/uplot_map.py | 4 +- examples/uplot_pie_example.py | 4 +- examples/uplot_plot_example.py | 4 +- examples/uplot_polar_example.py | 4 +- examples/uplot_polar_plots.py | 10 ++-- examples/uplot_readme_example.py | 16 +++--- examples/uplot_scatter.py | 4 +- examples/uplot_shade_example.py | 4 +- examples/uplot_simpletest.py | 4 +- examples/uplot_sparkline.py | 4 +- examples/uplot_stackplot.py | 4 +- examples/uplot_svg_example.py | 4 +- examples/uplot_tickparameters.py | 4 +- examples/uplot_uboxplot.py | 6 +- 43 files changed, 148 insertions(+), 149 deletions(-) diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 9f672ab..6ec7c33 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line, fill_region @@ -33,7 +33,7 @@ class Cartesian: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y: Union[list, np.linspace, np.ndarray], rangex: Optional[list] = None, @@ -45,7 +45,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y: y points coordinates :param list|None rangex: x range limits. Defaults to None diff --git a/circuitpython_uplot/fillbetween.py b/circuitpython_uplot/fillbetween.py index 195af92..d2f170a 100644 --- a/circuitpython_uplot/fillbetween.py +++ b/circuitpython_uplot/fillbetween.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from ulab import numpy as np @@ -33,7 +33,7 @@ class Fillbetween: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y1: Union[list, np.linspace, np.ndarray], y2: Union[list, np.linspace, np.ndarray], @@ -43,7 +43,7 @@ def __init__( nudge: bool = True, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y1: y1 points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y2: y2 points coordinates diff --git a/circuitpython_uplot/logging.py b/circuitpython_uplot/logging.py index c0c38b1..6cc081e 100644 --- a/circuitpython_uplot/logging.py +++ b/circuitpython_uplot/logging.py @@ -15,7 +15,7 @@ """ try: from typing import Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line, fill_region @@ -32,7 +32,7 @@ class Logging: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y: Union[list, np.linspace, np.ndarray], rangex: list, @@ -45,7 +45,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the log to be drawn + :param Plot plot: Plot object for the log to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y: y points coordinates :param list|None rangex: x range limits. Defaults to None @@ -140,10 +140,10 @@ def clear_plot(plot) -> None: 0, ) - def draw_points(self, plot: Uplot, x: list, y: list, fill: bool = False) -> None: + def draw_points(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: """ Draws points in the plot - :param Uplot plot: plot object provided + :param Plot plot: plot object provided :param list x: list of x values :param list y: list of y values :param bool fill: parameter to fill the plot graphic. Defaults to False @@ -153,10 +153,10 @@ def draw_points(self, plot: Uplot, x: list, y: list, fill: bool = False) -> None self.draw_new_lines(plot, x, y, fill) - def draw_new_lines(self, plot: Uplot, x: list, y: list, fill: bool = False) -> None: + def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: """ Draw the plot lines - :param Uplot plot: plot object provided + :param Plot plot: plot object provided :param list x: list of x values :param list y: list of y values :param bool fill: parameter to fill the plot graphic. Defaults to False diff --git a/circuitpython_uplot/map.py b/circuitpython_uplot/map.py index fddb493..fb9f286 100644 --- a/circuitpython_uplot/map.py +++ b/circuitpython_uplot/map.py @@ -15,7 +15,7 @@ """ try: - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass @@ -34,14 +34,14 @@ class Map: def __init__( self, - plot: Uplot, + plot: Plot, data_points: np.ndarray, initial_color: int, final_color: int, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param np.array data_points: data points to create the color map :param int initial_color: initial color to create the color map :param int final_color: final color to create the color map diff --git a/circuitpython_uplot/pie.py b/circuitpython_uplot/pie.py index d5461e0..02bcb8a 100644 --- a/circuitpython_uplot/pie.py +++ b/circuitpython_uplot/pie.py @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass @@ -32,11 +32,11 @@ class Pie: """ def __init__( - self, plot: Uplot, data: list, x: int = 0, y: int = 0, radius: int = 40 + self, plot: Plot, data: list, x: int = 0, y: int = 0, radius: int = 40 ) -> None: """ - :param Uplot plot: Plot object for the pie to be drawn + :param Plot plot: Plot object for the pie to be drawn :param list data: data to make the pie :param int x: pie center x coordinate :param int y: pie center y coordinate diff --git a/circuitpython_uplot/polar.py b/circuitpython_uplot/polar.py index e161985..c4ab576 100644 --- a/circuitpython_uplot/polar.py +++ b/circuitpython_uplot/polar.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line, draw_circle @@ -33,7 +33,7 @@ class Polar: def __init__( self, - plot: Uplot, + plot: Plot, radius: Union[list, np.linspace, np.ndarray], theta: Union[list, np.linspace, np.ndarray], rangex: Optional[list] = None, @@ -45,7 +45,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray radius: radius points :param list|ulab.numpy.linspace|ulab.numpy.ndarray theta: theta points :param list|None rangex: x range limits. Defaults to None diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index 1f55a5f..d8e21df 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -16,7 +16,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass @@ -36,7 +36,7 @@ class Scatter: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y: Union[list, np.linspace, np.ndarray], rangex: Optional[list] = None, diff --git a/circuitpython_uplot/shade.py b/circuitpython_uplot/shade.py index f6953f3..de6ebb8 100644 --- a/circuitpython_uplot/shade.py +++ b/circuitpython_uplot/shade.py @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from ulab import numpy as np @@ -33,7 +33,7 @@ class shade: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y1: list, y2: list, @@ -43,7 +43,7 @@ def __init__( nudge: bool = True, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list y1: y1 points coordinates :param list y2: y2 points coordinates diff --git a/circuitpython_uplot/svg.py b/circuitpython_uplot/svg.py index 6abaf6d..b73f203 100644 --- a/circuitpython_uplot/svg.py +++ b/circuitpython_uplot/svg.py @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.plot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line @@ -33,7 +33,7 @@ class to render svg images in the plot area def __init__( self, - plot: Uplot, + plot: Plot, icon: dict, x: int, y: int, @@ -42,7 +42,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the log to be drawn + :param Plot plot: Plot object for the log to be drawn :param dictionary icon: icon dictionary :param int x: x position for the svg image :param int y: y position for the svg image diff --git a/docs/api.rst b/docs/api.rst index 1e052b5..5694701 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,7 +1,7 @@ Uplot Library ============== -.. automodule:: circuitpython_uplot.uplot +.. automodule:: circuitpython_uplot.plot :members: .. automodule:: circuitpython_uplot.scatter diff --git a/docs/quick_start.rst b/docs/quick_start.rst index a16c8de..cee931c 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -3,13 +3,13 @@ A small tour for uplot. Plot Usage ============= -We start importing some fundamental libraries for uplot to operate +We start importing some fundamental libraries for plot to operate .. code-block:: python import board import displayio - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot For reference, screen in CircuitPython are defined from left to right and up to bottom. This means that our (x=0, y=0) will be in the left upper corner of the screen. @@ -25,9 +25,9 @@ We add the plot area. in this case we are selecting the whole screen as our plot .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) -The Uplot will be used to display our graphics. The position and the size of the plot area +The Plot will be used to display our graphics. The position and the size of the plot area could vary. This allows us to have more than 1 plot at the same time in the screen. Every one of them with different characteristics or graphs. @@ -80,10 +80,10 @@ library import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) roundrect = RoundRect(30, 30, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) plot.append(roundrect) display.show(plot) @@ -93,9 +93,9 @@ library Ticks and Grid =============== Plot axes are shown by default. To change this behaviour you would need -to use the correct keyword in the `Uplot.axs_params` function: +to use the correct keyword in the `Plot.axs_params` function: -.. py:function:: Uplot.axs_params(axstype: Literal["box", "cartesian", "line"] = "box") +.. py:function:: Plot.axs_params(axstype: Literal["box", "cartesian", "line"] = "box") :param axstype: Option to display the axes @@ -108,13 +108,13 @@ The following snippet shows how to create a cartesian plot .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) plot.axs_params(axstype="cartesian") Tick spacing and numbers are selected by default. However it's possible to customize the following parameters: -.. py:function:: Uplot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid) +.. py:function:: Plot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid) :param int tickx_height: tickx_height in pixels :param int ticky_height: ticky_height in pixels @@ -139,7 +139,7 @@ You can choose some colors directly from the library. This can be done by import .. code-block:: python - from circuitpython_uplot.uplot import color + from circuitpython_uplot.plot import color This will allow you to use the colors in the list as color variable definitions * WHITE @@ -155,7 +155,7 @@ This will allow you to use the colors in the list as color variable definitions .. code-block:: python - plot = Uplot(0, 0, display.width, display.height, background_color=color.WHITE, box_color=color.BLACK) + plot = Plot(0, 0, display.width, display.height, background_color=color.WHITE, box_color=color.BLACK) @@ -171,10 +171,10 @@ to the `ulab` library .. code-block:: python from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = np.linspace(-4, 4, num=25) constant = 1.0 / np.sqrt(2 * np.pi) @@ -210,7 +210,7 @@ if you want to add more than un line to your plot, you could do something like t .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = np.linspace(-4, 4, num=25) y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x @@ -223,17 +223,17 @@ if you want to add more than un line to your plot, you could do something like t Pie Chart =============== -You can easily create Pie charts with uplot. Pie Charts are limited to 6 elements as per the automatic coloring. +You can easily create Pie charts with plot. Pie Charts are limited to 6 elements as per the automatic coloring. To make the Pie Chart the data needs to be in a python list form. The library will take care of the rest .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.pie import Pie display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = [5, 2, 7, 3] Pie(plot, a) display.show(plot) @@ -251,11 +251,11 @@ Creates a scatter plot with x,y data. You can customize the circle diameter if y from random import choice import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.scatter import Scatter display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = np.linspace(1, 100) b = [choice(a) for _ in a] @@ -287,11 +287,11 @@ You can choose to create shell or filled bars. .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] @@ -318,11 +318,11 @@ This will not work for shell bars sadly. .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) Bar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) @@ -332,11 +332,11 @@ appearance .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.bar import bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] @@ -351,11 +351,11 @@ according to this max value, and bar plot will update their values accordingly .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] @@ -397,13 +397,13 @@ it will fill the area between two curves: import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot from circuitpython_uplot.fillbetween import Fillbetween display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = np.linspace(0, 8, num=25) @@ -425,13 +425,13 @@ You can choose the initial and final colors for the color map. import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot from circuitpython_uplot.map import Map display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height, show_box=False) + plot = Plot(0, 0, display.width, display.height, show_box=False) x = np.array( [ @@ -467,7 +467,7 @@ There are some parameters that you can customize: .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = [10, 20, 30, 40, 50] temp_y = [10, 15, 35, 10, 25] @@ -501,6 +501,6 @@ For example, if you want to load the Temperature icon with a scale of 2 from circuitpython_uplot.icons import Temperature display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) SVG(plot, Temperature, 250, 50, 2) display.show(plot) diff --git a/examples/uplot_bar_3Dbars.py b/examples/uplot_bar_3Dbars.py index 4b5aa75..907de9b 100644 --- a/examples/uplot_bar_3Dbars.py +++ b/examples/uplot_bar_3Dbars.py @@ -4,14 +4,14 @@ import time import board -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") diff --git a/examples/uplot_bar_color_changing.py b/examples/uplot_bar_color_changing.py index 3223432..65823ad 100644 --- a/examples/uplot_bar_color_changing.py +++ b/examples/uplot_bar_color_changing.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.bar import Bar # Setting up the display @@ -15,7 +15,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, diff --git a/examples/uplot_bar_colorpalette.py b/examples/uplot_bar_colorpalette.py index 98056f6..6fa245e 100644 --- a/examples/uplot_bar_colorpalette.py +++ b/examples/uplot_bar_colorpalette.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.bar import Bar # Setting up the display @@ -14,7 +14,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, diff --git a/examples/uplot_bar_example.py b/examples/uplot_bar_example.py index 49e3cd6..4345cfd 100644 --- a/examples/uplot_bar_example.py +++ b/examples/uplot_bar_example.py @@ -4,14 +4,14 @@ import time import board -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") diff --git a/examples/uplot_bar_scale_example.py b/examples/uplot_bar_scale_example.py index 4cf9c45..fb7a90f 100644 --- a/examples/uplot_bar_scale_example.py +++ b/examples/uplot_bar_scale_example.py @@ -5,10 +5,9 @@ import time import board import displayio -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar -# from uplot_examples import u8 # Setting up the display display = board.DISPLAY @@ -16,8 +15,8 @@ group = displayio.Group() # Creating the plot objects -plot_scale1 = Uplot(0, 0, 100, 100, 1, scale=1) -plot_scale2 = Uplot(125, 0, 100, 100, 1, scale=2) +plot_scale1 = Plot(0, 0, 100, 100, 1, scale=1) +plot_scale2 = Plot(125, 0, 100, 100, 1, scale=2) # Creating the data a = ["a", "b", "c", "d"] diff --git a/examples/uplot_bar_updating_values.py b/examples/uplot_bar_updating_values.py index 7b69fbd..6f4bf27 100644 --- a/examples/uplot_bar_updating_values.py +++ b/examples/uplot_bar_updating_values.py @@ -4,7 +4,7 @@ import time import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.bar import Bar # Setting up the display @@ -15,7 +15,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, diff --git a/examples/uplot_cartesian_advanced.py b/examples/uplot_cartesian_advanced.py index 9a1c2bc..4d2e51b 100644 --- a/examples/uplot_cartesian_advanced.py +++ b/examples/uplot_cartesian_advanced.py @@ -5,12 +5,12 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Creating some points to graph x = np.linspace(-4, 4, num=25) diff --git a/examples/uplot_cartesian_loggin_data.py b/examples/uplot_cartesian_loggin_data.py index c7ddd79..1937820 100644 --- a/examples/uplot_cartesian_loggin_data.py +++ b/examples/uplot_cartesian_loggin_data.py @@ -8,13 +8,13 @@ import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -41,7 +41,7 @@ g.append(text_humidity) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, @@ -52,7 +52,7 @@ background_color=color.WHITE, ) -plot_2 = Uplot( +plot_2 = Plot( 0, 180, 200, diff --git a/examples/uplot_cartesian_table.py b/examples/uplot_cartesian_table.py index cf042fb..142837d 100644 --- a/examples/uplot_cartesian_table.py +++ b/examples/uplot_cartesian_table.py @@ -6,7 +6,7 @@ import board from ulab import numpy as np from table import Table -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade @@ -42,7 +42,7 @@ def heat_index(temp, humidity): display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, padding=5) +plot = Plot(0, 0, display.width, display.height, padding=5) # Create a group to hold the objects g = displayio.Group() diff --git a/examples/uplot_display_shapes.py b/examples/uplot_display_shapes.py index 0994a2f..0d2686f 100644 --- a/examples/uplot_display_shapes.py +++ b/examples/uplot_display_shapes.py @@ -6,13 +6,13 @@ import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) diff --git a/examples/uplot_fillbetween.py b/examples/uplot_fillbetween.py index c530f02..696b7bb 100644 --- a/examples/uplot_fillbetween.py +++ b/examples/uplot_fillbetween.py @@ -5,14 +5,14 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.fillbetween import Fillbetween # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) x = np.linspace(0, 8, num=25) diff --git a/examples/uplot_integration_example.py b/examples/uplot_integration_example.py index 3ee22b1..0982a09 100644 --- a/examples/uplot_integration_example.py +++ b/examples/uplot_integration_example.py @@ -5,7 +5,7 @@ import board from ulab import numpy as np from uhistogram import Histogram -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian # Setting Up the histogram @@ -17,7 +17,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Seeting some date to plot x = np.linspace(-4, 4, num=50) diff --git a/examples/uplot_lissajous_curves.py b/examples/uplot_lissajous_curves.py index 34ddbc7..cc9272f 100644 --- a/examples/uplot_lissajous_curves.py +++ b/examples/uplot_lissajous_curves.py @@ -5,7 +5,7 @@ import math import board import displayio -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.cartesian import Cartesian # Inspired by Paul McWhorter Raspberry Pi Pico W LESSON 27: Creating Lissajous Patterns @@ -37,10 +37,10 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width // 2, display.height // 2, padding=1) -plot2 = Uplot(240, 0, display.width // 2, display.height // 2, padding=1) -plot3 = Uplot(0, 160, display.width // 2, display.height // 2, padding=1) -plot4 = Uplot(240, 160, display.width // 2, display.height // 2, padding=1) +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) g = displayio.Group() g.append(plot) g.append(plot2) diff --git a/examples/uplot_logging.py b/examples/uplot_logging.py index deebad6..69655a6 100644 --- a/examples/uplot_logging.py +++ b/examples/uplot_logging.py @@ -6,13 +6,13 @@ import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -38,7 +38,7 @@ text_humidity.anchored_position = 130, 0 g.append(text_humidity) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, diff --git a/examples/uplot_logging_animation.py b/examples/uplot_logging_animation.py index 7296201..60caa07 100644 --- a/examples/uplot_logging_animation.py +++ b/examples/uplot_logging_animation.py @@ -6,7 +6,7 @@ import time import random import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging # Setting up the display @@ -14,7 +14,7 @@ display.auto_refresh = False # Drawing the graph -my_plot = Uplot( +my_plot = Plot( 140, 60, 200, diff --git a/examples/uplot_logging_changing_values.py b/examples/uplot_logging_changing_values.py index cc1f277..945e4b9 100644 --- a/examples/uplot_logging_changing_values.py +++ b/examples/uplot_logging_changing_values.py @@ -5,13 +5,13 @@ import time import displayio import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -28,7 +28,7 @@ g.append(t) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, diff --git a/examples/uplot_logging_fill.py b/examples/uplot_logging_fill.py index 15be1c9..24a2d5e 100644 --- a/examples/uplot_logging_fill.py +++ b/examples/uplot_logging_fill.py @@ -4,7 +4,7 @@ import displayio import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging # Setting up the display @@ -16,7 +16,7 @@ palette = displayio.Palette(1) palette[0] = 0x000000 -plot_1 = Uplot( +plot_1 = Plot( 0, 0, 150, @@ -32,7 +32,7 @@ tickx_height=4, ticky_height=4, show_ticks=True, tickcolor=color.BLACK ) -plot_2 = Uplot( +plot_2 = Plot( 0, 150, 300, diff --git a/examples/uplot_logging_table.py b/examples/uplot_logging_table.py index d8d399a..962fee3 100644 --- a/examples/uplot_logging_table.py +++ b/examples/uplot_logging_table.py @@ -11,7 +11,7 @@ import displayio import board from table import Table -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging # Create a display object @@ -39,7 +39,7 @@ g = displayio.Group() # Create a plot object -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, diff --git a/examples/uplot_map.py b/examples/uplot_map.py index 462a934..4eaacc1 100644 --- a/examples/uplot_map.py +++ b/examples/uplot_map.py @@ -6,7 +6,7 @@ from random import choice import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.map import Map @@ -14,7 +14,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, show_box=False) +plot = Plot(0, 0, display.width, display.height, show_box=False) # Setting some date to plot x = np.linspace(-4, 4, num=100) diff --git a/examples/uplot_pie_example.py b/examples/uplot_pie_example.py index 6ea238f..69dac92 100644 --- a/examples/uplot_pie_example.py +++ b/examples/uplot_pie_example.py @@ -4,14 +4,14 @@ import time import board -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.pie import upie # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") diff --git a/examples/uplot_plot_example.py b/examples/uplot_plot_example.py index afa844d..effe84e 100644 --- a/examples/uplot_plot_example.py +++ b/examples/uplot_plot_example.py @@ -5,14 +5,14 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Creating some points to graph x = np.linspace(-4, 4, num=25) diff --git a/examples/uplot_polar_example.py b/examples/uplot_polar_example.py index 9a2865b..9117de1 100644 --- a/examples/uplot_polar_example.py +++ b/examples/uplot_polar_example.py @@ -4,12 +4,12 @@ import board import ulab.numpy as np -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.polar import Polar # Setting up the display display = board.DISPLAY -plot = Uplot(10, 10, 250, 250, padding=0, show_box=False) +plot = Plot(10, 10, 250, 250, padding=0, show_box=False) # Creating the data r = np.arange(0, 2, 0.01) diff --git a/examples/uplot_polar_plots.py b/examples/uplot_polar_plots.py index 24665ad..91d039e 100644 --- a/examples/uplot_polar_plots.py +++ b/examples/uplot_polar_plots.py @@ -5,7 +5,7 @@ import board import displayio import ulab.numpy as np -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.cartesian import Cartesian # Inspired by @@ -14,10 +14,10 @@ # pylint: disable=dangerous-default-value # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width // 2, display.height // 2, padding=1) -plot2 = Uplot(240, 0, display.width // 2, display.height // 2, padding=1) -plot3 = Uplot(0, 160, display.width // 2, display.height // 2, padding=1) -plot4 = Uplot(240, 160, display.width // 2, display.height // 2, padding=1) +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) g = displayio.Group() g.append(plot) g.append(plot2) diff --git a/examples/uplot_readme_example.py b/examples/uplot_readme_example.py index 8b6efa4..19771de 100644 --- a/examples/uplot_readme_example.py +++ b/examples/uplot_readme_example.py @@ -6,7 +6,7 @@ import board import displayio from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar from circuitpython_uplot.scatter import Scatter from circuitpython_uplot.pie import Pie @@ -14,7 +14,7 @@ display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height, show_box=False) +plot = Plot(0, 0, display.width, display.height, show_box=False) group = displayio.Group() @@ -22,14 +22,14 @@ palette[0] = 0xFFFFFF -plot2 = Uplot(0, 0, 130, 130) +plot2 = Plot(0, 0, 130, 130) x = np.linspace(-4, 4, num=25) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 4.0) Cartesian(plot2, x, y, rangex=[-5, 5], rangey=[0, 1]) plot.append(plot2) -plot3 = Uplot(130, 0, 160, 160) +plot3 = Plot(130, 0, 160, 160) # Setting up tick parameters plot3.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF00FF, tickgrid=True) @@ -43,7 +43,7 @@ Cartesian(plot3, x, y, rangex=[-5, 5], rangey=[0, 0.5]) plot.append(plot3) -plot4 = Uplot(290, 0, 150, 150) +plot4 = Plot(290, 0, 150, 150) # Setting up tick parameters plot4.axs_params(axstype="box") @@ -53,7 +53,7 @@ plot.append(plot4) -plot5 = Uplot(0, 180, 120, 120) +plot5 = Plot(0, 180, 120, 120) # Setting up tick parameters plot5.axs_params(axstype="cartesian") @@ -63,7 +63,7 @@ plot.append(plot5) -plot6 = Uplot(130, 160, 150, 150) +plot6 = Plot(130, 160, 150, 150) # Setting up tick parameters plot6.axs_params(axstype="box") @@ -74,7 +74,7 @@ plot.append(plot6) -plot7 = Uplot(290, 160, 150, 150) +plot7 = Plot(290, 160, 150, 150) # Creating some points to graph x = np.linspace(1, 10, num=10) diff --git a/examples/uplot_scatter.py b/examples/uplot_scatter.py index 8782450..7bf7828 100644 --- a/examples/uplot_scatter.py +++ b/examples/uplot_scatter.py @@ -6,7 +6,7 @@ from random import choice import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.scatter import Scatter @@ -14,7 +14,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) diff --git a/examples/uplot_shade_example.py b/examples/uplot_shade_example.py index f3bf477..b28722e 100644 --- a/examples/uplot_shade_example.py +++ b/examples/uplot_shade_example.py @@ -5,7 +5,7 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade @@ -19,7 +19,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, padding=5) +plot = Plot(0, 0, display.width, display.height, padding=5) def heat_index(temp, humidity): diff --git a/examples/uplot_simpletest.py b/examples/uplot_simpletest.py index 0063af9..80f91b8 100644 --- a/examples/uplot_simpletest.py +++ b/examples/uplot_simpletest.py @@ -4,13 +4,13 @@ import time import board -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) plot.draw_circle(radius=8, x=120, y=120) diff --git a/examples/uplot_sparkline.py b/examples/uplot_sparkline.py index b5366f7..740b2cb 100644 --- a/examples/uplot_sparkline.py +++ b/examples/uplot_sparkline.py @@ -6,14 +6,14 @@ import board from ulab import numpy as np from adafruit_display_shapes.sparkline import Sparkline -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # 500 linearly spaced numbers x = np.linspace(-10 * np.pi, 10 * np.pi, 500) diff --git a/examples/uplot_stackplot.py b/examples/uplot_stackplot.py index 6239758..b6bc0d8 100644 --- a/examples/uplot_stackplot.py +++ b/examples/uplot_stackplot.py @@ -8,12 +8,12 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Creating some points to graph x = np.linspace(1, 10, num=10) diff --git a/examples/uplot_svg_example.py b/examples/uplot_svg_example.py index 7aba1d1..a20fb75 100644 --- a/examples/uplot_svg_example.py +++ b/examples/uplot_svg_example.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT import board -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.svg import SVG from circuitpython_uplot.icons import FULL, Humidity, Temperature, Temperature2 @@ -11,7 +11,7 @@ # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) SVG(plot, FULL, 50, 50, 2, color.YELLOW) SVG(plot, Humidity, 150, 50, 2, color.TEAL) SVG(plot, Temperature, 250, 50, 2, color.GREEN) diff --git a/examples/uplot_tickparameters.py b/examples/uplot_tickparameters.py index a77d414..2f51130 100644 --- a/examples/uplot_tickparameters.py +++ b/examples/uplot_tickparameters.py @@ -5,7 +5,7 @@ import time import board from ulab import numpy as np -from circuitpython_uplot.plot import Uplot, color +from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.cartesian import Cartesian @@ -13,7 +13,7 @@ display = board.DISPLAY # Setting up the plot area -plot = Uplot( +plot = Plot( 0, 0, display.width, diff --git a/examples/uplot_uboxplot.py b/examples/uplot_uboxplot.py index eb245bd..20fb2c5 100644 --- a/examples/uplot_uboxplot.py +++ b/examples/uplot_uboxplot.py @@ -2,17 +2,17 @@ # # SPDX-License-Identifier: MIT """ -Simple test to display boxplot using uplot +Simple test to display boxplot using plot """ import board from uboxplot import Boxplot -from circuitpython_uplot.plot import Uplot +from circuitpython_uplot.plot import Plot display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) plot.tick_params(tickx_height=10, ticky_height=10, tickcolor=0x440008, tickgrid=True) From 2a78c857722865c871f882b8b164e11e8e1fd1bd Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 19:24:54 -0400 Subject: [PATCH 10/61] polr adavance example --- docs/examples.rst | 9 +++ examples/plot_polar_advanced_example.py | 75 +++++++++++++++++++++++++ examples/uplot_bar_color_changing.py | 2 +- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 examples/plot_polar_advanced_example.py diff --git a/docs/examples.rst b/docs/examples.rst index 1554c70..2bd8bee 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -318,3 +318,12 @@ Show how to use the Polar Plot :caption: examples/uplot_polar_example.py :lines: 5- .. image:: ../docs/polar_example.jpg + +Polar Advanced Example +--------------------------- + +Polar Advanced example + +.. literalinclude:: ../examples/examples/plot_polar_advanced_example.py + :caption: examples/examples/plot_polar_advanced_example.py + :lines: 5- diff --git a/examples/plot_polar_advanced_example.py b/examples/plot_polar_advanced_example.py new file mode 100644 index 0000000..107b003 --- /dev/null +++ b/examples/plot_polar_advanced_example.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import ulab.numpy as np +import displayio +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.polar import Polar + + +# Setting up the display +display = board.DISPLAY +g = displayio.Group() + +# Drawing an Ellipse +theta = np.arange(0, 2 * np.pi, 0.01) +a = 2 +b = 1 +r = (a * b) / np.sqrt((a * np.sin(theta)) ** 2 + (b * np.cos(theta)) ** 2) + +plot = Plot(0, 0, 160, 160, padding=0, show_box=False) +Polar(plot, theta, r, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) +g.append(plot) + +# Drawing an Spiral +r2 = 2 * np.pi * theta + 4.5 +plot2 = Plot(0, 160, 160, 160, padding=0, show_box=False) +Polar(plot2, r2, theta, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) +g.append(plot2) + +# Drawing a Star +rhos = 2 + np.cos(5 * theta) +plot3 = Plot(160, 0, 160, 160, padding=0, show_box=False) +Polar( + plot3, + theta, + rhos, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot3) + +# Drawing a more dense Spiral +rhos = (np.pi / 2) * np.cos(3 * theta) +plot5 = Plot(320, 0, 160, 160, padding=0, show_box=False) +Polar( + plot5, + rhos, + theta, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot5) + +# Drawing a funky Shape +rhos = (np.pi / 2) * theta**2 +plot4 = Plot(160, 160, 160, 160, padding=0, show_box=False) +Polar( + plot4, + rhos, + theta, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot4) + +# Show the Display +display.show(g) diff --git a/examples/uplot_bar_color_changing.py b/examples/uplot_bar_color_changing.py index 65823ad..4563aae 100644 --- a/examples/uplot_bar_color_changing.py +++ b/examples/uplot_bar_color_changing.py @@ -28,7 +28,7 @@ display.show(plot) # Dummy data to plot -some_values = [55, 20, 25, 30, 35, 10] +some_values = [45, 20, 25, 30, 35, 10] a = ["a", "b", "c", "d", "e", "f"] # Showing the plot From 581b79d1f8f8edb219ac0627b0763463d471f01d Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 19:25:52 -0400 Subject: [PATCH 11/61] polar advanced example --- docs/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 2bd8bee..d7aeaad 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -324,6 +324,6 @@ Polar Advanced Example Polar Advanced example -.. literalinclude:: ../examples/examples/plot_polar_advanced_example.py - :caption: examples/examples/plot_polar_advanced_example.py +.. literalinclude:: ../examples/plot_polar_advanced_example.py + :caption: examples/plot_polar_advanced_example.py :lines: 5- From 0b4a710546091bc2dc294bae4f6202058ef05035 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 21:42:29 -0400 Subject: [PATCH 12/61] adding_examples --- docs/cartesian_trig_functions.jpg | Bin 0 -> 24099 bytes docs/examples.rst | 27 +- docs/{uplot_lissajous.jpg => lissajous.jpg} | Bin docs/{uplot_ex1.jpg => plot_simple_test.jpg} | Bin docs/polar_advanced.jpg | Bin 0 -> 110829 bytes examples/cartesian_trig_functions.py | 38 + examples/fonts/LeagueSpartan-Bold-16.bdf | 12458 ++++++++++++++++ ...issajous_curves.py => lissajous_curves.py} | 0 ...uplot_simpletest.py => plot_simpletest.py} | 0 ..._advanced_example.py => polar_advanced.py} | 0 10 files changed, 12515 insertions(+), 8 deletions(-) create mode 100644 docs/cartesian_trig_functions.jpg rename docs/{uplot_lissajous.jpg => lissajous.jpg} (100%) rename docs/{uplot_ex1.jpg => plot_simple_test.jpg} (100%) create mode 100644 docs/polar_advanced.jpg create mode 100644 examples/cartesian_trig_functions.py create mode 100644 examples/fonts/LeagueSpartan-Bold-16.bdf rename examples/{uplot_lissajous_curves.py => lissajous_curves.py} (100%) rename examples/{uplot_simpletest.py => plot_simpletest.py} (100%) rename examples/{plot_polar_advanced_example.py => polar_advanced.py} (100%) diff --git a/docs/cartesian_trig_functions.jpg b/docs/cartesian_trig_functions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..734e245ac99db66f50e8778dcbe8d797d121e577 GIT binary patch literal 24099 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 YIh>~zeWVTTwY}19Co+eBh3`!M2hY)L#{d8T literal 0 HcmV?d00001 diff --git a/docs/examples.rst b/docs/examples.rst index d7aeaad..9c06ddc 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -3,11 +3,11 @@ Simple test Ensure your device works with this simple test. -.. literalinclude:: ../examples/uplot_simpletest.py - :caption: examples/uplot_simpletest.py +.. literalinclude:: ../examples/plot_simpletest.py + :caption: examples/plot_simpletest.py :lines: 5- -.. image:: ../docs/uplot_ex1.jpg +.. image:: ../docs/plot_simple_test.jpg Plot Example ------------- @@ -156,10 +156,10 @@ Lissajous Curves Example Example showing how to draw lissajous curves -.. literalinclude:: ../examples/uplot_lissajous_curves.py - :caption: examples/uplot_lissajous_curves.py +.. literalinclude:: ../examples/lissajous_curves.py + :caption: examples/lissajous_curves.py :lines: 5- -.. image:: ../docs/uplot_lissajous.jpg +.. image:: ../docs/lissajous.jpg Cartesian Polar Plots Example -------------------------------- @@ -171,6 +171,16 @@ Example showing how to draw polar plots using Cartesian :lines: 5- .. image:: ../docs/polar_plots.jpg +Cartesian Trigonometric Plots Example +-------------------------------------- + +Example showing how to draw Trigonometrics plots using Cartesian + +.. literalinclude:: ../examples/cartesian_trig_functions.py + :caption: examples/cartesian_trig_functions.py + :lines: 5- +.. image:: ../docs/cartesian_trig_functions.jpg + Stackplot Example --------------------------- @@ -324,6 +334,7 @@ Polar Advanced Example Polar Advanced example -.. literalinclude:: ../examples/plot_polar_advanced_example.py - :caption: examples/plot_polar_advanced_example.py +.. literalinclude:: ../examples/polar_advanced.py + :caption: examples/polar_advanced.py :lines: 5- +.. image:: ../docs/polar_advanced.jpg diff --git a/docs/uplot_lissajous.jpg b/docs/lissajous.jpg similarity index 100% rename from docs/uplot_lissajous.jpg rename to docs/lissajous.jpg diff --git a/docs/uplot_ex1.jpg b/docs/plot_simple_test.jpg similarity index 100% rename from docs/uplot_ex1.jpg rename to docs/plot_simple_test.jpg diff --git a/docs/polar_advanced.jpg b/docs/polar_advanced.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21fa55368424a488a98aed1d16fe9c34f2494e10 GIT binary patch literal 110829 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ΠBwu-Q!UA`&N-kXX0!I>92Vy;iL(XH9Y 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 R%m4o!0{&MYSO5L~e*hQ?yk!6Y literal 0 HcmV?d00001 diff --git a/examples/cartesian_trig_functions.py b/examples/cartesian_trig_functions.py new file mode 100644 index 0000000..487e7be --- /dev/null +++ b/examples/cartesian_trig_functions.py @@ -0,0 +1,38 @@ +import ulab.numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian +import board +import displayio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import bitmap_label + +font_file = "fonts/LeagueSpartan-Bold-16.bdf" +font_to_use = bitmap_font.load_font(font_file) + +g = displayio.Group() +text = "Sin(x)" +text_area = bitmap_label.Label(font_to_use, text=text, color=0x149F14) +text_area.x = 60 +text_area.y = 15 +# board.DISPLAY.show(text_area) + +text2 = "Cos(x)" +text2_area = bitmap_label.Label(font_to_use, text=text2, color=0x647182) +text2_area.x = 135 +text2_area.y = 135 + +display = board.DISPLAY +# Compute the x and y coordinates for points on a sine curve +x = np.arange(0, 3 * np.pi, 0.1) +y = np.sin(x) +y2 = np.cos(x) + +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +Cartesian(plot, x, y, rangex=[0, 10], rangey=[-1.1, 1.1]) +Cartesian(plot, x, y2, rangex=[0, 10], rangey=[-1.1, 1.1]) + +g.append(plot) +g.append(text_area) +g.append(text2_area) + +display.show(g) diff --git a/examples/fonts/LeagueSpartan-Bold-16.bdf b/examples/fonts/LeagueSpartan-Bold-16.bdf new file mode 100644 index 0000000..9508339 --- /dev/null +++ b/examples/fonts/LeagueSpartan-Bold-16.bdf @@ -0,0 +1,12458 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "LeagueSpartan-Bold.otf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-League Spartan-Bold-R-Normal--22-160-100-100-P-111-ISO10646-1 +SIZE 16 100 100 +FONTBOUNDINGBOX 30 32 -3 -7 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "League Spartan" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 22 +POINT_SIZE 160 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 111 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 15 +FONT_DESCENT 4 +COPYRIGHT "OFL" +_OTF_FONTFILE "LeagueSpartan-Bold.otf" +_OTF_PSNAME "LeagueSpartan-Bold" +ENDPROPERTIES +CHARS 561 +STARTCHAR 000D +ENCODING 13 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0020 +ENCODING 32 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 16 1 0 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +60 +60 +60 +00 +70 +F0 +F0 +70 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 9 +BITMAP +EC +EE +EE +CC +CC +44 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 15 1 0 +BITMAP +0660 +0E60 +0C60 +0CE0 +3FF0 +7FF0 +18C0 +19C0 +3980 +7FE0 +FFE0 +3380 +7300 +6300 +6300 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 -2 +BITMAP +0600 +0600 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +0600 +0600 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 15 1 0 +BITMAP +7818 +FE38 +C630 +C660 +C660 +FEC0 +3980 +0180 +033C +077E +06E7 +0CE3 +0CE7 +187E +383C +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +07C0 +1FE0 +1FE0 +3CE0 +1CE0 +1CE0 +1FC0 +1F80 +3F88 +7BDC +F0FC +F0F8 +7FF8 +7FFC +1F1E +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 6 1 9 +BITMAP +E0 +E0 +E0 +E0 +C0 +40 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 21 1 -5 +BITMAP +10 +38 +30 +70 +70 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +60 +60 +70 +30 +38 +10 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 21 1 -5 +BITMAP +40 +E0 +60 +70 +70 +30 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +70 +70 +60 +E0 +40 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 10 +BITMAP +10 +10 +FE +38 +38 +6C +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 9 1 3 +BITMAP +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 7 1 -3 +BITMAP +60 +F0 +F0 +70 +30 +60 +40 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 3 1 4 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 4 1 0 +BITMAP +70 +F0 +F0 +70 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 17 1 -1 +BITMAP +0380 +0380 +0300 +0700 +0600 +0E00 +0E00 +0C00 +1C00 +1800 +3800 +3000 +7000 +7000 +6000 +E000 +C000 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +0F80 +1FC0 +3FE0 +78F0 +7070 +7070 +7070 +F070 +7070 +7070 +7070 +78F0 +3FE0 +1FC0 +0F80 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 15 0 0 +BITMAP +1C +3C +FC +FC +DC +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0F80 +3FC0 +7FE0 +F0E0 +70E0 +00E0 +01E0 +01E0 +03C0 +0780 +1F00 +3E00 +7FE0 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1F00 +3FC0 +7FC0 +71E0 +00E0 +01C0 +07C0 +07C0 +01E0 +00E0 +20E0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0780 +0780 +0F80 +0F80 +1F80 +3B80 +3B80 +7380 +7380 +FFE0 +FFE0 +FFE0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +7F80 +7F80 +7F80 +7000 +F000 +EF00 +FF80 +FFC0 +23C0 +01C0 +01C0 +E3C0 +FF80 +7F80 +3E00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0780 +0F00 +1E00 +1C00 +3C00 +7E00 +7F80 +FFC0 +F1C0 +E1C0 +E1C0 +E1C0 +FFC0 +7F80 +1E00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 1 0 +BITMAP +FFE0 +FFE0 +FFC0 +03C0 +0380 +0780 +0700 +0F00 +0E00 +1E00 +1C00 +3800 +7800 +7000 +F000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +7F80 +7F80 +F1C0 +E1C0 +7380 +3F80 +7F80 +FFC0 +E1C0 +E1C0 +F1C0 +FFC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +7F80 +FFC0 +E1C0 +E1C0 +E1C0 +E1C0 +FFC0 +7FC0 +3F80 +0700 +0F00 +1E00 +3C00 +7800 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +60 +F0 +F0 +60 +00 +00 +60 +F0 +F0 +70 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 13 1 -3 +BITMAP +60 +F0 +F0 +60 +00 +00 +60 +F0 +F0 +F0 +20 +60 +C0 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 11 1 2 +BITMAP +0040 +01C0 +0FC0 +3F80 +FC00 +F000 +FC00 +7F00 +0FC0 +03C0 +00C0 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 7 1 4 +BITMAP +FF80 +FF80 +FF80 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 11 1 2 +BITMAP +8000 +E000 +F800 +7F00 +1FC0 +03C0 +0FC0 +3F00 +FC00 +F000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +1F00 +7F80 +FFC0 +63C0 +03C0 +0380 +0F00 +0E00 +1C00 +1C00 +0000 +0C00 +1E00 +1E00 +0C00 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +07E0 +1FF0 +7C7C +701C +E76E +CFE6 +DCE6 +DC66 +DC66 +CFFE +E7BC +7020 +7EF0 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E3C0 +E3C0 +E380 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +FFC0 +FF80 +FF00 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +FE00 +FF80 +FFC0 +E3C0 +E1E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +E3C0 +FFC0 +FF80 +FE00 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 15 1 0 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 15 1 0 +BITMAP +FF +FF +FF +E0 +E0 +E0 +FF +FF +FF +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +FFF0 +FFF0 +FFF0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 15 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 0 0 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +4F +FE +FE +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +E1E0 +E3C0 +E780 +E700 +EF00 +FE00 +FC00 +FC00 +FE00 +EE00 +EF00 +E780 +E3C0 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 15 15 1 0 +BITMAP +F81E +F83E +F83E +FC3E +FC3E +FC7E +EC7E +EE6E +EEEE +E6EE +E7CE +E7CE +E3CE +E38E +E00E +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 15 1 0 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E3C0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FC00 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 -4 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +F00E +700E +781E +7C3E +3FFC +1FF8 +07E0 +0FE6 +1FFE +08FE +003C +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +F03C +703C +7838 +7878 +3878 +3870 +3CF0 +1CF0 +1CE0 +1EE0 +0FE0 +0FC0 +0FC0 +07C0 +0780 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 15 0 0 +BITMAP +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +783C +3C78 +3C70 +1EF0 +0FE0 +0FC0 +07C0 +07C0 +0FE0 +0FE0 +1EF0 +3CF8 +3C78 +783C +F03E +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 15 0 0 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 15 0 0 +BITMAP +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +C000 +E000 +6000 +7000 +7000 +3800 +3800 +1800 +1C00 +0C00 +0E00 +0600 +0700 +0300 +0380 +0380 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +FC +FC +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +FC +FC +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 4 1 11 +BITMAP +38 +7C +6E +C7 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 2 0 -2 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 4 1 11 +BITMAP +40 +E0 +70 +18 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 9 0 0 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FFC0 +F1E0 +E1E0 +F1E0 +FFC0 +FFC0 +EF00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 8 16 0 0 +BITMAP +0F +1F +3E +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 -5 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FBC0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 15 1 0 +BITMAP +E0 +F0 +F0 +60 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 20 -1 -5 +BITMAP +18 +3C +3C +18 +00 +00 +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E380 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 9 1 0 +BITMAP +EF3C +FFFE +F3EF +E3C7 +E387 +E387 +E387 +E387 +E387 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 9 0 0 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 1 -5 +BITMAP +EF80 +FFC0 +FFC0 +F1E0 +E0E0 +F1E0 +FFC0 +FFC0 +EF00 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 1 -5 +BITMAP +3DE0 +7FE0 +FFE0 +E1E0 +E1E0 +E1E0 +FFE0 +7FE0 +3DE0 +01E0 +01E0 +01E0 +01E0 +01E0 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +F0E0 +70E0 +79E0 +39C0 +3BC0 +3F80 +1F80 +1F00 +0F00 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 9 0 0 +BITMAP +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +F3C0 +7380 +3F00 +3E00 +1E00 +3F00 +7F80 +F380 +E1C0 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +3C +3C +70 +70 +70 +70 +70 +70 +70 +F0 +E0 +70 +70 +70 +70 +70 +70 +70 +70 +3C +3C +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 19 1 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +F0 +F0 +38 +38 +38 +38 +38 +38 +38 +3C +1C +38 +38 +38 +38 +38 +38 +38 +38 +F0 +F0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 4 1 5 +BITMAP +3800 +7FE0 +EFC0 +0780 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 16 1 -1 +BITMAP +70 +F0 +F0 +70 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +08 +08 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +08 +08 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1F00 +3FC0 +7FC0 +70C0 +7080 +7000 +7000 +3800 +FF00 +FF00 +1C00 +1C00 +7EF0 +FFE0 +C3C0 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 10 1 2 +BITMAP +FEC0 +FFC0 +FF80 +E3C0 +E1C0 +E1C0 +E3C0 +FF80 +FFC0 +DEC0 +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 15 0 0 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +7FF0 +7FF0 +0700 +0700 +7FF0 +7FF0 +0700 +0700 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +00 +00 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -5 +BITMAP +3E00 +7F00 +7F80 +F300 +F000 +7C00 +3F00 +7F80 +E7C0 +E1C0 +E1C0 +FB80 +FF00 +7F00 +0F80 +0780 +E380 +FF80 +FF00 +3E00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 3 1 11 +BITMAP +66 +E7 +67 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +0FC0 +1FF0 +7838 +601C +C78C +CF8C +CC06 +8C06 +CC06 +CF8C +C78C +601C +7838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 9 +BITMAP +7E +7E +C6 +C6 +7E +78 +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1100 +3380 +7700 +E600 +CE00 +E600 +7300 +3B80 +0100 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 5 1 2 +BITMAP +FF80 +FF80 +FF80 +0380 +0380 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 3 1 4 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 8 1 7 +BITMAP +38 +C6 +BA +AA +B2 +AA +C6 +38 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 2 1 11 +BITMAP +FF +FF +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 4 1 12 +BITMAP +70 +D0 +D0 +70 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 12 1 1 +BITMAP +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 1 9 +BITMAP +E0 +90 +30 +20 +C0 +F0 +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 0 9 +BITMAP +70 +10 +30 +10 +D0 +70 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 4 4 3 11 +BITMAP +10 +70 +F0 +C0 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 -4 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FE00 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1FE0 +7FE0 +7F60 +FF60 +FF60 +FF60 +7F60 +7F60 +3F60 +0360 +0360 +0360 +0360 +0360 +0360 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 4 1 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 5 5 2 -5 +BITMAP +60 +70 +18 +F8 +F0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 135 0 +DWIDTH 3 0 +BBX 2 6 0 9 +BITMAP +40 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 6 1 9 +BITMAP +3C +7E +C6 +C6 +7E +3C +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +4400 +EE00 +6700 +3380 +3980 +7380 +6700 +EE00 +4400 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 15 1 0 +BITMAP +2030 +E060 +E0C0 +60C0 +6180 +6180 +6300 +6338 +6678 +0658 +0CD8 +1998 +19FC +3018 +3018 +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +6030 +E060 +E0C0 +60C0 +6180 +6180 +633C +637E +6646 +0C06 +0C0E +181C +1838 +307E +307E +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +7818 +FC30 +4C30 +1860 +1860 +0CC0 +CCC0 +FD9C +7B3C +033C +066C +064C +0CFE +0C0C +180C +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0E00 +1E00 +1E00 +0E00 +0000 +0E00 +0E00 +0E00 +3C00 +7800 +7000 +F1C0 +7FC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0400 +0E00 +0700 +0380 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0300 +07C0 +1EE0 +0840 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0F60 +0FE0 +19C0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0CE0 +1EE0 +0CE0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0380 +06C0 +06C0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 18 15 0 0 +BITMAP +01FFC0 +01FFC0 +03FFC0 +03F000 +07F000 +077000 +0F7FC0 +0E7FC0 +1E7FC0 +1C7000 +3FF000 +3FF000 +787FC0 +707FC0 +F07FC0 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 -5 +BITMAP +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +7FF0 +1FF0 +0FE0 +0100 +03C0 +00C0 +07C0 +0780 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +2000 +7000 +3800 +0C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +1800 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6700 +7700 +6700 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 20 0 0 +BITMAP +80 +E0 +F0 +30 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 1 0 +BITMAP +10 +38 +F0 +C0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 20 -1 0 +BITMAP +18 +7C +EE +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 0 +BITMAP +E6 +EF +E6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +7F00 +7FC0 +7FE0 +71E0 +70F0 +7070 +FC70 +FC70 +FC70 +7070 +70F0 +71F0 +7FE0 +7FC0 +7F00 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 0 +BITMAP +0E60 +1FE0 +19C0 +0000 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 1 +BITMAP +0700 +0780 +01C0 +0080 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0040 +00E0 +01E0 +0380 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0730 +07F0 +0FE0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0660 +0E70 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 8 1 3 +BITMAP +6300 +F780 +7F00 +3E00 +3E00 +7F00 +F780 +6300 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E2 +1FFE +3FFC +3C3C +783E +706E +70CE +F18E +730E +760E +7C1E +3C3C +3FFC +7FF8 +C7E0 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +1800 +1C00 +1E00 +0600 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0100 +0380 +0700 +0C00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0600 +1F00 +3BC0 +1080 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +3980 +3BC0 +3980 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0100 +0380 +0780 +0600 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +E000 +E000 +E000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FF00 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1F00 +3F80 +7F80 +71C0 +E1C0 +E1C0 +E380 +E780 +E780 +E3C0 +E1C0 +E1C0 +E1C0 +E7C0 +E780 +E700 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0400 +0E00 +0F00 +0380 +0100 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0100 +0300 +0700 +0E00 +0800 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 0 +BITMAP +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 0 +BITMAP +1CC0 +1FC0 +3F80 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 13 0 0 +BITMAP +19C0 +3DC0 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0F00 +1F80 +1980 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 9 1 0 +BITMAP +FC78 +FEFE +47CE +3BFF +FFFF +E780 +E7CC +FFFE +7C7C +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +10 +3C +0C +7C +78 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0800 +1C00 +1E00 +0700 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +3B80 +3B80 +3980 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +40 +E0 +70 +38 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +10 +38 +70 +E0 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 14 -1 0 +BITMAP +30 +7C +EE +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 13 -1 0 +BITMAP +EE +EE +CE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +6200 +7E00 +7E00 +3F00 +3F00 +3380 +03C0 +3FC0 +7FC0 +FFC0 +E1E0 +E1E0 +E1C0 +FFC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3980 +7F80 +7F00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0800 +0C00 +0E00 +0700 +0100 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1C80 +3F80 +7F00 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +3980 +3BC0 +3980 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 11 1 2 +BITMAP +0C00 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +0000 +0C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 9 0 0 +BITMAP +1F60 +3FC0 +7FC0 +73E0 +F5E0 +79E0 +7FC0 +7F80 +DF00 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0800 +1C00 +1E00 +0600 +0200 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +1000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0C00 +1E00 +7F80 +2100 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 21 1 -5 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FFC0 +F1E0 +E1E0 +F1E0 +FFC0 +FFC0 +E700 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 -5 +BITMAP +3980 +3BC0 +3980 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 18 0 0 +BITMAP +0FE0 +0FE0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +3FC0 +3FC0 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +30C0 +39C0 +1F80 +0F00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 -5 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0010 +0030 +0020 +003C +0038 +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 14 0 -5 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00C0 +0080 +0180 +01F0 +00E0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0080 +01C0 +03C0 +0700 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +04 +0E +1E +38 +10 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0300 +0780 +1FC0 +08C0 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +10 +3C +FE +C6 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0300 +0780 +0300 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +18 +3C +18 +00 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +08C0 +0FC0 +0780 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +42 +E7 +7E +3C +10 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3300 +1F00 +0E00 +0000 +FE00 +FF80 +FFC0 +E3C0 +E1E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +E3C0 +FFC0 +FF80 +FE00 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 15 16 0 0 +BITMAP +00E6 +00E6 +00E6 +00E2 +00E4 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +7F00 +7FC0 +7FE0 +71E0 +70F0 +7070 +FC70 +FC70 +FC70 +7070 +70F0 +71F0 +7FE0 +7FC0 +7F00 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 16 0 0 +BITMAP +00E0 +00E0 +03F0 +03F0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 18 1 0 +BITMAP +7F00 +7F00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6300 +7E00 +3C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1100 +7180 +3F80 +1F00 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +1800 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0C00 +0E00 +0E00 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 -5 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0400 +0C00 +0C00 +0F00 +0700 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 -5 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0600 +0400 +0C00 +0F80 +0700 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6200 +3E00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +2100 +7380 +3F00 +1E00 +0400 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 -5 +BITMAP +0200 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0E70 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 -5 +BITMAP +3080 +39C0 +3F80 +0F00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0180 +03C0 +0180 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 -5 +BITMAP +0E00 +0E00 +0E00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 21 0 -7 +BITMAP +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +01C0 +01C0 +01C0 +0080 +0180 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 -5 +BITMAP +0200 +0400 +0600 +0600 +0400 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0600 +1F00 +3BC0 +1080 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +FFF0 +FFF0 +FFF0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 22 1 0 +BITMAP +0800 +1E00 +3F00 +7300 +0000 +0000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FBC0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 15 0 0 +BITMAP +7078 +7078 +FFF8 +FFF8 +7078 +7078 +7FF8 +7FF8 +7FF8 +7078 +7078 +7078 +7078 +7078 +7078 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +7000 +7000 +FC00 +FC00 +7000 +7000 +7000 +7780 +7FE0 +7DE0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 0 +BITMAP +73 +FE +DE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +39 +7F +CE +00 +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 18 -1 0 +BITMAP +FE +FE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 13 -1 0 +BITMAP +FE +FE +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 19 -1 0 +BITMAP +C6 +7E +3C +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +42 +E3 +7F +3C +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 -5 +BITMAP +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 -5 +BITMAP +70 +78 +78 +30 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 19 1 0 +BITMAP +60 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 10 20 0 0 +BITMAP +0600 +0F80 +3DC0 +1080 +0000 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +4F00 +FE00 +FE00 +7800 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 -5 +BITMAP +18 +3C +FF +42 +00 +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 21 1 -7 +BITMAP +E1E0 +E3C0 +E780 +E700 +EF00 +FE00 +FC00 +FC00 +FE00 +EE00 +EF00 +E780 +E3C0 +E3C0 +E1E0 +0000 +0E00 +0E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 22 1 -6 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E380 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +0000 +1C00 +1C00 +1C00 +0C00 +1800 +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +E780 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0400 +0E00 +1C00 +3800 +0000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 22 1 0 +BITMAP +10 +38 +78 +E0 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 21 1 -6 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1C00 +1C00 +1C00 +0800 +1800 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 22 1 -6 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +60 +C0 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 1 0 +BITMAP +E0C0 +E0C0 +E0C0 +E080 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 1 0 +BITMAP +E4 +E6 +E6 +E2 +E4 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E700 +E780 +E780 +E700 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +EE +EF +EF +EE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +3800 +3800 +3800 +3A00 +3E00 +3C00 +3800 +7800 +F800 +F800 +3800 +3800 +3FC0 +3FC0 +3FC0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 16 0 0 +BITMAP +38 +38 +38 +38 +3C +3C +3C +78 +F8 +F8 +B8 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 0 +BITMAP +0080 +01C0 +0380 +0600 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0100 +0300 +0F00 +0C00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 21 1 -7 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +0000 +0700 +0700 +0300 +0100 +0200 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 -7 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +0000 +0C00 +1C00 +0C00 +0400 +0800 +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 19 1 0 +BITMAP +0CC0 +0FC0 +0700 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +2100 +7700 +3E00 +1C00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 -5 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +0038 +0038 +00F8 +01F8 +01F0 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 -5 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +01C0 +01C0 +07C0 +0F80 +0F00 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +07F0 +07F0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0E70 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1100 +3180 +3F80 +1F00 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 1 +BITMAP +0330 +0770 +0EE0 +0480 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0080 +0DC0 +1D80 +3300 +2200 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 17 15 0 0 +BITMAP +07FF80 +1FFF80 +3FFF80 +7C7000 +787000 +707000 +F07F80 +F07F80 +F07F80 +707000 +787000 +7C7000 +3FFF80 +1FFF80 +07FF80 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 18 9 0 0 +BITMAP +1F3E00 +3FFF80 +7FF380 +71FF80 +F1FFC0 +71E000 +7FF300 +3FFF80 +1F3F00 +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 1 0 +BITMAP +0200 +0700 +0E00 +0C00 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +04 +0C +3C +38 +20 +00 +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 21 1 -7 +BITMAP +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +0000 +0C00 +1E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 -6 +BITMAP +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +00 +38 +38 +38 +10 +30 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3300 +3F00 +0E00 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +84 +CE +FC +38 +10 +00 +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 0 +BITMAP +0100 +0380 +0780 +0E00 +0000 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +08 +1C +3C +78 +20 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 0 +BITMAP +0600 +0F00 +3F80 +3180 +0000 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +10 +3C +FE +C6 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 -5 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +07E0 +01E0 +00E0 +60E0 +7FE0 +FFC0 +3F80 +0400 +0700 +0180 +0F00 +0F00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +3E +FE +E2 +F0 +7E +0F +CF +FE +FC +10 +3C +0C +7C +78 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 0 +BITMAP +1180 +1F80 +0F00 +0400 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +84 +EE +FC +38 +10 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 -5 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0400 +0F00 +0300 +1B00 +0E00 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 8 18 0 -5 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +08 +0E +03 +1E +1E +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 19 0 0 +BITMAP +3100 +1F00 +0E00 +0000 +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 9 14 0 0 +BITMAP +0180 +3980 +3880 +3900 +3800 +FE00 +FE00 +FE00 +3800 +3800 +3800 +3E00 +3E00 +1E00 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +FE +38 +3E +3E +1E +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1CC0 +3F80 +3780 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3980 +7F80 +6700 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3F80 +3F80 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +7F00 +7F00 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +3180 +1F80 +0F00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +2100 +7380 +7F00 +1E00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0E00 +1B00 +1900 +0F00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +3F00 +3300 +3F00 +1E00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0CC0 +3B80 +3300 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0900 +1B80 +3B00 +6600 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 -5 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F80 +0400 +0C00 +0C00 +0F00 +0700 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 -5 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3F00 +0800 +1800 +1800 +1E00 +1E00 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +006000 +01F000 +03BC00 +010800 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +0180 +03C0 +0FF0 +0420 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0600 +0F80 +3DC0 +1080 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +0400 +1F00 +3B80 +3180 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 0 +BITMAP +19C0 +3DC0 +19C0 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 20 0 0 +BITMAP +0080 +01C0 +0780 +0600 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 19 0 0 +BITMAP +0700 +0700 +0700 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0C00 +1C00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 19 0 0 +BITMAP +08C0 +0F80 +0700 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 15 0 0 +BITMAP +2100 +7380 +3F00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 018F +ENCODING 399 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +0FC0 +3FF0 +7FF8 +3878 +103C +001C +001C +FFFC +FFFC +701C +701C +783C +3FF8 +1FF0 +07C0 +ENDCHAR +STARTCHAR 0192 +ENCODING 402 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 12 21 -3 -5 +BITMAP +00F0 +01F0 +03E0 +0380 +0780 +0780 +0700 +1FC0 +1FC0 +1FC0 +0700 +0F00 +0F00 +0E00 +0E00 +0E00 +0E00 +1E00 +7E00 +7C00 +F800 +ENDCHAR +STARTCHAR 01A0 +ENCODING 416 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 16 0 0 +BITMAP +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 01A1 +ENCODING 417 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 11 0 0 +BITMAP +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 01AF +ENCODING 431 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 17 1 0 +BITMAP +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 01B0 +ENCODING 432 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 11 1 0 +BITMAP +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01C4 +ENCODING 452 +SWIDTH 1215 0 +DWIDTH 27 0 +BBX 25 21 1 0 +BITMAP +00008400 +0001CE00 +0000FC00 +00003800 +00000000 +00000000 +FE07FF80 +FF87FF80 +FFC7FF00 +E3C01E00 +E1E01E00 +E0E03C00 +E0E03C00 +E0E07800 +E0E0F000 +E0E0F000 +E1E1E000 +E3C1E000 +FFC3FF80 +FF87FF80 +FE07FF80 +ENDCHAR +STARTCHAR 01C5 +ENCODING 453 +SWIDTH 1035 0 +DWIDTH 23 0 +BBX 22 15 1 0 +BITMAP +FE0210 +FF83B8 +FFC1F0 +E3C0E0 +E1E000 +E1E000 +E0E7FC +E0E7F8 +E0E070 +E0E0F0 +E1E1E0 +E3E1C0 +FFC3C0 +FF87FC +FE07FC +ENDCHAR +STARTCHAR 01C6 +ENCODING 454 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 22 16 0 0 +BITMAP +00E000 +00E210 +00E3B8 +00E1F0 +00E0E0 +00E040 +00E000 +1EE7FC +3FE7F8 +7FE070 +70E0F0 +F0E1E0 +70E1C0 +7FE3C0 +3FE7FC +1EE7FC +ENDCHAR +STARTCHAR 01C7 +ENCODING 455 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 18 15 1 0 +BITMAP +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E02380 +FFBF80 +FFBF80 +FF9E00 +ENDCHAR +STARTCHAR 01C8 +ENCODING 456 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 -5 +BITMAP +E00C +E01E +E01E +E00C +E000 +E000 +E01C +E01C +E01C +E01C +E01C +E01C +FF9C +FF9C +FF9C +001C +001C +007C +007C +00F8 +ENDCHAR +STARTCHAR 01C9 +ENCODING 457 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 21 1 -5 +BITMAP +E000 +E380 +E380 +E380 +E300 +E000 +E000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +0380 +0380 +0F80 +1F80 +1F00 +ENDCHAR +STARTCHAR 01CA +ENCODING 458 +SWIDTH 1125 0 +DWIDTH 25 0 +BBX 23 15 1 0 +BITMAP +F8381E +F8381E +FC381E +FC381E +EE381E +EE381E +E7381E +E7381E +E3B81E +E3B81E +E1F81E +E1F89E +E0F9FC +E0F9FC +E078F0 +ENDCHAR +STARTCHAR 01CB +ENCODING 459 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 20 20 1 -5 +BITMAP +F83860 +F838F0 +FC38F0 +FC3860 +EE3800 +EE3800 +E738F0 +E738F0 +E3B8F0 +E3B8F0 +E1F8F0 +E1F8F0 +E0F8F0 +E0F8F0 +E078F0 +0000F0 +0000F0 +0003E0 +0003E0 +0003C0 +ENDCHAR +STARTCHAR 01CC +ENCODING 460 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 20 1 -5 +BITMAP +0006 +000F +000F +0006 +0000 +0000 +EF0F +FF8F +F3CF +E1CF +E1CF +E1CF +E1CF +E1CF +E1CF +000F +000F +003F +003E +003C +ENDCHAR +STARTCHAR 01CE +ENCODING 462 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +1080 +19C0 +1F80 +0700 +0200 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 01D0 +ENCODING 464 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 15 -1 0 +BITMAP +84 +EE +7C +38 +10 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 01D2 +ENCODING 466 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +1080 +3980 +1F80 +0E00 +0400 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 01D4 +ENCODING 468 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +2100 +7380 +3F00 +0E00 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01D6 +ENCODING 470 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +7F80 +7F80 +0000 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01D8 +ENCODING 472 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01DA +ENCODING 474 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +2100 +7380 +3F00 +0C00 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01DC +ENCODING 476 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +0800 +1C00 +1E00 +0600 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01E6 +ENCODING 486 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0420 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 01E7 +ENCODING 487 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 -5 +BITMAP +1080 +1DC0 +1F80 +0700 +0200 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 01EA +ENCODING 490 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 -5 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0080 +0180 +0180 +01E0 +00E0 +ENDCHAR +STARTCHAR 01EB +ENCODING 491 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0300 +0200 +0600 +07C0 +0380 +ENDCHAR +STARTCHAR 01FA +ENCODING 506 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 25 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0000 +0380 +06C0 +06C0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 01FB +ENCODING 507 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 1 +BITMAP +0300 +0700 +0E00 +0000 +0000 +0F00 +1F80 +1980 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 01FC +ENCODING 508 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 18 21 0 0 +BITMAP +000200 +000600 +000E00 +001C00 +000000 +000000 +01FFC0 +01FFC0 +03FFC0 +03F000 +07F000 +077000 +0F7FC0 +0E7FC0 +1E7FC0 +1C7000 +3FF000 +3FF000 +787FC0 +707FC0 +F07FC0 +ENDCHAR +STARTCHAR 01FD +ENCODING 509 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 15 1 0 +BITMAP +0080 +01C0 +03C0 +0780 +0200 +0000 +FC78 +FEFE +47CE +3BFF +FFFF +E780 +E7CC +FFFE +7C7C +ENDCHAR +STARTCHAR 01FE +ENCODING 510 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 1 +BITMAP +00C0 +01E0 +0380 +0200 +0000 +07E2 +1FFE +3FFC +3C3C +783E +706E +70CE +F18E +730E +760E +7C1E +3C3C +3FFC +7FF8 +C7E0 +ENDCHAR +STARTCHAR 01FF +ENCODING 511 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F60 +3FC0 +7FC0 +73E0 +F5E0 +79E0 +7FC0 +7F80 +DF00 +ENDCHAR +STARTCHAR 0200 +ENCODING 512 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0880 +1DC0 +1EF0 +0630 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0201 +ENCODING 513 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +2100 +3380 +3BC0 +1CE0 +0400 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0202 +ENCODING 514 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0780 +0FC0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0203 +ENCODING 515 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 13 0 0 +BITMAP +0F00 +1FC0 +39C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0204 +ENCODING 516 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +4400 +EE00 +F780 +3180 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0205 +ENCODING 517 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +2200 +7300 +7B80 +1DC0 +0840 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0206 +ENCODING 518 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +3C00 +7E00 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0207 +ENCODING 519 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1F00 +3F80 +7180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0208 +ENCODING 520 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 9 20 -2 0 +BITMAP +4200 +E700 +7780 +3980 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 0209 +ENCODING 521 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 9 15 -2 0 +BITMAP +4400 +E600 +F700 +3380 +1000 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 020A +ENCODING 522 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 19 -1 0 +BITMAP +3C +7E +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 020B +ENCODING 523 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +3C +7F +E7 +43 +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 020C +ENCODING 524 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0840 +0CE0 +0EF0 +0738 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 020D +ENCODING 525 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +2200 +7380 +7BC0 +1DC0 +0840 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 020E +ENCODING 526 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +03C0 +07E0 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 020F +ENCODING 527 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +1F00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0210 +ENCODING 528 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 1 0 +BITMAP +4200 +7700 +7B80 +18C0 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0211 +ENCODING 529 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 15 0 0 +BITMAP +4400 +E600 +F700 +7B80 +1000 +0000 +7780 +7F00 +7F00 +7000 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 0212 +ENCODING 530 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1E00 +3F00 +3180 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0213 +ENCODING 531 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 14 0 0 +BITMAP +3C00 +7E00 +E700 +C300 +0000 +7780 +7F00 +7F00 +7000 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 0214 +ENCODING 532 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +2100 +7380 +39C0 +0CC0 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0215 +ENCODING 533 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +4200 +6700 +7780 +39C0 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0216 +ENCODING 534 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0F00 +1F80 +3180 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0217 +ENCODING 535 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1E00 +3F00 +7380 +6180 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0218 +ENCODING 536 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 21 0 -6 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +0000 +0E00 +0E00 +0600 +0200 +0C00 +ENDCHAR +STARTCHAR 0219 +ENCODING 537 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 15 1 -7 +BITMAP +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +00 +38 +38 +38 +08 +10 +ENDCHAR +STARTCHAR 021A +ENCODING 538 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 21 0 -7 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0000 +0E00 +0E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 021B +ENCODING 539 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 19 0 -7 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +00 +1C +1C +1C +04 +08 +ENDCHAR +STARTCHAR 022A +ENCODING 554 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0FF0 +0FF0 +0000 +0660 +0E70 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 022B +ENCODING 555 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 17 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +3980 +3BC0 +3980 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 022C +ENCODING 556 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 24 0 0 +BITMAP +07F0 +07F0 +0000 +0000 +0730 +07F0 +0FE0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 022D +ENCODING 557 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1CC0 +3F80 +3F80 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0230 +ENCODING 560 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0FF0 +0FF0 +0000 +0180 +03C0 +0180 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0231 +ENCODING 561 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +0600 +0E00 +0E00 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0232 +ENCODING 562 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +1FC0 +1FC0 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0233 +ENCODING 563 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 -5 +BITMAP +3F80 +3F80 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0237 +ENCODING 567 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 14 -1 -5 +BITMAP +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 0259 +ENCODING 601 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +7E00 +FF00 +6780 +0380 +FFC0 +FFC0 +F380 +7F80 +3E00 +ENDCHAR +STARTCHAR 02BC +ENCODING 700 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 3 6 1 9 +BITMAP +E0 +E0 +E0 +E0 +C0 +40 +ENDCHAR +STARTCHAR 02C6 +ENCODING 710 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 7 4 2 11 +BITMAP +10 +78 +FE +C6 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 4 1 11 +BITMAP +42 +F7 +3E +1C +ENDCHAR +STARTCHAR 02C9 +ENCODING 713 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 2 1 11 +BITMAP +FF +FF +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 7 4 2 11 +BITMAP +C6 +C6 +FE +78 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 3 1 11 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 6 5 1 11 +BITMAP +78 +7C +CC +7C +78 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 5 5 1 -5 +BITMAP +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 3 1 11 +BITMAP +39 +7F +CE +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 5 2 10 +BITMAP +22 +37 +7E +CC +08 +ENDCHAR +STARTCHAR 0300 +ENCODING 768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 4 2 11 +BITMAP +80 +C0 +F0 +30 +ENDCHAR +STARTCHAR 0301 +ENCODING 769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 4 3 11 +BITMAP +10 +38 +F0 +C0 +ENDCHAR +STARTCHAR 0302 +ENCODING 770 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +10 +7C +EE +C6 +ENDCHAR +STARTCHAR 0303 +ENCODING 771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 3 2 11 +BITMAP +73 +FE +DE +ENDCHAR +STARTCHAR 0304 +ENCODING 772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 2 11 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 0306 +ENCODING 774 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +C6 +C6 +FE +3C +ENDCHAR +STARTCHAR 0307 +ENCODING 775 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 2 11 +BITMAP +C0 +E0 +E0 +ENDCHAR +STARTCHAR 0308 +ENCODING 776 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 3 1 11 +BITMAP +67 +F7 +67 +ENDCHAR +STARTCHAR 0309 +ENCODING 777 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 4 10 +BITMAP +F0 +F8 +18 +38 +70 +ENDCHAR +STARTCHAR 030A +ENCODING 778 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 2 11 +BITMAP +70 +F8 +98 +F8 +70 +ENDCHAR +STARTCHAR 030B +ENCODING 779 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 2 10 +BITMAP +22 +37 +76 +EC +ENDCHAR +STARTCHAR 030C +ENCODING 780 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +86 +EE +7C +38 +ENDCHAR +STARTCHAR 030F +ENCODING 783 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 9 4 2 11 +BITMAP +8400 +CE00 +F700 +3380 +ENDCHAR +STARTCHAR 0311 +ENCODING 785 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 10 +BITMAP +78 +FE +C6 +C6 +ENDCHAR +STARTCHAR 0312 +ENCODING 786 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 5 1 10 +BITMAP +60 +40 +E0 +E0 +40 +ENDCHAR +STARTCHAR 031B +ENCODING 795 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 4 4 10 +BITMAP +38 +38 +F0 +E0 +ENDCHAR +STARTCHAR 0323 +ENCODING 803 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 2 -3 +BITMAP +40 +E0 +60 +ENDCHAR +STARTCHAR 0324 +ENCODING 804 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 3 2 -4 +BITMAP +CE +EE +CE +ENDCHAR +STARTCHAR 0326 +ENCODING 806 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 1 -7 +BITMAP +60 +F0 +70 +20 +60 +ENDCHAR +STARTCHAR 0327 +ENCODING 807 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 2 -5 +BITMAP +20 +70 +18 +F8 +F0 +ENDCHAR +STARTCHAR 0328 +ENCODING 808 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 2 -5 +BITMAP +40 +C0 +80 +F0 +E0 +ENDCHAR +STARTCHAR 032E +ENCODING 814 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 1 -4 +BITMAP +22 +E3 +7F +3E +ENDCHAR +STARTCHAR 0331 +ENCODING 817 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 2 -3 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 1E80 +ENCODING 7808 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +008000 +01C000 +01E000 +006000 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E81 +ENCODING 7809 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +0100 +0380 +03C0 +00E0 +0000 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E82 +ENCODING 7810 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +001000 +003800 +007000 +00C000 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E83 +ENCODING 7811 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0200 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E84 +ENCODING 7812 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 19 0 0 +BITMAP +039800 +03BC00 +039800 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E85 +ENCODING 7813 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 13 0 0 +BITMAP +0670 +0E70 +0660 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E9E +ENCODING 7838 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1FC0 +7FE0 +7FE0 +F1E0 +E3C0 +E780 +E700 +E7E0 +E7F0 +E0F0 +E070 +E070 +EFF0 +EFE0 +EFC0 +ENDCHAR +STARTCHAR 1EA0 +ENCODING 7840 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 -4 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EA1 +ENCODING 7841 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 12 0 -3 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EA2 +ENCODING 7842 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0780 +00C0 +01C0 +0380 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA3 +ENCODING 7843 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0E00 +0F00 +0180 +0300 +0700 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA4 +ENCODING 7844 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0008 +001C +0078 +0320 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA5 +ENCODING 7845 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0300 +0700 +0E00 +0800 +0000 +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA6 +ENCODING 7846 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0040 +00E0 +0070 +0310 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA7 +ENCODING 7847 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0400 +0E00 +0F00 +0380 +0100 +0000 +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA8 +ENCODING 7848 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 25 0 0 +BITMAP +00E0 +01F0 +0030 +0030 +0070 +0340 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA9 +ENCODING 7849 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0E00 +0F00 +0180 +0300 +0700 +0000 +0200 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EAA +ENCODING 7850 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +0720 +0FE0 +1FC0 +0000 +0100 +0780 +0FE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EAB +ENCODING 7851 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 0 +BITMAP +1CC0 +1FC0 +3380 +0000 +0000 +0600 +0F00 +1FC0 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EAC +ENCODING 7852 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 -4 +BITMAP +0300 +07C0 +1EE0 +0840 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EAD +ENCODING 7853 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 17 0 -3 +BITMAP +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EAE +ENCODING 7854 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +00C0 +01C0 +0380 +0200 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EAF +ENCODING 7855 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0300 +0780 +0E00 +0800 +0000 +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB0 +ENCODING 7856 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +0400 +0F00 +0780 +0100 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB1 +ENCODING 7857 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0C00 +0F00 +0780 +0100 +0000 +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB2 +ENCODING 7858 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +07C0 +00C0 +01C0 +0100 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB3 +ENCODING 7859 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0F00 +0F00 +0180 +0300 +0600 +0000 +30C0 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB4 +ENCODING 7860 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0F60 +0FE0 +19C0 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB5 +ENCODING 7861 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 18 0 0 +BITMAP +1EC0 +1FC0 +3380 +0000 +0000 +38C0 +1FC0 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB6 +ENCODING 7862 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 -4 +BITMAP +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EB7 +ENCODING 7863 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 17 0 -3 +BITMAP +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EB8 +ENCODING 7864 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 -4 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1800 +1800 +0800 +ENDCHAR +STARTCHAR 1EB9 +ENCODING 7865 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 12 0 -3 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0400 +0E00 +0C00 +ENDCHAR +STARTCHAR 1EBA +ENCODING 7866 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +3E00 +0600 +0E00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBB +ENCODING 7867 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0C00 +1F00 +0300 +0300 +0E00 +0400 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EBC +ENCODING 7868 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +7B00 +7F00 +CE00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBD +ENCODING 7869 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1CC0 +3F80 +3F00 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EBE +ENCODING 7870 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 23 1 0 +BITMAP +0060 +00E0 +03C0 +1900 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBF +ENCODING 7871 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC0 +ENCODING 7872 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 23 1 0 +BITMAP +0200 +0700 +0380 +1880 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC1 +ENCODING 7873 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0800 +0C00 +1E00 +0700 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC2 +ENCODING 7874 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 25 1 0 +BITMAP +0700 +0F80 +0180 +0180 +0380 +1A00 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC3 +ENCODING 7875 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0C00 +1F00 +0300 +0300 +0E00 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC4 +ENCODING 7876 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 24 1 0 +BITMAP +3900 +7F00 +FE00 +0000 +0800 +3C00 +7F00 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC5 +ENCODING 7877 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 19 0 0 +BITMAP +1CC0 +3F80 +3700 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC6 +ENCODING 7878 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 24 1 -4 +BITMAP +1800 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1800 +1800 +0800 +ENDCHAR +STARTCHAR 1EC7 +ENCODING 7879 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 17 0 -3 +BITMAP +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0400 +0E00 +0C00 +ENDCHAR +STARTCHAR 1EC8 +ENCODING 7880 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 0 +BITMAP +F8 +18 +18 +30 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 1EC9 +ENCODING 7881 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +F0 +F8 +18 +30 +70 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 1ECA +ENCODING 7882 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 19 1 -4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +60 +E0 +40 +ENDCHAR +STARTCHAR 1ECB +ENCODING 7883 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +E0 +F0 +F0 +60 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +60 +E0 +40 +ENDCHAR +STARTCHAR 1ECC +ENCODING 7884 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 21 0 -6 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +0000 +0000 +0000 +0180 +0180 +ENDCHAR +STARTCHAR 1ECD +ENCODING 7885 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1ECE +ENCODING 7886 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +07C0 +06C0 +00C0 +01C0 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ECF +ENCODING 7887 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E00 +0400 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED0 +ENCODING 7888 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0004 +001E +003C +01B0 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED1 +ENCODING 7889 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED2 +ENCODING 7890 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 1 +BITMAP +0070 +0078 +0198 +03C0 +07E0 +0670 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED3 +ENCODING 7891 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 1 +BITMAP +0C00 +1E00 +0700 +0000 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED4 +ENCODING 7892 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 25 0 0 +BITMAP +0070 +00F8 +0018 +0018 +0030 +01A0 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED5 +ENCODING 7893 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E00 +0400 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED6 +ENCODING 7894 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0730 +0FF0 +0CE0 +0000 +03C0 +07E0 +0E70 +0020 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED7 +ENCODING 7895 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 0 +BITMAP +1CC0 +3F80 +3780 +0000 +0000 +0400 +1F00 +3B80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED8 +ENCODING 7896 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 26 0 -6 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +0000 +0000 +0000 +0180 +0180 +ENDCHAR +STARTCHAR 1ED9 +ENCODING 7897 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1EDA +ENCODING 7898 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 1 +BITMAP +00C000 +01E000 +038000 +020000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDB +ENCODING 7899 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0830 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EDC +ENCODING 7900 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 1 +BITMAP +030000 +038000 +01E000 +004000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDD +ENCODING 7901 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0800 +0C00 +0E00 +0700 +0130 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EDE +ENCODING 7902 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 21 0 0 +BITMAP +038000 +07C000 +04C000 +00C000 +01C000 +010380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDF +ENCODING 7903 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E30 +0430 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EE0 +ENCODING 7904 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 0 +BITMAP +073000 +07F000 +0FE000 +000000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EE1 +ENCODING 7905 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 14 0 0 +BITMAP +1CC0 +3F80 +3F80 +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EE2 +ENCODING 7906 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 22 0 -6 +BITMAP +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +000000 +000000 +000000 +018000 +018000 +018000 +ENDCHAR +STARTCHAR 1EE3 +ENCODING 7907 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 16 0 -5 +BITMAP +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1EE4 +ENCODING 7908 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 -4 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +0000 +0600 +0600 +0400 +ENDCHAR +STARTCHAR 1EE5 +ENCODING 7909 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 12 1 -3 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 1EE6 +ENCODING 7910 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +1F00 +0300 +0300 +0600 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EE7 +ENCODING 7911 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3C00 +3E00 +0600 +0600 +0C00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EE8 +ENCODING 7912 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 1 +BITMAP +0300 +0F00 +0C00 +0803 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EE9 +ENCODING 7913 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +0400 +0E00 +1E00 +180C +100C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEA +ENCODING 7914 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 1 +BITMAP +0C00 +0F00 +0300 +0103 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EEB +ENCODING 7915 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +0800 +1C00 +1E00 +060C +020C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEC +ENCODING 7916 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 21 1 0 +BITMAP +1E00 +1F00 +0300 +0303 +0603 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EED +ENCODING 7917 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +3C00 +3E00 +0600 +060C +0C0C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEE +ENCODING 7918 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 0 +BITMAP +1CC0 +3FC0 +3383 +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EEF +ENCODING 7919 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 14 1 0 +BITMAP +3980 +7F80 +670C +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EF0 +ENCODING 7920 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 -3 +BITMAP +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +0400 +0E00 +0600 +ENDCHAR +STARTCHAR 1EF1 +ENCODING 7921 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 14 1 -3 +BITMAP +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 1EF2 +ENCODING 7922 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0800 +1C00 +0E00 +0700 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF3 +ENCODING 7923 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +0800 +0C00 +0E00 +0700 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF4 +ENCODING 7924 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 -4 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +0000 +0600 +0700 +0200 +ENDCHAR +STARTCHAR 1EF5 +ENCODING 7925 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1E00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF6 +ENCODING 7926 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0F00 +0180 +0380 +0700 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF7 +ENCODING 7927 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +1E00 +1F00 +0300 +0300 +0600 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF8 +ENCODING 7928 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 0 +BITMAP +1EC0 +1FC0 +3380 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF9 +ENCODING 7929 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +1CC0 +3F80 +3780 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 10 3 0 4 +BITMAP +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 19 3 0 4 +BITMAP +FFFFE0 +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 1 8 +BITMAP +20 +40 +C0 +E0 +F0 +F0 +60 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 0 8 +BITMAP +60 +F0 +F0 +70 +30 +20 +40 +ENDCHAR +STARTCHAR 201A +ENCODING 8218 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 1 -3 +BITMAP +60 +F0 +F0 +F0 +20 +60 +C0 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 8 +BITMAP +3180 +6300 +4200 +F780 +F780 +F380 +7380 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 8 +BITMAP +6300 +F780 +F780 +F780 +2100 +6300 +4200 +ENDCHAR +STARTCHAR 201E +ENCODING 8222 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 -3 +BITMAP +6700 +F780 +F780 +F780 +2100 +6300 +C600 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 19 1 -3 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 19 1 -3 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 6 7 3 3 +BITMAP +78 +FC +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 4 1 0 +BITMAP +6187 +F3CF +F3CF +6187 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 1125 0 +DWIDTH 25 0 +BBX 24 15 0 0 +BITMAP +1E0000 +3F0040 +6301C0 +638780 +730E00 +3F3800 +1E7000 +01C000 +07B83C +0E7E7E +38E667 +70C7E3 +C0C6E3 +007E7E +003C3C +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +10 +30 +70 +E0 +C0 +E0 +70 +38 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +E0 +60 +30 +38 +30 +60 +E0 +40 +ENDCHAR +STARTCHAR 2044 +ENCODING 8260 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 10 15 -3 0 +BITMAP +00C0 +00C0 +0180 +0180 +0300 +0300 +0600 +0C00 +0C00 +1800 +1800 +3000 +3000 +6000 +C000 +ENDCHAR +STARTCHAR 2074 +ENCODING 8308 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 0 9 +BITMAP +30 +70 +70 +F0 +F0 +30 +ENDCHAR +STARTCHAR 20A1 +ENCODING 8353 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 18 0 -2 +BITMAP +0068 +07F8 +1FF8 +3FF0 +39B0 +7BE0 +7360 +7360 +F6C0 +76C0 +7F80 +7D80 +7D90 +3FF0 +1FF0 +37E0 +3600 +3600 +ENDCHAR +STARTCHAR 20A3 +ENCODING 8355 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 0 0 +BITMAP +7F80 +7F80 +7F80 +7000 +7000 +7000 +7F80 +7F80 +7F80 +7000 +7000 +FE00 +FE00 +7000 +7000 +ENDCHAR +STARTCHAR 20A4 +ENCODING 8356 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1F00 +3FC0 +7FC0 +70C0 +7000 +7000 +7000 +FF00 +3800 +FF00 +1C00 +1800 +7EF0 +FFE0 +C3C0 +ENDCHAR +STARTCHAR 20A6 +ENCODING 8358 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +7C1C +7C1C +7E1C +7E1C +771C +771C +FFFF +FFFF +71DC +71DC +70FC +70FC +707C +707C +703C +ENDCHAR +STARTCHAR 20A7 +ENCODING 8359 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 0 0 +BITMAP +7F80 +7FC0 +7FE0 +71E0 +FFF0 +FFF0 +71E0 +7FE0 +7FC0 +7E00 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 20A9 +ENCODING 8361 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 15 0 0 +BITMAP +F0E1E0 +70E1E0 +70F1E0 +79F1C0 +79F1C0 +39FBC0 +FFFFE0 +FFFFE0 +3BBB80 +3F9F80 +1F1F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 20AB +ENCODING 8363 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 19 0 -3 +BITMAP +00E0 +00E0 +07F0 +07F0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +03F0 +0FFC +1FF8 +3F18 +3C00 +FFE0 +FFE0 +7800 +FFE0 +FFE0 +3C00 +3F18 +1FF8 +0FFC +03F0 +ENDCHAR +STARTCHAR 20AD +ENCODING 8365 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +70E0 +71E0 +73C0 +7380 +7780 +7F00 +FFF0 +FFF0 +7F00 +7780 +7380 +73C0 +71E0 +70E0 +70F0 +ENDCHAR +STARTCHAR 20B1 +ENCODING 8369 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 0 0 +BITMAP +7F80 +7FC0 +7FE0 +71E0 +FFF0 +70E0 +FFF0 +71E0 +71E0 +7FC0 +7F80 +7E00 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 20B2 +ENCODING 8370 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 -3 +BITMAP +0380 +07E0 +1FF8 +3FFC +7FBC +7B90 +7380 +F380 +F3FE +73FE +738E +7B9E +3FBC +3FFC +1FF8 +07E0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 20B5 +ENCODING 8373 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 19 0 -3 +BITMAP +0380 +07E0 +1FF0 +3FF0 +3F90 +7B80 +7380 +7380 +F380 +7380 +7380 +7B80 +7F90 +3FF0 +1FF0 +07F0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 20B9 +ENCODING 8377 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 10 15 2 0 +BITMAP +FFC0 +FFC0 +0F00 +0700 +FFC0 +FFC0 +0700 +0F00 +FE00 +F000 +F000 +7800 +3C00 +1E00 +0F00 +ENDCHAR +STARTCHAR 20BA +ENCODING 8378 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +7000 +7000 +7100 +7700 +7F00 +FC00 +F100 +7F00 +FC00 +F0E0 +70E0 +71E0 +7FC0 +7F80 +7F00 +ENDCHAR +STARTCHAR 20BC +ENCODING 8380 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +0C00 +0C00 +3F80 +7FC0 +FFE0 +EDE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ENDCHAR +STARTCHAR 20BD +ENCODING 8381 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 -1 0 +BITMAP +3FC0 +3FE0 +3FF0 +38F0 +3870 +3870 +38F0 +FFF0 +FFE0 +3F00 +3800 +FE00 +FE00 +3800 +3800 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 1260 0 +DWIDTH 28 0 +BBX 26 15 1 0 +BITMAP +F8383E00 +F8387F00 +FC38FF80 +FC38E380 +EE39E3C0 +EE38E3C0 +E738E380 +E738FF80 +E3B87F00 +E3B81C00 +E1F80000 +E1F80000 +E0F8FFC0 +E0F8FFC0 +E078FFC0 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 5 0 10 +BITMAP +F900 +4D00 +4E80 +4A80 +4A80 +ENDCHAR +STARTCHAR 2212 +ENCODING 8722 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 3 1 6 +BITMAP +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 2215 +ENCODING 8725 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 17 1 -1 +BITMAP +0380 +0380 +0300 +0700 +0600 +0E00 +0E00 +0C00 +1C00 +1800 +3800 +3000 +7000 +7000 +6000 +E000 +C000 +ENDCHAR +STARTCHAR 2219 +ENCODING 8729 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 6 7 3 3 +BITMAP +78 +FC +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 8 1 1 +BITMAP +7CC0 +FFC0 +4780 +0000 +3800 +7FE0 +EFC0 +0780 +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 12 1 1 +BITMAP +0300 +0300 +FF80 +FF80 +FF80 +1800 +FF80 +FF80 +FF80 +6000 +C000 +C000 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0060 +01E0 +07E0 +3F80 +7C00 +7800 +7E00 +1FC0 +07E0 +00E0 +0020 +0000 +FFE0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +8000 +F000 +FC00 +3F00 +0FC0 +03C0 +0FC0 +7F00 +F800 +E000 +8000 +0000 +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB01 +ENCODING 64257 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 16 0 0 +BITMAP +0F00 +1F70 +3E70 +3870 +3830 +3800 +3800 +FE70 +FE70 +FE70 +3870 +3870 +3870 +3870 +3870 +3870 +ENDCHAR +STARTCHAR FB02 +ENCODING 64258 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 16 0 0 +BITMAP +0F70 +1F70 +3E70 +3870 +3870 +3870 +3870 +FE70 +FE70 +FE70 +3870 +3870 +3870 +3870 +3870 +3870 +ENDCHAR +ENDFONT diff --git a/examples/uplot_lissajous_curves.py b/examples/lissajous_curves.py similarity index 100% rename from examples/uplot_lissajous_curves.py rename to examples/lissajous_curves.py diff --git a/examples/uplot_simpletest.py b/examples/plot_simpletest.py similarity index 100% rename from examples/uplot_simpletest.py rename to examples/plot_simpletest.py diff --git a/examples/plot_polar_advanced_example.py b/examples/polar_advanced.py similarity index 100% rename from examples/plot_polar_advanced_example.py rename to examples/polar_advanced.py From 5906d76e5cceabad10c1480dbb049ca793ca72ff Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 28 Jul 2023 21:44:53 -0400 Subject: [PATCH 13/61] pylint --- examples/cartesian_trig_functions.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/cartesian_trig_functions.py b/examples/cartesian_trig_functions.py index 487e7be..67c85b3 100644 --- a/examples/cartesian_trig_functions.py +++ b/examples/cartesian_trig_functions.py @@ -1,10 +1,14 @@ -import ulab.numpy as np -from circuitpython_uplot.plot import Plot -from circuitpython_uplot.cartesian import Cartesian +# SPDX-FileCopyrightText: Copyright (c) Jose D. Montoya +# +# SPDX-License-Identifier: MIT + import board import displayio +import ulab.numpy as np from adafruit_bitmap_font import bitmap_font from adafruit_display_text import bitmap_label +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian font_file = "fonts/LeagueSpartan-Bold-16.bdf" font_to_use = bitmap_font.load_font(font_file) From 39847176735c4d8c91a6cb51531f758f2de7a441 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 01:51:04 -0400 Subject: [PATCH 14/61] pie example --- examples/uplot_pie_example.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/uplot_pie_example.py b/examples/uplot_pie_example.py index 69dac92..ea177c8 100644 --- a/examples/uplot_pie_example.py +++ b/examples/uplot_pie_example.py @@ -5,7 +5,7 @@ import time import board from circuitpython_uplot.plot import Plot -from circuitpython_uplot.pie import upie +from circuitpython_uplot.pie import Pie # Setting up the display @@ -17,7 +17,7 @@ plot.axs_params(axstype="box") a = [5, 2, 7, 3] -upie(plot, a) +Pie(plot, a) # Plotting and showing the plot display.show(plot) From 31f57d1bbd4536234c4f48632c74fcaa14bdc940 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 13:17:35 -0400 Subject: [PATCH 15/61] fixing bars3d --- circuitpython_uplot/bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuitpython_uplot/bar.py b/circuitpython_uplot/bar.py index 04e8e4b..07d628a 100644 --- a/circuitpython_uplot/bar.py +++ b/circuitpython_uplot/bar.py @@ -113,7 +113,7 @@ def __init__( self._create_bars(xstart, i) if projection: - self._create_projections(xstart, i, len(color_palette)) + self._create_projections(xstart, i, len(self._bars)) plot.show_text( str(y[i]), From 8769026226b9c398cd188bc3b7865f9b74ba0d61 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 14:58:56 -0400 Subject: [PATCH 16/61] fixing scale space bar between --- examples/uplot_logging_animation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/uplot_logging_animation.py b/examples/uplot_logging_animation.py index 60caa07..225d43a 100644 --- a/examples/uplot_logging_animation.py +++ b/examples/uplot_logging_animation.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT - import time import random import board From 0b90425d627ade153722f1d649c27c884bc06bcc Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 14:59:29 -0400 Subject: [PATCH 17/61] fixing bar --- circuitpython_uplot/bar.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/circuitpython_uplot/bar.py b/circuitpython_uplot/bar.py index 07d628a..f1cc770 100644 --- a/circuitpython_uplot/bar.py +++ b/circuitpython_uplot/bar.py @@ -70,14 +70,17 @@ def __init__( self._projection = projection self._filled = fill + self._y = [i * plot.scale for i in y] + if max_value is None: - y_max = max(y) + y_max = max(self._y) else: y_max = max_value - self._y = [i * plot.scale for i in y] - self._bar_space = int(bar_space / plot.scale) + + xstart = int(xstart / plot.scale) + self._graphx = plot.scale * ceil( abs(plot._newxmax - plot._newxmin) / (len(x) + 4) ) @@ -120,7 +123,7 @@ def __init__( xstart + (i * self._graphx) + self._graphx // 2, plot._newymin, ) - xstart = xstart + self._bar_space + xstart = xstart + self._bar_space // plot.scale plot._index_colorused = plot._index_colorused + 1 self._color_index = self._color_index + 1 else: @@ -164,11 +167,11 @@ def __init__( plot._index_colorused, ) - xstart = xstart + bar_space + xstart = xstart + self._bar_space plot._index_colorused = plot._index_colorused + 1 plot.show_text( str(y[i]), - xstart + (i * self._graphx) - bar_space + self._graphx // 2, + xstart + (i * self._graphx) - self._bar_space + self._graphx // 2, plot._newymin, ) From 3d5805c224b8612cc27415090cd22ccad31943d7 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 22:13:18 -0400 Subject: [PATCH 18/61] adding line styles --- docs/api.rst | 2 +- docs/conf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 5694701..e3cea03 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,4 +1,4 @@ -Uplot Library +Microplot Library ============== .. automodule:: circuitpython_uplot.plot diff --git a/docs/conf.py b/docs/conf.py index 9c7c2b2..65d7fbc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,7 +42,7 @@ source_suffix = ".rst" master_doc = "index" # General information about the project. -project = "CircuitPython uplot Library" +project = "CircuitPython microplot Library" creation_year = "2023" current_year = str(datetime.datetime.now().year) year_duration = ( From ca0f6ef69440fab0f2649c2864f9e4ff984ca86c Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 22:13:55 -0400 Subject: [PATCH 19/61] adding style line --- .pylintrc | 2 +- README.rst | 2 +- circuitpython_uplot/cartesian.py | 49 +++++- circuitpython_uplot/shade.py | 2 +- docs/{uplot_3DBars.jpg => 3DBars.jpg} | Bin ...sian_advance.jpg => cartesian_advance.jpg} | Bin ...rtesian.gif => cartesian_logging_data.gif} | Bin docs/{uplot_ex6.jpg => display_shapes.jpg} | Bin docs/examples.rst | 146 +++++++++--------- docs/index.rst | 10 +- ...{uplot_ex5.jpg => integration_example.jpg} | Bin docs/{uplot_pie.jpg => pie.jpg} | Bin docs/{uplot_ex4.jpg => plot_example.jpg} | Bin docs/quick_start.rst | 2 +- docs/{uplot_shade.jpg => shade.jpg} | Bin .../{uplot_ex12.jpg => stackplot_example.jpg} | Bin docs/{uplot_svg.jpg => svg.jpg} | Bin docs/{uplot_ex3.jpg => tickparameters.jpg} | Bin docs/{uplot_ex16.jpg => uboxplot_example.jpg} | Bin docs/uplot_ex10.jpg | Bin 22878 -> 0 bytes .../{uplot_bar_3Dbars.py => bar_3Dbars.py} | 0 ...olor_changing.py => bar_color_changing.py} | 0 ...ar_colorpalette.py => bar_colorpalette.py} | 0 .../{uplot_bar_example.py => bar_example.py} | 0 ..._scale_example.py => bar_scale_example.py} | 0 ...ating_values.py => bar_updating_values.py} | 0 ...sian_advanced.py => cartesian_advanced.py} | 0 ...ggin_data.py => cartesian_logging_data.py} | 0 ..._cartesian_table.py => cartesian_table.py} | 0 ...ot_display_shapes.py => display_shapes.py} | 0 .../{uplot_fillbetween.py => fillbetween.py} | 0 ...tion_example.py => integration_example.py} | 0 examples/{uplot_logging.py => logging.py} | 0 ...ging_animation.py => logging_animation.py} | 0 ...g_values.py => logging_changing_values.py} | 0 ...{uplot_logging_fill.py => logging_fill.py} | 0 ...plot_logging_table.py => logging_table.py} | 0 examples/{uplot_map.py => map.py} | 0 .../{uplot_pie_example.py => pie_example.py} | 0 ...{uplot_plot_example.py => plot_example.py} | 0 examples/plot_line_styles.py | 42 +++++ ...plot_polar_example.py => polar_example.py} | 0 .../{uplot_polar_plots.py => polar_plots.py} | 0 ...ot_readme_example.py => readme_example.py} | 0 examples/{uplot_scatter.py => scatter.py} | 0 ...plot_shade_example.py => shade_example.py} | 0 examples/{uplot_sparkline.py => sparkline.py} | 0 examples/{uplot_stackplot.py => stackplot.py} | 0 .../{uplot_svg_example.py => svg_example.py} | 0 ...ot_tickparameters.py => tickparameters.py} | 0 examples/{uplot_uboxplot.py => uboxplot.py} | 0 51 files changed, 165 insertions(+), 90 deletions(-) rename docs/{uplot_3DBars.jpg => 3DBars.jpg} (100%) rename docs/{uplot_cartesian_advance.jpg => cartesian_advance.jpg} (100%) rename docs/{uplot_cartesian.gif => cartesian_logging_data.gif} (100%) rename docs/{uplot_ex6.jpg => display_shapes.jpg} (100%) rename docs/{uplot_ex5.jpg => integration_example.jpg} (100%) rename docs/{uplot_pie.jpg => pie.jpg} (100%) rename docs/{uplot_ex4.jpg => plot_example.jpg} (100%) rename docs/{uplot_shade.jpg => shade.jpg} (100%) rename docs/{uplot_ex12.jpg => stackplot_example.jpg} (100%) rename docs/{uplot_svg.jpg => svg.jpg} (100%) rename docs/{uplot_ex3.jpg => tickparameters.jpg} (100%) rename docs/{uplot_ex16.jpg => uboxplot_example.jpg} (100%) delete mode 100644 docs/uplot_ex10.jpg rename examples/{uplot_bar_3Dbars.py => bar_3Dbars.py} (100%) rename examples/{uplot_bar_color_changing.py => bar_color_changing.py} (100%) rename examples/{uplot_bar_colorpalette.py => bar_colorpalette.py} (100%) rename examples/{uplot_bar_example.py => bar_example.py} (100%) rename examples/{uplot_bar_scale_example.py => bar_scale_example.py} (100%) rename examples/{uplot_bar_updating_values.py => bar_updating_values.py} (100%) rename examples/{uplot_cartesian_advanced.py => cartesian_advanced.py} (100%) rename examples/{uplot_cartesian_loggin_data.py => cartesian_logging_data.py} (100%) rename examples/{uplot_cartesian_table.py => cartesian_table.py} (100%) rename examples/{uplot_display_shapes.py => display_shapes.py} (100%) rename examples/{uplot_fillbetween.py => fillbetween.py} (100%) rename examples/{uplot_integration_example.py => integration_example.py} (100%) rename examples/{uplot_logging.py => logging.py} (100%) rename examples/{uplot_logging_animation.py => logging_animation.py} (100%) rename examples/{uplot_logging_changing_values.py => logging_changing_values.py} (100%) rename examples/{uplot_logging_fill.py => logging_fill.py} (100%) rename examples/{uplot_logging_table.py => logging_table.py} (100%) rename examples/{uplot_map.py => map.py} (100%) rename examples/{uplot_pie_example.py => pie_example.py} (100%) rename examples/{uplot_plot_example.py => plot_example.py} (100%) create mode 100644 examples/plot_line_styles.py rename examples/{uplot_polar_example.py => polar_example.py} (100%) rename examples/{uplot_polar_plots.py => polar_plots.py} (100%) rename examples/{uplot_readme_example.py => readme_example.py} (100%) rename examples/{uplot_scatter.py => scatter.py} (100%) rename examples/{uplot_shade_example.py => shade_example.py} (100%) rename examples/{uplot_sparkline.py => sparkline.py} (100%) rename examples/{uplot_stackplot.py => stackplot.py} (100%) rename examples/{uplot_svg_example.py => svg_example.py} (100%) rename examples/{uplot_tickparameters.py => tickparameters.py} (100%) rename examples/{uplot_uboxplot.py => uboxplot.py} (100%) diff --git a/.pylintrc b/.pylintrc index 4408bdc..1314d86 100644 --- a/.pylintrc +++ b/.pylintrc @@ -110,7 +110,7 @@ valid-metaclass-classmethod-first-arg=mcs max-args=15 max-attributes=30 max-bool-expr=5 -max-branches=20 +max-branches=25 max-locals=25 max-parents=7 max-public-methods=20 diff --git a/README.rst b/README.rst index 5a519ba..d4d76f4 100644 --- a/README.rst +++ b/README.rst @@ -28,7 +28,7 @@ For detailed view of the library please refer to the `Quick start guide `_. Thanks to @Casainho +Below a picture of a real live application. for more information visit the project `page `_. Thanks to @Casainho .. image:: https://github.com/jposada202020/CircuitPython_uplot/blob/main/docs/logging.png diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 6ec7c33..f368f4b 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -39,6 +39,7 @@ def __init__( rangex: Optional[list] = None, rangey: Optional[list] = None, line_color: Optional[int] = None, + line_style: Optional[str] = None, fill: bool = False, nudge: bool = True, logging: bool = False, @@ -51,6 +52,7 @@ def __init__( :param list|None rangex: x range limits. Defaults to None :param list|None rangey: y range limits. Defaults to None :param int|None line_color: line color. Defaults to None + :param str|None line_style: line style. Defaults to None :param bool fill: Show the filling. Defaults to `False` :param bool nudge: moves the graph a little for better displaying. Defaults to `True` :param bool logging: used to change the logic of the cartesian to work as a logger @@ -61,6 +63,17 @@ def __init__( if line_color is not None: plot._plot_palette[plot._index_colorused] = line_color + if line_style is None: + self._line_type = "-" + else: + self._line_type = line_style + + if self._line_type not in ["-", ".", "- -", "-.-"]: + raise ValueError("line_style must be a valid option") + + if line_style is None: + self._line_type = "-" + if nudge: nudge_factor = 1 else: @@ -123,14 +136,9 @@ def __init__( break if y[index] >= ymax: continue - draw_line( - plot._plotbitmap, - xnorm[index], - ynorm[index], - xnorm[index + 1], - ynorm[index + 1], - plot._index_colorused, - ) + + self._draw_plotline(plot, index, xnorm, ynorm) + if plot._showticks: if plot._cartesianfirst: if logging: @@ -144,3 +152,28 @@ def __init__( plot._index_colorused = plot._index_colorused else: plot._index_colorused = plot._index_colorused + 1 + + def _draw_plotline(self, plot, index, xnorm, ynorm): + if self._line_type == "-": + self._plot_line(plot, index, xnorm, ynorm) + elif self._line_type == "-.-": + if index % 3 == 0: + self._plot_line(plot, index, xnorm, ynorm) + else: + plot._plotbitmap[xnorm[index], ynorm[index]] = plot._index_colorused + elif self._line_type == ".": + plot._plotbitmap[xnorm[index], ynorm[index]] = plot._index_colorused + elif self._line_type == "- -": + if index % 2 == 0: + self._plot_line(plot, index, xnorm, ynorm) + + @staticmethod + def _plot_line(plot, index, xnorm, ynorm): + draw_line( + plot._plotbitmap, + xnorm[index], + ynorm[index], + xnorm[index + 1], + ynorm[index + 1], + plot._index_colorused, + ) diff --git a/circuitpython_uplot/shade.py b/circuitpython_uplot/shade.py index de6ebb8..23d9c78 100644 --- a/circuitpython_uplot/shade.py +++ b/circuitpython_uplot/shade.py @@ -7,7 +7,7 @@ `shade` ================================================================================ -CircuitPython shade utility for uPlot. +CircuitPython shade utility for Plotting. * Author(s): Jose D. Montoya diff --git a/docs/uplot_3DBars.jpg b/docs/3DBars.jpg similarity index 100% rename from docs/uplot_3DBars.jpg rename to docs/3DBars.jpg diff --git a/docs/uplot_cartesian_advance.jpg b/docs/cartesian_advance.jpg similarity index 100% rename from docs/uplot_cartesian_advance.jpg rename to docs/cartesian_advance.jpg diff --git a/docs/uplot_cartesian.gif b/docs/cartesian_logging_data.gif similarity index 100% rename from docs/uplot_cartesian.gif rename to docs/cartesian_logging_data.gif diff --git a/docs/uplot_ex6.jpg b/docs/display_shapes.jpg similarity index 100% rename from docs/uplot_ex6.jpg rename to docs/display_shapes.jpg diff --git a/docs/examples.rst b/docs/examples.rst index 9c06ddc..ef16cba 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -14,40 +14,40 @@ Plot Example Plot some data for x and y -.. literalinclude:: ../examples/uplot_plot_example.py - :caption: examples/uplot_plot_example.py +.. literalinclude:: ../examples/plot_example.py + :caption: examples/plot_example.py :lines: 5- -.. image:: ../docs/uplot_ex4.jpg +.. image:: ../docs/plot_example.jpg Tick Parameters Settings Example ---------------------------------- Setting up the ticks parameters -.. literalinclude:: ../examples/uplot_tickparameters.py - :caption: examples/uplot_tickparameters.py +.. literalinclude:: ../examples/tickparameters.py + :caption: examples/tickparameters.py :lines: 5- -.. image:: ../docs/uplot_ex3.jpg +.. image:: ../docs/tickparameters.jpg Integration Example ------------------- Example showing different graphics elements integration -.. literalinclude:: ../examples/uplot_integration_example.py - :caption: examples/uplot_integration_example.py +.. literalinclude:: ../examples/integration_example.py + :caption: examples/integration_example.py :lines: 5- -.. image:: ../docs/uplot_ex5.jpg +.. image:: ../docs/integration_example.jpg Scatter Example ------------------- Scatter plot Example -.. literalinclude:: ../examples/uplot_scatter.py - :caption: examples/uplot_scatter.py +.. literalinclude:: ../examples/scatter.py + :caption: examples/scatter.py :lines: 5- .. image:: ../docs/scatter.jpg @@ -56,18 +56,18 @@ Display_shapes Example Display Shapes integration example -.. literalinclude:: ../examples/uplot_display_shapes.py - :caption: examples/uplot_display_shapes.py +.. literalinclude:: ../examples/display_shapes.py + :caption: examples/display_shapes.py :lines: 5- -.. image:: ../docs/uplot_ex6.jpg +.. image:: ../docs/display_shapes.jpg Bar Example ---------------- Bar example -.. literalinclude:: ../examples/uplot_bar_example.py - :caption: examples/uplot_bar_example.py +.. literalinclude:: ../examples/bar_example.py + :caption: examples/bar_example.py :lines: 5- .. image:: ../docs/bar_example.jpg @@ -76,8 +76,8 @@ Bar Scale Example Bar plot example showing how to use the scale -.. literalinclude:: ../examples/uplot_bar_scale_example.py - :caption: examples/uplot_bar_scale_example.py +.. literalinclude:: ../examples/bar_scale_example.py + :caption: examples/bar_scale_example.py :lines: 5- .. image:: ../docs/bar_scale.jpg @@ -87,8 +87,8 @@ Bar Color Palette Example Bar plot example showing how to pass a user color Palette -.. literalinclude:: ../examples/uplot_bar_colorpalette.py - :caption: examples/uplot_bar_colorpalette.py +.. literalinclude:: ../examples/bar_colorpalette.py + :caption: examples/bar_colorpalette.py :lines: 5- .. image:: ../docs/bar_palette.jpg @@ -98,8 +98,8 @@ Bar plot updating values Example Bar Plot example showing how to update values for a filled bars bar plot -.. literalinclude:: ../examples/uplot_bar_updating_values.py - :caption: examples/uplot_bar_updating_values.py +.. literalinclude:: ../examples/bar_updating_values.py + :caption: examples/bar_updating_values.py :lines: 5- Bar plot updating bar colors Example @@ -107,8 +107,8 @@ Bar plot updating bar colors Example Bar Plot example showing how to update colors for a filled bars bar plot -.. literalinclude:: ../examples/uplot_bar_color_changing.py - :caption: examples/uplot_bar_color_changing.py +.. literalinclude:: ../examples/bar_color_changing.py + :caption: examples/bar_color_changing.py :lines: 5- @@ -117,38 +117,38 @@ Bar 3D Example Bar 3D example -.. literalinclude:: ../examples/uplot_bar_3Dbars.py - :caption: examples/uplot_bar_3Dbars.py +.. literalinclude:: ../examples/bar_3Dbars.py + :caption: examples/bar_3Dbars.py :lines: 5- -.. image:: ../docs/uplot_3DBars.jpg +.. image:: ../docs/3DBars.jpg Pie Example ---------------- Pie example -.. literalinclude:: ../examples/uplot_pie_example.py - :caption: examples/uplot_pie_example.py +.. literalinclude:: ../examples/pie_example.py + :caption: examples/pie_example.py :lines: 5- -.. image:: ../docs/uplot_pie.jpg +.. image:: ../docs/pie.jpg Cartesian Advanced Example --------------------------- Showing the ability to display to graphs in the same plot with different colors -.. literalinclude:: ../examples/uplot_cartesian_advanced.py - :caption: examples/uplot_cartesian_advanced.py +.. literalinclude:: ../examples/cartesian_advanced.py + :caption: examples/cartesian_advanced.py :lines: 5- -.. image:: ../docs/uplot_cartesian_advance.jpg +.. image:: ../docs/cartesian_advance.jpg Cartesian Table Example --------------------------- Example showing how to add a data table to the plot -.. literalinclude:: ../examples/uplot_cartesian_table.py - :caption: examples/uplot_cartesian_table.py +.. literalinclude:: ../examples/cartesian_table.py + :caption: examples/cartesian_table.py :lines: 5- Lissajous Curves Example @@ -166,8 +166,8 @@ Cartesian Polar Plots Example Example showing how to draw polar plots using Cartesian -.. literalinclude:: ../examples/uplot_polar_plots.py - :caption: examples/uplot_polar_plots.py +.. literalinclude:: ../examples/polar_plots.py + :caption: examples/polar_plots.py :lines: 5- .. image:: ../docs/polar_plots.jpg @@ -186,18 +186,18 @@ Stackplot Example Stackplot simple example -.. literalinclude:: ../examples/uplot_stackplot.py - :caption: examples/uplot_stackplot.py +.. literalinclude:: ../examples/stackplot.py + :caption: examples/stackplot.py :lines: 8- -.. image:: ../docs/uplot_ex12.jpg +.. image:: ../docs/stackplot_example.jpg Advanced Example --------------------------- plot different ulements in a single display -.. literalinclude:: ../examples/uplot_readme_example.py - :caption: examples/uplot_readme_example.py +.. literalinclude:: ../examples/readme_example.py + :caption: examples/readme_example.py :lines: 5- .. image:: ../docs/readme.png @@ -206,28 +206,28 @@ Fillbetween Example Example of fillbetween plot -.. literalinclude:: ../examples/uplot_fillbetween.py - :caption: examples/uplot_fillbetween.py +.. literalinclude:: ../examples/fillbetween.py + :caption: examples/fillbetween.py :lines: 5- .. image:: ../docs/fillbetween_example.jpg Uboxplot Example --------------------------- -example of uboxplot integration with uplot +example of uboxplot integration in a plot -.. literalinclude:: ../examples/uplot_uboxplot.py - :caption: examples/uplot_uboxplot.py +.. literalinclude:: ../examples/uboxplot.py + :caption: examples/uboxplot.py :lines: 8- -.. image:: ../docs/uplot_ex16.jpg +.. image:: ../docs/uboxplot_example.jpg Map Example --------------------------- map simple example -.. literalinclude:: ../examples/uplot_map.py - :caption: examples/uplot_map.py +.. literalinclude:: ../examples/map.py + :caption: examples/map.py :lines: 5- .. image:: ../docs/map.jpg @@ -236,8 +236,8 @@ Sparkline Animation Example Sparkline animation example -.. literalinclude:: ../examples/uplot_sparkline.py - :caption: examples/uplot_sparkline.py +.. literalinclude:: ../examples/sparkline.py + :caption: examples/sparkline.py :lines: 5- Cartesian Animation Example @@ -245,18 +245,18 @@ Cartesian Animation Example Cartesian animation example -.. literalinclude:: ../examples/uplot_cartesian_loggin_data.py - :caption: examples/uplot_cartesian_loggin_data.py +.. literalinclude:: ../examples/cartesian_logging_data.py + :caption: examples/cartesian_logging_data.py :lines: 5- -.. image:: ../docs/uplot_cartesian.gif +.. image:: ../docs/cartesian_logging_data.gif Logging Example --------------------------- Logging example -.. literalinclude:: ../examples/uplot_logging.py - :caption: examples/uplot_logging.py +.. literalinclude:: ../examples/logging.py + :caption: examples/logging.py :lines: 5- Logging Fill Example @@ -264,8 +264,8 @@ Logging Fill Example Logging fill example -.. literalinclude:: ../examples/uplot_logging_fill.py - :caption: examples/uplot_logging_fill.py +.. literalinclude:: ../examples/logging_fill.py + :caption: examples/logging_fill.py :lines: 5- .. image:: ../docs/logging_fill.jpg @@ -275,8 +275,8 @@ Logging Changing Values Example This example shows how to redraw new_values in the same plot -.. literalinclude:: ../examples/uplot_logging_changing_values.py - :caption: examples/uplot_logging_changing_values.py +.. literalinclude:: ../examples/logging_changing_values.py + :caption: examples/logging_changing_values.py :lines: 5- Logging with Table Example @@ -284,8 +284,8 @@ Logging with Table Example This example shows how to add a data table to the plot -.. literalinclude:: ../examples/uplot_logging_table.py - :caption: examples/uplot_logging_table.py +.. literalinclude:: ../examples/logging_table.py + :caption: examples/logging_table.py :lines: 10- .. image:: ../docs/logging_table.jpg @@ -295,8 +295,8 @@ Logging Animation Example This example shows how to animate a plot -.. literalinclude:: ../examples/uplot_logging_animation.py - :caption: examples/uplot_logging_animation.py +.. literalinclude:: ../examples/logging_animation.py + :caption: examples/logging_animation.py :lines: 5- SVG Images examples @@ -304,28 +304,28 @@ SVG Images examples SVG Images example -.. literalinclude:: ../examples/uplot_svg_example.py - :caption: examples/uplot_svg_example.py +.. literalinclude:: ../examples/svg_example.py + :caption: examples/svg_example.py :lines: 5- -.. image:: ../docs/uplot_svg.jpg +.. image:: ../docs/svg.jpg Shade examples --------------------------- Shade example -.. literalinclude:: ../examples/uplot_shade_example.py - :caption: examples/uplot_shade_example.py +.. literalinclude:: ../examples/shade_example.py + :caption: examples/shade_example.py :lines: 5- -.. image:: ../docs/uplot_shade.jpg +.. image:: ../docs/shade.jpg Polar example --------------------------- Show how to use the Polar Plot -.. literalinclude:: ../examples/uplot_polar_example.py - :caption: examples/uplot_polar_example.py +.. literalinclude:: ../examples/polar_example.py + :caption: examples/polar_example.py :lines: 5- .. image:: ../docs/polar_example.jpg diff --git a/docs/index.rst b/docs/index.rst index 8b4e797..c2bc3ca 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,17 +1,17 @@ :orphan: -.. title:: uplot documentation +.. title:: microplot documentation .. module:: uplot -################### -uplot documentation -################### +######################### +Microplot documentation +######################### Framework to display different plots in displayio. Similar to widget Take a look in the `examples `_ section in RTD to see the gallery -uplot is to be used with CircuitPython as some of the behind the curtains methods are +microplot is to be used with CircuitPython as some of the behind the curtains methods are in the CircuitPython core and could differ from MicroPython or Python diff --git a/docs/uplot_ex5.jpg b/docs/integration_example.jpg similarity index 100% rename from docs/uplot_ex5.jpg rename to docs/integration_example.jpg diff --git a/docs/uplot_pie.jpg b/docs/pie.jpg similarity index 100% rename from docs/uplot_pie.jpg rename to docs/pie.jpg diff --git a/docs/uplot_ex4.jpg b/docs/plot_example.jpg similarity index 100% rename from docs/uplot_ex4.jpg rename to docs/plot_example.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index cee931c..76b5edf 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -1,4 +1,4 @@ -A small tour for uplot. +A small tour for microplot. Plot Usage diff --git a/docs/uplot_shade.jpg b/docs/shade.jpg similarity index 100% rename from docs/uplot_shade.jpg rename to docs/shade.jpg diff --git a/docs/uplot_ex12.jpg b/docs/stackplot_example.jpg similarity index 100% rename from docs/uplot_ex12.jpg rename to docs/stackplot_example.jpg diff --git a/docs/uplot_svg.jpg b/docs/svg.jpg similarity index 100% rename from docs/uplot_svg.jpg rename to docs/svg.jpg diff --git a/docs/uplot_ex3.jpg b/docs/tickparameters.jpg similarity index 100% rename from docs/uplot_ex3.jpg rename to docs/tickparameters.jpg diff --git a/docs/uplot_ex16.jpg b/docs/uboxplot_example.jpg similarity index 100% rename from docs/uplot_ex16.jpg rename to docs/uboxplot_example.jpg diff --git a/docs/uplot_ex10.jpg b/docs/uplot_ex10.jpg deleted file mode 100644 index 732ac237d72b79b282a18e5299c67d74418bbb69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22878 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 N_}cV?M2`9YO#q&%B!K_` diff --git a/examples/uplot_bar_3Dbars.py b/examples/bar_3Dbars.py similarity index 100% rename from examples/uplot_bar_3Dbars.py rename to examples/bar_3Dbars.py diff --git a/examples/uplot_bar_color_changing.py b/examples/bar_color_changing.py similarity index 100% rename from examples/uplot_bar_color_changing.py rename to examples/bar_color_changing.py diff --git a/examples/uplot_bar_colorpalette.py b/examples/bar_colorpalette.py similarity index 100% rename from examples/uplot_bar_colorpalette.py rename to examples/bar_colorpalette.py diff --git a/examples/uplot_bar_example.py b/examples/bar_example.py similarity index 100% rename from examples/uplot_bar_example.py rename to examples/bar_example.py diff --git a/examples/uplot_bar_scale_example.py b/examples/bar_scale_example.py similarity index 100% rename from examples/uplot_bar_scale_example.py rename to examples/bar_scale_example.py diff --git a/examples/uplot_bar_updating_values.py b/examples/bar_updating_values.py similarity index 100% rename from examples/uplot_bar_updating_values.py rename to examples/bar_updating_values.py diff --git a/examples/uplot_cartesian_advanced.py b/examples/cartesian_advanced.py similarity index 100% rename from examples/uplot_cartesian_advanced.py rename to examples/cartesian_advanced.py diff --git a/examples/uplot_cartesian_loggin_data.py b/examples/cartesian_logging_data.py similarity index 100% rename from examples/uplot_cartesian_loggin_data.py rename to examples/cartesian_logging_data.py diff --git a/examples/uplot_cartesian_table.py b/examples/cartesian_table.py similarity index 100% rename from examples/uplot_cartesian_table.py rename to examples/cartesian_table.py diff --git a/examples/uplot_display_shapes.py b/examples/display_shapes.py similarity index 100% rename from examples/uplot_display_shapes.py rename to examples/display_shapes.py diff --git a/examples/uplot_fillbetween.py b/examples/fillbetween.py similarity index 100% rename from examples/uplot_fillbetween.py rename to examples/fillbetween.py diff --git a/examples/uplot_integration_example.py b/examples/integration_example.py similarity index 100% rename from examples/uplot_integration_example.py rename to examples/integration_example.py diff --git a/examples/uplot_logging.py b/examples/logging.py similarity index 100% rename from examples/uplot_logging.py rename to examples/logging.py diff --git a/examples/uplot_logging_animation.py b/examples/logging_animation.py similarity index 100% rename from examples/uplot_logging_animation.py rename to examples/logging_animation.py diff --git a/examples/uplot_logging_changing_values.py b/examples/logging_changing_values.py similarity index 100% rename from examples/uplot_logging_changing_values.py rename to examples/logging_changing_values.py diff --git a/examples/uplot_logging_fill.py b/examples/logging_fill.py similarity index 100% rename from examples/uplot_logging_fill.py rename to examples/logging_fill.py diff --git a/examples/uplot_logging_table.py b/examples/logging_table.py similarity index 100% rename from examples/uplot_logging_table.py rename to examples/logging_table.py diff --git a/examples/uplot_map.py b/examples/map.py similarity index 100% rename from examples/uplot_map.py rename to examples/map.py diff --git a/examples/uplot_pie_example.py b/examples/pie_example.py similarity index 100% rename from examples/uplot_pie_example.py rename to examples/pie_example.py diff --git a/examples/uplot_plot_example.py b/examples/plot_example.py similarity index 100% rename from examples/uplot_plot_example.py rename to examples/plot_example.py diff --git a/examples/plot_line_styles.py b/examples/plot_line_styles.py new file mode 100644 index 0000000..f6429d8 --- /dev/null +++ b/examples/plot_line_styles.py @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import time +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, display.width, display.height) + +# Creating some points to graph +x = np.linspace(-4, 4, num=25) +constant = 1.0 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 2.0) + +# Drawing the graph +Cartesian( + plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000, line_style="- -" +) + +# Creating some points to graph +x = np.linspace(-3, 3, num=50) +constant = 2.0 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 2.0) +Cartesian( + plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00, line_style="." +) + + +x = np.linspace(-4, 4, num=50) +constant = 2.5 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 6.5) +Cartesian( + plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x123456, line_style="-.-" +) + +# Plotting and showing the plot +display.show(plot) diff --git a/examples/uplot_polar_example.py b/examples/polar_example.py similarity index 100% rename from examples/uplot_polar_example.py rename to examples/polar_example.py diff --git a/examples/uplot_polar_plots.py b/examples/polar_plots.py similarity index 100% rename from examples/uplot_polar_plots.py rename to examples/polar_plots.py diff --git a/examples/uplot_readme_example.py b/examples/readme_example.py similarity index 100% rename from examples/uplot_readme_example.py rename to examples/readme_example.py diff --git a/examples/uplot_scatter.py b/examples/scatter.py similarity index 100% rename from examples/uplot_scatter.py rename to examples/scatter.py diff --git a/examples/uplot_shade_example.py b/examples/shade_example.py similarity index 100% rename from examples/uplot_shade_example.py rename to examples/shade_example.py diff --git a/examples/uplot_sparkline.py b/examples/sparkline.py similarity index 100% rename from examples/uplot_sparkline.py rename to examples/sparkline.py diff --git a/examples/uplot_stackplot.py b/examples/stackplot.py similarity index 100% rename from examples/uplot_stackplot.py rename to examples/stackplot.py diff --git a/examples/uplot_svg_example.py b/examples/svg_example.py similarity index 100% rename from examples/uplot_svg_example.py rename to examples/svg_example.py diff --git a/examples/uplot_tickparameters.py b/examples/tickparameters.py similarity index 100% rename from examples/uplot_tickparameters.py rename to examples/tickparameters.py diff --git a/examples/uplot_uboxplot.py b/examples/uboxplot.py similarity index 100% rename from examples/uplot_uboxplot.py rename to examples/uboxplot.py From 3a37717b078b85dded5258e78fab9514fe02d7e9 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 22:17:39 -0400 Subject: [PATCH 20/61] upd --- docs/api.rst | 2 +- docs/examples.rst | 4 ++-- examples/plot_line_styles.py | 1 - examples/{uboxplot.py => uboxplot_example.py} | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) rename examples/{uboxplot.py => uboxplot_example.py} (95%) diff --git a/docs/api.rst b/docs/api.rst index e3cea03..b16d5d0 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,5 +1,5 @@ Microplot Library -============== +====================== .. automodule:: circuitpython_uplot.plot :members: diff --git a/docs/examples.rst b/docs/examples.rst index ef16cba..9f6b682 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -216,8 +216,8 @@ Uboxplot Example example of uboxplot integration in a plot -.. literalinclude:: ../examples/uboxplot.py - :caption: examples/uboxplot.py +.. literalinclude:: ../examples/uboxplot_example.py + :caption: examples/uboxplot_example.py :lines: 8- .. image:: ../docs/uboxplot_example.jpg diff --git a/examples/plot_line_styles.py b/examples/plot_line_styles.py index f6429d8..22133dc 100644 --- a/examples/plot_line_styles.py +++ b/examples/plot_line_styles.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/uboxplot.py b/examples/uboxplot_example.py similarity index 95% rename from examples/uboxplot.py rename to examples/uboxplot_example.py index 20fb2c5..2fbc56c 100644 --- a/examples/uboxplot.py +++ b/examples/uboxplot_example.py @@ -6,7 +6,7 @@ """ import board -from uboxplot import Boxplot +from examples.uboxplot_example import Boxplot from circuitpython_uplot.plot import Plot From e7bcf5d0ea0a8368f0359b882b225af0f89e49fe Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 29 Jul 2023 22:24:48 -0400 Subject: [PATCH 21/61] adding figure --- docs/examples.rst | 10 ++++++++++ docs/line_style.jpg | Bin 0 -> 24305 bytes 2 files changed, 10 insertions(+) create mode 100644 docs/line_style.jpg diff --git a/docs/examples.rst b/docs/examples.rst index 9f6b682..91c0e4e 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -31,6 +31,16 @@ Setting up the ticks parameters .. image:: ../docs/tickparameters.jpg +Plot Line Style Example +--------------------------- + +Plot some data for x and y with different line styles + +.. literalinclude:: ../examples/plot_line_styles.py + :caption: examples/plot_line_styles.py + :lines: 5- +.. image:: ../docs/line_style.jpg + Integration Example ------------------- diff --git a/docs/line_style.jpg b/docs/line_style.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46b68d3cfb14313f5fa5a30e85542c7665b735ed GIT binary patch literal 24305 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

ZoA`Rg6jD_@jr4)O7 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 R0S%y#v`HcP*SWU#_Fog7e8T_$ literal 0 HcmV?d00001 From 196e7e75d5ec62e16893cbf05d4e42d27ecd1941 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sun, 30 Jul 2023 17:35:21 -0400 Subject: [PATCH 22/61] adding logging line_limits --- circuitpython_uplot/logging.py | 37 ++++++++++++-- docs/examples.rst | 10 ++++ docs/logging_limits.jpg | Bin 0 -> 22764 bytes examples/logging_limits.py | 91 +++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 docs/logging_limits.jpg create mode 100644 examples/logging_limits.py diff --git a/circuitpython_uplot/logging.py b/circuitpython_uplot/logging.py index 6cc081e..f10cdf7 100644 --- a/circuitpython_uplot/logging.py +++ b/circuitpython_uplot/logging.py @@ -14,7 +14,7 @@ """ try: - from typing import Union + from typing import Union, Optional from circuitpython_uplot.plot import Plot except ImportError: pass @@ -42,6 +42,8 @@ def __init__( ticksy: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), tick_pos: bool = False, fill: bool = False, + limits: Optional[list] = None, + limits_color: int = 0xFF0000, ) -> None: """ @@ -70,11 +72,22 @@ def __init__( plot._plot_palette[plot._index_colorused] = line_color + self._line_index = plot._index_colorused + self.xmin = rangex[0] self.xmax = rangex[1] self.ymin = rangey[0] self.ymax = rangey[1] + if limits is not None: + self._limits = np.array( + plot.transform( + self.ymin, self.ymax, plot._newymin, plot._newymax, np.array(limits) + ), + dtype=np.int16, + ) + plot._plot_palette[9] = limits_color + self.draw_points(plot, x, y, fill) if plot._showticks: @@ -186,7 +199,7 @@ def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> No ynorm[index], xnorm[index + 1], ynorm[index + 1], - plot._index_colorused, + self._line_index, ) if fill: for index, _ in enumerate(xnorm): @@ -196,5 +209,23 @@ def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> No ynorm[index], xnorm[index], plot._newymin, - plot._index_colorused, + self._line_index, ) + + def _draw_limit_lines(self, plot: Plot) -> None: + draw_line( + plot._plotbitmap, + plot._newxmin, + self._limits[0], + plot._newxmax, + self._limits[0], + 9, + ) + draw_line( + plot._plotbitmap, + plot._newxmin, + self._limits[1], + plot._newxmax, + self._limits[1], + 9, + ) diff --git a/docs/examples.rst b/docs/examples.rst index 91c0e4e..faeedcc 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -309,6 +309,16 @@ This example shows how to animate a plot :caption: examples/logging_animation.py :lines: 5- +Logging Animation Example +--------------------------------------- + +This example shows how to add limits to our plot + +.. literalinclude:: ../examples/logging_limits.py + :caption: examples/logging_limits.py + :lines: 5- +.. image:: ../docs/logging_limits.jpg + SVG Images examples --------------------------- diff --git a/docs/logging_limits.jpg b/docs/logging_limits.jpg new file mode 100644 index 0000000000000000000000000000000000000000..436fec5adc15b1162dc1897bf36fca72e3290cce GIT binary patch literal 22764 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 len(x): + y.pop(0) + y.append(random.choice(random_numbers)) + + my_loggraph.draw_points(my_plot, x[0:dist], y[0:dist]) + display.refresh() + dist += 1 + time.sleep(0.5) From 6b07f4dc3325d99641b60f9a607a398551f6d666 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 11:57:18 -0400 Subject: [PATCH 23/61] adding scatter_pointers --- circuitpython_uplot/scatter.py | 91 ++++++++++++++++++++++++------ docs/examples.rst | 20 +++++++ docs/quick_start.rst | 9 ++- docs/scatter_circle_radius.jpg | Bin 0 -> 127777 bytes docs/scatter_pointers.jpg | Bin 0 -> 109739 bytes examples/scatter_circle_radius.py | 27 +++++++++ examples/scatter_pointers.py | 38 +++++++++++++ 7 files changed, 166 insertions(+), 19 deletions(-) create mode 100644 docs/scatter_circle_radius.jpg create mode 100644 docs/scatter_pointers.jpg create mode 100644 examples/scatter_circle_radius.py create mode 100644 examples/scatter_pointers.py diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index d8e21df..d0b5ae9 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -23,12 +23,17 @@ from ulab import numpy as np import displayio -from vectorio import Circle +from vectorio import Circle, Polygon __version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" +_TRIANGLE = [(0, 0), (8, 0), (4, -7)] +_SQUARE = [(0, 0), (6, 0), (6, -6), (0, -6)] +_DIAMOND = [(0, 0), (3, -4), (6, 0), (3, 4)] + + class Scatter: """ Main class to display different graphics @@ -42,7 +47,8 @@ def __init__( rangex: Optional[list] = None, rangey: Optional[list] = None, radius: Optional[Union[list, int]] = 3, - circle_color: int = 0xFF905D, + pointer_color: int = 0xFF905D, + pointer: Optional[str] = None, nudge: bool = True, ) -> None: """ @@ -53,6 +59,8 @@ def __init__( :param list|None rangex: x range limits :param list|None rangey: y range limits :param int|list radius: circle radius + :param int pointer_color: pointer color. Default is 0xFF905D + :param str|None pointer: pointer shape. :param bool nudge: moves the graph a little for better displaying """ @@ -61,6 +69,14 @@ def __init__( else: nudge_factor = 0 + if pointer is None: + self._pointer = "circle" + else: + self._pointer = pointer + + self._radius = radius + self._pointer_color = pointer_color + if rangex is None: xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) @@ -78,30 +94,73 @@ def __init__( x = np.array(x) y = np.array(y) - xnorm = np.array( + self._xnorm = np.array( plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, x), dtype=np.int16, ) - ynorm = np.array( + self._ynorm = np.array( plot.transform(ymin, ymax, plot._newymin, plot._newymax, y), dtype=np.int16, ) - palette = displayio.Palette(1) - palette[0] = circle_color + self._draw_pointer(plot) + + if plot._showticks: + plot._draw_ticks(x, y) + + def _draw_pointer(self, plot: Plot) -> None: + """ + + :param plot: Plot object for the scatter to be drawn - if isinstance(radius, list): - for i, _ in enumerate(x): + """ + palette = displayio.Palette(1) + palette[0] = self._pointer_color + if isinstance(self._radius, list): + for i, _ in enumerate(self._xnorm): plot.append( Circle( - pixel_shader=palette, radius=radius[i], x=xnorm[i], y=ynorm[i] + pixel_shader=palette, + radius=self._radius[i], + x=self._xnorm[i], + y=self._ynorm[i], ) ) else: - for i, _ in enumerate(x): - plot.append( - Circle(pixel_shader=palette, radius=radius, x=xnorm[i], y=ynorm[i]) - ) - - if plot._showticks: - plot._draw_ticks(x, y) + for i, _ in enumerate(self._xnorm): + if self._pointer == "circle": + plot.append( + Circle( + pixel_shader=palette, + radius=self._radius, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "triangle": + plot.append( + Polygon( + points=_TRIANGLE, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "square": + plot.append( + Polygon( + points=_SQUARE, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "diamond": + plot.append( + Polygon( + points=_DIAMOND, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) diff --git a/docs/examples.rst b/docs/examples.rst index faeedcc..5be89e9 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -61,6 +61,26 @@ Scatter plot Example :lines: 5- .. image:: ../docs/scatter.jpg +Scatter Circle Pointers with diferent Radius +--------------------------------------------- + +Example showing how to use different radius in the circle pointers + +.. literalinclude:: ../examples/scatter_circle_radius.py + :caption: examples/scatter_circle_radius.py + :lines: 5- +.. image:: ../docs/scatter_circle_radius.jpg + +Scatter Pointers Example +---------------------------- + +Example showing how to use different pointers + +.. literalinclude:: ../examples/scatter.py + :caption: examples/scatter.py + :lines: 5- +.. image:: ../docs/scatter_pointers.jpg + Display_shapes Example ----------------------- diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 76b5edf..5aac48b 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -65,6 +65,9 @@ At the moment the following objects can be added to the plot area: * Bar graph * Pie Chart * Colormap + * Polar graph + * SVG Rudimentary support + * Logging graph * Display_shapes library objects * Histograms from the uhistogram library * Boxplots from the uboxplot library @@ -264,8 +267,8 @@ Creates a scatter plot with x,y data. You can customize the circle diameter if y There are some parameters that you can customize: * rangex and rangey: you can specify the ranges of your graph. This allows you to move your graph according to your needs. This parameters only accept lists - * radius: circles radius/radii - * circle_color: you can specify the color in HEX + * radius: circles radius/radii. If a different value is given for each point, the radius should be a list of values. If selected pointer is not a circle, this parameter will be ignored + * pointer_color: you can specify the color in HEX * nudge: this parameter allows you to move the graph slighty. This is useful when the data start/end in the limits of your range @@ -275,7 +278,7 @@ There are some parameters that you can customize: z = [4, 5, 6, 7, 8] radi = [choice(z) for _ in a] b = [choice(a) for _ in a] - Scatter(plot, a, b, rangex=[0,210], rangey=[0, 210], radius=radi, circle_color=0xF456F3) + Scatter(plot, a, b, rangex=[0,210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3) =============== Bar Plot diff --git a/docs/scatter_circle_radius.jpg b/docs/scatter_circle_radius.jpg new file mode 100644 index 0000000000000000000000000000000000000000..feaf08b33b815406527c3aa22ab24b636d858641 GIT binary patch literal 127777 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 QH@a)Def0<9Gu|;?w3-NJ1tt-#jnzb( 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\c#^;a-FZkH!v8Mhn^R$mpPMN<)0S8Ti_EfIL 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 literal 0 HcmV?d00001 diff --git a/docs/scatter_pointers.jpg b/docs/scatter_pointers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68513943bb20e5a8d00b49da7f3a58397e32aafd GIT binary patch literal 109739 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 literal 0 HcmV?d00001 diff --git a/examples/scatter_circle_radius.py b/examples/scatter_circle_radius.py new file mode 100644 index 0000000..41e40fe --- /dev/null +++ b/examples/scatter_circle_radius.py @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +from random import choice +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width, display.height, padding=1) +plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0x939597, tickgrid=True) + +display.show(plot) + +a = np.linspace(1, 200, 150) +z = [4, 5, 6, 7, 8] +radi = [choice(z) for _ in a] +b = [choice(a) for _ in a] +Scatter( + plot, a, b, rangex=[0, 210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3 +) diff --git a/examples/scatter_pointers.py b/examples/scatter_pointers.py new file mode 100644 index 0000000..ed4d210 --- /dev/null +++ b/examples/scatter_pointers.py @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import displayio +from random import choice +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot2.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x939597, tickgrid=True) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot3.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x939597, tickgrid=False) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) +g = displayio.Group() +g.append(plot) +g.append(plot2) +g.append(plot3) +g.append(plot4) +display.show(g) +# Setting up tick parameters + + +a = np.linspace(1, 100) +b = [choice(a) for _ in a] +Scatter(plot, a, b) +Scatter(plot2, a, b, pointer="triangle", pointer_color=0x00FF00) +Scatter(plot3, a, b, pointer="square", pointer_color=0xFFFFFF) +Scatter(plot4, a, b, pointer="diamond", pointer_color=0xFF32FF) From 8fdac51de08af138c99497d643b9212657b7fc9c Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 12:01:31 -0400 Subject: [PATCH 24/61] importing order --- examples/scatter_pointers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/scatter_pointers.py b/examples/scatter_pointers.py index ed4d210..d7690c6 100644 --- a/examples/scatter_pointers.py +++ b/examples/scatter_pointers.py @@ -2,8 +2,9 @@ # # SPDX-License-Identifier: MIT -import displayio + from random import choice +import displayio import board from ulab import numpy as np from circuitpython_uplot.plot import Plot From 5f8ca00fbb4536ee8a6d3a487118836686d2002b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 13:40:21 -0400 Subject: [PATCH 25/61] adding tick format option and example --- circuitpython_uplot/plot.py | 22 ++++++- circuitpython_uplot/scatter.py | 12 +++- docs/quick_start.rst | 16 ++++++ docs/scatter_using_different_datasets.jpg | Bin 0 -> 102046 bytes examples/scatter_using_different_datasets.py | 57 +++++++++++++++++++ 5 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 docs/scatter_using_different_datasets.jpg create mode 100644 examples/scatter_using_different_datasets.py diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 1ef9705..9e7ff26 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -109,6 +109,7 @@ def __init__( self._cartesianfirst = True self._loggingfirst = True + self._scatterfirst = True self._showtext = False @@ -127,7 +128,7 @@ def __init__( self._index_colorused = 4 - self._plotbitmap = displayio.Bitmap(width, height, 20) + self._plotbitmap = displayio.Bitmap(width, height, 10) if show_box: self._drawbox() @@ -323,7 +324,10 @@ def _draw_ticks(self, x: int, y: int) -> None: ) if self._showtext: self.show_text( - "{:.2f}".format(ticksxnorm[i]), tick, self._newymin, (0.5, 0.0) + "{:.{}f}".format(ticksxnorm[i], self._decimal_points), + tick, + self._newymin, + (0.5, 0.0), ) for i, tick in enumerate(ticksyrenorm): draw_line( @@ -336,7 +340,10 @@ def _draw_ticks(self, x: int, y: int) -> None: ) if self._showtext: self.show_text( - "{:.2f}".format(ticksynorm[i]), self._newxmin, tick, (1.0, 0.5) + "{:.{}f}".format(ticksynorm[i], self._decimal_points), + self._newxmin, + tick, + (1.0, 0.5), ) for tick in subticksxrenorm: draw_line( @@ -369,19 +376,26 @@ def tick_params( tickcolor: int = 0xFFFFFF, tickgrid: bool = False, showtext: bool = False, + decimal_points: int = 0, ) -> None: """ Function to set ticks parameters + :param bool show_ticks: Show ticks. Defaults to `True` :param int tickx_height: X axes tick height in pixels. Defaults to 8 :param int ticky_height: Y axes tick height in pixels. Defaults to 8 :param int tickcolor: tick color in hex. Defaults to white. ``0xFFFFFF`` :param bool tickgrid: defines if the grid is to be shown. Defaults to `False` :param bool showtext: Show Axes text. Defaults to `False` + :param int decimal_points: Number of decimal points to show. Defaults to 0 :return: None """ + if showtext and self.padding < 20: + raise ValueError( + "Please select a padding that allows to show the tick text" + ) self._showticks = show_ticks self._tickheightx = tickx_height @@ -389,6 +403,7 @@ def tick_params( self._plot_palette[2] = tickcolor self._tickgrid = tickgrid self._showtext = showtext + self._decimal_points = decimal_points if self._showtext: from adafruit_display_text import bitmap_label @@ -460,6 +475,7 @@ def show_text( :param Tuple anchorpoint: Display_text anchor point. Defaults to (0.5, 0.0) :return: None """ + if self._showtext: text_toplot = self.bitmap_label.Label(terminalio.FONT, text=text, x=x, y=y) text_toplot.anchor_point = anchorpoint diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index d0b5ae9..331fc51 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -74,9 +74,13 @@ def __init__( else: self._pointer = pointer + self._radius = radius self._pointer_color = pointer_color + if isinstance(self._radius, list) and self._pointer != "circle": + raise ValueError(f"Pointer paramater is {self._pointer}. Variable Radius are not accepted") + if rangex is None: xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) @@ -105,8 +109,12 @@ def __init__( self._draw_pointer(plot) - if plot._showticks: - plot._draw_ticks(x, y) + if plot._scatterfirst: + if plot._showticks: + plot._draw_ticks(x, y) + + plot._scatterfirst = False + plot._showticks = False def _draw_pointer(self, plot: Plot) -> None: """ diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 5aac48b..fd9b318 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -123,6 +123,8 @@ the following parameters: :param int ticky_height: ticky_height in pixels :param int tickcolor: tickcolor in Hex format :param bool tickgrid: displays the tickgrid. Defaults to `False` + :param bool showtext: displays the tick text. Defaults to `False` + :param int decimal_points: number of decimal points to show. Defaults to `0` .. code-block:: python @@ -136,6 +138,20 @@ Gridlines are normally ``OFF``. If you want visible gridlines then use: plot.tick_params(tickgrid=True) +If you want to show the axes text. You can use: + +.. code-block:: python + + plot.tick_params(showtext=True) + +If you want to show some decimal places in the text. use: + +.. code-block:: python + + plot.tick_params(decimal_points=2) + + + Colors =============== You can choose some colors directly from the library. This can be done by importing the color class: diff --git a/docs/scatter_using_different_datasets.jpg b/docs/scatter_using_different_datasets.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fef7a1612d90ebf7a5497d73d7815d6996d83454 GIT binary patch literal 102046 zcmeFZ3pkYf{x>`wg)||Dh*_%=IVXcO%qmM3VsaKS$ugbc>aE@#4C38k1MCZx%^ zgvpGlgXoy8`s-wHGk?Z5w{tz}d86 zFKnayhE4Jt);eGa=svgn?b@)v|7_T}Y4et?Qro0uWT6upcEUDp*tBWm=1p6+Y~Bo= zodCTL+bq9D;m1SAwko;=NbQZ-Wpeeml5P8r*R(6S_5=G5pSyfbT1Ht#b+?+<0d1Xw zx~51obBiOEHb2{*u=~Z{!Oh*n)64s`PvEaX=YubVghob1Ux^{a#w8{tr=+H(XWYoW znU`O1>vrM&(g$Vb)Q1(7wRQCkjZIIVH8YqUon76(zkKy>U~p)dH8MKJP5-^i{?@Snsa^6=yEbm#ylJ!4db>7kjDe0#@|(B(cxbD_ zF&C+T2*tf7SGVmt{#!{+yY#-pu7J|H%l$IS`%Sr8{Pm{&(X#(%4ZHULs%8JZVgFaV z#$ekwZGZ-ElROL!TZ5rjb?*N~=Kt718^w=x3u^d_^B*SJNo;9r1>ym5x+!f-2)0IB zq?p+m(aocS+A1Q&DPBQFw9zh+>l*ADQSzFsMEVgd=%DYE=t^FbkYF-zf!xX7*@ELy zcFkG#W)R&T&6=xa*InN7%2%tkMOTcjHXy%tdOm6>4r^$kMDoisgmV&2C!x(6tlv_6 zmCSdi0FF75#AY=2BfB0gR-}!ntihD**I=8UuEC~{mST>4cN0d!+$$V(diYcTi$aS8O9BGL;wScw6(y4PUGKB#?9Sc3spWNHa5 zXoddOddq$K$%|+_J6nY;C-Ry+y+j7Ji;C&oHJG{x4K&{7oF;Q_k^zUsg&g^5iE$t4 zKFk^{z?FTmGeKhFuatid{6 z$?b;d)g9BUp2aoT)j6@1T)a{18tgZ~Kxu^~LfsLhuEFj{3pcL8cok?)0YWSlMP|OF zUm&k)W1kpFbaN%r5o@r%m=kSSvIvfynZ}JKEQ)fjUZAzn|M_4)W_OaC7Q5l_Y4rBx zu)}uH(8hw%rgno7zti98a6A!D_>nsw@02Xu|tM z(eiB#{g3H2BHV+@klImMt3VIrSK%6r6SoG#*!cG>l11s?i)<5?|HX7c{PW30D`2m| zHnCRY)CAc0HP}9mkKQ8fpLf^4=-ez~+Zqhiq!0A5YK83Yh>iW&gn!yycK^I#VM@?6Kk;F|0~QS`bp9O5}UpUCCA^#le*SoRk{XiM~M>d5zt){J)kjlvRYjt z4GrVw$9{;eW_0TEoLKuLKm0}`x;DJ-S5vn9sL!!S-kH!KH7GazCY#`}YEa+%?Uv;zYZr?pqUCqG+9iFWEcOD8d{|I z_8XQjl_mLs;OhqHV*v*=s1+mVPBkS<{SoxwolUPPwHKSHPW0EV z=K|6Yn!B?(G3Gk5cb>eFG@wiYZd~v}j}J>QDJ^>9XX4wur)aLquyubWp{M-@8Bf5^ z(?=z`Ume9N-tQKod>1hGgG+Np3L!V<{54wWPnzo+SoH*CmM^nzcFdr&!=_i~ns=YXb5Jk|dgd=y)Y&6Fq;JbRrACc{g(Rf|c(Yp{myc?u7UAjqt~ zQ}30>O=tj%sq_mYc$80Lqz_mnBy(w3$&J5R9|ZTZxlL)bmY6_Z)+VN9Oh$_oIUy{v znrur4JdMU=1tX9-C3NT*xlsL3cJ`0zkv*g4ah=0etGSm|d4ByZHz7 zGB3X`kY|AQybD1Vg)T)zX0Dw6&ss-XoObt@WmLc)o|Vv2yN0T>DB5+I$(G)f5m1Wp zzUn%t-Lb=+3gm^yVxpyzY21oQHA~OAYFwvsKewS%nk{Q++di>LF}QJbGwsJ$ZDb! znEIf-ihZGwnkG8R6~5VLTMK;7BU4BG-fIi!nM6nKoiL(JELZpmh~@7eL!{NyOP0g8Q-VCI>f2K#4hBQj7L3bTI?gUhV=knr z?ZB6y&K8^8OK&kUk*~kKX3FJrhC-U7e)Ljwar1~!+9z{^np&cwJCgAm)%8@V^X04~ zFLmg>uLSIjF{&W-D*Ali!dK}s zH)pkJ-|=WII5~tTna!}&PQC*(U7LmOaYJ`TXW|mFZyKS4__EXDj=LL}QUalJQB zyhFG%=j(x+e0ROG!I>R4vZ+;$;{zW%1A_dkb&vNxdtQgG1IM` zZK{_jtK76+6XG|c_CZGf+nKW=fyT>UXC`Y*0fNtTtxdSM|DFG%iA_iB_3 zs8Iz|3kcy)b7bHK0oR2cN2s^yg;Ib5&;(u!qC2r;nnziW|M+sl+95ZM#95>iEoEcK_4YhR#hixf@TFfald4uU(&<##mlpwZW8%|6@2^)!Gt-T&Tp*+R~T_dNus!BuXG~f z-n2EGZkG-ukyIMgg9OxJ;xE|GN)MZ}0v!%8cai4(awng&%Bhy}8 zzI#G(%XVe?$(oV*$g24ZE`s{$<2#dOqIEqwJc=+MT*dGA92~k?*?#OGse)^i^lS~5 z`TkhO?_W`#QbsA*tFhUEw>}%vhky|>-VyFxWJ!qg2=(gps_{i_ z9wRgCAHQFN;m^cQsPVl72tjc2570?iJE3(2hrRoyxRr-#AP0k99aZDe3vO@4cdd6# zLz^)nbWVt#j9J)JNoM?r+samj=CbBy@$CiZ>saCBrpKs7IYN~XEa1tNjmZbtsdmF$J)>osWK@LYo}vk;92L|G_v z`&V!M)J(VizP`}5Dv6~fLviM!UFr-9;7K2y;;t|jl|=sHq%~M5d|X8k2%#Yiapyn- zTh5oTA}|;zZ~-a8eWc&9+ghCNy`M&J6(KnlsC_^x16>cl)k(*f4>&bG1NbQOaU^pegIB{?uez6lfEbBPqR<7*5p;^H z$QKdG>;}w2>^;dFL~YJrP)CFgwgAlsoa8Gy@>LcNuEAssy9F1;iEFUH1YbcTfKDa- zfZ@Qelh9!IMqU3{`_6rR=9u)D$ z=^1E6Yh&bKQ)bh0iSHyApSz* zUa0pA^m{^iF?LZ?gSEJfk(*g9$S_^lJJ1=&{`9|sbJgdo%X7Y*dA_2Z|K{|#V@Ozm zu47;)6e?B3e??C}lf1)%8RYHgRg<~GcT0#-1|B>C%{z%6F?>KW#I5+!f)y7C(F8?r z36l?v_*wCt;{bbX4Hl9GmnhKWoCG<$VkLTm&;{j&4Ax*ZO9-R(0xWPN6ai#_c}ljY zSIDW~HOI@Q(RE2|076M&B2VxGRb0h%`#_)zjRYj%K#e$ca*L#0XqL>SH$c%IA=2_! zyR)FF^G)Pc0d<;sB@`M1r>(JxhIH=!K{Qv%v{g!Q>5fF6zCh1ltJg!wj}RJ9Q-R{9 zq<3QTF#3t;EPVuhzOThxKpzXVfmRFjeF>$Vn&gaSG-wm;NS;rS>H&gSqWy)bqP=Ze z{&_$o7k%B@lIR8?7;xBVLQ^MwXNzMwh`0Y{(BODSIqdFqCfB&0idD*>Im)G!I2d~9dC^==AHJh1 zJ)*ikDBWfo`e}c2k?KiJJwzshbIHAu7jf&o?VbaQawl}7BUJA?{nB4@{H8)nrAL*8 zTast(%^SXyUqBO<;L;i_9p=H7?;lV}gh(g<{hGQEy|6-iSiGXm~|ijzZS zP`AJzhp)kKcsVk|5g2De!vdC`d);{dL5#n zNu+@5LexpkNAfqF2E+J{66LNt<%C>rQwKYK5sBgYDcqWF>-(pHxS& zR?|BalFODR24+A!*B-tZr84%4wK5;xVG3rJgf!wfA#_URs-`}tO^b7}E8nZ*`^DP# z;rpZ=HBL~5jh{A0Us?{bB=&WjojYgzHP5oXvcGEE(9IIdusLbBn{8EDA}ikFj>A4j zj8s3ly^7rKxivc|wQTv(4zs+AS|QFiicp?dtWxsb3RbC4@`V$1H+5aZ-`<^ZuUKgI zPZU}>t#ADTb|*e-j6BwYv|?pKY#X#oFK)ykMo7lkc|_d>e{~^t;ZO-QcRjcjZT-9) zbY~nz^kZ`wU0|K~2{f6LC^*?j@qH(+Py{qNOf(dLpbSj-qOe6S4mBoh(xPP;!kvr{75 z-y#n*wUc)h_yFP6oK|0#;V62hwaNOhFnvhuG;5`LFqLN{O)$etGkJPp7}tR)yc{97 z%X~sv6mq|HLY23NEEBQSr6U%ohHjn-obVECCh6|nPv2c-q3 zI;bMI_O_V6=PFs?TMU%OEck0ROGcm}Ya1rdLs((~N`YDqhKUm+1Z24^B)F2s-~;e~i! zQ`Z7|!C$R-4#LKxf>kg#&ys3k`5JVc`E>n9mzv4P)+W_*?L7MF?{>-~cwm%vKznJd;R*;Ym!Sm3u% zwbWFi-Jb~>bV>g%a>cpFt9D_$Pw?T-?&XRvet_LB({$K z$!NX&Pu>T-Iv(EB7t)!coUlI~ITrrOC>*PB|1Wi4pk(Q*^-IuB);gzWA+ejN5l=I#3FET`(fl104*RNLQRobkj1ZyN@l}t{&#G{3KVoG3 zPK(Ten6w596g)D%q6eKQ%K1~5Eb-tFx=ti5Jm~`ge{MBg7|F>_EQ2&2+>_Wb>h%^1 zM81;N$yasYSIYPpdX(sh6X!rdDgjE9~_F!8D$7r@^YajG;eDnd18p`!h5 za-3^fI&HU0WK^ZAxS$=c`VG7FX(Hmz*{@@#KV$El4ZQlsBo3@Nt3(d;M*_DhRmTVy z-JgJu^jlkXFIS{=^yO{$KXCZotR)f(@Ap;~)P<)+O5(g0Y4RlfI_dC$scPu}^5`0D z2k5H)#u~3dkjy#eIyF*k0eJEkqc9_)U4`ri+=+(Pe8n9(TyWVj4BP4RIFSo3BIB{# z6z{gp1gdupUnR%djMS$x@dN+Fohm{u&;Oax3$_%Y&Kr}imN%T05WOXv`baX+?6H`= z^ub>M*;81BP1z0KMcOp0;X9>g?78YQM3)MBa*LhMa6^s)POT}e#kMLmZY2%5;JgO& zVIkjyO6J^$k=23j&G|yNp@uN$)zgd78W@+>;`kn+@a5;`=goz_nd!gg+eO~-n=k;I za`=vj{I{_eO^8+6DF-aJZ;mk9?c-6CoiiNa{RmUTJn>-GPVTsA#ffVvYBCYmXJ1u2 z>X~t^>@o@jn30t&uc>cIWVl zru^XEK@F4!zac)nwKA4nm&zzoT$f|~$ibp;@x5pa__M*;@ku$jFz^MX&WZ~0cniIP zt>7P_;)Ge6Z?f;0&?vk4^)VuTSR3%l5aD@pq;C@GDaeR$rl8v=ID>?MB&UASkw;`^ z6&W*p302Bb~^jM;XNj zp49TCQlp&g?3-JG#f&H?95Zg=k;-Mv1KjF~iqcv6@mVvKEB%I5{gMd95M)dk;&aX` zAD#QR7|qzN1bPP+P7L6p5d<3-$?tspRgq%}#M7=ejq2ke%1~s>t#)Pk^dk{ZLi1V8 zL5m{|NA+-&+EBBYE9TZ-xiMi@&tEEjbN6^x<(lOX{cx~IcaSPmU-|BC#bBB1-J2z@ zcX@*)7WM~^M})fEa58;&{wB_YIaHR$9I80pD)ZOs6Aimx<@q2(?465zJbsw8j6V4G z&|PimgU9V13`}nerG?Jq_ET+02@74DlhFd_m4kM`S5*-np!~!yfCR^~P({KWUeV){ zcs{<{gpm1DZl|Wfun|$4le2L`WDUAe38_v4QPpJc7XEoEb=C{JvmR12l8KuVz!m@T zd$Yxuc`o1g=Re3QPx=@_ogTd4CXttYXii|Bk#zq<5Iv9_DQ?Ao1aS=dIAye0FHs_& z5V)WQA(`FUf|ZnYevL;{pyAR86g2NOG17Y9n?tADEQ{5$Ws3JH={y@?^hM_B?wZ_o zd}mUqN0q0;p;m{XD$j?XJge;;r!A=0Eht&vEY6Eg-<>@C`c*a@Uf|jp7$ohSFDut; zX%QMhm5JgyBlWzhwN$me| z#oWXXtcIg4dB+>dZJ+ChBxFPrQ{ZM|kyi z%*m7GRlwAg8YZG+6S%jCo6500rL>grMg4}CE%uLa*4lijG<31`U(vrzD6gV}o@rg2 z(tmweG?g|xS#tB&+tEJWAsBf6K#6|%QT1$^+RY~fACCwE3WbiwDyCJX%>8_|)7e3{K6~HtC@J7P z^z8lw`jDS>@c7X+u7s0XaTchAGv+{v|2W^*UD5|=&-eaK@NVdxM_;oPK!SJ4v5!zh z{kz5z?nEz%M|3msB2@rfc2$Qv-Po&&vRxbQIJi=aMhehW~? zjY(X>j-_&f6X{&3CbGh`rW9DjL2M#;s$){GC|jl!JY?Pz*`@TJ$QVBf#@D&MTgusr z`)hlUN-ELqF`ZSauAMNiFAYQ_uR zlZH=wtU~iH)kCpZhc=Kix-mn~(Y8N&9rR&RiANvI{tfgoZTpt2lo|iPd>P#*-$fOf zbRGOV=94`tD{FCJ9rNkM6CULMY~ymBs>6`KIdug3>+E{-!GdbnLGy$5^*8JrKiqhB zDrwf)bf(Mg?kCmbJ2RoPkg8pWGQwSRLrxqt8@Jc1Gs_TH0C3SxilCK`N%|7Ks0`+C zRhULQoywgIvp6|B!2(ZKL(=dMd}MLqMU+P+sC}HTonq=|vdG-z#kZzZ5%50z)`1Up z_XuQ{{-|fs34ty^)0EeOxo|%*TKpR^AcPCgBFRfSC1a8i3PV%p9j$tqCIzw``=jkm zpI3V^<32#t3{B%i!lpBg{ltLMkhtNiF+8-~G=1DBDpH&h&7InF>5H$UMXv?cqQ~S_ zf0=*#ODKiV{}aL7?buD~~NN+6xBpr0ZXnL9zi4p)flpcv9G* zd7y5_CP;B7&wd z*g3%6q4wtR;zKvVt+A)Ni1`r@omcKN!=1x<`uc~ICZ$`lrpav)>ZxVR*O=OI`W?b^hFcVn-S>r*>gag*3&dL5b@4oReClMq2ipgYtw z)dA$3`c}v8!p;xF4czBAj3PK7k%yEA;qh*F%8TZy45X1N!OoFox=nNfE5tYtB8`UO zBXG&K6~JvWc>WV--R!3sjm>;Qpzu6zPg>bH0O5BGDUc3v9C&-bnUyS(=gBLVa>Z^P zY69y1Q)5JLAioW1aFh}E<}sCvv$A2dX+egYTtd?bH)lJcJL74NI^))!T5tU+eWs(* z?SOBosD`sTCmyR6nEmKUU2v!B`$@Y}owFPoDlp@&Ni!$h{1>-^R^2VQ&e+t=pGHx& zQ2fzmII7>_Moyuq!ozYhBMy7Ova|XDi~mVDHlb z*WQskcH(qvBpAc+-!_Db;9*ioM*ypw459%Kt~S$nf0pfCKWJ2sRRZl>Fb_gj?NUXU zis^TwGyeOZTVDC?{)Y===q%z9YN*ezj|>_XV!lx z8h5TMGT=?mZbq5qU&9ZV`P`ftE;CT4x*ED%rzw5idJl(%uzOF@pFduCXu(7@&OvSq|{C*9~v=#1w%kv29xSVv^EZIlwsfK!=eq&wG{Zh%{t8R zY98vGZ&VAuPP87QXTdXw=0V(Ns30x{G1Gkhe)I>pZ6E%#_$*ih*$RTYF;Wwt6r{fX zMTF$bGQ8*^xkBxZ!i(ngQ5MV6zjR&2pH=~#Fid}~`T=Bu^SA@wE|q3Vm%qRcD-P3k zuYF23B^SRZFF~ZvV;TNF3(kAQhDk7WFZVr5<+rIlwl-EJ*Sg$an~2;P=MTTSoN+sh zXnj~VvEx)nUx}Oi9j@~E?|K6jNhPX|iV{z-ROs^5hS{t9?F+0&boh-0HHCmV+I?vv zp_4$;Vg`+@K6~tyMc6Y|Zu^_(t3#@1NU|F;m^=Usefnr+!yfL}b0HotxFyn)=(pt= zVjb~wI_EZf*BUHfPD8z`IrTc^TQ=gFrxP8el1#CxGgrP5a2=kcy?2<^G+Qd6v|VMT zkRk{cKu1Qw&(DFCG?8DRK~Bnp=d3S8B)KZY650E?m5c|1)i2S~h*sBlkGH>la$90^ zE8aGxo9hvJrNZG%-V^Yyp>94x{aR;#Uf#t6=J3=`*A_pAL#~BZEEy#OYoMXw;D zDfPYWH6BUzja4P%JVA%2Ggd9#91T2eQ8r6aG482(8awLs;By8Yk_VrHo28i^~nxtzN^a;%9)}v311|If7bn>+;7yiXj?D2C_gCNHIjrw`ny< zy4MxM*>%NGDI6dt6TKkC5HHAq6hm{K$Fh}}Z2L(CC_%yc)(HiGB+{c$ zMssO+M-3O9O>f+qS#HM#m);!hn1F*D9(G2X)xAtoU>Hp#3*xw9V=#1zAyH?E zq&ehmpiLJ7{wRorL?|88X0E|@&iJUEA>ihV4ThGnie?3yFM~1OLrA|6l>L2NTyPpv zjCPak<;%{Db1|Fvd4@_oPhtzy&H_&}+z(6kap#?Poc8xU=uv@DbTo`E%qFL`cNtfB z&E`#?)s4pl*&M3!&-1yo20KD@7ne!45hA*m2zm#5zL9r6QAK%dH&^82Wq5$%%ggDn z8hpH89XVN};KCz%Vz;?f`EeptFV@l;1Qr*E8~0|#nL;&O8G0;hYvSHv>y1PlSOx^2 z33HBTr${XL@Z@`g%VAsRm@58z`G@jxM{*U z#+Pol!AI1lwx?e$C4D`Sdz2#z&K|zlB){F?ukh@XXW5&SoScn2I5qVLd6%B1op=!7 za=byNe%97mzR=ad<@)1-RmGd z-@{@kN%w^6b!4c=*~;UJE`@GMK~Whx_n%{a*84Mke|kKRg=Rs;6zMHOCh8AUb+niQ z`Tei1`~4dd@z+h!3ppD}uLY3B5Z8nrXKBWyw0MY9#kaY?Kz{#zNpB^=d>z#jau=`= zNZvBeS|VXT&GmzMP+bB8G7H1o=$t#~uh1aMljqyXoGS9_T+X<1+ZLz_?w`ML&kuWF z^l_Jq?IxM^0#S$&kb!JC+HhcQoe_|>|AP_8uHyLoi+3ub{d2yh{ZZNg6^ZGMLrF%? z=p>J_V9UoG2W^4OAAc?af!*a*g3yM0D0u^bajk+odz$TI7(Ytp(xi zMs{F_4sDd2i2!WaW4+vN=5w~j1+^6>HlvV|Dndq9gSjuPH$Ue`wHZHaYhWQ&gWpLI zqqA*_Pn!7Mzj1ZyX$q#1y`fR@0T@RGUE?%W2a>lt@dhp(qvqhnN#R5=U;cSr+RrJfj`0&KaSae-# zXV@PUo)6@VCWebC5XSr2@ZN_>xkw@61*N`oox@XtI6QhTmnO3Y3n!l^Jcc;D<(zuR zBE7C;OsGS4LC8Ac(Asot2t^rX@*2~jTueKqnp|&fPU;<_iuS6U3g@Rh6X*QhzwIP5 zC5&Ug1X#)BCUhOjOG>nNwR;SS*-e1r?4sPdwXxG*3yb`Ro0^z0;ZMIWBi4a{bufux zhHip)qE$mA$YH3~ftJLULm}~%gl-=oNurV3;Z?ksug}WY+y=B28MZY4eN#&l*~C=S zl8KIiN;yg4^|DWw?m!WBdaR)d+SP0jz)zH{w%vWGXg-y5;CV!Oh~x(_wVV*s?Z2tm z2||d`!%fkgTgz2w6);R>yKfZi=_tI_zg&H|qgWNlActRAJ&<#cXwTQWuBn+nhkeRg zgE;`H+P_CatLbUrL7sP4x!d(lR+fWeftJ4ifnr%jU!(Tn!n?m#oU2&^2DP?TSW5Z> zs+CR;rp^^_{)j?$Oz2;_V%OQ9btYFMyQAx|+5>UX_A4gYe%CvK2-|-iOFrPqOP{nAp7rL$Pj9PYySowAK=7@_F=!8V9LPKpZKf}1bEWa&#j}` zKdY zvDoc4JJytr!jv<4ACwkR#~#fTt7dvZ7Q{#{TLIgSxF(7&Bdqo~1CqS>hjU}ubg|9S z4bI~&uPpY#?|k}h=<-{z`#0iN_y$zzhNK>-a&X2gd!JN#X>zh!^g~z103ppIit3XD z)E_)vW{K22P9DWN;^8Rs-&-shQ@643Uy0@&yCPrLZO9w^z4rYM5B*nJ4yw0!PgI*# zbs={=uyo12ShpznL^LpD>>avmc7Qot?M$8gkl-ZLAib1Wifbjv8M2f}{$WVrc9)p~ zYh8X*W^~}5;Wjv6Snx0;?n(`<^MUMhN47%fxfP#x_0=lOv8cY66*#rBYqLHnknXfh zQMka?XF(FDNPbaJ1cnLCBm;4kM4w^PURlU#-*oj8uwC=epsCeXU+i|UMr6+wdoi1= zf8^(Vl;y#t2$~W-1K*RZ&jYkvrpcTNNr{DuIbVoQt`=dq=#SQ$dcNwju0M@5@~HxMx{t^pCFcH^j-% zvfw15YlGN{Q~gBqNp{w%cIG(q!9IJl4%%JOLILt@qHCybi_;)FUNDchPH zQW7$u(${uJ@E5T>QHpPO4K&=H4Oe2cxaCd}o__RxysL}*gfJRJ5Irw2Uwyj?VS`BQ z;1uf_{ywo!;R$Zn+=)D`466RgO6D9oRJ#u|-8*TQI)QL|^F;NF>?A5Ntp?ye!f!rr zagu&0-|6-z)Uy?q$?IOZ!XU7vb@FoY9zu)H3;n>3<5^1A%TQJeR$2 z8Y=R=O5aqyK1iT17p^cv-nooVA1lB8_(H*iHb2Q)V|WQChhVJkXuv}RSa3?c#^Fw% z7PW~Ip4DChH!NR1+hA{xLthJ8xn`2w1OF2%$q0Gz_|7mlq0QgLsbV!2`iW%Q+!$7H zK3OUk0!VMgrO-a8frkcWy@KOWLRCi-RM!L)jP;5sT)#Fr-z(XG{v_PG7uw?N($RN_ zCeZ8@X>sQ3u34PO)-86)j}I*#N2GbTFcDduPD5SiRYgCC^p&AJb*myP_Lw1LlOEi> zz%_nKw6cr}5an?elTf=k!LW}LdoCS7s5|a``5}%bUwCf#DDw5U?Ll_Fh{Df=hyBdH zimYz0@G@`cllpR7UZ%d_0Jj|6F9GXCAZ?)dC%vUoiL?q-&fbA-T6r;tQE3+}K7mNu zXc~xhq%h;KY4y(`IVFa>lD^!kkl^X$<^eILNih<6_LKJ@{U`o`A}S%%y@n52nasmN z%DlzRm|cXJZ~lLpWFl-ax&x8c1*zX!JXPkNUZhy|9JT})8HmLOtc_^JFk{ccP?^@hi$EcS`lHOo*eBjlpYU@KyZ}pLCdG z?#U`@BvxTg{U?tS*8-~}QIim?047=prtf~9X^(c9SnYVmM_bL{yZ4Lir7aFKlo4fo zO>MgIcPn$l;F2HiWOHl(@&`=;^K?ILaj8mp^yM1t^@I#RhKZJs_+IYyLKN~_gkeDL zaiz%Z2YfRGc@?MbmTt)`-OVWM;^f&6l%m3=dB!)Z+{;dsUGS)IR#<}}T2Op;`=W9r zYVH6q*nF9K`!TIXPq?ZpzKa9Np?(g)W zUa+_yBesmJKrGKHCkdr!C1{!qGkX`Z zADGI?pIx+rWW+7QH3?-iS4cJKL1zcKFRx^p*@lrNs`N-m0Ko#-m1XXrdyw|61FW{u+of?%nNk^HTlvq~9+z zymaLnY{sj9yz4#nFQ}uFB&GIGgNOWoJQq53WNJgu$jdf z2c*J;$#zPl`1lmVFN#8JXPefsXkJgeSWjsFLhW-=)y%|pz8UrYHlm*x%lZhxLSWZ@;6To$tGrLz4)(H#9=gkNHlA{Q=3t z)vTtZC@U}LVN~!WO^zVtGytilX{I#zELoPb_2^7Mx4&jYQ;w$DrF<-ha((v+T*q!} zl@ycr*P@KixV+e{3DCRjU0NX1hBx=zS13b;ntglkY6vV|MTj zBRfY^T+(BU^jX@kB6V*!8kQ#%TzY#tgZT*zB{c7`DNK5@r=e71&I(1oCDEA zDQ#-xP9ztdOi}>E?CbL+WjGvoCxRTsME7V9*;ruV}Ma+ zLzW6N&a5oq-rTC^(`hJ(utL!_C{d#<$Ll zOYPWw_wvQ&wtXgySB-liEu%9CA=PiIBn%O&lAYaaghD8Q#`#9*>B~L(1M&}omhnmINrCI+N zvRbccS%1Swx;&Gs6K$jj;yvH(?q#*jBof`B{JQ=L1A;7Z?c;jT+K^CivK|OeugJnN>Dxt0WsO%kev00f zR^?gNj~bg);;8H1#9vCU2L8T37}^V4^KKd9Xv)sAqPkqmEQZPCdqd$To;6AJ4} z9ObVwxR;)$Lp7TT+ekSm$0a-vqsTZDcq?dRLYt?l_u7JqWPSu+dmh$%6_ov|_6$`v zudh0-BnhhKw2{qqt-8f~7~pYmQg4vy(isR4P@1~b{|wPUeCQuM7dfDMT{WOp(0~0N zMNYvsVqa*3?Ew{_YY#-lsr=;}Kd-H|%130?44kOpF762d9LbaFy}K?nC;4dJ=1_L} zFe^Z|{m{jzo{FV}eW&}zeSo5cS77EZk|HuE3tgwe#3w@@r4P9(Ob7(uT(}zEd67VO@d<=7|2`pyT<%t71-NzU0_~XYO z5{}vetR&J+XmVysUSs9xA?VRuo+W{4H=y2y-QEJ9q#%g8{H(XoWslD>NcvE|A6?lU z7CULA&>PGZtG|$F7yJT|_6hKGS~bdK40UR*psCQThD(P-72D9`*udWV-y(->>?9sD$clyDhsJZ?(T30)cSL+PCc*y0~c%Sx+C}2TM zq5FBn@#|CB#GP*s`-uE7n+hZFn*#Z!CVR|$)3472-JZatMcl8u6eGFHAq1o^@E~s?c$0{!+tJK>dgoC32FcrsVBw7QD*? zN4V3u`vm&xSCQ>$u5pV&`s)k9L_0N)kX|WAWAE3Ed3!Rqq?I11v*6T>h=|(GjgT1m zpz_q)83rkJZzjHtxc?6mLukt@&=N zwg*{oZrZ`oBHQow`PjRIRoQd^RGE_tJ# zZ#b@cW(PKz$$3HuwXY-)4=CT%37B?sYAkWcvT(Z=*5+N+xXZ;hO2clQq*KI5q^Z%u zi++Sm9=rn~A4=K*%5fH)g^VWFgi>oitJ~jz|881fS$IKhW9Svj5BXQiFDUy=WIiUO zc36JSjMrF-X(p#ax;^^?cCK*h+8WFYDrfBl_h~0K7>&|T0{Hpo)r9=w^3b65jyiq{jTa_^ zL&$s|sc<51I=!rLP;JgRc7JQ?e7Ws0=l4;BBkoBOrlF*bQh8{r$lBh^0 zD++N*nmW^Z>pkBYA}nN7#`oT<)#+Av({bu4_N z+uhlB4ZTNahbs?OTX|Bg4rydph60+#EG8pt6RceUYiDpQo*M+`)MWQ2ysX>FEBCj% zq0>wHY-~AqKhh4{iw^nBQ;)v2?q zrhCDNfDdzo_R~O8D1v>#-Wr`Z+)}#voBeQ+Sjv^i9L^8Au?u*H4i7b@nGHKd+zCVn z9az_Po-WqcS2Nma>n7)M&^tS$TALBD)5ycwBj{mGpVJ#7R}l9Gbsbfq)T_=-1?<^U_O`GK~NNLh0HsVGO&C%LvhS;AMRI}##fTTS-?gTdZYlw zr4fA&!!&Sgm5EcwsJ5NwA}?v>lcNNwVMA?737_=wkEH{pn8tttyhC201Btd zF=Bu@eFH-mKDrCjTpHo1o9MYo?Xkr+qnooAmby_FCpCxhHZTSF*NAP2mDo7puMY%< zoq5JH!r?J-z%)%)yjws@Pl_K`H_t08$hS8YlulzV+iyQbjX~;2H;2MQg#UHdb7hK! zX<1sRR_a8p!rvsU#X9lW&?P<)9_+E1T3@cvu0I&)C zF?@ZxG;fJ8P1ZvSWI8$HRl>YSun`aOuX!Zo-X6j2VNL1bS(B;*;$Z0d&ywr*veT$> z`L~z?yt2ThYic5jYuDk>66w#! z8D^~@*5L@C*;>nHAfOv}YH!0T?AGE@(oIxNM;!N*MevBdk6>*GIY6Ke+Z&kg?h1zj zbxZ{{(=Ut|495&s%MO>9HN)q)XOjb&LjOW#2FZ?jX~H)cMBZIV7~9tFS6@IjB^nCjR< zQGDRwM*?>*bfQ#J%zgYALx*W#5u8vGhQK4DJ+Omx8_pLTT+T}SnkUyZgJ*gx_;g9N z;cFrfEX}>2j#8UFmy$4xmNaLHj)umekwQm$(xlu-vS`s5A@dr`+G07S1Q&)jjp5Ai z&NH=e+a#2pCx5Nc#aY4EAklO@%fqAxv$1LXrv`yCoFmLhpYJSN{^LXQ5^qVh;|>lt zbe}Rzc`!t$0?~0YEAFP)dTg1X4YxQ8G%hBm8J|+*9F%BZN(>oeVK(gznYsKhbuZh$ zH}Z0cp-B(d@V6e{CnvTX4hsrU$;jVZWWMttJ@#sB{h6xl8?xb(+f-wH%OnxMS=?WG zvZQL0isaR)z1Us+DeD*|=V{|E)lbj6>w?OTg3b5jiS@RbTBp4!ax3#k=MN0A`NrYz zGO?{m#-lZerH@PwNBDG149tEL9ATlr@V6*Yd2I?FIQ_mh{J;m3Xz zU>7bkVBVTVJA;yzraTvao(6}>N1GEG?f2iEz2FPjG}&gmss#pAVL%>Xx`9j&=;Zup z&Bk1wkYS`L!w&$d zfE9VqLjph_oKEsfa+6|#5TgvYs zYwXs~>U4FsAw*_YWz|L7Q3?Tu%KzUODw>egy)-TYS8c|@IfcpHW5|a8%oYCMfm*tgN$kk+~ih3mJe{#rFR47}gN&o5KJg zAf!I!0}S)Rl<+4NhbUCvMzgOES5&WZ20n z3l~lupJMZNG~^FCLBr>)SLd-UEKI+3R{^}8x!}s5BBd~tp(u7d?8`81f<|6sO>-_Y zfRie!cCJE?VfVg@7aZz?8CaQ8dp%3u)G~LWdi2`8r#yBt&q%BXVS^6}T!_?Vl$8SUL=R~6P$G?usP27Zd}xWd9|4<#qY;4-!?sFIm(dVi&WgzQIl6});ZJPaeDk6(D6 zOu-PBcGUZ|o$ zU?@BTP6M8}P=QD3Z{h^OA?{M{sbjz>oEPjOa2gDCnnr2Hw5&GQCPwg-)UgQf92U>P zkj*g3TTayuJ%oPr0FwTZ$|I}PRST-qiUn1|Mrfv+nTI!n`*?)$Qm#R5Dz6XKrP0zF zmED#qIt&x%j}!z9TSh^{tT zs?-2c{)qYB*L$9Ym~|(-EMiBaJ=?0|NY}CGci7zC%~>>zXrEg3M%_{4YPTX9F;9E& z)LF}0W37ZW3660AmM;=M<)12>2|9<+%wfNMdHD39h#*q>>BvQoRAB*0s$%LLzko3B#_y1J zN^T|*9>67IBE*qTrns%(NwiC^q{`IPMMu?#A|y}}xZ0NAcge*Yeg2Y0=1QZkxKra) zJ_z-6$^OIdA!%vN+{Ea$%3eaUK>;OBYo#tHqAqq+E8^Kns+B`*FB`AhI6_;T&Y$<9 z_a_CXK0T4+-tenM+^eMT`}R(h3WA@M5x~|EC%Fb1$K;oIE%L!(06Mc;ngEBD!*o|> zJ&vgf7m8Gb7yp4!rXBi|4t>L!DaFHX^ra@)o4+8{04v_%UGl5f;BS<5|{xTVxBpfQ~Jh7ez>w zMM1#kDmH29kQze(&Z*D?4659ng00{C`dHy;;XQ|-o3rnmi;-szQE&w;5gj)dJ>{dvqct2GA zrH8o|6VrO9Me+LGeKmqGQ71t?K6(FC);@G(agklg#c9q)u|7n~z&X)Cuj)`6G?Tly zh|{=_jp#$3jED6NFFMNN_75_4;`yNmH5A&|r>N$U$F7f33NC26Nc_ zhX!$?wDJh={=w&l*LgNsJ#v%MSRqNEV?HIbR*rl}|9 zmnZi(4;exL)o2FGbUNxk1fqmhUtLz!?BtH2nRbD%KVGTrfnc4KGX0^rE#TIyu*!=* zY?Y_Q>hKu86Z#*4$f8V|m4XY0SCp_b$0wWKu;7C>2S@xJ$VYT1ETe*)wt=>;^ z8f_vdN3Wv34Qj-ceIczZ?q#FlXuX|FLRXfQh2>)Y3Nox0AetCc@&thW< zQ|aB+Uyt{0ugvTfU|%!$bd5egpBU2jehVeojD3WC5E;Po%Cvh}Gf2HmBjyK-4VO`? z8;;_0!+uJzMxZ)zDO$%GJ@q=z)S)htlzNEJOM4pP>bs!2{hP}^MLlBo?V)WhnucDw zoxvVflS`WC#~$fC)?o8%q@#YQ`6YV{&z!{A4Ur4lw%!GFRBX!=seXSOhMN|=P+|>) z82mQSOp2pMmleFUa*zAxtDtknt+e+))+U=gecW8}=53Z_`~U2l1?+1vel^b3cEhor z#j!q_XulXw-#PCZPq!mAo(Zu>%6Al1+R%4CH7JX*kjPYpHS1A#IqOxU)js%U##-GS zP6Av?H@Bp@!5UfTq&c7R2pdmj?~E%&=okwTSg^%vkA>=^xI=t0@KR_XxeCKztPG_W z?ViZfRq+}IRs>!1C+Zqyc~iM!1#lE!N6EqI*Ma_AT*k<9 zYUUX_O{2)|%;_2?6GgBZyjoL zuYxhGRb*Du66}F|nAr5UB7GrJ#(Ygsw2GvPU*&QmMN$(M$LKCwwSpmfcW?XwO zrAz!lam+oJ#7G_hdt;6a*t>k+YrtAW-jue@{s7N&ODFWgT7*zSA&3=9d!Iu##>*DF z&M8u@JQ;eFeP(y$vb#D)C^^`Zx`-Gz{IjBHmx)x&tm4j9Ke(!^O*dy++;Q9{HmE`w zyYZDx@7Y!O#dO90 z2+Cb34`9Wj;Ozie567m-`$&h!n9(p0lST}r9iPNeJk$beLdHd8o^^`Qu%fhWjP(tv z>%in1k1>Y0?gfpYgxlQsoj)GfRXmn5E=9cm?(dYr=c;{xEBT-`yitn4|A~}!G=S&* zhK@t03P=ILl3V;%fwbNJf+-v3cUjDmo6Igo-ik%*ms|vd#)`^Yq1f$QMpo7Qr0FQm zsghkCqoq5Od0v2RGg~X4)f3TRgHxAZN22C*N9;+i;nqJqY^GISdu)$Qxl_!+yp0ZW zyKkUJ?!8c*^~s>vI`27kmfrx|H?GTl-nh$O+r0OI*lfFQK@Yz{b@$a>it@5<$%4S= zCyd+Ol6Jogv62HmwmoY14i;-2x#3oryWPmVA zi25BuY~d!}pE9amDR*9v)fqFPVb)h`CGUBZWPw}%!}~zA+U>i?VyD|%*)M!4K?jK@ zGQpc+OeVt3{KvM_oW=@Gh*NL|=Tz~w$njBjZ&b-lkeQ*%Z{C^4kBELK$KJC&*N@h} z%)0Mr#t3PUm-Y5FKBi{B&-w?9nn3q|_$?sP6s=4}!Gx>dpR-lFK+Yg&*y~nf_wy!@ zEEFh(+;iL|rbpCyE@Jzj)C8-70%aK>&o&}EbOFbJ?ehUm7T#$WeKXw1meg1a zl}hi49Z42g7vp?+(cXN0?)2vn zv*2E1f)|^=#F3NB0L)iU<<9W>0g8(}IwOW%DimuBBD(Bleq<`ukH6l2rN=zT8L`Q+|;5`O_*EGcy!YV2s2w_njy9zJapp-J=a#qP?r10zP!}ca~54%)xAkB?!H7 z1{`S%kh}uO>sF4LHK3UsH`RngLf2vo2}i%;Er8l)xVW}TQrg+fe7Q>cBaRD3yKs6_ zP;uN;3{>4SE;j!r6}_F|S^urd{9m9T9Ss!%w0(uX6M$`hPqF6YcfW8i{glvqfHPW8nC`&Bw|2UtGPEdcxI2lxvg!{x&5*>1 zJ6I%l^h$-+05xf+R1bTF)e|&!vSjL4DF6FPRqJ>hpluK7q!VjSRnUZS$hc-v4UVqaKMNY?*!otTkBYxI0 zM{zEtWw+Dx>ia7>=|x5QJD(kS{I2Nc?Mg%K@n^<~UZ=v0&$?C{UJw>~B@LBjP&A*( zg}tS0c(J>@D%JLY@7*c`nwstH!Jo(jLW z%JAgh0*fQ)@1+9~;3-?|1Zt^u;3uFT&etJNqG5IBVPHa3`{4K!Jas>&48=zN3kybH z$q)(&8^6nM;34EO;$I(++NUKEri-WO#Sceu!7_RHpRnwo8;47RwQIQ=7n6|dqQOcu zn!MxGj&Y}|@mb8Z;UC|un!h;Uq>5q zEVP8}7lbQv$g*=Q}?1dX- zqS)Nw#YLWiblXVM!>#>RkF$;q)`5_^7wt?QWzkf0Kzyd5VGwU7j)sc`N=`#aF5(LN zXMs!33Khj}9-G_(&A|b#qkL$&h47LIUHNOxG081cpDu-?liS9Y=nnDdF}eo|{6Rek zdcr32;wXWOJP)5x%-^l)hihC{bhMTmeLvJqZO_$fyghoO)#$p6^DzgURjWKn&2^RL zaaPF5rnIrawcRHXx#xu*`MqaDoKdC6&*QhRI}mY?JI5C!?+GNw`_og1Ihk4snRdIY ziGG4T6sxe?v4&_sob$ruA%3g)?x3?%{mH0r%_-`wZ+zEU%%W1>RHG2=sT(qfwcEn$ z2obP~@ao?({J}@k$(BzzD=ub{v%pd70FPlb2=f3@Vk3wP{eL36eq{V6n7O24w%mNf%ma9#RTvN4N)BD0Nu|DNdGBF1M1TV_JJa*`Yk?q~#jM=AyHQsqn zn%!QfZ^Z7+jJ0rOxHaALsqyqLGSu9`SyqIia)6~#zC)@a_>y6TSR}||`E0aCj@Z05 z?aC@!WW4I>%aH z+?N`aawjR%ixI(B#8V-$z4yjr$}$U<14MF!jxZ`A&O8f{J2d!8nOafcB!9V8c=eML zEkeiDh_Hf?dAR}uVsT7bjTPdYpk-E2x`Z}g0>&2^1G z-aW*5py@ROH32_d<)2At>>R7fxcyEJ^SQT&`G7fVc#*%$>=4%=s1VywlAuUH8F2|U z0h(36rvzwoP-DULpoE+ zazu_0qHP?_q%V*^irs;Ayj!X@U?w#R#F;?IytV_lDbY&B7 z94a@`b|7*3RnBbF)aIBz8qRa5%@)KKLg(lLjjvy6%QtB=Gg3LQyZkF#KR-FF`euvn8#Eg!To5Bw9^fSiFGVnW~_Br%ig)%`|e6Z!wCHK+kQN$B1 zov>|#5rWf?Xmc0Hxj2veG0X+hW~g+HL=kl51JdoI1nkTYSXwY~ci_pXpPqkq<;5P` z>XsaX(kwbQs$61Rs(5_l*aIECC~|oHmXqC@X#tsCsW^R{4q@tr@pQpP$KRwsrs?5q zRu4$FKeUkNC*u`+p=&c6qcr;thaUE`v!FR+#W_0lmV26PP^5XMGcVTK@Nfn}m-@ns zN3px2M$g!k|BFz9HgQJ}Bo`>mYqgMYPGIO&>9VCRP_v!JEFEH5^X{XTp%Lz_B|Sca z$*1-)is8HJ;VBMy%Tg zK+W_t?LJb3E{aqiF7()UZE3L9v)vAmDS@0>`8Sy|)~D9O4+wEsOxLP< z4VSh#h7jM-JhBVfl;jaR`p>Q%b$24|&cwG}`&B5LF^Rp6k8S-BP?=rnqLxW@S0Q!| zQZP!FE4|h322`Tus*Q(Zhl*-Os{PBW?2@+{9XxZT=s0g^|CyKN`>Yj6-A4tgd$5N? z8DwqWHx<_Xwx)13+t4 zYyl;`A+aq|(ja)uYX*CVEaB2mB6EOMlvMKDFDwC;E(pGi$JQ=LwZ`n179Hf2zD1F| zolWrv)4K6-AZXCc@v$U>@Ncx!X>Hx8?p6XoJ3&KSYhs&w0#_lf+pfB8QeU7pbGZ_l zn;)E=)PS5a-(Qn};86*M>o@vQe29nK@Ukm{7x-~mo~%4IYuB82>Jx}T{H|{kSi8QR1Fcxyb{H} z>ROc{uITO;`8Yv@EHI6nat|*3g5NpHEX9{rm?aP{Rj3YdV1r`gpvi>JtBN|rM2tMC zd+^U_UcKg>aC_Dkdta0ATHc*ce@;UU-QgzF;kypcgzc@>vD)Y&C>Ub*gxN!DJ9Mm7 zvB}PvdfPZ~iwV~bcOa{SYoTSoht&P<{Ai4iCFQqn_U4SPh*)<+;#wIU_PXp|BaVjM z)w`ZeXRe+M09MoPDflN;ev{J1*Ky<@94&z{NPK`YTb5J^D}j=&pu-ydX7mQvy08<) zWonGiqet_tkjmI+Ls1zx3!aC?&jZUIh>-N2PO|dpYG|eBGH?xbED=F|vZDz=*jd1Upk!r#VbAd>-}Ys=q}Ye zprx_3*jwhWHO^&H6{&$3Hy~99uj|72NjiX$jT~M& z$ylyw6ImCIJJ|F9wN~u^pcK)9A|MrA`2D{5M+-F@uub}DdeMjYd$L8(w2=Gzx!I@ceVfN znTK+kH*o%P$gpP(n^@l6-9aa!bWR&;`)Clc@$-e#rDB!O!h^6ZNGnr>!4TiYmB&MO zV(m`Q_^8Wh#X>%q63%uYuwtfZ>Ur*+_#F-HCG5k30@8$((;21=4Qt6}NJ+Q=5LO5R^moHtU*0sgfIMiPf_cV?qOFc+s%fiWlr*5in$yjFE?l9Cv|wp77t>U?&&WHeVK^bscC5-r+Gvl0%vnrL zu_~Xi!T9K>a&m_F@HEJRLu*cL2!D|47+!o7%O(oGDjM2w%TL)moHTiU2G;RA?4kK$ z%YB1=mbyC6h}J*&sE}%_F+D9}4S8MSb&gq)mH4^WLm@DkN+sicqMUPAiGyObZ_4=ak+~Aq3V5``8vr#%|V+ki@GMFLE zX&SScL&D38{t{yu7Se>e9`(=fM)yGJu~!*Cb3!7p(OZ#QiN zp%(y52oFSiSJl&gO2mn>+KvO-O@pnTOLp%AEql$<6X%_blM`S1vLmXxmMyeK_{8VC z1C3*oKG`dpSg{Y*?U&7?ma$dRv6}!Vc@>g^$cX<7gLBn{UluNc)1g>$6EGOTk&-4= zo504grOFVgH0B;w#M711Z($wzo!*iw(c-ODlhGA=0y9c2Tx{73xGC~+x(30zO78o- z;Y(hFb@m6isizWoTGC16^dA?%C%i&?DLFR?&A&a3;nfF$#4z1pSxpx99zDFoUQxaL9ZKG_*(iYK z?_KR8lPk4dO~6XJ2`-rRP#fmSHBWh6@=Qo*@foTP$MTloe3X)RcjQ+_T=3q`qg%bp z1@!qth9$x2)!x4KNex>@vN}i0KZJi0v%k_L517-X$R@->B6pmzZ9bqv3oeDOOO=D) zY=Xz0@X?|a;>i>(DK(n(N^y%5P1Z^J+(l3OM=#|M)OG_Wad0(Fi82CiCMZOOde zNhn*9UL-erGQT-k@lVN36}9|XF-;bcj!?0rqBn?LtKoy90I;oJV%gPQ4Cl71be4@4 z(||OTh4ZVKJBQbX+P>JyT(*XD{065|QQnH*s=wl3p5 zMIp-fES-FG_c9cCa<0N;Lqj?Jj3v3D@@nMVk$eMev=?g>WcYe+xsY5Hmh6c6ptM}T z|7*?d0Fn;sDmJThy86Z$!lwSG5uM|w)hjR=JmbLEa?fo|-VI|$pz%BY)f@PRm%#i1 zMn13ihP|mV)H!_L%ZcDbfPO}Sby;y`YBMecW>SN&aiMU*v^ji0Y&}hDdKFg)=RDB@ zPIp`kSO)Z%F~W8`bJ+vn?_KQ~VR}RKP(z<#TzGf{cS&Q`8p0;B89OoXVZvh@nM?D6 z8TEHMCZz8EUdlC&@=P9025oa;i@m{i-K-n-b~SF;dvipsTUDeyx7cbIL<~Ap&A;7z zxsk26wi7Px(L}7{CT?`}^RcPPNw(PNVI5`@vTyC$?B@x|M&S|uxq_>iM3!G5ZkO?( zU+lwsbm(Pru!_sq_ajZA5eHhcdqM`29n^(s7EYr#8%OSgxV)Ngt{$P@Hs~W&t^Mth zUW02iEWvlk>W#W&)5KhvV^w&~%U*}#H*KFzjD6vVQgDWFir^A(8_xo^*#l@`$Q}ue z_2}&f_z7Olsk6Zd(&TR7nM>{q0OYRiWLE1r8t)YfcCJ%)U2%e56yKXG>mfysiubLW zU$*RvKhkf7oIb{=>SD?p!@<`hUm_N>gGN=XSpHpr@ECVa%QJMM2=TVqJ(!O2C8J(u%U!{G`TbAEx~ByuGLjp)H=&mW5y48?9lOHz z**E05DdwA54e#+z=H2y5+Hw1TdZe?-*FA7bJZ9i40k|1?zW?A99asMw9hULm{qkZm zKIilAKndIU4UuoM5-0osM@=)gh%s<5PiZs0e@cd-IyZ)?2gj!MqlC3s(J!#%E==*b z^egx$LD2DpBe^E*jo1v<25}7DLD(wK`X)hGrrr&{yu^9x=h5ZI@hXAXl&(E-VcLU8 zqqrp+Y-BAiN3v<6-56k%l(zDPcGV*nkT15SQcqPazDYR@_>Md8d=q!qzDm;dc`7M) zG>HbJN^Ij*7WF)eue&3*&iZySgFA!=?e?u|jB$WV)iT?)0Y`v6{YsFb0{D>b?2me%b0P@wS z6xc9LB#$K5cn<*-bJTI*9=5mR3aGf^K?JMRSYRCb55QG9xOZ$B2+}_P&akM%ZG&Y5 zH2!4$1fqkS$*_U{NL^34IcrxgRfmL?cRxsVTLlgyT@{(;Ik;bbr;)_EAP^uD&qoV9 zDODeY!q#(?v=qX+lIv*+@o$qQX9*qalfmHJH$0I8G?|0^H=gJ+AbrgSIPUl_JkiEW z?1~*t{ic@RCWZcuCo27U=;jFJA3PCH;?KsYe`+C$t>Az`i>~rl9q}726m6fL-Q`Hg zXTJx~R!`zSIywlia3YZ8G7qniiuS0Tfy%>)nObVmFR(iB$!D`|uJNFTe4kFuI#+j%bQ;=H zu$RRL)2Q7(`38A*MQ>sbDtB_L4rynZyuyFqgwhokFmfz3hB%9K0j)DkK`@oGf|SE* zbU4Z|1gG07)JED2A4hAOnlb)y4NCV_#lSvg>(gqxCYkMb^kgDXYeQ zp8{_-Vh{GD1Ex@*J)1U7$(;P@J${S8GokEI&R)FS3z)A>>Uej$PI1fOLXw4|Nrk&k z+66ddKTn6Vtv6vyTh&^lLkhXI_6F+%S8a*=Wix5w#(;R}6%UoqP=e>#NEJs-__`02 zlHaCVbBD?W>ZQ5Xo4_}_&IWT->qA@|N~!=`#OF;+*=SD9#N>z7j|HiOs!ZT&VdBgm|0a4rN+NeFEn?D&DVqr-3^nP%20o z;)ka8NOzGtTJx{nomY7sjo&Va?<75J9l*(-X^o_1<1DJNQS5*UZK zTbvZ7-%U_-zs$u=DP_`JY$+EzP9zzRE~Z$)4PuF`ni zM2pC_P7tdBi+(+4(OeW92wz9TCeuob1qxV{=-`mQz`y1Gtez$`4`+|DTS=Es+Hb9% z(;9h069Q~-!Gqa}!{;WB2lzYcG6dF{OX9@4Fp7=tM6ZGY{iO{!AJ~Iu8Zlkk<*>h# zp*qUY#g+zv2G|q3H?R95Zenvn8~VdX=al@gZp0=vX7UbLhei;HJ z`{R$#uok&CD5Z;kJ}kBCfGXD7zWDsQRQ=Q8#}0os=s4sCP8xL$bhr5{HfyW6?|t^! zt|^*t;&~qEjG{mwt`by%hlp9g+}tL6>dt}bDJ?LP_2n|oD&aPp7Z(>A?=p;Yy^D(E z)tnTEpHJnC4)I-A{!;f%Zz?}JbAX}NlK5QmK< z;x&iG5q#Q~xtPDhHr$-Y0>(UaN>zGyeNjFTNr@>-F490((5bO0{%FU{s&UM`U7v(l z9De@1%%tNEa7=NMPBF9wmleEG7pGofUSY;pcg#v8Kn;5C`awTeBzm=#iTs<%ot&KV{*b z?ZRN@9O_@89&-=W_popsjz6rPNVvsh#}g;l0TB$dQEUN6ac@|3Os<2@T`l`NaOQSS zTtw^x*97|qoP-@;TJtG)CppPAK$@f^r{0fi?OK#J-k+M9Yxz=ID2*d@>;u!WO6e7< zk^*}bjZVz?{9zCy-sxb0L2kJT&qFDwp|<3jH;4EG=QT3vz^VTNqZ0NCi*Rm-Fd4~8 zGP9Y>?TF4jAN2I#D(j3k2Ojmp>f|fl7UXpE1o8<-7l(q8=cjL=gcsqoX@m~Wy&s5U zn0mnomDpZ~MY$AsV@PzN+{G;-MQ zY~Ma8--pmG<(nMRHHPh-V|2{?NVJV%d+CG@W-O||u$!QQ(^}mR7jqGtkLztce!h^C z7}Arz*Hix)bow#pY&luCaOP{|$#eT<{}Al>WUr^P_gUjcC;RTe^7SURM0tJou^3=z z%|%TjAs;4e`0mRh6;#qcOo{h20boC1?^J9On6}@pa1```E@Bg^3Ad}%U9e+eD_9Rex-(fyquF19X>tXdK_2wmwczPoP+N zr{nfKn#w4=*{evohs8T6bqxe!qRS$O?T}eb*9J|ln_PEr{(|~@hMY?qw-6SN;L?!A z-0jdI-ihMc0|?Ls*no)z*2dqlE`I&H?5%HM3(U?p)`Wf8XYhEmVVl>~v@h4*NwMbj!X08BxHGJmM^Vnl?$1QpjtUhVIEdQm!qWap= zhCM}0qS8c!uk`hQ@Ub8h5!)+@;HLoGtW+6vtquq=GH|WvP|t;xDe;a9)n@6WAYfc< zRd;@B;)3e8yw}2~gCD68(#cV9(?y3|__9D2UBC}88>pj|GAyL>Y$;x0bj5;-%>jvc zNzG$odFuRHm&XG)N6JPgm)r&GFV*y@j#_J^NC8oj_>n$qsiYVLmw|P9;N)`WC&c%C zd)Q(^6V8RLpzCfn;Msl*}0l;*4;ACU%VUAb%(K^qBOXpu=uO^ok zfZ-z(uQ58X+qIeqKT9_(i4?_hl6y=p7R%(%5P`aEJ%HN`?w=?kU|^?WE?es%KG9K| z2&d=DJ~Hb*RBQwY2gHP=WXNTpX-RgjwfM!2X-T}urTbjT8EgR>dN*95A|_jhDW_@J z+wv4mdTrd5*kapKj!8*WCKtC}y)LC3IOD~RKBYdzC)wJWwPnY4jy$)$DfoJ${^j{& z^Uetc^!H+dNz_SOzB)QL_YwCWUexE~n z)?w_rj?l^y54^wDRe#krqG5B*2GMCkSEwPNh-=rxH#r3R48%tbSy9zf`wXP>o~_qi z1O^3!Z)e}VuY-CwKKOh5%L8?A^uBIi9Y|NSUX5J#84rDZU@N%$yDuf13P~Wm)^uU@ z1pOB0{OzeXF=IZ_(j5bUOvN(=#2wr4e^V!GYCfPxEHBX0Mwf_NOF(c)0qKvt#~^->&;(MpxXc|nPNRn4b9P!^SkuRqnEMPS zg`z^TS#ur;&rz%S&{)x-!T1%+%j4+S3nQgOvD5k6FGEneqg8P?=L6IeJk(2Z(1j`1 z4IdHmpQMKht^U8(v^Z|~U!){B`s?48xi{(P2wM~Fj%uo-=IJOBy~~= zqGc~K>rY8Rhg;SK+$XdGK&&a1WF*mEx;*&_7I8I*j+?L%T=h&Y;xbdQEwl~}2pF}b zMg%~#%Xb7R7jenlEx7&M+9_?A-~EN51?Q#Ot78;Teq>mO2Em10cvWb!kuv{NFRW2e zVKL*lF;d6s+FPmaOxRB-Bq&@QE(H0-E^jUA_M+Gr^(vHrz2&`T;aS!@8&tSkaV%78 z#Pj_y$l@_erGfk z9i|WBT>piR0%5yV^ZS}LoIiV(0B|nDbkJ%^sjp`C?9+2)o=r&|_hbB9E9eoFsaHX9 zW$o=tm*c!Ye4f{8lIqqEFEha-r+O=A%SNejv^cGE1^UCZJAtti@A7lFk4@uznjY*9 zo|+rQ>-L{Y*1r3$tz{tT;T`ua7IDJdp`FjLg~qfZfucw0`>+1tZbb=S%~C*dcva_@ z2)ktdA?@@|7mbUZBCX}wJ_8V78VhFPyc04wA42B0{`v6nj?T9@KlazK)GH^NcJ^3s zKW^`RurOoV<*a6OtdjWr?1Jx}@zdsWaGCGDollSL?Ah$B7USuuI)@064iQ?cLCF;& zxx(fn3xL@{tbZF@8VI-;;W%hnclGb|BPy+R&QprdqS=mh1)NE4u*ohq8LRQ8yS{J&DGr9xmrN~i{zd7= z>RH3cdofpl!;9o9h)>7)ow^%au}+YAf6p60TO+s((LL0c=kVI?ZP&dZA-y`bHLT&z z(|wh9sA7QEXmhQKL+%>D_>`QumhWD`dVkH+dUNS}8{>P;8k(6k#(p1$UArE7nmPut zyeZzwZN`J;v%a~rFT4m*g)_D^rT5rf^E;mJ2?~oV^$*NdN3KKr?y9M{-Un3uq{X4VZ$C=+Z zTN(#)X~IVAm&Vy#&n&P)84~N5jZ$kca07B_)ay?Ph$Kk^;Ad3~NtHd$fm|B?3ur8x zSr2;u_D0`=X^`V9sP*s*5KN<-Rx3iX7(aZHv=dz3NyFL^S^g!|Tk~29!~S;f3u`{K zG|rZp(brW_!;>kY9#wFmOT9pYlpIZ6+C~hr1S2=AAO+z=%Ln4OA!==fZ^P4di!+77 zTImK0fbRE~+!v?bn?I7)(#6n#xAGJMI*x?E@$SR-lQ;mf)KMmL`5P?Vz1`0WsemmR zIy}OICU2}Sycq^+b|A-3ny3G@2GdVnD0LGAEY674hJJ?dbkPsEgvSCL;*%+XB@aAZ zzL!86KvuGcMmGYg$L+ZlT{!DCS5}uJ$&t_{^hB-#p|k8q4GJd3J4hFQ;4 zjk>MwrMe{#-~E<_gBh5lX}|}_*xL{5@-aR;SpxO_N>}WgE4Eb_DzUHH!P(0K+v|O2 z=6?v*^v>nFj&!`(5_=@`Ld9r>!QM*oA;1*|9l6o86(F#I0j)w3oC5$R^1$HITG zz@-9rPf3HN(n~;!2?fR5_+uds_+PT6a@YdE->JbJ1N?q9>><}706A}*rer6RNuzo@ z1j7}Z2Ju^+Zi^L0fF_7Z`C7RTYz2iMOXmunUHISRVbw0tHiAQ~e47(h9MS??B?>+- z0>!(Fj2MUIh2esz-^40VOAmR&3Sx07o!RiEnTIHb(spJ4p8W{r<99|oD-9{>Neu6w7i`!9eXO)rD% z{wV{}eGQPQs+aE(&`tW`JGWYdZ)AKw5u!lAhasqlwCK`)_>Bk|ONK6o9(dfXH6uh` zM8@QRu8yS%d2ya#$PQDJzLq{0gdm`tc|`PxedP30WJ{a15Ch(?8n)Q%{~eF}uk5{B zj3P-Mh=G7>g^d7|XU+fM_=;!vO;%m#1PLz68xQxmDk-y0_|9^;dPPZfRL1gkkUO zwbna4@AI3|Jy7=f8gC9vt5{XlC|(z2WgVbf)Li-0s{h$1casUl@=W!ez)P(L@dnMB zag$jzmzyDH&ctK~$hw~?xqbh(TV!SRRFFoz6VJT+aIuGee@$_)x=~v`b|72-Omz-t zfPJFU2VmyHSRU>a{ZofdJ3rm~n2}UyH~eG&9NNz2Ry7;2O5H#+*Ys=wYvvg8G>F*! zRM*Z9Tr{^x_wk!aG%f^b%+(ri-`;)0r4h8y7PUWYRjbc`1DjAS9(dppfYXz&TOZ;0 zy_qYT!)cF0TUN0C^g+oVh)yR`jlO$zjN{Y>ymzZOMJ(#k7wF$&$##8&s^%gf!oM1k@k;U zwZIXOTe~JX4;^F!iuA5k-e<$w;;E^54?6RbY9g?opC(npq~qK@1rg3RhLUJ^?tIiz zj>E~m`F&(>0JYF!vc4I0o4kb7UyoRHO*GWfQ0$=&A^4bz?WW&e@IyP^Jkit0?r^V6 zV+TwhKRQIkKG5f8UcUXOGr8yKljz$YHG(nLy|GTu_PuPN8(+KMHs|_1As{;8LK2ir1zvyth@#o4U0adO`;QwqcdR^F{ql&RBA${^#418siV&DF=4E75P5WEHLC`IZzY3^h-D}EKxb{Nr46&bt zB-m}aE|`5rQkq@Hj#pCOfnlNTbPIvbVFek7Vc-eLd(oDfLz!819|rT1UIMXonM9W! z_9hnH{bLP(MLT9ca`)@Y+Pym^9)cosb;XK+mHK_(%9QSYt4=?1#8m zxk3G*WuKg1Mx@vHF8fvulXl^gEqY-8mXxx+F;~=5zeTCPi6Otc>aUljCiA(Ddh7E$ z;+{3z%?@ZP+k4b|&feFmKl^LjZBr+E&HNAt^O|j5V}EbZCQURWn|PhfoBn&iyr(>D zH&KE@;*nmE7qB44U$YbKlh!{RogFQpMN?5J=S0Yir6fbPW^m(#Z#PnAMzy#!FUveV zDwipUL;z&Pm+JC&u&d}xrr|=X7Mr*Q8rhiLZK;-ed0ewSSpD5+^_imt1Ds0MZFiMZ zLp6g`|4WrF24%X*HFF31E~o0|A9!_AO6D_f61DKh3xYK;Anw0?Db=s|vuRJPfrg(I z{q6fWzGnF2JxUoh>6}3@!Q&3KhWO6BwTg0wZiljBvzd6(L?Lj)Kqd1U$n6U|#mevq zKX1p_s4rZ|k)olrEU^qfPkx*fE@@U*f2GS7yk@C;K{=^L zx+7-~yKK*pSY`sTae6cxSq$=9kf#K$`4R`D7JYi#Sq}1!J2NRbVXNa5k00_cnB7S{dP(Y*!xr&$&ecpb7B@G7Cg`KQk$P{VsK~7D z%QJt(umWT6`uio*@*d9&f6BLNf)2Ky?hFh&PpU+~7F|C<1Rlhd9{6fAB$QyJDpA*$ zOK1wy5t5V%NuYFRj>BKT_C-BP-d*C$XnbX5lDF%6Fi zC&3x<_Xagk4jxMw4awFUrZf%In&ULOqrrz2@X4&xVg7O>i_>HNqU}6D41%LOq?&*Q z`vYn#Nlvm~nyzaE7YY?4yR>&@y^OtBk}-YZRfPF#e*Or5v?%Iy%B%2zM+0%;Nf9X0 zJE)_N_FJW!@?=h_CVXsk|Ne-cQH8Ji2t@_c}fc<2u!*bHm>jqwrA zavM39p+&Ir?Nxa2YRa z>X}YqeYjat@y$tTvP6l#LqMunxKX5+D)!^xb@#lv@X>;!_BVjJg#i)V{B{)DMUM*SKdf_uKsM0zTlaEmP|>iDAWbI5WapmB{7)Wm^fu_dPr*c3K+My; zoqSX6=wba}jd3l6t%ldZS6^T6|K;mz8@-)=6HpL7X3fwunZvtIf_^2zdY$!a zTV|2+6J$YZk!amYLpiQjxw|Sn29KR>FYYX=#UGxvb-n@)2iv6Bjw7yB#|kqE)-exe zhNZi&)pS#aYZuJ?4jUitT*Cq|Mko?C2$@S+J4!eSt*{nU;chokNV>U#%dC?qWsU(P2UN*&8b^gNw6o&9BB|Wbx6iB8S|jXMT$FOGtSvunrAZxb_`P z9^SYQo@zUQd<0S?Ru#l#CCLlCQqUVG5b!Tc65?2wMX`V3ddW1~oL3h%>i!LH%T8R# zF!KZjU<*6$lKLWMhyQGX6)3;5Vg->VW2gEfca<%0aQ7rT;gacyq8QQ-{MH7v&mFw2 zm+|W|Q)I`{VBA(m<5XOk;{gu0w;uT6-FbcDO@XGmwQujCwR=eBpv z!fkKqZ9YkwUn{{~|Ft84WJTO42AJ++;t1Fm3bBoJk>_RTT0$!+6p$KhndPhi?}86bM(?!|kpj25Ysu~V!K`#`AnW&e%v z@d=Cq;TV)(`0j!9B{W{5P`I44^rVmy${b6SNRe(}mNIIwXOGj9A;M{aR*xG8+xzxj ziRTb1YG)5774VsRbC8XCHyE1;zd!}`f`v`uWAJN2%wxEwb3sS~ez|tTXukuma{||IHFG$aMjg zVd1~G9wN=_Kv};&hpH%oc?+*brl{-|f0mN>A`va!Es9Pz^Cj(Yec&h{ZJHWKHZn(o z;1vFYA+dZ+#dPr#N|3;?#Mtn3*@(n;^)Ou2?r(~JCM5N{bP|tZf&d` zJIs#3$d3GlPd@zS&|!W^vF8h}PuvW&@)r-nB5q>4IxugOImL|B(Yq_mE#eryYgXgb zs7rD@%`YO+rZk$0*W)3xX$d87-6Gu|dw~Azvfesr)0B1wV+l`oY z;snZ!DnoM^L}d7a5!RF6!Sb-y%Q1V7apcltLCsC7)VqUSQA0Z9v8tB-e$&K4>e0u( zFQl@UmhISteSdsXo<3ivZH@K5yXnoWPy}a3V&A@M7Tw9d5;SKJpdTp0*Iv=vKI4|E zT9e|mmn-q@h~7r{7ZiQ;72)Wr71W||DR0xI&vy2?7KVJMpX-axwq_|61>lHjMn*w;D5UGRja&rde z#X19LjE!Zu5$pP7|ax4K-Ltsa4N|aBuvk^ zW`N#AaeXkmjC%{16?s{c%s%t6YePc>L$OG(peYm|g?e)=g@&*AcRy>J{~>5J+VAIi zIYq8HtQ8MK7u23CU+$f6`=H6YTZ__rS`m85*!{sHS}Yy6yZx?AfW=o!t3b%&XOt}^0l z;Ksio_=wUvktvLQWPUV2&%vlJs{^8fno7zIqM7(-s4LZGC;o~){TRPnBJVH=q?04< zZNc?n6g)VP`XAGS%BP8#0ka6#bm{)4KE|Ff%r+Xcm$`vhBK9cu5c1%xOWmQ;BMZFU|i2$WFm)%97wcJOT|R(EJrfK`aWqrP&d zfV~uc#EL3N5IbP6+DG031JS|nlk$T#wjhlEYJ7C3w#MSs*S|L``6~QYlf^n08}^ww zb_XBCrC8zT)RqY|LgMojT2|*LUQhHt+#D32Vlvk);Bj*=MW$fvouTYc_z}V+FCuo} zce|!lKO!6f91gLpfTV~IB7`A1&vY!f$8d#bn<^}OuzYsjhuP64xGtix2#gu%}h@Q zB-9Nz9dkY1zvSqqvRp(;2tupvAo)pjrGKK2F5X~^Fv~6uMVGz=vfyl)k%Jn!da_wS z)f2HaR4BaEnvH3={rOYj`G8z@w_-)|-MUwncb#ICZj+udGI@@VcdWVv0QmM;iO7`K^KifMk>1Sh3-;NEv zpDE45Q2%QNftaF6w|0Xnz7brpK22K=PfjerF2-C=+us|mOVweSE*q891^x#~F1d2L zZ>Uz9{aXBsXtGJ5uouYh7%o+4i%To9+kSeTY)O zFTBC&$~-LY#D|m$zFD}mv{c)txHxgua7y+I2Gxa+ZdE!vAa2xXzQtx1uKMy3+a7>wV2ewx`=UWK(GJQFZa$co9`lY}nZDYCRS#$M9_>1R$om?-;IW5h^MNzJvOX>G zahpBONO_SFAPTXl4IkGLse%@g&5wQY))KX|eM>d+RFrpre2&SCua4`_-MQW$WT>;Flv2Qo(EkrBVq}@rxiBi@4))Fy!wQUpAbWp; zmR&O)1tqn|??JEV?A38ik=HVEIV9yr@FJYUnoactZyk6oaBU`qz+Rl1vG{qnH(*Lb zdFtO&8nbH{VZ!{T^(l>rEj;y5(wOeQBt`QW{@#%&Qp;oXf&#u~4Y6j*`W;MZR7l7G z(2@NSNSyRWnZRXSyh~3_-%{UR(V2Dl&$|^`3=jQ>?Wa!q96fOSJyZC|EjhgCK?~=5MM{+mqH1|@vUYSXAmGQry zx4YU`K`t}L=i#-?*qaY3zKoCR48{^h6n^6b;R(G5%L~rW7`&}*%eC0)xH03=z3NA; z*?SGT5ZL=wx0PqyZr|RK^F2=P!2Q-dH0T@2Hm>(_zL0z3Tu+q(e}Kr`LWEtAVAJM2LY*^49$ES1`H7JQnY| z6amXlIPW3XwYfxn z*pH|}{Q0yUllDyfd$B92XT^2VVg7Ln*cj5+R7TjOc~FqXwDn1C8e0)-gl%47wTFlK6qiGH^XQ>^@e{YYDoX$ZN)T2GeAv>4JNyV z-lE?5bveP6=My@cgkC9P43zc~6O}irC0t>Vvp}LrP=KBZ3pP%for@K)>Yhok{6pWK_xS=KIz+e9q zo@PFKTKKi#-!oXZNWdq{>VJH)&X9mjR^X!&Lz)A8`R&<9vv!SQBRo@l1UF9t+nmqZ zNfQ4X4Co6zcClF8{Gm06DH4?1YU|iRgNLnWbv`O0m6$Ndv z?3{=MmgHvvEQL?PoZ#AYSN4Dl9#8&^ZCSP#mV3V}GfnH<9EyYjBH7CKh!m<5;|2Y^*dR$Qz z<|%clPPz}<9`BEHj^Hq%%&8V+C35>ZM(W>%S(4&no(^7XnJm)FGsmRx6yg_|iWL)xo1ZhHWn`nOlZ;XKe3M0Pd{|m>jQz`)eg#7Kj zN~aAn0H0>n5v+cfYb6~>F}P#o#&&yIrly74bn4)J{sBSE=>ipjfuox2uXkgVDqU`t zyQmlQcx79XH0WsIf_xppjidgWt9CaAu}nYU(Opk+uVgRC+&O=F^dKcIZc^L-@Q(Iw z6)gU(tAeGV!oEP$ecG+_JSLg8g*ZfRBBg;or$%Tom=6)@v6)b=_#`ZU5Ag3)nLEV^ zfkJtt%-eP9PUUMP;&CMUS|E5s7TD2>k~G$8NH*P~3h%$>$QVK~)K2cN=JQ~OI0=U1 zzo$~lMK%%Bz>9h7K8~Vi4q%(IV7tMlz!D7*N)jj_IWnABqs<|kU^h1D!bmwFA`Nwc zCrj=d zHXPuG326;J#G!hg_!kJ1Y355qOy44yXSt0mn2dLhv2^#X8Ru~@X;yLL$Nm(8GaSDD zU4r||r(lQrwyuLOxExzG*Uh;d0s4YzJ64&2dN{X2+s^XT*KEU1xd(gn^weMOA9H{T zB7dta2!2=P>$uZV#}V~9=8ge==HR8uY|2fJ%gsaX<@-O$;nTSuU~PJ_Yv8 z|KxItb(BuW9nW)JrY{R}MgEfeg`9L}+p|Hxd*7iR~06fd%bv6}~TpmUa8u$!;aP;wS#=dJv z*R`Yn^aCI=I3RD*{l#I#3O8S}77iDJ8?XsW9O7xsOSu9cu+5?3ak*tbLXSVVb&%d_ zqCs#VwjCC`0a+m16Ih7G)sa{Mf>46a1kV~bV$7^#wh&G~3`h1)cDTa(tEkYk`FJ2{FA+# zPX|7%bv~th=@!NQ2K}Lc83(Q9iZSd@@57L)U(sv1jZW-+<-hTb{4QRo=e~O6M#-d{ z$iqro!2Ge>iE&d=~6SYx0(?d$+sNF)q^b1`oeW4r#Auk&Q!4;5fNYw@ea z8hpeYAlq1T!G@>;C5}L`U+b<#y4>9W(!Mg|Y zPaJfdraB|F>6aeu72>pEUYGxmaA1|#1i}E_twwJ=4G2%=8CtWRjD1)77@D(fEg9yH zA7q?GK?^tHu8~w>QwL}zwMpw54ro0UqZP{qJ{8TN4E9xo1BUG6W*n#yEeML>M(7Sc zd=}dV4by-tk)4S62VnbtAhFvx!)jkaE6!7G)uuUO*)PJOZ)wc&x%}Dwg_LCw4#&sF z-~SLk>QW(&Urd44&?49NFQyYwT3u&eO!{=Hp{lPJ?4~rZ1T&wmGH@mImYqH)V#^&5 zr~crLiB#Llt;XK1SH#<;S9rn5X%D`a63m@Iru%C_xdCb2_$*9&Q2gbWf=34G==h6; zHm|---aapqyE~a$Ucxpiz%8X)U8?X>I)$%xZ#VLg<4tMcx?9Am--I$8QYy09m336A zCcXf-Odz-G&56&`xo8c+v4r+Eo01ARSzwVqdQF1zgI2Pr3(@fy^>NtIwMCSB3zZgE z;yq79;(rh=(RQ9XR}baI(m-{%eLNu_AU-7!i5PamXy9 z=Y)=y_fyEEWny{6xLI-zhhG4JFNb7HtI*3D*T$FPaxK3ZrpbQt-j-$gs`{LN-ox=U8P(V|JT)%mVN+FvzdBboznS4?3Ubhm@IbaQF23gk28ZU+AGH`ANpRK#^*QYZ zOSFxl3;?)ReEer)r+-IyxU)M2z?TnY)19^xxX1R*E^4y z>wG@)h1QIe4QXEu$uOp41U;smg}Q1tR+dOo`HgFvrQN(Ah@0>jAqrS2hmmFJ9s!`A zNw8||n_F^K8=nH;o4BiVt*e0{A&N!EC>ga>LQI7Z-UOxe9xhmOhmvR+^Ilz}UD-={ z>SDWLu~i{6P2`n#SBs@<43UzrR>`D466tA7)WNTr$mH&7&zE&II+ijPr;vw|KIZ0fm4pN8j9K}lrN1P_4?A6LGiU^A>mlbd?7 zQXqdM?R)|AeaKuS@Zse!8$#yZJ%YE8ELgS^X+T+c@`fw$;YBe9fO#&In|}`nNBfHQ zXH|w;1ycn$xtYYE$yD*_V^6O0B|tmX{LB76GspDG0V?JXCTs{=r(oQT$m3~8iFaYf z7;LceOs)%Z&LF_|+&!>B58(6C#?|}HTg@IWJ~!x+DuH}}$c_ZUU3Ow_g~0esSEsIy zXkX8GP2lpB7{%v(0n9bA+Dp9Nb$mqTrT53(ENCTy%f%iC?_?XR^CNmye&c+u>k4|K zKSXg=aFajbUXkt=QEbj=bZMxxCru}0lN{dYKnv_BC7}~?=V0%lqhC;aDttF*wFiJ& z*w#5!o#| z)os@>^-Oo{pN`ti{^2cAy3g*=yDPZM$6Ef`G-zIG84VvOocj(QU|nO;a^u=r!ft3# zSF@xYsjviCN8siX_673u6vuHV1N7LXhkeYgUE$-oAncWU)O#k6KlE4MLNihkc4bNR z(~h@71NacnLJl*SoB>K2hk$pr8r&%0DUw)Td|DcA$GRdZ!Y&(UzF1(T+8jnQskmBGYBGsAYX# z{Rr3QAj}jh7Tr6}=P9<|!>>3uL!Ta(2)QwsEV|z@Hh%XC8%s{55tQPq;b?YZ=}>2V z^{kri=HYnq4{#PAmrg^WNE<{LaG6T27*4c2?3RK)_`3C3D*oBw$`nEF0oFk0Q28If z*5rVGnffq`i#K|vRCuoR>waog|wH+PLQ{l zMp;jMvF@2V*V>y6;R!5;R_dkZZ<^ldp99m|&j2e{LBriP4>DYnKfR5;!09 ziTHK)PdLq^KTaVaJ}1@_nhjgQdZjf{W4%|&%MAECI9Zr$)&yI4UQ!|flAf(#lEe%5 zmK3;#TV7Zm$t9Tb$#W>{wGcaLhjbMD=?42rBXRweA*0~l8-xFvf-oOAtS95M;5Z4H z8J-7<5DjnY1v;@47MvW{7Zwadu5lcB$8psn{=)XD)gEd}Kb>32gch>ma;~wzg(seE z@TG7CC^`2f?9>#vAMPHM=#qY)_O8dx-lk5^O%YfBm<1$uJ;K57<^LaQy zj7cRa#PO1ODrT6Qmm;LPBj^xeB(h_AIDGA+v!3`MxBCI1fPt` zypCY+x$#PEB2GKXC%NnVH>aq8^tcAPO@L>rYRWbbr)@#LJG0m>bkUFqjFd!7J?H1$ zpeym8xOJ4tL&u`zUy40n;-hm9#l@n7Ba0@7E&<=xZC!fZ-;9XycRsgP|N64-X(ho% zULm#9y*tnVreE2CFD@$3LuUVfy(A_eY7vfzMmiBX_z*ssjoCIsJR};)jyD?sBdZ_w z?TM(Ft;%)G_*8H$5JiPnUl@yThHVw#~a*X%Di;^3QdtEX3X9`3M;5AVBK z=`5Hvxb(2jThCKP-&QLZe{mmnaHgMvjSq9bNu1U+ zLEhRzjk%g(w%grmN1gN>t9W3Ca;n+tw*Kd%Kraw+Uf+{Fz;S8TtV{cp`j0Mv)pT%& z+=;J>Q&wIel6g&fo#b?KlT3y<{#sQdVIM?Ew>cm_3nioycM$Xk(6(Wb_W-0DxVMS} zt9EN&A{4qxzjtR1IBKvc3Hza7OVbV?0@&`4m-OkX`V-V#Z*1^aVV^J5;4 z{Se;cEYewS=8xUx8jE)+HuIP0qO^|~M|xw&+z9IqU#v|n>pGgJ6trZzs(mP<43U0_ zU{-hac8v06u{~1BR_6dItlO}_LZ*PHkT@=F5Q%cdS;&Z=$Ua!M!Bb!v z^DjKju!aLiDRj8Mh;gyLsk-S%t|21-JoL8qNYDY&Mb~`=0l&RM-3f#YnveE;`u%lX zYi}gDi#5caaeYYvLzQq4{hQ3!LQ z2`9t+TnUh|o1g`Om*mtcvJ<(T5YV@dp^D$xo`_`oA=*hwn32UJ1D4a)(01UN^B%4Wo!f6R5q+2VD6Y6MWvt}BV&cQG=IyXT_YDG0i%{U|00tF*MTd!Ql9Th^6|2YN5P%hR^KQTKNAD;o@NeeDp|2xs`y z{QB=VgNg!&Be&guEWfR8NLN#NM0n(%TyOtd>NG0LdQ+EQ} z$ROHmj=;Tjl*%T@V{!>eR56iDcdI^L16ly)KuA0v=*o?bv{55mh9f5)&e2g6+$i4d z#4Q&nDYYWzUTCpjZw5_lCny3wi{Z167D;!1UcurV#@fF0e|H2Hr5fwrYPW>6WGV1g z-sxqb&Wl4>U-d`&E@(kJUv2LW(Kb=U9LW{xc`&=ndDV; zO%~j^ySs54d7t3o-y8H_#d;6r1{DN7Wneb{)@3lrw{PqSIJh+3M>QDKXDeW1t0uj+ zm1#bxJP}Jl{o~9guP0Mhlv_Y*<@q0}6>T}KbK%|Ezok|)3gZVyF!f^DH7CH4Jy{M; zr)b~rHkyF2GPxX*2}(ydao%h8)k4&|kqYS6fo%h>;ncAH%YkAeg1RKh`SV<_PZIW}ASD@!z

~?U9|E)24s!$g6*86GU!mqqy{@ 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 Date: Mon, 31 Jul 2023 13:47:45 -0400 Subject: [PATCH 26/61] upd --- circuitpython_uplot/scatter.py | 5 +++-- docs/examples.rst | 11 +++++++++++ docs/quick_start.rst | 5 +++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index 331fc51..2b9c1fd 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -74,12 +74,13 @@ def __init__( else: self._pointer = pointer - self._radius = radius self._pointer_color = pointer_color if isinstance(self._radius, list) and self._pointer != "circle": - raise ValueError(f"Pointer paramater is {self._pointer}. Variable Radius are not accepted") + raise ValueError( + f"Pointer paramater is {self._pointer}. Variable Radius are not accepted" + ) if rangex is None: xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) diff --git a/docs/examples.rst b/docs/examples.rst index 5be89e9..a61e754 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -81,6 +81,17 @@ Example showing how to use different pointers :lines: 5- .. image:: ../docs/scatter_pointers.jpg +Scatter using different datasets +---------------------------------- + +Example showing how to use different datasets + +.. literalinclude:: ../examples/scatter.py + :caption: examples/scatter.py + :lines: 5- +.. image:: ../docs/scatter_pointers.jpg + + Display_shapes Example ----------------------- diff --git a/docs/quick_start.rst b/docs/quick_start.rst index fd9b318..6390773 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -117,14 +117,15 @@ The following snippet shows how to create a cartesian plot Tick spacing and numbers are selected by default. However it's possible to customize the following parameters: -.. py:function:: Plot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid) +.. py:function:: Plot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid, showtext, decimal_points) + :parm bool showtick: displays the tick. Defaults to `True` :param int tickx_height: tickx_height in pixels :param int ticky_height: ticky_height in pixels :param int tickcolor: tickcolor in Hex format :param bool tickgrid: displays the tickgrid. Defaults to `False` :param bool showtext: displays the tick text. Defaults to `False` - :param int decimal_points: number of decimal points to show. Defaults to `0` +.. :param int decimal_points: number of decimal points to show. Defaults to `0` .. code-block:: python From 8dfd67fda17e2615e01777c24d3ab8472106f5a8 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 13:53:46 -0400 Subject: [PATCH 27/61] add const --- docs/quick_start.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 6390773..f58ebc8 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -5,6 +5,7 @@ Plot Usage ============= We start importing some fundamental libraries for plot to operate + .. code-block:: python import board @@ -117,15 +118,16 @@ The following snippet shows how to create a cartesian plot Tick spacing and numbers are selected by default. However it's possible to customize the following parameters: -.. py:function:: Plot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid, showtext, decimal_points) +.. py:function:: Plot.tick_params(showtick, tickx_height, ticky_height, tickcolor, tickgrid, showtext, decimal_points) - :parm bool showtick: displays the tick. Defaults to `True` + :param bool showtick: displays the tick. Defaults to `True` :param int tickx_height: tickx_height in pixels :param int ticky_height: ticky_height in pixels :param int tickcolor: tickcolor in Hex format :param bool tickgrid: displays the tickgrid. Defaults to `False` :param bool showtext: displays the tick text. Defaults to `False` -.. :param int decimal_points: number of decimal points to show. Defaults to `0` + :param int decimal_points: number of decimal points to show. Defaults to :const:`0` + .. code-block:: python From 06a8ade059591f02f6ec96cec284bdd3904950e5 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 13:54:46 -0400 Subject: [PATCH 28/61] upd --- circuitpython_uplot/plot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 9e7ff26..5e393b5 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -387,7 +387,7 @@ def tick_params( :param int tickcolor: tick color in hex. Defaults to white. ``0xFFFFFF`` :param bool tickgrid: defines if the grid is to be shown. Defaults to `False` :param bool showtext: Show Axes text. Defaults to `False` - :param int decimal_points: Number of decimal points to show. Defaults to 0 + :param int decimal_points: Number of decimal points to show. Defaults to :const:`0` :return: None From 05b0bec032a67dfb479174249f4a8e1304dcb5e1 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 14:02:32 -0400 Subject: [PATCH 29/61] udpating pic link --- docs/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples.rst b/docs/examples.rst index a61e754..68539e2 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -89,7 +89,7 @@ Example showing how to use different datasets .. literalinclude:: ../examples/scatter.py :caption: examples/scatter.py :lines: 5- -.. image:: ../docs/scatter_pointers.jpg +.. image:: ../docs/scatter_using_different_datasets.jpg Display_shapes Example From 461cd4807043fe3ea42614bbdaf0b9fbfb965939 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 17:29:16 -0400 Subject: [PATCH 30/61] adding Polyfit example --- circuitpython_uplot/plot.py | 21 +++- docs/cartesian_scatter_polyfit.jpg | Bin 0 -> 86420 bytes docs/examples.rst | 11 ++ .../cartersian_and_scatter_polyfit_example.py | 118 ++++++++++++++++++ 4 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 docs/cartesian_scatter_polyfit.jpg create mode 100644 examples/cartersian_and_scatter_polyfit_example.py diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 5e393b5..6ecf9d0 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -464,7 +464,13 @@ def update_plot(self) -> None: self._drawbox() def show_text( - self, text: str, x: int, y: int, anchorpoint: Tuple = (0.5, 0.0) + self, + text: str, + x: int, + y: int, + anchorpoint: Tuple = (0.5, 0.0), + text_color: int = 0xFFFFFF, + free_text: bool = False, ) -> None: """ @@ -473,11 +479,20 @@ def show_text( :param int x: x coordinate :param int y: y coordinate :param Tuple anchorpoint: Display_text anchor point. Defaults to (0.5, 0.0) + :param int color: text color. Defaults to :const:`0xFFFFFF` + :param bool free_text: Select to show free text :return: None """ + try: + self.bitmap_label + except AttributeError: + from adafruit_display_text import bitmap_label - if self._showtext: - text_toplot = self.bitmap_label.Label(terminalio.FONT, text=text, x=x, y=y) + self.bitmap_label = bitmap_label + if self._showtext or free_text: + text_toplot = self.bitmap_label.Label( + terminalio.FONT, text=text, x=x, y=y, color=text_color + ) text_toplot.anchor_point = anchorpoint text_toplot.anchored_position = (x, y) self.append(text_toplot) diff --git a/docs/cartesian_scatter_polyfit.jpg b/docs/cartesian_scatter_polyfit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30cdfe4557a2dc2e78e93cfaf67c58255339a2db GIT binary patch literal 86420 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 Date: Mon, 31 Jul 2023 17:32:44 -0400 Subject: [PATCH 31/61] upd --- examples/cartersian_and_scatter_polyfit_example.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/cartersian_and_scatter_polyfit_example.py b/examples/cartersian_and_scatter_polyfit_example.py index 2d64932..520f555 100644 --- a/examples/cartersian_and_scatter_polyfit_example.py +++ b/examples/cartersian_and_scatter_polyfit_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -from random import choice import board import displayio from ulab import numpy as np @@ -52,8 +51,9 @@ 140, 315, [("-----------", "-----------",)], - [("Value X", "Value Y",), ("1", "3",), ("2", "14",),("3", "23",),("4", "25",),("5", "23",),("6", "15",), - ("7", "9",),("8", "5",),("9", "9",),("10", "13",),("11", "17",),("12", "24",),("13", "32",),("14", "36",), + [("Value X", "Value Y",), ("1", "3",), ("2", "14",),("3", "23",),("4", "25",), + ("5", "23",),("6", "15",),("7", "9",),("8", "5",),("9", "9",),("10", "13",), + ("11", "17",),("12", "24",),("13", "32",),("14", "36",), ("15", "46",)], "fonts/LibreBodoniv2002-Bold-10.bdf", text_color = 0xFFFFFF, From 6d3d0bd0791a9fee058fb289506437c851492bc6 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 17:40:58 -0400 Subject: [PATCH 32/61] updating picture link --- docs/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples.rst b/docs/examples.rst index 91f3030..c798b29 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -100,7 +100,7 @@ Example showing how to use cartesian and scatter in the same plot .. literalinclude:: ../examples/cartersian_and_scatter_polyfit_example.py :caption: examples/cartersian_and_scatter_polyfit_example.py :lines: 5- -.. image:: ../docs/cartesian_logging_data.gif +.. image:: ../docs/cartesian_scatter_polyfit.jpg Display_shapes Example From a6b6c3e7c3104119c37f8628148cc41a4448614b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 20:11:55 -0400 Subject: [PATCH 33/61] updating cartesian scale and tick values --- circuitpython_uplot/cartesian.py | 87 +++++++++++++++++++++++++++----- circuitpython_uplot/plot.py | 1 + 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index f368f4b..77e16d7 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -40,6 +40,9 @@ def __init__( rangey: Optional[list] = None, line_color: Optional[int] = None, line_style: Optional[str] = None, + ticksx: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), + ticksy: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), + tick_pos: bool = False, fill: bool = False, nudge: bool = True, logging: bool = False, @@ -53,12 +56,24 @@ def __init__( :param list|None rangey: y range limits. Defaults to None :param int|None line_color: line color. Defaults to None :param str|None line_style: line style. Defaults to None + :param np.array|list ticksx: X axis ticks values + :param np.array|list ticksy: Y axis ticks values + :param bool tick_pos: indicates ticks position. True for below the axes. :param bool fill: Show the filling. Defaults to `False` :param bool nudge: moves the graph a little for better displaying. Defaults to `True` :param bool logging: used to change the logic of the cartesian to work as a logger """ self.points = [] + self.ticksx = np.array(ticksx) + self.ticksy = np.array(ticksy) + + if tick_pos: + self._tickposx = plot._tickheightx + self._tickposy = plot._tickheighty + else: + self._tickposx = 0 + self._tickposy = 0 if line_color is not None: plot._plot_palette[plot._index_colorused] = line_color @@ -80,31 +95,33 @@ def __init__( nudge_factor = 0 if rangex is None: - xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) - xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + self.xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + self.xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + else: - xmin = min(rangex) - xmax = max(rangex) + self.xmin = min(rangex) + self.xmax = max(rangex) if rangey is None: - ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) - ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + self.ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + self.ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) else: - ymin = min(rangey) - ymax = max(rangey) + self.ymin = min(rangey) + self.ymax = max(rangey) x = np.array(x) y = np.array(y) xnorm = np.array( - plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, x), + plot.transform(self.xmin, self.xmax, plot._newxmin, plot._newxmax, x), dtype=np.int16, ) ynorm = np.array( - plot.transform(ymin, ymax, plot._newymin, plot._newymax, y), + plot.transform(self.ymin, self.ymax, plot._newymin, plot._newymax, y), dtype=np.int16, ) + if fill: self.points.append((xnorm[0], plot._newymin)) for index, item in enumerate(xnorm): @@ -134,7 +151,7 @@ def __init__( for index, _ in enumerate(xnorm): if index + 1 >= len(xnorm): break - if y[index] >= ymax: + if y[index] >= self.ymax: continue self._draw_plotline(plot, index, xnorm, ynorm) @@ -142,9 +159,9 @@ def __init__( if plot._showticks: if plot._cartesianfirst: if logging: - x = np.linspace(xmin, xmax, 100) - y = np.linspace(ymin, ymax, 100) - plot._draw_ticks(x, y) + x = np.linspace(self.xmin, self.xmax, 100) + y = np.linspace(self.ymin, self.ymax, 100) + self._draw_ticks(plot) plot._cartesianfirst = False plot._showticks = False @@ -177,3 +194,45 @@ def _plot_line(plot, index, xnorm, ynorm): ynorm[index + 1], plot._index_colorused, ) + + def _draw_ticks(self, plot) -> None: + """ + Draw ticks in the plot area + + """ + + ticksxnorm = np.array( + plot.transform( + self.xmin, self.xmax, plot._newxmin, plot._newxmax, self.ticksx + ), + dtype=np.int16, + ) + ticksynorm = np.array( + plot.transform( + self.ymin, self.ymax, plot._newymin, plot._newymax, self.ticksy + ), + dtype=np.int16, + ) + + for i, tick in enumerate(ticksxnorm): + draw_line( + plot._plotbitmap, + tick, + plot._newymin + self._tickposx, + tick, + plot._newymin - plot._tickheightx + self._tickposx, + 2, + ) + if plot._showtext: + plot.show_text(f"{self.ticksx[i]:.{plot._decimal_points}f}", tick, plot._newymin, (0.5, 0.0)) + for i, tick in enumerate(ticksynorm): + draw_line( + plot._plotbitmap, + plot._newxmin - self._tickposy, + tick, + plot._newxmin + plot._tickheighty - self._tickposy, + tick, + 2, + ) + if plot._showtext: + plot.show_text(f"{self.ticksy[i]:.0f}", plot._newxmin, tick, (1.0, 0.5)) diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 6ecf9d0..d9a1c0e 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -498,6 +498,7 @@ def show_text( self.append(text_toplot) + # pylint: disable=missing-class-docstring, too-few-public-methods, invalid-name class color: WHITE = 0xFFFFFF From b6ebd09022eef58f2854715dc9e5f661be4b8d01 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 20:15:10 -0400 Subject: [PATCH 34/61] upd --- .pylintrc | 2 +- circuitpython_uplot/cartesian.py | 8 ++++++-- circuitpython_uplot/plot.py | 1 - circuitpython_uplot/svg.py | 2 -- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.pylintrc b/.pylintrc index 1314d86..52e7b37 100644 --- a/.pylintrc +++ b/.pylintrc @@ -115,7 +115,7 @@ max-locals=25 max-parents=7 max-public-methods=20 max-returns=6 -max-statements=60 +max-statements=70 min-public-methods=0 [EXCEPTIONS] diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 77e16d7..7196153 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -121,7 +121,6 @@ def __init__( dtype=np.int16, ) - if fill: self.points.append((xnorm[0], plot._newymin)) for index, item in enumerate(xnorm): @@ -224,7 +223,12 @@ def _draw_ticks(self, plot) -> None: 2, ) if plot._showtext: - plot.show_text(f"{self.ticksx[i]:.{plot._decimal_points}f}", tick, plot._newymin, (0.5, 0.0)) + plot.show_text( + f"{self.ticksx[i]:.{plot._decimal_points}f}", + tick, + plot._newymin, + (0.5, 0.0), + ) for i, tick in enumerate(ticksynorm): draw_line( plot._plotbitmap, diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index d9a1c0e..6ecf9d0 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -498,7 +498,6 @@ def show_text( self.append(text_toplot) - # pylint: disable=missing-class-docstring, too-few-public-methods, invalid-name class color: WHITE = 0xFFFFFF diff --git a/circuitpython_uplot/svg.py b/circuitpython_uplot/svg.py index b73f203..a4b4a28 100644 --- a/circuitpython_uplot/svg.py +++ b/circuitpython_uplot/svg.py @@ -24,8 +24,6 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -# pylint: disable=too-many-arguments, invalid-name, no-self-use, too-few-public-methods -# pylint: disable=too-many-locals, too-many-branches, protected-access, unnecessary-list-index-lookup class SVG: """ class to render svg images in the plot area From b04aa8f6a41d72b1384506439c96bb4e573aa641 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 31 Jul 2023 23:00:52 -0400 Subject: [PATCH 35/61] fixing ticks --- circuitpython_uplot/cartesian.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 7196153..0feeb81 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -240,3 +240,7 @@ def _draw_ticks(self, plot) -> None: ) if plot._showtext: plot.show_text(f"{self.ticksy[i]:.0f}", plot._newxmin, tick, (1.0, 0.5)) + + if plot._tickgrid: + plot._draw_gridx(ticksxnorm) + plot._draw_gridy(ticksynorm) From 4186096fb053b4e8087ff6950d90d51cbc56cb76 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 15:45:32 -0400 Subject: [PATCH 36/61] removing_examples_time --- circuitpython_uplot/cartesian.py | 61 ++---------------- circuitpython_uplot/plot.py | 98 ++++++++++++++++++----------- examples/bar_3Dbars.py | 4 -- examples/bar_example.py | 4 -- examples/bar_scale_example.py | 4 -- examples/cartesian_advanced.py | 4 -- examples/display_shapes.py | 4 -- examples/fillbetween.py | 4 -- examples/integration_example.py | 3 - examples/logging_animation.py | 4 +- examples/logging_changing_values.py | 2 +- examples/logging_limits.py | 1 - examples/logging_table.py | 2 +- examples/map.py | 4 -- examples/pie_example.py | 4 -- examples/plot_example.py | 2 - examples/plot_simpletest.py | 3 - examples/scatter.py | 4 -- examples/shade_example.py | 2 - examples/stackplot.py | 3 - examples/tickparameters.py | 4 -- examples/uboxplot_example.py | 5 +- 22 files changed, 71 insertions(+), 155 deletions(-) diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 0feeb81..2d194ab 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -40,8 +40,8 @@ def __init__( rangey: Optional[list] = None, line_color: Optional[int] = None, line_style: Optional[str] = None, - ticksx: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), - ticksy: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), + ticksx: Union[np.array, list] = None, + ticksy: Union[np.array, list] = None, tick_pos: bool = False, fill: bool = False, nudge: bool = True, @@ -65,8 +65,8 @@ def __init__( """ self.points = [] - self.ticksx = np.array(ticksx) - self.ticksy = np.array(ticksy) + self.ticksx = ticksx + self.ticksy = ticksy if tick_pos: self._tickposx = plot._tickheightx @@ -160,7 +160,7 @@ def __init__( if logging: x = np.linspace(self.xmin, self.xmax, 100) y = np.linspace(self.ymin, self.ymax, 100) - self._draw_ticks(plot) + plot._draw_ticks(x, y, self.ticksx, self.ticksy) plot._cartesianfirst = False plot._showticks = False @@ -193,54 +193,3 @@ def _plot_line(plot, index, xnorm, ynorm): ynorm[index + 1], plot._index_colorused, ) - - def _draw_ticks(self, plot) -> None: - """ - Draw ticks in the plot area - - """ - - ticksxnorm = np.array( - plot.transform( - self.xmin, self.xmax, plot._newxmin, plot._newxmax, self.ticksx - ), - dtype=np.int16, - ) - ticksynorm = np.array( - plot.transform( - self.ymin, self.ymax, plot._newymin, plot._newymax, self.ticksy - ), - dtype=np.int16, - ) - - for i, tick in enumerate(ticksxnorm): - draw_line( - plot._plotbitmap, - tick, - plot._newymin + self._tickposx, - tick, - plot._newymin - plot._tickheightx + self._tickposx, - 2, - ) - if plot._showtext: - plot.show_text( - f"{self.ticksx[i]:.{plot._decimal_points}f}", - tick, - plot._newymin, - (0.5, 0.0), - ) - for i, tick in enumerate(ticksynorm): - draw_line( - plot._plotbitmap, - plot._newxmin - self._tickposy, - tick, - plot._newxmin + plot._tickheighty - self._tickposy, - tick, - 2, - ) - if plot._showtext: - plot.show_text(f"{self.ticksy[i]:.0f}", plot._newxmin, tick, (1.0, 0.5)) - - if plot._tickgrid: - plot._draw_gridx(ticksxnorm) - plot._draw_gridy(ticksynorm) diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 6ecf9d0..308ed7e 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -270,7 +270,7 @@ def transform( / (oldrangemax - oldrangemin) ) + newrangemin - def _draw_ticks(self, x: int, y: int) -> None: + def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: """ Draw ticks in the plot area @@ -281,13 +281,29 @@ def _draw_ticks(self, x: int, y: int) -> None: """ - ticks = np.array([10, 30, 50, 70, 90]) - subticks = np.array([20, 40, 60, 80]) - ticksxnorm = np.array(self.transform(0, 100, np.min(x), np.max(x), ticks)) - ticksynorm = np.array(self.transform(0, 100, np.min(y), np.max(y), ticks)) + ticks_dummy = np.array([10, 30, 50, 70, 90]) + subticks_dummy = np.array([20, 40, 60, 80]) + + if ticksx is None: + ticksxnorm = np.array( + self.transform(0, 100, np.min(x), np.max(x), ticks_dummy) + ) + subticksxnorm = np.array( + self.transform(0, 100, np.min(x), np.max(x), subticks_dummy) + ) + else: + ticksxnorm = np.array(ticksx) + + if ticksy is None: + ticksynorm = np.array( + self.transform(0, 100, np.min(y), np.max(y), ticks_dummy) + ) + subticksynorm = np.array( + self.transform(0, 100, np.min(y), np.max(y), subticks_dummy) + ) + else: + ticksynorm = np.array(ticksy) - subticksxnorm = np.array(self.transform(0, 100, np.min(x), np.max(x), subticks)) - subticksynorm = np.array(self.transform(0, 100, np.min(y), np.max(y), subticks)) ticksxrenorm = np.array( self.transform( @@ -295,24 +311,28 @@ def _draw_ticks(self, x: int, y: int) -> None: ), dtype=np.int16, ) + + ticksyrenorm = np.array( self.transform( np.min(y), np.max(y), self._newymin, self._newymax, ticksynorm ), dtype=np.int16, ) - subticksxrenorm = np.array( - self.transform( - np.min(x), np.max(x), self._newxmin, self._newxmax, subticksxnorm - ), - dtype=np.int16, - ) - subticksyrenorm = np.array( - self.transform( - np.min(y), np.max(y), self._newymin, self._newymax, subticksynorm - ), - dtype=np.int16, - ) + if ticksx is None: + subticksxrenorm = np.array( + self.transform( + np.min(x), np.max(x), self._newxmin, self._newxmax, subticksxnorm + ), + dtype=np.int16, + ) + if ticksy is None: + subticksyrenorm = np.array( + self.transform( + np.min(y), np.max(y), self._newymin, self._newymax, subticksynorm + ), + dtype=np.int16, + ) for i, tick in enumerate(ticksxrenorm): draw_line( self._plotbitmap, @@ -345,24 +365,28 @@ def _draw_ticks(self, x: int, y: int) -> None: tick, (1.0, 0.5), ) - for tick in subticksxrenorm: - draw_line( - self._plotbitmap, - tick, - self._newymin, - tick, - self._newymin - self._tickheightx // 2, - 2, - ) - for tick in subticksyrenorm: - draw_line( - self._plotbitmap, - self._newxmin, - tick, - self._newxmin + self._tickheighty // 2, - tick, - 2, - ) + + if ticksx is None: + for tick in subticksxrenorm: + draw_line( + self._plotbitmap, + tick, + self._newymin, + tick, + self._newymin - self._tickheightx // 2, + 2, + ) + + if ticksy is None: + for tick in subticksyrenorm: + draw_line( + self._plotbitmap, + self._newxmin, + tick, + self._newxmin + self._tickheighty // 2, + tick, + 2, + ) if self._tickgrid: self._draw_gridx(ticksxrenorm) diff --git a/examples/bar_3Dbars.py b/examples/bar_3Dbars.py index 907de9b..e0ef584 100644 --- a/examples/bar_3Dbars.py +++ b/examples/bar_3Dbars.py @@ -23,7 +23,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/bar_example.py b/examples/bar_example.py index 4345cfd..b1d48dc 100644 --- a/examples/bar_example.py +++ b/examples/bar_example.py @@ -21,7 +21,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/bar_scale_example.py b/examples/bar_scale_example.py index fb7a90f..fe2ac9a 100644 --- a/examples/bar_scale_example.py +++ b/examples/bar_scale_example.py @@ -31,7 +31,3 @@ group.append(plot_scale2) display.show(group) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/cartesian_advanced.py b/examples/cartesian_advanced.py index 4d2e51b..92a7bfa 100644 --- a/examples/cartesian_advanced.py +++ b/examples/cartesian_advanced.py @@ -28,7 +28,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/display_shapes.py b/examples/display_shapes.py index 0d2686f..8273bb6 100644 --- a/examples/display_shapes.py +++ b/examples/display_shapes.py @@ -43,7 +43,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/fillbetween.py b/examples/fillbetween.py index 696b7bb..55e1a82 100644 --- a/examples/fillbetween.py +++ b/examples/fillbetween.py @@ -22,7 +22,3 @@ Fillbetween(plot, x, y1, y2) display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/integration_example.py b/examples/integration_example.py index 0982a09..2d28226 100644 --- a/examples/integration_example.py +++ b/examples/integration_example.py @@ -32,6 +32,3 @@ # Showing in the screen display.show(plot) - -while True: - pass diff --git a/examples/logging_animation.py b/examples/logging_animation.py index 225d43a..84a1c60 100644 --- a/examples/logging_animation.py +++ b/examples/logging_animation.py @@ -18,7 +18,7 @@ 60, 200, 200, - padding=1, + padding=25, show_box=True, box_color=color.WHITE, ) @@ -78,7 +78,7 @@ ) # Showing the loggraph -while True: +for _ in range(20): if dist > len(x): y.pop(0) y.append(random.choice(random_numbers)) diff --git a/examples/logging_changing_values.py b/examples/logging_changing_values.py index 945e4b9..df6464a 100644 --- a/examples/logging_changing_values.py +++ b/examples/logging_changing_values.py @@ -63,7 +63,7 @@ ) -while True: +for i in range(2): for i in range(len(x)): my_log.draw_points(plot_1, x[0:i], temp_y[0:i]) time.sleep(1) diff --git a/examples/logging_limits.py b/examples/logging_limits.py index 6edf7fb..f948184 100644 --- a/examples/logging_limits.py +++ b/examples/logging_limits.py @@ -19,7 +19,6 @@ 60, 200, 200, - padding=1, show_box=True, box_color=color.WHITE, ) diff --git a/examples/logging_table.py b/examples/logging_table.py index 962fee3..ee98059 100644 --- a/examples/logging_table.py +++ b/examples/logging_table.py @@ -76,7 +76,7 @@ # Show the group display.show(g) -while True: +for _ in range(2): for i in range(len(x)): my_log.draw_points(plot_1, x[0:i], temp_y[0:i]) time.sleep(1) diff --git a/examples/map.py b/examples/map.py index 4eaacc1..6e5353d 100644 --- a/examples/map.py +++ b/examples/map.py @@ -26,7 +26,3 @@ Map(plot, y1, 0xFF0044, 0x4400FF) # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/pie_example.py b/examples/pie_example.py index ea177c8..6484521 100644 --- a/examples/pie_example.py +++ b/examples/pie_example.py @@ -21,7 +21,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/plot_example.py b/examples/plot_example.py index effe84e..be13f56 100644 --- a/examples/plot_example.py +++ b/examples/plot_example.py @@ -23,5 +23,3 @@ Cartesian(plot, x, y) display.show(plot) -while True: - time.sleep(1) diff --git a/examples/plot_simpletest.py b/examples/plot_simpletest.py index 80f91b8..0b4bf83 100644 --- a/examples/plot_simpletest.py +++ b/examples/plot_simpletest.py @@ -15,6 +15,3 @@ plot.draw_circle(radius=8, x=120, y=120) display.show(plot) - -while True: - time.sleep(1) diff --git a/examples/scatter.py b/examples/scatter.py index 7bf7828..6f4c310 100644 --- a/examples/scatter.py +++ b/examples/scatter.py @@ -25,7 +25,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/shade_example.py b/examples/shade_example.py index b28722e..e69e2f5 100644 --- a/examples/shade_example.py +++ b/examples/shade_example.py @@ -100,5 +100,3 @@ def heat_index(temp, humidity): Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) display.show(plot) -while True: - time.sleep(1) diff --git a/examples/stackplot.py b/examples/stackplot.py index b6bc0d8..420e366 100644 --- a/examples/stackplot.py +++ b/examples/stackplot.py @@ -29,6 +29,3 @@ display.show(plot) - -while True: - time.sleep(1) diff --git a/examples/tickparameters.py b/examples/tickparameters.py index 2f51130..6fefa1b 100644 --- a/examples/tickparameters.py +++ b/examples/tickparameters.py @@ -34,7 +34,3 @@ # Plotting and showing the plot display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/uboxplot_example.py b/examples/uboxplot_example.py index 2fbc56c..c3d134d 100644 --- a/examples/uboxplot_example.py +++ b/examples/uboxplot_example.py @@ -6,7 +6,7 @@ """ import board -from examples.uboxplot_example import Boxplot +from boxplot import Boxplot from circuitpython_uplot.plot import Plot @@ -67,6 +67,3 @@ plot.append(my_box2) plot.append(my_box3) display.show(plot) - -while True: - pass From b23cdbe4764cf9576e7af0f77ddc82ae8853fc55 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 15:48:08 -0400 Subject: [PATCH 37/61] removing time from examples --- circuitpython_uplot/plot.py | 2 -- examples/bar_3Dbars.py | 1 - examples/bar_example.py | 1 - examples/bar_scale_example.py | 1 - examples/cartesian_advanced.py | 1 - examples/display_shapes.py | 1 - examples/fillbetween.py | 1 - examples/map.py | 1 - examples/pie_example.py | 1 - examples/plot_example.py | 1 - examples/plot_simpletest.py | 1 - examples/scatter.py | 1 - examples/shade_example.py | 1 - examples/stackplot.py | 1 - examples/tickparameters.py | 1 - 15 files changed, 16 deletions(-) diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 308ed7e..432f054 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -304,7 +304,6 @@ def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: else: ticksynorm = np.array(ticksy) - ticksxrenorm = np.array( self.transform( np.min(x), np.max(x), self._newxmin, self._newxmax, ticksxnorm @@ -312,7 +311,6 @@ def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: dtype=np.int16, ) - ticksyrenorm = np.array( self.transform( np.min(y), np.max(y), self._newymin, self._newymax, ticksynorm diff --git a/examples/bar_3Dbars.py b/examples/bar_3Dbars.py index e0ef584..03c1aeb 100644 --- a/examples/bar_3Dbars.py +++ b/examples/bar_3Dbars.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar diff --git a/examples/bar_example.py b/examples/bar_example.py index b1d48dc..3663323 100644 --- a/examples/bar_example.py +++ b/examples/bar_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from circuitpython_uplot.plot import Plot from circuitpython_uplot.bar import Bar diff --git a/examples/bar_scale_example.py b/examples/bar_scale_example.py index fe2ac9a..5d4e24f 100644 --- a/examples/bar_scale_example.py +++ b/examples/bar_scale_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board import displayio from circuitpython_uplot.plot import Plot diff --git a/examples/cartesian_advanced.py b/examples/cartesian_advanced.py index 92a7bfa..7a06741 100644 --- a/examples/cartesian_advanced.py +++ b/examples/cartesian_advanced.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/display_shapes.py b/examples/display_shapes.py index 8273bb6..18e2cee 100644 --- a/examples/display_shapes.py +++ b/examples/display_shapes.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect diff --git a/examples/fillbetween.py b/examples/fillbetween.py index 55e1a82..c1e7e30 100644 --- a/examples/fillbetween.py +++ b/examples/fillbetween.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/map.py b/examples/map.py index 6e5353d..ad08298 100644 --- a/examples/map.py +++ b/examples/map.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time from random import choice import board from ulab import numpy as np diff --git a/examples/pie_example.py b/examples/pie_example.py index 6484521..8c75a3b 100644 --- a/examples/pie_example.py +++ b/examples/pie_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from circuitpython_uplot.plot import Plot from circuitpython_uplot.pie import Pie diff --git a/examples/plot_example.py b/examples/plot_example.py index be13f56..9a6886a 100644 --- a/examples/plot_example.py +++ b/examples/plot_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/plot_simpletest.py b/examples/plot_simpletest.py index 0b4bf83..d7f2070 100644 --- a/examples/plot_simpletest.py +++ b/examples/plot_simpletest.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from circuitpython_uplot.plot import Plot diff --git a/examples/scatter.py b/examples/scatter.py index 6f4c310..5f5015d 100644 --- a/examples/scatter.py +++ b/examples/scatter.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time from random import choice import board from ulab import numpy as np diff --git a/examples/shade_example.py b/examples/shade_example.py index e69e2f5..61b6239 100644 --- a/examples/shade_example.py +++ b/examples/shade_example.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/stackplot.py b/examples/stackplot.py index 420e366..abc19b7 100644 --- a/examples/stackplot.py +++ b/examples/stackplot.py @@ -5,7 +5,6 @@ Example to show how to draw stackplots """ -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot diff --git a/examples/tickparameters.py b/examples/tickparameters.py index 6fefa1b..050c5d0 100644 --- a/examples/tickparameters.py +++ b/examples/tickparameters.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np from circuitpython_uplot.plot import Plot, color From 5433e69b66f971a3748175b358853a2b6334e9fe Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 19:31:17 -0400 Subject: [PATCH 38/61] update docs --- circuitpython_uplot/plot.py | 12 ++++++-- docs/boxes_types.png | Bin 0 -> 1281 bytes docs/grid_text.png | Bin 0 -> 4526 bytes docs/quick_start.rst | 60 ++++++++++++++++++++---------------- docs/ticks_params.png | Bin 0 -> 3164 bytes 5 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 docs/boxes_types.png create mode 100644 docs/grid_text.png create mode 100644 docs/ticks_params.png diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 432f054..6e256dd 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -26,7 +26,7 @@ # pylint: disable=attribute-defined-outside-init try: - from typing import Union, Tuple + from typing import Union, Tuple, Optional from typing_extensions import Literal except ImportError: pass @@ -171,6 +171,7 @@ def axs_params(self, axstype: Literal["box", "cartesian", "line"] = "box") -> No """ self._axesparams = axstype + self._update_plot() def _drawbox(self) -> None: """ @@ -179,6 +180,7 @@ def _drawbox(self) -> None: :return: None """ + self._plotbitmap.fill(0) if self._axesparams == "cartesian": draw_box = [True, True, False, False] @@ -475,7 +477,7 @@ def _draw_gridy(self, ticks_data: list[int]) -> None: ) start = start + self._grid_espace + self._grid_lenght - def update_plot(self) -> None: + def _update_plot(self) -> None: """ Function to update graph @@ -491,7 +493,7 @@ def show_text( x: int, y: int, anchorpoint: Tuple = (0.5, 0.0), - text_color: int = 0xFFFFFF, + text_color: Optional[int] = None, free_text: bool = False, ) -> None: """ @@ -511,6 +513,10 @@ def show_text( from adafruit_display_text import bitmap_label self.bitmap_label = bitmap_label + + if text_color is None: + text_color = self._plot_palette[2] + if self._showtext or free_text: text_toplot = self.bitmap_label.Label( terminalio.FONT, text=text, x=x, y=y, color=text_color diff --git a/docs/boxes_types.png b/docs/boxes_types.png new file mode 100644 index 0000000000000000000000000000000000000000..73e5e66910fab786b3ab2ec9c4032207f5356b22 GIT binary patch literal 1281 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%FW_JUl2?B3_XScc#ZI0f96(URk9b?p^N3AW_;*_Q6BLM&ApKXvmPd=1xpx|@MP z|Ev05CI$l~Mz#h9C~gRTd-SEz-YQ#(13ydRw%#e38K%$uVdW}Dz0|)4g{~C@v461N zzJO7|pOE@OLNEzL~pOcb4AVxq6jpc=VH;oAO(0t-gPG z@%MH1y~lg?F3;L{%c%JD)@!T38q3{uGyZS+?cQFRyc&u=J`UqAO|AxFVwlh5C;ZCd)rF8NFSt3K7z2Rr63 z{>^@L+PaErd6PTI(%Jiq?=-(N-1_a~wVAeN+ZW_l@e33mHV&-|dtLs~?%JFEvveCH zt8Qe!JsEYr@%8hyZ;qI)+xzrf`pdh=(;l1>{g4&i?v~U4Qg&V4^%>Rn+n?`EuV}HH z^_Z(->)Q19#qV1=KL6fvfBV+-pzaPXmUXbMC)=UYhsU$BQyZ%#OamAfRvnfj@{d#?DFn UJyY@{uuNm{boFyt=akR{0PlzC&Hw-a literal 0 HcmV?d00001 diff --git a/docs/grid_text.png b/docs/grid_text.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad9cd73de8d3c51d40b6bf3ea794da74ccc53cb GIT binary patch literal 4526 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 GrThzb39sn@ literal 0 HcmV?d00001 diff --git a/docs/quick_start.rst b/docs/quick_start.rst index f58ebc8..066f14e 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -1,53 +1,53 @@ -A small tour for microplot. +A small tour explaining microplot. Plot Usage ============= -We start importing some fundamental libraries for plot to operate +We start by importing some fundamental libraries for the plot library to operate .. code-block:: python import board - import displayio from circuitpython_uplot.plot import Plot -For reference, screen in CircuitPython are defined from left to right and up to bottom. This means -that our (x=0, y=0) will be in the left upper corner of the screen. -For boards or feather with a integrated screen the following statement will initiate the scree +For reference, screens in CircuitPython are defined from left to right and top to bottom. This means +that our (x=0, y=0) coordinates would be in the left upper corner of the screen. +For boards or feathers with an integrated screen the following statement will initiate the screen .. code-block:: python display = board.DISPLAY -For other displays please consult the right support library +For other displays please consult their support library -We add the plot area. in this case we are selecting the whole screen as our plot area +After this, we are ready to add the plot area. The following code will create a plot area that will cover the whole screen. +However you can select any area of the screen. .. code-block:: python plot = Plot(0, 0, display.width, display.height) -The Plot will be used to display our graphics. The position and the size of the plot area +The plot object will be used to display our graphics. The position and the size of the plot area could vary. This allows us to have more than 1 plot at the same time in the screen. -Every one of them with different characteristics or graphs. +Each one of them can have different characteristics or graphs according to your needs. -Options available are: +Options available to customize the plot area are: * width: width of the plot area * height: height of the plot area - * backround_color: Allows to change the background color. The default is black. - * box_color: Allows to change the box color. Default is white. + * background_color: allows you to change the background color. The default is black. + * box_color: allows you to change the box color. This default is white. * padding: allows the user to give the plot area a pad. This is helpful if you are planning to include text and legends in the axes. - * scale: scale of the plot. This will allow a plot to be scaled up at a user defined rate. This is currently only available for logging and bar plots. + * scale: scale of the plot. This will allow a plot to be scaled up at a user defined rate. This is only available for logging and bar plots. -We tell the microcontroller to display our plot: +We then tell the microcontroller to display our plot: .. code-block:: python display.show(plot) -And that is it you know have a plot area to add amazing graphs! +And this is how to build a plot area to add amazing graphs! .. image:: ../docs/readme.png @@ -57,7 +57,7 @@ Good Luck! Graphics =========== -At the moment the following objects can be added to the plot area: +The following objects can be added to the plot area: * Elements in the library * Cartesian Plane @@ -67,14 +67,14 @@ At the moment the following objects can be added to the plot area: * Pie Chart * Colormap * Polar graph - * SVG Rudimentary support + * SVG (Rudimentary support) * Logging graph * Display_shapes library objects * Histograms from the uhistogram library * Boxplots from the uboxplot library * Individual Vectorio Objects -In a more advanced method it is possible to add directly to the plot area using the plot bitmap object +It is possible to add directly to the plot area using the plot bitmap object as shown below The following code shows an example adding a shape from the Adafruit_Display_shapes library @@ -99,9 +99,9 @@ Ticks and Grid Plot axes are shown by default. To change this behaviour you would need to use the correct keyword in the `Plot.axs_params` function: -.. py:function:: Plot.axs_params(axstype: Literal["box", "cartesian", "line"] = "box") +.. py:function:: Plot.axs_params(axstype = "box") - :param axstype: Option to display the axes + :param axstype: Option to display the axes. Defaults to "box" Options available are: * box : draws a box @@ -115,8 +115,10 @@ The following snippet shows how to create a cartesian plot plot = Plot(0, 0, display.width, display.height) plot.axs_params(axstype="cartesian") -Tick spacing and numbers are selected by default. However it's possible to customize -the following parameters: +.. image:: ../docs/boxes_types.png + +Tick spacing and numbers are selected and calculated by default. In Cartesian and Logging Plots you can select the ticks to +show in the plot. For other plots, it is possible to customize the following parameters: .. py:function:: Plot.tick_params(showtick, tickx_height, ticky_height, tickcolor, tickgrid, showtext, decimal_points) @@ -131,7 +133,11 @@ the following parameters: .. code-block:: python - plot.tick_params(tickx_height=12, tickcolor=0xFF0008) + plot.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x000000) + +.. image:: ../docs/ticks_params.png + +Be aware that ticks are not shown by default. If you want to show them you need to add a graph to the plot. Gridlines are normally ``OFF``. If you want visible gridlines then use: @@ -141,19 +147,19 @@ Gridlines are normally ``OFF``. If you want visible gridlines then use: plot.tick_params(tickgrid=True) -If you want to show the axes text. You can use: +If you want to show the axes text, you can use: .. code-block:: python plot.tick_params(showtext=True) -If you want to show some decimal places in the text. use: +If you want to show some decimal places in the text use: .. code-block:: python plot.tick_params(decimal_points=2) - +.. image:: ../docs/grid_text.png Colors =============== diff --git a/docs/ticks_params.png b/docs/ticks_params.png new file mode 100644 index 0000000000000000000000000000000000000000..1d93a9e65d86f2ddfdef52e5764524a623686942 GIT binary patch literal 3164 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 Mhx_&tM^3`u0nm3>ZU6uP literal 0 HcmV?d00001 From 884cdbb98383a5b2439073f20501c49c0bb555db Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 19:32:07 -0400 Subject: [PATCH 39/61] improving docs --- docs/quick_start.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 066f14e..34841ef 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -22,7 +22,7 @@ For boards or feathers with an integrated screen the following statement will in For other displays please consult their support library After this, we are ready to add the plot area. The following code will create a plot area that will cover the whole screen. -However you can select any area of the screen. +However you can select any area of the screen. .. code-block:: python From 33b8d5f6a0d097729837217b46a9af9ec8a0f60e Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 20:07:09 -0400 Subject: [PATCH 40/61] upd --- .pylintrc | 2 +- circuitpython_uplot/plot.py | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.pylintrc b/.pylintrc index 52e7b37..f9deda4 100644 --- a/.pylintrc +++ b/.pylintrc @@ -14,7 +14,7 @@ unsafe-load-any-extension=no [MESSAGES CONTROL] confidence= -disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code +disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code,import-outside-toplevel,attribute-defined-outside-init enable= [REPORTS] diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 6e256dd..0383133 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -21,10 +21,6 @@ """ -# pylint: disable=too-many-statements, unused-import, no-member -# pylint: disable=unused-import, import-outside-toplevel, undefined-variable -# pylint: disable=attribute-defined-outside-init - try: from typing import Union, Tuple, Optional from typing_extensions import Literal @@ -96,6 +92,7 @@ def __init__( super().__init__(x=x, y=y, scale=scale) self._axesparams = "box" + self._decimal_points = None self._width = width self._height = height @@ -278,6 +275,8 @@ def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: :param int x: x coord :param int y: y coord + :param list[int] ticksx: x ticks data. Defaults to None + :param list[int] ticksy: y ticks data. Defaults to None :return:None @@ -495,6 +494,7 @@ def show_text( anchorpoint: Tuple = (0.5, 0.0), text_color: Optional[int] = None, free_text: bool = False, + font=None, ) -> None: """ @@ -503,10 +503,13 @@ def show_text( :param int x: x coordinate :param int y: y coordinate :param Tuple anchorpoint: Display_text anchor point. Defaults to (0.5, 0.0) - :param int color: text color. Defaults to :const:`0xFFFFFF` + :param int color: text color. Defaults to None :param bool free_text: Select to show free text + :param font: font to be used. Defaults to None :return: None """ + if font is None: + font = terminalio.FONT try: self.bitmap_label except AttributeError: @@ -519,15 +522,19 @@ def show_text( if self._showtext or free_text: text_toplot = self.bitmap_label.Label( - terminalio.FONT, text=text, x=x, y=y, color=text_color + font, text=text, x=x, y=y, color=text_color ) text_toplot.anchor_point = anchorpoint text_toplot.anchored_position = (x, y) self.append(text_toplot) -# pylint: disable=missing-class-docstring, too-few-public-methods, invalid-name +# pylint: disable=too-few-public-methods, invalid-name class color: + """ + Class to define colors in HEX + """ + WHITE = 0xFFFFFF BLACK = 0x000000 RED = 0xFF0000 From c52f1546bfa1a0c1d36a561823a00eb4d4f26c07 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 20:44:51 -0400 Subject: [PATCH 41/61] adding pic --- docs/colors.png | Bin 0 -> 3770 bytes docs/quick_start.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/colors.png diff --git a/docs/colors.png b/docs/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e9a0aaeb1a8bfe863b4cfa819c7f37545092cb GIT binary patch literal 3770 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 HdNluE+Modv literal 0 HcmV?d00001 diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 34841ef..79c81ce 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -185,12 +185,12 @@ This will allow you to use the colors in the list as color variable definitions plot = Plot(0, 0, display.width, display.height, background_color=color.WHITE, box_color=color.BLACK) - +.. image:: ../docs/colors.png =========== Cartesian =========== -With the cartesian class it's possible to add (x,y) plots. You can add different (x,y) plots to the +With the cartesian class is possible to add (x,y) plots. You can add different (x,y) plots to the same plot area. After you create your plot area you will need to define the xy plane for the plot. Secondly, you will need to give some ``x`` and ``y`` data. This data will be converted to a `ulab.numpy.ndarray`. For more information please refer From 14296fcf08b5e110dcebab22301a27d6b432ca8b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Tue, 1 Aug 2023 23:35:09 -0400 Subject: [PATCH 42/61] upd --- circuitpython_uplot/plot.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 0383133..625593c 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -78,13 +78,13 @@ def __init__( height = 100 if x + width > 481: print( - "Modify this settings. Some of the graphics will not shown int the screen" + "Modify this setting. Some of the graphics will not shown int the screen" ) print("Defaulting to x=0") x = 0 if y + height > 321: print( - "Modify this settings. Some of the graphics will not shown int the screen" + "Modify this setting. Some of the graphics will not shown int the screen" ) print("Defaulting to y=0") y = 0 @@ -162,7 +162,7 @@ def axs_params(self, axstype: Literal["box", "cartesian", "line"] = "box") -> No """ Setting up axs visibility - :param axstype: argument with the kind of axs you selected + :param str axstype: argument with the kind of axs you selected :return: None @@ -230,7 +230,8 @@ def _drawbox(self) -> None: def draw_circle(self, radius: int = 5, x: int = 100, y: int = 100) -> None: """ - Draw a circle in the plot area + Draw a circle in the plot area. This function is kept here for + historical reasons. Please use :meth:`scatter` instead. :param int radius: circle radius :param int x: circles center x coordinate position in pixels, Defaults to 100. From e633c2930240cbc593dc937517704e358712f9b0 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Wed, 2 Aug 2023 10:44:58 -0400 Subject: [PATCH 43/61] updating docs --- circuitpython_uplot/cartesian.py | 20 +-- docs/cartesian_fill.jpg | Bin 0 -> 16990 bytes docs/examples.rst | 262 +++++++++++++++++++------------ docs/quick_start.rst | 59 +++++-- examples/cartesian_fill.py | 34 ++++ 5 files changed, 255 insertions(+), 120 deletions(-) create mode 100644 docs/cartesian_fill.jpg create mode 100644 examples/cartesian_fill.py diff --git a/circuitpython_uplot/cartesian.py b/circuitpython_uplot/cartesian.py index 2d194ab..fda8da6 100644 --- a/circuitpython_uplot/cartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -42,7 +42,6 @@ def __init__( line_style: Optional[str] = None, ticksx: Union[np.array, list] = None, ticksy: Union[np.array, list] = None, - tick_pos: bool = False, fill: bool = False, nudge: bool = True, logging: bool = False, @@ -58,7 +57,6 @@ def __init__( :param str|None line_style: line style. Defaults to None :param np.array|list ticksx: X axis ticks values :param np.array|list ticksy: Y axis ticks values - :param bool tick_pos: indicates ticks position. True for below the axes. :param bool fill: Show the filling. Defaults to `False` :param bool nudge: moves the graph a little for better displaying. Defaults to `True` :param bool logging: used to change the logic of the cartesian to work as a logger @@ -68,13 +66,6 @@ def __init__( self.ticksx = ticksx self.ticksy = ticksy - if tick_pos: - self._tickposx = plot._tickheightx - self._tickposy = plot._tickheighty - else: - self._tickposx = 0 - self._tickposy = 0 - if line_color is not None: plot._plot_palette[plot._index_colorused] = line_color @@ -193,3 +184,14 @@ def _plot_line(plot, index, xnorm, ynorm): ynorm[index + 1], plot._index_colorused, ) + + +class LineStyle: + """ + Line style class + """ + + SOLID = "-" + DASHED = "- -" + DASH_DOT = "-.-" + DOTTED = "." diff --git a/docs/cartesian_fill.jpg b/docs/cartesian_fill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..787e698856628d1e764f55d7a17e77dde50dee99 GIT binary patch literal 16990 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

iu0u(>>K!2sbPJs%jq!4Hmv2^t`>JBJ|XW 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 literal 0 HcmV?d00001 diff --git a/docs/examples.rst b/docs/examples.rst index c798b29..912444b 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,3 +1,7 @@ +================= +Plot Examples +================= + Simple test ------------ @@ -31,16 +35,6 @@ Setting up the ticks parameters .. image:: ../docs/tickparameters.jpg -Plot Line Style Example ---------------------------- - -Plot some data for x and y with different line styles - -.. literalinclude:: ../examples/plot_line_styles.py - :caption: examples/plot_line_styles.py - :lines: 5- -.. image:: ../docs/line_style.jpg - Integration Example ------------------- @@ -51,6 +45,10 @@ Example showing different graphics elements integration :lines: 5- .. image:: ../docs/integration_example.jpg +================== +Scatter examples +================== + Scatter Example ------------------- @@ -91,6 +89,9 @@ Example showing how to use different datasets :lines: 5- .. image:: ../docs/scatter_using_different_datasets.jpg +================== +Cartesian examples +================== Cartesian and Scatter Example ------------------------------ @@ -102,16 +103,92 @@ Example showing how to use cartesian and scatter in the same plot :lines: 5- .. image:: ../docs/cartesian_scatter_polyfit.jpg +Plot Line Style Example +--------------------------- + +Plot some data for x and y with different line styles -Display_shapes Example ------------------------ +.. literalinclude:: ../examples/plot_line_styles.py + :caption: examples/plot_line_styles.py + :lines: 5- +.. image:: ../docs/line_style.jpg -Display Shapes integration example +Cartesian fill Example +--------------------------- -.. literalinclude:: ../examples/display_shapes.py - :caption: examples/display_shapes.py +Cartesian fill example + +.. literalinclude:: ../examples/cartesian_fill.py + :caption: examples/cartesian_fill.py :lines: 5- -.. image:: ../docs/display_shapes.jpg +.. image:: ../docs/cartesian_fill.jpg + +Cartesian Advanced Example +--------------------------- + +Showing the ability to display to graphs in the same plot with different colors + +.. literalinclude:: ../examples/cartesian_advanced.py + :caption: examples/cartesian_advanced.py + :lines: 5- +.. image:: ../docs/cartesian_advance.jpg + +Cartesian Table Example +--------------------------- + +Example showing how to add a data table to the plot + +.. literalinclude:: ../examples/cartesian_table.py + :caption: examples/cartesian_table.py + :lines: 5- + +Lissajous Curves Example +--------------------------- + +Example showing how to draw lissajous curves + +.. literalinclude:: ../examples/lissajous_curves.py + :caption: examples/lissajous_curves.py + :lines: 5- +.. image:: ../docs/lissajous.jpg + +Cartesian Polar Plots Example +-------------------------------- + +Example showing how to draw polar plots using Cartesian + +.. literalinclude:: ../examples/polar_plots.py + :caption: examples/polar_plots.py + :lines: 5- +.. image:: ../docs/polar_plots.jpg + +Cartesian Trigonometric Plots Example +-------------------------------------- + +Example showing how to draw Trigonometrics plots using Cartesian + +.. literalinclude:: ../examples/cartesian_trig_functions.py + :caption: examples/cartesian_trig_functions.py + :lines: 5- +.. image:: ../docs/cartesian_trig_functions.jpg + + +Cartesian Animation Example +--------------------------- + +Cartesian animation example + +.. literalinclude:: ../examples/cartesian_logging_data.py + :caption: examples/cartesian_logging_data.py + :lines: 5- +.. image:: ../docs/cartesian_logging_data.gif + + + + +================== +Bar Examples +================== Bar Example ---------------- @@ -174,6 +251,10 @@ Bar 3D example :lines: 5- .. image:: ../docs/3DBars.jpg +================ +Pie Examples +================ + Pie Example ---------------- @@ -184,54 +265,9 @@ Pie example :lines: 5- .. image:: ../docs/pie.jpg -Cartesian Advanced Example ---------------------------- - -Showing the ability to display to graphs in the same plot with different colors - -.. literalinclude:: ../examples/cartesian_advanced.py - :caption: examples/cartesian_advanced.py - :lines: 5- -.. image:: ../docs/cartesian_advance.jpg - -Cartesian Table Example ---------------------------- - -Example showing how to add a data table to the plot - -.. literalinclude:: ../examples/cartesian_table.py - :caption: examples/cartesian_table.py - :lines: 5- - -Lissajous Curves Example ---------------------------- - -Example showing how to draw lissajous curves - -.. literalinclude:: ../examples/lissajous_curves.py - :caption: examples/lissajous_curves.py - :lines: 5- -.. image:: ../docs/lissajous.jpg - -Cartesian Polar Plots Example --------------------------------- - -Example showing how to draw polar plots using Cartesian - -.. literalinclude:: ../examples/polar_plots.py - :caption: examples/polar_plots.py - :lines: 5- -.. image:: ../docs/polar_plots.jpg - -Cartesian Trigonometric Plots Example --------------------------------------- - -Example showing how to draw Trigonometrics plots using Cartesian - -.. literalinclude:: ../examples/cartesian_trig_functions.py - :caption: examples/cartesian_trig_functions.py - :lines: 5- -.. image:: ../docs/cartesian_trig_functions.jpg +=================== +Stackplot Examples +=================== Stackplot Example --------------------------- @@ -243,15 +279,9 @@ Stackplot simple example :lines: 8- .. image:: ../docs/stackplot_example.jpg -Advanced Example ---------------------------- - -plot different ulements in a single display - -.. literalinclude:: ../examples/readme_example.py - :caption: examples/readme_example.py - :lines: 5- -.. image:: ../docs/readme.png +==================== +Fillbetween Examples +==================== Fillbetween Example --------------------------- @@ -263,15 +293,9 @@ Example of fillbetween plot :lines: 5- .. image:: ../docs/fillbetween_example.jpg -Uboxplot Example ---------------------------- - -example of uboxplot integration in a plot - -.. literalinclude:: ../examples/uboxplot_example.py - :caption: examples/uboxplot_example.py - :lines: 8- -.. image:: ../docs/uboxplot_example.jpg +==================== +Map Examples +==================== Map Example --------------------------- @@ -283,24 +307,10 @@ map simple example :lines: 5- .. image:: ../docs/map.jpg -Sparkline Animation Example ---------------------------- -Sparkline animation example - -.. literalinclude:: ../examples/sparkline.py - :caption: examples/sparkline.py - :lines: 5- - -Cartesian Animation Example ---------------------------- - -Cartesian animation example - -.. literalinclude:: ../examples/cartesian_logging_data.py - :caption: examples/cartesian_logging_data.py - :lines: 5- -.. image:: ../docs/cartesian_logging_data.gif +==================== +Logging Examples +==================== Logging Example --------------------------- @@ -361,6 +371,10 @@ This example shows how to add limits to our plot :lines: 5- .. image:: ../docs/logging_limits.jpg +==================== +SVG Examples +==================== + SVG Images examples --------------------------- @@ -371,6 +385,10 @@ SVG Images example :lines: 5- .. image:: ../docs/svg.jpg +==================== +Shade Examples +==================== + Shade examples --------------------------- @@ -381,6 +399,10 @@ Shade example :lines: 5- .. image:: ../docs/shade.jpg +==================== +Polar Plot Examples +==================== + Polar example --------------------------- @@ -400,3 +422,45 @@ Polar Advanced example :caption: examples/polar_advanced.py :lines: 5- .. image:: ../docs/polar_advanced.jpg + +================== +Others +================== +Sparkline Animation Example +--------------------------- + +Sparkline animation example + +.. literalinclude:: ../examples/sparkline.py + :caption: examples/sparkline.py + :lines: 5- + +Display_shapes Example +----------------------- + +Display Shapes integration example + +.. literalinclude:: ../examples/display_shapes.py + :caption: examples/display_shapes.py + :lines: 5- +.. image:: ../docs/display_shapes.jpg + +Advanced Example +--------------------------- + +plot different ulements in a single display + +.. literalinclude:: ../examples/readme_example.py + :caption: examples/readme_example.py + :lines: 5- +.. image:: ../docs/readme.png + +Uboxplot Example +--------------------------- + +example of uboxplot integration in a plot + +.. literalinclude:: ../examples/uboxplot_example.py + :caption: examples/uboxplot_example.py + :lines: 8- +.. image:: ../docs/uboxplot_example.jpg diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 79c81ce..84bbb9c 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -190,23 +190,21 @@ This will allow you to use the colors in the list as color variable definitions =========== Cartesian =========== -With the cartesian class is possible to add (x,y) plots. You can add different (x,y) plots to the -same plot area. After you create your plot area you will need to define the xy plane -for the plot. Secondly, you will need to give some ``x`` and ``y`` data. -This data will be converted to a `ulab.numpy.ndarray`. For more information please refer -to the `ulab` library +With the cartesian class is possible to add (x,y) plots. You add it to the plot area created as explained +above. Then you will need to give some ``x`` and ``y`` data. The following code + .. code-block:: python from ulab import numpy as np from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian + display = board.DISPLAY plot = Plot(0, 0, display.width, display.height) - x = np.linspace(-4, 4, num=25) - constant = 1.0 / np.sqrt(2 * np.pi) - y = constant * np.exp((-(x**2)) / 2.0) + x = [0, 1, 2, 3] + y = [0, 2, 4, 6] After the initial setup we add our xy plane and show our plot @@ -215,10 +213,13 @@ After the initial setup we add our xy plane and show our plot Cartesian(plot, x, y) display.show(plot) +You can add more than one graph to the same plot. Howver, you need to define the range of the graph as the two +graphs will share the same axes. There are some parameters that you can customize: - * rangex and rangey: you could specify the ranges of your graph. Allowing you to move your graph according to your needs. This parameters only accept lists - * line color: you could specify the color in HEX + * rangex and rangey: you could specify the ranges of your graph. Allowing you to move your graph according to your needs. This parameters only accept lists. This is needed for plotting more than one curve in the plot area. + * line color: you could specify the color in HEX. Or you could use the color class as explained above. + * line style: you could specify the line style. The default is a solid line. see below for more details * fill: if you selected this as `True` the area under your graph will be filled * nudge: this parameter allows yuo to move a little bit the graph. This is useful when the data start/end in the limits of your range @@ -242,10 +243,44 @@ if you want to add more than un line to your plot, you could do something like t x = np.linspace(-4, 4, num=25) y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x - Cartesian(plot, x, y1) - Cartesian(plot, x, y1) + Cartesian(plot, x, y1, rangex=[-5, 5], rangey=[0, 1]) + Cartesian(plot, x, y2, rangex=[-5, 5], rangey=[0, 1]) display.show(plot) +if you need to override the ticks automatic rendering, you can use the following code: + +.. code-block:: python + + plot = Plot(0, 0, display.width, display.height) + x = np.linspace(-4, 4, num=25) + y1 = x**2 / 2 + Cartesian(plot, x, y1, ticksx=[-4, -2, 0, 2, 4], ticksy=[0, 5, 10, 15, 20]) + + display.show(plot) + +If you are adding more than one curve to the plot ticks will be defined for all curves. +And needs to be defined in the first cartesian graph added to the plot. + +Line styles +============ +You can select the line style of your Cartesian graph. The following line styles are available: + * LineStyle.SOLID + * LineStyle.DOTTED + * LineStyle.DASHED + * LineStyle.DASH_DOT + +This can be done by importing the color class, from the cartesian library: + +.. code-block:: python + + from circuitpython_uplot.plot import LineStyle + +You could select a dotted line by using the following code: ``line_style=LineStyle.DOTTED``. + +.. code-block:: python + + Cartesian(plot, x, y, line_style=LineStyle.DOTTED) + =============== Pie Chart diff --git a/examples/cartesian_fill.py b/examples/cartesian_fill.py new file mode 100644 index 0000000..aa6716e --- /dev/null +++ b/examples/cartesian_fill.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width - 125, display.height, padding=25) + +display.show(plot) + +# Creating the values +x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) +y = np.array([3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46]) + +# Polyfit Curve third degree +z = np.polyfit(x, y, 3) +new_x = np.linspace(0, 15, 50) +fit = z[0] * new_x**3 + z[1] * new_x**2 + z[2] * new_x + z[3] +Cartesian( + plot, + new_x, + fit, + rangex=[0, 15], + rangey=[0, 70], + fill=True, +) From b3340d18e57bfe947bcee04671b7b746a7469551 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Wed, 2 Aug 2023 13:25:53 -0400 Subject: [PATCH 44/61] updating docs --- circuitpython_uplot/scatter.py | 11 ++++ docs/quick_start.rst | 63 +++++++++++++++----- examples/scatter_pointers.py | 8 +-- examples/scatter_using_different_datasets.py | 4 +- 4 files changed, 65 insertions(+), 21 deletions(-) diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py index 2b9c1fd..220d755 100644 --- a/circuitpython_uplot/scatter.py +++ b/circuitpython_uplot/scatter.py @@ -173,3 +173,14 @@ def _draw_pointer(self, plot: Plot) -> None: y=self._ynorm[i], ) ) + + +class Pointer: + """ + Pointer container class + """ + + CIRCLE = "circle" + TRIANGLE = "triangle" + SQUARE = "square" + DIAMOND = "diamond" diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 84bbb9c..deb80e6 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -273,9 +273,9 @@ This can be done by importing the color class, from the cartesian library: .. code-block:: python - from circuitpython_uplot.plot import LineStyle + from circuitpython_uplot.cartesian import LineStyle -You could select a dotted line by using the following code: ``line_style=LineStyle.DOTTED``. +You can select a dotted line by using the following code: ``line_style=LineStyle.DOTTED``. .. code-block:: python @@ -328,7 +328,8 @@ Creates a scatter plot with x,y data. You can customize the circle diameter if y There are some parameters that you can customize: * rangex and rangey: you can specify the ranges of your graph. This allows you to move your graph according to your needs. This parameters only accept lists * radius: circles radius/radii. If a different value is given for each point, the radius should be a list of values. If selected pointer is not a circle, this parameter will be ignored - * pointer_color: you can specify the color in HEX + * pointer_color: you can specify the color in HEX. Or you could use the color class as explained above. + * pointer: you can select the pointer shape. The default is a circle. See below for more details * nudge: this parameter allows you to move the graph slighty. This is useful when the data start/end in the limits of your range @@ -340,12 +341,33 @@ There are some parameters that you can customize: b = [choice(a) for _ in a] Scatter(plot, a, b, rangex=[0,210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3) + +Pointer styles +============== +You can select the pointer style of your Scatter graph. The following pointer styles are available: + * Pointer.CIRCLE + * Pointer.SQUARE + * Pointer.TRIANGLE + * Pointer.DIAMOND + +This can be done by importing the color class, from the cartesian library: + +.. code-block:: python + + from circuitpython_uplot.scatter import Pointer + +You can select a square pointer using the following code: ``pointer=Pointer.SQUARE``. + +.. code-block:: python + + Scatter(plot, a, b, pointer=Pointer.SQUARE) + =============== Bar Plot =============== Allows you to graph bar plots. You just need to give the values of the bar in a python list. -You can choose to create shell or filled bars. +You can choose to create shell or filled bars or 3D projected bars. .. code-block:: python @@ -362,21 +384,21 @@ You can choose to create shell or filled bars. Bar(plot, a, b) -You can select the color or and if the bars are filled +You can select the color or/and if the bars are filled .. code-block:: python - Bar(plot, a, b, 0xFF1000, True) + Bar(plot, a, b, color=0xFF1000, fill=True) You can also select the bar spacing and the xstart position: .. code-block:: python - Bar(plot, a, b, 0xFF1000, fill=True, bar_space=30, xstart=70) + Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70) For bar filled graphs you can pass a color_palette list. This will allow you to select the color of each bar -This will not work for shell bars sadly. +This will not work for shell bars. .. code-block:: python @@ -389,7 +411,7 @@ This will not work for shell bars sadly. Bar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) -with the projection argument you can show the bars with projection. This will give them a 3D +With the projection argument you can show the bars with projection. This will give them a 3D appearance .. code-block:: python @@ -407,7 +429,7 @@ appearance Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) -For filled unprojected bars you can update their values. This is useful for data logging. +For filled unprojected bars you can update their values in real time. This is useful for data logging. The max_value argument will allow you to set the maximum value of the graph. The plot will scale according to this max value, and bar plot will update their values accordingly @@ -425,7 +447,7 @@ according to this max value, and bar plot will update their values accordingly b = [3, 5, 1, 7] my_bar = Bar(plot, a, b, color=0xFF1000, fill=True, color_palette=[0xFF1000, 0x00FF00, 0xFFFF00, 0x123456], max_value=10) -Then you can update the values of the bar plot: +Then you can update the values of the bar plot in a loop: .. code-block:: python @@ -439,15 +461,12 @@ code will change all the bar's color to red my_bar.update_colors(0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000) -If you prefer, you can change the color of a single bar using the following code: +If you prefer, you can change the color of a single bar using the code below that will change the first bar to Blue.: .. code-block:: python my_bar.update_bar_color(0, 0x0000FF) -This will change the first bar to Blue. - - =============== Fillbetween @@ -567,3 +586,17 @@ For example, if you want to load the Temperature icon with a scale of 2 plot = Plot(0, 0, display.width, display.height) SVG(plot, Temperature, 250, 50, 2) display.show(plot) + +=============== +SHADE +=============== +Shade is a small module to add a shaded area to the plot. This is useful to highlight a specific area in the plot. +By itself will only fill rectangular areas in the plot area. However, it can be used in conjunction with other modules to create +more complex plots. Refer to the examples for more details. + +===================== +Polar Plot +===================== + +Allows to plot polar graphs. You just need to give the values of the graph in a python list. +See the examples folder for more information. diff --git a/examples/scatter_pointers.py b/examples/scatter_pointers.py index d7690c6..2ed621b 100644 --- a/examples/scatter_pointers.py +++ b/examples/scatter_pointers.py @@ -8,7 +8,7 @@ import board from ulab import numpy as np from circuitpython_uplot.plot import Plot -from circuitpython_uplot.scatter import Scatter +from circuitpython_uplot.scatter import Scatter, Pointer # Setting up the display @@ -34,6 +34,6 @@ a = np.linspace(1, 100) b = [choice(a) for _ in a] Scatter(plot, a, b) -Scatter(plot2, a, b, pointer="triangle", pointer_color=0x00FF00) -Scatter(plot3, a, b, pointer="square", pointer_color=0xFFFFFF) -Scatter(plot4, a, b, pointer="diamond", pointer_color=0xFF32FF) +Scatter(plot2, a, b, pointer=Pointer.TRIANGLE, pointer_color=0x00FF00) +Scatter(plot3, a, b, pointer=Pointer.SQUARE, pointer_color=0xFFFFFF) +Scatter(plot4, a, b, pointer=Pointer.DIAMOND, pointer_color=0xFF32FF) diff --git a/examples/scatter_using_different_datasets.py b/examples/scatter_using_different_datasets.py index 14f624a..cf7dfea 100644 --- a/examples/scatter_using_different_datasets.py +++ b/examples/scatter_using_different_datasets.py @@ -6,7 +6,7 @@ import board from ulab import numpy as np from circuitpython_uplot.plot import Plot -from circuitpython_uplot.scatter import Scatter +from circuitpython_uplot.scatter import Scatter, Pointer # Setting up the display @@ -52,6 +52,6 @@ b, rangex=[0, 210], rangey=[0, 210], - pointer="triangle", + pointer=Pointer.TRIANGLE, pointer_color=0x00FFFF, ) From f94c26fa496fcf2e40868169e960bd571ac39024 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 4 Aug 2023 08:23:18 -0400 Subject: [PATCH 45/61] adding koch example --- .gitignore | 1 + circuitpython_uplot/plot.py | 11 +++++-- docs/examples.rst | 8 +++++ docs/koch.jpg | Bin 0 -> 20533 bytes docs/quick_start.rst | 24 +++++++++----- examples/cartesian_koch.py | 63 ++++++++++++++++++++++++++++++++++++ 6 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 docs/koch.jpg create mode 100644 examples/cartesian_koch.py diff --git a/.gitignore b/.gitignore index 929fe03..52ca3dd 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ _build .vscode *~ mpy-cross +.ipynb_checkpoints diff --git a/circuitpython_uplot/plot.py b/circuitpython_uplot/plot.py index 625593c..7a63109 100644 --- a/circuitpython_uplot/plot.py +++ b/circuitpython_uplot/plot.py @@ -346,7 +346,7 @@ def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: self.show_text( "{:.{}f}".format(ticksxnorm[i], self._decimal_points), tick, - self._newymin, + self._newymin + 5, (0.5, 0.0), ) for i, tick in enumerate(ticksyrenorm): @@ -361,7 +361,7 @@ def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: if self._showtext: self.show_text( "{:.{}f}".format(ticksynorm[i], self._decimal_points), - self._newxmin, + self._newxmin - 5, tick, (1.0, 0.5), ) @@ -546,3 +546,10 @@ class color: ORANGE = 0xFF9933 TEAL = 0x158FAD GRAY = 0x808080 + PINK = 0xFF40C0 + LIGHT_GRAY = 0xAAAAAA + BROWN = 0xCA801D + DARK_GREEN = 0x008700 + TURQUOISE = 0x00C0C0 + DARK_BLUE = 0x0000AA + DARK_RED = 0x800000 diff --git a/docs/examples.rst b/docs/examples.rst index 912444b..a2b84c1 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -184,7 +184,15 @@ Cartesian animation example .. image:: ../docs/cartesian_logging_data.gif +Cartesian Koch Snowflake +--------------------------- + +Cartesian koch snowflake example +.. literalinclude:: ../examples/cartesian_koch.py + :caption: examples/cartesian_koch.py + :lines: 5- +.. image:: ../docs/koch.jpg ================== Bar Examples diff --git a/docs/koch.jpg b/docs/koch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24bc8d84d1f6bdf62ca1fbe008ab8ae0b4e54c6e GIT binary patch literal 20533 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 YXx@I{ku6P}*4ysqO}q6kf9L<303hv3Q~&?~ literal 0 HcmV?d00001 diff --git a/docs/quick_start.rst b/docs/quick_start.rst index deb80e6..5d19461 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -180,6 +180,14 @@ This will allow you to use the colors in the list as color variable definitions * ORANGE * TEAL * GRAY + * PINK + * LIGHT_GRAY + * BROWN + * DARK_GREEN + * TURQUOISE + * DARK_BLUE + * DARK_RED + .. code-block:: python @@ -264,10 +272,10 @@ And needs to be defined in the first cartesian graph added to the plot. Line styles ============ You can select the line style of your Cartesian graph. The following line styles are available: - * LineStyle.SOLID - * LineStyle.DOTTED - * LineStyle.DASHED - * LineStyle.DASH_DOT + * SOLID + * DOTTED + * DASHED + * DASH_DOT This can be done by importing the color class, from the cartesian library: @@ -345,10 +353,10 @@ There are some parameters that you can customize: Pointer styles ============== You can select the pointer style of your Scatter graph. The following pointer styles are available: - * Pointer.CIRCLE - * Pointer.SQUARE - * Pointer.TRIANGLE - * Pointer.DIAMOND + * CIRCLE + * SQUARE + * TRIANGLE + * DIAMOND This can be done by importing the color class, from the cartesian library: diff --git a/examples/cartesian_koch.py b/examples/cartesian_koch.py new file mode 100644 index 0000000..93db20a --- /dev/null +++ b/examples/cartesian_koch.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +# Example adapted to use in CircuitPython and Microplot from +# https://github.com/TheAlgorithms/Python/blob/master/fractals/koch_snowflake.py +# License MIT + +import board +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian +from ulab import numpy + + +def iterate(initial_vectors: list[numpy.ndarray], steps: int) -> list[numpy.ndarray]: + vectors = initial_vectors + for _ in range(steps): + vectors = iteration_step(vectors) + return vectors + + +def iteration_step(vectors: list[numpy.ndarray]) -> list[numpy.ndarray]: + new_vectors = [] + for i, start_vector in enumerate(vectors[:-1]): + end_vector = vectors[i + 1] + new_vectors.append(start_vector) + difference_vector = end_vector - start_vector + new_vectors.append(start_vector + difference_vector / 3) + new_vectors.append( + start_vector + difference_vector / 3 + rotate(difference_vector / 3, 60) + ) + new_vectors.append(start_vector + difference_vector * 2 / 3) + new_vectors.append(vectors[-1]) + + return new_vectors + + +def rotate(vector: numpy.ndarray, angle_in_degrees: float) -> numpy.ndarray: + theta = numpy.radians(angle_in_degrees) + c, s = numpy.cos(theta), numpy.sin(theta) + rotation_matrix = numpy.array(((c, -s), (s, c))) + return numpy.dot(rotation_matrix, vector) + + +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, 200, 200, padding=0) + +# initial triangle of Koch snowflake +VECTOR_1 = numpy.array([0, 0]) +VECTOR_2 = numpy.array([0.5, 0.8660254]) +VECTOR_3 = numpy.array([1, 0]) +INITIAL_VECTORS = [VECTOR_1, VECTOR_2, VECTOR_3, VECTOR_1] +# uncomment for simple Koch curve instead of Koch snowflake +# INITIAL_VECTORS = [VECTOR_1, VECTOR_3] + +# Due to memory restrictions the maximum number of iterations is 3. +processed_vectors = iterate(INITIAL_VECTORS, 3) +x_coordinates, y_coordinates = zip(*processed_vectors) + +# Adding the Cartesian plot +Cartesian(plot, x_coordinates, y_coordinates) +display.show(plot) From 32bc533e1d2a4e9cfea2163516e88d51fc7c165b Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 4 Aug 2023 08:24:18 -0400 Subject: [PATCH 46/61] udding koch example --- examples/cartesian_koch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cartesian_koch.py b/examples/cartesian_koch.py index 93db20a..9aa4370 100644 --- a/examples/cartesian_koch.py +++ b/examples/cartesian_koch.py @@ -7,9 +7,9 @@ # License MIT import board +from ulab import numpy from circuitpython_uplot.plot import Plot from circuitpython_uplot.cartesian import Cartesian -from ulab import numpy def iterate(initial_vectors: list[numpy.ndarray], steps: int) -> list[numpy.ndarray]: From 5780beb84e2839be9092a9d75f0b8522d6b6fd2f Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 4 Aug 2023 13:42:34 -0400 Subject: [PATCH 47/61] adding koch examples --- docs/examples.rst | 11 +++++++ docs/koch2.jpg | Bin 0 -> 45693 bytes examples/cartesian_koch_2.py | 60 +++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 docs/koch2.jpg create mode 100644 examples/cartesian_koch_2.py diff --git a/docs/examples.rst b/docs/examples.rst index a2b84c1..f1a33ad 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -194,6 +194,17 @@ Cartesian koch snowflake example :lines: 5- .. image:: ../docs/koch.jpg + +Cartesian Koch Curve +--------------------------- + +Cartesian koch curve example + +.. literalinclude:: ../examples/cartesian_koch_2.py + :caption: examples/cartesian_koch_2.py + :lines: 5- +.. image:: ../docs/koch2.jpg + ================== Bar Examples ================== diff --git a/docs/koch2.jpg b/docs/koch2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44f9390dbb20a8d0f76b390ae678134beb67b991 GIT binary patch literal 45693 zcmeFYX;f3$)-H^th=350J_xB2rAI^voq?26Kmn3S4*?Q^gLEPyAW;G+(o0h%owN}V zLL)?)fMNh40ZI|+K|z{?l2#;J8n+O_w>{?__ulWjr^Y$&y?@?sj5myxk+61F_F7qM z&SyUJnS1Z{X8Dd-nOmCk?c2x4w-5T`+neMwh2H(&J-!d}e>Vd3>AjbHVu$wqyl-~@ zzTkw8pZ~xC z=;|n_pYMPe|Iwec&m9!E^%OWBB5~%+^mXU>@R8m$^ zRntZ4=^Gdtnf_vCZt<(7mA!+ble3E}&iijZmwo;G146^XZ$uDp-nttXpOBc8oN_-i zD?2CmL0@kFwgL za{sZWF(;=1w{sHKfHK!Om?xC6$7iXu+tvbBFPJ4VGRleUr@D7?fDZR&s zL$EbT!j>m}C}!I+_ji(0oN$`CX76@ZcnZyXeEb%Be2+7uX9(bf_D1v`9}0(Nt;BE~ zVzw>yS2y?glJD)9?(wa6QSbOY>aFLsvvNP2J=Oc!VurxkYzNiQyC({^w)gm$UArZF zeBaoEdwejrJ-*n|J-#8!_FyXa0$~EN$5#y9fti#?E;Qibw%PhmZGT2VFaP_>vR_b@+h8hO1Z2t&#*X;4VwuRutg&^SjvozQpH8`cA6p=s+UWxZynA!wc)GOkc{Rtt@k0OM z*sQGMg^!1>7k-3?%~FlBPYPX2rKogq9Gt63m%-~~5macEzmd;saoubmX5D?X?HDno zhdC_+Tv1TsNVcbNO<8>~_b5WAa|F(o{w$O6wP`!8)PjP?1xPj9x-U5$mg4`CpDL;k zd%!vkemH673`?fK8|U+H8J`raXezZU9H|^FpFtWuEiyc*(%8`3a9AnuPUpM=Irk|@>61bukpMjDc(XVk8b~`+Ky@0*O~pi!+sOFv0TN_xfwC8BWIM{RU}3tRD*JzM*6Yb z2nzSoKqHLbEpQB8o;R0f&%90)>SdX(OrHS#_(o^PQ5JJ@Fxj4)zN{B3Gos4~#g&$W zR95vn-PNnZpPX}z^b^BD&-K;Xh$RIL4lj>g^uyYl#(ZM#>b7V@`OHnxmC(Q~a{V+T z=;q-qAX2*fITt-A94yFnV0VB=<`dhiT5uGhtFMQbQWRc|CFf}N1to;6Qk63`w#$bw>68ZB@?SC<{VB;skeb~8l=D^xBUy&RBmZ>y zW1c408zQ4sG4Jwz)^Fq`D`Y*SGMV}D-G?;b=tl;+%7Gr>RE?E9R{tc*ty3CWRGr0% z;8?B)w5XyaM?jO@86-w0JSIYm+8@gmq;L@fH0Wn_Um4#nr_7~kF+)J1udMTaCMUq0 zLqk6fa4lw`eIxto=1tZMIW5tpJwEC2R+0pn!GkpczFlM~|NQ=>M#SMgzRTb~l={P! zCcOM}K#2ml{R&(rS1cLL*F>>qjx>>HS4~+xiEWBYxB7VTlGJ-av?vQkAZv0;&9#

orQ)iN2`v1=Jq~+nB3O!aB(90>u>4f z`h?3nnpyh#ndgF4GY1k}AB2b)c!gN2GBn!!=c+xUEAMof3fK|pCZd+-TMtV~tGa5= z5q9&XvX&f*kGpK&KXc3&Mb>3kIRM1b-!IK&J7Be$m)c5myghGM+snnhv@|bP7s(xVg=zW+?4wzbb@k-uccfJ*(lEw`bykC^cb zCnKQ-S;6H8Ua(=QbbD45+M|v$pUleO3pDv@RCg@_*Gkt{P^=rKn#dD=TYj(QNRVb3J!fKQXxf^R zMj>hjv3<1}aH@R8vQa`^1tDO9wmDx}wVa!aOQ%#W>)TH+!_!M5&wiMmA>cpIoAo1d zBhI`E2@elBk@*3u*sD%Ye{-{*eorp;jlUHw;OOh?@8-$xWpLp@W+kTFCoMbNSqxLX zg?e{P-YV~^&``}LNz>}-!$tcVyMjMo5q(ehuH()yof+20Un>^w@p)dVV25m~4b>E0 z*6C7vSLHatsPuU!M7v(trsfhK-!WQ)72=FkkCtg&-6bQ>Dg!}Z??Pt^T1Y((_1;F1 zRpi=%l}s=e0shK8H@mB23lQQO`w#WA`XWq6!rGJZ$|GU#+u)#%MsRnjXr1>{2W+Yq$aj|Z+ zv0$Z7%W-H;GhANBez=xWKcc&O{&m>%`nI~(CSq-nmgXt1boSWt^sfue#kx7lmSQe9 zOjN;Yz_iDRWQ0v?J3;)~4R>t)^Hy409-AyfOk~1I@VL|NZe~#;IW-kilV&$1X;V}5 z2ut|e-#pxZsa4E3^Va<%kD7`1nYN>Qd8rtvai1hN10ZiFH#>2mb+Vq z)$BHVox=3297_0UoMK+2>+7!bU|zPy-xHAW`|~FKx-a=swU_qB@@P%wylx$)Nh{!Py*zi^zuiS0n7|2d%Zr7Vo|@yZod_Lo$Kn5lH~D?IEVV9Ru>zQ^n= z7fL@~MDj3NcFZbNQ?r(~YjvFq9Adr=iCcQ@cnh>@^TyD1Ma^;3rqR;J@)^dj( zZ@v5AWAy$8LfS$+y)@arwoEO&)XY189q8~zTS7atQpTZFbqoSY+omhADJl>gi=W!cgI z@pepSEr-|4nP#}uH|S4H$5WQZZ}oSHob7H?cn)~9#|NL%Xj}swi)9j>Mv(764tsHC zV#nX*AYfcEptKXuhZQ02xDKwNWM@~j;^Bk@+RT3QuPyD}Sjm7}&FLuV*=HzI3fSav zCQ6P?Nu!$rSH~G`IwQJkqAo-jgLi0HgA{%#7^!)dsqo{s+Ml{Fz8ra7XR!P%-_=LM zeVM&rDu|;QIF@0_`|Tx@7_2%+&PHj9ZJd7xOYvT{okX>_Jiq;^H*M$?0KC%FWO47! zir3=bMzlB8y(tMV+1e77;eX6Bas~cxv?K`jHrxKUgfUd~tws&+Z(jAm61%O9T|d2k0Vj{1QSIrCzyYVgOKL7XZ-`_PfSEbc5rg^*CQUtqEep ze(W&a!gH=42F}>maWrq!hrIrQ2_xi7Wbv!1J@D4$vbmvPrr9jD@~Y|a-MJh!aqunNtjm0${e>>hvc#GENC zmF~kn4A`1R45RFk<$VIKV-Wjb)3&}^uxiwv@PvN0V&w+e$1?v5qRtg;__?6Jcv?M> z-2ClECRVd%+0A==y2)rf8QCx33Myj<8-qgKM`L`@q9(s{Zo&2u-JG8nbQ$?F$xlB`g zksw+kVXFnkFjqQl2)RMqk#A1snheQu4cUEqVxf`Ze$yHQm!S>($bDjl@E*SeFU$Uz zUJ~Vtk`5)xD#U2?ilugVRkEIfEs}M1jNuYojW1!pd5wzNdYY9)DfWG@n0agsriOIN zD5R1g;M$E`^o;gSG;sZ?h12--UCQRP@+ro6DRu>^=qzHc+nQD9 zLOMe=Z&K#Z!yrQpgg)y623MrzJu+^id_y@qT`kyDjm9)Nclu!4^j411;^^3`Q^C5u zQ$`|I!ZrJy2f|l%TnByVHolCO>Es&!TW#@dVG$kI;owX3y7(S>0+!b|16vpkpOWrz zZV4|gVXf-)v`EKo?gT}2!ef%d)M5LH_sjwQTxNTUvnF+N*+jOf0aWykVi^b9jc_eW zR!k%~V-0MGnhKacm2PYjsHsEv%szY>wmU$*Kgwb*S}qby^em0Q|nm_W$6#tTe-GY5ZWd1-~U5TA`}#Oo2Ou9sl<3pIKh zjg+NijY{JR-5A|=Ov~;f)wd@0K;+LuC__M;sn>R_k@uEUOWnm}2 zWTcQc*Us+`&-$9_f!ThW$s&j?!EZE)Y*F9=TjP}nsnsv*0wVB1ZVJc8H)EuTcRc`1 zd&JgmB(vo$g}M?kZAPO`hDTlAin6eK0R@M8V>f2}>Cf|nj}J`?`$c@aW-4Ko^lbBe z?jX~XBLkOdX`7KW6-X#euIV>wn-s&O{)D48R+QRN8Y^Y7#g82pqWw=Q4KDgPXuG&m zH9P03qkQEOUS3-C)>arQ3l2^xO{8GO+$Nn;14g%K-iA9?b!nFCp%^urhg3_@^r63k zBACotA&5=H_<_#9^2PviY9q6FeqzCiW5HO3*#k3aVQG4ihBdx6zD^u!A~NdiFF)*D zNZX7oI6-zE`q4l9EJ3d(Lv&@kJ&t>>gh=`M#m>Q2R*mn4@eS*>;}a{NaBXRk2TRMR zc5}Am3eJ)n@NTC1zefZcH%_9SvvQQeyib=VF)wM4oX(C)P-}yUTZp(7hqb03FO%&| zBlz1`m7#s@Y{|w3&pSU1Vl02`Q}L>Ez3iRP;k4bRBX+xMpwr8^%*uoz=?1ea5}F=M z$;RPdKPf@`Tb-#C#rr9r_`P8cVh28O&jD9!=7gsd%?H+y2b&#^^pa}XL>PY zyW$nX=;msq{aASAl^It+s<~zbS5B=3WB2%=|Ea%U(<%?`aUR~|Ys_GL+o*}a0i!uZ zz7#Oh9{Bu%W&FeBc}@bERU@>=_i|c(kdF4@470Nv{G_%c60Tn1>ASoG8{CG&(V~90 z^y5+1Pe9Y|?dCY|Ol-o}3j-#XYEL1$XY0P{c@Xx=3^Oz|;o6L%*uMobW|Lk$0>Xd!q^3IRK;5it6MbB19TFF5P# zMEAr!d0Kz>QME$~G0EH@>G}C5%Ez0296&~rzjGA{!_jw31C6BaR1$7(^=<_bm`(WO zBVpFqdV23o{mCm_Woq9-N3bTX`5o%T^M^UhuTI^FMi8+)ajG0h=)_jUc)PCT_Z8Jr zsjbvWO^74i{0+-SO9fmkC{W2Y=M>)+EoB>DonPMWeBJx&&|0t-O<2xA`9(}|_lda0)G;-dh{-V;4NTuLuIQz03&n2%q z$tu>;aEYy#x)bFNlT~RrT9U}{QaKNvD zD?IBuN%PocEipG?s~mWJmow9@H-u;<8vgX1yOLTtoH)@t$-4GzCbpvXD_j3I4VH*o z%}K0~dv)RkXFMUiL32LWR^x zt2@@W4_z@(`}*`*zRU;XV|b}YHHl37_yFYb$5~5#s%BqanTOoCk)6tE zY;3nD#LFV&V{71`yN8T3V=U#qeVLt_?NuGy!jr!K!<8~46r_qns;{gW1d6YQ{acLq zcjolK&OAXWcamxGWS+Txo4S2CDq2W98^mG<}=ws-4dHcNQN z$6wOEj{ikZW9fI?ZsD`o{^O$*)l>*K@%^i&z8Dj?O-bG$$L;YUs2f^G@cvB`j^xg$ zFc*jhwAs(RQLH@FrsS{4P&oVL#}VBcXD7~hTtN6fH-R<52EJi(vz+NM;=AL{tbM&1{is=6tcSX0#cOW?mTP$-|Q11ZJN=cbo12 zUAoGz9d>1QFnkS0G8=o7Ut7wbn4sH#n3&O>6Rj|SlvjtGMj$6;OhnlntOSmGnD_n3 ziMdUiIXp>p6u(&DI_?X0l?1j6O}aSO*U_5>>B!lY;G-V`jmFxmb>XCm6(aiOV6SNP zTrAB!50jhjdacT-jOW?RA`0y7Io1EyHxBoS@s4@udkx0lF1$6SQ<0W3P&R zFfOSIgnK1PU0&{$o@&D}_W1tL*^%a%W1C~3e9j+oypw2P2jT+zH(=oA?kGe~=aJl`8CvfbEC6(} z$>eU{?5fu?LU`E(IgD~+i-_}%3N{AC{5;kbUrwVEh&mn9KY`8_q*Fs&byko$0k&KG zwG*%0*2Ia<+j_q_BSCsku!M;2vfMP2AN>$V!usWiM#GrhQj~WUc>fUcIrkh3x=m;2 zwi9C;@9AcU)Ki-?qDxQR!LyyyYU7(T!V}zIIE$lPG#d?`yK)g8f%mo$ zNO)^-BN&#zxY)_iuEdHRK0q<(=g;v{@w~oFOi{HEG`ke?zE(}5Osf28X4!e|(EQxX zL8kle_CK?`-pM*mbeBX;&@>!T^^VGdAD^43i^RUJU|$0+z8pw*%kw2pIQR&v{r+;K zG$GZ)DutluJQ^d7!UFmipa96`JhaF9#_m>e{)`+?8Ykq923qAOzX;8USBc4!TR#Yv3X9!+WALgD1&pzo*-( z@HWcZVW4qU4#GG!Pq?OlQ#@Ne<}hJd4=(@+Fru(OkAw^FUf$a7VSEU$dxu(XGQC%t zxJ6T)e^4dCG5F9dcI=l$M+VJa%!sx$nB#iLhgPwmU6x+m1d+{4W;UU}TL+=p)_fKBn*IC3uuv zHL0?q2TCii1Tgb5{$YpWv&tpMh^6Imn(4wE#P_}@Q{8`40 z=qtBqTgkJwtiDL5wth+sjd#o+Ekjc0>@eW^iFE7TyKJ(U>++bCiEOsOy)Z(y`ZQe= zTCH;+x|-+?0bI`822O!1(9@;zX#5he-<4R+;Hh!i<2G8o-imlz576Z07`V5YPq-*f zZ9Ho-Mto*z3~vAkFw=B?h8%;)<=5Rk%(G}go&p%`%rU1#u?a`~CT^4h-mW9OBP7G7 zg3f4F;4-z0NMUG$X!gmOOv!eBxBUX*gu?I*e8)*ZYYb48vAi$n5=2`b_n64iA z2+U+JdSAPVys{(h4Et2&(08p-`A)~jXUSeaC6*<``8&s3Nvv4w#??_N*A3;s6dp@Agj;S9{22g(2-pG|Now8v?o$YS%jiaA~ z62F~jy$0&a_WP$V#v0|;WWloxXiGxOj1eJ)t4XnD!y55mGedgZ1UAC!I{1PWBM)(+ z$-sWz(HRiC$Hy`PGPuey8%EGb*zdzZS;8OtKM}sknoR9BK(B+rtUbP-HSS&X0D5lx ztK%nvAYIjGwmk_B3A^O6-P58khTDD7GE4Xq#Ue*zju7wiq%_wOHe0QNMSEsb!HP^bqX1OGdp}x%Y@zXJHu1^ z!Idj#@<&4)&%Cm)RGl}}6Nja}u431TUF-4unDgdF}GLkwq_WRr~VN4RjZj zZ`^L~jJd79y_TefR1b3MXLq+;L9QKDYG8ud zT?Z)O*%Cj3(720lYh6Rr7zsHi7cAnoVx-spxN)0gvO&3wn^L&&I+^Tb2A`nqYpXTA$$8_-tmmYZ34qspaZWvPLeKLY(Mg3VK5AF zgljf<_*QKZKO`4KqQ$|CjvLWG4d|{qGxgn{Uk;3Y{WQ;9w8rSS>VgH?Q7!L;mtIAO zUx+*F^*D50WR8@Ym%+nM=anB%zt8}`Uvl@2b~pzt)JfCuP&uVRM)lTT5H-6^HLp?o zwiUzF#UliAyzvOtZl`{T?fIa0sulrrgJDJPysaZfBV1cuS=VH1^~K}6Jx{`AmUYMf z*nn8F-?tAz93nfSC9l@L=hzA;7Zm0<`;TxpIq~OJe!uoFX zGH&29l1wB_5zK-Dv{;}tULJ7Z_zi>3oo!0#!cqF>_rKZ#`vw}{BSl~s`UtY`Y)9a9 z`{g3cYgnp+7^kh0H6_Qy=`&Y-e+J!ZyDIzH!opK%22UR_zgxEQwOD=(rBw??x(;p@ zw93r**?%yLIhj+!+V%AqK&GMX25I+pWVxr5omrpeIW>0br@E}lj3lGdTnE!sts1@2 zL5a79?C0Y`WNtcUAXU6nUI#oe2}~{R>!knOT710G$v!O`=YpGYrWze7Rdr5P+aakt zKdMqaZ}3E8#WX)v+u-I~WXX;7Ic$Ok2|N3qB*OW!-q|ifH@rFLR^!bY{hCH#4udJM zVi@e)aT?dkP$2npdXgKp zj<|x}td9$K>89*^#=@OOZ<~0?7_p@xnya%e}H%)F@x_k;+lBZl&F|x5s1|1JpZR7Q*+4sV_2@Hz|d_jsXsTz6rPtY;P=I z7Qb1xZdKpYzk^+g9+re~VkjnF`U3SacOTH-iC5s{WU|omB=zqWmY+PyMOL{(7B!?2 zwAk@xo$RJW&Q&84iZL0FG21a)G2O18c*-%IK0()~m0s+?xIcwr+9aRnydk|eikz^t;Q72ZJ=X$CfJAlbE^@|ZIOi(ZV0p$2YC9pk=t6wXqwHHw;9#vV+CGZ9mPQ@7)RB zIX)fysZSr9fY5vNeDQCx7-{Wd|HRJMIcLIHmS5N*F%GHzo)xo;Ev})pU$!A?+3$&- z0_~WFy656pw|%LBDI(n^{fd_GpG1wZn`6@aYBI}N{sW{3^oS8pA(;y%`(bK^P*$rN z<|Y!$c%mdNX3CFglNL#OqrzIYr{v9RcR>MRq;ebd%y$dhIdg1Dfgj-ilc&O=a+Qk( zA>0`9kT~3dn9Mbih9*e@8)2hj#PF;=Z#GI{z38pZeI~=Gf4Az%zgOqI5k9lF&+AYC7 zzBzIn-IS&2))~zYI`8obeHQM2N({7q4lT)?JrJ>l?zE1=^!7N5yN@aGB%j`l6TdrTp(EQ^x?R1`x+QyO-Rm1TnyAI^` zOD1(;iqssn4GORNrgVFUNG^A#>Emc5Gpp<>Ri|pz(Mr4P+lZHBI0+K22{X2$mBE`g z=MYCge7^@LJ*|e4MquQV2tr(+CtWdf!9Ps--H3+M@6WHh4bf&&wnZ}T?eR4oA8q{A zL@mH5?uh%c!coqJ2{B)Q!jPU;2C~`=q4C(%glR=O$8ju!v)t27W#w_t3NQ|2{0s(C z(5W?CWJSPsA2~4^Zc|G#7{Ld+8JjY3(XHWZx86mRr}yKP95l+-U7SVA39ln2CNitu zO$P@#$rk$yGRSh+GcgWX+I2)>?$IzAy)BdY85EJ(pAl zd2%cvq{yxkOV%ze=v~$+dvNaKjXo7q1nkpHRV2#38b{Vx84ovJ+4>#wa2d==s<_|8 z<%UPgCg{P&j1;`aP`L38DDc5WB$=o)l$iyAXwem^HhIpI^~C|Aa~EDVJu=GLJpC&M z;2RHnwX>|HyDGGBu>?6)c!WO@@@h|mxf2F$nFQCWU#%}pQ zp6HHplF5k)E($to-6G~|vuml*QM%`CK5ymq3_qj;dWq{kVQq&2Ov!Ap4AH)O;(}fToO+jQ4Kdgknn%2g zgG{1K8QW#GH9jI6PUBL!XWsXQ`oldef+GUYzIuEUmfzY_%)t?Z)hU>!=`}<`$(p1T(XYkm5kZ+N9_CSx z`5=N5i79qz0mn9`tU~Oz8fTXrDi*BLu3C*&c=_8GD^#+{2Z@ZA6LFBBg09LY2rM^C zg)HlB`=*3x+B3G}wn@Vu{-LJ`^bgf6Y}U)Y0Zg3;+TR}-a`gFqS;?DK+lX#8o;oPa zLde?838SUKLfd-c7>&ePG%3-I>+Rl)8dV8CI}$XdqXxVZJDg4Ziw|au&=R7 z*ZK;Sq;=3wdB$gz*-2h|)*|WeRBd&w@;DT`U)+lQXGpe%AWYQhRxlh<8X}3aut!0L zV{=2M?XzK&W=TNtk0U=0vx=uD+?Jj+7P!55@Pz&RMPu{*r8$?Qk=4XJW~O;fpYs4u z)R{wh*)C0djgWB#O_?S?0&9suBw@YZc*^&BjNX=TYUj?4aV=Qyv^LV<#_Fb=@jO7W zqx}emQUSJ&-2ey-n5d}_tH$D@$60sIT5iEy;H9UH(^994btF?eX0K%}+fnhNwQBUA z>}srBf~Q}ni;HZgUOjGgF%4w`ud&Kj9gbT-NE^Qik-Z_B*>S$eogtU;(&w3wqaQm& zVv2NGsR&A&4s~h;tH~ULcU_jLRJD)SICYeUqxsv#Et@Z_BB3n&59lK#JsOw@@pP%% zX_Sr`fv7|~FnPBL6;Zjz=Z9a}?!OnqI+4MQ#ym%CA((yGo?>y%!sNy-`Yp#dk&X=Y z*{!2sec3^w^RJgkzU(5?9+T4mA&usDWp$GvL(GM8S(IRk1Rc zzC}$BUEj*Q8*fB2TplhxUpQx8$Qko+Q~l#QyuC@V5!|Awz5uPDhC+VX$`c1Ve zTd{97z-F}4X1EMTH4e}{JwiEb{C#J*eEs2{?Tr8RfB$t8?UJFGVVa2d#k!%e0=YhW z$5AcKuvMK4!!^FGBS`u4TVYN0b#?VkmRGN?o%-yPK0P)zZK(XL_?MIuH{~6Mske3u zC>&l9pf}E(c$@cR1($JKH;BN_joT>F@u=ra<&?5v@ke?9rTKm)u4_Dz3PacKUQ1oD z3tJj4>+^N0vHC4u%_{ulNtvdbH>W-A)n2V@yiQkeX?dq1r6^`CB5R*WtHczRVRR~; z%HR$a>#pN9b~Q#}epT7N2Hhg@pA--SXkYbxzLhIRO%1?Vwo_*1jM;9yk0-?73gfxQ zhv+e7%f<3g9K^H_G@5RREG6MMTFG3Hr0&Vu3Dor6F`D!k*(^HiQa4PJYIS2fXOOhn z4|I)%Uz!Nh!N}Pt(RJp;$L9Dox)V>2%sUz*9U!&#WVw<$<#$WzVN)P$RlFlwVz@DH zXh}0{kMGdLva@u=1h0WD;%xUNfBuyU+cSa54r#0&=)NqQpf86@P;xPJDzS2mrru`s z%_=(!_9gb72H{7y9IMwcg%rEifci=&_rkM@-S(Ycz|Ht$7z84JJ}<#LiNRjDT|`34 zI&Igw#uxOeIlZj(ynaQ=Eg|^B)uASt>0E>xhB6>qSkgbsgQ!nGdC1|l?-&y9 z^ONes~j(#{yGp|4MGL?D#2?mN&bZa{(%< z%mghiK8uobjEWvN9oszE5DW{9*5#C!K7N@~8BPIPR_vNz)QxWh! zOO?(wslDrmrS#H{={^mq!Dm6ixJjIXN!Zg|rVlYS{Ll_=#L&l1rwpIwH(U+dpTq%Q zKe(Wzb*eO(>HUR1to6pvlau-Ke4A2g;FDAS33uNt+rC`)s=wmolbF%W^epssLaMN@ zZL+KyQRBAIxj|fP8wwAU`@2f)Wpq^&eJ<~8zs)gH8 zkXB{5knCSOq2iHB$I>^GCAcD7){1S|a_9BbVTjLZ-9P#->lXg9*rxjLn!3Lz#F1!< z&iDcY)n>S52%eD59-r^#j@KUFiYeEOdM9v=`WHR^e^2D4_YOv%Gn25F`Ij_UYxJ9m z)z1Y0g~hx5o8S00jER*2N& z1NP<5LJh;c6S7Q7U1Ml(bt~*MEzdVrSrz>XL9(mJ#kY^*4aO)oBh-Z0oa4E@Ktq{= zc>k22r?QO??K3c{Xdz-{a}q12)=-8kQhR_ad{$^|l~SbQrD~V$jyam2b1I`R%ek6( zZx)il2!RU>f(WhV;9D(Ou=C3}hO?FJ&5jXVxkw0*j#eMxisooRJ9NIJNus)CzQw| zR8(A+u|x%luD1N&6jbioK@uT3$DbW+GiTf|Ri=*z3q z*X9DOPU9NL>H-5AHL2~;@ER>i_nU6e znV6&gGZVP@$H9u-#E9=pD@j~nwu>}+9DGZV1x>!JU;xqVC}?RHpSmnd6{`=UM7LBS zr#Vk9nVEJcHsgjGMU2KVBee^oG?DXTnwnZtjsag5ivRYM_^jXHHA_Q4e|%*9@Cm%| z{jjC}75_1;$Sb3f60M+Dy+)1fPYV)UT%jeSu`E5!edi=aqk+6*h19ul_+;*mQC6kH z_LuB1PGNT700sRd(gc@XdEP1eSJg0bmBmX&d9s)i*VCqGpuxj;%F& z2DIU-Q^0X1d2(Xw4rjcxSbhY`Yz3B+eg>4|x#u3es&WC>&I7?o8-0Pys_njUCXw#L zu9iQu&NM3eoXiS73Wi!jlC~~ifjByP-6w=oT@HpSg+cjClM?e8hr)n?iq*C8v|ooQ zLYYi#eye{6rm)(fVriV&(Ie)3H`YVB)7@l|At)5{{y|t#?_9=UV6r^h8U@+eVaf1tKzZ$!U5_MNfrXkFQ-p)C~1uku6#xk z1i;+$046WEq6alW+D=T|wD!QgmRqc;)jZ|XkTXA|+mb&0c`V{ik=L_?^YvOtGhbYq zh8et3{X9}-oMMFZ?{yg|vpXgE(@Ac9Tp=M-n|ZM`rGy|1WtELY-1z^+4!8@UVa>w+K zAWPxJBT$%k1YAYQQhVppd|z&F-C=7@z!+#w2C;T%6XnfDNK8#bq_6Nz?<(TD?U$mn z-SGY{1V8sm%Q&sT*qJ#%6lQUawC;R%^C*t8f(a7SdtCu?7eVyNQtc!j{A$^h*wuCt zVBPmnzBmdYt$QQDd3%n}6PNT>Y3{8d-jFWQj7h40ng8 zHRVNx|E*TDR!es!$lIy8t|dpmcu2(FHf3rqee0vomR16mvK0LTILJ;j8T+!{vyDz@ zOjES@UF#ujn5#dlrGUqSFm~|0Q%`CeR|DgN=k-aJ=O3Nl1!=Dyj zaOk&c<2lc2XZI#oH{0N;4@MkA}V(}UDQ5J2)j&cD7<>yU;@~B zmT!2b#99zjs~1N}nO)=E7g->y;!>s4o72O^XeMM4cjh)YkN)>!t^G^87SM`!uJLolTL!`l zjMbrBgfRPn(fFO!0*}}zJ(v`j{?(P^+eHx55G-+XC4O~+62thD9NBaaw~IrK5KV&S zH&HCYEqAYV;+&F~XT;fqD8tzdNfL%b?M4WAOq0%yMJvQ~3b4rs`hXuM+1OOlIgW|3 zuoFvsCa%u^uHQl`_(ws=Q;BGVDHLltym$xCGnQrK+S04zoK$_6Iq-J< z4?yIksa7RcuPl-M1Rsbx;EO`~qofc?XFi;`&b`o@aHbt*EoLfjp6;C-$B{G9ff%JZ zsM3YnJ<+IlW1E_avaSUw_RYhk#quU1rc8L*SWTozsDGo?=@{2YiB8C z*bHXc=32ja7JUrwn|n!p_Vl|CSLKA0`n1n<`iumQ#v46&bHQ(fX_a>96~(a1fugQy z_*|8;s%D?ceRCr;+vh=HgTRB!1{b8%jk|tZ~3r|5mON!m2QuFKe z!+FDx3#xHh%Cn8OW)TVx{#V%R+)R=Onq#@f0;wn+NP7x%U2c;F9E&rmJf_ROCT$d5 z_U9o2U~}r|eWyxUmGQmAKz7YrG9os-BDkhDY*)aejT6J{G@0VecgvB*9zAO~#(%6| z&{+TDKfnIzScGI z?P&upt zP4|@AIl+vY1U0=0L?cn#b>xZ4BvP_;kwt$O6W#$s4>C70Kw>N(ZvkXuBp%i&?U*b*D>6-d)NuU%>Z!=&nHc+};k`aij*%szaN`13cRdrWrmpHH0DWWi#{wqL+6MGn4Em@ftt`J>ArlF zsBE6lJu!(Lr%fVcNEi06&WKSnev~SN-K~fL^$%7A)ne9h6$om9QS|#AE8OL#`$n`~^I&)f+ zgLxhm5w)cy*hP6Vw%uK|dd6R$H^o|tMu3y-;8d<$4Vc+6FwsAUct6gQvPccjfG-wH zerFi^1xd(+;ZAg;^cEpQd91OTdK3c9e*jZk1weXF)M_ndu0TtucP?^9vFDaka=AOG z9Qz~m!Q^Ndxc)N#D&@%}>3oz=v}%kuw#3zg7{hEsfX=L_%hRZ^AXfZN-_rc6ab}leniZ&QHpkgi9jMtYE-O~`3JFQ`8|(6+imszHaW16uy(?~FreblG zvAr#XB(iAuOhSHNQ)Uew40LH4`SdwF7)HF;!BZNfyRkCF{hYQx(^$-Lh}brJ(USW9 zLqHp1G-zztHUl#jq%g`J)vXr(Z9t13-vzY0a?EM$DQ&I@HPA%0VUQ%xA{-3BpB&-p zBjT>mR>*w*$+J=7&YZPGvO6G3p)5`$#*&O#XDi>nsOYJlCdPW)*tSt*j72!%q2jXg z9n6UC^Px%mI{I*}Ps1=xW_7K`x3Sm;?J~R?9;Ec`__JUCj5M~lYONpHSShpT|4fbu zjJ)z?(%npP*9n`2Y50{4WfOy*(bm*YMMrzYqVZA+ zd840Y-lH^6b*j!r%=*N&sthh5_M_FPT}Ku5xH9!{FQ{LSHO!>uRM)$kITtlV2i=fP z^Z!3BMRlx6glO2m<7*bX(IY;=$60f)#rZ*_$b&=##~-fm7ce~;ml;vVj*R-Mn(!)Y ziE1Xse*%p~sXqQ~Rc(FpXM%KF18KLZ@B`8xGMQAIQ({9N$M$}luqtv#xh)JgWFot_ z!i)1u&z5{zNY{5QjUJu&YG2#CflH8eziPEQ)wgjppzn|63Z&*0zDs5}us7}L^CR9Z z^5A$HL8xop#Blj?eJ`CR2u87?eyp|F&GHhx0`l8@eui})L%5hgwrHyNva}h{)f6Kz znW|)44k@zL(SuJsi>$d-=FrOVjV|HIh-jRU1mPaXeNk;bFG6m9%vhc|>OB+H$&;)^ zNE%w?3LSPE?YdN;M4XejqRKqkt|q17W?j|h`$Wx7FHsp;?D3#|)8`c6OOuw8!-`YM6qO5+jE~a9~@Y(!uovHB!$@$A# z%?_;&OrzYPOLJ+~@e18KRAk|jOPY~qztgD(y7KZ3UUtE`3`H5M_5-=a?)Ub(Uw>#d zY8nmMEnFPDw0VhwK8!3r&Y)a!EP1gmkENT^q7&ytU}AnT4~v8_Rp3rwGX7InQ~lWV zYh&Gx@~~bVGMxmn9XKM4KlaRh0=G5sh~0H!8_kN`-}Jk`kz&zA9SyZGs+Y4{P`0RN z6e7N;KU6!3X^2v|Iw49}k?eTl9nt(}$K`Nx)z++-c+@5%8(0`6{47Ur1)Jxk`KgwK}peSom=xO=XnS!8`zy!G#&B$WL0???~TM*Pk@ z13knzeUdjevWWVHH~f$;D;y3ZzxtqyI7|!Vmt=;=+~50+5V5()+rdBM3-LC(4Am~z z_SOI~riT@p$6AY#qLyeBlvq^|GMxJucnY74Y^wD#w&@3<5)k)PC!2Ff``W5K2}=v3 zK%1y2S0w$TO>E})QX0$tOPj!VlYMZZZ~jZ0uzJ}D(a8Av<&3FA2Ctc-84*cp#UX4eAi`o}Hs`2jU zCyJzYo1-oU*`52N+J_!4IKO{EQ0tJ7>AV>?m^~ApuA|!ep}j1?ushw`F6hj&2?fSc zJ1_&izNPiw#ZARG_9Qds4hK~oTsU9X1nFI==`;@TV3{80#l+PF9U%BHjU?NF_H%Qi z3+FmivEm~I8r4``>g}5Tf&qM1UBe$WjVgPe%S1ce7Dl5f#$%Xt{Y=t(m(ZjF#YR%u zx8M%){8so-ITa0eSvVQzSG3^b+K^ii^6vMl{uK>cAW9W?_bS4Lf2@pu;sP(Qc+YT{ zo+s?SggVG`eV{veWFc2Jxorq3+LOHA!8NU;@)MYED+pnZ1G)ibEvCnKz5{~i2Cfb+ z@0^v23RifQlIrW($m@4)YLUT1D6WiF@iQP@e?_cHg#K$fbiAWN=%V(6H4edLim{7hVq0*jL8HJ&o zb3PW;ZiEnaT`)V;39jW9GjZb4sc~^u?!n9sb%XrPiJ7b!GbTeS~FV&PCxw~gPh;P&$V@2rh$RPyW=W{i< zwUjCKJ1r@E9Q#@dt#c|bPC*`y50>Zf3(#Lp4ef3$d9OH1>XZ*^Y5so;|JI)z#;l~)Y3GEf($Qxhx>Qb(pD@F zbMr^k@{Llul4Z~p9zy}j9R|nL&wO!*fsL%ZSgW$SHqB*!T~$@I7$3*{`zJ}bX2IJ{ z69j9L`v@z}&u||Ci5$ek3C$1X>*f0_sa559 zY^V38uk765SVHK_H?uOWj|EmqerY{*#Ae zX$j(xRLmLT9I)z^EReneZE`V zw$(nL2jJMjbzz3V{xrR+P2)2C`Oe@rlZ_x~qn?*EPi-AC@~Ju1JN1(A-b z5k}N4O(+h9bnQD|`E{i{VvM?^{{k}_Kpv%CtF5lxww-ye_5ItOLmuYM?{od1yW+Qx zi0ZR1)V;PvFkkTX+fPeXbBE9E=HoR%%%ZiWKg*+@hlr*pACBl5RgN)Z3q<}@8z=Ul ztVxSdjc(l5RZvM_WtfSr0jc@eD;|7nqdeo!6~-O*?N?#XcC`7^_~Nq#7^7Gad_ZpL=6^Co32?DF#vjbbcE0{G9p|@i*WU4qxL=DoHOdLD5igJc>D2t=X(QxH3@}g1r+QZ4$!?pSo()Ax^ zxJBbRlTnH(77g^5A3opb98kd6uZ~xUwO#w@Icx%IGxoTMsi0z;_hSF!E*&+c6SA4! z^OtpuB+f{@2$7VTDhwwh7-%e=wGYpSYkm*wwXH5?wssL>jGLvTUS z&BAaThngekp3EUma!Gt`c{?z~5(b^=LH>!&KlwqLaiFNb$XzLpDbtVL$de=*^hccF zhj|$_$JYF@bIh01b8upz;lf(N@3~8@O$XTHk*?glSY1ttdFjZ@!wgv2Lgrpv_-7BV z@C4Uh+U0?ev1R~}3-$}%#C7^#`=YTjSDWRR0oP`AlO~A>{uoblT5VI`>@fJY-kw7+ z2Iw*x>cB^8cCbe;p9*xVzMwVwQR12W`9AEo#|tP4?(CBcBo);YK%O7cbD@dW9M_qF zEq(qTp>5#leDO=VP_fTbx>{>A^l;q!8@danhx0e&Oo-ufCdj9e`a`OHtqcVSNidOS z+ebsWCEnJVc%#iAY8kv^SXpXNGv|)Xc4_f1y6C_g?8# zQuKi-Edo*J{TbaNOYzurP3`xlDSXmYWXx7jLWr3-rb&vI933H<$9HPTW929@+cK3C zU}hqbt<(LmqTJcGG7b)&PY&H_1-nS8;?>>yDiWe?r&V})s zTab~l{f=3-T;Ev|PnM}*!l!Us0@fqt&vL{B#|grl7;f8adATkyvoaNA23LaM2e^G} z?7D|LI@AlLXcX~ZeLM2BB@p_Esi8q83UiftlR|sFc`_jB!ne7={T6?HWu5lR$kJ_7 ziOME!%zgYD-Pj*+t$iI^DbI$9h7{P~+>TO&6!%+f$cn}H3c9HHrM`0Xg@*oVG1;%E zef&nAI6E!9noKysGW(bwx>r3#igb@f z0fzy+22vjW6GwY%N=#48BNguXdOusp)NeB=>*rWJ4S0UR^sic!%DtL#8@FnIJZ@5+ zR^7=%qhDXXIngr`9xNE$7N!vq>9-NDRlfZFyLZpqp3a`P3OIDSe$}p+N=GDS=5C}S$$M?DN{J`ra z>@SrUG|aF8ua`ia&)gVtx6XAa=yHF}7=n)K3h)cq%<6pN{dINq_u81qr|{nM6-&ve zjcwB

}HiN%$@eQAm$_Zv=#&%tA_&@RL8B4?}1%_*u5>xO6*2;MM+^c-<}=3lObx zESr}y6M`F4-VNyk0FUVjOa=u0t>N8A|IE6aEKa42THVq3*8T!VaqEPT6S3Lsvref6 zzk&Zo;!-zBS<#_L4QBMR;lslc_NhTucbef{!&PI+3}2a@K%q3Dj|~#COs1q!Dz~&| z26BTE7vk+GZY1G3h#dfqdY?)Owu%fyl7~Oln^#FZ(H|j!B0^tqC*z2+)AF}_I2P5@ z@{#QkN-y{i$e@JdM$@)+_-K}b+2HEV&+LLJ`9P-I-Uq%dPcr1yDL9%VP&>@NfcIN>}+IvBa1?=yX2cQfrSjwfrycVx>4GwXt=AfEAY)RLK;u*S|4B@{U0 zjB&PJc-j%5!{kXYV9)(WZ9k6&6vyQgsO^xM@$qC55yqxUPXjn@9S0rH2ximbjD{Nh zG!u8AcX1{BFy~5c$HR3uHM}rFaxucdX0Er!OAPU0ZA}C2QI2icE5Mg5)CDh&M(5)- zO1>qisw-&!I1xDlQJT>^9yIsGOs73X1`pp#2KP)cR@!J~wR#$TsPiVi9AhLOO%L{y zqVuHNx1y4gP4ksVzzJ?^xvh_=Ax;0WXPtgF&!XwLv-16PS>ty0nUR?TbB6889|xGT z6*cp|yz+-ms+XysQ*XFysP13Z{-mdurfjsHYSO6Y$FyfhC?zRNtI)L52TWUyJ4M1m*WkBSeVO&6RyLjiwXWNg<+F1tER~7GSn5>&m~$y|-h_rU@@n z{em%t8VMYHu%%34PqR?$Kwm!4C zZ|yQSCRS?fEH5B8h1?-Vy1t=~Za=j1b!w8-d}I$gZ_f{EMQ-F~6rJUGm`Qt3`97_o zx%mMVBREqbo`|bd!%%ttu37y}1Ta6@c zIB8pd{FEVlfAeU%tf2Mt9HBsk)^y>oLOYtQJ{DWiq8Kd#Jvb|~+!@Usc=^DzrR;*I z%N>yma6OEOsel{y=xu0>>MY#k0r=r&O@VY!furb!{w=y(^F5vvDESa9$XXPA8}R}+ z0U5%Z?DGI6Uqw?Jb$+;dVKj|AT2@?NUB3;Rsrm4IGedmLw)*{j%$2LRJAf7L8GQ`M zhYwnivlIc+-LfULDAACkey6=bI)-S*&eDtpeK&rUJ}nyQmCJ11x|UVoxnwFegx_9^ zQaC=q!7YuOv!Dm@#-uA@>b|sfTjdtq(yc_76Y}X(Jh##i3xO3 zI(6haM#6$hE}tPx`t&UC(gtsAsBUXw-a3wKBmCa>yfyXsddqq!Vw`IZN{JZpi&+k! zl&I#(vi3~)uH2ULjb!;B00Y5MzVK!`w=K8)d5t|GjH#eJxJrZH;r8`&5D#|{RGU(_ z38Gowj?XikkzfoR4H<#w%1kxM@uBR!BF=a)YcwN@;ll}v^4XIbB6G*Ant9ja*r1sM zmQJ#67nEaH&z^)XK}=IP#w#GN_lk0&F^_2ktJ@?e;BA#{d+Fm+EbQoP%xn|c>9{E!Ut-~)%kOx66Hbm}8S!PV1Sff#UR&^UA2*oc zBVk@f&bKlXL`n@C@G3qFQwwU(4Xhutd~bGK!A{Sy+|WJfgEzD165DJf)0s!}zOZ#- z%wq{jskh1`g;vubBl7-iNsLnncBt#r)G5p3(Z7^cx~m1N`4Zoer7rJ~S;##arw8z2 z0o`|Rl19jIAK2Ip+j|MUQrmt>|ay*nUQOv;-Xd`zMXxuEg0( zPi&M!#yGC6J^KlzV`qo1^7F)YPUebaIX+-zngf|1_1kXVo@^V(E7Emf$M{bE{0h6v zueJFgOfyD7;X~3Rj(VV(^augLa&1U|qkmOv8$U+Ty#!5Brx>ShVA7@@`IL*Hj!_>6Ro-?1z<8A=^;{IsyuwUO4}6>ugo z{NT-uX~l<3r#B0iDYJ%GX@EI(<&5ENfspZ|_FL)4n|_HtUJh^0THIJ6= z0=Mmc-1C3Z6rGI1$^R^h9`R!3EJJ>Tp z-dr>`OR(fh3cGIojnPS@BCWkBCFkf#^AcTT*OiKOoqc&+8syv zbH$$3a2Hcp{$HOb9ZIVa`$5&Pg6IX)#{Ulj`hQ1~0vH{QIyvJS-+-#AaB`2yhmpe{ zGpEy^22XqGF!fLd+;lQHO^^2Ar-V%alndE6$BRiMdb7PW+qb0eU9Txo8d#?tLNO_0 z*a=BOM{Jqtb>KfSFLoznw4$Ymklf?F&v~x#Awgm-Q<1+e{YALf3>Gg5JfM8ym($ID z>nZX_ZsusRN@`XFzOiW!bk%LP1-`MGxplB`IzJ zQ9|)Z*$NCiB~3yD6x_-L1oxezc33mk5VH21YBd+JF^8K#b4ZfX zO1pSa1vh=`J?e-Yn)MR&lOVtJ zo8^6F09{P9^-~LDlzpiX$aN+~`^3A!HB_Q5ie5Cgv&(94V_%t;C>*n+>2;rpPqR+a zWgA*DIo99taw%t`aipYu`$>RUg1u5Ct#3Q4MKCZpcP6z+QRP$5_|1ntDs<1&=L)C0 zh_= ztdWDqQBkim!;oX`^Dn-i;W{r)%5DS*d+{mLqJB)sOl~84#o^1lZHo+>nxX480pf`I zzUwDzxrmsRowG&$MkU-~=9`ZMVP-G_Jh@_LgYyYNi24`Y%_wpgu5jeLEheSA{9=JB z1@%yiUh4bt=um4v)2YRg>6{KpExirUwf{N+^cdi*Vx zbEAf95dYN9%b`gq{a^*!Mi5Cb(xyg{|D>IEecjLOdY7t&FH(8w-(pWuHn55UY0xz5oYx*OmdT!M$3~~<={%S|FF9LhT%A6BB0#J-Tl0Y zQtFL}j8FAtK7Fq&W1Y=~ClZaAyeu)K(F67KO==wT1l@6q8eMFYZlzFnF3XnD}{(zI1 z%PLT?B0 zs6Xt)AF_|O-c0qC=(l`zufsc7OJS7IxAb0DO=Z^9xQUmK?ai@ za@@|{$W}ah!AcjHltOa6|3}lG_14gqV>N)E;FoRJKDb&# zb1W<@;Dq^ygVZAb%(;}Z#fWPK)Hcxpsm-B1S?(k#Aj0op3J5_ijM`a{_~gr(Ty#+( zSLNG0vcrm(tU25)vO7bz)}c7yRqPHuJl*ODOd0L!HAxq58w;nivC}u{;YpC>YG;*O zPNm;V2cjUCqExg%Kn!5m9m#e%26n;O(=u&u3qxI3d^8h+_H_9)G!GhQ##Z}4M3nKX zz4+ecE#P$TK%NJy)rxuF64e+c0{18wqoI1gqWPga=|+u(rt;$MwgsNdJHKxErk1^# z)N^f&=tcTw#4v)22o}S@Ojvz)3L)r^`iUo%#(oJu3yt16!I|9mHj*7Fi7|q8#D-{! zbd~_M`vMK)I(dZNxod1*)33-wB*W$(e`87ih2m!+xyUaD&K7XPlyiq4VwgW$+kYNQC=qf5B` zhCBa(eg8%lRLY$X3D-pQ5e=!>+>=d_Qdme+l+SbbF~YSTw+#D+hQYFD;UlbD{lKs)@tg$8b3ePGF9^QO!DD6&i>ze`SE%M19d=1l#gJmXT&1!b zgT9~yl$VCQeCd+uG!tE<=)kzTaF$}L^R}ndrRb5L^No*K!lw&r@zGx4mLsk84i?W>#DoLyWDi!`u_e z9eypHDH%;KMF5Vu4BxD^fqY+AQ{El>!kn_$^m|p7WBnk*=?nBQ`a6Od88aHgY8G!} zcdFxvtUJwa?dL6N!?}wmYNHSg%U+Q&7cRU|igp{{GWsmDE&WashV}(w{ z6{?nZ7X`{T@|!`iglh!=Ey&*S-XflBR87#Kv(w3-uOr-xWCI9YBV~+GjyID=l+Gg$ z=18+BAuFMsY+B;Fy8d?PHzt}}vQAR=;7O#k1+YONvEA%&bl#EAPN%JNh_@9C_?#PS z!mfwal=cDArL#`~N{W2Hq|*Jitl$c^{WO#k!y6;iuj{ zPnptD1QkAI>W2-1<+9h8q?AMP9Zc6h-7+N~+L!HXu9JSyY1&o0WgtQr$h!S`SO44J z`H#mFU@MQL`~$T7b>ttQWl}Q$TFSfr1GM~~KDl)I`Y!Y{l-}dZdE+ROeH7e{>qDN8xQ&y?&Pc9D;ax7Rs@-&g7=7bMYx_F;cRu+_Ps+j zuTrddk}ETlDOs~Y8q5ijVqAwynh@clDg}ZXA|yr#YB>8D>K2%bp|zNZL;ZM@6l|)p zeY+;JCpadR9TZa_hw_b0S4iLY>!L+QEhYZ_mrup8Qm3p$pJ?WlYEL9*ZWoqg2_u{t6(;P<|}vZy`PV-S~Crc+JBT zOQA`51q7NsPt9mAxyXxOz`E0*Ii^{2dPDV%ZkCCo6G&oq>WG*IWUzJQv@;753LuqH zb_krc9glLZs>rA&4J#=zKjgFs0!ZhqC6#5Z)<2I_NW|-IDF8_;ISTvjd)>fnaL}ToC1^wWoky}Dsh4LZ(?Cm zOgBK49R#wccg|Jy(SZ0ScF2|!6sI@*7f!0__`nn|ki?mk#70V;;I6b4li1sn2MLia zK#1eym~6<7n|bn}X#}0t(U>IA;vjxq&~YDIY|`RsM6m<3r|lmTLijMTL)i2N+tlH{ zF^}<2ZGMtnpMvm;jYR_szr4B-q$_ZOaE9Q>Gf(fou$KU_Qjkh2>O=K0=LAEH() zMW8SaV)}1S+XuV7;S3b^F*`*{23lrOtJ>lSi8)u{m@X*~N1>?_4rO4g3r%&RMzs@0 zx{yI8>~{uto!t071G9atod@J#p3V9-XSgM~dd{ksUySsPpZrM5oueddA}|0;4-ro;uio${e}Hx#~D#5#Rh4sds3A&z8AdD-j}X(cR% z$iscFmh=}GrRJVEknr79nQBKO-mleg24A4f8eo+Q3zY^tz6%zrqQ>W*F;FW`@<8ZP zp4u~w2s`JUh1^2Z{24C$-t|eL0MpY% zW8Q_C$++18xH!4FEyr~;a`0qd&906!cQud9--I4o(word<|Sx)u($-fNWleZqiatZ zW-E6K*x8ZEregPqVZ1sPQh)@;3;eLxk&-pd(G9sV&ouIV$X%SUB{PV5SOvlFe0{jJ zi69d>MCFdPL6%WR!vh!KP=WdazMu8WA>D0(=9t-ep1jaVld|TfLz2|PQg5H+)P*pk zr%4J;t}!fcA3K<`YuaG<3xiO{G@}4c$+WjYd-jb%+)ffS;l|+C%bQycr~xDB z)>oUskXM~vmKT8!l(I}0HNI4pqj8;978H=Hnq|{z^Q7P0;mRC1Q2WliNGug` z{i5h%a(rfM?t#8*)pdhJZ;qF6>!@#g!Ab4{7pw65pn6EwXIyeH5w8G?=Ybmu^34Ft?+0@dhE%bvK(~99)16eTOv@ zYf?lACg=tr&Q*D+<{ct>_t8hxe|R=Bhgl9idL$n<`d-sfdfvGKhO%#107ul)Yv2S= zicI!e*b00!MPEY>k$o}Sh6EL+C3lrn1WIaWo+|4vLWkSeowH%!gyTP8+oefoBg%mGD#qX~!>QrM*QM?=ErElyeUcBH(y*+N4`k(&E|Ngb=M9mwxSz$ys>Ucev ztoUv~W6h2{d(axH_cY%fmR1*QDuzKyWEkbeGHmgjQ{)(nCN8Z*Qykfnk7*KbY^>)A zzV{B42iQ@AoR6U<~6d&%-)> zn`M-jg{uJ2{eYtkLoP&p-?p$5x3O)$5iI&!Nsg^qTfWw}kt}RF=Tz0PJs0i1YQOR3 z!&WmrRWaeARwzd;4RW`pYVl>W?Xdlz0@tN-zx0r_50oLeNuzSJ3RX%99+`CMumq~n(UVU%dlgCJmxGea;yNO#4_FWuKbh!ij4LMsR6j?w3sAc*(I}k+L;>} zho2P2-hqUqbdh^X2$4>pqqtU?K0DDj>tPrea5BtYLtWjEa1`P}xT+5M>b%5WyhM%3 zcNJl)!K`&ly=QEZS@{MQPT5DSP8kJioL2N7aaULcnizoHc?hc9YIR}uQlrvN7FfH5 zrcN6jAxk`V8dsM7^|7`3$@CUin7r|&-VNauWtU1u--ee4$b}EAcUcUDshisksFA~P zW3o%CsqwRYU;1WGtFM*^o=6J2J54A$|LCY?k;g(u+sOnMx1)a^K-@Q>K5@H30_9^7dr%Wckh* z^oVW-Z|>gCiD~+W9T=HV3yso`lxR9mc;3Cn;w~!a_4jkS)3(hPZebfD$ff)Q!~i@@ zKQ;uHC(EyHOSfgm!rjdhVPQFlivhuwd%ZmU2k6*&`z~&MWYw+K;Sg?LM|((P4!lD= z_B|KyQ^+chsJ^a>9o|cJx{I*5^7{`R$!ZsnP@P!LdsC=s%M7a3@ioWSMo_H}c4}M2 zy-8Ctn|V}=#3X`{p=%%1GaT&XD>v&fJHQB@ z>gQ-4`9!qw=+fbcgx;nWpQZXw9OFi|nC+Wf$h1o+Bved;zAHkS!HxM7wicH;Gn+-3 zN495B=TV2bdC@zXVb2%2ZH0t{x%e$2Mw2@{HJ7AdBE~fDkj}^xTF;u4XWrq2HQt8) z9Pt4yg65!}f_u4wTHxOVVf--tQwe_U-)`|EQ4F3Pi6@Na(wnH{c`1EmFb30d?Y=5` z%%$R{tH|7j%9BO$XQgFkX1ZTKiT*Lb>=8+gtS+7M%jnr>-CWadZ&#ygm!nCY;^rx~ zZeUz#c|$Gl3OX0B5wK5u-Mu|OmChW+`wzDE2&5`FdZ<&J@HhE{hV@Fx)Anwj z0>A!f<9o_Yme`+x@p6u-85g0%ODC6&U?vZ(2e`6>0H{a!T-9I@(UK!3*2T_?1KT2( zq*2HFf9Ix?*qV}{cT{Qy87C+UMyq*#g?BS@O@JH_ z2S>_w`e+NUNC7b)Gg8#wrN#V&ZqiskVMMOZjH31~8X4CK*}H z_RkH#%}Tv6`qgfo!9o9~l|42o%aBU1W{8l~8QM~$h+tL9{;atWsv+ZQWzx+6@9CJ3 z(^FNQ9fC5N<)`~vhu;nPI7%#rU3dNi4ntEN$x$uDbQ_n)Juj0;cby2|r$0@Nwsss) zGm&dnX52VboUR8uHC5@Z(p5U`bs@HWu#gK%M(ZTupS!@gc=)y1Pws^3wkFx;;q@F@ zmVzXMpEecraCp>|63G#U6CQ9jpH6!~58%FlW_euPen2-!2x|(-LJ#Ru5fX%3-;mq# zNl^ktegfrpOED1@eoxq6vIR8Hv;{X9SZh;HIex}t-y(JA`<#`nv&vD0`4*2U4mtV` zHytUzP1uZe>v(EdrcGC0zd}(n6?jMmkJ>em2N(ePUzNdAy?7q1$S!KX3msxt{)b8$ zrsdsDp6rV8rM@{EfdBbwSD)TvH{es(M9=NJtGnxipo4{dpX1pl9xZR!s%&%U7y918zzr+ci;n*QL$mz-F>YY4c|UVeBq|XvKiKe%7Th2lDwl4N^Z9&jf*5oEhHtL*WXebpM80rr|a|J zeTmIs8|Zy!A9s67)cb0=QfJD*gH%5NUbh9327DU%NPwp?`Zu2DfB4{;!^oD|8?z~D3(-i=>EEnTR{d=eB z|M)@CKVA6`h%zXhFM3}9(y1`~BgQ@GcP6+ko9-ST_dQ{BUexn8z!*(~wdYY1!`=ZMeST>K-WDKoG z-`Ub-9LTa{2Rb%Mx1^6W=TgSDJJ5X-kpfL(&b)+M7)zU4%Y+67W4nV>u;4*Tzzon( zW%=e}7N)zQ8>f4ViwxT}q3lnP#$lG&FQfAi0TQPxbgtc0=D~SxU2J}B{g2lbf0zDB zW*sc(u4{btqB_rFC=?be^={Nd^=V(&EB~jnz_7or}Q2K3PUw@sDI(H3mzi_uh z)xA#BttG3a7SDeMRB)-YJ5%?FCq;e|}bL zmYG<@&)8h;4`pjX_#jb?(J)KZ?8T1w2O9Ct)UKurFEWljgrD~fw>i&f%yRB0!os0{ zGJK{?r0oX^KBPGEDKw&KUwI(8HwZtrt1lv@qs->}4KDWloPK$ZCG?o-K(-WBGx_7{ zcjwck>zK}w`X13JN{*p}-KDo!P(M7BS6P%Bi7@+}jrFvRr#Y&><%)Bj^txF~lw6*9 zNJSib>puWC@SRqkQsMaOzBQd6pp+qoG%1V6)Wt_3@u z3C5Q6tTxD<`!zjM{0CrI@bG?s-@k^}%_HwTUmBhe;ogajkX(dH;1QC1vRwl3miskw zGosZ3iQdKGwW7jp3dSI`59QZ!k`wSj@`NRqy-z%s`c1JFTgPR{wWpi3P0QN-8R}=_E)*=bMszxzjDC;W4c58$pK& zk>~4&h>DyZVL~e)^6q2mW!93(i=mT=5y$z;mOOIQj;1gBbwf6!ajdW9FNx_ls^} zY#+eo6ezl=HmGK*QU9Z?%exFR?;=e~J5F53ae@y!iF_B(ly_{ndt0`$cHF%b+9G5w zZby_uV4R)$wXzn_*lZRw)fgAKJvcI^#nCONk9mnc5Ri?`J52+Lppu0xL>oeIauV%6 z|4nNGMT=&fE%iF1RQJcWY`;+tl6@<@+Ij| zy;s+Ldua^DYOX@DV=^IIKvsurE(*VT!=T|1>jN$J^_XmwLxF?jiPKEUb0nnprC>5r zVzHn8#|4^nEX5o9`EC}#>t38lmp$MJ6?r8eO-^K9x#=EIEpjAXq1>o4&D!mgh64RS ziBW2$#DdH7X_xGiwPyai8sXB@=%n>}xS1b23uoM=p)PA%&7H`bntRD@`JkJ@&228_ zJAx1y4tkKE(H3zuK)KCSt(WtGXt1fEJcJJmOBUf{XOuqF>+K$!JJu z$`CI~Yn*uIQ~7u<(NqF8M*J7IE}9|KJhr9Z7P)NeGqv4WL5TS32u7RJ@_|d|xkDKo zn=#dd0NFoyNsr3LPz3Y#T77kI-$Fv&g`t9IcU}MG4b?nNVN$2o$nAY6_Xc0PmhV;A zQxP)XT?CpA=8E=_lWWc->}E*{$z(f2LU`TIS}#34+3}y5-3`1O?$Ndn-rbsz-5cw? z2^&7(z2wl*%IQKenduqVzP9B4#1%;9Xdd8KqlN?UPl(>!rPmOpJnCYdJ{Q1b_Z)fo zD+Pl)vPE4K|IxX4h8f6TZ3&V#{{BgHDbzBSp-)-d@};v-keXgP>6gu~=1t)5vSgJYf&E8f7Ps1_wA>gI2@g+Mr;Ce6kvEwZ|Mf=CrHT~0j3 z#ofi`T(MB`9}D2Ptk!bkz6?$2n0Xp#Y{F~^;eILjv;A_(ZXhAvS$o;}dfo_SsIyd2 zO+R+HFS2SG1$G}ioNPnJ+-K<9tPf~aMBeY*#nJU|F` z>?K;$%EpP72`x>MO#{n2CX|W!Tq&Mr?1ujwciANvtc2lD9xy%dc6wLGjfaRO+Dxqp z63z`<@T2_l(S!ny=6$$i7$+|_SB{%jTmX1#=jeb^BvI$Fv37)S6cDksIBEA`g=lss zQkIZxH<;UUa)f_)%It`La}6R!9sg!MVBelZ9g8LcU?JjbfKw>J_c+%FS1u$NbNr&$ zp@+uDmqKgleg&xTWOqhQ|FZ|yP0jU#8iC%nO0sKbtX4T{!>VmFo|ftT?NfenExv=w zu|+_3ny)u}mp7QB?~<+Rf@h29F4&AZ7J-x_<;p47&17NMe$M+f#g5Mm_f*IC+V7q) znom<5rOhRmD<$Nz=WG@O6RCYsM03`;^n*o5!;nsA2=C?PT%h7BD51L4o%8&xX+(TO zS6wVTm;#I$1n;-Ze8d{4H6Mt6J;mkS$bZ=Kp(vVZ{~#rW1d%u<EU!1ZtagvK-(6#vv3rjE>vGj_2wME3ksBe; zYAA#sqzeW`{5$4DAQ>a;wjpYEsb4+t`s%Ys2LgrSnc`7QAAhITX|44$1ngUjTBx{1 zPN?LS!omUvl3RCnU#ipNRHTE|>Z7j2mdjt|VArL*A2NMj5MoP)TYXMBw0To6SlL?8 zg}6B?j~o-Prm{~KNuI1oF-_SmdCm*kQQDInfaBQB%kp7pkn2Po#@@-u73w#I@>ALr zejh3v)MVVL08ePG_no{^{ z;K{?GYY?$3AqMLKk$chz7FfFrOb?p6V&K8^>Vvx%5;{13Kh8L>QCz4U{ceH#Znb;$ ztA6qW=cX6+eX9Y*wn$m1dTcwtj%$bb36p6SPc#ASa6(6`G*X{AW^#KQ#HtSy4^Mkc z3KP%spbslH=E3~MM1HSYT8Ufd?;|~(oTS+l^_O{J$!>rJxvWx}jJMJnjjjdfF z*NOGHp~dpi9t~zXcnuqiabxds3@Xe#r)vlNVZvwPX%Nq;L~%bIttn)hNr3U8A{qo(qhq@ zHv27`_#}|QK>tZR!yRMlUF&JxoH(L`1+yVA0qT+RH(D90)(3mfK+fR&04!W(wl(NCf=?!J-u}MxqdH7^ZFV4pWaFOk zIx~Ys<|#F@clW(Ef+o`=t8o)j46ZUu{aXJy28b~PfdGRh+Y8tsR^~p;_0m^PEO)|q z9|AR=f5m0;b9_vrrZn&G$@9cVdZvwoM6r9v|HN!1Ha7xD)Ew9ntjI^)Yf% zC#wqEKu+HK{S$H$Sz9h04gPr-H0g%U>cC>v&)3-O!|rMKu?K2EG79xO9|v+^Ex;%p z2WvdRY?AGVh1-ozXdW5G8MQZu`Q?8E;<^|2Eir6L{b2Yd+W@h6qWiP=O1;WSP;r0a znNIEc8x?-`GvB>19CD`Nv}yjsT!k8TLdWGBPaFLVT+%!hWQ84k~L{W>R^>-?CbOrm7Jt1$6>qVmM^!XG}>YOnU?4&yN#Uyq+3vQ(cL+TqQ#%)b< z2`yXXXmxNhm?X3fnQ9HvO?t>Fz)ib^IA38LS9-ve`trUliXmjq9a8J?+@y^FmU^$McL6 zPuo;!#}?QUUFqBo){5PiFtA`CgCn{gs#n0?RR%m6GjaYLSPbx>V<9}ir*Pp;?*xkf zR4Eszx{7z0Dh#p~#QO+FW(r0HKc;3f#WihCWq)Xu4tq`qx&qQ+8O=z&^SG|Hg9V>Z3{f5>}G5uE;jbAftW}F7!2g~fVF&`LF-wD zjArBRn9f{-BE%Jbzw|#F?chra%G}9+HrkaTnH-WOsAK-$jdrAG{*d3BYkEWeW20Tv zC^?GgSkm_IjdrX}y$LO_(atoA9hvpR5;5;u&iTXi_l2+X!_5cb0iWH7T6xwy>6ndI zIkK%Nac@~@pO0>nLY)w$^iW4Xp(1gFv}*w%gEjmA zw0EUZO`TgCuN6fEih@8yqM}Se5Fvmugrx|yLFPc1gd$QVF;b=gA+a(eLsf=b#xjHu zAVe8NkwGAkD~QaXAVWe`2!e?M9wCJ9<+eY*^{w7t-~HKtS?eU{tab9fd+&GeXQ)45 zC@WCAkR0~Fm~@SkNjTyN4v)|zQCsaq5nR12^&QQr6Jf-D_ppR?$>)HI&do0Nq%+GN z5{^jxOuEvgNVC-LoaZ^dn0isg**QJFGpPF@u9c&3tRy{@>N=7-5Q<(gj^UQ=kBUH1 z(b};UstRTuLA=%&cCjo*nRFb|4B{x6a*pzuEO=bILW5NFC%B}4a4r7V_&lC1AlieoGS81#SLl}Am2{%YSwur~u z`9E@#7g5uzUk#Lz{=qNsRE;@zgXBIxjqia=eqe+j1->8O@w=(%@8ihoL8z6&fUu@< zXR@KdD2XIl4%s)x#5Cnl5=8pqmhK0tt_vlA6_xcN7I_yG;>(rn zhj-)+bQ8pR(fR%=lKl56ByT?xb~;9d7un>g^yCRYGeu~PoS!A`?U>B+gpB|a_*Nv2 zKb}bl=S=(FarO9W`(KIIx*gyUGECMYVniDo1C~z`Kdq6FTqy^hYn9C(WjL!SFz=t%LT^! z9ExBzc0FtEYX5@rjoCO?PkW0B%Q&`A5X#_8wjPxCHRo(P=~~rDnCA(Gk?o$O?%qbU zZ**e_Flj=bx%U(8pHbGJVJz1o8$8GS*7bR*$5wj>=IjtdNZ>Eo1I-y^u+35jtbe5> zsKT9ich&iD1V(RA*I?SJa|StlPf>NG#l0lRdEF|c;&j5=Y(9Q)P7tOCO6nH$lgf$P z1q5G>r;lG|e^>DpVV{?+HA?+BTrDw@=a_bHqelF^%&$N2p%2<$7p?|W{c@xCW@HH6 zqDE(0YgNl4EJV&XV327;g{A7pmjZZUv&{o$Tl-vA@lJ1CZ2m9ygq;}MV!ig;VsquQ>lCj?x}pYCmK${V-{g?LzLd4&N4W1ptHSR9Wv7=A zi;tYAfPcNq^Wd;L1cKB-CRxp&B1JwXJRdV1^UQNUVCuF2^DW6EjslhZ7_RNNYQX1{ zg*g`II*3t$mb# zUqxpv4)s)J1$xuWU{nh#_Ei992~X9MrP~~IDzqpJ1XE&?$Nb5%LbP0n@rzhxjC3n@ z?aV*14Rr6%d+;)N3B1%l>2`GIwu2Q4vMD8KwAN63&IzY$MJF;2K7#Wex5RFmLQlIy zM;f5}G!nK>puAypyM`283k*y}`$yHlup+_Aw-nm@Y|`{rEpj>fGxI6u#Fw*9K)WY=R*o035f<7->!>8g z;hM*o-VamXaaZ0UjB9WFZsoF~vqJk${;+#Wxs+-s&e=7>GQJPt#JE_YMMD*6jIhSn zNBLoa*!�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 Date: Fri, 4 Aug 2023 13:47:15 -0400 Subject: [PATCH 48/61] adding koch examples --- examples/cartesian_koch_2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cartesian_koch_2.py b/examples/cartesian_koch_2.py index 127a3ea..a7ba693 100644 --- a/examples/cartesian_koch_2.py +++ b/examples/cartesian_koch_2.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya # # SPDX-License-Identifier: MIT - +# pylint: disable=unused-argument, use-dict-literal # Example adapted to use in CircuitPython and Microplot from # Heltonbiker # https://stackoverflow.com/questions/7409938/fractal-koch-curve @@ -36,7 +36,7 @@ def F(angle, coords, jump): def koch(steps, length=200, startPos=(0, 0)): pathcodes = "F" - for i in range(steps): + for _ in range(steps): pathcodes = pathcodes.replace("F", "FLFRFLF") jump = float(length) / (3**steps) From c24197f0fce4c527f637a9ee98b5aba30a399498 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 7 Aug 2023 18:30:20 -0400 Subject: [PATCH 49/61] adding_dial_example --- docs/examples.rst | 11 +++ docs/logging_dial.jpg | Bin 0 -> 23762 bytes examples/logging_with_dial_gauge.py | 103 ++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 docs/logging_dial.jpg create mode 100644 examples/logging_with_dial_gauge.py diff --git a/docs/examples.rst b/docs/examples.rst index f1a33ad..5783aa5 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -390,6 +390,17 @@ This example shows how to add limits to our plot :lines: 5- .. image:: ../docs/logging_limits.jpg + +Logging with Dial Gauge Library +--------------------------------------- + +This example shows how to add limits to our plot + +.. literalinclude:: ../examples/logging_with_dial_gauge.py + :caption: examples/logging_with_dial_gauge.py + :lines: 5- +.. image:: ../docs/logging_dial.jpg + ==================== SVG Examples ==================== diff --git a/docs/logging_dial.jpg b/docs/logging_dial.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b696816bc2679ee314a819d282d05883d3f5e9af GIT binary patch literal 23762 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 len(x): + y.pop(0) + + update_value = random.choice(random_numbers) + y.append(update_value) + + my_loggraph.draw_points(my_plot, x[0:dist], y[0:dist]) + + if dist > len(x): + my_dial.update(update_value) + else: + my_dial.update(y[i]) + display.refresh() + dist += 1 + time.sleep(0.5) From 302ac15b2382d3603eada108a72d309a25311827 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Mon, 7 Aug 2023 18:31:34 -0400 Subject: [PATCH 50/61] upd --- examples/logging_with_dial_gauge.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/logging_with_dial_gauge.py b/examples/logging_with_dial_gauge.py index 835a992..2b601c7 100644 --- a/examples/logging_with_dial_gauge.py +++ b/examples/logging_with_dial_gauge.py @@ -3,12 +3,13 @@ # SPDX-License-Identifier: MIT import time +import random import board import displayio -import random +from dial_gauge import DIAL_GAUGE from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging -from dial_gauge import DIAL_GAUGE + # In order to run this example you need to install the following library: # - CircuitPython_DIAL_GAUGE (from https://github.com/jposada202020/CircuitPython_DIAL_GAUGE) From 2dc3e6148783e71ae4eb4c775b4d6458848d8a97 Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 11 Aug 2023 22:11:14 -0400 Subject: [PATCH 51/61] correcting logging limits --- circuitpython_uplot/logging.py | 15 +++++++++------ pyproject.toml | 19 +++++++------------ 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/circuitpython_uplot/logging.py b/circuitpython_uplot/logging.py index f10cdf7..ec3d2a1 100644 --- a/circuitpython_uplot/logging.py +++ b/circuitpython_uplot/logging.py @@ -9,7 +9,7 @@ CircuitPython logging data graph -* Author(s): Jose D. Montoya +* Author: Jose D. Montoya """ @@ -87,6 +87,8 @@ def __init__( dtype=np.int16, ) plot._plot_palette[9] = limits_color + else: + self._limits = None self.draw_points(plot, x, y, fill) @@ -163,7 +165,8 @@ def draw_points(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: :return: None """ self.clear_plot(plot) - + if self._limits: + self._draw_limit_lines(plot) self.draw_new_lines(plot, x, y, fill) def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: @@ -215,17 +218,17 @@ def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> No def _draw_limit_lines(self, plot: Plot) -> None: draw_line( plot._plotbitmap, - plot._newxmin, + plot._newxmin + 1, self._limits[0], - plot._newxmax, + plot._newxmax - 1, self._limits[0], 9, ) draw_line( plot._plotbitmap, - plot._newxmin, + plot._newxmin + 1, self._limits[1], - plot._newxmax, + plot._newxmax - 1, self._limits[1], 9, ) diff --git a/pyproject.toml b/pyproject.toml index cbabdd6..3478d03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,24 +3,19 @@ # SPDX-License-Identifier: MIT [build-system] -requires = [ - "setuptools", - "wheel", - "setuptools-scm", -] +requires = ["setuptools", "wheel", "setuptools-scm"] [project] name = "circuitpython-uplot" description = "framework to display different plots in displayio. similar to widget" version = "0.0.0+auto.0" readme = "README.rst" -authors = [ - {name = "JDM", email = "uplot@mailmeto.mozmail.com"} -] -urls = {Homepage = "https://github.com/jposada202020/CircuitPython_uplot"} +authors = [{ name = "JDM", email = "uplot@mailmeto.mozmail.com" }] +urls = { Homepage = "https://github.com/jposada202020/CircuitPython_uplot" } keywords = [ "circuitpython", "uplot", + "microplot", "bar", "stackplot", "fillbetween", @@ -41,7 +36,7 @@ keywords = [ "plot", "plotter", ] -license = {text = "MIT"} +license = { text = "MIT" } classifiers = [ "Intended Audience :: Developers", "Topic :: Software Development :: Libraries", @@ -56,5 +51,5 @@ dynamic = ["dependencies", "optional-dependencies"] packages = ["circuitpython_uplot"] [tool.setuptools.dynamic] -dependencies = {file = ["requirements.txt"]} -optional-dependencies = {optional = {file = ["optional_requirements.txt"]}} +dependencies = { file = ["requirements.txt"] } +optional-dependencies = { optional = { file = ["optional_requirements.txt"] } } From a7a55431d52f7e119e3471477e809f479da5ef0f Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Fri, 11 Aug 2023 23:14:15 -0400 Subject: [PATCH 52/61] adding readme examples --- README.rst | 3 +++ circuitpython_uplot/shade.py | 2 +- docs/examples.rst | 4 ++-- docs/readme3.png | Bin 0 -> 9796 bytes docs/readme4.png | Bin 0 -> 34357 bytes 5 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 docs/readme3.png create mode 100644 docs/readme4.png diff --git a/README.rst b/README.rst index d4d76f4..f5e0df9 100644 --- a/README.rst +++ b/README.rst @@ -27,6 +27,9 @@ For detailed view of the library please refer to the `Quick start guide `_. Thanks to @Casainho diff --git a/circuitpython_uplot/shade.py b/circuitpython_uplot/shade.py index 23d9c78..4e7aca3 100644 --- a/circuitpython_uplot/shade.py +++ b/circuitpython_uplot/shade.py @@ -100,7 +100,7 @@ def __init__( plot._plotbitmap, min(xnorm), min(y1norm), - max(xnorm), + max(xnorm) + 1, max(y2norm), plot._index_colorused, ) diff --git a/docs/examples.rst b/docs/examples.rst index 5783aa5..71693cf 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -84,8 +84,8 @@ Scatter using different datasets Example showing how to use different datasets -.. literalinclude:: ../examples/scatter.py - :caption: examples/scatter.py +.. literalinclude:: ../examples/scatter_using_different_datasets.py + :caption: examples/scatter_using_different_datasets.py :lines: 5- .. image:: ../docs/scatter_using_different_datasets.jpg diff --git a/docs/readme3.png b/docs/readme3.png new file mode 100644 index 0000000000000000000000000000000000000000..2c469a3e2305c9ded6d9f7132e5de1348dbbcb9d GIT binary patch literal 9796 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 literal 0 HcmV?d00001 diff --git a/docs/readme4.png b/docs/readme4.png new file mode 100644 index 0000000000000000000000000000000000000000..52a764e8aa8efa6467f9f79942219c1dcf42954e GIT binary patch literal 34357 zcmZ6y1yCGY7cPpsgb>_4IKkb6OK|t#?(P+yZ2Ib z4Mo+=^zL4JttfZK_SI%)yU^DTe2Iz@zeqF=geV1{VmirwCYy3NW1dE7aB28NCB;L-( zFuQ^HC8cj9h(Dg|X`T#ah-2T7p?fP>Jf>6UYrtyicb|6cM2rhb#6?Ysr9$`> zh6rc{;g@)w9~WJ7BYR96<1bOB$87a+&RjoW+w45oH@G)uQE{;%UEXK`h8Fg^ODf31 z$~Xv}sc&fN@)XfSAA~h&h5F>(q?#I9GCz^hgB+p8ozBn2ri5K^YoU6OCGio0L4=ci zfrZnuqxxuf<#SVqjlle}j2op%@!B7Sg@r0w_(2uC#y&wpt8=KIf@xBj79`Chf4FdL zmCIn$TdcGFooB*_MgC!0TXa|uVxtdZ+LvD3J7JB$@$Fv0H2{?FP|D0cOjY*GkrNyz zLG_bGXXJ(0GY516oq2PU{DjBYCraMsQHFmhg1IMoYkT~~%3tS8Ocz4{iZ*~$Tc|l6 zm2Rr)msZnn0Y|JfbLQC-j|Sbn@^wp><>w6U#{#PfeqGbneSQ+ACXzJ(iXutMN1|-h zAy*p=FB?0%QfGj9UsQU`Z{962zNAHx;ignUeW)Qc{-jCh_;-NeY9SN}i~iXQxvpbB zp>UuN=jBPh(VlbQ@Z6YyBc>8@7A&M(KYp02T}$gFP+idOr)d+L@VUoCJF)Z20;MM}xgb)Wgy#1kM+zOOjm}&C3RM(}@V-Ds35-Omic5S|BrH-h z3N5lVx{j%?SEk{az*m&7iw%gq@uR_Qby$fakDgfe6GzKEr(2)Q$8)Y82akW8yW3Cf zZQ2HQxlrry=a&`oZP{7n%8Fq<{)S64xmgm{jIU}vd(Ae^1hl2e6}E28-))Y>p7|;A zhE9fIO}V8TgCC(C47)z(8eyC=`*(O?pQf*g(Jo{)2UVpiG(&A`4%K8cNMAN6{XJ{; zFV=MyIDT5Q&tQsr`T9qpgarFRA;I*w)D2yH&Z`IY4{9T_rb)AvFA5& zY#tN#!r&!PYKc8y!}r$38AvI^rAU5Aa#96+J?F{aGa~izZXYV$J^}hthuUkstVi@j z-npDgSZWa0dNM2UUg?oVi!c%e!KbgLr;43$E>ZSHxg#B~qqUBRHb&^;$ z87;nR0SKjJzPHgNQ*{L_&pdt#g1IS~x2-t-G7T%VkE*4Ct{Va?jS1IemZpL*1y5X0 zEdO$1p7prhqW5Q$ezi{9mu9+!)fK4cpgzjh{bft5x+es3_yL@HkMq)9JN(1RI`1M= zu$0PWm@t;YMFNgdGg=QyGOzRaHqgL;L|8%hL;CsQ?*zt9W*x;vftDvC=wS)%hGOBT z?||7oGm5l3B&qXXTVWjp)*FmO_d15UU6gB!j*iTuzvxsSHOPi9WV(H*Wi^D0gt8iV z?ZR}rm9XqMFTB#fpS-HxXi^q(E?%jl(K~cxo%_?ejK0}cv@DuEtESz|Fu6PY3NXUsqCxWyR_)5MS{j zvFYI^IPjWnt8N@~^2wvO`g@mU#KwmqSsoe;YoeYrh%?`p=RlM0Tz!unuVmsx%t4-n zE-MiAch17#sXf^(^}Tc5D#JLxe#(oWm5~_Ww%N-tZAT!BaNxH-p3LxcPtzbV+=N2p zI4J4=qD16DcNcH$>Z(obbgdY|z>ByLrLs!BmG%@Hpe;QWuGv>&@k7?k zVPwXgglj^Gap!wvO_uB!u&cd_O9!UWpv$_}lKx3sGuvK|pxoI@d7M-1n;3?s9Mjy_ z)dK~)89(nii=t27YG~c@JG^il>tWq6!PjtZYBulF45pew5ZXH(vrEKX0TKo77Ethq z(aSvZOl|V}s%ggUFlk7!MVQk7;muwc`#)$cm;?6ZFNy`|>uI163^WH*!lPW!_lIsd zyk+SgC>eL9ZKJ;MB-R72)WoX{r{(mr{6s|Pdb?4J#dNC~b5EC2-0 z6Ma&Ncj};!g>s(e-V{V^?TBp5^#QuJJhWI%So3QIUZ*=~A9QmuRzV*_f&qlJ`>Dk( ze4$&xz5zNie^rvj5G}HfM8*@)L2D9LGbaDubo8nBz`qrB^hV|tD+!GJaG2kra$@;T zxjIpy081!7UxtF&Sz7Wowq~;b>iGNhXSPi^;>0ITCM@Yj8f?D%$yUVp6aHM8ra{|p z=NYwT@?D^xacBG<)#$#Yn11;(F&uf_t;g5I9qUJM-1PKy_MY7q((f&bM{T{BH_9$f z$MK&)cB2>N1*p0b5=FS@xB}>+gbV>Z?!W4#@vhf1x~4_9_>;(buW(x)3EIy`9@rul z?}Vj$68r~jsmnNL&(8Iu`_qxBZ_zR3HhbjGhuN5kM{HUUAK$q@>89btMWIcbw@eWG z^91#WYddeh50s7&(J-8gIive~SsEc2#i`XApU{YJ+u|O4*As%EedS$|kOeyxv5*P< zp_Fwrr?ZF>ci^l@Kl_6y*(-1%`9h5r-AprIRXCpT9=cY!luQk=9A4|eg&=YyyNWN0 z&6D%p_&V|QbPh{A;~D@y@3tq!KYo>jwawLK^`=7Wwo!nnVO6^3@v#>}HC z`{knY4cXElZYQ-Ph&tMo)<6cE7-YG}z75z8&3OT+^;6bnvi{CYft~U`tq8yqXRB5) zCAAYENu$-L7s8gbm;?Sm!f1C;zMyIMJcC%^yz!-ZKmnP<;|Fnc0|R@h-V63Q7YzN3s(i53 z5O^n{{*y&96wvNtBHNk|T@}JtP!&p15t5AHgtFsxmPLZ{$9xic5k3o+6sCp)_M?oE zso@mmwd(Oi&dUkSpe=&`ebfmWb*$d&DMlcN?9eG~lfL=Fs$%;ii2FI& z(@!dWk+@zexA3M!eZuY@wJV;F*A{gNwkq=0d3)!9t$#$2EtGd_>8i^KR*+cMyGu!W zw<-;}V_aNw81*}B?b;u)D{q1sVkg?>sp0~1e--Ff4zHMrjKFaZ9fm0%Gh1zzeK-cN z3!Zo8$X{V;_0()U^sJo;e;~H}?KXw5o>IE!UhV$-2cz-==r;!P5v8IdHJswt`nBB#ni-d>z!q$ceR&P6#9(pq05Gu-qt`jxLko@ES#;C&~=#d zP=(2S6XrH>maUrD#CcWrYha(fWjd9@rjp*aFzds3ZYX!5jmXNF!dP_ww?fR*SV>UG z)X$Iu1ybsp&qr|~XTnn%qqU?fZ?D79HEpJ^d^C20 z;IqK@>A$@ECwI+Rl0R#BZ%%!*5}%D5c~*2y7hUJG<8sU}F52n@5LEx&g*nfp6_$7<^;e0>yAwF zfrHW94xOnf);d!Lnxsq5T3NagCP{?ql%J&7X&&{n!fUlNOW?C*@R$qW(WEdDRo95K z^mFs8qvrEjH#?`|IJ9)kyq^oBa-`r*w0}qFvNH~DCNn=`bz;z75J#aqExfK#gsC4! z`wB(e@VVv@nNo09VtPtXB^)!qPyl>#a%WcnlA>wJ#_ z-+Y2cBsPF2*)6a78kEcmXHXWJ@;($H&AdXV_Ks-k7c`!E5Eo)KR_NX}``Zbk{$K@0 z_E+A|t`VPKA@!>9O!(&c9$TA`(Zc*3540_<+fE*^L!o6fq`Z8z-PrS8lbT z)AdGeaIs;mpcSodb+^7`W&)KYQ|4+aft6Mp9T52Dl6+|+>gw|ke2cDS%~bXhafUxU zXhX&5J%Lir^^qgkGIRmM6^o^6Nnld;d=%ql+PyYU)ZjpY6xbgkT_aq=%r=pDL$8}a zEzFbMfv9M{j!lAL*!WTC)gBg$@hsI%(1*Dk$zn(AOU=R!-%2!Sx*9%XbTZU|14YP? zpx1uqKUxe|vOTFehebjZg+&j;@tx>K>nJT5RaZ`S@pQ)BuFkzXttEHicigCNuacDf z@@BN+##FoJ@F|9$#VU!N06m!cayMBdh2pneSAv|(7g@Y!NM%My;UfIz)5JIE8vM;$ z)u_hqml{qP;{=cHv`f1?5BLFDbRh(@qSmoKtX279o&Zg$UwOa@sS~h^+Z$5WLC(9( zO@Z))f&Z?PlQtNNX~}nj1MqnmEVZ+gc@uc9^kVHh}n&H`dk|6ATrI3Bp`Zbq0TPY^Try?LgX&{lm0G+!R@7rt>|*OA+wYHnw~ zuEo!C1j%hjKc7@8p%)-C8tuQ^IP>_PoVoApB^y)H8(LUJylJyw+40Yc>yJtb ztSWf@(M~{Oh20jzo$+e#Q$L_te0fskrToG_TAauj9XV~Z`vQQ*EZ}fG0Vlj>#`WV=N>sjgLrIoK{w#k!<^Uo(g3Lm=dzW!oi;fKHwv%+h0 znN}L}Z==RGXh@u_bBU?P7gX_rCD*Fp;x_5C6rLGu)v=#e~3-i5&%;|W=>uQKs_dE%UUsa)N$BKAI7XrnKL zv^5`zqi88Zb^2ExnAKC`EPK0E(vHWrBR3~_d>60hljpW%{NBEIu}c%&JLThPf%oH2 z-F(LHMr!9|eFo%hiS+1be)#b*EdIY_qm}%TvODde=iRmk(Wv`K59Vod-*vB1<&f*p z|1=}%Q^&i``2^pI-c%NO(wA=|xpx6Et4Y8@e@{sF6~HaIisF!}c~pZ{Q5$X&?O?PD zV*IFzL(Wx}j{d*$zbJb@h;=yJ+qUsx0lY2?1e!<4jX!GeeUp)Yszxx#z=4BVK5&@h zP9IDAEavJ%2oybv9+JT?KPIa8v3u*_nCayRh=S2R0Lp3xPTMILUCCXI%&xyV)vR@6 zu;>r2y3>fzJO*Ehol-Zl+!QPk+#EI)Aj(znLOK!x9!8HZa9zNxbeF)%T1J1{; zTfPM_aXyCi7|{kKpy3#SCn>FD0yL#&c;lV?U99*B>B%14Xn&Gxp(hPdeP&W>8cVW} zpO>#%fr=o;Q)IclO44f7V;HGji_0r`RH?S*+BiR4JWegz}8#FXP*o*BG-(9flIdLVL zi3VFV?^cH?KP+x44<1i$N!w>4W5~x-H+;D<7!HCcP)v=zNZ@?jnJ|k!c#Qtgx?5r= z6a4CAL3)?vDd_32#8>ZAz~1tx2&VcJ)Z1B2z#+_pWN$j7=KF0X+wAG7#fviOsA@LG zqR^Ajc5o^_)P3X zGSecUt*JDni*#F4cwe8BdN zMk6au#A+2sEB{%U0Vu*CWJCn_CmE~oH%|RylKQK>pH7mL?&-09sNO2{ZfmBUMT){0d8$**iq}Fsb z61bXYqw=y2Dnn3TK@g*-WQmdkXPD@B6Gz;U;vZNR!hgrAT7NXyU02B5%f2!v+JxaA z{y0>p#Nd~801W$t0SRi|q1z|wB@dkRs%gZxp~_jt1E*_=@CNV>aS@Nr?qS$Nw;c(K zdhG`uOYtgv{li>K!^M#DBwaWm(Lpx;o?7ynUt;K>IJ?XiF`Fo}g< zp`A$g8R^*yNoSnmVngBppm{|G+GD!nL%adpzdLILkwS8W3MIi1zBs~GG@s;*ph8WP zDKH`%fl;S2;b+f!;S7Q{L`iA=CREV#OUrsbKB=4$Q81|bb#lUMlJ}U7;x`)~BRx1q zg&BkQ(W4nVfVe5-zgZY3k6phdz42P)_xuw04%c`;ooSJ6XDg^ks?yAHt~E_+V^MB` zl**rI_&g2c>`o01k%=vVj$7GuWVBMA*uW@$o+Q_UNM9d1g7ckteQzuG+|{D@Dtw%l zOkSm3{u0Vf8_MN}o}P{t9Ki`(9iyCxL0FL&r2vN`FyQ#~2Tiu1)7cBbQ`g3AgFfgE zeQ37DotuXzwaQoOQduL0LM!#@lFjfF0>gaz0NVLm1)*>l{|U(|l8)Cnlv0N$%Fc$I z1FK%l*!Ir_*|<6qM#!Hg+t($?O#Si1k1E2i=VU=2g|i8+o~daMke5$b9O@ZjFf9Zpmaxx+~0?ftHy7R0+& zwZ*-hq7P%>dritf_1P%LMMUGT<$&HCVd-v|3^@nS0kIV=`aZr3P=tqN+b+F%@q2s$ zsXvZ7xER$9*~M+Dn#32<{|(|$)+x07OzNF1lP)40n!EfW%K_K`q2eGOiwNSfl)6e{ zs2X9>xKIH3uZ*|dXki;7HQ6!Ri}l-FBSp+EG)3BcHV#2Qzsf?%ROHyIHg=g?XwL82UjxY!g-Dx1Ai5e50>UV|R7yaAzDvA^n-2 z081e~mAqD&EzGhz{|5MWy0JTwWxT#iLugZrUksqxe8Da zAVr9Q$RbR*ans}SLrhi>E74K)jA{__<6$nIC^GXaCCr9FG6kSNfZIO4)BWkSFwf zS7ij)WMQ4NcGFpIflGs5XSq%hBN+md80rE4EG!7pRTiix0If#OY^Pj>Y(QW}C`RiYs$>;z-S^aPusP zi>8mvysoR^m4%y{&2J^l3JZ~I!xl0>FopE~DvzqaT(Jwt1tgk!*+*)4Dn;q!L%-&~@ z0yND#3c!G5`y5{5#P?cyyL)%^8ir=Zn{qc*BfMJ-Zz`%boRXtB1nc(4&872#(uFbI zIDok?bb0X*7hu~NFd&LDC?MC7FQ4lx#nOA?7P2;NPzG#4aaiTvvKYy}pV0fJLGW;b z@p+=L>`%Y7CPtdfE~ zs{v4@trRNBq1)q+^XqFkh>xAVs?eC0KJ7|Z%bp+iN)6{^X;OW?M0%dkn$_g`a3TaT z8{Y`;NC-G+?QS7k)m5a7B46k|v5p=vv4(lbhw39inzc_2iJcZs91yB-;vH^^wz~QZ zl-8GG2GNDEIYxL0K&c@5=nn*$Kt^C%=A6h6(+yHop$n0|<5! z`bZO0dSmXKCHh;mF>DRocap9j{c~a?kQ%h_3iv^fStmlSG2tk-<|rBA%xetkXY-z` zwT8^b_&b93s~7=I2E%D_z!V0f(m04iK^4*Iy5mubD#~f349)I)@dRuiF_nMZgTh1<*1N08v-WW1-ZNQ^7b{ie z2K9)W)9)Z3CCbU0jT(Y@U7Ebk;{;|BM18!G+{pt)LhG3 z@flXDTw@xYBGmSmsTC|AJIj}bh8o?eLzDfLR`vm|M9*Fbigs{!&^7YVB=Qhhm8q3D z^>;GD2WK~h>*wQLF=jDrXmOg`)PjCo+pO?zeLo7cS#t^Bjork90PFj5)G{rYH{+o8 z@vlf0JMZKhU)m2Ri*1tAoV1HAAn9<-RnyB3s|87R${NK%;nau-kXxd&?YySN{?Ibi znt`u@P;{(dz;tr3Q@Ac8Jocq0!^T|+tH1S5lg+Nrlq7RlOo78CdxerBhJ6r(3o-;* zDOvn&>Kr+=Y;r7h?c;NidwP;JA$N{q=_Y(xV)hPB8@XTIti5FNvYM|LD9(Vo>I1<9 zAFq&9YxDzbu>ce+~bnV-g}yrFuEIj*a8DHe}w6)g=X zPK7G0Jk_?)V^*>;uYPy?xY#1l4uh6ST*q|hb@}wSZEh!3)$4TQa#wy+Go!`enE%l5 z$!7)53!-ko_Kq0w9YoHM80h6!Ko!+DcqbJd4Wsl}7}Pg(=-j`Q!*X*gySOPHDZIb= zolY?{gDOJU`RKhL9Rbbx*7trr$)(5EBtxKC-8Aa=>1-JJnyi#NY-0g~GzHtO0F6o; zHA2Zx+Xjk3zNZ~@BQ%6-OLAQZoDc;QS{#Y`J(|;JWucKLD$Hn6<~;sx!#b}`^%247 zun4dB-y^Ph=RXMOSp)UR#W8sKNK0as;k5`gp&MzPb4x@adwPD%*7cE2Z1NMRd3>`Gcm9i0aO@JN%+o zdLiQHQ`&lI4D2bt$INk_TF2&KK{rX=vTIaR?uq}bGk{R|kZ@54>aBtx-O5k$^C!(y z&`vM{K6>0*+Y}Y%FQ9)vQFhjh-38&uD6~`PWq|6KTv( zmB=D@u5LH34mN5|Xa2)pUba-G&4ZywJ0Wp|>ng-fG_hHDwB}i~kcP_)P<)4DA?WcnfIs$@S~W|Wc2`QOS3$_VP@wW zDT0YmM8WEb=_Y0 znRpWtZKdV}_%3}SgGP4FfpCBKj^VZK@<7qn)NXbICEohgfgGm zkPd&+H8(R;&ZG&^X#XN24#p$ImgOJVFl%)?8lWs;hAylBI__G>Fwi4tm2&}*>M|=E zc1e_Vp?~Ro>Np-PgOFO74p`ov4lzg-*!*A}jghG!pozSZ5Z5iO3iew18Fkc*WQ!kB zB1fEMZ=+Np*Q5j*H*Hx-^|_FZQ@$YR{I3u^)UjWM>>+U|Qm?Io9l{7FKtx!nq&DeU zHWo-vLnyPA)XC-f@^S?}R(g0tsc-7rQTo*M5if-0dGMC;puZJF=_94s!>-3*@E{_e z?;(AAj4rfL5Zl~*;?n|eOUI|@pX_VZYQ*QfBSOCNF~i*n2Y*SNUj{4+DQ8in;0h;w&)R{?+WbLX&+Q7&OB}MNaZPdmDz}vaap%Rou zOpteR!)~w}b2Ir}xd!%mx%k8_R1()b{RlPD0K<9p0F6E$-+}S9CI7*{_b8q*a9IhW znJg9^IL`tbKLSnvm-E8FL5=wv@v@{kUzav^p&%cZys0xGH$<>e7R77aNARO@5v~y-d zRECNC*ddqLu3_l!T^6YSarbCMiZJ$X=zyS7yYkLHSWHQCzxe7p-{@Le`91O@J3rL$ zz8QO%ulO9`-O3F7HRK)E86>R)*ae6Rli;&0!~KRAEFLLK&~S}ts>s6E&p8ZgE=Kl{ zOGhud)&2&Z81l55F0uEtZ)M)tciL&lQV~suaS6tGbC>(HGXFO_LCv^HLL;!4Ym^;? zqYl)HU|*awU#}PFDE#=l8n zUtZMfH6LG_A+(!~jf|^g0%L5(Q zJfD8RSYlswvtO-3K4!q+Einp>%Cpd;(%GVP$zf%vOL_Sn{ppJfEz{d2IV-&>c~vC0 zCfAXA1@!sW?BrARo%}W$71GK}20xD*r7b$z$$1zt7t(v8-4Pu;sdp4meX1I~-_$0) zA=bTohPWnF7yYUA0;BhvOa8ME3o)MG#Rp#O4OA4flHQHKf4-@;^`2MDH}5iOShu;* zV(juBjR)g5tMkiId}UL~918D9=H05bH_Nop{?7Kh&dT4APnsYJMCQRvWJyuOQ^BXlR(+&~kgLg( zVwLY$1bAuI3*u9hU&LVb#S$x_bR?AO*sO91M02k{L(%f0N4DhzB-!RUo}X-b<(<8( za6He|1?1uhd1eOQMJWea(^CmX%cpSyGjXk(0=UK%D}oiQvAgWl6$%>hLXhDaZ9OZu zF@id9zAr2lLgF5Q+VwtuWO%QG-o^x8&|t3<-oVxt`0E0YXd5aC;xWs$4-KlI1QH|` zZ0wvgPuTmh;>fKLPZ!5fApq{VSLbAmV59InkKX%qxLszWZ%mQot?u}pec&Y^*VCqm zHBmYNR?ru|_ZDsQsikgku@}YY1wrr%O~3a?jAI}-qo?gOG@aI&PgTKhVb&UG2e+8< zG)uIOXmNNo6&ounCOEW$gUUb2J-BW`7{nbZjebj!8ul4cc555W zBHdz(PuzBD5awG0gBUjsX&s+?CqyvXqk^PKeK`m4VnOeDJ9|m11o%%NnFJU#Yw|E- ze|!5I{Mp&rV&1)!yMY^>17+a9 zFyQ0B2Vn>8KxEbjX;yfB?pCFtTak{APw7WmyLX&8?`wmMDKwMDQ<4phQ;s}&5i|+t z4DfVvs?dPxWrJ>)(`1l&xJWR8q^i2Q#803;KEuq%on12i<(J3b!sNHtG7ynPc%JhV47TL_b(@EJqcd5XENy8B*L0pu27{2zK1uAY+gSDivn{RBu=MTuPzJBk-40FqE2m6E&K!k%EflRGf9wfo^V`3WR8_{BR*5fzQfU5bF#hz(%xVt+&^{JbHp zMmxH314>Ahx%iIuoc8s)6INzwB==4Bw4Bt?R zs5Y~P)?y5kp?D=hoz1o>6J=T(8WKhQ1h>5{@*HQXmgJ-V`3^JxxYmFqu01N_q5Lca zAF_wNo3VM5tPZ%et~Tp7294^f0hjE}t7FXQl4PGmyst@xZ}$TWY=zJK^+_c5sB)>e z-f1JHbz2mYWKtXrBHuHCEst^WnVKMGGwhSx6fMT&tD(DQ)r4I7tFPfC&5k1UcJS{2N|A}7zS})BqXSU zXOJ+*2X3!;z--NWGgj|qWf35M^Tz!V=T;@5J?xmIfxd)9?srj zHIOc16~WqNZ-C&@Em1IfoSS8p+%Du0hlc#)nHH?u35L8oeSU^0*2TyQ)FM12f=_5> zZ0b*tL-BF7N{JR~*)VDT5-1&w0T+J0y^>(2=P<7fXbDrv0r_+H84 z$FpVo3LjhVZ%Eb=5*pI`{&Yk3)69bWy|@B#k#)UfwBz945^X;^T-M##I`0IYQ-Lx2 zr_G-Su6@58^EV5|jb?z1*Bx-YdD;$*z|@fSqu=h&JcO`eRgLm|9yWrWv&i{Lf5MX{ z>!zqv3SEz7jwHQKVcziN$y*R40~!u;pCC$D%{kRH)aG-m-u=!~Ud*CCKK3Ax1E^oS zf??T-AivfLzQKQ?3FAx{*d5YZA6WqhwDAD_S=fO$zG|2m%(eyH`Q}-vqh&dM*5A{p zuFooPMvYEv@y{kb!nQK}iai1mWiNNjb+PlNQkbRZbq)PxWySNsca}0}Y8y=+`jnL6 zIB3-N)LImd-dmA0j54}WK-&G}e9prD?{-&0E_kfTj)pHd-iy7S;{tc!YEJJ4JC`0i zry4sK`yDV2z16R&mWCDrP!_%=E87adUaRFa&2cE|`qK(-0aL=IRl5X6fX#(WmjJ&_tC{eS)xq%xxC^|6zTD+MYNeH~* zSBiuJkRadL?f?*PTgSzz@1QC}!=o}`6{nfk_0{a!dkE;ps_g$HuaytU>ISZ7_vPl? zr#*Mc0E2=v^u^1=okyo5O-}D>WH8#z9MjKS@3J5%M92{t6TKHSH*CJ}XeuKq55c@5 zQxCM+;rjkgbvyhwcjZ?oOv^jrzyH#>;BD5mulJnEZhO>4Idx7}JSOb~Mc(q!9>t)p zD33y8IxTXrIz*-c;iWElt-gZS&L&)byERX*tg&pv+ucIziiO@yyzKlqd=+c!x-eSKGK<8VTTZ+b~pG7f}se9@gNhPNL<{!*$V)7o6MlP5{OP%`cjp1)e zSB8HjgRpYFFf2l8Hk{^Gu}~luO|Q z-`2xs**}vsH)<{1sezIPqurF*ofz(y%NrGnM&`3Y6!Y6dm9)eepz^1IA&xZA>LsX! z$~7mfhU3f7Fj$vw7nF{-98Tw8^~@Mv*D*`qzbCeNoN#>AuMRf)-Z&;hf+%ak|DJHG zm{Gaw7NUnDjfP82wqM+kl_q)_izsO|D&*rjLO`~k*HviuYh*y4W*xi~Ph#kD)X&o) z3X5M27J_w2)|inedW&{3sVD)wZ^6Do7EAEED2d5RZ-MYczu z<#&+39Gf#@{+mm07^dkDM-KH}jJrHvi15S!2d`Xea`0ej<1<}QwRPt)YLX4wH~2m= z2s_^bk~$7DFxSsj#FRr%t5KDH42JVSXHa0UCPWdt(-U zZRgaH)!F)7bOz+G=(8I6UejqzSvKT+TeL6HFM8JRbKeb;-qTddDTC~>M?d8;qMh>F zo#Pdu63h*cvdz@oS39rMZeV_=g{Uh)05-GY&sg>KCwcWBsQhU3n2iITU;l>AoU9e} zvpj1|m{>62)IH5!^+}}Hi5(qX6HWWtuyJ= zYMmwM=*X&W_#K6CEBB5~k)zd&$f$$kZxCW9+n=_SBq$R(BlQInowAym$kn;@@@F|r zAZo=x0Kvrhp5N0g^D&wJW zbUU2rtRC&fujnoS5)D@Vt>D4ls)dROq2I*k7(r|W+dWvf28ZwPw3PRqNg}>tScD@a zMU3_PZ7KCW^8^kb-M->mvgBaIU0HVev;0ynuf!6E&3YO7a1+2)`njLoW?=>iz!%QuxIt>Gvno*O$V z`90nPu4c1f`1!3DZO^zjR#>rk+nAHZ^-+zibecPf*RtG&t?cIscaS;neJiZs&4`Y9 zkZ&>C5P75#PWr3Tc2IKdN_Xul`>BM_%OUBx-R3 zX44Cy70Bn{i6EUeB6ehtvrx4J@2`aYb+6fuTV#uY$XE=Us?kTMMn6D6Dv%(Ej>Rv= zchiqpGQDQ=o=-o1G1ZNVgvdqczsF^MK2Y2QRM`eGhFbG&jk2OnfQ2P@a~1F1#SpYz z0q(X^OHA^Y19)QsubW^7@M7OfU$Ij6e_4Pe{g-i(bp0N7zyPFYZlx9 zETwV=2$wzT!g$sgo(&oTnAvreredcb&D&8H3y|B}FTGPlT$kLR83Yh& z-QLxP8?m3=>YZ*)BwOxFul?SBh1)$f1zmkrY|GwVi^IU(YeY3GoKcLOu}KZ2tI{UBvx4fOO^2n~m7%>P9*i)42V6vyC`pY}SGr zZoDkpF{(lyM5IdFjm)GzgyUpK+}P-Q53P!%VKhNOFw0^pY~0$uX0n#>3n%!d5+~1* z+q-ujflGg+Gf{YS94yiT@!fK~s+W_3b4wSYV;zsAF_`E zRm|RSDX>i*?_Kuw{d<3wvb;^66yY-OBSn$mRlm3hSNAO+rO^KOA`M`C%c)#h*;uQO zz>uHDc+7@BPpTYMrZI|!&jKD{)lx^Z`6w~DDAKKb)@lJ;?p1A+)Yn9-g3hO(l%7{u zuU7GTW%7mJN9OYfh>-bg78!FD&fTFo4V0vxE24;^C#Wk&oAaKx!shtzR3to=1e_(i z?*+|^m&lG^(0sDz6JhVYQ#BbAUR6SrAT-pGdpy22rS;kQs(r${UaDPY;4+cP zQXJ(mU^IFy0W1ICv^E%g0ZJlrNI2F_s^?In0+)II?#hp?p?oM!bx8l$O#oY;3G`PEm;K4oc<-Pa2S!Y&$ot4QtbLM&W zp1pT@i~Q-f`Grz>7cDzTk^ep|&@l~-wQl%&db@o$%ebD--Tvd@$lxJz%q~W9KcLZ+iO=qJ^sKvBwO1r;`YGNKrD%NDy{a;nPXYvn9T{KDf=AvQ$iv(ZoW z==baW0)viJU1hI<%sSXN;5B?LTkux6v`id#HAt)Su{;A&*WM$bx8J5x z1gQVuvZSY+KZU#m`!4%#tC3Gx^ny!=eX;Q$f|NQ-HB`I`ExY7+aGR+4PNo`jMj#?BHWVto~K)Q=3)V5q=> zQW*P%ynu*N6O?QmOq$V> znAz~}Twz=HO3!!@@|J`D+!2F_g^=T)I(DPq?J63Yk7pl?N20X*+|K`m+GPdztW8av`J+EvkGuj18z zf{bWBZT{pqYxTeJ#aP{%P{@1qJ(3*HjdJXo3LNz;{3*I`b7ot`m?T7+!oa)IW8z^a z{9R{tw&qXWfcS^>{b6XhF;iZoY-oQP6`GzP3eXjbVxuBOmN)8{<(inMEN|PmBS}LG0oYrWRBfuSlIIx8AX1B zm2t9nlf_{JElF(h4}MFm<6Z{{6sH$5*X_81@uWG$k;LKK7Dpg2!1tNqKL`t*CJ7$iqlHv3za2Le(~YZ01;wQDiOtTOD8m4k9rE8~Q(?F4pVY z3E<={{+Ug6Ca60$?t*c*j3>L8H#@rsgn{`Ts@NaUJ~}z-r|(}9**;^1bN07rGBp8+x2(w`7MR>di+NTLd(DwWfj?s+fVN-);5@U4vx23) zM{Dnd>Gzz!!r;3E_654J8AbJbpgG@orCD0eHW29pm75Qo+K4xXbIQg0sLEm6adYUc zb}uXUYbtWBYhC$++8ya+%sYM$a16nX*fGK$sEz;G&&K!#kPsZuno19gSbYF8I@3{aedMgT=*)2k)pSuHW9N{f`?027zitAuQ6=NekCM zcgl2RgjEv)V~mP*AJaQTN>_1ORPS1Utq?!vK1)AW%Xb@xiDOLmuVvP27C^# z)+erRz2o(_Zfw~(D7hbs6_E08$(9v+Vl>R2U#Phk_I{EM$vQrtil*7Unah*;f@0-* zzkfd%oVi;0=pSPQ)%ANC$hxa65yx-I2Hg=Dy&QVbcBs0gzORj@$y#w>Ii0!2DSB<> zu{pT!AP$c2+0=c5L%E6GmRr)HG|W<@vc4R_At>?_HZh zkmpp5fAa=;5$cy^a-(Ox*ZyrO`B&e9{L71_vL%>T(WSB2aKWAOcS;$HIu8h=X62+b zJrY%t=Ll1@h{b_0zkA7|4}-Ym$*_HFA&t!dsp2>gDjYSDb4kcNAXf~rPR`9P9{x{A z3G-k-zi#@2EO&DpsJxKu@@_A=m;Es4ruAE-#_Dfo(6(RKKRJ%4Pb{V~G^v|Xf53N$ znqgHF5`E;BQnaN_A{FrRV9afQapyVzG*?m^4=r7v!7E|t23 zB6oB^Y5s-+tN)(bNOc{1B%XxU4c2jdA-p`?n+o>GW}- zyqT%Wh4M_*)0>PP1}!14QaIG#5VaRpR+T}fXL`p#e|k0hC$lwQ5#a!gYccQ1U3!Lfvz1(b4v! zEnFjMrIAZ#?;8D7>WY0l`z6F9y8X(_ovTMK_eU!VO1T9>niT(^kTNCo>#lKbgNmK{ zA^f!B$K4;Z&({HPs7K8Q*6#sDk0f>>MHkCWvG1lv2LR3>K*o>e?<@4jx9>RCv@nEPe6Aoi5C*I=?}LOAYe2bw_C z@FUsgPk%Gm5SZ6tv(XO8dGy!%1#Cyqjp-r`M%voHub8`@Dc(*c-BwVgNA!e{vv}OS zYXzG5dL!x=>L}twognjkwPIQkzpH?ZN4n7?iC3hp(YH zIu9@6@id`$m|S@{?L8fAm8WBp499XhVL^paM2VzmLvaq_O;6bq-o5(rchMEds7cSr z#WEN_y@kV?hF(Gu60Rd)Nf(|am-LGQC(6!hkH(Gzu%|aZN zxpmK^3k?~N8d}L={YIuK$1TG+T}2=7G5`E?WIBV=r5xRsHiYe#ETLBtDv0*s_MTkcQXRp1 zCv=I*l{<)TV(Pz#3Jk5GcBGPmHqIu>=e|E30d7TmS8T-^xMg3^Z_kgg^gCouw;v%K zM(@+TGFiN99#|6}+Wed%ZO~fQmf|`Qa{mIR|CF%!)f?hN_r;X;wfB?z=kXU1+;GG=>-4&k(+XXjZk+GceehcNQE`Rd76Ap{CmSLTfy9WJd8-^lu7eOXULe3wZxc(| z*b|vxxaT+uij`q{7iscZZvH=s7WSF;o{IQo>@aN1&%y7J9eClZ61EEKXfNd^E@qVj zl%Fux-6B>mhPEg0Z2z+SQ%GzKEVO9W0Q_#E=2afeL(uy*PLvLw+eLRUOdq>S{}3WaZrh!!Np$3exe+$=LYrpIiN+L znK;6heGy8)$U{%O9aj2C0BxR)iW(T;H!|GNuf6VdIBq|ii9!vTjtzyTF3C-xcFvOb zp&Fvf7))MvrAV+CdnBQ7>>-JDYib3el)iCxY1O1@#z7Hj>LAPRpp92MYh8O^_C0CK zm)yB63cOYft29v7?-bGZ^Zl~rYU=m{{y|+q+0H)E0?1=d_VXlYWC!UzB>N^@_>P?zVGCvO!BWZM`bgVOX z>g|m`8WrNFf$9pMawIdv$AO1aV6&bwg5!YZM_=d6baThH|2SLq-*D>B!#q|zAu-OK z7zl>lpLW+ zIHV9NA6I`58Jtk$&U;ixc%GPGzA&Gj@}a_B@_b8@;uQ7EY*dLfb_qJJGn+elC1C$s zdHV%ELEo*>h_<$Gv@n~_R|W+8FNxP~zu#pqFVhZOdqXc(1YO_fx=P{)3!t203skuO zR>OWx6slgR(-zm3sP*~tUny&S=Iwywxy(XmkDR1>V>RH_mv8L*j)2B%BMl^&8)r@4 zllZ2tG{trdw_|vWQa@lr*DOU@rYoJD+-R-{&F59LzP3X@pY89dt;l+@=JFtY%_`{0 z`4tBY#Hj+no^xw>NOU z10E{8{dBo1Mz$oz|9I&j5)z0Be}6OxgKio7;`AAA*ONSB7dp_@c+Qm@h1xEz-a7av z5yI|KA1W2U6oIF%-S`pu9-3T#znAb#H@MnHaGTkn+=zb+VHSQM*WETr*U;ZeC1u-O z96ygKxZE1-?$*io9Gj#@$m~whKUleg;m5o!&Xmp z_k!?R6srfScwe6sYyLW7RWecyB^}jbz3V{ur9dRNo^;>dA#Zthg z-m}(#gK#9u>EcRH)7sI%whsDDo)bl5F{9GDWtH{Wh4gJUZCtCFL&5BS7kx&(+S*KQ@#Hqb&N!AIUD)y{T^6M&NuO^~ zd3E;O<5zH9xQq)1nVvM135h61B4>BhRla*VOJ{(+7(g&KG|jhZ3||Q(`57BT*0l@Y zT3_?rER^yV+8&$layw)5Z`YuYaF+yI%9HsZU0qdi481L!ehj~Vp!DRqUT z{+(IJ;!TW-<(`j4_+~ThxiZu%3!mMmq_L!h=_NVm{vZW+c;?;jCQ*m(yWyl+I-{Vq z6Rdw)L#%lS_RkmeW|+SVqrHGAdj0L?O;g>#$7ttaPUatLH(Y-Qwyuj_B^r!J9+9ob zI~@m(6AW&2gRg-mgL~f8p+bX5KP5dwai4;2)o;)NJGu-u7&Auhnu1aSA86_R;6%&I z;A!y7{8LFVz^;`(HO#;k($z$X5aY@p-n#awry(6CR1qRHx&rj&zl1d(a7?QHhM3^h zb5XE`3TAYwOc>mW8ng{HJhYK5s18l)!(OZgfoCF-FecLNby>>*+0T2`KYH1Mp5JZ58c3{ zs5wRhBQIV-Nx-lSWW?-qm)x?V}UI1_w)voR!`!l{xJlEM)) zvit3N3F88K#rP)fm}8K-W|_VA^P5RSb? zKiw`$!5?Z$cp=#_TktKsP6Pf62-bv)QDdn!YA_MbjpLD0Gt;(fP6qb!L{B!X?Z7!s zIArD^c?1IVv>SUIiz&7*4&!vZVgiHDzY^N}T_VbTEwhUOXf^xnazJ@Eps3V)frY{N zAn2dLq_n~J+K=A*Ngxk+j&qBm-B)dMyS^~`F^SgO3K^cx35G3d6pnGhYw-@{C%+ij z_Z$((pL`~Yir1!+N>%CaInz8S?{vMOO0YCLknyh$8HBh8s!VNcJW@hSPiMkCGVno* zLmXnmn=ZJ+~OV#%GYz0vY``xBf{@{{GEJV>w zCqlSKhNl{@x%=}5aX9NNxiPpeNZ7|ug{ID__&H!+cby_<SyAb6qCB-p=mKR|;R3KR!PDZ5S8ST#<-{ z)3U|x(NlXH&C>g8D~uZGwmFCBnG{Wl!x0%t)Gw=9&)3D2TTV zNz^KHNk+Dj)vdV#Q=S0Ysyx4HawB#4OmL#`=MO$=Nn_Vk9eSS^^fX{;U0{p0%9Pf5_u7PXbR~OlAQsOQ0!6fR7P7{Da${fWFrUi;j z|G4s*#8=iJYWc)CSXL?d50j%D1`(fqGCR-mMc{^cT=8s z3-)@EnnZvMH5SDivue+C=u88N@pES>rkT)JZwB0N9hHGCnH|G-QSLi-S%-#}izYPH zX4x!7*Rq>&4-{OYMMq%bsV!LMP2jgZoCkdvfLGf}U(d z$xe-b8~#h6kB}Kp-E2NaJC@d1`>RZX6cebn88ntNkvZVBJU3&vTrhS|Wd_8i+xm5? z4T`;o1{_JyDjT!V&3&%3Upd8`rOab5>Z62L52_zMy6;#f{lff86Hifp$RgR0_t3kGtK|Lau z0Z_L?+0v&OH-Dw)%3%8BVK&Q+w< z3z6~tvUX{!H=By6yPg9=Wg_^5EW6?quOPig&$@n+Wgp?xmKuRA6!ASR&_m1o&z?hUUI^YT4_YCeS;vQNX(c{GSS@G%*R9{=JiuhLd$3Wk2p1g{(5Bn zXE)xpgpdXjySJQ4NVz50LSfw}Y`E+PwdYRVKVLMs`Ipkqtlm_(_T?(}t>JBmNzKiG z+S&rKar8@4B$lxx1Adv|{2*C?^(M;UUDhuc^hXZHEohHZIIIM0ZbnHL|LSFL_NLo^ z7*V? zj&yJ$?Lydjr{k1uz|5(<_DevIb=kmkVHHn@8ITze<(u3tjegK0?aG0V7XP5&5$tr& zLaRS!X}5Z(u<%;aEhf!3vybmlf-KBJn{Yl0a6NetG1NQX-lTTUayJt1JRByC=Xy){ zI8!)*=k@7{kwf|#*5t4l2Y~$hU{M-S)+B2GR?q2I;`4y_Vx?)EO4i=xuboh5I{tUdK)s?*ob_NL-@Fa?Zt2>lP7xOEZuHb_0Po=$$G8^Sv9fmzYg zojkU)V^R=(wX%SxTmsIZitM<^?I-Y9+-og?^wgSHvUU@QrRoS1A*H4$*wzG4@oOM? z=x6o?TYuEX;PCcD@mq>Ti!e_z*!L@yPeOCqw3wd)!`4Nj${^RExb30gJ`5)7&%v!D zyrt^1bHCr+VT;gSJLTme*?*QYNe`OpRmM|R%ADC3Ty^O@)%0rd6zwwx20GwYZp~%S z_rnE#7T<%7ThNSrh^+l~Aha19x};<_WA{QW7}K3dpvg&2)&~y5NhdqV!?P3Clu45_ zwcIbm&gjq@aHIO)gkfvW<$G&P0y-G(Y;*AE5RYHcZ3|`5e>s^H2aqO6Y9p!COv=#9 zk7vF5eBO^q|0a;-6>Q9kjLg9_6KNKpLH+W9(*v>Jl4sk;?u(m9Q*^ydvTX2;vJakw zAsfI=@TLouMS-7s$;$PrK6>jSEjX-J6{WA~=6XJx7>1S+TvNq=H@XY7@wRs#Lt=)b zl)%5)FtK8M``B)Vf3j}i!f5QPxhLEn^M6`^+}`x(Y*+>LkM}!j?glC96?vi)6cgE7 zMOpk-0|G5uR>;39zaLA-wn63AX4A%NVMVEUR}WcgLoym&Y~3{2dQJnI z*9rRi_Fw_Hy3dckY&Qk&WBc7*8a%fCLu+ZKbi}$Evut^Dh=>{_`~a+{$CFKI!hUTH zRlp=;RNFt~e9w71YsTCTb$vvt9FVazoZv$lq!!dtDOz@3!C11+ouC4~O$kpZQb;>t zfDM%6ZQm`wq7ifZP2IWryGO*~s+rVJqJIMoAWE5I00v zq8IEOp^dLC(AK9RfMrynhjw?plA$m0)8kJLw%{Si@US`B(!YMmR{9I$@E*J4!9PZ} zMn%vqn$9nAmOrCE&KUfc#II@d!S#{OU%3?Z(#g>b;xon6wxd-y&&PYu_PHVmA@1!E zSCUsbdzzn-D}*yxBRQG*8Wg98KIDC%MmhIfutT-py`L)Q*|iq)cfT|37Es9CO0`dQ zCm+TAO*&spF~?fP4;;rciXklO?0ZsI{p5(Ow&mS9b#y3Z-9{y~qgJ_Z`BNZ575^XL zwYBES{4M-p#N+OUK(uRYL;&Fb12p?+9?MztbQyq)TpQus`jtPcvif)MuWnGr2g}0r z_DP`Q&X8KV0SAw&vEhKnkhh=$5xkQ_GvkD&%%mqlHO{d>zlbq)D&;*xLUL^{JZJ=K zBw4xf4-wsoF?yv>mYhzoZKp$)g@Oy%jC(-vF9D6K0>zAA=Wfxm9$sB5$F63t7M z6a7>>?XOdLE~g{y7fwZ7TE^}7zQeOQymO7CZ0|Q~KyrqL&33+1d*!G(s-HP)*{7~k z%TsqRORiZ@yoJ`fN^Z@!8uQcty^_=a(m|~v#^qNXLwu^@`O1B=4ugat%ikxOA7nF$ z|2Kwu(ulNPHV>m9O$)ze4Q18*3)-DWG3Yc4k~T(@>Jk5hPWL#|d*pA_^wPHwl1H9o z{4~VwycXU(Jb=#s-@r^SSdne;@8;a{B#v(Xw)d^QmGB+WFqT5stItu zYJ7O%yN(}Ka~u7}he=RH*b#tpuu1(0sa!{Y|A-@$V689x+;gHp_ z+f}m<2_NYt1AX_Zh#*HRHp|r;&v?0lcUP#6oNUC{-~BigB($=^?GgTSKGVdlr z%F`wwryZrcSt;^S{BJvySbt7z#sm3mJiR7&9?LHt+s?_s?$r$>LozeZ_^*p*Aw z&sw;YeC_&nNL^Aeh9<8zS=cM`jd{nG@f$WF;ERixL$4D(mPsUjoR`c2vmZtdR{(lN zvC+b9X0VDt%EWd_YC{H+&EJA}z~=1ZEZU`kTEyrJX-a02{KhZj5tva(jzld)h9~A4Bmw}ZeHqdC=97cD@14h2L$Bm+R2EF!pOD^>#bpDN zcyTS91=+98pvK$f;_iatL*}h529PpsW5_PwLU*PW)h=PjSqP($z!Qjb0s_8Y?Uycm zk|5XHPOX?tdNdD$j8R{U#LKm@wT(V%``;S>SQ~8sK$38>^HTGC?tOZRstM81Q73G! zzzAuZWWYS_C+C+4TcAm@?ZcUcsptc>tHyrk<-D3>(kGYqC#2Ut2?QF-pRsSjagmQ- z^Nm@nTE={jlFIGd((G?0=nX<}HpJ<1e)%MDn;D9KuIM@eY!XqYG#Vg6kkdRAcLUPt zU&>rU)^#Yu;o*3aViR}RoM*j%izpwZ8TgGqAF?f6ybb1y&KyZA zY`ACyy;@qU>{%nY9(I#~J5Ov?ciERBDcumLh38Qs^L-I6#rG9LH-X2gj_olITe@$< zPFGt$Dau>&na+}PoW)&s!V4W5zJqLj6Ddt?dbGC)7;g)O?Ypd2MPXLsYN6*~*my6#$(f`?uOtrLVg3P*^A$+%M}=uXm~>f1DPg|8rZ_ z=0&=gkE}XG8`?T85xm4rK8gZe9~z?&$5BAcTI~E|2pLdewv>K=d1<-(UX{h^Y}q&{ z20Koh=Ax@yQ_u^f&grEM!+68}p|)ci8qM4t+Pu~nTc^GCFE4lU@sDGFCw>P;Iw~)L zmm2}D+;2FUL7N=E#;K@O{Bz7y?0ka3WVP{Cj^i2DckVx_uyK znM`0Bjb=Wz^d7O_rl?4RS!0{GVk(trihr3&oDRV&f3)amUAfygEO= z0zB>z8fCaAO;$NBWUM>KG;T<6Bw8Mz!t)r5o!fgh^@78F|{&(S*D00ri?n0 z3);PUR>f&X&g9mQrX?yFZA2OPMf)#A!$E*udw~UEn^I&;j}5Fua^; zHJoArVIJ?Ghdp%pa~im}awU*xe28Bp%h2aIf6JRw;**NwT#2|=+s?a&Dk;S1nr-h@ zk|0=pJ5}kO{!bsBbU8VW{+Ty^a4vLg8-*T;;Wx08lurVGguSowTy*R=2&;)ppjF`f z#ZVdp{C=3fi8G|L<;Pw~uzT*FjZfL8wU%%hq~mV3+{X-%0uzF zc@y``{ml*9wH||xL6uJRz6P835})sAz3-)uqf%o*Ur8>ld~j=;Pb#^147CTr!@4^Y z3!{x1_OE8%shMl%c+=|2LU6~nMdcoeF)(q;=hTW~uEWGDyehbbYzVsOb@;B`A8vPM z-KfS!hX-M<_Jje2iK<5<<-|5p2B~RRUqIl3hMJmvEL@ZhiMjV}a{2xgLS4iDtM~T| zPnWG$TAJmwc)DE!WzM0!Kl2Jb*W4_%86=AEYTf0D8x)-629LzVHf2pys*62ER|av3V{wq}7WryM1l-`s3g?1v<^Cs&D4bQA%P? zbLIIdju%tkyz_%TCD<8O3|m>@6M48ee4ESL^K*N5H|HMx`iFrI&%ZIw>^)8nP=u2I zxw*2DFW+cd=|+4Fu?w5O?=#{Mt-lKs-`fsQ1o|kk;P&&h&!Gu@lCh|G2 z2TrKe`{;JeXYOEsJ#L0Xoo9PfpLg&zl)5vp$Hqwd%SuTP88TYLYT2|`hFG~`1A);2 zFFGV(;(7aBtfo5U8r12R5hD<`RfA=?uF~z;DG54FX3j$`g&sV7McDKAI`s6jy)#F$ zOUkJ&CZ*nn9j<$>pvh!<_dmu7P|!FPKC*__o+ofAcAv2LTfLZR>3styVmT@;&UKw&VhvO%W1D~o!NG9@tt(ll=mnJ`syi5RjTAVTeJPM zC!_I#nXhxMy#n=Fp|f{RRH4VBhGPuQloURSWz}79UmYa4@8Tv0Hrr8hGzSA)Zuyb% zRDSetmZh%Q`{JWdNndN&puB!Dtyp(@9Di7gx$x4rft_w-y;s~iP8V{GsRxPl>b!L5 zFN6fl{DK77=|?q*Afm$Gk(RkUWE;_?_*$m#kW1IUE-dufb9@>2;xC>a_ibRjO6?5=36?E8+&ZyA8o{dY8l2`h{{RD~ z_-`)fYvky+eo|fJtPLyt**2@+8$Y;pc7}+d`v1aDDJse}B-v2=0Vi**n=onoXM?go z=lAD#Nd>w-Z1wXJJLh=Rf=sfmj?NV)@#w3;ms=*Ma>n%FqF5Mh%&OREElP2XRI1J| zC66jCB9HW_d6+QQ{a`^XIfrt%L_^OMGl{A~;i=B~FWwA?MMs9hr#7_9Ey8$J^8wO5 za@GElpnq4ND0UK@m8J_UZ1riB!;>P<;lhF*tYU!e0laT05@TEN=6GbWD%jb6uuo%Y z)Q&XqI%p>+dm^n=kWX3Mz0fIxb^`EYbO##M6(C!zDz`9;T!qp~N#k|n^0X5_{z7zh!gX! zC^%XDp(Di8{TJ>SL+T1_v#5m4d#%_79y}+&S*|OVede_;~h?KyVCwl#x zBPii_59O5=U3tLO$gA5z*7q0fPU|%sHVnqvANxVy6Fi zj@{lZ0_F>S)T1;=CAei%p?qO<#4E71l>kI}HCZ*5KdN~2)4uyk98LAQ|4(EB;k_SS zFcrO|V-I#LARqX75OJKRUEAD})mCdq{-#SepZi((KjA)aMis)z`0}+ZY^qyaLRFmy z%^JS{{te114W*;%Nk8hwx!}dnR@3TYFGRxnyw?%LvAg7P#@*C)t(79)MQrl_3j#3sn z2c_38m$=WEX13=s;C*GA(I5awDl28U(@L*n<#RT_v8=Gfz7t}Ep>pEoO;GfUosBJx z)!RORP|z^nT=xTs4l093%;sI3pXDF#FT#pN8SPXv0|KKb_8YD!e9ixUioKBb3IfXp z3Jw`&TcD@hK&FUqd}sqYL7wpKH@~#bPK0a$oj2}6hG9G{Vx5TcJUPW%z1co>-Y$(M zkbtICgtNDdFPHwcqI>e#y0eZitQIjti6Ij-ub~6#pc@Q|s|lEZIa!~8%+%THZ^Lz| zE=OIw7A7`C2ZO)girvPFLRkUisc{?BiW75g=(%s&;YxMVe;@J9bynri*Viu8l?s0j z@wH^}`dLycnFru9Of$dGu|v)7 zikv}-2%&c77p%eV6%ZEsz(E?RjK-+3(8B!XBmWdZTIFD0VMz_gK2a#@P5|^ugd6|g z){0z%O${=>*cEO2>C)VNppfR7!ri+0kOqZb?5FST0`?t9#;IpHmm*Hv$zgr$1d&E@ z7~%~&lKq8cNHQPs-bGUx8N6Z#a0@mH=gb@(q5&-W$yq||v?@-x^wRHmONjD(eWLa{ z5Hy0qgH}bJ(%Pvz{l^TpQ;YAwpWw?`;gitkdCBvr2ABDn{I;}714blNFj8{}B!E2) z8Qz10KH;lgx`Rh4QJ=99SmySP&&T0 z%<`(0iNTusrTW_PwckBRV+)lx`nSF=dQ>!|sW%th#M74!z90KE)OeAVC1$~!u|Z2M z&S9U7RzHtruYcQw&Tin))P5=WNq3cjfND3l!OJMQNFA20J~GQ{)a^a0q&I1`FjsVB z$T2pLV!u>D++e3Tm8OL)^zQmNqR4B5g$gPkhDu%N)n><=p@K#}Dqc9C%UiNC+Qi}R zJ2yVQpu^2luXhsp*r3fiDDzS^|Ajc9EU)cBADH1&^=jcO{FjPD;Vfb|U~B6uBr`#c znDV3sndy*Na3-1na|ZCR-KA7Q&bHKhavokg}qA0&sRW3*C;rZv?4V zTad=n^Yy06w~WmG;?y*rRZem4mMuhou4O3w^LfJiLgYz~9_SUdjhsL3!rrZdnx#vL8*<%ZY z7YD;&`Bq)>7L@zd326X8l^z1&}wJTh4x} zcd(ACJ@-)pRZi+aqzYFw1Y_bHJqYK^(CS$HJl{9{%O~r6KyQswT#Om z99FT+tm4|((vyAO}vZsR{08sx0Xh~?lr=p9{M0Ji={bLnItgGBxhiz*KMK*j4{eoOYiZJkgysQra9(DjFJ{C&Th}Ly zy$_hSlCFb}4s0@y&h6?eS1b%CS%Wu8Pi_CKN~0lN(3qnq`< zeX$YWiVw#f?=JHcCQYi`N?K;IKcK7Oc@VpAZx{V8E`NL#mvKcz6ji2$x2(AqbLEHq z1$QC7q)(%$mx6oDj3`?iQu6?O`DI!TrC_-&K*QkYM5M8o(KQBW^Y4kIw;cRDrm z%{SN%2Jfh%URg>}Y_)pK8c)yjUwK~;s=_FIzo}W8!_3)My13fa&y+r0Cc5V#?IzD5H8U-?oF}H=saDLF-y7RT#zwbm}9`^TB zPp)(wCqg+THgek9#ww)Mor9)Xj%k3v!K{W0DhwYkxaHH*bqW3X^H*TgVOtdv- z9TG}j0TVsj_MLenTtZ?>X3krIclITr#+Qpjirr!DLU4GAVt4YOM9%0_a91LFXmDD~L z+5C+-2N7KqU(b^z?+V5HZap1zTE*V}v|csPzlT)PxSjj=*>il6wt{F*2&)&16WEvg zZ(!qELAzW-vM9zlt=Y~8U5w1aC=;?+Ke4GU>87FGY&?~~_4NU?=7$T2S?ffhM1;7s zwiEBCGjKVt}#q) zPGhL7NhouBtDSzC8CE(~m*$Bkf+o>^5?JVzmHfZIg=+ZH?Il3hvgFhnMP7xgh)c$@ zFo7n{s{AL;#YJ&`PDN=aU2)kiG2qHSwQRqMS^G|sV9bx9^v3+3Y|`N0W?8-mtMALL zQ)Ca$*=*Rq%6ksJ(zz8t2-y9U5Li*QU;80NBpW zlMu0=$ufNg4}F2id9mMpL3J><72RtRxhGHfCvJJKE!9yckUP?=1g_E387069edhritgPs(#M{zX zxajBf!*m*VSqn4%y*IusOvLb%za?z`PcR;!`5p^ZtoB9H;uEx+;CTn#FI`3CiZ-|9 zgE6<-2QFRPj!5*pV9NepnJd`&cT}s#+ndYN);xy}iCP_*S*aTbf@)~c{c+ZWuur=` z%{pv*R%31dM%w=vdMc(*ay25kidsp_nd$-^s($!rPwpo^LbEw^8BSnSG{Va_9-x4k zkHt%C;0fKo7P;O}RxL~%S#I$C@LOmzEdB9U1vSTdPm??yg!rU@(s6X8QNGS4acT_S zRI~qT{#7+4uTwYmkrynsy~Sx)lv3I`P<<5}V3z z+-7sFxvzfP|6R5Z>F%n8W_PG|@H|rz@D1wWwr(Fi7xq!0#m$vsLgXgJ=zdw=e9Gnr zLNKzuPGS_$qnQ9cKz@U0W{JV1%BeK!V^X0s>SoIt)YFNDWriu13XMfx?p7f57A`tg zr4<22`Xq4e0oZs?vHH=;{u#{Km++Uzw!M6>5jPjHJd< ziSdquA4Gf0hqG^qOxTz$O~97=EK16nx`sBf`)!ZhS+exa*a!)JU88L}>&EzH0K1e< zq*sm+T9}p#{9q<~><8e;8^KeuI|%xce~Kll$>G7&iM;%S{Xg>yK(D;qe(Qo2i?og) z^mB#pTB%!e+1b83QVrp9C7;b%mCr|8v={YzwG7gsYvq~P-! zm-k4lt{_*e|E&lMDE8}ZnU8P+Rd-bj%+>R3<(*TulAi>$=`%>$tw{8QMOvZi!wpf- zw$SK)X9P~xemC8i|BYbVR(jQ;_}5<&eTjPvytl#zU`^K%ic-j>dQC4t6jk+a_m!?E zgvb*TUfhZNbA10*g*xU_Sq_i9j_KteeFVc_NRyz04~U6qvQ4=4f%3;udsp?qSyC;( zqN3)O-?zn-G=EIZ*E@mm=@{gzg5pz_L*`e)OG88ZKgq5T)qKIVGtaSHcZdx`x*>A2 zUy%4{9%SiU?>R9cqkkVzbnL2!wl%)w-w#d;?8cvqN!}`g4@B5+xSk&7>rcS)sP`>cYApP ztkqesp*)M~r39E9R{b>SgMXfmD`efk_@5q}X1)?4T#oJ~DE{gmsQ6J54E?hi1i8{1 zrLiPn-&hG16enksNs21?>av%4<|o?4<(Jp zAb@0WEqwMPDdl8GP3V80ek|D!9fFzB-+J=uRo#SVf$mg8d$f7b$9s`#bC(pu@XVM& zaoozlf<|vQThl4Lj|Mr09Xg06#RDNqrrZvIpBW#m!qR-29Ji-vVFC^E00p4{s3iX& z3TO6qHAid6ivS=Zm|nl!aq9l9Lq_i2B3fq)iAATEDVgQOm%QV|Cyh8Yf<{z6dr7<$`$_!ZK&P3?)2}Ltg%RZa-Vw|DZ3pq8>g#;p*HEG(Lk90?U@K0C1a4wLumqs2EYEG#T6 zEG*^?Co!Bfwcf8)9I~*mu&}V`1-wMpP`uu6m6hXqwy?0Uu&`JJBrj>h^?qxFgg0VZ z&lVOI78Vv3bAksUW17VM)=1=jn{t0GEG#T6EG#;P14PRWhU@*Vq^RdOtd?#|SS{UT zOit~#T7+#K?LEi5c7EandDQCyK|Ho#s&yyrPe7@6gza8ZLF3A6#^~5B@j!QD^xFo}lOKU9m@u`;rvsmuX zD`0%S@!B`J>$mUX2h%@bK=Qc0iz7*C!U;tiBHsm;yWMAE-)kH=u#efw`OvvLJ>Fc; zAMZzF`vV6KP^z4t^ZxTafBf^lNPiap{Nc|B4jiCV4)L>JRf`A|CPRf+VRr=u9VXCfXTsz zotrrQCnw=GAShs@RC;utIG`3FLTknOwk_rbJ6|m3f_|MhL4VR#>HXSoi|$}vp#DE` WwU2M}EMT7i0000 Date: Mon, 28 Aug 2023 17:59:16 -0400 Subject: [PATCH 53/61] doc fix --- docs/conf.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 65d7fbc..c5bcb16 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -89,17 +89,10 @@ # on_rtd = os.environ.get("READTHEDOCS", None) == "True" -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] - except: - html_theme = "default" - html_theme_path = ["."] -else: - html_theme_path = ["."] +import sphinx_rtd_theme + +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 71b5731699a378342c66afd7ecf487991aec8ee1 Mon Sep 17 00:00:00 2001 From: JPOSADA202020 Date: Sun, 5 Jan 2025 06:26:44 -0500 Subject: [PATCH 54/61] compatibility_cp9 --- .github/workflows/build.yml | 111 +++++++++++++++++- .github/workflows/release_pypi.yml | 31 +++-- .pre-commit-config.yaml | 20 +++- .pylintrc | 2 +- examples/bar_3Dbars.py | 13 +- examples/bar_color_changing.py | 11 +- examples/bar_colorpalette.py | 2 +- examples/bar_example.py | 2 +- examples/bar_scale_example.py | 2 +- examples/bar_updating_values.py | 2 +- .../cartersian_and_scatter_polyfit_example.py | 8 +- examples/cartesian_advanced.py | 2 +- examples/cartesian_fill.py | 2 +- examples/cartesian_koch.py | 2 +- examples/cartesian_koch_2.py | 7 +- examples/cartesian_logging_data.py | 2 +- examples/cartesian_table.py | 2 +- examples/cartesian_trig_functions.py | 2 +- examples/display_shapes.py | 2 +- examples/fillbetween.py | 2 +- examples/integration_example.py | 2 +- examples/lissajous_curves.py | 2 +- examples/logging.py | 2 +- examples/logging_animation.py | 2 +- examples/logging_changing_values.py | 2 +- examples/logging_fill.py | 2 +- examples/logging_limits.py | 2 +- examples/logging_table.py | 2 +- examples/logging_with_dial_gauge.py | 2 +- examples/map.py | 2 +- examples/pie_example.py | 2 +- examples/plot_example.py | 2 +- examples/plot_line_styles.py | 26 +++- examples/plot_simpletest.py | 2 +- examples/polar_advanced.py | 2 +- examples/polar_example.py | 2 +- examples/polar_plots.py | 2 +- examples/readme_example.py | 2 +- examples/scatter.py | 2 +- examples/scatter_circle_radius.py | 10 +- examples/scatter_pointers.py | 2 +- examples/scatter_using_different_datasets.py | 18 ++- examples/shade_example.py | 2 +- examples/sparkline.py | 2 +- examples/stackplot.py | 2 +- examples/svg_example.py | 2 +- examples/tickparameters.py | 2 +- examples/uboxplot_example.py | 2 +- 48 files changed, 258 insertions(+), 73 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d76262..48e7c9f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,14 +1,113 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# SPDX-FileCopyrightText: 2023 Jose D. Montoya # -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: Unlicense name: Build CI -on: [pull_request, push] +on: + pull_request: + types: [opened, reopened] + push: jobs: - test: + build-wheel: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: jposada202020/workflows-circuitpython-libs/build@main + - uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - uses: actions/checkout@v3 + + - name: Build wheel + run: pip wheel -w dist --no-deps . + + - name: check dist + run: pipx run twine check dist/* + + - name: Archive wheel + uses: actions/upload-artifact@v3 + with: + name: wheel + path: ${{ github.workspace }}/dist/ + + linters: + runs-on: ubuntu-latest + steps: + + - uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - uses: actions/checkout@v3 + + - name: Install pre-commit and deps + run: pip install pre-commit -r requirements.txt + + - name: Setup problem matchers + uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 + + - name: Pre-commit hooks + run: pre-commit run --all-files + + build-bundles: + runs-on: ubuntu-latest + steps: + - name: Translate Repo Name For Build Tools filename_prefix + id: repo-name + run: | + echo repo-name=$( + echo ${{ github.repository }} | + awk -F '\/' '{ print tolower($2) }' | + tr '_' '-' + ) >> $GITHUB_OUTPUT + + - uses: actions/checkout@v3 + + - name: Set up Python 3.x + uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - name: Checkout tools repo + uses: actions/checkout@v3 + with: + repository: adafruit/actions-ci-circuitpython-libs + path: actions-ci + + - name: Install deps + run: | + source actions-ci/install.sh + + - name: Build assets + run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . + + - name: Archive bundles + uses: actions/upload-artifact@v3 + with: + name: bundles + path: ${{ github.workspace }}/bundles/ + + build-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Python 3.x + uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - name: Install deps + run: | + pip install -r docs/requirements.txt -r requirements.txt + + - name: Build docs + working-directory: docs + run: sphinx-build -E -W -b html . _build/html + + - name: Archive docs + uses: actions/upload-artifact@v3 + with: + name: docs + path: ${{ github.workspace }}/docs/_build/html diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml index 65775b7..160fce3 100644 --- a/.github/workflows/release_pypi.yml +++ b/.github/workflows/release_pypi.yml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# SPDX-FileCopyrightText: 2025 Jose D. Montoya # # SPDX-License-Identifier: MIT @@ -9,11 +9,28 @@ on: types: [published] jobs: - upload-release-assets: + pypi-publish: + name: Publish release to PyPI runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/circuitpython-uplot + permissions: + id-token: write steps: - - name: Run PyPI Release CI workflow - uses: adafruit/workflows-circuitpython-libs/release-pypi@main - with: - pypi-username: ${{ secrets.pypi_username }} - pypi-password: ${{ secrets.pypi_password }} + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + shell: bash + run: | + python -m pip install --upgrade pip + pip install --upgrade build + - name: Build package + run: | + find -type f -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) -exec sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" {} + + python -m build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d000ade..c0e8ede 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,27 +1,30 @@ -# SPDX-FileCopyrightText: 2023 Jose D. Montoya +# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò # # SPDX-License-Identifier: Unlicense repos: - repo: https://github.com/python/black - rev: 23.3.0 + rev: 24.10.0 hooks: - id: black - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v5.0.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace + - id: mixed-line-ending + args: + - --fix=lf - repo: https://github.com/pycqa/pylint - rev: v2.17.4 + rev: v3.3.1 hooks: - id: pylint name: pylint (library code) types: [python] args: - --disable=consider-using-f-string - exclude: "^(docs/|examples/|tests/)" + exclude: "^(docs/|examples/|tests/|setup.py$)" - id: pylint name: pylint (example code) description: Run pylint rules on "examples/*.py" files @@ -29,3 +32,10 @@ repos: files: "^examples/" args: - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code + - id: pylint + name: pylint (test code) + description: Run pylint rules on "tests/*.py" files + types: [python] + files: "^tests/" + args: + - --disable=missing-docstring,consider-using-f-string,duplicate-code diff --git a/.pylintrc b/.pylintrc index f9deda4..f6bdfea 100644 --- a/.pylintrc +++ b/.pylintrc @@ -14,7 +14,7 @@ unsafe-load-any-extension=no [MESSAGES CONTROL] confidence= -disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code,import-outside-toplevel,attribute-defined-outside-init +disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code,import-outside-toplevel,attribute-defined-outside-init, too-many-positional-arguments enable= [REPORTS] diff --git a/examples/bar_3Dbars.py b/examples/bar_3Dbars.py index 03c1aeb..1f5834a 100644 --- a/examples/bar_3Dbars.py +++ b/examples/bar_3Dbars.py @@ -18,7 +18,16 @@ b = [3, 5, 1, 9, 7] # Creating a 3D bar -Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) +Bar( + plot, + a, + b, + color=0xFF1000, + fill=True, + bar_space=30, + xstart=70, + projection=True, +) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/bar_color_changing.py b/examples/bar_color_changing.py index 4563aae..69c5571 100644 --- a/examples/bar_color_changing.py +++ b/examples/bar_color_changing.py @@ -32,7 +32,7 @@ a = ["a", "b", "c", "d", "e", "f"] # Showing the plot -display.show(plot) +display.root_group = plot # Creating the bar my_bar = Bar( @@ -47,7 +47,14 @@ time.sleep(2) # Changing all the bars to Yellow my_bar.update_colors( - [color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW] + [ + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + ] ) time.sleep(2) diff --git a/examples/bar_colorpalette.py b/examples/bar_colorpalette.py index 6fa245e..c10b948 100644 --- a/examples/bar_colorpalette.py +++ b/examples/bar_colorpalette.py @@ -39,4 +39,4 @@ ) # Showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/bar_example.py b/examples/bar_example.py index 3663323..8ab8e1e 100644 --- a/examples/bar_example.py +++ b/examples/bar_example.py @@ -19,4 +19,4 @@ Bar(plot, a, b, 0xFF1000, True) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/bar_scale_example.py b/examples/bar_scale_example.py index 5d4e24f..8cb0c99 100644 --- a/examples/bar_scale_example.py +++ b/examples/bar_scale_example.py @@ -29,4 +29,4 @@ group.append(plot_scale1) group.append(plot_scale2) -display.show(group) +display.root_group = group diff --git a/examples/bar_updating_values.py b/examples/bar_updating_values.py index 6f4bf27..1684eb9 100644 --- a/examples/bar_updating_values.py +++ b/examples/bar_updating_values.py @@ -31,7 +31,7 @@ add = 1 # Showing the plot -display.show(plot) +display.root_group = plot # Creating the bar my_bar = Bar( diff --git a/examples/cartersian_and_scatter_polyfit_example.py b/examples/cartersian_and_scatter_polyfit_example.py index 520f555..8da765a 100644 --- a/examples/cartersian_and_scatter_polyfit_example.py +++ b/examples/cartersian_and_scatter_polyfit_example.py @@ -26,10 +26,14 @@ plot = Plot(0, 0, display.width - table_width, display.height, padding=1) plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0x939597, tickgrid=True) plot_table = Plot( - display.width - table_width - 1, 0, table_width - 1, display.height, padding=1 + display.width - table_width - 1, + 0, + table_width - 1, + display.height, + padding=1, ) -display.show(g) +display.root_group = g g.append(plot) g.append(plot_table) diff --git a/examples/cartesian_advanced.py b/examples/cartesian_advanced.py index 7a06741..61d2948 100644 --- a/examples/cartesian_advanced.py +++ b/examples/cartesian_advanced.py @@ -26,4 +26,4 @@ Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/cartesian_fill.py b/examples/cartesian_fill.py index aa6716e..65f5c4a 100644 --- a/examples/cartesian_fill.py +++ b/examples/cartesian_fill.py @@ -14,7 +14,7 @@ # Adding the plot area plot = Plot(0, 0, display.width - 125, display.height, padding=25) -display.show(plot) +display.root_group = plot # Creating the values x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) diff --git a/examples/cartesian_koch.py b/examples/cartesian_koch.py index 9aa4370..f690375 100644 --- a/examples/cartesian_koch.py +++ b/examples/cartesian_koch.py @@ -60,4 +60,4 @@ def rotate(vector: numpy.ndarray, angle_in_degrees: float) -> numpy.ndarray: # Adding the Cartesian plot Cartesian(plot, x_coordinates, y_coordinates) -display.show(plot) +display.root_group = plot diff --git a/examples/cartesian_koch_2.py b/examples/cartesian_koch_2.py index a7ba693..28cb4b2 100644 --- a/examples/cartesian_koch_2.py +++ b/examples/cartesian_koch_2.py @@ -26,7 +26,10 @@ def R(angle, coords, jump): def F(angle, coords, jump): coords.append( - (coords[-1][0] + jump * cosin[angle], coords[-1][1] + jump * sines[angle]) + ( + coords[-1][0] + jump * cosin[angle], + coords[-1][1] + jump * sines[angle], + ) ) return angle @@ -57,4 +60,4 @@ def koch(steps, length=200, startPos=(0, 0)): # Adding the Cartesian plot Cartesian(plot, x_coordinates, y_coordinates) -display.show(plot) +display.root_group = plot diff --git a/examples/cartesian_logging_data.py b/examples/cartesian_logging_data.py index 1937820..72f1b28 100644 --- a/examples/cartesian_logging_data.py +++ b/examples/cartesian_logging_data.py @@ -79,7 +79,7 @@ g.append(plot_1) g.append(plot_2) -display.show(g) +display.root_group = g display.refresh() for i, element in enumerate(x): diff --git a/examples/cartesian_table.py b/examples/cartesian_table.py index 142837d..359621d 100644 --- a/examples/cartesian_table.py +++ b/examples/cartesian_table.py @@ -119,4 +119,4 @@ def heat_index(temp, humidity): color.BLUE, ) g.append(my_table) -display.show(g) +display.root_group = g diff --git a/examples/cartesian_trig_functions.py b/examples/cartesian_trig_functions.py index 67c85b3..02e0206 100644 --- a/examples/cartesian_trig_functions.py +++ b/examples/cartesian_trig_functions.py @@ -39,4 +39,4 @@ g.append(text_area) g.append(text2_area) -display.show(g) +display.root_group = g diff --git a/examples/display_shapes.py b/examples/display_shapes.py index 18e2cee..c49d65c 100644 --- a/examples/display_shapes.py +++ b/examples/display_shapes.py @@ -41,4 +41,4 @@ plot.append(roundrect) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/fillbetween.py b/examples/fillbetween.py index c1e7e30..a6a5ccc 100644 --- a/examples/fillbetween.py +++ b/examples/fillbetween.py @@ -20,4 +20,4 @@ Fillbetween(plot, x, y1, y2) -display.show(plot) +display.root_group = plot diff --git a/examples/integration_example.py b/examples/integration_example.py index 2d28226..b26b25c 100644 --- a/examples/integration_example.py +++ b/examples/integration_example.py @@ -31,4 +31,4 @@ plot.draw_circle(radius=8, x=120, y=120) # Showing in the screen -display.show(plot) +display.root_group = plot diff --git a/examples/lissajous_curves.py b/examples/lissajous_curves.py index cc9272f..945f120 100644 --- a/examples/lissajous_curves.py +++ b/examples/lissajous_curves.py @@ -48,7 +48,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): g.append(plot4) # Plotting and showing the plot -display.show(g) +display.root_group = g # Some Variables diff --git a/examples/logging.py b/examples/logging.py index 69655a6..49eb65b 100644 --- a/examples/logging.py +++ b/examples/logging.py @@ -58,7 +58,7 @@ g.append(plot_1) -display.show(g) +display.root_group = g display.refresh() dist = 3 diff --git a/examples/logging_animation.py b/examples/logging_animation.py index 84a1c60..d04cc5e 100644 --- a/examples/logging_animation.py +++ b/examples/logging_animation.py @@ -60,7 +60,7 @@ random_numbers = [19, 22, 35, 33, 24, 26, 28, 37] -display.show(my_plot) +display.root_group = my_plot display.refresh() dist = 1 diff --git a/examples/logging_changing_values.py b/examples/logging_changing_values.py index df6464a..7d1858e 100644 --- a/examples/logging_changing_values.py +++ b/examples/logging_changing_values.py @@ -48,7 +48,7 @@ g.append(plot_1) -display.show(g) +display.root_group = g display.refresh() my_log = Logging( diff --git a/examples/logging_fill.py b/examples/logging_fill.py index 24a2d5e..a7e05cd 100644 --- a/examples/logging_fill.py +++ b/examples/logging_fill.py @@ -77,4 +77,4 @@ group.append(plot_1) group.append(plot_2) -display.show(group) +display.root_group = group diff --git a/examples/logging_limits.py b/examples/logging_limits.py index f948184..0ccf9de 100644 --- a/examples/logging_limits.py +++ b/examples/logging_limits.py @@ -60,7 +60,7 @@ random_numbers = [32, 34, 45, 65, 24, 40, 18, 27] -display.show(my_plot) +display.root_group = my_plot display.refresh() dist = 1 diff --git a/examples/logging_table.py b/examples/logging_table.py index ee98059..5c997b8 100644 --- a/examples/logging_table.py +++ b/examples/logging_table.py @@ -74,7 +74,7 @@ g.append(plot_1) g.append(my_table) # Show the group -display.show(g) +display.root_group = g for _ in range(2): for i in range(len(x)): diff --git a/examples/logging_with_dial_gauge.py b/examples/logging_with_dial_gauge.py index 2b601c7..89389f6 100644 --- a/examples/logging_with_dial_gauge.py +++ b/examples/logging_with_dial_gauge.py @@ -28,7 +28,7 @@ g = displayio.Group() g.append(my_plot) g.append(plot2) -display.show(g) +display.root_group = g my_plot.tick_params( diff --git a/examples/map.py b/examples/map.py index ad08298..03c0d8f 100644 --- a/examples/map.py +++ b/examples/map.py @@ -24,4 +24,4 @@ # Plotting and showing the plot Map(plot, y1, 0xFF0044, 0x4400FF) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/pie_example.py b/examples/pie_example.py index 8c75a3b..b297610 100644 --- a/examples/pie_example.py +++ b/examples/pie_example.py @@ -19,4 +19,4 @@ Pie(plot, a) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/plot_example.py b/examples/plot_example.py index 9a6886a..b819e94 100644 --- a/examples/plot_example.py +++ b/examples/plot_example.py @@ -21,4 +21,4 @@ # Drawing the graph Cartesian(plot, x, y) -display.show(plot) +display.root_group = plot diff --git a/examples/plot_line_styles.py b/examples/plot_line_styles.py index 22133dc..d0532ac 100644 --- a/examples/plot_line_styles.py +++ b/examples/plot_line_styles.py @@ -18,7 +18,13 @@ # Drawing the graph Cartesian( - plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000, line_style="- -" + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0xFF0000, + line_style="- -", ) # Creating some points to graph @@ -26,7 +32,13 @@ constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 2.0) Cartesian( - plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00, line_style="." + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0x00FF00, + line_style=".", ) @@ -34,8 +46,14 @@ constant = 2.5 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 6.5) Cartesian( - plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x123456, line_style="-.-" + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0x123456, + line_style="-.-", ) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/plot_simpletest.py b/examples/plot_simpletest.py index d7f2070..6f06270 100644 --- a/examples/plot_simpletest.py +++ b/examples/plot_simpletest.py @@ -13,4 +13,4 @@ plot.draw_circle(radius=8, x=120, y=120) -display.show(plot) +display.root_group = plot diff --git a/examples/polar_advanced.py b/examples/polar_advanced.py index 107b003..4e88491 100644 --- a/examples/polar_advanced.py +++ b/examples/polar_advanced.py @@ -72,4 +72,4 @@ g.append(plot4) # Show the Display -display.show(g) +display.root_group = g diff --git a/examples/polar_example.py b/examples/polar_example.py index 9117de1..0e761a2 100644 --- a/examples/polar_example.py +++ b/examples/polar_example.py @@ -17,4 +17,4 @@ # Plotting and showing the plot Polar(plot, theta, r, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) -display.show(plot) +display.root_group = plot diff --git a/examples/polar_plots.py b/examples/polar_plots.py index 91d039e..3a8f4b2 100644 --- a/examples/polar_plots.py +++ b/examples/polar_plots.py @@ -25,7 +25,7 @@ g.append(plot4) # Plotting and showing the plot -display.show(g) +display.root_group = g def rose_function(n=3, angle_range=[0, 360], radius=30): diff --git a/examples/readme_example.py b/examples/readme_example.py index 19771de..525b798 100644 --- a/examples/readme_example.py +++ b/examples/readme_example.py @@ -91,4 +91,4 @@ plot.append(plot7) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/scatter.py b/examples/scatter.py index 5f5015d..fb64566 100644 --- a/examples/scatter.py +++ b/examples/scatter.py @@ -23,4 +23,4 @@ Scatter(plot, a, b) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/scatter_circle_radius.py b/examples/scatter_circle_radius.py index 41e40fe..fb043b9 100644 --- a/examples/scatter_circle_radius.py +++ b/examples/scatter_circle_radius.py @@ -16,12 +16,18 @@ plot = Plot(0, 0, display.width, display.height, padding=1) plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0x939597, tickgrid=True) -display.show(plot) +display.root_group = plot a = np.linspace(1, 200, 150) z = [4, 5, 6, 7, 8] radi = [choice(z) for _ in a] b = [choice(a) for _ in a] Scatter( - plot, a, b, rangex=[0, 210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3 + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0xF456F3, ) diff --git a/examples/scatter_pointers.py b/examples/scatter_pointers.py index 2ed621b..1c429aa 100644 --- a/examples/scatter_pointers.py +++ b/examples/scatter_pointers.py @@ -27,7 +27,7 @@ g.append(plot2) g.append(plot3) g.append(plot4) -display.show(g) +display.root_group = plot # Setting up tick parameters diff --git a/examples/scatter_using_different_datasets.py b/examples/scatter_using_different_datasets.py index cf7dfea..4e88887 100644 --- a/examples/scatter_using_different_datasets.py +++ b/examples/scatter_using_different_datasets.py @@ -23,20 +23,32 @@ decimal_points=0, ) -display.show(plot) +display.root_group = plot a = np.linspace(4, 200, 50) z = [4, 5, 6, 7, 8] radi = [choice(z) for _ in a] b = [choice(a) for _ in a] Scatter( - plot, a, b, rangex=[0, 210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3 + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0xF456F3, ) a = np.linspace(50, 170, 50) radi = [choice(z) for _ in a] b = [choice(a) for _ in a] Scatter( - plot, a, b, rangex=[0, 210], rangey=[0, 210], radius=radi, pointer_color=0x00FF00 + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0x00FF00, ) a = np.linspace(50, 100, 25) z = [ diff --git a/examples/shade_example.py b/examples/shade_example.py index 61b6239..0ee113b 100644 --- a/examples/shade_example.py +++ b/examples/shade_example.py @@ -98,4 +98,4 @@ def heat_index(temp, humidity): for i in range(40, 110, 10): Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) -display.show(plot) +display.root_group = plot diff --git a/examples/sparkline.py b/examples/sparkline.py index 740b2cb..caa86c7 100644 --- a/examples/sparkline.py +++ b/examples/sparkline.py @@ -37,7 +37,7 @@ plot.append(sparkline) # Plotting and showing the plot -display.show(plot) +display.root_group = plot for element in y: display.auto_refresh = False diff --git a/examples/stackplot.py b/examples/stackplot.py index abc19b7..34d5b00 100644 --- a/examples/stackplot.py +++ b/examples/stackplot.py @@ -27,4 +27,4 @@ Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) -display.show(plot) +display.root_group = plot diff --git a/examples/svg_example.py b/examples/svg_example.py index a20fb75..098dda0 100644 --- a/examples/svg_example.py +++ b/examples/svg_example.py @@ -17,4 +17,4 @@ SVG(plot, Temperature, 250, 50, 2, color.GREEN) SVG(plot, Temperature2, 300, 50, 0.25, color.BLUE) -display.show(plot) +display.root_group = plot diff --git a/examples/tickparameters.py b/examples/tickparameters.py index 050c5d0..f7c40ed 100644 --- a/examples/tickparameters.py +++ b/examples/tickparameters.py @@ -32,4 +32,4 @@ Cartesian(plot, x, y, line_color=color.BLACK) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/uboxplot_example.py b/examples/uboxplot_example.py index c3d134d..246c744 100644 --- a/examples/uboxplot_example.py +++ b/examples/uboxplot_example.py @@ -66,4 +66,4 @@ plot.append(my_box) plot.append(my_box2) plot.append(my_box3) -display.show(plot) +display.root_group = plot From 82373338eb87b1a070085f2586986d543b9e6804 Mon Sep 17 00:00:00 2001 From: JPOSADA202020 Date: Sun, 5 Jan 2025 06:38:22 -0500 Subject: [PATCH 55/61] upd --- .github/workflows/build.yml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 48e7c9f..19e7358 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,26 +88,3 @@ jobs: name: bundles path: ${{ github.workspace }}/bundles/ - build-docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - python-version: "3.x" - - - name: Install deps - run: | - pip install -r docs/requirements.txt -r requirements.txt - - - name: Build docs - working-directory: docs - run: sphinx-build -E -W -b html . _build/html - - - name: Archive docs - uses: actions/upload-artifact@v3 - with: - name: docs - path: ${{ github.workspace }}/docs/_build/html From b8b431a7360b905511138b6fba2272a109c11a53 Mon Sep 17 00:00:00 2001 From: JPOSADA202020 Date: Sun, 5 Jan 2025 06:39:44 -0500 Subject: [PATCH 56/61] upd --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19e7358..9a233f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -87,4 +87,3 @@ jobs: with: name: bundles path: ${{ github.workspace }}/bundles/ - From 774399e9ce627dbf12adced72beac042ad79703f Mon Sep 17 00:00:00 2001 From: jposada202020 <34255413+jposada202020@users.noreply.github.com> Date: Sun, 5 Jan 2025 06:45:09 -0500 Subject: [PATCH 57/61] Update README.rst --- README.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.rst b/README.rst index f5e0df9..326a4ba 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,3 @@ -.. image:: https://readthedocs.org/projects/circuitpython-uplot/badge/?version=latest - :target: https://circuitpython-uplot.readthedocs.io/ - :alt: Documentation Status - .. image:: https://github.com/jposada202020/CircuitPython_uplot/workflows/Build%20CI/badge.svg :target: https://github.com/jposada202020/CircuitPython_uplot/actions :alt: Build Status @@ -14,10 +10,6 @@ :alt: Total PyPI downloads :target: https://pepy.tech/project/circuitpython-uplot -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - :alt: Code Style: Black - Framework to display different graphical plots in displayio. Take a look in the `examples `_ section in RTD to see the gallery From 5f399336f96d66ce20f1ed1d3ee293a06ebbbf68 Mon Sep 17 00:00:00 2001 From: jposada202020 <34255413+jposada202020@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:22:28 -0500 Subject: [PATCH 58/61] Update .readthedocs.yaml --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 19d9be3..3cdb96e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,7 +5,7 @@ version: 2 build: - os: ubuntu-22.04 + os: ubuntu-lts-latest tools: python: "3" From 51c4fd22c4162e56214dba09465f739c8237a10f Mon Sep 17 00:00:00 2001 From: jposada2020 Date: Sat, 15 Feb 2025 00:37:55 -0500 Subject: [PATCH 59/61] logging logic improvement --- circuitpython_uplot/logging.py | 42 ++++++++++++------- examples/logging_animation.py | 12 +++--- examples/logging_fill.py | 4 +- .../{logging.py => logging_simple_test.py} | 6 ++- 4 files changed, 41 insertions(+), 23 deletions(-) rename examples/{logging.py => logging_simple_test.py} (98%) diff --git a/circuitpython_uplot/logging.py b/circuitpython_uplot/logging.py index ec3d2a1..c60c120 100644 --- a/circuitpython_uplot/logging.py +++ b/circuitpython_uplot/logging.py @@ -63,6 +63,7 @@ def __init__( self.points = [] self.ticksx = np.array(ticksx) self.ticksy = np.array(ticksy) + self._fill = fill if tick_pos: self._tickposx = plot._tickheightx self._tickposy = plot._tickheighty @@ -82,7 +83,11 @@ def __init__( if limits is not None: self._limits = np.array( plot.transform( - self.ymin, self.ymax, plot._newymin, plot._newymax, np.array(limits) + self.ymin, + self.ymax, + plot._newymin, + plot._newymax, + np.array(limits), ), dtype=np.int16, ) @@ -90,13 +95,7 @@ def __init__( else: self._limits = None - self.draw_points(plot, x, y, fill) - - if plot._showticks: - if plot._loggingfirst: - self._draw_ticks(plot) - plot._loggingfirst = False - plot._showticks = False + self.draw_points(plot, x, y) def _draw_ticks(self, plot) -> None: """ @@ -104,20 +103,20 @@ def _draw_ticks(self, plot) -> None: """ - ticksxnorm = np.array( + self._ticksxnorm = np.array( plot.transform( self.xmin, self.xmax, plot._newxmin, plot._newxmax, self.ticksx ), dtype=np.int16, ) - ticksynorm = np.array( + self._ticksynorm = np.array( plot.transform( self.ymin, self.ymax, plot._newymin, plot._newymax, self.ticksy ), dtype=np.int16, ) - for i, tick in enumerate(ticksxnorm): + for i, tick in enumerate(self._ticksxnorm): draw_line( plot._plotbitmap, tick, @@ -128,7 +127,7 @@ def _draw_ticks(self, plot) -> None: ) if plot._showtext: plot.show_text(f"{self.ticksx[i]:.0f}", tick, plot._newymin, (0.5, 0.0)) - for i, tick in enumerate(ticksynorm): + for i, tick in enumerate(self._ticksynorm): draw_line( plot._plotbitmap, plot._newxmin - self._tickposy, @@ -155,7 +154,7 @@ def clear_plot(plot) -> None: 0, ) - def draw_points(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: + def draw_points(self, plot: Plot, x: list, y: list) -> None: """ Draws points in the plot :param Plot plot: plot object provided @@ -164,12 +163,22 @@ def draw_points(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: :param bool fill: parameter to fill the plot graphic. Defaults to False :return: None """ + self.clear_plot(plot) if self._limits: self._draw_limit_lines(plot) - self.draw_new_lines(plot, x, y, fill) + self.draw_new_lines(plot, x, y) + if plot._showticks: + if plot._loggingfirst: + self._draw_ticks(plot) + plot._loggingfirst = False + plot._showticks = False + + if plot._tickgrid: + plot._draw_gridx(self._ticksxnorm) + plot._draw_gridy(self._ticksynorm) - def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> None: + def draw_new_lines(self, plot: Plot, x: list, y: list) -> None: """ Draw the plot lines :param Plot plot: plot object provided @@ -204,7 +213,8 @@ def draw_new_lines(self, plot: Plot, x: list, y: list, fill: bool = False) -> No ynorm[index + 1], self._line_index, ) - if fill: + + if self._fill: for index, _ in enumerate(xnorm): draw_line( plot._plotbitmap, diff --git a/examples/logging_animation.py b/examples/logging_animation.py index d04cc5e..ad79397 100644 --- a/examples/logging_animation.py +++ b/examples/logging_animation.py @@ -14,11 +14,11 @@ # Drawing the graph my_plot = Plot( - 140, - 60, - 200, - 200, - padding=25, + 5, + 5, + 480, + 300, + padding=20, show_box=True, box_color=color.WHITE, ) @@ -29,6 +29,7 @@ ticky_height=4, show_ticks=True, tickcolor=color.TEAL, + tickgrid=True, showtext=True, ) @@ -75,6 +76,7 @@ line_color=color.BLUE, ticksx=[25, 50, 75, 100, 125, 150, 175, 200], ticksy=[25, 50, 75, 100], + fill=False, ) # Showing the loggraph diff --git a/examples/logging_fill.py b/examples/logging_fill.py index a7e05cd..10885fe 100644 --- a/examples/logging_fill.py +++ b/examples/logging_fill.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import time import displayio import board from circuitpython_uplot.plot import Plot, color @@ -12,7 +13,6 @@ group = displayio.Group() - palette = displayio.Palette(1) palette[0] = 0x000000 @@ -78,3 +78,5 @@ group.append(plot_2) display.root_group = group + +time.sleep(10) diff --git a/examples/logging.py b/examples/logging_simple_test.py similarity index 98% rename from examples/logging.py rename to examples/logging_simple_test.py index 49eb65b..cbd6a63 100644 --- a/examples/logging.py +++ b/examples/logging_simple_test.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import time import displayio import terminalio import board @@ -9,6 +10,7 @@ from circuitpython_uplot.plot import Plot, color from circuitpython_uplot.logging import Logging + # Setting up the display display = board.DISPLAY @@ -59,7 +61,7 @@ g.append(plot_1) display.root_group = g -display.refresh() + dist = 3 @@ -75,3 +77,5 @@ ) text_temperature.text = "{}C".format(temp_y[dist]) + +time.sleep(5) From 3aac03208cbf5036db8bc2919b631720c0d096ea Mon Sep 17 00:00:00 2001 From: jposada202020 <34255413+jposada202020@users.noreply.github.com> Date: Sat, 15 Feb 2025 00:41:18 -0500 Subject: [PATCH 60/61] Update build.yml --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9a233f1..c84bfb8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: run: pipx run twine check dist/* - name: Archive wheel - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wheel path: ${{ github.workspace }}/dist/ @@ -83,7 +83,7 @@ jobs: run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - name: Archive bundles - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: bundles path: ${{ github.workspace }}/bundles/ From 4998f994fe62d00fd29875cc198742e3e2c8222c Mon Sep 17 00:00:00 2001 From: David Glaude Date: Sat, 8 Mar 2025 12:57:36 +0100 Subject: [PATCH 61/61] Update examples.rst ulement => element --- docs/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples.rst b/docs/examples.rst index 71693cf..b67ce1b 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -478,7 +478,7 @@ Display Shapes integration example Advanced Example --------------------------- -plot different ulements in a single display +plot different elements in a single display .. literalinclude:: ../examples/readme_example.py :caption: examples/readme_example.py