Added preflight option to update the QR codes.

- Needed for s-expression files
- Not working for KiCad 6 (bug in the Python API)
This commit is contained in:
Salvador E. Tropea 2022-01-04 10:21:59 -03:00
parent d0801d1e5d
commit 7992fd9888
16 changed files with 11239 additions and 586 deletions

View File

@ -163,6 +163,9 @@ This section is used to specify tasks that will be executed before generating an
- `tag_delimiter`: [string='@'] Character used to indicate the beginning and the end of a tag.
Don't change it unless you really know about KiCad's file formats.
- `text`: [string=''] Text to insert instead of the tag.
- `update_qr`: [boolean=false] Update the QR codes.
Complements the `qr_lib` output.
The KiCad 6 files and the KiCad 5 PCB needs manual update, generating a new library isn't enough.
- `update_xml`: [boolean=false] Update the XML version of the BoM (Bill of Materials).
To ensure our generated BoM is up to date.
Note that this isn't needed when using the internal BoM generator (`bom`).

View File

@ -43,6 +43,10 @@ preflight:
before: 'Git hash: <'
after: '>'
# [boolean=false] Update the QR codes.
# Complements the `qr_lib` output.
# The KiCad 6 files and the KiCad 5 PCB needs manual update, generating a new library isn't enough.
update_qr: true
# [boolean=false] Update the XML version of the BoM (Bill of Materials).
# To ensure our generated BoM is up to date.
# Note that this isn't needed when using the internal BoM generator (`bom`).

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2021 Salvador E. Tropea
# Copyright (c) 2020-2021 Instituto Nacional de Tecnología Industrial
# Copyright (c) 2020-2022 Salvador E. Tropea
# Copyright (c) 2020-2022 Instituto Nacional de Tecnología Industrial
# Copyright (c) 2018 John Beard
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
@ -359,8 +359,12 @@ def run_output(out):
def generate_outputs(outputs, target, invert, skip_pre, cli_order):
logger.debug("Starting outputs for board {}".format(GS.pcb_file))
GS.outputs = outputs
preflight_checks(skip_pre)
# Chek if the preflights pulled options
for out in RegOutput.get_prioritary_outputs():
config_output(out)
logger.info('- '+str(out))
run_output(out)
# Check if all must be skipped
n = len(target)
if n == 0 and invert:
@ -383,10 +387,9 @@ def generate_outputs(outputs, target, invert, skip_pre, cli_order):
run_output(out)
else:
# Use the declaration order
for out in outputs:
for out in RegOutput.get_outputs():
if (((n == 0 or ((out.name not in target) and invert)) and out.run_by_default) or
((out.name in target) and not invert)):
# Exclude
config_output(out)
logger.info('- '+str(out))
run_output(out)
@ -492,7 +495,6 @@ def generate_makefile(makefile, cfg_file, outputs, kibot_sys=False):
f.write('LOGFILE?=kibot_error.log\n')
f.write('\n')
# Configure all outputs
GS.outputs = outputs
for out in outputs:
config_output(out)
# Get all targets and dependencies

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2021 Salvador E. Tropea
# Copyright (c) 2021 Instituto Nacional de Tecnología Industrial
# Copyright (c) 2021-2022 Salvador E. Tropea
# Copyright (c) 2021-2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
import re
@ -16,6 +16,7 @@ from .gs import GS
from .kiplot import config_output, get_output_dir, run_output
from .misc import MISSING_TOOL, WRONG_INSTALL, W_EMPTYZIP, WRONG_ARGUMENTS, INTERNAL_ERROR
from .optionable import Optionable, BaseOptions
from .registrable import RegOutput
from .macros import macros, document, output_class # noqa: F401
from . import log
@ -127,12 +128,11 @@ class CompressOptions(BaseOptions):
# Get the list of candidates
files_list = None
if f.from_output:
for out in GS.outputs:
if out.name == f.from_output:
config_output(out)
files_list = out.get_targets(get_output_dir(out.dir, out, dry=True))
break
if files_list is None:
out = RegOutput.get_output(f.from_output)
if out is not None:
config_output(out)
files_list = out.get_targets(get_output_dir(out.dir, out, dry=True))
else:
logger.error('Unknown output `{}` selected in {}'.format(f.from_output, self._parent))
exit(WRONG_ARGUMENTS)
if not no_out_run:

View File

@ -6,9 +6,15 @@
import os
from qrcodegen import QrCode
from .gs import GS
if GS.ki6(): # pragma: no cover (Ki6)
from pcbnew import IU_PER_MM, S_POLYGON, wxPoint, ADD_MODE_APPEND
ADD_APPEND = ADD_MODE_APPEND
else:
from pcbnew import IU_PER_MM, S_POLYGON, wxPoint, ADD_APPEND
from .optionable import BaseOptions, Optionable
from .out_base import VariantOptions
from .error import KiPlotConfigurationError
from .kicad.sexpdata import Symbol, dumps, Sep
from .kicad.sexpdata import Symbol, dumps, Sep, load, SExpData
from .kicad.v6_sch import DrawRectangleV6, PointXY, Stroke, Fill, SchematicFieldV6, FontEffects
from .macros import macros, document, output_class # noqa: F401
from . import log
@ -42,6 +48,7 @@ class QRCodeOptions(Optionable):
self.pcb_negative = False
""" Generate a negative image for the PCB """
self._unkown_is_error = True
self._update_mode = False
def config(self, parent):
super().config(parent)
@ -152,6 +159,34 @@ class QR_LibOptions(BaseOptions):
mod.append(Sep())
return mod
def qr_draw_fp_memory(self, m, size, size_rect, center, qrc, negative, layer):
""" Create the QR drawings for the board in memory """
for y in range(size):
for x in range(size):
if qrc.get_module(x-negative, y-negative) ^ negative:
x_pos = round(x*size_rect-center, 2)
y_pos = round(y*size_rect-center, 2)
x_pos2 = round(x_pos+size_rect, 2)
y_pos2 = round(y_pos+size_rect, 2)
# Convert to Internal Units
x_pos *= IU_PER_MM
y_pos *= IU_PER_MM
x_pos2 *= IU_PER_MM
y_pos2 *= IU_PER_MM
# Create a PCB polygon
poly = VariantOptions.create_module_element(m)
poly.SetShape(S_POLYGON)
points = []
points.append(wxPoint(x_pos, y_pos))
points.append(wxPoint(x_pos, y_pos2))
points.append(wxPoint(x_pos2, y_pos2))
points.append(wxPoint(x_pos2, y_pos))
poly.SetPolyPoints(points)
poly.SetLayer(layer)
poly.SetWidth(0)
poly.thisown = 0
m.AddNative(poly, ADD_APPEND)
def qr_draw_sym(self, size, size_rect, center, qrc):
mod = []
for y in range(size):
@ -280,6 +315,53 @@ class QR_LibOptions(BaseOptions):
f.write(dumps(lib))
f.write('\n')
def update_footprint(self, name, qr):
logger.debug('Updating QR footprint: '+name)
# Compute the size
# TODO: don't repeat
qrc = qr._code_pcb
size = qrc.get_size()
if qr.pcb_negative:
size += 2
full_size = qr.size_pcb * (1 if qr.size_units == 'millimeters' else 25.4)
center = round(full_size/2, 2)
size_rect = round(full_size/size, 2)
# Replace any instance
name = name.lower()
for m in GS.get_modules():
id = m.GetFPID()
m_name = ('{}:{}'.format(id.GetLibNickname(), id.GetLibItemName())).lower()
if name == m_name:
ref = m.GetReference()
logger.debug('- Updating '+ref)
# Remove all the drawings
for gi in m.GraphicalItems():
if gi.GetClass() == 'MGRAPHIC':
m.Remove(gi)
# Add the updated version
self.qr_draw_fp_memory(m, size, size_rect, center, qrc, qr.pcb_negative, GS.board.GetLayerID(qr.layer))
def load_k6_sheet(self, fname):
with open(fname, 'rt') as fh:
error = None
try:
sch = load(fh)
except SExpData as e:
error = str(e)
if error:
raise KiPlotConfigurationError(error)
return sch
def load_k6_sheets(self, fname, sheets={}):
assert GS.sch_file is not None
sheet = self.load_k6_sheet(fname)
sheets[fname] = sheet
if not isinstance(sheet, list) or sheet[0].value() != 'kicad_sch':
raise KiPlotConfigurationError('No kicad_sch signature in '+fname)
for e in sheet[1:]:
if isinstance(e, list) and isinstance(e[0], Symbol) and e[0].value == 'sheet':
logger.error(e)
def run(self, output):
if self.use_sch_dir:
self._odir_sch = GS.sch_dir
@ -305,6 +387,23 @@ class QR_LibOptions(BaseOptions):
for qr in self.qrs:
logger.debug('Adding footprint: '+qr.name)
self.footprint(dir_pretty, qr)
# Update the files
if self._parent._update_mode:
# PCB
assert GS.board is not None
for qr in self.qrs:
self.update_footprint(self.lib+':'+qr.name, qr)
bkp = GS.pcb_file+'-bak'
if os.path.isfile(bkp):
os.remove(bkp)
os.rename(GS.pcb_file, bkp)
GS.board.Save(GS.pcb_file)
# Schematic
if GS.ki6():
# KiCad 5 reads the lib, but KiCad 6 is more like the PCB
# sheets = self.load_k6_sheets(GS.sch_file)
pass
# TODO: KiCad 6 is crashing when we delete the graphics
@output_class

32
kibot/pre_update_qr.py Normal file
View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2022 Salvador E. Tropea
# Copyright (c) 2020-2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
from .macros import macros, pre_class # noqa: F401
from .error import KiPlotConfigurationError
from .registrable import RegOutput
from .log import get_logger
logger = get_logger(__name__)
@pre_class
class Update_QR(BasePreFlight): # noqa: F821
""" [boolean=false] Update the QR codes.
Complements the `qr_lib` output.
The KiCad 6 files and the KiCad 5 PCB needs manual update, generating a new library isn't enough """
def __init__(self, name, value):
super().__init__(name, value)
if not isinstance(value, bool):
raise KiPlotConfigurationError('must be boolean')
self._enabled = value
self._sch_related = True
self._pcb_related = True
def run(self):
for o in list(RegOutput.get_outputs()): # We convert it to a list because we will mutate the dict
if o.type == 'qr_lib':
RegOutput.make_prioritary(o.name)
o._update_mode = True
logger.debug('Making {} prioritary'.format(o))

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2021 Salvador E. Tropea
# Copyright (c) 2020-2021 Instituto Nacional de Tecnología Industrial
# Copyright (c) 2020-2022 Salvador E. Tropea
# Copyright (c) 2020-2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
from collections import OrderedDict
@ -44,6 +44,8 @@ class RegOutput(Optionable, Registrable):
_def_variants = {}
# List of defined outputs
_def_outputs = OrderedDict()
# List of prioritary outputs
_prio_outputs = OrderedDict()
def __init__(self):
super().__init__()
@ -94,10 +96,20 @@ class RegOutput(Optionable, Registrable):
def get_outputs():
return RegOutput._def_outputs.values()
@staticmethod
def get_prioritary_outputs():
return RegOutput._prio_outputs.values()
@staticmethod
def get_output(name):
return RegOutput._def_outputs.get(name, None)
@staticmethod
def make_prioritary(name):
out = RegOutput._def_outputs[name]
del RegOutput._def_outputs[name]
RegOutput._prio_outputs[name] = out
@staticmethod
def check_variant(variant):
if variant:

View File

@ -0,0 +1 @@
0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,726 @@
(kicad_pcb (version 20171130) (host pcbnew 5.1.9+dfsg1-1)
(general
(thickness 1.6)
(drawings 0)
(tracks 0)
(zones 0)
(modules 2)
(nets 1)
)
(page A4)
(title_block
(title "QR PCB")
(rev B)
)
(layers
(0 F.Cu signal)
(1 In1.Cu signal hide)
(2 In2.Cu signal hide)
(31 B.Cu signal)
(32 B.Adhes user)
(33 F.Adhes user)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
(45 Margin user)
(46 B.CrtYd user)
(47 F.CrtYd user)
(48 B.Fab user)
(49 F.Fab user)
)
(setup
(last_trace_width 0.25)
(trace_clearance 0.2)
(zone_clearance 0.508)
(zone_45_only no)
(trace_min 0.2)
(via_size 0.8)
(via_drill 0.4)
(via_min_size 0.4)
(via_min_drill 0.3)
(uvia_size 0.3)
(uvia_drill 0.1)
(uvias_allowed no)
(uvia_min_size 0.2)
(uvia_min_drill 0.1)
(edge_width 0.1)
(segment_width 0.2)
(pcb_text_width 0.3)
(pcb_text_size 1.5 1.5)
(mod_edge_width 0.15)
(mod_text_size 1 1)
(mod_text_width 0.15)
(pad_size 1.524 1.524)
(pad_drill 0.762)
(pad_to_mask_clearance 0)
(aux_axis_origin 0 0)
(visible_elements FFFFFF7F)
(pcbplotparams
(layerselection 0x010fc_ffffffff)
(usegerberextensions false)
(usegerberattributes true)
(usegerberadvancedattributes true)
(creategerberjobfile true)
(excludeedgelayer true)
(linewidth 0.100000)
(plotframeref false)
(viasonmask false)
(mode 1)
(useauxorigin false)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15.000000)
(psnegative false)
(psa4output false)
(plotreference true)
(plotvalue true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 1)
(scaleselection 1)
(outputdirectory ""))
)
(net 0 "")
(net_class Default "Esta es la clase de red por defecto."
(clearance 0.2)
(trace_width 0.25)
(via_dia 0.8)
(via_drill 0.4)
(uvia_dia 0.3)
(uvia_drill 0.1)
)
(module qr:QR (layer F.Cu) (tedit 0) (tstamp 61D26C5C)
(at 65.8 96.9)
(fp_text reference QR1 (at 0 26.65) (layer F.Cu)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value QR (at 0 -26.65) (layer F.Cu)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_poly (pts (xy 15.74 23) (xy 15.74 25.42) (xy 18.16 25.42) (xy 18.16 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 23) (xy 13.32 25.42) (xy 15.74 25.42) (xy 15.74 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 23) (xy 10.9 25.42) (xy 13.32 25.42) (xy 13.32 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 23) (xy 8.48 25.42) (xy 10.9 25.42) (xy 10.9 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 23) (xy 3.64 25.42) (xy 6.06 25.42) (xy 6.06 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 23) (xy -6.04 25.42) (xy -3.62 25.42) (xy -3.62 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 23) (xy -10.88 25.42) (xy -8.46 25.42) (xy -8.46 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 23) (xy -13.3 25.42) (xy -10.88 25.42) (xy -10.88 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 23) (xy -15.72 25.42) (xy -13.3 25.42) (xy -13.3 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 23) (xy -18.14 25.42) (xy -15.72 25.42) (xy -15.72 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 23) (xy -20.56 25.42) (xy -18.14 25.42) (xy -18.14 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 23) (xy -22.98 25.42) (xy -20.56 25.42) (xy -20.56 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 23) (xy -25.4 25.42) (xy -22.98 25.42) (xy -22.98 23)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 20.58) (xy 23 23) (xy 25.42 23) (xy 25.42 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 20.58) (xy 20.58 23) (xy 23 23) (xy 23 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 20.58) (xy 18.16 23) (xy 20.58 23) (xy 20.58 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 20.58) (xy 15.74 23) (xy 18.16 23) (xy 18.16 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 20.58) (xy 13.32 23) (xy 15.74 23) (xy 15.74 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 20.58) (xy 10.9 23) (xy 13.32 23) (xy 13.32 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 20.58) (xy 8.48 23) (xy 10.9 23) (xy 10.9 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 6.06 20.58) (xy 6.06 23) (xy 8.48 23) (xy 8.48 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 20.58) (xy 1.22 23) (xy 3.64 23) (xy 3.64 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 20.58) (xy -1.2 23) (xy 1.22 23) (xy 1.22 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 20.58) (xy -10.88 23) (xy -8.46 23) (xy -8.46 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 20.58) (xy -25.4 23) (xy -22.98 23) (xy -22.98 20.58)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 18.16) (xy 23 20.58) (xy 25.42 20.58) (xy 25.42 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 18.16) (xy 20.58 20.58) (xy 23 20.58) (xy 23 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 18.16) (xy 18.16 20.58) (xy 20.58 20.58) (xy 20.58 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 18.16) (xy 13.32 20.58) (xy 15.74 20.58) (xy 15.74 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 18.16) (xy 10.9 20.58) (xy 13.32 20.58) (xy 13.32 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 18.16) (xy 8.48 20.58) (xy 10.9 20.58) (xy 10.9 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 6.06 18.16) (xy 6.06 20.58) (xy 8.48 20.58) (xy 8.48 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 18.16) (xy 3.64 20.58) (xy 6.06 20.58) (xy 6.06 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 18.16) (xy 1.22 20.58) (xy 3.64 20.58) (xy 3.64 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 18.16) (xy -1.2 20.58) (xy 1.22 20.58) (xy 1.22 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 18.16) (xy -10.88 20.58) (xy -8.46 20.58) (xy -8.46 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 18.16) (xy -15.72 20.58) (xy -13.3 20.58) (xy -13.3 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 18.16) (xy -18.14 20.58) (xy -15.72 20.58) (xy -15.72 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 18.16) (xy -20.56 20.58) (xy -18.14 20.58) (xy -18.14 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 18.16) (xy -25.4 20.58) (xy -22.98 20.58) (xy -22.98 18.16)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 15.74) (xy 18.16 18.16) (xy 20.58 18.16) (xy 20.58 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 15.74) (xy 1.22 18.16) (xy 3.64 18.16) (xy 3.64 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 15.74) (xy -3.62 18.16) (xy -1.2 18.16) (xy -1.2 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 15.74) (xy -6.04 18.16) (xy -3.62 18.16) (xy -3.62 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 15.74) (xy -10.88 18.16) (xy -8.46 18.16) (xy -8.46 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 15.74) (xy -15.72 18.16) (xy -13.3 18.16) (xy -13.3 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 15.74) (xy -18.14 18.16) (xy -15.72 18.16) (xy -15.72 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 15.74) (xy -20.56 18.16) (xy -18.14 18.16) (xy -18.14 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 15.74) (xy -25.4 18.16) (xy -22.98 18.16) (xy -22.98 15.74)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 13.32) (xy 20.58 15.74) (xy 23 15.74) (xy 23 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 13.32) (xy 10.9 15.74) (xy 13.32 15.74) (xy 13.32 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 13.32) (xy 3.64 15.74) (xy 6.06 15.74) (xy 6.06 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 13.32) (xy 1.22 15.74) (xy 3.64 15.74) (xy 3.64 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 13.32) (xy -3.62 15.74) (xy -1.2 15.74) (xy -1.2 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 13.32) (xy -6.04 15.74) (xy -3.62 15.74) (xy -3.62 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 13.32) (xy -10.88 15.74) (xy -8.46 15.74) (xy -8.46 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 13.32) (xy -15.72 15.74) (xy -13.3 15.74) (xy -13.3 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 13.32) (xy -18.14 15.74) (xy -15.72 15.74) (xy -15.72 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 13.32) (xy -20.56 15.74) (xy -18.14 15.74) (xy -18.14 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 13.32) (xy -25.4 15.74) (xy -22.98 15.74) (xy -22.98 13.32)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 10.9) (xy 23 13.32) (xy 25.42 13.32) (xy 25.42 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 10.9) (xy 20.58 13.32) (xy 23 13.32) (xy 23 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 10.9) (xy 18.16 13.32) (xy 20.58 13.32) (xy 20.58 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 10.9) (xy 15.74 13.32) (xy 18.16 13.32) (xy 18.16 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 10.9) (xy 13.32 13.32) (xy 15.74 13.32) (xy 15.74 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 10.9) (xy 8.48 13.32) (xy 10.9 13.32) (xy 10.9 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 10.9) (xy 3.64 13.32) (xy 6.06 13.32) (xy 6.06 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 10.9) (xy -6.04 13.32) (xy -3.62 13.32) (xy -3.62 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 10.9) (xy -10.88 13.32) (xy -8.46 13.32) (xy -8.46 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 10.9) (xy -25.4 13.32) (xy -22.98 13.32) (xy -22.98 10.9)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 8.48) (xy 15.74 10.9) (xy 18.16 10.9) (xy 18.16 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 8.48) (xy 13.32 10.9) (xy 15.74 10.9) (xy 15.74 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 8.48) (xy 10.9 10.9) (xy 13.32 10.9) (xy 13.32 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 8.48) (xy 8.48 10.9) (xy 10.9 10.9) (xy 10.9 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 6.06 8.48) (xy 6.06 10.9) (xy 8.48 10.9) (xy 8.48 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 8.48) (xy 3.64 10.9) (xy 6.06 10.9) (xy 6.06 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 8.48) (xy -3.62 10.9) (xy -1.2 10.9) (xy -1.2 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 8.48) (xy -6.04 10.9) (xy -3.62 10.9) (xy -3.62 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 8.48) (xy -10.88 10.9) (xy -8.46 10.9) (xy -8.46 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 8.48) (xy -13.3 10.9) (xy -10.88 10.9) (xy -10.88 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 8.48) (xy -15.72 10.9) (xy -13.3 10.9) (xy -13.3 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 8.48) (xy -18.14 10.9) (xy -15.72 10.9) (xy -15.72 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 8.48) (xy -20.56 10.9) (xy -18.14 10.9) (xy -18.14 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 8.48) (xy -22.98 10.9) (xy -20.56 10.9) (xy -20.56 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 8.48) (xy -25.4 10.9) (xy -22.98 10.9) (xy -22.98 8.48)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 6.06) (xy 20.58 8.48) (xy 23 8.48) (xy 23 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 6.06) (xy 18.16 8.48) (xy 20.58 8.48) (xy 20.58 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 6.06) (xy 15.74 8.48) (xy 18.16 8.48) (xy 18.16 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 6.06) (xy 13.32 8.48) (xy 15.74 8.48) (xy 15.74 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 6.06) (xy 10.9 8.48) (xy 13.32 8.48) (xy 13.32 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 6.06) (xy 8.48 8.48) (xy 10.9 8.48) (xy 10.9 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 6.06 6.06) (xy 6.06 8.48) (xy 8.48 8.48) (xy 8.48 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 6.06) (xy 1.22 8.48) (xy 3.64 8.48) (xy 3.64 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 6.06) (xy -1.2 8.48) (xy 1.22 8.48) (xy 1.22 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 6.06) (xy -3.62 8.48) (xy -1.2 8.48) (xy -1.2 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 6.06) (xy -6.04 8.48) (xy -3.62 8.48) (xy -3.62 6.06)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 3.64) (xy 23 6.06) (xy 25.42 6.06) (xy 25.42 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 3.64) (xy 20.58 6.06) (xy 23 6.06) (xy 23 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 3.64) (xy 15.74 6.06) (xy 18.16 6.06) (xy 18.16 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 3.64) (xy 13.32 6.06) (xy 15.74 6.06) (xy 15.74 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 3.64) (xy 10.9 6.06) (xy 13.32 6.06) (xy 13.32 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 3.64) (xy 3.64 6.06) (xy 6.06 6.06) (xy 6.06 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 3.64) (xy -1.2 6.06) (xy 1.22 6.06) (xy 1.22 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -8.46 3.64) (xy -8.46 6.06) (xy -6.04 6.06) (xy -6.04 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 3.64) (xy -10.88 6.06) (xy -8.46 6.06) (xy -8.46 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 3.64) (xy -22.98 6.06) (xy -20.56 6.06) (xy -20.56 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 3.64) (xy -25.4 6.06) (xy -22.98 6.06) (xy -22.98 3.64)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 1.22) (xy 23 3.64) (xy 25.42 3.64) (xy 25.42 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 1.22) (xy 18.16 3.64) (xy 20.58 3.64) (xy 20.58 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 1.22) (xy 13.32 3.64) (xy 15.74 3.64) (xy 15.74 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 1.22) (xy 10.9 3.64) (xy 13.32 3.64) (xy 13.32 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 1.22) (xy 3.64 3.64) (xy 6.06 3.64) (xy 6.06 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 1.22) (xy 1.22 3.64) (xy 3.64 3.64) (xy 3.64 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 1.22) (xy -1.2 3.64) (xy 1.22 3.64) (xy 1.22 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 1.22) (xy -3.62 3.64) (xy -1.2 3.64) (xy -1.2 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -8.46 1.22) (xy -8.46 3.64) (xy -6.04 3.64) (xy -6.04 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 1.22) (xy -15.72 3.64) (xy -13.3 3.64) (xy -13.3 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 1.22) (xy -18.14 3.64) (xy -15.72 3.64) (xy -15.72 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 1.22) (xy -20.56 3.64) (xy -18.14 3.64) (xy -18.14 1.22)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -1.2) (xy 23 1.22) (xy 25.42 1.22) (xy 25.42 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 -1.2) (xy 20.58 1.22) (xy 23 1.22) (xy 23 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 -1.2) (xy 10.9 1.22) (xy 13.32 1.22) (xy 13.32 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -1.2) (xy 8.48 1.22) (xy 10.9 1.22) (xy 10.9 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -1.2) (xy 3.64 1.22) (xy 6.06 1.22) (xy 6.06 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 -1.2) (xy 1.22 1.22) (xy 3.64 1.22) (xy 3.64 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -1.2) (xy -6.04 1.22) (xy -3.62 1.22) (xy -3.62 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -8.46 -1.2) (xy -8.46 1.22) (xy -6.04 1.22) (xy -6.04 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -1.2) (xy -10.88 1.22) (xy -8.46 1.22) (xy -8.46 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -1.2) (xy -20.56 1.22) (xy -18.14 1.22) (xy -18.14 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -1.2) (xy -25.4 1.22) (xy -22.98 1.22) (xy -22.98 -1.2)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -3.62) (xy 15.74 -1.2) (xy 18.16 -1.2) (xy 18.16 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -3.62) (xy 8.48 -1.2) (xy 10.9 -1.2) (xy 10.9 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -3.62) (xy 3.64 -1.2) (xy 6.06 -1.2) (xy 6.06 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -3.62) (xy -1.2 -1.2) (xy 1.22 -1.2) (xy 1.22 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -3.62) (xy -6.04 -1.2) (xy -3.62 -1.2) (xy -3.62 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -8.46 -3.62) (xy -8.46 -1.2) (xy -6.04 -1.2) (xy -6.04 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 -3.62) (xy -13.3 -1.2) (xy -10.88 -1.2) (xy -10.88 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -3.62) (xy -15.72 -1.2) (xy -13.3 -1.2) (xy -13.3 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -3.62) (xy -20.56 -1.2) (xy -18.14 -1.2) (xy -18.14 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 -3.62) (xy -22.98 -1.2) (xy -20.56 -1.2) (xy -20.56 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -3.62) (xy -25.4 -1.2) (xy -22.98 -1.2) (xy -22.98 -3.62)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -6.04) (xy 23 -3.62) (xy 25.42 -3.62) (xy 25.42 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 -6.04) (xy 20.58 -3.62) (xy 23 -3.62) (xy 23 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -6.04) (xy 18.16 -3.62) (xy 20.58 -3.62) (xy 20.58 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -6.04) (xy 13.32 -3.62) (xy 15.74 -3.62) (xy 15.74 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 6.06 -6.04) (xy 6.06 -3.62) (xy 8.48 -3.62) (xy 8.48 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 -6.04) (xy 1.22 -3.62) (xy 3.64 -3.62) (xy 3.64 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -6.04) (xy -6.04 -3.62) (xy -3.62 -3.62) (xy -3.62 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -8.46 -6.04) (xy -8.46 -3.62) (xy -6.04 -3.62) (xy -6.04 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -6.04) (xy -10.88 -3.62) (xy -8.46 -3.62) (xy -8.46 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 -6.04) (xy -13.3 -3.62) (xy -10.88 -3.62) (xy -10.88 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -6.04) (xy -15.72 -3.62) (xy -13.3 -3.62) (xy -13.3 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -6.04) (xy -18.14 -3.62) (xy -15.72 -3.62) (xy -15.72 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -6.04) (xy -25.4 -3.62) (xy -22.98 -3.62) (xy -22.98 -6.04)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -8.46) (xy -1.2 -6.04) (xy 1.22 -6.04) (xy 1.22 -8.46)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 -8.46) (xy -3.62 -6.04) (xy -1.2 -6.04) (xy -1.2 -8.46)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -10.88) (xy 23 -8.46) (xy 25.42 -8.46) (xy 25.42 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 -10.88) (xy 20.58 -8.46) (xy 23 -8.46) (xy 23 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -10.88) (xy 18.16 -8.46) (xy 20.58 -8.46) (xy 20.58 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -10.88) (xy 15.74 -8.46) (xy 18.16 -8.46) (xy 18.16 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -10.88) (xy 13.32 -8.46) (xy 15.74 -8.46) (xy 15.74 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 -10.88) (xy 10.9 -8.46) (xy 13.32 -8.46) (xy 13.32 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -10.88) (xy 8.48 -8.46) (xy 10.9 -8.46) (xy 10.9 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -10.88) (xy 3.64 -8.46) (xy 6.06 -8.46) (xy 6.06 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -10.88) (xy -1.2 -8.46) (xy 1.22 -8.46) (xy 1.22 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -10.88) (xy -6.04 -8.46) (xy -3.62 -8.46) (xy -3.62 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -10.88) (xy -10.88 -8.46) (xy -8.46 -8.46) (xy -8.46 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 -10.88) (xy -13.3 -8.46) (xy -10.88 -8.46) (xy -10.88 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -10.88) (xy -15.72 -8.46) (xy -13.3 -8.46) (xy -13.3 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -10.88) (xy -18.14 -8.46) (xy -15.72 -8.46) (xy -15.72 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -10.88) (xy -20.56 -8.46) (xy -18.14 -8.46) (xy -18.14 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 -10.88) (xy -22.98 -8.46) (xy -20.56 -8.46) (xy -20.56 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -10.88) (xy -25.4 -8.46) (xy -22.98 -8.46) (xy -22.98 -10.88)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -13.3) (xy 23 -10.88) (xy 25.42 -10.88) (xy 25.42 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -13.3) (xy 8.48 -10.88) (xy 10.9 -10.88) (xy 10.9 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -13.3) (xy -1.2 -10.88) (xy 1.22 -10.88) (xy 1.22 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 -13.3) (xy -3.62 -10.88) (xy -1.2 -10.88) (xy -1.2 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -13.3) (xy -10.88 -10.88) (xy -8.46 -10.88) (xy -8.46 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -13.3) (xy -25.4 -10.88) (xy -22.98 -10.88) (xy -22.98 -13.3)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -15.72) (xy 23 -13.3) (xy 25.42 -13.3) (xy 25.42 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -15.72) (xy 18.16 -13.3) (xy 20.58 -13.3) (xy 20.58 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -15.72) (xy 15.74 -13.3) (xy 18.16 -13.3) (xy 18.16 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -15.72) (xy 13.32 -13.3) (xy 15.74 -13.3) (xy 15.74 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -15.72) (xy 8.48 -13.3) (xy 10.9 -13.3) (xy 10.9 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -15.72) (xy 3.64 -13.3) (xy 6.06 -13.3) (xy 6.06 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 -15.72) (xy 1.22 -13.3) (xy 3.64 -13.3) (xy 3.64 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -15.72) (xy -6.04 -13.3) (xy -3.62 -13.3) (xy -3.62 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -15.72) (xy -10.88 -13.3) (xy -8.46 -13.3) (xy -8.46 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -15.72) (xy -15.72 -13.3) (xy -13.3 -13.3) (xy -13.3 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -15.72) (xy -18.14 -13.3) (xy -15.72 -13.3) (xy -15.72 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -15.72) (xy -20.56 -13.3) (xy -18.14 -13.3) (xy -18.14 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -15.72) (xy -25.4 -13.3) (xy -22.98 -13.3) (xy -22.98 -15.72)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -18.14) (xy 23 -15.72) (xy 25.42 -15.72) (xy 25.42 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -18.14) (xy 18.16 -15.72) (xy 20.58 -15.72) (xy 20.58 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -18.14) (xy 15.74 -15.72) (xy 18.16 -15.72) (xy 18.16 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -18.14) (xy 13.32 -15.72) (xy 15.74 -15.72) (xy 15.74 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -18.14) (xy 8.48 -15.72) (xy 10.9 -15.72) (xy 10.9 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -18.14) (xy -1.2 -15.72) (xy 1.22 -15.72) (xy 1.22 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -18.14) (xy -10.88 -15.72) (xy -8.46 -15.72) (xy -8.46 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -18.14) (xy -15.72 -15.72) (xy -13.3 -15.72) (xy -13.3 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -18.14) (xy -18.14 -15.72) (xy -15.72 -15.72) (xy -15.72 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -18.14) (xy -20.56 -15.72) (xy -18.14 -15.72) (xy -18.14 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -18.14) (xy -25.4 -15.72) (xy -22.98 -15.72) (xy -22.98 -18.14)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -20.56) (xy 23 -18.14) (xy 25.42 -18.14) (xy 25.42 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -20.56) (xy 18.16 -18.14) (xy 20.58 -18.14) (xy 20.58 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -20.56) (xy 15.74 -18.14) (xy 18.16 -18.14) (xy 18.16 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -20.56) (xy 13.32 -18.14) (xy 15.74 -18.14) (xy 15.74 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -20.56) (xy 8.48 -18.14) (xy 10.9 -18.14) (xy 10.9 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -20.56) (xy 3.64 -18.14) (xy 6.06 -18.14) (xy 6.06 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 -20.56) (xy 1.22 -18.14) (xy 3.64 -18.14) (xy 3.64 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -20.56) (xy -1.2 -18.14) (xy 1.22 -18.14) (xy 1.22 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -20.56) (xy -6.04 -18.14) (xy -3.62 -18.14) (xy -3.62 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -20.56) (xy -10.88 -18.14) (xy -8.46 -18.14) (xy -8.46 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -20.56) (xy -15.72 -18.14) (xy -13.3 -18.14) (xy -13.3 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -20.56) (xy -18.14 -18.14) (xy -15.72 -18.14) (xy -15.72 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -20.56) (xy -20.56 -18.14) (xy -18.14 -18.14) (xy -18.14 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -20.56) (xy -25.4 -18.14) (xy -22.98 -18.14) (xy -22.98 -20.56)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -22.98) (xy 23 -20.56) (xy 25.42 -20.56) (xy 25.42 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -22.98) (xy 8.48 -20.56) (xy 10.9 -20.56) (xy 10.9 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -22.98) (xy 3.64 -20.56) (xy 6.06 -20.56) (xy 6.06 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 1.22 -22.98) (xy 1.22 -20.56) (xy 3.64 -20.56) (xy 3.64 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -3.62 -22.98) (xy -3.62 -20.56) (xy -1.2 -20.56) (xy -1.2 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -22.98) (xy -6.04 -20.56) (xy -3.62 -20.56) (xy -3.62 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -22.98) (xy -10.88 -20.56) (xy -8.46 -20.56) (xy -8.46 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -22.98) (xy -25.4 -20.56) (xy -22.98 -20.56) (xy -22.98 -22.98)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 23 -25.4) (xy 23 -22.98) (xy 25.42 -22.98) (xy 25.42 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 20.58 -25.4) (xy 20.58 -22.98) (xy 23 -22.98) (xy 23 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 18.16 -25.4) (xy 18.16 -22.98) (xy 20.58 -22.98) (xy 20.58 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 15.74 -25.4) (xy 15.74 -22.98) (xy 18.16 -22.98) (xy 18.16 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 13.32 -25.4) (xy 13.32 -22.98) (xy 15.74 -22.98) (xy 15.74 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 10.9 -25.4) (xy 10.9 -22.98) (xy 13.32 -22.98) (xy 13.32 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 8.48 -25.4) (xy 8.48 -22.98) (xy 10.9 -22.98) (xy 10.9 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy 3.64 -25.4) (xy 3.64 -22.98) (xy 6.06 -22.98) (xy 6.06 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -1.2 -25.4) (xy -1.2 -22.98) (xy 1.22 -22.98) (xy 1.22 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -6.04 -25.4) (xy -6.04 -22.98) (xy -3.62 -22.98) (xy -3.62 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -10.88 -25.4) (xy -10.88 -22.98) (xy -8.46 -22.98) (xy -8.46 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -13.3 -25.4) (xy -13.3 -22.98) (xy -10.88 -22.98) (xy -10.88 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -15.72 -25.4) (xy -15.72 -22.98) (xy -13.3 -22.98) (xy -13.3 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -18.14 -25.4) (xy -18.14 -22.98) (xy -15.72 -22.98) (xy -15.72 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -20.56 -25.4) (xy -20.56 -22.98) (xy -18.14 -22.98) (xy -18.14 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -22.98 -25.4) (xy -22.98 -22.98) (xy -20.56 -22.98) (xy -20.56 -25.4)) (layer F.Cu) (width 0))
(fp_poly (pts (xy -25.4 -25.4) (xy -25.4 -22.98) (xy -22.98 -22.98) (xy -22.98 -25.4)) (layer F.Cu) (width 0))
(fp_text user "bogus 1 2 3 4" (at 0 -35.15) (layer F.Cu) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_mask: 6" (at 0 -33.45) (layer F.Cu) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_ecc: 1,0" (at 0 -31.75) (layer F.Cu) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_size: 21" (at 0 -30.05) (layer F.Cu) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_version: 1" (at 0 -28.35) (layer F.Cu) hide
(effects (font (size 1 1) (thickness 0.15)))
)
)
(module qr:QR2 (layer F.Cu) (tedit 0) (tstamp 61D27619)
(at 101.1 79)
(fp_text reference QR2 (at 0 8.75) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value QR2 (at 0 -8.75) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_poly (pts (xy -7.5 -7.5) (xy -7.5 -6.9) (xy -6.9 -6.9) (xy -6.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 -7.5) (xy -6.9 -6.9) (xy -6.3 -6.9) (xy -6.3 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -7.5) (xy -6.3 -6.9) (xy -5.7 -6.9) (xy -5.7 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -7.5) (xy -5.7 -6.9) (xy -5.1 -6.9) (xy -5.1 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -7.5) (xy -5.1 -6.9) (xy -4.5 -6.9) (xy -4.5 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 -7.5) (xy -4.5 -6.9) (xy -3.9 -6.9) (xy -3.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -7.5) (xy -3.9 -6.9) (xy -3.3 -6.9) (xy -3.3 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -7.5) (xy -2.7 -6.9) (xy -2.1 -6.9) (xy -2.1 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -7.5) (xy -1.5 -6.9) (xy -0.9 -6.9) (xy -0.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -7.5) (xy -0.9 -6.9) (xy -0.3 -6.9) (xy -0.3 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -7.5) (xy -0.3 -6.9) (xy 0.3 -6.9) (xy 0.3 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -7.5) (xy 0.3 -6.9) (xy 0.9 -6.9) (xy 0.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -7.5) (xy 0.9 -6.9) (xy 1.5 -6.9) (xy 1.5 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -7.5) (xy 3.3 -6.9) (xy 3.9 -6.9) (xy 3.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 -7.5) (xy 3.9 -6.9) (xy 4.5 -6.9) (xy 4.5 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -7.5) (xy 4.5 -6.9) (xy 5.1 -6.9) (xy 5.1 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 -7.5) (xy 5.1 -6.9) (xy 5.7 -6.9) (xy 5.7 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -7.5) (xy 5.7 -6.9) (xy 6.3 -6.9) (xy 6.3 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -7.5) (xy 6.3 -6.9) (xy 6.9 -6.9) (xy 6.9 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -7.5) (xy 6.9 -6.9) (xy 7.5 -6.9) (xy 7.5 -7.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -6.9) (xy -7.5 -6.3) (xy -6.9 -6.3) (xy -6.9 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -6.9) (xy -3.9 -6.3) (xy -3.3 -6.3) (xy -3.3 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -6.9) (xy -2.7 -6.3) (xy -2.1 -6.3) (xy -2.1 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -6.9) (xy -2.1 -6.3) (xy -1.5 -6.3) (xy -1.5 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -6.9) (xy 0.3 -6.3) (xy 0.9 -6.3) (xy 0.9 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -6.9) (xy 0.9 -6.3) (xy 1.5 -6.3) (xy 1.5 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -6.9) (xy 1.5 -6.3) (xy 2.1 -6.3) (xy 2.1 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -6.9) (xy 2.1 -6.3) (xy 2.7 -6.3) (xy 2.7 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -6.9) (xy 3.3 -6.3) (xy 3.9 -6.3) (xy 3.9 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -6.9) (xy 6.9 -6.3) (xy 7.5 -6.3) (xy 7.5 -6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -6.3) (xy -7.5 -5.7) (xy -6.9 -5.7) (xy -6.9 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -6.3) (xy -6.3 -5.7) (xy -5.7 -5.7) (xy -5.7 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -6.3) (xy -5.7 -5.7) (xy -5.1 -5.7) (xy -5.1 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -6.3) (xy -5.1 -5.7) (xy -4.5 -5.7) (xy -4.5 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -6.3) (xy -3.9 -5.7) (xy -3.3 -5.7) (xy -3.3 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -6.3) (xy -2.7 -5.7) (xy -2.1 -5.7) (xy -2.1 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -6.3) (xy 0.9 -5.7) (xy 1.5 -5.7) (xy 1.5 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -6.3) (xy 2.1 -5.7) (xy 2.7 -5.7) (xy 2.7 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -6.3) (xy 3.3 -5.7) (xy 3.9 -5.7) (xy 3.9 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -6.3) (xy 4.5 -5.7) (xy 5.1 -5.7) (xy 5.1 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 -6.3) (xy 5.1 -5.7) (xy 5.7 -5.7) (xy 5.7 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -6.3) (xy 5.7 -5.7) (xy 6.3 -5.7) (xy 6.3 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -6.3) (xy 6.9 -5.7) (xy 7.5 -5.7) (xy 7.5 -6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -5.7) (xy -7.5 -5.1) (xy -6.9 -5.1) (xy -6.9 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -5.7) (xy -6.3 -5.1) (xy -5.7 -5.1) (xy -5.7 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -5.7) (xy -5.7 -5.1) (xy -5.1 -5.1) (xy -5.1 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -5.7) (xy -5.1 -5.1) (xy -4.5 -5.1) (xy -4.5 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -5.7) (xy -3.9 -5.1) (xy -3.3 -5.1) (xy -3.3 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -5.7) (xy -2.1 -5.1) (xy -1.5 -5.1) (xy -1.5 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -5.7) (xy -0.9 -5.1) (xy -0.3 -5.1) (xy -0.3 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -5.7) (xy -0.3 -5.1) (xy 0.3 -5.1) (xy 0.3 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -5.7) (xy 1.5 -5.1) (xy 2.1 -5.1) (xy 2.1 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -5.7) (xy 3.3 -5.1) (xy 3.9 -5.1) (xy 3.9 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -5.7) (xy 4.5 -5.1) (xy 5.1 -5.1) (xy 5.1 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 -5.7) (xy 5.1 -5.1) (xy 5.7 -5.1) (xy 5.7 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -5.7) (xy 5.7 -5.1) (xy 6.3 -5.1) (xy 6.3 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -5.7) (xy 6.9 -5.1) (xy 7.5 -5.1) (xy 7.5 -5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -5.1) (xy -7.5 -4.5) (xy -6.9 -4.5) (xy -6.9 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -5.1) (xy -6.3 -4.5) (xy -5.7 -4.5) (xy -5.7 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -5.1) (xy -5.7 -4.5) (xy -5.1 -4.5) (xy -5.1 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -5.1) (xy -5.1 -4.5) (xy -4.5 -4.5) (xy -4.5 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -5.1) (xy -3.9 -4.5) (xy -3.3 -4.5) (xy -3.3 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -5.1) (xy -1.5 -4.5) (xy -0.9 -4.5) (xy -0.9 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -5.1) (xy -0.9 -4.5) (xy -0.3 -4.5) (xy -0.3 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -5.1) (xy -0.3 -4.5) (xy 0.3 -4.5) (xy 0.3 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -5.1) (xy 0.3 -4.5) (xy 0.9 -4.5) (xy 0.9 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -5.1) (xy 0.9 -4.5) (xy 1.5 -4.5) (xy 1.5 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -5.1) (xy 2.1 -4.5) (xy 2.7 -4.5) (xy 2.7 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -5.1) (xy 3.3 -4.5) (xy 3.9 -4.5) (xy 3.9 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -5.1) (xy 4.5 -4.5) (xy 5.1 -4.5) (xy 5.1 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 -5.1) (xy 5.1 -4.5) (xy 5.7 -4.5) (xy 5.7 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -5.1) (xy 5.7 -4.5) (xy 6.3 -4.5) (xy 6.3 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -5.1) (xy 6.9 -4.5) (xy 7.5 -4.5) (xy 7.5 -5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -4.5) (xy -7.5 -3.9) (xy -6.9 -3.9) (xy -6.9 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -4.5) (xy -3.9 -3.9) (xy -3.3 -3.9) (xy -3.3 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -4.5) (xy -2.7 -3.9) (xy -2.1 -3.9) (xy -2.1 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -4.5) (xy -2.1 -3.9) (xy -1.5 -3.9) (xy -1.5 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -4.5) (xy -1.5 -3.9) (xy -0.9 -3.9) (xy -0.9 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -4.5) (xy 0.3 -3.9) (xy 0.9 -3.9) (xy 0.9 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -4.5) (xy 0.9 -3.9) (xy 1.5 -3.9) (xy 1.5 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -4.5) (xy 2.1 -3.9) (xy 2.7 -3.9) (xy 2.7 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -4.5) (xy 3.3 -3.9) (xy 3.9 -3.9) (xy 3.9 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -4.5) (xy 6.9 -3.9) (xy 7.5 -3.9) (xy 7.5 -4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -3.9) (xy -7.5 -3.3) (xy -6.9 -3.3) (xy -6.9 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 -3.9) (xy -6.9 -3.3) (xy -6.3 -3.3) (xy -6.3 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -3.9) (xy -6.3 -3.3) (xy -5.7 -3.3) (xy -5.7 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -3.9) (xy -5.7 -3.3) (xy -5.1 -3.3) (xy -5.1 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -3.9) (xy -5.1 -3.3) (xy -4.5 -3.3) (xy -4.5 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 -3.9) (xy -4.5 -3.3) (xy -3.9 -3.3) (xy -3.9 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -3.9) (xy -3.9 -3.3) (xy -3.3 -3.3) (xy -3.3 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -3.9) (xy -2.7 -3.3) (xy -2.1 -3.3) (xy -2.1 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -3.9) (xy -1.5 -3.3) (xy -0.9 -3.3) (xy -0.9 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -3.9) (xy -0.3 -3.3) (xy 0.3 -3.3) (xy 0.3 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -3.9) (xy 0.9 -3.3) (xy 1.5 -3.3) (xy 1.5 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -3.9) (xy 2.1 -3.3) (xy 2.7 -3.3) (xy 2.7 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -3.9) (xy 3.3 -3.3) (xy 3.9 -3.3) (xy 3.9 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 -3.9) (xy 3.9 -3.3) (xy 4.5 -3.3) (xy 4.5 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -3.9) (xy 4.5 -3.3) (xy 5.1 -3.3) (xy 5.1 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 -3.9) (xy 5.1 -3.3) (xy 5.7 -3.3) (xy 5.7 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -3.9) (xy 5.7 -3.3) (xy 6.3 -3.3) (xy 6.3 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -3.9) (xy 6.3 -3.3) (xy 6.9 -3.3) (xy 6.9 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -3.9) (xy 6.9 -3.3) (xy 7.5 -3.3) (xy 7.5 -3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -3.3) (xy -2.7 -2.7) (xy -2.1 -2.7) (xy -2.1 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -3.3) (xy -0.3 -2.7) (xy 0.3 -2.7) (xy 0.3 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -3.3) (xy 0.3 -2.7) (xy 0.9 -2.7) (xy 0.9 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -3.3) (xy 0.9 -2.7) (xy 1.5 -2.7) (xy 1.5 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -3.3) (xy 1.5 -2.7) (xy 2.1 -2.7) (xy 2.1 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -3.3) (xy 2.1 -2.7) (xy 2.7 -2.7) (xy 2.7 -3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -2.7) (xy -6.3 -2.1) (xy -5.7 -2.1) (xy -5.7 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -2.7) (xy -5.7 -2.1) (xy -5.1 -2.1) (xy -5.1 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -2.7) (xy -5.1 -2.1) (xy -4.5 -2.1) (xy -4.5 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -2.7) (xy -3.9 -2.1) (xy -3.3 -2.1) (xy -3.3 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -2.7) (xy -2.7 -2.1) (xy -2.1 -2.1) (xy -2.1 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -2.7) (xy -2.1 -2.1) (xy -1.5 -2.1) (xy -1.5 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -2.7) (xy 0.3 -2.1) (xy 0.9 -2.1) (xy 0.9 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -2.7) (xy 1.5 -2.1) (xy 2.1 -2.1) (xy 2.1 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.7 -2.7) (xy 2.7 -2.1) (xy 3.3 -2.1) (xy 3.3 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -2.7) (xy 3.3 -2.1) (xy 3.9 -2.1) (xy 3.9 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 -2.7) (xy 3.9 -2.1) (xy 4.5 -2.1) (xy 4.5 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -2.7) (xy 5.7 -2.1) (xy 6.3 -2.1) (xy 6.3 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -2.7) (xy 6.3 -2.1) (xy 6.9 -2.1) (xy 6.9 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -2.7) (xy 6.9 -2.1) (xy 7.5 -2.1) (xy 7.5 -2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -2.1) (xy -7.5 -1.5) (xy -6.9 -1.5) (xy -6.9 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -2.1) (xy -6.3 -1.5) (xy -5.7 -1.5) (xy -5.7 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -2.1) (xy -5.1 -1.5) (xy -4.5 -1.5) (xy -4.5 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 -2.1) (xy -4.5 -1.5) (xy -3.9 -1.5) (xy -3.9 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.3 -2.1) (xy -3.3 -1.5) (xy -2.7 -1.5) (xy -2.7 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -2.1) (xy -2.7 -1.5) (xy -2.1 -1.5) (xy -2.1 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -2.1) (xy -2.1 -1.5) (xy -1.5 -1.5) (xy -1.5 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -2.1) (xy -1.5 -1.5) (xy -0.9 -1.5) (xy -0.9 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -2.1) (xy -0.9 -1.5) (xy -0.3 -1.5) (xy -0.3 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -2.1) (xy 0.3 -1.5) (xy 0.9 -1.5) (xy 0.9 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -2.1) (xy 0.9 -1.5) (xy 1.5 -1.5) (xy 1.5 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 -2.1) (xy 2.1 -1.5) (xy 2.7 -1.5) (xy 2.7 -2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -1.5) (xy -3.9 -0.9) (xy -3.3 -0.9) (xy -3.3 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.3 -1.5) (xy -3.3 -0.9) (xy -2.7 -0.9) (xy -2.7 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -1.5) (xy -2.7 -0.9) (xy -2.1 -0.9) (xy -2.1 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -1.5) (xy -1.5 -0.9) (xy -0.9 -0.9) (xy -0.9 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -1.5) (xy -0.9 -0.9) (xy -0.3 -0.9) (xy -0.3 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -1.5) (xy 0.3 -0.9) (xy 0.9 -0.9) (xy 0.9 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -1.5) (xy 0.9 -0.9) (xy 1.5 -0.9) (xy 1.5 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -1.5) (xy 1.5 -0.9) (xy 2.1 -0.9) (xy 2.1 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -1.5) (xy 3.3 -0.9) (xy 3.9 -0.9) (xy 3.9 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -1.5) (xy 4.5 -0.9) (xy 5.1 -0.9) (xy 5.1 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -1.5) (xy 5.7 -0.9) (xy 6.3 -0.9) (xy 6.3 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -1.5) (xy 6.3 -0.9) (xy 6.9 -0.9) (xy 6.9 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 -1.5) (xy 6.9 -0.9) (xy 7.5 -0.9) (xy 7.5 -1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 -0.9) (xy -7.5 -0.3) (xy -6.9 -0.3) (xy -6.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 -0.9) (xy -6.9 -0.3) (xy -6.3 -0.3) (xy -6.3 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 -0.9) (xy -5.7 -0.3) (xy -5.1 -0.3) (xy -5.1 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 -0.9) (xy -4.5 -0.3) (xy -3.9 -0.3) (xy -3.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -0.9) (xy -2.1 -0.3) (xy -1.5 -0.3) (xy -1.5 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 -0.9) (xy -1.5 -0.3) (xy -0.9 -0.3) (xy -0.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -0.9) (xy -0.3 -0.3) (xy 0.3 -0.3) (xy 0.3 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 -0.9) (xy 0.3 -0.3) (xy 0.9 -0.3) (xy 0.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 -0.9) (xy 1.5 -0.3) (xy 2.1 -0.3) (xy 2.1 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -0.9) (xy 3.3 -0.3) (xy 3.9 -0.3) (xy 3.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -0.9) (xy 6.3 -0.3) (xy 6.9 -0.3) (xy 6.9 -0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 -0.3) (xy -6.9 0.3) (xy -6.3 0.3) (xy -6.3 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 -0.3) (xy -6.3 0.3) (xy -5.7 0.3) (xy -5.7 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 -0.3) (xy -5.1 0.3) (xy -4.5 0.3) (xy -4.5 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 -0.3) (xy -3.9 0.3) (xy -3.3 0.3) (xy -3.3 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 -0.3) (xy -2.7 0.3) (xy -2.1 0.3) (xy -2.1 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 -0.3) (xy -2.1 0.3) (xy -1.5 0.3) (xy -1.5 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 -0.3) (xy -0.9 0.3) (xy -0.3 0.3) (xy -0.3 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 -0.3) (xy -0.3 0.3) (xy 0.3 0.3) (xy 0.3 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 -0.3) (xy 0.9 0.3) (xy 1.5 0.3) (xy 1.5 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 -0.3) (xy 3.3 0.3) (xy 3.9 0.3) (xy 3.9 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 -0.3) (xy 3.9 0.3) (xy 4.5 0.3) (xy 4.5 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 -0.3) (xy 4.5 0.3) (xy 5.1 0.3) (xy 5.1 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 -0.3) (xy 5.7 0.3) (xy 6.3 0.3) (xy 6.3 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 -0.3) (xy 6.3 0.3) (xy 6.9 0.3) (xy 6.9 -0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 0.3) (xy -7.5 0.9) (xy -6.9 0.9) (xy -6.9 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 0.3) (xy -5.1 0.9) (xy -4.5 0.9) (xy -4.5 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 0.3) (xy -1.5 0.9) (xy -0.9 0.9) (xy -0.9 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 0.3) (xy 0.3 0.9) (xy 0.9 0.9) (xy 0.9 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 0.3) (xy 0.9 0.9) (xy 1.5 0.9) (xy 1.5 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 0.3) (xy 1.5 0.9) (xy 2.1 0.9) (xy 2.1 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 0.3) (xy 2.1 0.9) (xy 2.7 0.9) (xy 2.7 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.7 0.3) (xy 2.7 0.9) (xy 3.3 0.9) (xy 3.3 0.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 0.9) (xy -7.5 1.5) (xy -6.9 1.5) (xy -6.9 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 0.9) (xy -6.3 1.5) (xy -5.7 1.5) (xy -5.7 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 0.9) (xy -5.7 1.5) (xy -5.1 1.5) (xy -5.1 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 0.9) (xy -3.9 1.5) (xy -3.3 1.5) (xy -3.3 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.3 0.9) (xy -3.3 1.5) (xy -2.7 1.5) (xy -2.7 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 0.9) (xy -2.7 1.5) (xy -2.1 1.5) (xy -2.1 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 0.9) (xy -2.1 1.5) (xy -1.5 1.5) (xy -1.5 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 0.9) (xy -1.5 1.5) (xy -0.9 1.5) (xy -0.9 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 0.9) (xy -0.3 1.5) (xy 0.3 1.5) (xy 0.3 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 0.9) (xy 0.3 1.5) (xy 0.9 1.5) (xy 0.9 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 0.9) (xy 3.3 1.5) (xy 3.9 1.5) (xy 3.9 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 0.9) (xy 6.3 1.5) (xy 6.9 1.5) (xy 6.9 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 0.9) (xy 6.9 1.5) (xy 7.5 1.5) (xy 7.5 0.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 1.5) (xy -7.5 2.1) (xy -6.9 2.1) (xy -6.9 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 1.5) (xy -6.3 2.1) (xy -5.7 2.1) (xy -5.7 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 1.5) (xy -5.1 2.1) (xy -4.5 2.1) (xy -4.5 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 1.5) (xy -4.5 2.1) (xy -3.9 2.1) (xy -3.9 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.3 1.5) (xy -3.3 2.1) (xy -2.7 2.1) (xy -2.7 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 1.5) (xy -1.5 2.1) (xy -0.9 2.1) (xy -0.9 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 1.5) (xy -0.9 2.1) (xy -0.3 2.1) (xy -0.3 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 1.5) (xy 0.3 2.1) (xy 0.9 2.1) (xy 0.9 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 1.5) (xy 2.1 2.1) (xy 2.7 2.1) (xy 2.7 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.7 1.5) (xy 2.7 2.1) (xy 3.3 2.1) (xy 3.3 1.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 2.1) (xy -7.5 2.7) (xy -6.9 2.7) (xy -6.9 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 2.1) (xy -6.3 2.7) (xy -5.7 2.7) (xy -5.7 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 2.1) (xy -5.7 2.7) (xy -5.1 2.7) (xy -5.1 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 2.1) (xy -3.9 2.7) (xy -3.3 2.7) (xy -3.3 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.3 2.1) (xy -3.3 2.7) (xy -2.7 2.7) (xy -2.7 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 2.1) (xy 0.3 2.7) (xy 0.9 2.7) (xy 0.9 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 2.1) (xy 0.9 2.7) (xy 1.5 2.7) (xy 1.5 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 2.1) (xy 2.1 2.7) (xy 2.7 2.7) (xy 2.7 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.7 2.1) (xy 2.7 2.7) (xy 3.3 2.7) (xy 3.3 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 2.1) (xy 3.3 2.7) (xy 3.9 2.7) (xy 3.9 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 2.1) (xy 3.9 2.7) (xy 4.5 2.7) (xy 4.5 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 2.1) (xy 4.5 2.7) (xy 5.1 2.7) (xy 5.1 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 2.1) (xy 5.7 2.7) (xy 6.3 2.7) (xy 6.3 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 2.1) (xy 6.9 2.7) (xy 7.5 2.7) (xy 7.5 2.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 2.7) (xy -2.7 3.3) (xy -2.1 3.3) (xy -2.1 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 2.7) (xy -0.9 3.3) (xy -0.3 3.3) (xy -0.3 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 2.7) (xy 0.9 3.3) (xy 1.5 3.3) (xy 1.5 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 2.7) (xy 1.5 3.3) (xy 2.1 3.3) (xy 2.1 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 2.7) (xy 2.1 3.3) (xy 2.7 3.3) (xy 2.7 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 2.7) (xy 4.5 3.3) (xy 5.1 3.3) (xy 5.1 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 2.7) (xy 5.1 3.3) (xy 5.7 3.3) (xy 5.7 2.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 3.3) (xy -7.5 3.9) (xy -6.9 3.9) (xy -6.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 3.3) (xy -6.9 3.9) (xy -6.3 3.9) (xy -6.3 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 3.3) (xy -6.3 3.9) (xy -5.7 3.9) (xy -5.7 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 3.3) (xy -5.7 3.9) (xy -5.1 3.9) (xy -5.1 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 3.3) (xy -5.1 3.9) (xy -4.5 3.9) (xy -4.5 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 3.3) (xy -4.5 3.9) (xy -3.9 3.9) (xy -3.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 3.3) (xy -3.9 3.9) (xy -3.3 3.9) (xy -3.3 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 3.3) (xy -1.5 3.9) (xy -0.9 3.9) (xy -0.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 3.3) (xy -0.9 3.9) (xy -0.3 3.9) (xy -0.3 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 3.3) (xy 0.3 3.9) (xy 0.9 3.9) (xy 0.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 3.3) (xy 1.5 3.9) (xy 2.1 3.9) (xy 2.1 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 3.3) (xy 2.1 3.9) (xy 2.7 3.9) (xy 2.7 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 3.3) (xy 3.3 3.9) (xy 3.9 3.9) (xy 3.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 3.3) (xy 4.5 3.9) (xy 5.1 3.9) (xy 5.1 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 3.3) (xy 5.7 3.9) (xy 6.3 3.9) (xy 6.3 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 3.3) (xy 6.3 3.9) (xy 6.9 3.9) (xy 6.9 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 3.3) (xy 6.9 3.9) (xy 7.5 3.9) (xy 7.5 3.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 3.9) (xy -7.5 4.5) (xy -6.9 4.5) (xy -6.9 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 3.9) (xy -3.9 4.5) (xy -3.3 4.5) (xy -3.3 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 3.9) (xy -1.5 4.5) (xy -0.9 4.5) (xy -0.9 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 3.9) (xy -0.9 4.5) (xy -0.3 4.5) (xy -0.3 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 3.9) (xy -0.3 4.5) (xy 0.3 4.5) (xy 0.3 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 3.9) (xy 1.5 4.5) (xy 2.1 4.5) (xy 2.1 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 3.9) (xy 2.1 4.5) (xy 2.7 4.5) (xy 2.7 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 3.9) (xy 4.5 4.5) (xy 5.1 4.5) (xy 5.1 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 3.9) (xy 5.1 4.5) (xy 5.7 4.5) (xy 5.7 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 3.9) (xy 6.3 4.5) (xy 6.9 4.5) (xy 6.9 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 3.9) (xy 6.9 4.5) (xy 7.5 4.5) (xy 7.5 3.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 4.5) (xy -7.5 5.1) (xy -6.9 5.1) (xy -6.9 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 4.5) (xy -6.3 5.1) (xy -5.7 5.1) (xy -5.7 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 4.5) (xy -5.7 5.1) (xy -5.1 5.1) (xy -5.1 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 4.5) (xy -5.1 5.1) (xy -4.5 5.1) (xy -4.5 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 4.5) (xy -3.9 5.1) (xy -3.3 5.1) (xy -3.3 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 4.5) (xy -2.7 5.1) (xy -2.1 5.1) (xy -2.1 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 4.5) (xy -1.5 5.1) (xy -0.9 5.1) (xy -0.9 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 4.5) (xy -0.9 5.1) (xy -0.3 5.1) (xy -0.3 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 4.5) (xy -0.3 5.1) (xy 0.3 5.1) (xy 0.3 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 4.5) (xy 1.5 5.1) (xy 2.1 5.1) (xy 2.1 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 4.5) (xy 2.1 5.1) (xy 2.7 5.1) (xy 2.7 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.7 4.5) (xy 2.7 5.1) (xy 3.3 5.1) (xy 3.3 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 4.5) (xy 3.3 5.1) (xy 3.9 5.1) (xy 3.9 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 4.5) (xy 3.9 5.1) (xy 4.5 5.1) (xy 4.5 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 4.5) (xy 4.5 5.1) (xy 5.1 5.1) (xy 5.1 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 4.5) (xy 5.1 5.1) (xy 5.7 5.1) (xy 5.7 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 4.5) (xy 5.7 5.1) (xy 6.3 5.1) (xy 6.3 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 4.5) (xy 6.3 5.1) (xy 6.9 5.1) (xy 6.9 4.5)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 5.1) (xy -7.5 5.7) (xy -6.9 5.7) (xy -6.9 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 5.1) (xy -6.3 5.7) (xy -5.7 5.7) (xy -5.7 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 5.1) (xy -5.7 5.7) (xy -5.1 5.7) (xy -5.1 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 5.1) (xy -5.1 5.7) (xy -4.5 5.7) (xy -4.5 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 5.1) (xy -3.9 5.7) (xy -3.3 5.7) (xy -3.3 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 5.1) (xy -2.7 5.7) (xy -2.1 5.7) (xy -2.1 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 5.1) (xy -2.1 5.7) (xy -1.5 5.7) (xy -1.5 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 5.1) (xy -0.9 5.7) (xy -0.3 5.7) (xy -0.3 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 5.1) (xy -0.3 5.7) (xy 0.3 5.7) (xy 0.3 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 5.1) (xy 1.5 5.7) (xy 2.1 5.7) (xy 2.1 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 5.1) (xy 3.3 5.7) (xy 3.9 5.7) (xy 3.9 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 4.5 5.1) (xy 4.5 5.7) (xy 5.1 5.7) (xy 5.1 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 5.1) (xy 5.1 5.7) (xy 5.7 5.7) (xy 5.7 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 5.1) (xy 6.9 5.7) (xy 7.5 5.7) (xy 7.5 5.1)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 5.7) (xy -7.5 6.3) (xy -6.9 6.3) (xy -6.9 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 5.7) (xy -6.3 6.3) (xy -5.7 6.3) (xy -5.7 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 5.7) (xy -5.7 6.3) (xy -5.1 6.3) (xy -5.1 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 5.7) (xy -5.1 6.3) (xy -4.5 6.3) (xy -4.5 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 5.7) (xy -3.9 6.3) (xy -3.3 6.3) (xy -3.3 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.7 5.7) (xy -2.7 6.3) (xy -2.1 6.3) (xy -2.1 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 5.7) (xy -2.1 6.3) (xy -1.5 6.3) (xy -1.5 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 5.7) (xy -1.5 6.3) (xy -0.9 6.3) (xy -0.9 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 5.7) (xy 0.3 6.3) (xy 0.9 6.3) (xy 0.9 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 5.7) (xy 0.9 6.3) (xy 1.5 6.3) (xy 1.5 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 5.7) (xy 5.1 6.3) (xy 5.7 6.3) (xy 5.7 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 5.7) (xy 6.9 6.3) (xy 7.5 6.3) (xy 7.5 5.7)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 6.3) (xy -7.5 6.9) (xy -6.9 6.9) (xy -6.9 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 6.3) (xy -3.9 6.9) (xy -3.3 6.9) (xy -3.3 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 6.3) (xy -2.1 6.9) (xy -1.5 6.9) (xy -1.5 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.9 6.3) (xy -0.9 6.9) (xy -0.3 6.9) (xy -0.3 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 6.3) (xy 0.3 6.9) (xy 0.9 6.9) (xy 0.9 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 6.3) (xy 0.9 6.9) (xy 1.5 6.9) (xy 1.5 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 2.1 6.3) (xy 2.1 6.9) (xy 2.7 6.9) (xy 2.7 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 6.3) (xy 3.3 6.9) (xy 3.9 6.9) (xy 3.9 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.9 6.3) (xy 3.9 6.9) (xy 4.5 6.9) (xy 4.5 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.1 6.3) (xy 5.1 6.9) (xy 5.7 6.9) (xy 5.7 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 6.3) (xy 6.9 6.9) (xy 7.5 6.9) (xy 7.5 6.3)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -7.5 6.9) (xy -7.5 7.5) (xy -6.9 7.5) (xy -6.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.9 6.9) (xy -6.9 7.5) (xy -6.3 7.5) (xy -6.3 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -6.3 6.9) (xy -6.3 7.5) (xy -5.7 7.5) (xy -5.7 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.7 6.9) (xy -5.7 7.5) (xy -5.1 7.5) (xy -5.1 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -5.1 6.9) (xy -5.1 7.5) (xy -4.5 7.5) (xy -4.5 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -4.5 6.9) (xy -4.5 7.5) (xy -3.9 7.5) (xy -3.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -3.9 6.9) (xy -3.9 7.5) (xy -3.3 7.5) (xy -3.3 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -2.1 6.9) (xy -2.1 7.5) (xy -1.5 7.5) (xy -1.5 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -1.5 6.9) (xy -1.5 7.5) (xy -0.9 7.5) (xy -0.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy -0.3 6.9) (xy -0.3 7.5) (xy 0.3 7.5) (xy 0.3 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.3 6.9) (xy 0.3 7.5) (xy 0.9 7.5) (xy 0.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 0.9 6.9) (xy 0.9 7.5) (xy 1.5 7.5) (xy 1.5 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 1.5 6.9) (xy 1.5 7.5) (xy 2.1 7.5) (xy 2.1 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 3.3 6.9) (xy 3.3 7.5) (xy 3.9 7.5) (xy 3.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 5.7 6.9) (xy 5.7 7.5) (xy 6.3 7.5) (xy 6.3 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.3 6.9) (xy 6.3 7.5) (xy 6.9 7.5) (xy 6.9 6.9)) (layer F.SilkS) (width 0))
(fp_poly (pts (xy 6.9 6.9) (xy 6.9 7.5) (xy 7.5 7.5) (xy 7.5 6.9)) (layer F.SilkS) (width 0))
(fp_text user "bogus 1 2 3 4" (at 0 -17.25) (layer F.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_mask: 2" (at 0 -15.55) (layer F.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_ecc: 3,2" (at 0 -13.85) (layer F.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_size: 25" (at 0 -12.15) (layer F.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "qr_version: 2" (at 0 -10.45) (layer F.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)))
)
)
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -947,6 +947,7 @@ def test_qr_lib_1(test_dir):
prj = 'qr_test/qr_test'
ctx = context.TestContext(test_dir, 'test_qr_lib_1', prj, 'qr_lib_1', POS_DIR)
ctx.run() # extra_debug=True
# Check the schematic
fname = 'Schematic.pdf'
ctx.expect_out_file(fname)
cmd = ['convert', '-density', '300', ctx.get_out_path(fname), ctx.get_out_path('%d.png')]
@ -959,9 +960,25 @@ def test_qr_lib_1(test_dir):
res = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode()
logging.debug(res.split('\n')[0])
assert 'QR-Code:https://github.com/INTI-CMNB/KiBot/' in res
# Check the PCB
fname = 'PCB.pdf'
ctx.expect_out_file(fname)
cmd = ['convert', '-density', '300', ctx.get_out_path(fname), ctx.get_out_path('p%d.png')]
subprocess.check_call(cmd)
cmd = ['zbarimg', ctx.get_out_path('p0.png')]
res = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode()
logging.debug(res.split('\n')[0])
assert 'QR-Code:QR PCB B' in res
cmd = ['zbarimg', ctx.get_out_path('p1.png')]
res = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode()
logging.debug(res.split('\n')[0])
assert 'QR-Code:https://github.com/INTI-CMNB/KiBot/' in res
# Restore the original files
bd = ctx.get_board_dir()
files = ['qr.lib', 'qr.kicad_sym', 'qr.pretty/QR.kicad_mod', 'qr.pretty/QR2.kicad_mod']
files = ['qr.lib', 'qr.kicad_sym', 'qr.pretty/QR.kicad_mod', 'qr.pretty/QR2.kicad_mod', 'qr_test.kicad_pcb']
for f in files:
bogus = os.path.join(bd, 'qr_test/'+f+'.bogus')
if os.path.isfile(bogus):
shutil.copy2(bogus, os.path.join(bd, 'qr_test/'+f))
os.remove(os.path.join(bd, 'qr_test/qr_test.kicad_pcb-bak'))
os.remove(os.path.join(bd, 'qr_test/qr_test.pro-bak'))

View File

@ -2,6 +2,9 @@
kibot:
version: 1
preflight:
update_qr: true
outputs:
- name: 'QRCodes'
comment: "Example of QR codes"
@ -20,9 +23,19 @@ outputs:
- name: 'print_sch'
comment: "Print schematic (PDF)"
type: pdf_sch_print
dir: .
options:
output: Schematic.pdf
monochrome: true
frame: false
- name: 'print_front'
comment: "Print F.SilkS and F.Cu"
type: pdf_pcb_print
options:
output: PCB.pdf
plot_sheet_reference: false
monochrome: true
separated: true
layers:
- layer: F.SilkS
- layer: F.Cu