From 57c2c4e702b7bc17ce0895d4df8b392063c356a8 Mon Sep 17 00:00:00 2001 From: Manoj Chavva Date: Fri, 20 Sep 2024 17:01:16 +0530 Subject: [PATCH 1/3] Minor name change of tstamp to uuid for supporting kicad 8.0 and Updated the GrPoly of GraphicItems in the board to consist the net name --- CHANGELOG.md | 164 - CONTRIBUTING.md | 60 - LICENSE | 674 --- README.md | 50 - src/kiutils/__init__.py => __init__.py | 0 src/kiutils/board.py => board.py | 0 docs/Makefile | 20 - docs/conf.py | 61 - docs/index.rst | 50 - docs/make.bat | 35 - docs/misc/known-issues.rst | 27 - docs/module/kiutils.items.rst | 74 - docs/module/kiutils.misc.rst | 11 - docs/module/kiutils.rst | 58 - docs/module/kiutils.utils.rst | 18 - docs/usage/development.rst | 41 - docs/usage/examples.rst | 147 - docs/usage/getting-started.rst | 65 - docs/usage/installation.rst | 12 - src/kiutils/dru.py => dru.py | 0 src/kiutils/footprint.py => footprint.py | 20 +- {src/kiutils/items => items}/brditems.py | 36 +- {src/kiutils/items => items}/common.py | 0 {src/kiutils/items => items}/dimensions.py | 8 +- {src/kiutils/items => items}/fpitems.py | 93 +- {src/kiutils/items => items}/gritems.py | 106 +- {src/kiutils/items => items}/schitems.py | 0 {src/kiutils/items => items}/syitems.py | 0 {src/kiutils/items => items}/zones.py | 12 +- kiutils/__init__.py | 10 + kiutils/board.py | 323 ++ kiutils/dru.py | 315 + kiutils/footprint.py | 1098 ++++ kiutils/items/brditems.py | 1104 ++++ kiutils/items/common.py | 1179 ++++ kiutils/items/dimensions.py | 338 ++ kiutils/items/fpitems.py | 861 +++ kiutils/items/gritems.py | 780 +++ kiutils/items/schitems.py | 1919 ++++++ kiutils/items/syitems.py | 572 ++ kiutils/items/zones.py | 657 +++ {src/kiutils => kiutils}/libraries.py | 0 {src/kiutils => kiutils}/misc/config.py | 0 {src/kiutils => kiutils}/schematic.py | 0 {src/kiutils => kiutils}/symbol.py | 0 {src/kiutils => kiutils}/utils/sexpr.py | 0 {src/kiutils => kiutils}/utils/strings.py | 0 {src/kiutils => kiutils}/wks.py | 0 libraries.py | 216 + misc/config.py | 17 + pyproject.toml | 3 - requirements_dev.txt | 5 - schematic.py | 351 ++ setup.cfg | 30 - setup.py | 13 - symbol.py | 592 ++ test.py | 37 - tests/__init__.py | 17 - tests/reporter/README.md | 208 - tests/reporter/result.py | 483 -- tests/reporter/runner.py | 119 - tests/reporter/template/report_template.html | 192 - tests/template.py | 15 - tests/test_board.py | 151 - tests/test_designrules.py | 51 - tests/test_footprint.py | 183 - tests/test_libtable.py | 65 - tests/test_misc.py | 35 - tests/test_schematic.py | 210 - tests/test_symbol.py | 169 - tests/test_worksheets.py | 37 - .../board/since_v7/test_imageWithLayerToken | 28 - .../board/since_v7/test_pcbPlotParams | 52 - .../board/since_v7/test_textBoxAllVariants | 306 - .../testdata/board/since_v7/test_textKnockout | 50 - .../board/since_v7/test_textsWithRenderCaches | 85 - .../board/test_allFpManufacturingAttributes | 874 --- .../test_boardStackup32LayerDielectricsVias | 302 - tests/testdata/board/test_boardTraceArcs | 397 -- .../board/test_boardWithAllPrimitives | 1466 ----- .../test_boardWithAllPrimitives.expected | 1466 ----- tests/testdata/board/test_createEmptyBoard | 46 - tests/testdata/board/test_pcbPlotParams | 51 - .../board/test_renameFootprintIdToken | 72 - .../test_renameFootprintIdToken.expected | 72 - .../board/test_zoneOnAllLayersWildcard | 24 - .../testdata/board/test_zoneOnOuterLayersOnly | 24 - .../designrules/since_v7/test_severityToken | 15 - .../designrules/test_allDesignRuleItems | 52 - .../designrules/test_createNewDesignRules | 1 - .../legacy/test_moduleNameOnlyNumbers | 3 - .../test_moduleNameOnlyNumbers.expected | 5 - .../since_v7/test_3dModelOpacityToken | 10 - .../since_v7/test_exemptFromCourtyardToken | 7 - .../since_v7/test_imageWithLayerToken | 27 - .../footprint/since_v7/test_netTiePadGroups | 18 - .../since_v7/test_privateLayersToken | 27 - .../since_v7/test_textBoxAllVariants | 439 -- .../footprint/since_v7/test_textKnockout | 15 - .../since_v7/test_textsWithRenderCaches | 61 - .../footprint/test_3dModelHideProperty | 9 - .../testdata/footprint/test_allFootprintItems | 149 - .../footprint/test_allFootprintItems.expected | 149 - .../test_createNewFootprintTypeOther | 13 - .../footprint/test_createNewFootprintTypeSMD | 14 - .../footprint/test_createNewFootprintTypeTHT | 14 - .../footprint/test_footprintEmptyAttributes | 19 - .../test_footprintEmptyAttributes.expected | 18 - .../footprint/test_footprintPadNewLines | 97 - ...t_addEmptyLibraryObjectToLibTable.expected | 3 - .../test_addLibraryObjectToLibTable.expected | 3 - .../testdata/libtable/test_createNewLibTable | 2 - .../libtable/test_parseFpLibTable.expected | 4 - .../libtable/test_parseSymLibTable.expected | 4 - .../misc/test_quotesAndBackslashInSexpr | 61 - .../schematic/since_v7/test_arcAllVariants | 132 - .../schematic/since_v7/test_busAliases | 16 - .../schematic/since_v7/test_circleAllVariants | 92 - .../schematic/since_v7/test_netclassFlags | 166 - .../since_v7/test_rectangleAllVariants | 102 - .../since_v7/test_schematicWithAllPrimitives | 989 ---- .../schematic/since_v7/test_sheetProperties | 40 - ...cialLibIdWithMultipleUnderscoresAndNumbers | 440 -- .../since_v7/test_strokeOptionalTokens | 25 - .../since_v7/test_symbolPinOptionalTokens | 114 - .../since_v7/test_textBoxAllVariants | 327 -- .../schematic/test.kicad_sch.expected | 887 --- .../test_addPropertyToSchematicSymbol | 140 - ...test_addPropertyToSchematicSymbol.expected | 140 - .../test_createEmptySchematic.expected | 8 - ...est_hierarchicalSchematicWithAllPrimitives | 755 --- ...rchicalSchematicWithAllPrimitives.expected | 755 --- .../testdata/schematic/test_parseStrokeTokens | 64 - .../test_renameSymbolIdTokenInSchematic | 41 - ...st_renameSymbolIdTokenInSchematic.expected | 42 - .../schematic/test_schematicWithAllPrimitives | 891 --- .../test_schematicWithAllPrimitives.expected | 887 --- .../schematic/test_setSymbolLibNameToken | 36 - .../test_setSymbolLibNameToken.expected | 36 - .../symbol/since_v7/test_arcAllVariants | 162 - .../symbol/since_v7/test_circleAllVariants | 138 - .../symbol/since_v7/test_rectangleAllVariants | 138 - .../symbol/since_v7/test_textBoxAllVariants | 708 --- .../symbol/test_allSymbolAlternatePins | 174 - .../symbol/test_allSymbolPinVariations | 402 -- tests/testdata/symbol/test_bigSymbolLibrary | 3252 ----------- .../symbol/test_createNewSymbolInEmptyLibrary | 16 - .../test_createNewTopLevelSymbolFromChild | 16 - ..._createNewTopLevelSymbolFromChild.expected | 25 - tests/testdata/symbol/test_mergeLibraries | 4760 --------------- .../symbol/test_mergeLibraries.expected | 5128 ----------------- .../symbol/test_renameParentIdUsingIdToken | 112 - .../test_renameParentIdUsingIdToken.expected | 112 - .../symbol/test_symbolDemorganSyItems | 370 -- .../testdata/symbol/test_symbolDemorganUnits | 109 - tests/testdata/symbol/test_symbolIdParser | 14 - tests/testdata/symbol/test_symbolParameters | 52 - .../worksheets/test_allWorkSheetItems | 2104 ------- .../worksheets/test_createNewWorksheet | 4 - tests/testfunctions.py | 100 - utils/sexpr.py | 43 + utils/strings.py | 36 + wks.py | 962 ++++ 163 files changed, 11506 insertions(+), 35307 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md rename src/kiutils/__init__.py => __init__.py (100%) rename src/kiutils/board.py => board.py (100%) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/misc/known-issues.rst delete mode 100644 docs/module/kiutils.items.rst delete mode 100644 docs/module/kiutils.misc.rst delete mode 100644 docs/module/kiutils.rst delete mode 100644 docs/module/kiutils.utils.rst delete mode 100644 docs/usage/development.rst delete mode 100644 docs/usage/examples.rst delete mode 100644 docs/usage/getting-started.rst delete mode 100644 docs/usage/installation.rst rename src/kiutils/dru.py => dru.py (100%) rename src/kiutils/footprint.py => footprint.py (98%) rename {src/kiutils/items => items}/brditems.py (97%) rename {src/kiutils/items => items}/common.py (100%) rename {src/kiutils/items => items}/dimensions.py (98%) rename {src/kiutils/items => items}/fpitems.py (91%) rename {src/kiutils/items => items}/gritems.py (89%) rename {src/kiutils/items => items}/schitems.py (100%) rename {src/kiutils/items => items}/syitems.py (100%) rename {src/kiutils/items => items}/zones.py (98%) create mode 100644 kiutils/__init__.py create mode 100644 kiutils/board.py create mode 100644 kiutils/dru.py create mode 100644 kiutils/footprint.py create mode 100644 kiutils/items/brditems.py create mode 100644 kiutils/items/common.py create mode 100644 kiutils/items/dimensions.py create mode 100644 kiutils/items/fpitems.py create mode 100644 kiutils/items/gritems.py create mode 100644 kiutils/items/schitems.py create mode 100644 kiutils/items/syitems.py create mode 100644 kiutils/items/zones.py rename {src/kiutils => kiutils}/libraries.py (100%) rename {src/kiutils => kiutils}/misc/config.py (100%) rename {src/kiutils => kiutils}/schematic.py (100%) rename {src/kiutils => kiutils}/symbol.py (100%) rename {src/kiutils => kiutils}/utils/sexpr.py (100%) rename {src/kiutils => kiutils}/utils/strings.py (100%) rename {src/kiutils => kiutils}/wks.py (100%) create mode 100644 libraries.py create mode 100644 misc/config.py delete mode 100644 pyproject.toml delete mode 100644 requirements_dev.txt create mode 100644 schematic.py delete mode 100644 setup.cfg delete mode 100644 setup.py create mode 100644 symbol.py delete mode 100644 test.py delete mode 100644 tests/__init__.py delete mode 100644 tests/reporter/README.md delete mode 100644 tests/reporter/result.py delete mode 100644 tests/reporter/runner.py delete mode 100644 tests/reporter/template/report_template.html delete mode 100644 tests/template.py delete mode 100644 tests/test_board.py delete mode 100644 tests/test_designrules.py delete mode 100644 tests/test_footprint.py delete mode 100644 tests/test_libtable.py delete mode 100644 tests/test_misc.py delete mode 100644 tests/test_schematic.py delete mode 100644 tests/test_symbol.py delete mode 100644 tests/test_worksheets.py delete mode 100644 tests/testdata/board/since_v7/test_imageWithLayerToken delete mode 100644 tests/testdata/board/since_v7/test_pcbPlotParams delete mode 100644 tests/testdata/board/since_v7/test_textBoxAllVariants delete mode 100644 tests/testdata/board/since_v7/test_textKnockout delete mode 100644 tests/testdata/board/since_v7/test_textsWithRenderCaches delete mode 100644 tests/testdata/board/test_allFpManufacturingAttributes delete mode 100644 tests/testdata/board/test_boardStackup32LayerDielectricsVias delete mode 100644 tests/testdata/board/test_boardTraceArcs delete mode 100644 tests/testdata/board/test_boardWithAllPrimitives delete mode 100644 tests/testdata/board/test_boardWithAllPrimitives.expected delete mode 100644 tests/testdata/board/test_createEmptyBoard delete mode 100644 tests/testdata/board/test_pcbPlotParams delete mode 100644 tests/testdata/board/test_renameFootprintIdToken delete mode 100644 tests/testdata/board/test_renameFootprintIdToken.expected delete mode 100644 tests/testdata/board/test_zoneOnAllLayersWildcard delete mode 100644 tests/testdata/board/test_zoneOnOuterLayersOnly delete mode 100644 tests/testdata/designrules/since_v7/test_severityToken delete mode 100644 tests/testdata/designrules/test_allDesignRuleItems delete mode 100644 tests/testdata/designrules/test_createNewDesignRules delete mode 100644 tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers delete mode 100644 tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected delete mode 100644 tests/testdata/footprint/since_v7/test_3dModelOpacityToken delete mode 100644 tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken delete mode 100644 tests/testdata/footprint/since_v7/test_imageWithLayerToken delete mode 100644 tests/testdata/footprint/since_v7/test_netTiePadGroups delete mode 100644 tests/testdata/footprint/since_v7/test_privateLayersToken delete mode 100644 tests/testdata/footprint/since_v7/test_textBoxAllVariants delete mode 100644 tests/testdata/footprint/since_v7/test_textKnockout delete mode 100644 tests/testdata/footprint/since_v7/test_textsWithRenderCaches delete mode 100644 tests/testdata/footprint/test_3dModelHideProperty delete mode 100644 tests/testdata/footprint/test_allFootprintItems delete mode 100644 tests/testdata/footprint/test_allFootprintItems.expected delete mode 100644 tests/testdata/footprint/test_createNewFootprintTypeOther delete mode 100644 tests/testdata/footprint/test_createNewFootprintTypeSMD delete mode 100644 tests/testdata/footprint/test_createNewFootprintTypeTHT delete mode 100644 tests/testdata/footprint/test_footprintEmptyAttributes delete mode 100644 tests/testdata/footprint/test_footprintEmptyAttributes.expected delete mode 100644 tests/testdata/footprint/test_footprintPadNewLines delete mode 100644 tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected delete mode 100644 tests/testdata/libtable/test_addLibraryObjectToLibTable.expected delete mode 100644 tests/testdata/libtable/test_createNewLibTable delete mode 100644 tests/testdata/libtable/test_parseFpLibTable.expected delete mode 100644 tests/testdata/libtable/test_parseSymLibTable.expected delete mode 100644 tests/testdata/misc/test_quotesAndBackslashInSexpr delete mode 100644 tests/testdata/schematic/since_v7/test_arcAllVariants delete mode 100644 tests/testdata/schematic/since_v7/test_busAliases delete mode 100644 tests/testdata/schematic/since_v7/test_circleAllVariants delete mode 100644 tests/testdata/schematic/since_v7/test_netclassFlags delete mode 100644 tests/testdata/schematic/since_v7/test_rectangleAllVariants delete mode 100644 tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives delete mode 100644 tests/testdata/schematic/since_v7/test_sheetProperties delete mode 100644 tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers delete mode 100644 tests/testdata/schematic/since_v7/test_strokeOptionalTokens delete mode 100644 tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens delete mode 100644 tests/testdata/schematic/since_v7/test_textBoxAllVariants delete mode 100644 tests/testdata/schematic/test.kicad_sch.expected delete mode 100644 tests/testdata/schematic/test_addPropertyToSchematicSymbol delete mode 100644 tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected delete mode 100644 tests/testdata/schematic/test_createEmptySchematic.expected delete mode 100644 tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives delete mode 100644 tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected delete mode 100644 tests/testdata/schematic/test_parseStrokeTokens delete mode 100644 tests/testdata/schematic/test_renameSymbolIdTokenInSchematic delete mode 100644 tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected delete mode 100644 tests/testdata/schematic/test_schematicWithAllPrimitives delete mode 100644 tests/testdata/schematic/test_schematicWithAllPrimitives.expected delete mode 100644 tests/testdata/schematic/test_setSymbolLibNameToken delete mode 100644 tests/testdata/schematic/test_setSymbolLibNameToken.expected delete mode 100644 tests/testdata/symbol/since_v7/test_arcAllVariants delete mode 100644 tests/testdata/symbol/since_v7/test_circleAllVariants delete mode 100644 tests/testdata/symbol/since_v7/test_rectangleAllVariants delete mode 100644 tests/testdata/symbol/since_v7/test_textBoxAllVariants delete mode 100644 tests/testdata/symbol/test_allSymbolAlternatePins delete mode 100644 tests/testdata/symbol/test_allSymbolPinVariations delete mode 100644 tests/testdata/symbol/test_bigSymbolLibrary delete mode 100644 tests/testdata/symbol/test_createNewSymbolInEmptyLibrary delete mode 100644 tests/testdata/symbol/test_createNewTopLevelSymbolFromChild delete mode 100644 tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected delete mode 100644 tests/testdata/symbol/test_mergeLibraries delete mode 100644 tests/testdata/symbol/test_mergeLibraries.expected delete mode 100644 tests/testdata/symbol/test_renameParentIdUsingIdToken delete mode 100644 tests/testdata/symbol/test_renameParentIdUsingIdToken.expected delete mode 100644 tests/testdata/symbol/test_symbolDemorganSyItems delete mode 100644 tests/testdata/symbol/test_symbolDemorganUnits delete mode 100644 tests/testdata/symbol/test_symbolIdParser delete mode 100644 tests/testdata/symbol/test_symbolParameters delete mode 100644 tests/testdata/worksheets/test_allWorkSheetItems delete mode 100644 tests/testdata/worksheets/test_createNewWorksheet delete mode 100644 tests/testfunctions.py create mode 100644 utils/sexpr.py create mode 100644 utils/strings.py create mode 100644 wks.py diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ba40071..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,164 +0,0 @@ -# kiutils - CHANGELOG - -## v1.4.8 - 03.02.2024 - -### Non-breaking changes -- Fixed: Missing parenthesis for gr_curve items (PR #110) -- Fixed: Text `knockout` setting not parsed (PR #111) - -## v1.4.7 - 23.10.2023 - -### Non-breaking changes -- Fixed: No quotes for DRC rules "severity" token (PR #108) - -## v1.4.6 - 23.10.2023 - -### Non-breaking changes -- Added: Parsing of schematic sheet file properties (PR #106) - -## v1.4.5 - 04.10.2023 - -### Non-breaking changes -- Added: Parsing of footprint `net_tie_pad_groups` token (PR #105) - -## v1.4.4 - 17.08.2023 - -### Non-breaking changes -- Added: Parsing of footprint `private_layers` token (PR #103) -- Added: Parsing of 3d-model `opacity` token (PR #98) -- Added: Parsing of footprint attribute's `allow_missing_courtyard` token (PR #101) -- Fixed: Legacy footprints with only digits as name are now correctly parsed (PR #91) - -## v1.4.3 - 15.07.2023 - -### Non-breaking changes -- Fixed: 3D model `hide` property not parsed (PR #97) - -## v1.4.2 - 09.06.2023 - -### Non-breaking changes -- Added: Support for `bus_alias` tokens (PR #92) - -## v1.4.1 - 22.04.2023 - -### Non-breaking changes -- Fixed: Zones on only outer layers produce wrong S-Expression for the `layer` token (PR #89) - -## v1.4.0 - 27.03.2023 -This release adds initial KiCad v7 support. - -### Breaking changes -- Changed: Removed `SyFill` in favour of `Fill` tokens everywhere - (PR #76) - -### Non-breaking changes -- Added: Parsing new sheet names - (PR #59) -- Added: `Arc`, `Rectangle` and `Circle` tokens - (PR #76) -- Added: `Schematic.shapes` to hold arcs, rectangles and circles - (PR #76) -- Added: `GrTextBox`, `FpTextBox`, `SyTextBox` and `TextBox` tokens - (PR #76) -- Added: `SchematicSymbol.dnp` token - (PR #77) -- Added: `fields_autoplaced` token to all kinds of lables - (PR #77) -- Added: `NetclassFlag` token - (PR #80) -- Added: `Property.showName` token - (PR #80) -- Added: `Rule.severity` token for design rules - (PR #84) -- Added: `plotOnAllLayersSelection`, `dashedLineDashRatio` and `dashedLineGapRatio` tokens - in `PlotSettings` - (PR #85) -- Added: `RenderCache` token for supported text items - (PR #87) -- Added: `ProjectInstance` tokens for schematic symbols and hierarchical sheets - (PR #88) -- Changed: Strokes are now parsed less strictly - (PR #57) -- Changed: Default value of `Stroke.type` from "dash" to "default" - (PR #63) -- Changed: `Stroke.color` is now optional - (PR #63) -- Changed: `Stroke.type` is now optional - (PR #82) -- Changed: `Schematic.uuid` is now optional - (PR #63) -- Changed: `Property.id` is now optional - (PR #78) -- Changed: `SymbolPin.nameEffects` and `SymbolPin.numberEffects` are now optional - (PR #82) -- Changed: `PlotSettings.svgUseInch` and `PlotSettings.excludeEdgeLayer` are now optional - (PR #85) -- Fixed: Regex parser not correctly handling backslashes in quoted strings - (PR #82) -- Fixed: `DesignRules.from_sexpr()` not parsing version token - (PR #84) - -## v1.3.0 - 21.02.2023 -### Breaking changes -- Changed: The ID token API was consolidated - (PR #54) - - `SchematicSymbol`: `self.libraryIdentifier` renamed to `self.libId` - - `Symbol`: `self.id` renamed to `self.libId` - - `Footprint`: `self.libraryLink` renamed to `self.libId` - - Setting and getting `self.libId` will update some subtokens of these classes. Check the documentation - for more information on this. -- Changed: `Footprint.create_new()`'s parameter `library_link` renamed to `library_id` - (PR #54) -- Changed: `SymbolLib.version` is now a non-optional token that defaults to the config entry - `KIUTILS_CREATE_NEW_VERSION_STR` - (PR #55) - -### Non-breaking changes -- Added: API for lib_name token in `SchematicSymbol` called `self.libName` - (PR #54) -- Added: Tokens `self.entryName` and `self.libraryNickname` for classes `Symbol`, `SchematicSymbol` - and `Footprint`. These tokens are part of the `libId` token and will be changed when setting - it. - (PR #41) -- Added Tokens `self.unitId` and `self.styleId` for `Symbol` class. These tokens are part of the - `libId` token and will be changed when setting it. - (PR #41) -- Added: All `from_file` and `to_file` methods got a new optional parameter `encoding` to change - the default encoding when reading/writing files. - (PR #50) -- Added: New `active` token in `LibTable` class - (PR #51) -- Added: CONTRIBUTING.md - (PR #52) -- Added: Missing `filePath` attribute in `DesignRules` class - (PR #45) -- Fixed: Return type of `LibTable.create_new()` - (PR #45) -- Fixed: `Position.to_sexpr()` having no parameters - (PR #45) -- Changed: Most parts of the docu were refactored - (PR #45) -- Removed: Unused `size` token in class `Connection()` - (PR #45) -- Removed: Unused `stroke` token in class `Image()` - (PR #45) -- Removed: Some tokens that were defined twice - (PR #45) - -## v1.2.1 - 21.11.2022 -- Fixed: Broken package config did not included every source file while building the module - (PR #38) - -## v1.2.0 - 20.11.2022 -- Added: Support for Python 3.11 on all platforms -- Added: `create_new()` API for all classes that serve files (schematic, board, etc) - (PR #33) -- Added: Checked `self.stroke` to be None in all `FpItems` classes when generating its S-Expression - (PR #36) -- Fixed: Default values of mutable class members are now set correctly using a dataclass field with - a default_factory to ensure unique references for each new class object - (PR #35) -- Fixed: Made VSCode automatic test discovery work - (PR #34) -- Changed: Documentation on `Jusitfy.to_sexpr()`s return value - (PR #37) - -## v1.1.4 - 10.09.2022 -- Added: Support for older Python versions (v3.7 to v3.10 are now supported) - (PR #30) -- Added: Automatic test report generation in test framework - (PR #21) -- Added: Sphinx-compatible documentation in `docs/` folder and on - [https://kiutils.readthedocs.io](https://kiutils.readthedocs.io) - (PR #29) -- Changed: Replaced relative imports with absolute imports in the module structure - (PR #24) -- Changed: Migrated test framework to Python's `unittest` - (PR #21) -- Changed: `unit` token in class `kiutils.items.schitems.SchematicSymbol()` is now optional - (PR #26) -- Changed: `uuid` token in class `kiutils.schematic.Schematic()` is now optional - (PR #26) -- Changed: Order of how newlines are generated in `kiutils.schematic.Schematic().to_sexpr()` - (PR #26) -- Fixed: `angle` set to 0.0 (was `None`) when creating a new `kiutils.items.common.Property()` object (PR #27, fixes #19) -- Fixed: Footprint attributes object (`kiutils.footprint.Attributes()`) missing when certain - "Manufacturing Attributes" are set - (PR #28) - -## v1.1.3 - 07.07.2022 -- Fixed: Stacked dielectrics in PCB layer stack are now parsed correctly as `StackupSubLayer` item - -## v1.1.2 - 30.06.2022 -- Added: Support for track arcs at `kiutils.items.brditems.Arc()` -- Fixed: Redundant line break in a footprint's pad section with a schematic symbol assigned (aka - net, pinfunction or pintype token set) as well as at least the solder_paste_margin_ratio - token set - -## v1.1.1 - 27.06.2022 -- Added: Support for custom design rules (`.kicad_dru`) -- Added: Support for custom worksheets (`.kicad_wks`) - -## v1.1.0 - 16.06.2022 -- Added: Support for Python Package Index (PyPI) -- Changed: Source directory for development moved from `kiutils/` to `src/kiutils/` - -## v1.0.1 - 15.06.2022 -- Added: Dimension, DimensionStyle, DimensionFormat classes for dimensions (measurements in PCB) -- Added: Target class for board target markers -- Added: Support for dimensions and target markers in Board class -- Added: Prerequisites in docu -- Fixed: Correct parsing of footprints with empty `attr` field (see #2) -- Fixed: Quoted strings funcion now handles integers that may be parsed from older KiCad versions - correctly (see #3) -- Fixed: Symbol pin's `alternate` field was missing and is now parsed correctly (see #4) -- Fixed: Footprint `libraryLink` attribute was missing (see #5) - -## v1.0.0 - 19.03.2022 -- Initial version \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 075907b..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,60 +0,0 @@ -# Contributing to KiUtils -Thanks for considering to contribute to `kiutils`. Please create an issue first if you want to add -new functionality and propose what you are going to do beforehand. This may not be neccessary for -simple bug fixes or enhancements. - -## Testing -Whenever you are contributing a new feature to `kiutils`, be sure to provide unittests that -explicitly test the functionality you implemented. Check out the `tests` folder in the repository -root for some examples. The following folders are of interest: -- `tests/testdata/`: Put files your test case may need to parse here -- `tests/test_XXXX.py`: Test cases can be found in their respective Python file -- `tests/testfunctions.py`: Functions to aid in testing and report generation - -## Local setup -An example of how to run the unittests is described here. - -## Fork and clone the repository -Create a fork of `kiutils` and clone it to your computer using: -```bash -git clone https://github.com//kiutils -cd kiutils -``` - -### Set up / enter virtual enviroment (venv module) -You may want to create a new Python virtual environment when developing `kiutils`. This can be -done with Python's built-in virtual environment module: -```bash -python3 -m venv env -``` - -To enter the newly created virtual enviroment, run: -```bash -source env/bin/activate -``` - -### Install dev dependencies -`kiutils` requires some dependencies for running tests. Install them using `pip` in your virtual -environment using: - -```bash -pip install -r requirements_dev.txt -``` - -### Run tests -In the `kiutils` root directory, running the tests is done using: -```bash -python test.py -``` - -A test report is automatically generated that shows the passing/failing tests. If a test is failing, -the report will show you what went wrong. - -### Leaving virtual environment (venv module) -When done, leaving the virtual environment is done using: -```bash -deactivate -``` - -### Submit your changes -Create a pull request of your forked changes to discuss and merge your implementation into `kiutils`. \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 94a9ed0..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md deleted file mode 100644 index 28b95e5..0000000 --- a/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# KiUtils - -[![PyPI version](https://img.shields.io/pypi/v/kiutils)](https://pypi.org/project/kiutils) -[![PyPI downloads](https://img.shields.io/pypi/dm/kiutils.svg)](https://pypistats.org/packages/kiutils) -![Python version](https://img.shields.io/pypi/pyversions/kiutils) -[![License](https://img.shields.io/github/license/mvnmgrx/kiutils)](https://github.com/mvnmgrx/kiutils/blob/master/LICENSE) -![Last commit](https://img.shields.io/github/last-commit/mvnmgrx/kiutils) -[![Documentation Status](https://readthedocs.org/projects/kiutils/badge/?version=latest)](https://kiutils.readthedocs.io/en/latest/?badge=latest) - -Simple and SCM-friendly KiCad file parser based on Python dataclasses for KiCad 6.0 -and up. The following KiCad-related files are currently supported: -- `.kicad_pcb` - Board layouts -- `.kicad_sch` - Schematics -- `.kicad_mod` - Footprints -- `.kicad_sym` - Symbols and symbol libraries -- `.kicad_wks` - Worksheets -- `.kicad_dru` - Custom design rules -- `fp-lib-table` & `sym-lib-table` - Library tables - -KiUtils implements a "pythonic" abstraction of the documentation found at the -[KiCad Developer Reference](https://dev-docs.kicad.org/en/file-formats/) and is -intended to work with an SCM like Git or SVN without breaking the layout of the -files when the Python script ran. - -Parsing of the files is based on the S-Expression parser found in this library: -[GitLab: KiCad Library utilities](https://gitlab.com/kicad/libraries/kicad-library-utils) - -## Prerequisites -The following is required to use `kiutils`: -- Python 3.7 or higher - -## Installation -``kiutils`` is available on [PyPI](https://pypi.org/project/kiutils/). Use Python's `pip` -to install it: -``` -pip install kiutils -``` - -If ``kiutils`` is already installed, upgrade it to the latest version using: -``` -pip install --no-cache-dir --upgrade kiutils -``` - -## Documentation -Visit the [kiutils documentation](https://kiutils.readthedocs.io/) for more information on how to -install, use and develop `kiutils`, as well as examples and general module documentation. - -## Donate -If you found this module helpful for your project consider donating via -[PayPal](https://paypal.me/mrvnmgr). Thanks! diff --git a/src/kiutils/__init__.py b/__init__.py similarity index 100% rename from src/kiutils/__init__.py rename to __init__.py diff --git a/src/kiutils/board.py b/board.py similarity index 100% rename from src/kiutils/board.py rename to board.py diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cb..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index ec7248d..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,61 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -sys.path.insert(0, os.path.abspath('../src')) - - -# -- Project information ----------------------------------------------------- - -project = 'kiutils' -copyright = '2023, Marvin Mager' -author = 'Marvin Mager' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc' -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# Sort the documented members as they appear in the source -autodoc_member_order = 'bysource' - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# 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, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Options of RTD theme -html_theme_options = { - 'style_external_links': True, -} diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index d24989b..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,50 +0,0 @@ -.. kiutils documentation master file, created by - sphinx-quickstart on Sun Sep 4 18:35:39 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to kiutils's documentation! -=================================== - -This is the documentation to the ``kiutils`` python module for parsing files of the KiCad EDA. - -- View on Github: `mvnmgrx/kiutils `_ - -``kiutils`` is simple and SCM-friendly KiCad file parser based on Python dataclasses for KiCad 6.0 -and up. - -It implements a "pythonic" abstraction of the documentation found at the -`KiCad Developer Reference `_ and is intended to work -with an SCM like Git or SVN without breaking the layout of the files when the Python script ran. - -.. toctree:: - :maxdepth: 2 - :caption: Usage - - usage/installation - usage/getting-started - usage/examples - usage/development - -.. toctree:: - :maxdepth: 2 - :caption: Misc - - misc/known-issues - -.. toctree:: - :maxdepth: 2 - :caption: Module documentation - - module/kiutils - module/kiutils.items - module/kiutils.utils - module/kiutils.misc - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 954237b..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/misc/known-issues.rst b/docs/misc/known-issues.rst deleted file mode 100644 index 7b12c7f..0000000 --- a/docs/misc/known-issues.rst +++ /dev/null @@ -1,27 +0,0 @@ -Known issues -============ - -- **Footprint:** Whitespaces in the items section do sometimes not correspond - correctly to those generated by KiCad. This will be picked up by an SCM as a - change even though no changes were initially made. This seems to be a bug in - KiCad itself, as it sometimes sets the whitespaces before those tokens - correctly and sometimes not. - -- **Schematic:** Sometimes KiCad inserts blank lines between wires, bus entries - and polylines which are not picked up by the parser. Same problem as above - with SCMs. - -- **Backwards compatibility:** KiCad <6 file formats can be parsed, but will - be converted to KiCad 6 style S-Expression upon saving. It was observed that - e.g. footprints of an older version will experience conversion errors in some - features that KiCad 6 now handles differently (see `fp_arc` as an example). - It is in the user's hands to decide on how to deal with this, but support - for converting correctly to KiCad 6 formats may be added in the future. - Please create an issue with a snippet of what you are trying to parse when - stumbling upon such a situation. - -- **Design rules:** Support for custom design rules was implemented without a - proper documentation. Thus it might be subject to bugs or changes. It - furthermore may not exactly place the items associated with a custom design - rule (constraints, layers, etc) in the same order as the user once put them - when parsing and writing back `.kicad_dru` files \ No newline at end of file diff --git a/docs/module/kiutils.items.rst b/docs/module/kiutils.items.rst deleted file mode 100644 index 21ddf84..0000000 --- a/docs/module/kiutils.items.rst +++ /dev/null @@ -1,74 +0,0 @@ -kiutils.items package -===================== - -Board items (`kiutils.items.brditems`) --------------------------------------- - -.. automodule:: kiutils.items.brditems - :members: - :undoc-members: - :show-inheritance: - -Common items (`kiutils.items.common`) -------------------------------------- - -.. automodule:: kiutils.items.common - :members: - :undoc-members: - :show-inheritance: - -Dimensions (`kiutils.items.dimension`) --------------------------------------- - -.. automodule:: kiutils.items.dimensions - :members: - :undoc-members: - :show-inheritance: - -Footprint items (`kiutils.items.fpitems`) ------------------------------------------ - -.. automodule:: kiutils.items.fpitems - :members: - :undoc-members: - :show-inheritance: - -Graphical items (`kiutils.items.gritems`) ------------------------------------------ - -.. automodule:: kiutils.items.gritems - :members: - :undoc-members: - :show-inheritance: - -Schematic items (`kiutils.items.schitems`) ------------------------------------------- - -.. automodule:: kiutils.items.schitems - :members: - :undoc-members: - :show-inheritance: - -Symbol items (`kiutils.items.syitems`) --------------------------------------- - -.. automodule:: kiutils.items.syitems - :members: - :undoc-members: - :show-inheritance: - -Zone items (`kiutils.items.zones`) --------------------------------------- - -.. automodule:: kiutils.items.zones - :members: - :undoc-members: - :show-inheritance: - -.. Module contents -.. --------------- - -.. .. automodule:: kiutils -.. :members: -.. :undoc-members: -.. :show-inheritance: diff --git a/docs/module/kiutils.misc.rst b/docs/module/kiutils.misc.rst deleted file mode 100644 index 3ed9621..0000000 --- a/docs/module/kiutils.misc.rst +++ /dev/null @@ -1,11 +0,0 @@ -kiutils.misc package -===================== - -Configuration stuff (`kiutils.misc.config`) ---------------------------------------------- - -.. automodule:: kiutils.misc.config - :members: - :special-members: - :undoc-members: - :show-inheritance: diff --git a/docs/module/kiutils.rst b/docs/module/kiutils.rst deleted file mode 100644 index 5291463..0000000 --- a/docs/module/kiutils.rst +++ /dev/null @@ -1,58 +0,0 @@ -kiutils package -=============== - -Board files (`kiutils.board`) ------------------------------ - -.. automodule:: kiutils.board - :members: - :undoc-members: - :show-inheritance: - -Design Rules (`kiutils.dru`) ----------------------------- - -.. automodule:: kiutils.dru - :members: - :undoc-members: - :show-inheritance: - -Footprints (`kiutils.footprint`) --------------------------------- - -.. automodule:: kiutils.footprint - :members: - :undoc-members: - :show-inheritance: - -Library tables (`kiutils.libraries`) ------------------------------------- - -.. automodule:: kiutils.libraries - :members: - :undoc-members: - :show-inheritance: - -Schematics (`kiutils.schematic`) --------------------------------- - -.. automodule:: kiutils.schematic - :members: - :undoc-members: - :show-inheritance: - -Symbols and Symbol Libraries (`kiutils.symbol`) ------------------------------------------------ - -.. automodule:: kiutils.symbol - :members: - :undoc-members: - :show-inheritance: - -Worksheets (`kiutils.wks`) --------------------------- - -.. automodule:: kiutils.wks - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/module/kiutils.utils.rst b/docs/module/kiutils.utils.rst deleted file mode 100644 index b5a1a75..0000000 --- a/docs/module/kiutils.utils.rst +++ /dev/null @@ -1,18 +0,0 @@ -kiutils.utils package -===================== - -String manipulation (`kiutils.utils.strings`) ---------------------------------------------- - -.. automodule:: kiutils.utils.strings - :members: - :undoc-members: - :show-inheritance: - -S-Expr parser (`kiutils.utils.sexpr`) -------------------------------------- - -.. automodule:: kiutils.utils.sexpr - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/usage/development.rst b/docs/usage/development.rst deleted file mode 100644 index 3563305..0000000 --- a/docs/usage/development.rst +++ /dev/null @@ -1,41 +0,0 @@ -Development -=========== - -To start developing, clone the repository: - -.. code-block:: text - - git clone https://github.com/mvnmgrx/kiutils.git - cd kiutils - -For generating test reports as well as the documentation, install the development requirements: - -.. code-block:: text - - pip install -r requirements_dev.txt - -Tests ------ - -Unittests are used to test ``kiutils``. To run the test framework and generate an HTML report, start -the test script: - -.. code-block:: text - - python3 test.py - -When adding a feature to ``kiutils``, be sure to provide unittests that explicitly test the -functionality you want to implement. - -Generate documentation ----------------------- - -The documentation is generated using the ``sphinx`` module with autodoc enabled. Generate it by -running: - -.. code-block:: text - - cd docs - make html - -The HTML output can then be accessed via ``docs/_build/html/index.html``. \ No newline at end of file diff --git a/docs/usage/examples.rst b/docs/usage/examples.rst deleted file mode 100644 index 5fe2967..0000000 --- a/docs/usage/examples.rst +++ /dev/null @@ -1,147 +0,0 @@ -Examples -======== - -These examples show how the module is intended to be used. - -Loading and saving a board --------------------------- - -.. code-block:: python - - from kiutils.board import Board - - board = Board().from_file("path/to/board.kicad_pcb") - - # Do stuff ... - - board.to_file() - - -Changing title and revision in schematic ----------------------------------------- - -.. code-block:: python - - from kiutils.schematic import Schematic - - schematic = Schematic().from_file("path/to/schematic.kicad_sch") - schematic.titleBlock.title = "This is schematic xyz" - schematic.titleBlock.revision = "B" - schematic.to_file() - -Loading and adding footprint to board -------------------------------------- - -Here a footprint is loaded from a `.kicad_mod` file and added to a board: - -.. code-block:: python - - from kiutils.board import Board - from kiutils.footprint import Footprint - from kiutils.items.common import Position - from kiutils.items.fpitems import FpText - - from os import path - - # Get current working directory - tests_path = path.join(path.dirname(path.realpath(__file__)), 'tests') - - # Load board file and footprint file - board = Board().from_file(path.join(tests_path, "example-project/example/example.kicad_pcb")) - footprint = Footprint().from_file(path.join(tests_path, "example-project/example/C_0805.kicad_mod")) - - # Set new footprint's position - footprint.position = Position(X=127.0, Y=85.0) - - # Change identifier to C105 - for item in footprint.graphicItems: - if isinstance(item, FpText): - if item.type == 'reference': - item.text = "C105" - - # Append footprint to board and save board - board.footprints.append(footprint) - board.to_file() - -Adding vias to board --------------------- - -This example adds two vias on the normal axis at the end of each segment: - -.. code-block:: python - - from cmath import sqrt - from kiutils.board import Board - from kiutils.items.brditems import Via, Segment - from kiutils.items.common import Position - - from os import path - - # Get current working directory - tests_path = path.join(path.dirname(path.realpath(__file__)), 'tests') - - # Load board file - board = Board().from_file(path.join(tests_path, "example-project/example/example.kicad_pcb")) - - # Iterate through segments, arcs and vias .. - for item in board.traceItems: - if isinstance(item, Segment): - # Calculate normal on end point of segment - nvec = Position(-(item.end.Y - item.start.Y), item.end.X - item.start.X) - nvec_inverse_len = 1/sqrt(nvec.X**2 + nvec.Y**2).real - unit_normal = Position(nvec_inverse_len * nvec.X, nvec_inverse_len * nvec.Y) - - # Compute positions of new vias - next_via_1 = Position(item.end.X + (unit_normal.X * 2), item.end.Y + (unit_normal.Y * 2)) - next_via_2 = Position(item.end.X - (unit_normal.X * 2), item.end.Y - (unit_normal.Y * 2)) - - # Append vias to trace items list of board - board.traceItems.append(Via(position=next_via_1, layers=["F.Cu", "B.Cu"], size=1.0, drill=0.6)) - board.traceItems.append(Via(position=next_via_2, layers=["F.Cu", "B.Cu"], size=1.0, drill=0.6)) - - # Write changes back to board file - board.to_file() - -Adding a schematic symbol -------------------------- - -This example shows how a schematic symbol might be added from a symbol library into a schematic: - -.. code-block:: python - - from kiutils.schematic import Schematic, SymbolInstance, SchematicSymbol - from kiutils.symbol import SymbolLib - from kiutils.items.common import Property, Position - - # Load the symbol library - symbol_lib = SymbolLib().from_file('/usr/share/kicad/symbols/Device.kicad_sym') - - # Find the symbol in the library - symbol = None - for s in symbol_lib.symbols: - if s.entryName == 'R_Small_US': - symbol = s - break - - if symbol is None: - raise ValueError('Symbol not found in library') - - - # Create a new schematic - schematic = Schematic.create_new() - - # Add the symbol to the schematic - schematic.libSymbols.append(symbol) - - schematic_symbol = SchematicSymbol() - schematic_symbol.libName = 'R_Small_US' - schematic_symbol.libId = 'Device:R_Small_US' - schematic_symbol.position = Position(X=0, Y=0, angle=0) - - schematic_symbol.properties.append(Property(key='Reference', value='R?', id=0)) - schematic_symbol.properties.append(Property(key='Value', value='R_Small_US', id=1)) - - schematic.schematicSymbols.append(schematic_symbol) - - # Save the schematic to a file - schematic.to_file('path_to_save_schematic.kicad_sch') \ No newline at end of file diff --git a/docs/usage/getting-started.rst b/docs/usage/getting-started.rst deleted file mode 100644 index 31babca..0000000 --- a/docs/usage/getting-started.rst +++ /dev/null @@ -1,65 +0,0 @@ -Getting started -=============== - -The most relevant classes can be imported like this: - -.. code-block:: python - - from kiutils.board import Board - from kiutils.libraries import LibTable - from kiutils.schematic import Schematic - from kiutils.footprint import Footprint - from kiutils.symbol import SymbolLib - from kiutils.wks import WorkSheet - from kiutils.dru import DesignRules - -Every class has at at least the following functions: - -- ``to_sexpr(..)``: Generate KiCad S-Expression that describes the object -- ``from_sexpr(..)``: Initialize the object with data found in given S-Expression. Wrong S-Expression - supplied yields an exception. - -If the class is intended to access files (such as board files, schematics, libraries, etc.), the -following functions are available: - -- ``create_new(..)``: Creates a new object with its members populated in a similar way as KiCad would do it -- ``from_file(..)``: Creates a new object and initializes it with data found in given file -- ``to_file(..)``: Generate KiCad S-Expression that describes the object and write it to the given file - -The files in the root directory are intended to be used in a Python script as they contain the main -functionality of the module. Documentation can be found in the source files itself. Use VSCode for -development as it shows docstring documentation by default when hovering over functions and members -of the module. - -Simple examples ---------------- - -These examples use the ``Board()`` class as an example. The procedure is the same for all file-serving -classes in ``kiutils``. - -Create a new object and dump it to a file that KiCad can use (be sure to get the file extension -correctly! (``.kicad_pcb`` in this case)): - -.. code-block:: python - - from kiutils.board import Board - - board = Board.create_new() - # Do stuff .. - board.to_file('/my/fancy/project/title.kicad_pcb') - -Parse an already existing object, do some changes and reexport it: - -.. code-block:: python - - from kiutils.board import Board - - board = Board.from_file('/my/fancy/project/title.kicad_pcb') - # Do stuff .. - board.to_file() - -Note that the latter example omitted the path when calling ``to_file()``. The file path used when -opening the original file will be used in this case. It is still possible to change the export -path to somewhere different. - -Check the :doc:`examples` section for other stuff that can be done with ``kiutils``! \ No newline at end of file diff --git a/docs/usage/installation.rst b/docs/usage/installation.rst deleted file mode 100644 index 418165d..0000000 --- a/docs/usage/installation.rst +++ /dev/null @@ -1,12 +0,0 @@ -Installation -============ - -The ``kiutils`` module is available on `PyPI `_. Use Python's ``pip`` to install it: - -.. code-block:: text - - pip install kiutils - -The following is required to run ``kiutils``: - -- Python 3.7 or higher diff --git a/src/kiutils/dru.py b/dru.py similarity index 100% rename from src/kiutils/dru.py rename to dru.py diff --git a/src/kiutils/footprint.py b/footprint.py similarity index 98% rename from src/kiutils/footprint.py rename to footprint.py index 5d32bb6..826c9f4 100644 --- a/src/kiutils/footprint.py +++ b/footprint.py @@ -415,8 +415,8 @@ class Pad(): """The optional ``net`` token defines the integer number and name string of the net connection for the pad.""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The optional ``tstamp`` token defines the unique identifier of the pad object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The optional ``uuid`` token defines the unique identifier of the pad object""" pinFunction: Optional[str] = None """The optional ``pinFunction`` token attribute defines the associated schematic symbol pin name""" @@ -521,7 +521,7 @@ def from_sexpr(cls, exp: list) -> Pad: for chamfer in item[1:]: object.chamfer.append(chamfer) if item[0] == 'net': object.net = Net().from_sexpr(item) - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'pinfunction': object.pinFunction = item[1] if item[0] == 'pintype': object.pinType = item[1] if item[0] == 'die_length': object.dieLength = item[1] @@ -590,7 +590,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if net != '' or pf != '' or pt != '': schematicSymbolAssociated = True - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' if len(self.chamfer) > 0: champferFound = True @@ -657,7 +657,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: expression += f'\n{primitive.to_sexpr(newline=False,indent=indent+4)}' expression += f'\n{indents} )' - expression += f'{tstamp}){endline}' + expression += f'{uuid}){endline}' return expression @dataclass @@ -729,8 +729,8 @@ def libId(self, symbol_id: str): tedit: str = remove_prefix(hex(calendar.timegm(datetime.datetime.now().utctimetuple())), '0x') """The ``tedit`` token defines a the last time the footprint was edited""" - tstamp: Optional[str] = None - """The ``tstamp`` token defines the unique identifier for the footprint. This only applies + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier for the footprint. This only applies to footprints defined in the board file format.""" position: Optional[Position] = None @@ -869,7 +869,7 @@ def from_sexpr(cls, exp: list) -> Footprint: if item[0] == 'generator': object.generator = item[1] if item[0] == 'layer': object.layer = item[1] if item[0] == 'tedit': object.tedit = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'descr': object.description = item[1] if item[0] == 'tags': object.tags = item[1] if item[0] == 'path': object.path = item[1] @@ -1024,14 +1024,14 @@ def to_sexpr(self, indent=0, newline=True, layerInFirstLine=False) -> str: placed = ' placed' if self.placed else '' version = f' (version {self.version})' if self.version is not None else '' generator = f' (generator {self.generator})' if self.generator is not None else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' expression = f'{indents}(footprint "{dequote(self.libId)}"{locked}{placed}{version}{generator}' if layerInFirstLine: expression += f' (layer "{dequote(self.layer)}")\n' else: expression += f'\n{indents} (layer "{dequote(self.layer)}")\n' - expression += f'{indents} (tedit {self.tedit}){tstamp}\n' + expression += f'{indents} (tedit {self.tedit}){uuid}\n' if self.position is not None: angle = f' {self.position.angle}' if self.position.angle is not None else '' diff --git a/src/kiutils/items/brditems.py b/items/brditems.py similarity index 97% rename from src/kiutils/items/brditems.py rename to items/brditems.py index f4c1a80..546aac7 100644 --- a/src/kiutils/items/brditems.py +++ b/items/brditems.py @@ -780,8 +780,8 @@ class Segment(): """The ``net`` token defines by the net ordinal number which net in the net section that the segment is part of""" - tstamp: str = "" - """The ``tstamp`` token defines the unique identifier of the line object""" + uuid: str = "" + """The ``uuid`` token defines the unique identifier of the line object""" @classmethod def from_sexpr(cls, exp: list) -> Segment: @@ -813,7 +813,7 @@ def from_sexpr(cls, exp: list) -> Segment: if item[0] == 'width': object.width = item[1] if item[0] == 'layer': object.layer = item[1] if item[0] == 'net': object.net = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] return object def to_sexpr(self, indent=2, newline=True) -> str: @@ -830,7 +830,7 @@ def to_sexpr(self, indent=2, newline=True) -> str: endline = '\n' if newline else '' locked = ' locked' if self.locked else '' - return f'{indents}(segment{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (width {self.width}) (layer "{dequote(self.layer)}") (net {self.net}) (tstamp {self.tstamp})){endline}' + return f'{indents}(segment{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (width {self.width}) (layer "{dequote(self.layer)}") (net {self.net}) (uuid {self.uuid})){endline}' @dataclass class Via(): @@ -873,8 +873,8 @@ class Via(): """The ``net`` token defines by net ordinal number which net in the net section that the via is part of""" - tstamp: Optional[str] = None - """The ``tstamp`` token defines the unique identifier of the via""" + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier of the via""" @classmethod def from_sexpr(cls, exp: list) -> Via: @@ -912,7 +912,7 @@ def from_sexpr(cls, exp: list) -> Via: if item[0] == 'keep_end_layers': object.keepEndLayers = True if item[0] == 'free': object.free = True if item[0] == 'net': object.net = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] return object def to_sexpr(self, indent=2, newline=True) -> str: @@ -937,9 +937,9 @@ def to_sexpr(self, indent=2, newline=True) -> str: rum = f' (remove_unused_layers)' if self.removeUnusedLayers else '' kel = f' (keep_end_layers)' if self.keepEndLayers else '' free = f' (free)' if self.free else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' - return f'{indents}(via{type}{locked} (at {self.position.X} {self.position.Y}) (size {self.size}) (drill {self.drill}) (layers{layers}){rum}{kel}{free} (net {self.net}){tstamp}){endline}' + return f'{indents}(via{type}{locked} (at {self.position.X} {self.position.Y}) (size {self.size}) (drill {self.drill}) (layers{layers}){rum}{kel}{free} (net {self.net}){uuid}){endline}' @dataclass class Arc(): @@ -972,8 +972,8 @@ class Arc(): """The ``net`` token defines the net ordinal number which net in the net section that arc is part of. Defaults to 0.""" - tstamp: Optional[str] = None - """The optional ``tstamp`` token defines the unique identifier of the arc""" + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the arc""" @classmethod def from_sexpr(cls, exp: list) -> Arc: @@ -1006,7 +1006,7 @@ def from_sexpr(cls, exp: list) -> Arc: elif item[0] == 'width': object.width = item[1] elif item[0] == 'layer': object.layer = item[1] elif item[0] == 'net': object.net = item[1] - elif item[0] == 'tstamp': object.tstamp = item[1] + elif item[0] == 'uuid': object.uuid = item[1] return object def to_sexpr(self, indent=2, newline=True) -> str: @@ -1023,12 +1023,12 @@ def to_sexpr(self, indent=2, newline=True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' expression = f'{indents}(arc{locked} (start {self.start.X} {self.start.Y}) ' expression += f'(mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) ' expression += f'(width {self.width}) (layer "{dequote(self.layer)}") ' - expression += f'(net {self.net}){tstamp}){endline}' + expression += f'(net {self.net}){uuid}){endline}' return expression @@ -1055,8 +1055,8 @@ class Target(): layer: str = "F.Cu" """The ``layer`` token sets the canonical layer where the target marker resides""" - tstamp: Optional[str] = None - """The ``tstamp`` token defines the unique identifier of the target""" + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier of the target""" @classmethod def from_sexpr(cls, exp: list) -> Target: @@ -1085,7 +1085,7 @@ def from_sexpr(cls, exp: list) -> Target: if item[0] == 'size': object.size = item[1] if item[0] == 'width': object.width = item[1] if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] return object def to_sexpr(self, indent=2, newline=True) -> str: @@ -1101,4 +1101,4 @@ def to_sexpr(self, indent=2, newline=True) -> str: indents = ' '*indent endline = '\n' if newline else '' - return f'{indents}(target {self.type} (at {self.position.X} {self.position.Y}) (size {self.size}) (width {self.width}) (layer "{self.layer}") (tstamp {self.tstamp})){endline}' + return f'{indents}(target {self.type} (at {self.position.X} {self.position.Y}) (size {self.size}) (width {self.width}) (layer "{self.layer}") (uuid {self.uuid})){endline}' diff --git a/src/kiutils/items/common.py b/items/common.py similarity index 100% rename from src/kiutils/items/common.py rename to items/common.py diff --git a/src/kiutils/items/dimensions.py b/items/dimensions.py similarity index 98% rename from src/kiutils/items/dimensions.py rename to items/dimensions.py index 47b38e9..098c1e4 100644 --- a/src/kiutils/items/dimensions.py +++ b/items/dimensions.py @@ -231,8 +231,8 @@ class Dimension(): layer: str = "F.Cu" """The ``layer`` token defines the canonical layer the polygon resides on""" - tstamp: Optional[str] = None - """The ``tstamp`` token defines the unique identifier for the footprint. This only applies + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier for the footprint. This only applies to footprints defined in the board file format.""" pts: List[Position] = field(default_factory=list) @@ -286,7 +286,7 @@ def from_sexpr(cls, exp: list) -> Dimension: continue if item[0] == 'type': object.type = item[1] if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'height': object.height = item[1] if item[0] == 'orientation': object.orientation = item[1] if item[0] == 'leader_length': object.leaderLength = item[1] @@ -321,7 +321,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if len(points) == 0: raise Exception("Number of points must not be zero") - expression = f'{indents}(dimension (type {self.type}) (layer "{self.layer}") (tstamp {self.tstamp})\n' + expression = f'{indents}(dimension (type {self.type}) (layer "{self.layer}") (uuid {self.uuid})\n' expression += f'{indents} (pts{points})\n' if self.height is not None: expression += f'{indents} (height {self.height})\n' diff --git a/src/kiutils/items/fpitems.py b/items/fpitems.py similarity index 91% rename from src/kiutils/items/fpitems.py rename to items/fpitems.py index 7ef2b66..4432992 100644 --- a/src/kiutils/items/fpitems.py +++ b/items/fpitems.py @@ -48,18 +48,14 @@ class FpText(): layer: str = "F.Cu" """The ``layer`` token defines the canonical layer the text resides on""" - knockout: bool = False - """The ``knockout`` token defines if the text is inverted (means transparent text and colored - background insted of colored text and transparent background)""" - hide: bool = False """The optional ``hide`` token, defines if the text is hidden""" effects: Effects = field(default_factory=lambda: Effects()) """The ``effects`` token defines how the text is displayed""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the text object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the text object""" renderCache: Optional[RenderCache] = None """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token @@ -95,13 +91,9 @@ def from_sexpr(cls, exp: list) -> FpText: if item == 'hide': object.hide = True continue if item[0] == 'at': object.position = Position().from_sexpr(item) - if item[0] == 'layer': - object.layer = item[1] - if(len(item) > 2): - if(item[2] == "knockout"): - object.knockout = True + if item[0] == 'layer': object.layer = item[1] if item[0] == 'effects': object.effects = Effects().from_sexpr(item) - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) return object @@ -121,12 +113,11 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: hide = ' hide' if self.hide else '' unlocked = ' unlocked' if self.position.unlocked else '' posA = f' {self.position.angle}' if self.position.angle is not None else '' - ko = ' knockout' if self.knockout else '' - expression = f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"{ko}){hide}\n' + expression = f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"){hide}\n' expression += f'{indents} {self.effects.to_sexpr()}' - if self.tstamp is not None: - expression += f'{indents} (tstamp {self.tstamp})\n' + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' if self.renderCache is not None: expression += self.renderCache.to_sexpr(indent+2) expression += f'{indents}){endline}' @@ -160,8 +151,8 @@ class FpLine(): locked: bool = False """The optional ``locked`` token defines if the line cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the line object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the line object""" @classmethod def from_sexpr(cls, exp: list) -> FpLine: @@ -192,7 +183,7 @@ def from_sexpr(cls, exp: list) -> FpLine: if item[0] == 'start': object.start = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] object.stroke = None @@ -214,7 +205,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: """ indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' if self.width is not None: width = f' (width {self.width})' elif self.stroke is not None: @@ -222,7 +213,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: else: width = '' - return f'{indents}(fp_line (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{tstamp}){endline}' + return f'{indents}(fp_line (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{uuid}){endline}' @dataclass class FpRect(): @@ -254,8 +245,8 @@ class FpRect(): locked: bool = False """The optional ``locked`` token defines if the rectangle cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the rectangle object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" @classmethod def from_sexpr(cls, exp: list) -> FpRect: @@ -286,7 +277,7 @@ def from_sexpr(cls, exp: list) -> FpRect: if item[0] == 'start': object.start = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] @@ -310,7 +301,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = ' locked' if self.locked else '' fill = f' (fill {self.fill})' if self.fill is not None else '' @@ -321,7 +312,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: else: width = '' - return f'{indents}(fp_rect (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{tstamp}){endline}' + return f'{indents}(fp_rect (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' @dataclass class FpTextBox(): @@ -363,8 +354,8 @@ class FpTextBox(): """The ``layer`` token defines the canonical layer the text box resides on. Defaults to ``F.Cu``.""" - tstamp: Optional[str] = None - """The optional ``tstamp`` token defines the unique identifier of the text box""" + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the text box""" effects: Optional[Effects] = None """The optional ``effects`` token describes the style of the text in the text box""" @@ -416,7 +407,7 @@ def from_sexpr(cls, exp: list) -> FpTextBox: object.pts.append(Position().from_sexpr(point)) if item[0] == 'angle': object.angle = item[1] if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'effects': object.effects = Effects.from_sexpr(item) if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) @@ -449,7 +440,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' angle = f'(angle {self.angle}) ' if self.angle is not None else '' start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else '' end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else '' @@ -460,7 +451,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: expression += f'{indents} (pts\n' expression += f'{indents} (xy {self.pts[0].X} {self.pts[0].Y}) (xy {self.pts[1].X} {self.pts[1].Y}) (xy {self.pts[2].X} {self.pts[2].Y}) (xy {self.pts[3].X} {self.pts[3].Y})\n' expression += f'{indents} )\n' - expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){tstamp}\n' + expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n' if self.effects is not None: expression += self.effects.to_sexpr(indent+2) if self.stroke is not None: @@ -500,8 +491,8 @@ class FpCircle(): locked: bool = False """The optional ``locked`` token defines if the circle cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the circle object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the circle object""" @classmethod def from_sexpr(cls, exp: list) -> FpCircle: @@ -532,7 +523,7 @@ def from_sexpr(cls, exp: list) -> FpCircle: if item[0] == 'center': object.center = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] @@ -556,7 +547,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = ' locked' if self.locked else '' fill = f' (fill {self.fill})' if self.fill is not None else '' @@ -567,7 +558,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: else: width = '' - return f'{indents}(fp_circle (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{tstamp}){endline}' + return f'{indents}(fp_circle (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' @dataclass class FpArc(): @@ -598,8 +589,8 @@ class FpArc(): locked: bool = False """The optional ``locked`` token defines if the arc cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the arc object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the arc object""" @classmethod def from_sexpr(cls, exp: list) -> FpArc: @@ -631,7 +622,7 @@ def from_sexpr(cls, exp: list) -> FpArc: if item[0] == 'mid': object.mid = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] object.stroke = None @@ -654,7 +645,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = ' locked' if self.locked else '' if self.width is not None: @@ -664,7 +655,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: else: width = '' - return f'{indents}(fp_arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{locked}{tstamp}){endline}' + return f'{indents}(fp_arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}' @dataclass class FpPoly(): @@ -693,8 +684,8 @@ class FpPoly(): locked: bool = False """The optional ``locked`` token defines if the polygon cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the polygon object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the polygon object""" @classmethod def from_sexpr(cls, exp: list) -> FpPoly: @@ -727,7 +718,7 @@ def from_sexpr(cls, exp: list) -> FpPoly: for point in item[1:]: object.coordinates.append(Position().from_sexpr(point)) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] @@ -754,7 +745,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if len(self.coordinates) == 0: return f'{indents}{endline}' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = ' locked' if self.locked else '' fill = f' (fill {self.fill})' if self.fill is not None else '' @@ -768,7 +759,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: expression = f'{indents}(fp_poly (pts\n' for point in self.coordinates: expression += f'{indents} (xy {point.X} {point.Y})\n' - expression += f'{indents} ) (layer "{dequote(self.layer)}"){width}{fill}{locked}{tstamp}){endline}' + expression += f'{indents} ) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' return expression @dataclass @@ -794,8 +785,8 @@ class FpCurve(): locked: bool = False """The optional ``locked`` token defines if the curve cannot be edited""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the curve object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the curve object""" @classmethod def from_sexpr(cls, exp: list) -> FpCurve: @@ -827,7 +818,7 @@ def from_sexpr(cls, exp: list) -> FpCurve: for point in item[1:]: object.coordinates.append(Position().from_sexpr(point)) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] object.stroke = None @@ -853,7 +844,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if len(self.coordinates) == 0: return f'{indents}{endline}' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = ' locked' if self.locked else '' if self.width is not None: @@ -866,5 +857,5 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: expression = f'{indents}(fp_curve (pts\n' for point in self.coordinates: expression += f'{indents} (xy {point.X} {point.Y})\n' - expression += f'{indents}) (layer "{dequote(self.layer)}"){width}{locked}{tstamp}){endline}' + expression += f'{indents}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}' return expression diff --git a/src/kiutils/items/gritems.py b/items/gritems.py similarity index 89% rename from src/kiutils/items/gritems.py rename to items/gritems.py index 075a926..5e00f1f 100644 --- a/src/kiutils/items/gritems.py +++ b/items/gritems.py @@ -34,13 +34,8 @@ class GrText(): text: str = "" """The ``text`` attribute is a string that defines the text""" - knockout: bool = False - """The ``knockout`` token defines if the text is inverted (means transparent text and colored - background insted of colored text and transparent background)""" - position: Position = field(default_factory=lambda: Position()) - """The ``position`` defines the X and Y position coordinates and optional orientation angle of - the text""" + """The ``position`` defines the X and Y position coordinates and optional orientation angle of the text""" layer: Optional[str] = None """The ``layer`` token defines the canonical layer the text resides on""" @@ -48,8 +43,8 @@ class GrText(): effects: Effects = field(default_factory=lambda: Effects()) """The ``effects`` token defines how the text is displayed""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the text object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the text object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -87,13 +82,9 @@ def from_sexpr(cls, exp: list) -> GrText: if item == 'locked': object.locked = True continue if item[0] == 'at': object.position = Position().from_sexpr(item) - if item[0] == 'layer': - object.layer = item[1] - if(len(item) > 2): - if(item[2] == "knockout"): - object.knockout = True + if item[0] == 'layer': object.layer = item[1] if item[0] == 'effects': object.effects = Effects().from_sexpr(item) - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) return object @@ -110,13 +101,12 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - ko = ' knockout' if self.knockout else '' posA = f' {self.position.angle}' if self.position.angle is not None else '' - layer = f' (layer "{dequote(self.layer)}"{ko})' if self.layer is not None else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' locked = f' locked' if self.locked else '' - expression = f'{indents}(gr_text{locked} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){layer}{tstamp}\n' + expression = f'{indents}(gr_text{locked} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){layer}{uuid}\n' expression += f'{indents} {self.effects.to_sexpr()}' if self.renderCache is not None: expression += self.renderCache.to_sexpr(indent+2) @@ -163,8 +153,8 @@ class GrTextBox(): """The ``layer`` token defines the canonical layer the text box resides on. Defaults to ``F.Cu``.""" - tstamp: Optional[str] = None - """The optional ``tstamp`` token defines the unique identifier of the text box""" + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the text box""" effects: Optional[Effects] = None """The optional ``effects`` token describes the style of the text in the text box""" @@ -218,7 +208,7 @@ def from_sexpr(cls, exp: list) -> GrTextBox: object.pts.append(Position().from_sexpr(point)) if item[0] == 'angle': object.angle = item[1] if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'effects': object.effects = Effects.from_sexpr(item) if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) @@ -251,7 +241,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: indents = ' '*indent endline = '\n' if newline else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' angle = f'(angle {self.angle}) ' if self.angle is not None else '' start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else '' end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else '' @@ -262,7 +252,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: expression += f'{indents} (pts\n' expression += f'{indents} (xy {self.pts[0].X} {self.pts[0].Y}) (xy {self.pts[1].X} {self.pts[1].Y}) (xy {self.pts[2].X} {self.pts[2].Y}) (xy {self.pts[3].X} {self.pts[3].Y})\n' expression += f'{indents} )\n' - expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){tstamp}\n' + expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n' if self.effects is not None: expression += self.effects.to_sexpr(indent+2) if self.stroke is not None: @@ -295,8 +285,8 @@ class GrLine(): width: Optional[float] = 0.12 # Used for KiCad < 7 """The ``width`` token defines the line width of the rectangle. (prior to version 7)""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the rectangle object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -329,7 +319,7 @@ def from_sexpr(cls, exp: list) -> GrLine: if item[0] == 'start': object.start = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] return object @@ -347,11 +337,11 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' angle = f' (angle {self.angle}' if self.angle is not None else '' - return f'{indents}(gr_line{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){angle}{layer} (width {self.width}){tstamp}){endline}' + return f'{indents}(gr_line{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){angle}{layer} (width {self.width}){uuid}){endline}' @dataclass class GrRect(): @@ -376,8 +366,8 @@ class GrRect(): fill: Optional[str] = None """The optional ``fill`` toke defines how the rectangle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the rectangle object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -410,7 +400,7 @@ def from_sexpr(cls, exp: list) -> GrRect: if item[0] == 'start': object.start = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] return object @@ -429,11 +419,11 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' fill = f' (fill {self.fill})' if self.fill is not None else '' - return f'{indents}(gr_rect{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){fill}{tstamp}){endline}' + return f'{indents}(gr_rect{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){fill}{uuid}){endline}' @dataclass class GrCircle(): @@ -455,11 +445,14 @@ class GrCircle(): width: Optional[float] = 0.12 # Used for KiCad < 7 """The ``width`` token defines the line width of the circle. (prior to version 7)""" + stroke: Optional[Stroke] = None + """The optional ``stroke`` token describes the style of the circle's boundary.""" + fill: Optional[str] = None """The optional ``fill`` toke defines how the circle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the circle object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the circle object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -491,8 +484,9 @@ def from_sexpr(cls, exp: list) -> GrCircle: continue if item[0] == 'center': object.center = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] @@ -512,11 +506,12 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + stroke = self.stroke.to_sexpr() if self.stroke is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' fill = f' (fill {self.fill})' if self.fill is not None else '' - return f'{indents}(gr_circle{locked} (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){fill}{tstamp}){endline}' + return f'{indents}(gr_circle{locked} (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}){layer}{stroke} (width {self.width}){fill}{uuid}){endline}' @dataclass class GrArc(): @@ -541,8 +536,8 @@ class GrArc(): width: Optional[float] = 0.12 # Used for KiCad < 7 """The ``width`` token defines the line width of the arc. (prior to version 7)""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the arc object.""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the arc object.""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -576,7 +571,7 @@ def from_sexpr(cls, exp: list) -> GrArc: if item[0] == 'mid': object.mid = Position.from_sexpr(item) if item[0] == 'end': object.end = Position.from_sexpr(item) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] return object @@ -595,10 +590,10 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' - return f'{indents}(gr_arc{locked} (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){tstamp}){endline}' + return f'{indents}(gr_arc{locked} (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){uuid}){endline}' @dataclass class GrPoly(): @@ -620,12 +615,15 @@ class GrPoly(): fill: Optional[str] = None """The optional ``fill`` toke defines how the polygon is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the polygon object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the polygon object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" + net: Optional[int] = None + """The ``net`` token defines the net identifier associated with the polygon.""" + @classmethod def from_sexpr(cls, exp: list) -> GrPoly: """Convert the given S-Expresstion into a GrPoly object @@ -656,9 +654,10 @@ def from_sexpr(cls, exp: list) -> GrPoly: for point in item[1:]: object.coordinates.append(Position().from_sexpr(point)) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'fill': object.fill = item[1] if item[0] == 'width': object.width = item[1] + if item[0] == 'net': object.net = int(item[1]) return object @@ -681,10 +680,11 @@ def to_sexpr(self, indent: int = 2, newline: bool = True, pts_newline: bool = Fa if len(self.coordinates) == 0: return f'{indents}{endline}' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' fill = f' (fill {self.fill})' if self.fill is not None else '' locked = f' locked' if self.locked else '' + net = f' (net {self.net})' if self.net is not None else '' if pts_newline: expression = f'{indents}(gr_poly{locked}\n' @@ -694,7 +694,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True, pts_newline: bool = Fa for point in self.coordinates: expression += f'{indents} (xy {point.X} {point.Y})\n' - expression += f'{indents} ){layer} (width {self.width}){fill}{tstamp}){endline}' + expression += f'{indents} ){layer} (width {self.width}){fill}{net}{uuid}){endline}' return expression @dataclass @@ -713,8 +713,8 @@ class GrCurve(): width: Optional[float] = 0.12 # Used for KiCad < 7 """The ``width`` token defines the line width of the curve. (prior to version 7)""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the curve object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the curve object""" locked: bool = False """The ``locked`` token defines if the object may be moved or not""" @@ -748,7 +748,7 @@ def from_sexpr(cls, exp: list) -> GrCurve: for point in item[1:]: object.coordinates.append(Position().from_sexpr(point)) if item[0] == 'layer': object.layer = item[1] - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'width': object.width = item[1] return object @@ -769,12 +769,12 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if len(self.coordinates) == 0: return f'{indents}{endline}' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' locked = f' locked' if self.locked else '' expression = f'{indents}(gr_curve{locked} (pts\n' for point in self.coordinates: expression += f'{indents} (xy {point.X} {point.Y})\n' - expression += f'{indents}){layer} (width {self.width}){tstamp}){endline}' + expression += f'{indents}){layer} (width {self.width}{uuid}){endline}' return expression diff --git a/src/kiutils/items/schitems.py b/items/schitems.py similarity index 100% rename from src/kiutils/items/schitems.py rename to items/schitems.py diff --git a/src/kiutils/items/syitems.py b/items/syitems.py similarity index 100% rename from src/kiutils/items/syitems.py rename to items/syitems.py diff --git a/src/kiutils/items/zones.py b/items/zones.py similarity index 98% rename from src/kiutils/items/zones.py rename to items/zones.py index 714a035..e54945f 100644 --- a/src/kiutils/items/zones.py +++ b/items/zones.py @@ -503,8 +503,8 @@ class Zone(): strings. When the zone only resides on one layer, the output of ``self.to_sexpr()`` will change into ``(layer "xyz")`` instead of ``(layers ..)`` automatically.""" - tstamp: Optional[str] = None # Used since KiCad 6 - """The ``tstamp`` token defines the unique identifier of the zone object""" + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the zone object""" name: Optional[str] = None """The optional ``name`` token attribute defines the name of the zone if one has been assigned""" @@ -581,7 +581,7 @@ def from_sexpr(cls, exp: list) -> Zone: if item[0] == 'layers' or item[0] == 'layer': for layer in item[1:]: object.layers.append(layer) - if item[0] == 'tstamp': object.tstamp = item[1] + if item[0] == 'uuid': object.uuid = item[1] if item[0] == 'name': object.name = item[1] if item[0] == 'hatch': object.hatch = Hatch(style=item[1], pitch=item[2]) @@ -619,7 +619,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: endline = '\n' if newline else '' locked = f' locked' if self.locked else '' - tstamp = f' (tstamp {self.tstamp})' if self.tstamp is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' name = f' (name "{dequote(self.name)}")' if self.name is not None else '' contype = f' {self.connectPads}' if self.connectPads is not None else '' fat = f' (filled_areas_thickness {self.filledAreasThickness})' if self.filledAreasThickness is not None else '' @@ -629,12 +629,12 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: if len(self.layers) == 0: raise Exception("Zone: No layers set for this zone") - elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu" and self.layers[0] != "*.Cu": + elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu": layer_token = f' (layer{layers})' else: layer_token = f' (layers{layers})' - expression = f'{indents}(zone{locked} (net {self.net}) (net_name "{dequote(self.netName)}"){layer_token}{tstamp}{name} (hatch {self.hatch.style} {self.hatch.pitch})\n' + expression = f'{indents}(zone{locked} (net {self.net}) (net_name "{dequote(self.netName)}"){layer_token}{uuid}{name} (hatch {self.hatch.style} {self.hatch.pitch})\n' if self.priority is not None: expression += f'{indents} (priority {self.priority})\n' expression += f'{indents} (connect_pads{contype} (clearance {self.clearance}))\n' diff --git a/kiutils/__init__.py b/kiutils/__init__.py new file mode 100644 index 0000000..b3ebde0 --- /dev/null +++ b/kiutils/__init__.py @@ -0,0 +1,10 @@ +"""Init script for kiutils + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +# Intentionally left blank .. \ No newline at end of file diff --git a/kiutils/board.py b/kiutils/board.py new file mode 100644 index 0000000..95f0959 --- /dev/null +++ b/kiutils/board.py @@ -0,0 +1,323 @@ +"""Class to manage KiCad boards + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 20.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/ +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List, Dict +from os import path + +from kiutils.items.common import Group, Image, Net, PageSettings, TitleBlock +from kiutils.items.zones import Zone +from kiutils.items.brditems import * +from kiutils.items.gritems import * +from kiutils.items.dimensions import Dimension +from kiutils.utils.strings import dequote +from kiutils.utils import sexpr +from kiutils.footprint import Footprint +from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR, KIUTILS_CREATE_NEW_GENERATOR_STR + +@dataclass +class Board(): + """The ``board`` token defines a KiCad layout according to the board file format used in + ``.kicad_pcb`` files. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/ + """ + version: str = "" + """The ``version`` token defines the board version using the YYYYMMDD date format""" + + generator: str = "" + """The ``generator`` token defines the program used to write the file""" + + general: GeneralSettings = field(default_factory=lambda: GeneralSettings()) + """The ``general`` token defines general information about the board""" + + paper: PageSettings = field(default_factory=lambda: PageSettings()) + """The ``paper`` token defines informations about the page itself""" + + titleBlock: Optional[TitleBlock] = None + """The ``titleBlock`` token defines author, date, revision, company and comments of the board""" + + layers: List[LayerToken] = field(default_factory=list) + """The ``layers`` token defines all of the layers used by the board""" + + setup: SetupData = field(default_factory=lambda: SetupData()) + """The ``setup`` token is used to store the current settings used by the board""" + + properties: Dict[str, str] = field(default_factory=dict) + """The ``properties`` token holds a list of key-value properties of the board as a dictionary""" + + nets: List[Net] = field(default_factory=list) + """The ``nets`` token defines a list of nets used in the layout""" + + footprints: List[Footprint] = field(default_factory=list) + """The ``footprints`` token defines a list of footprints used in the layout""" + + # TODO: Type hinting for this list + graphicItems: List = field(default_factory=list) # as in gritems.py + """The ``graphicItems`` token defines a list of graphical items used in the layout. Possible + tokens are found in ``kiutils.items.gritems`` + + The ``Image`` token is supported since KiCad v7 and must be added into this list when used.""" + + traceItems: List = field(default_factory=list) + """The ``traceItems`` token defines a list of segments, arcs and vias used in the layout""" + + zones: List[Zone] = field(default_factory=list) + """The ``zones`` token defines a list of zones used in the layout""" + + dimensions: List[Dimension] = field(default_factory=list) + """The ``dimensions`` token defines a list of dimensions on the PCB""" + + targets: List[Target] = field(default_factory=list) + """The ``targets`` token defines a list of target markers on the PCB""" + + groups: List[Group] = field(default_factory=list) + """The ``groups`` token defines a list of groups used in the layout""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the board file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Board: + """Convert the given S-Expresstion into a Board object + + Args: + - exp (list): Part of parsed S-Expression ``(kicad_pcb ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not kicad_pcb + + Returns: + - Board: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'kicad_pcb': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'version': object.version = item[1] + if item[0] == 'generator': object.generator = item[1] + if item[0] == 'general': object.general = GeneralSettings().from_sexpr(item) + if item[0] == 'paper': object.paper = PageSettings().from_sexpr(item) + if item[0] == 'title_block': object.titleBlock = TitleBlock().from_sexpr(item) + if item[0] == 'layers': + for layer in item[1:]: + object.layers.append(LayerToken().from_sexpr(layer)) + if item[0] == 'setup': object.setup = SetupData().from_sexpr(item) + if item[0] == 'property': object.properties.update({item[1]: item[2]}) + if item[0] == 'net': object.nets.append(Net().from_sexpr(item)) + if item[0] == 'footprint': object.footprints.append(Footprint().from_sexpr(item)) + if item[0] == 'gr_text': object.graphicItems.append(GrText().from_sexpr(item)) + if item[0] == 'gr_text_box': object.graphicItems.append(GrTextBox().from_sexpr(item)) + if item[0] == 'gr_line': object.graphicItems.append(GrLine().from_sexpr(item)) + if item[0] == 'gr_rect': object.graphicItems.append(GrRect().from_sexpr(item)) + if item[0] == 'gr_circle': object.graphicItems.append(GrCircle().from_sexpr(item)) + if item[0] == 'gr_arc': object.graphicItems.append(GrArc().from_sexpr(item)) + if item[0] == 'gr_poly': object.graphicItems.append(GrPoly().from_sexpr(item)) + if item[0] == 'gr_curve': object.graphicItems.append(GrCurve().from_sexpr(item)) + if item[0] == 'image': object.graphicItems.append(Image().from_sexpr(item)) + if item[0] == 'dimension': object.dimensions.append(Dimension().from_sexpr(item)) + if item[0] == 'target': object.targets.append(Target().from_sexpr(item)) + if item[0] == 'segment': object.traceItems.append(Segment().from_sexpr(item)) + if item[0] == 'arc': object.traceItems.append(Arc().from_sexpr(item)) + if item[0] == 'via': object.traceItems.append(Via().from_sexpr(item)) + if item[0] == 'zone': object.zones.append(Zone().from_sexpr(item)) + if item[0] == 'group': object.groups.append(Group().from_sexpr(item)) + + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Board: + """Load a board directly from a KiCad board file (`.kicad_pcb`) and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - Footprint: Object of the Schematic class initialized with the given KiCad schematic + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + item = cls.from_sexpr(sexpr.parse_sexp(infile.read())) + item.filePath = filepath + return item + + @classmethod + def create_new(cls) -> Board: + """Creates a new empty board with its attributes set as KiCad would create it + + Returns: + - Board: Empty board + """ + board = cls( + version = KIUTILS_CREATE_NEW_VERSION_STR, + generator = KIUTILS_CREATE_NEW_GENERATOR_STR + ) + + # Add all standard layers to board + board.layers.extend([ + LayerToken(ordinal=0, name='F.Cu', type='signal'), + LayerToken(ordinal=31, name='B.Cu', type='signal'), + LayerToken(ordinal=32, name='B.Adhes', type='user', userName="B.Adhesive"), + LayerToken(ordinal=33, name='F.Adhes', type='user', userName="F.Adhesive"), + LayerToken(ordinal=34, name='B.Paste', type='user'), + LayerToken(ordinal=35, name='F.Paste', type='user'), + LayerToken(ordinal=36, name='B.SilkS', type='user', userName="B.Silkscreen"), + LayerToken(ordinal=37, name='F.SilkS', type='user', userName="F.Silkscreen"), + LayerToken(ordinal=38, name='B.Mask', type='user'), + LayerToken(ordinal=39, name='F.Mask', type='user'), + LayerToken(ordinal=40, name='Dwgs.User', type='user', userName="User.Drawings"), + LayerToken(ordinal=41, name='Cmts.User', type='user', userName="User.Comments"), + LayerToken(ordinal=42, name='Eco1.User', type='user', userName="User.Eco1"), + LayerToken(ordinal=43, name='Eco2.User', type='user', userName="User.Eco2"), + LayerToken(ordinal=44, name='Edge.Cuts', type='user'), + LayerToken(ordinal=45, name='Margin', type='user'), + LayerToken(ordinal=46, name='B.CrtYd', type='user', userName="B.Courtyard"), + LayerToken(ordinal=47, name='F.CrtYd', type='user', userName="F.Courtyard"), + LayerToken(ordinal=48, name='B.Fab', type='user'), + LayerToken(ordinal=49, name='F.Fab', type='user'), + LayerToken(ordinal=50, name='User.1', type='user'), + LayerToken(ordinal=51, name='User.2', type='user'), + LayerToken(ordinal=52, name='User.3', type='user'), + LayerToken(ordinal=53, name='User.4', type='user'), + LayerToken(ordinal=54, name='User.5', type='user'), + LayerToken(ordinal=55, name='User.6', type='user'), + LayerToken(ordinal=56, name='User.7', type='user'), + LayerToken(ordinal=57, name='User.8', type='user'), + LayerToken(ordinal=58, name='User.9', type='user') + ]) + + # Append net0 to netlist + board.nets.append(Net()) + + return board + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + addNewLine = False + + expression = f'{indents}(kicad_pcb (version {self.version}) (generator {self.generator})\n\n' + expression += self.general.to_sexpr(indent+2) + '\n' + expression += self.paper.to_sexpr(indent+2) + if self.titleBlock is not None: + expression += self.titleBlock.to_sexpr(indent+2) + '\n' + expression += f'{indents} (layers\n' + for layer in self.layers: + expression += layer.to_sexpr(indent+4) + expression += f'{indents} )\n\n' + expression += self.setup.to_sexpr(indent+2) + '\n' + # Properties, if any + if len(self.properties) > 0: + for key, value in self.properties.items(): + expression += f' (property "{dequote(key)}" "{dequote(value)}")\n' + expression += '\n' + + # Nets + if len(self.nets) > 0: + for net in self.nets: + expression += net.to_sexpr(indent=indent+2, newline=True) + expression += '\n' + + # Footprints + for footprint in self.footprints: + expression += footprint.to_sexpr(indent+2, layerInFirstLine=True) + '\n' + + # Lines, Texts, Arcs and other graphical items + if len(self.graphicItems) > 0: + addNewLine = True + for item in self.graphicItems: + if isinstance(item, GrPoly): + expression += item.to_sexpr(indent+2, pts_newline=True) + else: + expression += item.to_sexpr(indent+2) + + # Dimensions + if len(self.dimensions) > 0: + addNewLine = True + for dimension in self.dimensions: + expression += dimension.to_sexpr(indent+2) + + # Target markers: + if len(self.targets) > 0: + addNewLine = True + for target in self.targets: + expression += target.to_sexpr(indent+2) + + if addNewLine: + expression += '\n' + + # Segments, vias and arcs + if len(self.traceItems) > 0: + for item in self.traceItems: + expression += item.to_sexpr(indent+2) + expression += '\n' + + # Zones + for zone in self.zones: + expression += zone.to_sexpr(indent+2) + + # Groups + for group in self.groups: + expression += group.to_sexpr(indent+2) + + expression += f'{indents}){endline}' + return expression diff --git a/kiutils/dru.py b/kiutils/dru.py new file mode 100644 index 0000000..a1b5a4a --- /dev/null +++ b/kiutils/dru.py @@ -0,0 +1,315 @@ +"""Classes for custom design rules (.kicad_dru) and its contents + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 26.06.2022 - created + +Documentation taken from: + ??? Syntax help in Pcbnew +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List +from os import path + +from kiutils.utils import sexpr +from kiutils.utils.strings import dequote + +@dataclass +class Constraint(): + """The ``Constraint`` token defines a design rule's constraint""" + + type: str = "clearance" + """The ``type`` token defines the type of constraint. Defaults to ``clearance``. Allowed types: + - ``annular_width`` - Width of an annular ring + - ``clearance`` - Clearance between two items + - ``courtyard_clearance`` - Clearance between two courtyards + - ``diff_pair_gap`` - Gap between differential pairs + - ``diff_pair_uncoupled`` - ??? + - ``disallow`` - ??? Do not allow this rule + - ``edge_clearance`` - Clearance between the item and board edges + - ``length`` - Length of the item + - ``hole_clearance`` - Clearance between the item and holes + - ``hole_size`` - Size of the holes associated with this item + - ``silk_clearance`` - Clearance to silk screen + - ``skew`` - Difference in length between the items associated with this constraint + - ``track_width`` - Width of the tracks associated with this constraint + - ``via_count`` - Number of vias + - ``via_diameter`` - Diameter of vias associated with this constraint + """ + + min: Optional[str] = None + """The ``min`` token defines the minimum allowed in this constraint""" + + opt: Optional[str] = None + """The ``opt`` token defines the optimum allowed in this constraint""" + + max: Optional[str] = None + """The ``max`` token defines the maximum allowed in this constraint""" + + elements: List[str] = field(default_factory=list) + """The ``items`` token defines a list of zero or more element types to include in this constraint. + The following element types are available: + - ``buried_via`` + - ``micro_via`` + - ``via`` + - ``graphic`` + - ``hole`` + - ``pad`` + - ``text`` + - ``track`` + - ``zone`` + """ + + @classmethod + def from_sexpr(cls, exp: list) -> Constraint: + """Convert the given S-Expresstion into a Constraint object + + Args: + - exp (list): Part of parsed S-Expression ``(constraint ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the list's first parameter is not the ``(constraint ..)`` token + + Returns: + - Constraint: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'constraint': + raise Exception("Expression does not have the correct type") + + object = cls() + object.type = exp[1] + for item in exp[2:]: + if type(item) != type([]): + object.elements.append(item) + if item[0] == 'min': object.min = item[1] + if item[0] == 'opt': object.opt = item[1] + if item[0] == 'max': object.max = item[1] + return object + + def to_sexpr(self, indent=2, newline=True): + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + min = f' (min "{dequote(self.min)}")' if self.min is not None else '' + opt = f' (opt "{dequote(self.opt)}")' if self.opt is not None else '' + max = f' (max "{dequote(self.max)}")' if self.max is not None else '' + + elements = ' '+' '.join(self.elements) if (len(self.elements) > 0) else '' + + return f'{indents}(constraint {self.type}{min}{opt}{max}{elements}){endline}' + +@dataclass +class Rule(): + """The ``Rule`` token defines a custom design rule""" + + name: str = "" + """The ``name`` token defines the name of the custom design rule""" + + constraints: List[Constraint] = field(default_factory=list) + """The ``constraints`` token defines a list of constraints for this custom design rule""" + + condition: str = "" + """The ``condition`` token defines the conditions that apply for this rule. Check KiCad syntax + reference for more information. Example rule: + - `A.inDiffPair('*') && !AB.isCoupledDiffPair()`""" + + layer: Optional[str] = None + """The optional ``layer`` token defines the canonical layer the rule applys to""" + + severity: Optional[str] = None + """The optional ``severity`` token defines the severity of the design rule. Valid values are + ``warning``, ``error``, ``exclusion`` or ``ignore``. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Rule: + """Convert the given S-Expresstion into a Rule object + + Args: + - exp (list): Part of parsed S-Expression ``(rule ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the list's first parameter is not the ``(rule ..)`` token + + Returns: + - Rule: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'rule': + raise Exception("Expression does not have the correct type") + + object = cls() + object.name = exp[1] + for item in exp[2:]: + if item[0] == 'constraint': object.constraints.append(Constraint().from_sexpr(item)) + if item[0] == 'condition': object.condition = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'severity': object.severity = item[1] + return object + + def to_sexpr(self, indent: int = 0): + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + + expression = f'{indents}(rule "{dequote(self.name)}"\n' + if self.layer is not None: + expression += f'{indents} (layer "{dequote(self.layer)}")\n' + for item in self.constraints: + expression += f'{indents}{item.to_sexpr(indent+2)}' + expression += f'{indents} (condition "{dequote(self.condition)}")' + if self.severity is not None: + expression += f'\n{indents} (severity {dequote(self.severity)})' + expression += ')\n' + return expression + +@dataclass +class DesignRules(): + """The ``DesignRules`` token defines a set of custom design rules (`.kicad_dru` files)""" + + version: int = 1 + """The ``version`` token defines the version of the file for the KiCad parser. Defaults to 1.""" + + rules: List[Rule] = field(default_factory=list) + """The ``rules`` token defines a list of custom design rules""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the schematic file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_sexpr(cls, exp: list) -> DesignRules: + """Convert the given S-Expresstion into a DesignRules object + + Args: + - exp (list): Part of parsed S-Expression ``(version ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the list's first parameter is not the ``(version ..)`` token + + Returns: + - DesignRules: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if not isinstance(exp[0], list): + raise Exception("Expression does not have the correct type") + + if exp[0][0] != 'version': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'version': object.version = item[1] + if item[0] == 'rule': object.rules.append(Rule().from_sexpr(item)) + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> DesignRules: + """Load a custom design rules set directly from a KiCad design rules file (`.kicad_dru`) and + sets the ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + Raises: + - Exception: If the given path is not a file + + Returns: + - Footprint: Object of the DesignRules class initialized with the given KiCad file + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + # This dirty fix adds opening and closing brackets `(..)` to the read input to enable + # the S-Expression parser to work for the DRU-format as well. + data = f'({infile.read()})' + item = cls.from_sexpr(sexpr.parse_sexp(data)) + item.filePath = filepath + return item + + @classmethod + def create_new(cls) -> DesignRules: + """Creates a new empty design rules set as KiCad would create it + + Returns: + - DesignRules: Empty design rules set + """ + return cls(version=1) + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=False): + """Generate the S-Expression representing this object + + Args: + indent (int, optional): Number of whitespaces used to indent the output. Defaults to 0. + newline (bool, optional): Adds a newline to the end of the output. Defaults to False. + + Returns: + str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(version {self.version})\n' + + if len(self.rules): + expression += f'{indents}\n' + for rule in self.rules: + expression += f'{indents}{rule.to_sexpr(indent=indent)}' + + return expression + endline \ No newline at end of file diff --git a/kiutils/footprint.py b/kiutils/footprint.py new file mode 100644 index 0000000..826c9f4 --- /dev/null +++ b/kiutils/footprint.py @@ -0,0 +1,1098 @@ +"""Classes to manage KiCad footprints + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 02.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-footprint/ +""" + +from __future__ import annotations + +import calendar +import datetime +import re +from dataclasses import dataclass, field +from typing import Optional, List, Dict +from os import path + +from kiutils.items.zones import Zone +from kiutils.items.common import Image, Position, Coordinate, Net, Group, Font +from kiutils.items.fpitems import * +from kiutils.items.gritems import * +from kiutils.utils import sexpr +from kiutils.utils.strings import dequote, remove_prefix +from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR + +@dataclass +class Attributes(): + """The ``attr`` token defines the list of attributes of a footprint. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_attributes + """ + + type: Optional[str] = None + """The optional ``type`` token defines the type of footprint. Valid footprint types are ``smd`` and + ``through_hole``. May be none when no attributes are set.""" + + boardOnly: bool = False + """The optional ``boardOnly`` token indicates that the footprint is only defined in the board + and has no reference to any schematic symbol""" + + excludeFromPosFiles: bool = False + """The optional ``excludeFromPosFiles`` token indicates that the footprint position information + should not be included when creating position files""" + + excludeFromBom: bool = False + """The optional ``excludeFromBom`` token indicates that the footprint should be excluded when + creating bill of materials (BOM) files""" + + allowMissingCourtyard: bool = False + """The optional ``allowMissingCourtyard`` token indicates if the footprint generates a + "missing courtyard" DRC violation. + + Available since KiCad 7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Attributes: + """Convert the given S-Expresstion into a Attributes object + + Args: + - exp (list): Part of parsed S-Expression ``(attr ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not attr + + Returns: + - Attributes: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'attr': + raise Exception("Expression does not have the correct type") + + object = cls() + if len(exp) > 1: + # Attributes token may be set with no other items (empty attributes) + # Test case for this: test_fp_empty_attr.kicad_mod + if exp[1] == 'through_hole' or exp[1] == 'smd': + object.type = exp[1] + + for item in exp: + if item == 'board_only': object.boardOnly = True + if item == 'exclude_from_pos_files': object.excludeFromPosFiles = True + if item == 'exclude_from_bom': object.excludeFromBom = True + if item == 'allow_missing_courtyard': object.allowMissingCourtyard = True + return object + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object. Will return an empty string, if the + following attributes are selected: + - ``type``: None + - ``boardOnly``: False + - ``excludeFromBom``: False + - ``excludeFromPosFiles``: False + - ``allowMissingCourtyard``: False + + KiCad won't add the ``(attr ..)`` token to a footprint when this combination is selected. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + if (self.type == None + and self.boardOnly == False + and self.excludeFromBom == False + and self.excludeFromPosFiles == False + and self.allowMissingCourtyard == False): + return '' + + indents = ' '*indent + endline = '\n' if newline else '' + type = f' {self.type}' if self.type is not None else '' + + expression = f'{indents}(attr{type}' + if self.boardOnly: expression += ' board_only' + if self.excludeFromPosFiles: expression += ' exclude_from_pos_files' + if self.excludeFromBom: expression += ' exclude_from_bom' + if self.allowMissingCourtyard: expression += ' allow_missing_courtyard' + expression += f'){endline}' + return expression + +@dataclass +class Model(): + """The ``model`` token defines the 3D model associated with a footprint. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_3d_model + """ + + path: str = "" + """The ``path`` attribute is the path and file name of the 3D model""" + + pos: Coordinate = field(default_factory=lambda: Coordinate(0.0, 0.0, 0.0)) + """The ``pos`` token specifies the 3D position coordinates of the model relative to the footprint""" + + scale: Coordinate = field(default_factory=lambda: Coordinate(1.0, 1.0, 1.0)) + """The ``scale`` token specifies the model scale factor for each 3D axis""" + + rotate: Coordinate = field(default_factory=lambda: Coordinate(0.0, 0.0, 0.0)) + """The ``rotate`` token specifies the model rotation for each 3D axis relative to the footprint""" + + hide: bool = False + """The `hide` token specifies if the 3d model is visible or not""" + + opacity: Optional[float] = None + """The optional opacity token specifies the opacity of the 3D model on a scale between 1.0 and 0.0.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Model: + """Convert the given S-Expresstion into a Model object + + Args: + - exp (list): Part of parsed S-Expression ``(model ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is not 5 long + - Exception: When the first item of the list is not model + + Returns: + - Model: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 5: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'model': + raise Exception("Expression does not have the correct type") + + object = cls() + object.path = exp[1] + + if exp[2] == 'hide': + object.hide = True + + for e in exp[2:]: + if e[0] == 'opacity': + object.opacity = e[1] + elif e[0] == 'offset': + object.pos = Coordinate.from_sexpr(e[1]) + elif e[0] == 'scale': + object.scale = Coordinate.from_sexpr(e[1]) + elif e[0] == 'rotate': + object.rotate = Coordinate.from_sexpr(e[1]) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + hide = " hide" if self.hide else "" + + expression = f'{indents}(model "{dequote(self.path)}"{hide}\n' + if self.opacity is not None: + expression += f'{indents} (opacity {self.opacity})\n' + expression += f'{indents} (offset {self.pos.to_sexpr()})\n' + expression += f'{indents} (scale {self.scale.to_sexpr()})\n' + expression += f'{indents} (rotate {self.rotate.to_sexpr()})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class DrillDefinition(): + """The ``drill`` token defines the drill attributes for a footprint pad. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_pad_drill_definition + """ + + oval: bool = False + """The ``oval`` token defines if the drill is oval instead of round""" + + diameter: float = 0.0 + """The ``diameter`` attribute defines the drill diameter""" + + width: Optional[float] = None + """The optional ``width`` attribute defines the width of the slot for oval drills""" + + offset: Optional[Position] = None + """The optional ``offset`` token defines the drill offset coordinates from the center of the pad""" + + @classmethod + def from_sexpr(cls, exp: list) -> DrillDefinition: + """Convert the given S-Expresstion into a DrillDefinition object + + Args: + - exp (list): Part of parsed S-Expression ``(drill ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not drill + + Returns: + - DrillDefinition: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'drill': + raise Exception("Expression does not have the correct type") + + object = cls() + # Depending on the ``oval`` token, the fields may be shifted .. + if exp[1] == 'oval': + object.oval = True + object.diameter = exp[2] + object.width = exp[3] + else: + object.diameter = exp[1] + if len(exp) > 2: + object.width = exp[2] + + # The ``offset`` token may not be given + for item in exp: + if type(item) != type([]): continue + if item[0] == 'offset': object.offset = Position().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 0, newline: bool = False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + oval = f' oval' if self.oval else '' + width = f' {self.width}' if self.oval and self.width is not None else '' + offset = f' (offset {self.offset.X} {self.offset.Y})' if self.offset is not None else '' + + return f'{indents}(drill{oval} {self.diameter}{width}{offset}){endline}' + +@dataclass +class PadOptions(): + """The ``options`` token attributes define the settings used for custom pads. This token is + only used when a custom pad is defined. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_custom_pad_options + """ + clearance: str = "outline" + """The ``clearance`` token defines the type of clearance used for a custom pad. Valid clearance + types are ``outline`` and ``convexhull``.""" + + anchor: str = "rect" + """The ``anchor`` token defines the anchor pad shape of a custom pad. Valid anchor pad shapes + are rect and circle.""" + + @classmethod + def from_sexpr(cls, exp: list) -> PadOptions: + """Convert the given S-Expresstion into a PadOptions object + + Args: + - exp (list): Part of parsed S-Expression ``(options ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not options + + Returns: + - PadOptions: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'options': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'clearance': object.clearance = item[1] + if item[0] == 'anchor': object.anchor = item[1] + return object + + def to_sexpr(self, indent: int = 0, newline: bool = False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + return f'{indents}(options (clearance {self.clearance}) (anchor {self.anchor})){endline}' + +@dataclass +class Pad(): + """The ``pad`` token defines a pad in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_pad + """ + + number: str = "x" + """The ``number`` attribute is the pad number""" + + type: str = "smd" + """The pad ``type`` can be defined as ``thru_hole``, ``smd``, ``connect``, or ``np_thru_hole``""" + + shape: str = "rect" + """The pad ``shape`` can be defined as ``circle``, ``rect``, ``oval``, ``trapezoid``, ``roundrect``, or + ``custom``""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and optional orientation angle of the pad""" + + locked: bool = False + """The optional ``locked`` token defines if the footprint pad can be edited""" + + size: Position = field(default_factory=lambda: Position()) # Size uses Position class for simplicity for now + """The ``size`` token defines the width and height of the pad""" + + drill: Optional[DrillDefinition] = None + """The optional pad ``drill`` token defines the pad drill requirements""" + + # TODO: Test case for one-layer pad?? + layers: List[str] = field(default_factory=list) + """The ``layers`` token defines the layer or layers the pad reside on""" + + property: Optional[str] = None + """The optional ``property`` token defines any special properties for the pad. Valid properties + are ``pad_prop_bga``, ``pad_prop_fiducial_glob``, ``pad_prop_fiducial_loc``, ``pad_prop_testpoint``, + ``pad_prop_heatsink``, ``pad_prop_heatsink``, and ``pad_prop_castellated``""" + + removeUnusedLayers: bool = False + """The optional ``removeUnusedLayers`` token specifies that the copper should be removed from + any layers the pad is not connected to""" + + keepEndLayers: bool = False + """The optional ``keepEndLayers`` token specifies that the top and bottom layers should be + retained when removing the copper from unused layers""" + + roundrectRatio: Optional[float] = None + """The optional ``roundrectRatio`` token defines the scaling factor of the pad to corner radius + for rounded rectangular and chamfered corner rectangular pads. The scaling factor is a + number between 0 and 1.""" + + chamferRatio: Optional[float] = None # Adds a newline before + """The optional ``chamferRatio`` token defines the scaling factor of the pad to chamfer size. + The scaling factor is a number between 0 and 1.""" + + chamfer: List[str] = field(default_factory=list) + """The optional ``chamfer`` token defines a list of one or more rectangular pad corners that + get chamfered. Valid chamfer corner attributes are ``top_left``, ``top_right``, ``bottom_left``, + and ``bottom_right``.""" + + net: Optional[Net] = None + """The optional ``net`` token defines the integer number and name string of the net connection + for the pad.""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The optional ``uuid`` token defines the unique identifier of the pad object""" + + pinFunction: Optional[str] = None + """The optional ``pinFunction`` token attribute defines the associated schematic symbol pin name""" + + pinType: Optional[str] = None + """The optional ``pinType`` token attribute defines the associated schematic pin electrical type""" + + dieLength: Optional[float] = None # Adds a newline before + """The optional ``dieLength`` token attribute defines the die length between the component pad + and physical chip inside the component package""" + + solderMaskMargin: Optional[float] = None + """The optional ``solderMaskMargin`` token attribute defines the distance between the pad and + the solder mask for the pad. If not set, the footprint solder_mask_margin is used.""" + + solderPasteMargin: Optional[float] = None + """The optional ``solderPasteMargin`` token attribute defines the distance the solder paste + should be changed for the pad""" + + solderPasteMarginRatio: Optional[float] = None + """The optional ``solderPasteMarginRatio`` token attribute defines the percentage to reduce the + pad outline by to generate the solder paste size""" + + clearance: Optional[float] = None + """The optional ``clearance`` token attribute defines the clearance from all copper to the pad. + If not set, the footprint clearance is used.""" + + zoneConnect: Optional[int] = None + """The optional ``zoneConnect`` token attribute defines type of zone connect for the pad. If + not defined, the footprint zone_connection setting is used. Valid connection types are + integers values from 0 to 3 which defines: + - 0: Pad is not connect to zone + - 1: Pad is connected to zone using thermal relief + - 2: Pad is connected to zone using solid fill + - 3: Only through hold pad is connected to zone using thermal relief + """ + + thermalWidth: Optional[float] = None + """The optional ``thermalWidth`` token attribute defines the thermal relief spoke width used for + zone connection for the pad. This only affects a pad connected to a zone with a thermal + relief. If not set, the footprint thermal_width setting is used.""" + + thermalGap: Optional[float] = None + """The optional ``thermalGap`` token attribute defines the distance from the pad to the zone of + the thermal relief connection for the pad. This only affects a pad connected to a zone + with a thermal relief. If not set, the footprint thermal_gap setting is used.""" + + customPadOptions: Optional[PadOptions] = None + """The optional ``customPadOptions`` token defines the options when a custom pad is defined""" + + # Documentation seems wrong about primitives here. It seems like its just a list + # of graphical objects, but the docu suggests, besides the list, two other params + # for the primitive token: width and fill + # These two however are note generated under the primitive token from the KiCad + # generator. These two params may be found in gr_poly or gr_XX only. + # So for now, the custom pad primitives are only a list of graphical objects + customPadPrimitives: List = field(default_factory=list) + """The optional ``customPadPrimitives`` defines the drawing objects and options used to define + a custom pad""" + + @classmethod + def from_sexpr(cls, exp: list) -> Pad: + """Convert the given S-Expresstion into a Pad object + + Args: + - exp (list): Part of parsed S-Expression ``(pad ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not pad + + Returns: + - Pad: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'pad': + raise Exception("Expression does not have the correct type") + + object = cls() + object.number = exp[1] + object.type = exp[2] + object.shape = exp[3] + + for item in exp[3:]: + if type(item) != type([]): + if item == 'locked': object.locked = True + + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'size': object.size = Position().from_sexpr(item) + if item[0] == 'drill': object.drill = DrillDefinition().from_sexpr(item) + if item[0] == 'layers': + for layer in item[1:]: + object.layers.append(layer) + if item[0] == 'property': object.property = item[1] + if item[0] == 'remove_unused_layers': object.removeUnusedLayers = True + if item[0] == 'keep_end_layers': object.keepEndLayers = True + if item[0] == 'roundrect_rratio': object.roundrectRatio = item[1] + if item[0] == 'chamfer_ratio': object.chamferRatio = item[1] + if item[0] == 'chamfer': + for chamfer in item[1:]: + object.chamfer.append(chamfer) + if item[0] == 'net': object.net = Net().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'pinfunction': object.pinFunction = item[1] + if item[0] == 'pintype': object.pinType = item[1] + if item[0] == 'die_length': object.dieLength = item[1] + if item[0] == 'solder_mask_margin': object.solderMaskMargin = item[1] + if item[0] == 'solder_paste_margin': object.solderPasteMargin = item[1] + if item[0] == 'solder_paste_margin_ratio': object.solderPasteMarginRatio = item[1] + if item[0] == 'clearance': object.clearance = item[1] + if item[0] == 'zone_connect': object.zoneConnect = item[1] + if item[0] == 'thermal_width': object.thermalWidth = item[1] + if item[0] == 'thermal_gap': object.thermalGap = item[1] + if item[0] == 'options': object.customPadOptions = PadOptions().from_sexpr(item) + if item[0] == 'primitives': + for primitive in item[1:]: + if primitive[0] == 'gr_text': object.customPadPrimitives.append(GrText().from_sexpr(primitive)) + if primitive[0] == 'gr_text_box': object.customPadPrimitives.append(GrTextBox().from_sexpr(primitive)) + if primitive[0] == 'gr_line': object.customPadPrimitives.append(GrLine().from_sexpr(primitive)) + if primitive[0] == 'gr_rect': object.customPadPrimitives.append(GrRect().from_sexpr(primitive)) + if primitive[0] == 'gr_circle': object.customPadPrimitives.append(GrCircle().from_sexpr(primitive)) + if primitive[0] == 'gr_arc': object.customPadPrimitives.append(GrArc().from_sexpr(primitive)) + if primitive[0] == 'gr_poly': object.customPadPrimitives.append(GrPoly().from_sexpr(primitive)) + if primitive[0] == 'gr_curve': object.customPadPrimitives.append(GrCurve().from_sexpr(primitive)) + + # XXX: Are dimentions even implemented here? + if primitive[0] == 'dimension': raise NotImplementedError("Dimensions are not yet handled! Please report this bug along with the file being parsed.") + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + champferFound, marginFound, schematicSymbolAssociated = False, False, False + c, cr, smm, spm, spmr, cl, zc, tw, tg = '', '', '', '', '', '', '', '', '' + + layers = ' (layers' + for layer in self.layers: + # For some reason KiCad does not escape a layer with double-quotes if it has a + # wildcard (*) or an ampersant (&) in it + if "*." in layer or "&" in layer: + layers += f' {layer}' + else: + layers += f' "{dequote(layer)}"' + + layers += ')' + + locked = ' locked' if self.locked else '' + drill = f' {self.drill.to_sexpr()}' if self.drill is not None else '' + ppty = f' (property {self.property})' if self.property is not None else '' + rul = ' (remove_unused_layers)' if self.removeUnusedLayers else '' + kel = ' (keep_end_layers)' if self.keepEndLayers else '' + rrr = f' (roundrect_rratio {self.roundrectRatio})' if self.roundrectRatio is not None else '' + + net = f' {self.net.to_sexpr()}' if self.net is not None else '' + pf = f' (pinfunction "{dequote(self.pinFunction)}")' if self.pinFunction is not None else '' + pt = f' (pintype "{dequote(self.pinType)}")' if self.pinType is not None else '' + + # Check if a schematic symbol is associated with this footprint. This is usually set, if the + # footprint is used in a board file. + if net != '' or pf != '' or pt != '': + schematicSymbolAssociated = True + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + + if len(self.chamfer) > 0: + champferFound = True + c = ' (chamfer' + for chamfer in self.chamfer: + c += f' {chamfer}' + c += ')' + if self.chamferRatio is not None: + champferFound = True + cr = f' (chamfer_ratio {self.chamferRatio})' + + if self.position.angle is not None: + position = f'(at {self.position.X} {self.position.Y} {self.position.angle})' + else: + position = f'(at {self.position.X} {self.position.Y})' + + if self.solderMaskMargin is not None: + marginFound = True + smm = f' (solder_mask_margin {self.solderMaskMargin})' + + if self.solderPasteMargin is not None: + marginFound = True + spm = f' (solder_paste_margin {self.solderPasteMargin})' + + if self.solderPasteMarginRatio is not None: + marginFound = True + spmr = f' (solder_paste_margin_ratio {self.solderPasteMarginRatio})' + + if self.clearance is not None: + marginFound = True + cl = f' (clearance {self.clearance})' + + if self.zoneConnect is not None: + marginFound = True + zc = f' (zone_connect {self.zoneConnect})' + + if self.thermalWidth is not None: + marginFound = True + tw = f' (thermal_width {self.thermalWidth})' + + if self.thermalGap is not None: + marginFound = True + tg = f' (thermal_gap {self.thermalGap})' + + expression = f'{indents}(pad "{dequote(str(self.number))}" {self.type} {self.shape}{locked} {position} (size {self.size.X} {self.size.Y}){drill}{ppty}{layers}{rul}{kel}{rrr}' + if champferFound: + # Only one whitespace here as all temporary strings have at least one leading whitespace + expression += f'\n{indents} {cr}{c}' + + if self.dieLength is not None: + expression += f'\n{indents} (die_length {self.dieLength})' + + if marginFound or schematicSymbolAssociated: + # Only one whitespace here as all temporary strings have at least one leading whitespace + expression += f'\n{indents} {net}{pf}{pt}{smm}{spm}{spmr}{cl}{zc}{tw}{tg}' + + if self.customPadOptions is not None: + expression += f'\n{indents} {self.customPadOptions.to_sexpr()}' + + if self.customPadPrimitives is not None: + if len(self.customPadPrimitives) > 0: + expression += f'\n{indents} (primitives' + for primitive in self.customPadPrimitives: + expression += f'\n{primitive.to_sexpr(newline=False,indent=indent+4)}' + expression += f'\n{indents} )' + + expression += f'{uuid}){endline}' + return expression + +@dataclass +class Footprint(): + """The ``footprint`` token defines a footprint. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint + """ + + @property + def libId(self) -> str: + """The ``lib_id`` token defines the link to footprint library of the footprint. + This only applies to footprints defined in the board file format, in a regular footprint + file this id defines the footprint's name. In ``kiutils``, the token is a combination of + both the ``libraryNickname`` and ``entryName`` token. Setting the ``lib_id`` token will + update those tokens accordingly. + + Returns: + - Symbol id in the following format: ``:`` or ````, + if ``libraryNickname`` token is not set. + """ + if self.libraryNickname: + return f'{self.libraryNickname}:{self.entryName}' + else: + return f'{self.entryName}' + + @libId.setter + def libId(self, symbol_id: str): + """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname`` and + ``entryName`` token. + + Args: + - symbol_id (str): The symbol id in the following format: ``:`` + or only ```` + """ + # kicad5 fix: module names may not be quoted strings (only numbers) - see PR #91 + parse_symbol_id = re.match(r"^(.+?):(.+?)$", str(symbol_id)) + if parse_symbol_id: + self.libraryNickname = parse_symbol_id.group(1) + self.entryName = parse_symbol_id.group(2) + else: + self.libraryNickname = None + self.entryName = symbol_id + + libraryNickname: Optional[str] = None + """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to + and is a part of the ``id`` token""" + + entryName: str = None + """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id`` + token""" + + version: Optional[str] = None + """The ``version`` token attribute defines the symbol library version using the YYYYMMDD date format""" + + generator: Optional[str] = None + """The ``generator`` token attribute defines the program used to write the file""" + + locked: bool = False + """The optional ``locked`` token defines a flag to indicate the footprint cannot be edited""" + + placed: bool = False + """The optional ``placed`` token defines a flag to indicate that the footprint has not been placed""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the footprint is placed""" + + tedit: str = remove_prefix(hex(calendar.timegm(datetime.datetime.now().utctimetuple())), '0x') + """The ``tedit`` token defines a the last time the footprint was edited""" + + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier for the footprint. This only applies + to footprints defined in the board file format.""" + + position: Optional[Position] = None + """The ``position`` token defines the X and Y coordinates and rotational angle of the + footprint. This only applies to footprints defined in the board file format.""" + + description: Optional[str] = None + """The optional ``description`` token defines a string containing the description of the footprint""" + + tags: Optional[str] = None + """The optional ``tags`` token defines a string of search tags for the footprint""" + + properties: Dict = field(default_factory=dict) + """The ``properties`` token defines dictionary of properties as key / value pairs where key being + the name of the property and value being the description of the property""" + + path: Optional[str] = None + """The ``path`` token defines the hierarchical path of the schematic symbol linked to the footprint. + This only applies to footprints defined in the board file format.""" + + autoplaceCost90: Optional[int] = None + """The optional ``autoplaceCost90`` token defines the vertical cost of when using the automatic + footprint placement tool. Valid values are integers 1 through 10. This only applies to footprints + defined in the board file format.""" + + autoplaceCost180: Optional[int] = None + """The optional ``autoplaceCost180`` token defines the horizontal cost of when using the automatic + footprint placement tool. Valid values are integers 1 through 10. This only applies to footprints + defined in the board file format.""" + + solderMaskMargin: Optional[float] = None + """The optional ``solderMaskMargin`` token defines the solder mask distance from all pads in the + footprint. If not set, the board solder_mask_margin setting is used.""" + + solderPasteMargin: Optional[float] = None + """The optional ``solderPasteMargin`` token defines the solder paste distance from all pads in + the footprint. If not set, the board solder_paste_margin setting is used.""" + + solderPasteRatio: Optional[float] = None + """The optional ``solderPasteRatio`` token defines the percentage of the pad size used to define + the solder paste for all pads in the footprint. If not set, the board solder_paste_ratio setting + is used.""" + + clearance: Optional[float] = None + """The optional ``clearance`` token defines the clearance to all board copper objects for all pads + in the footprint. If not set, the board clearance setting is used.""" + + zoneConnect: Optional[int] = None + """The optional ``zoneConnect`` token defines how all pads are connected to filled zone. If not + defined, then the zone connect_pads setting is used. Valid connection types are integers values + from 0 to 3 which defines: + - 0: Pads are not connect to zone + - 1: Pads are connected to zone using thermal reliefs + - 2: Pads are connected to zone using solid fill + - 3: Only through hold pads are connected to zone using thermal reliefs + """ + + thermalWidth: Optional[float] = None + """The optional ``thermalWidth`` token defined the thermal relief spoke width used for zone connections + for all pads in the footprint. This only affects pads connected to zones with thermal reliefs. If + not set, the zone thermal_width setting is used.""" + + thermalGap: Optional[float] = None + """The optional ``thermalGap`` is the distance from the pad to the zone of thermal relief connections + for all pads in the footprint. If not set, the zone thermal_gap setting is used. If not set, the + zone thermal_gap setting is used.""" + + attributes: Attributes = field(default_factory=lambda: Attributes()) + """The optional ``attributes`` section defines the attributes of the footprint""" + + privateLayers: List[str] = field(default_factory=list) + """The optional ``privateLayers`` token defines a list of private layers assigned to the footprint. + Valid values are: ``User.[1-9]``, ``User.Drawings``, ``User.Comments``, ``User.Eco[1-2]``. + + Available since KiCad v7.""" + + netTiePadGroups: List[str] = field(default_factory=list) + """The optional ``netTiePadGroups`` token defines a list of net tie groups assigned to the + footprint. + + Available since KiCad v7.""" + + # TODO: Type hinting for this list + graphicItems: List = field(default_factory=list) + """The ``graphic`` objects section is a list of one or more graphical objects in the footprint. + Possible items are defined in ``kiutils.items.fpitems``. At minimum the reference designator + and value text objects are defined. All other graphical objects are optional. + + The ``Image`` token is supported since KiCad v7 and must be added into this list when used.""" + + pads: List[Pad] = field(default_factory=list) + """The optional ``pads`` section is a list of pads in the footprint""" + + zones: List[Zone] = field(default_factory=list) + """The optional ``zones`` section is a list of keep out zones in the footprint""" + + groups: List[Group] = field(default_factory=list) + """The optional ``groups`` section is a list of grouped objects in the footprint""" + + models: List[Model] = field(default_factory=list) + """The ``3D model`` section defines the 3D model object associated with the footprint""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the library file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Footprint: + """Convert the given S-Expresstion into a Footprint object + + Args: + - exp (list): Part of parsed S-Expression ``(footprint ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not footprint + + Returns: + - Footprint: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'module' and exp[0] != 'footprint': + raise Exception("Expression does not have the correct type") + + object = cls() + object.libId = exp[1] + for item in exp[2:]: + if not isinstance(item, list): + if item == 'locked': object.locked = True + if item == 'placed': object.placed = True + continue + + if item[0] == 'version': object.version = item[1] + if item[0] == 'generator': object.generator = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'tedit': object.tedit = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'descr': object.description = item[1] + if item[0] == 'tags': object.tags = item[1] + if item[0] == 'path': object.path = item[1] + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'autoplace_cost90': object.autoplaceCost90 = item[1] + if item[0] == 'autoplace_cost180': object.autoplaceCost180 = item[1] + if item[0] == 'solder_mask_margin': object.solderMaskMargin = item[1] + if item[0] == 'solder_paste_margin': object.solderPasteMargin = item[1] + if item[0] == 'solder_paste_ratio': object.solderPasteRatio = item[1] + if item[0] == 'clearance': object.clearance = item[1] + if item[0] == 'zone_connect': object.zoneConnect = item[1] + if item[0] == 'thermal_width': object.thermalWidth = item[1] + if item[0] == 'thermal_gap': object.thermalGap = item[1] + if item[0] == 'attr': object.attributes = Attributes.from_sexpr(item) + if item[0] == 'model': object.models.append(Model.from_sexpr(item)) + if item[0] == 'fp_text': object.graphicItems.append(FpText.from_sexpr(item)) + if item[0] == 'fp_text_box': object.graphicItems.append(FpTextBox.from_sexpr(item)) + if item[0] == 'fp_line': object.graphicItems.append(FpLine.from_sexpr(item)) + if item[0] == 'fp_rect': object.graphicItems.append(FpRect.from_sexpr(item)) + if item[0] == 'fp_circle': object.graphicItems.append(FpCircle.from_sexpr(item)) + if item[0] == 'fp_arc': object.graphicItems.append(FpArc.from_sexpr(item)) + if item[0] == 'fp_poly': object.graphicItems.append(FpPoly.from_sexpr(item)) + if item[0] == 'fp_curve': object.graphicItems.append(FpCurve.from_sexpr(item)) + if item[0] == 'image':object.graphicItems.append(Image.from_sexpr(item)) + if item[0] == 'pad': object.pads.append(Pad.from_sexpr(item)) + if item[0] == 'zone': object.zones.append(Zone.from_sexpr(item)) + if item[0] == 'property': object.properties.update({ item[1]: item[2] }) + if item[0] == 'group': object.groups.append(Group.from_sexpr(item)) + if item[0] == 'private_layers': + for layer in item[1:]: + object.privateLayers.append(layer) + if item[0] == 'net_tie_pad_groups': + for layer in item[1:]: + object.netTiePadGroups.append(layer) + if item[0] == 'dimension': + raise NotImplementedError("Dimensions are not yet handled! Please report this bug along with the file being parsed.") + + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Footprint: + """Load a footprint directly from a KiCad footprint file (`.kicad_mod`) and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - Footprint: Object of the Footprint class initialized with the given KiCad footprint + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + rawFootprint = infile.read() + + fpData = sexpr.parse_sexp(rawFootprint) + return cls.from_sexpr(fpData) + + @classmethod + def create_new(cls, library_id: str, value: str, + type: str = 'other', reference: str = 'REF**') -> Footprint: + """Creates a new empty footprint with its attributes set as KiCad would create it + + Args: + - library_link (str): Denotes the name of the library as well as the footprint. Like `Connector:Conn01x02`) + - value (str): The value text item (printed on the fabrication layer as ``value`` attribute) + - type (str): Type of footprint (``smd``, ``through_hole`` or ``other``). Defaults to 'other'. + - reference (str): Reference of the footprint. Defaults to `REF**`. + Raises: + - Exception: When the given type is something other than listed above + + Returns: + - Footprint: Empty footprint + """ + if type not in ['smd', 'through_hole', 'other']: + raise Exception("Unsupported type was given") + + fp = cls( + version = KIUTILS_CREATE_NEW_VERSION_STR, + generator = 'kiutils' + ) + fp.libId = library_id + + # Create text items that are created when adding a new footprint to a library + fp.graphicItems.extend( + [ + FpText( + type = 'reference', text = reference, layer = 'F.SilkS', + effects = Effects(font=Font(thickness=0.15)), + position = Position(X=0, Y=-0.5, unlocked=True) + ), + FpText( + type = 'value', text = value, layer ='F.Fab', + effects = Effects(font=Font(thickness=0.15)), + position = Position(X=0, Y=1, unlocked=True) + ), + FpText( + type = 'user', text = '${REFERENCE}', layer = 'F.Fab', + effects = Effects(font=Font(thickness=0.15)), + position = Position(X=0, Y=2.5, unlocked=True) + ) + ] + ) + + # The type ``other`` does not set the attributes type token + if type != 'other': + fp.attributes.type = type + + return fp + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=True, layerInFirstLine=False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + - layerInFirstLine (bool): Prints the ``layer`` token in the first line. Defaults to False + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + locked = ' locked' if self.locked else '' + placed = ' placed' if self.placed else '' + version = f' (version {self.version})' if self.version is not None else '' + generator = f' (generator {self.generator})' if self.generator is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + + expression = f'{indents}(footprint "{dequote(self.libId)}"{locked}{placed}{version}{generator}' + if layerInFirstLine: + expression += f' (layer "{dequote(self.layer)}")\n' + else: + expression += f'\n{indents} (layer "{dequote(self.layer)}")\n' + expression += f'{indents} (tedit {self.tedit}){uuid}\n' + + if self.position is not None: + angle = f' {self.position.angle}' if self.position.angle is not None else '' + expression += f'{indents} (at {self.position.X} {self.position.Y}{angle})\n' + if self.description is not None: + expression += f'{indents} (descr "{dequote(self.description)}")\n' + if self.tags is not None: + expression += f'{indents} (tags "{dequote(self.tags)}")\n' + for item in self.properties: + expression += f'{indents} (property "{dequote(item)}" "{dequote(self.properties[item])}")\n' + if self.path is not None: + expression += f'{indents} (path "{dequote(self.path)}")\n' + + # Additional parameters used in board + if self.autoplaceCost90 is not None: + expression += f'{indents} (autoplace_cost90 {self.autoplaceCost90})\n' + if self.autoplaceCost180 is not None: + expression += f'{indents} (autoplace_cost180 {self.autoplaceCost180})\n' + if self.solderMaskMargin is not None: + expression += f'{indents} (solder_mask_margin {self.solderMaskMargin})\n' + if self.solderPasteMargin is not None: + expression += f'{indents} (solder_paste_margin {self.solderPasteMargin})\n' + if self.solderPasteRatio is not None: + expression += f'{indents} (solder_paste_ratio {self.solderPasteRatio})\n' + if self.clearance is not None: + expression += f'{indents} (clearance {self.clearance})\n' + if self.zoneConnect is not None: + expression += f'{indents} (zone_connect {self.zoneConnect})\n' + if self.thermalWidth is not None: + expression += f'{indents} (thermal_width {self.thermalWidth})\n' + if self.thermalGap is not None: + expression += f'{indents} (thermal_gap {self.thermalGap})\n' + + if self.attributes is not None: + # Note: If the attribute object has only standard values in it, it will return an + # empty string. Therefore, it should create its own newline and indentations only + # when needed. + expression += self.attributes.to_sexpr(indent=indent+2, newline=True) + if self.privateLayers: + expression += f'{indents} (private_layers' + for item in self.privateLayers: + expression += f' "{dequote(item)}"' + expression += f')\n' + + if self.netTiePadGroups: + expression += f'{indents} (net_tie_pad_groups' + for item in self.netTiePadGroups: + expression += f' "{dequote(item)}"' + expression += f')\n' + + for item in self.graphicItems: + expression += item.to_sexpr(indent=indent+2) + for item in self.pads: + expression += item.to_sexpr(indent=indent+2) + for item in self.zones: + expression += item.to_sexpr(indent=indent+2) + for item in self.models: + expression += item.to_sexpr(indent=indent+2) + for item in self.groups: + expression += item.to_sexpr(indent=indent+2) + + expression += f'{indents}){endline}' + return expression + diff --git a/kiutils/items/brditems.py b/kiutils/items/brditems.py new file mode 100644 index 0000000..546aac7 --- /dev/null +++ b/kiutils/items/brditems.py @@ -0,0 +1,1104 @@ +"""Classes to manage KiCad board items + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 20.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/ +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List + +from kiutils.items.common import Position +from kiutils.utils.strings import dequote + +@dataclass +class GeneralSettings(): + """The ``general`` token define general information about the board + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_general_section + """ + + thickness: float = 1.6 + """The ``thickness`` token attribute defines the overall board thickness""" + + @classmethod + def from_sexpr(cls, exp: list) -> GeneralSettings: + """Convert the given S-Expresstion into a GeneralSettings object + + Args: + - exp (list): Part of parsed S-Expression ``(general ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not general + + Returns: + - GeneralSettings: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'general': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'thickness': object.thickness = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(general\n' + expression += f'{indents} (thickness {self.thickness})\n' + expression += f'{indents}){endline}' + return expression + + +@dataclass +class LayerToken(): + """Intermediate type used for the ``layers`` token in a board + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_layers_section + """ + + ordinal: int = 0 + """The layer ``ordinal`` is an integer used to associate the layer stack ordering. This is mostly + to ensure correct mapping when the number of layers is increased in the future""" + + name: str = "F.Cu" + """The ``name`` is the layer name defined for internal board use""" + + type: str = "signal" + """The layer ``type`` defines the type of layer and can be defined as ``jumper``, ``mixed``, ``power``, + ``signal``, or ``user``.""" + + userName: Optional[str] = None + """The optional ``userName`` attribute defines the custom user name""" + + @classmethod + def from_sexpr(cls, exp: list) -> LayerToken: + """Convert the given S-Expresstion into a LayerToken object + + Args: + - exp (list): Part of parsed S-Expression ``( "" )`` + + Raises: + - Exception: When given parameter's type is not a list or the length of the list is not 3 - 4 + - Exception: When the first item of the list is not kicad_pcb + + Returns: + - LayerToken: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 3 or len(exp) > 4: + raise Exception("Expression does not have the correct type") + + object = cls() + object.ordinal = exp[0] + object.name = exp[1] + object.type = exp[2] + if len(exp) == 4: + object.userName = exp[3] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + username = f' "{dequote(self.userName)}"' if self.userName is not None else '' + + return f'{indents}({self.ordinal} "{dequote(self.name)}" {self.type}{username}){endline}' + + +@dataclass +class StackupSubLayer(): + """The ``StackupSubLayer`` token defines a sublayer used when stacking dielectrics in a PCB""" + + thickness: float = 0.1 + """The ``thickness`` token defines the thickness of the sublayer. Defaults to 0.1""" + + material: Optional[str] = None + """The optional ``material`` token defines a string that describes the sublayer material""" + + epsilonR: Optional[float] = None + """The optional ``epsilonR`` token defines the dielectric constant of the sublayer material""" + + lossTangent: Optional[float] = None + """The optional layer ``lossTangent`` token defines the dielectric loss tangent of the sublayer""" + + @classmethod + def from_sexpr(cls, exp: list) -> StackupSubLayer: + """This class cannot be derived from an S-Expression as the format currently used in KiCad + board files does not match the usual convention. Assign member values manually when using + this object. + + Raises: + - NotImplementedError""" + raise NotImplementedError("This class cannot be derived from an S-Expression!") + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object. The representation differs from the + normal form of an S-Expression as this uses no opening and closing parenthesis. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + mat = f' (material "{dequote(self.material)}")' if self.material is not None else '' + er = f' (epsilon_r {self.epsilonR})' if self.epsilonR is not None else '' + lt = f' (loss_tangent {self.lossTangent})' if self.lossTangent is not None else '' + + return f'{indents}addsublayer (thickness {self.thickness}){mat}{er}{lt}{endline}' + + +@dataclass +class StackupLayer(): + """The ``layer`` token defines the stack up setting of a single layer in the board stack up + settings. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_stack_up_settings + """ + + name: str = "" + """The ``name`` attribute is either one of the canonical copper or technical layer names + or ``dielectric ID`` if it is dielectric layer""" + + # Not found in example project ... + #number: int = 0 + """The ``number`` attribute defines the stack order of the layer""" + + type: str = "" + """The ``type`` token defines a string that describes the layer""" + + color: Optional[str] = None + """The optional ``color`` token defines a string that describes the layer color. This is + only used on solder mask and silkscreen layers""" + + thickness: Optional[float] = None + """The optional ``thickness`` token defines the thickness of the layer where appropriate""" + + material: Optional[str] = None + """The optional ``material`` token defines a string that describes the layer material + where appropriate""" + + epsilonR: Optional[float] = None + """The optional ``epsilonR`` token defines the dielectric constant of the layer material""" + + lossTangent: Optional[float] = None + """The optional layer ``lossTangent`` token defines the dielectric loss tangent of the layer""" + + subLayers: List[StackupSubLayer] = field(default_factory=list) + """The ``sublayers`` token defines a list of zero or more sublayers that are used to create + stacks of dielectric layers. Does not apply to copper-type layers.""" + + @classmethod + def from_sexpr(cls, exp: list) -> StackupLayer: + """Convert the given S-Expresstion into a StackupLayer object + + Args: + - exp (list): Part of parsed S-Expression ``(layer ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not layer + + Returns: + - StackupLayer: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'layer': + raise Exception("Expression does not have the correct type") + + parsingSublayer = False + tempSublayer = StackupSubLayer() + object = cls() + object.name = exp[1] + for item in exp[2:]: + if type(item) != type([]): + # Start parsing the layer's sublayer if the first sublayer token was found + if item == 'addsublayer': + if parsingSublayer: + # When the ``addsublayer`` token was found a second time, the previously + # parsed sublayer will be appended to the list of sublayers + object.subLayers.append(tempSublayer) + tempSublayer = StackupSubLayer() + else: + # Change state of the parser to look for StackupSubLayer tokens + parsingSublayer = True + continue + + # Parse the tokens of StackupSubLayer for the current sublayer + if parsingSublayer: + if item[0] == 'thickness': tempSublayer.thickness = item[1] + if item[0] == 'material': tempSublayer.material = item[1] + if item[0] == 'epsilon_r': tempSublayer.epsilonR = item[1] + if item[0] == 'loss_tangent': tempSublayer.lossTangent = item[1] + continue + + # Parse the normal tokens of StackupLayer token + if item[0] == 'type': object.type = item[1] + if item[0] == 'thickness': object.thickness = item[1] + if item[0] == 'material': object.material = item[1] + if item[0] == 'epsilon_r': object.epsilonR = item[1] + if item[0] == 'loss_tangent': object.lossTangent = item[1] + if item[0] == 'color': object.color = item[1] + + # Add the last parsed sublayer to the list, if any + if parsingSublayer: + object.subLayers.append(tempSublayer) + + return object + + def to_sexpr(self, indent=6, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + color = f' (color "{dequote(self.color)}")' if self.color is not None else '' + material = f' (material "{dequote(self.material)}")' if self.material is not None else '' + thickness = f' (thickness {self.thickness})' if self.thickness is not None else '' + epsilon_r = f' (epsilon_r {self.epsilonR})' if self.epsilonR is not None else '' + loss_tangent = f' (loss_tangent {self.lossTangent})' if self.lossTangent is not None else '' + + expression = f'{indents}(layer "{dequote(self.name)}" (type "{self.type}"){color}{thickness}' + expression +=f'{material}{epsilon_r}{loss_tangent}' + for layer in self.subLayers: + expression += f'\n{layer.to_sexpr(indent+2)}' + expression += f'){endline}' + return expression + +@dataclass +class Stackup(): + """The ``stackup`` token defines the board stack up settings and is defined in the setup + section. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_stack_up_settings + """ + + layers: List[StackupLayer] = field(default_factory=list) + """The ``layers``token is a list of layer settings for each layer required to manufacture + a board including the dielectric material between the actual layers defined in the board + editor.""" + + copperFinish: Optional[str] = None + """The optional ``copperFinish`` token is a string that defines the copper finish used to + manufacture the board""" + + dielectricContraints: Optional[str] = None + """The optional ``dielectricContraints`` token define if the board should meet all + dielectric requirements. Valid values are ``yes`` and ``no``.""" + + edgeConnector: Optional[str] = None + """The optional ``edgeConnector`` token defines if the board has an edge connector + (value: ``yes``) and if the edge connector is bevelled (value: ``bevelled``)""" + + castellatedPads: bool = False + """The ``castellatedPads`` token defines if the board edges contain castellated pads""" + + edgePlating: bool = False + """The ``edgePlating`` token defines if the board edges should be plated.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Stackup: + """Convert the given S-Expresstion into a Stackup object + + Args: + - exp (list): Part of parsed S-Expression ``(stackup ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not stackup + + Returns: + - Stackup: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'stackup': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'layer': object.layers.append(StackupLayer().from_sexpr(item)) + if item[0] == 'copper_finish': object.copperFinish = item[1] + if item[0] == 'dielectric_constraints': object.dielectricContraints = item[1] + if item[0] == 'edge_connector': object.edgeConnector = item[1] + if item[0] == 'castellated_pads': object.castellatedPads = True + if item[0] == 'edge_plating': object.edgePlating = True + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(stackup\n' + for layer in self.layers: + expression += layer.to_sexpr(indent+2) + if self.copperFinish is not None: expression += f'{indents} (copper_finish "{dequote(self.copperFinish)}")\n' + if self.dielectricContraints is not None: expression += f'{indents} (dielectric_constraints {self.dielectricContraints})\n' + if self.edgeConnector is not None: expression += f'{indents} (edge_connector {self.edgeConnector})\n' + if self.castellatedPads: expression += f'{indents} (castellated_pads yes)\n' + if self.edgePlating: expression += f'{indents} (edge_plating yes)\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class PlotSettings(): + """The ``pcbplotparams`` token defines the plotting and printing settings used for the last + plot and is defined in the set up section. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_plot_settings + """ + + layerSelection: str = "" + """The ``layerSelection`` token defines a hexadecimal bit set of the layers to plot""" + + plotOnAllLayersSelection: Optional[str] = None + """The ``plotOnAllLayersSelection`` token defines a hexadecimal bit set of layers where all + selected layers shall be plotted. + + Available and required since KiCad v7""" + + disableApertMacros: bool = False + """The ``disableApertMacros`` token defines if aperture macros are to be used in gerber plots""" + + useGerberExtensions: bool = False + """The ``useGerberExtensions`` token defines if the Protel layer file name extensions are to + be used in gerber plots""" + + useGerberAttributes: bool = False + """The ``useGerberAttributes`` token defines if the X2 extensions are used in gerber plots""" + + useGerberAdvancedAttributes: bool = False + """The ``useGerberAdvancedAttributes`` token defines if the netlist information should be + included in gerber plots""" + + createGerberJobFile: bool = False + """The ``createGerberJobFile`` token defines if a job file should be created when plotting + gerber files""" + + # FIXME: Where is the docu of this token? + dashedLineDashRatio: Optional[float] = None + """The ``dashedLineDashRatio`` token's documentation is still missing .. + + Available and required since KiCad v7""" + + # FIXME: Where is the docu of this token? + dashedLineGapRatio: Optional[float] = None + """The ``dashedLineGapRatio`` token's documentation is still missing .. + + Available and required since KiCad v7""" + + svgUseInch: Optional[bool] = None + """The ``svgUseInch`` token defines if inch units should be use when plotting SVG files. + + Required until KiCad v6, removed since KiCad v7""" + + svgPrecision: float = 0.0 + """The ``svgPrecision`` token defines the units precision used when plotting SVG files""" + + excludeEdgeLayer: Optional[bool] = None + """The ``excludeEdgeLayer`` token defines if the board edge layer is plotted on all layers. + + Required until KiCad v6, removed since KiCad v7""" + + plotFameRef: bool = False + """The ``plotFameRef`` token defines if the border and title block should be plotted""" + + viasOnMask: bool = False + """The ``viasOnMask`` token defines if the vias are to be tented""" + + mode: int = 1 + """The ``mode`` token defines the plot mode. An attribute of 1 plots in the normal + mode and an attribute of 2 plots in the outline (sketch) mode.""" + + useAuxOrigin: bool = False + """The ``useAuxOrigin`` token determines if all coordinates are offset by the defined user origin""" + + hpglPenNumber: int = 0 + """The ``hpglPenNumber`` token defines the integer pen number used for HPGL plots""" + + hpglPenSpeed: int = 0 + """The ``hpglPenSpeed`` token defines the integer pen speed used for HPGL plots""" + + hpglPenDiameter: float = 0.0 + """The ``hpglPenDiameter`` token defines the floating point pen size for HPGL plots""" + + dxfPolygonMode: bool = False + """The ``dxfPolygonMode`` token defines if the polygon mode should be used for DXF plots""" + + dxfImperialUnits: bool = False + """The ``dxfImperialUnits`` token defines if imperial units should be used for DXF plots""" + + dxfUsePcbnewFont: bool = False + """The ``dxfUsePcbnewFont`` token defines if the Pcbnew font (vector font) or the default + font should be used for DXF plots""" + + psNegative: bool = False + """The ``psNegative`` token defines if the output should be the negative for PostScript plots""" + + psA4Output: bool = False + """The ``psA4Output`` token defines if the A4 page size should be used for PostScript plots""" + + plotReference: bool = False + """The ``plotReference`` token defines if hidden reference field text should be plotted""" + + plotValue: bool = False + """The ``plotValue`` token defines if hidden value field text should be plotted""" + + plotInvisibleText: bool = False + """The ``plotInvisibleText`` token defines if hidden text other than the reference and + value fields should be plotted""" + + sketchPadsOnFab: bool = False + """The ``sketchPadsOnFab`` token defines if pads should be plotted in the outline (sketch) mode""" + + subtractMaskFromSilk: bool = False + """The ``subtractMaskFromSilk`` token defines if the solder mask layers should be subtracted from + the silk screen layers for gerber plots""" + + outputFormat: int = 0 + """The ``outputFormat`` token defines the last plot type. The following values are defined: + - 0: gerber + - 1: PostScript + - 2: SVG + - 3: DXF + - 4: HPGL + - 5: PDF""" + + mirror: bool = False + """The ``mirror`` token defines if the plot should be mirrored""" + + drillShape: int = 0 + """The ``drillShape`` token defines the type of drill marks used for drill files""" + + scaleSelection: int = 1 + """The ``scaleSelection`` is not documented yet (as of 20.02.2022)""" + + outputDirectory: str = "" + """The ``drillShape`` token defines the path relative to the current project path + where the plot files will be saved""" + + @classmethod + def from_sexpr(cls, exp: list) -> PlotSettings: + """Convert the given S-Expresstion into a PlotSettings object + + Args: + - exp (list): Part of parsed S-Expression ``(pcbplotparams ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not pcbplotparams + + Returns: + - PlotSettings: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'pcbplotparams': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'layerselection': object.layerSelection = item[1] + if item[0] == 'plot_on_all_layers_selection': object.plotOnAllLayersSelection = item[1] + if item[0] == 'disableapertmacros': object.disableApertMacros = True if item[1] == 'true' else False + if item[0] == 'usegerberextensions' : object.useGerberExtensions = True if item[1] == 'true' else False + if item[0] == 'usegerberattributes' : object.useGerberAttributes = True if item[1] == 'true' else False + if item[0] == 'usegerberadvancedattributes' : object.useGerberAdvancedAttributes = True if item[1] == 'true' else False + if item[0] == 'creategerberjobfile' : object.createGerberJobFile = True if item[1] == 'true' else False + if item[0] == 'dashed_line_dash_ratio': object.dashedLineDashRatio = item[1] + if item[0] == 'dashed_line_gap_ratio': object.dashedLineGapRatio = item[1] + if item[0] == 'svguseinch' : object.svgUseInch = True if item[1] == 'true' else False + if item[0] == 'svgprecision' : object.svgPrecision = item[1] + if item[0] == 'excludeedgelayer' : object.excludeEdgeLayer = True if item[1] == 'true' else False + if item[0] == 'plotframeref' : object.plotFameRef = True if item[1] == 'true' else False + if item[0] == 'viasonmask' : object.viasOnMask = True if item[1] == 'true' else False + if item[0] == 'mode' : object.mode = item[1] + if item[0] == 'useauxorigin' : object.useAuxOrigin = True if item[1] == 'true' else False + if item[0] == 'hpglpennumber' : object.hpglPenNumber = item[1] + if item[0] == 'hpglpenspeed' : object.hpglPenSpeed = item[1] + if item[0] == 'hpglpendiameter' : object.hpglPenDiameter = item[1] + if item[0] == 'dxfpolygonmode' : object.dxfPolygonMode = True if item[1] == 'true' else False + if item[0] == 'dxfimperialunits' : object.dxfImperialUnits = True if item[1] == 'true' else False + if item[0] == 'dxfusepcbnewfont' : object.dxfUsePcbnewFont = True if item[1] == 'true' else False + if item[0] == 'psnegative' : object.psNegative = True if item[1] == 'true' else False + if item[0] == 'psa4output' : object.psA4Output = True if item[1] == 'true' else False + if item[0] == 'plotreference' : object.plotReference = True if item[1] == 'true' else False + if item[0] == 'plotvalue' : object.plotValue = True if item[1] == 'true' else False + if item[0] == 'plotinvisibletext' : object.plotInvisibleText = True if item[1] == 'true' else False + if item[0] == 'sketchpadsonfab' : object.sketchPadsOnFab = True if item[1] == 'true' else False + if item[0] == 'subtractmaskfromsilk' : object.subtractMaskFromSilk = True if item[1] == 'true' else False + if item[0] == 'outputformat' : object.outputFormat = item[1] + if item[0] == 'mirror' : object.mirror = True if item[1] == 'true' else False + if item[0] == 'drillshape' : object.drillShape = item[1] + if item[0] == 'scaleselection' : object.scaleSelection = item[1] + if item[0] == 'outputdirectory' : object.outputDirectory = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(pcbplotparams\n' + expression += f'{indents} (layerselection {self.layerSelection})\n' + if self.plotOnAllLayersSelection is not None: + expression += f'{indents} (plot_on_all_layers_selection {self.plotOnAllLayersSelection})\n' + expression += f'{indents} (disableapertmacros {str(self.disableApertMacros).lower()})\n' + expression += f'{indents} (usegerberextensions {str(self.useGerberExtensions).lower()})\n' + expression += f'{indents} (usegerberattributes {str(self.useGerberAttributes).lower()})\n' + expression += f'{indents} (usegerberadvancedattributes {str(self.useGerberAdvancedAttributes).lower()})\n' + expression += f'{indents} (creategerberjobfile {str(self.createGerberJobFile).lower()})\n' + if self.dashedLineDashRatio is not None: + expression += f'{indents} (dashed_line_dash_ratio {float(self.dashedLineDashRatio):.6f})\n' + if self.dashedLineGapRatio is not None: + expression += f'{indents} (dashed_line_gap_ratio {float(self.dashedLineGapRatio):.6f})\n' + if self.svgUseInch is not None: + expression += f'{indents} (svguseinch {str(self.svgUseInch).lower()})\n' + expression += f'{indents} (svgprecision {self.svgPrecision})\n' + if self.excludeEdgeLayer is not None: + expression += f'{indents} (excludeedgelayer {str(self.excludeEdgeLayer).lower()})\n' + expression += f'{indents} (plotframeref {str(self.plotFameRef).lower()})\n' + expression += f'{indents} (viasonmask {str(self.viasOnMask).lower()})\n' + expression += f'{indents} (mode {self.mode})\n' + expression += f'{indents} (useauxorigin false)\n' + expression += f'{indents} (hpglpennumber {self.hpglPenNumber})\n' + expression += f'{indents} (hpglpenspeed {self.hpglPenSpeed})\n' + expression += f'{indents} (hpglpendiameter {float(self.hpglPenDiameter):.6f})\n' + expression += f'{indents} (dxfpolygonmode {str(self.dxfPolygonMode).lower()})\n' + expression += f'{indents} (dxfimperialunits {str(self.dxfImperialUnits).lower()})\n' + expression += f'{indents} (dxfusepcbnewfont {str(self.dxfUsePcbnewFont).lower()})\n' + expression += f'{indents} (psnegative {str(self.psNegative).lower()})\n' + expression += f'{indents} (psa4output {str(self.psA4Output).lower()})\n' + expression += f'{indents} (plotreference {str(self.plotReference).lower()})\n' + expression += f'{indents} (plotvalue {str(self.plotValue).lower()})\n' + expression += f'{indents} (plotinvisibletext {str(self.plotInvisibleText).lower()})\n' + expression += f'{indents} (sketchpadsonfab {str(self.sketchPadsOnFab).lower()})\n' + expression += f'{indents} (subtractmaskfromsilk {str(self.subtractMaskFromSilk).lower()})\n' + expression += f'{indents} (outputformat {self.outputFormat})\n' + expression += f'{indents} (mirror {str(self.mirror).lower()})\n' + expression += f'{indents} (drillshape {self.drillShape})\n' + expression += f'{indents} (scaleselection {self.scaleSelection})\n' + expression += f'{indents} (outputdirectory "{dequote(self.outputDirectory)}")\n' + expression += f'{indents}){endline}' + return expression + + +@dataclass +class SetupData(): + """The setup token is used to store the current settings such as default item sizes and + other options used by the board + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_setup_section + """ + + stackup: Optional[Stackup] = None + """The optional ``stackup`` define the parameters required to manufacture the board""" + + packToMaskClearance: float = 0.0 + """The ``packToMaskClearance`` token defines the clearance between footprint pads and + the solder mask""" + + solderMaskMinWidth: Optional[float] = None + """The optional ``solderMaskMinWidth`` defines the minimum solder mask width. If not + defined, the minimum width is zero.""" + + padToPasteClearance: Optional[float] = None + """The optional ``padToPasteClearance`` defines the clearance between footprint pads + and the solder paste layer. If not defined, the clearance is zero""" + + padToPasteClearanceRatio: Optional[float] = None + """The optional ``padToPasteClearanceRatio`` is the percentage (from 0 to 100) of the + footprint pad to make the solder paste. If not defined, the ratio is 100% (the same + size as the pad).""" + + auxAxisOrigin: Optional[Position] = None + """The optional ``auxAxisOrigin`` defines the auxiliary origin if it is set to anything + other than (0,0).""" + + gridOrigin: Optional[Position] = None + """The optional ``gridOrigin`` defines the grid original if it is set to anything other + than (0,0).""" + + plotSettings: Optional[PlotSettings] = None + """The optional ``plotSettings`` define how the board was last plotted.""" + + @classmethod + def from_sexpr(cls, exp: list) -> SetupData: + """Convert the given S-Expresstion into a SetupData object + + Args: + - exp (list): Part of parsed S-Expression ``(setup ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not setup + + Returns: + - SetupData: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'setup': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'stackup': object.stackup = Stackup().from_sexpr(item) + if item[0] == 'pcbplotparams': object.plotSettings = PlotSettings().from_sexpr(item) + if item[0] == 'pad_to_mask_clearance': object.packToMaskClearance = item[1] + if item[0] == 'solder_mask_min_width': object.solderMaskMinWidth = item[1] + if item[0] == 'pad_to_paste_clearance': object.padToPasteClearance = item[1] + if item[0] == 'pad_to_paste_clearance_ratio': object.padToPasteClearanceRatio = item[1] + if item[0] == 'aux_axis_origin': object.auxAxisOrigin = Position().from_sexpr(item) + if item[0] == 'grid_origin': object.gridOrigin = Position().from_sexpr(item) + if item[0] == 'pcbplotparams': object.plotSettings = PlotSettings().from_sexpr(item) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(setup\n' + if self.stackup is not None: expression += self.stackup.to_sexpr(indent+2) + expression += f'{indents} (pad_to_mask_clearance {self.packToMaskClearance})\n' + if self.solderMaskMinWidth is not None: expression += f'{indents} (solder_mask_min_width {self.solderMaskMinWidth})\n' + if self.padToPasteClearance is not None: expression += f'{indents} (pad_to_paste_clearance {self.padToPasteClearance})\n' + if self.padToPasteClearanceRatio is not None: expression += f'{indents} (pad_to_paste_clearance_ratio {self.padToPasteClearanceRatio})\n' + if self.auxAxisOrigin is not None: expression += f'{indents} (aux_axis_origin {self.auxAxisOrigin.X} {self.auxAxisOrigin.Y})\n' + if self.gridOrigin is not None: expression += f'{indents} (grid_origin {self.gridOrigin.X} {self.gridOrigin.Y})\n' + if self.plotSettings is not None: expression += self.plotSettings.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + + +@dataclass +class Segment(): + """The ``segment`` token defines a track segment in a KiCad board + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_segment + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the beginning of the line""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the end of the line""" + + width: float = 0.1 + """The ``width`` token defines the line width""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the track segment resides on""" + + locked: bool = False + """The ``locked`` token defines if the line cannot be edited""" + + net: int = 0 + """The ``net`` token defines by the net ordinal number which net in the net + section that the segment is part of""" + + uuid: str = "" + """The ``uuid`` token defines the unique identifier of the line object""" + + @classmethod + def from_sexpr(cls, exp: list) -> Segment: + """Convert the given S-Expresstion into a Segment object + + Args: + - exp (list): Part of parsed S-Expression ``(segment ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not segment + + Returns: + - Segment: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'segment': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'start': object.start = Position().from_sexpr(item) + if item[0] == 'end': object.end = Position().from_sexpr(item) + if item[0] == 'width': object.width = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'net': object.net = item[1] + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = ' locked' if self.locked else '' + + return f'{indents}(segment{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (width {self.width}) (layer "{dequote(self.layer)}") (net {self.net}) (uuid {self.uuid})){endline}' + +@dataclass +class Via(): + """The ``via`` token defines a track via in a KiCad board + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_via + """ + + type: Optional[str] = None + """The optional ``type`` attribute specifies the via type. Valid via types are ``blind`` and + ``micro``. If no type is defined, the via is a through hole type""" + + locked: bool = False + """The ``locked`` token defines if the line cannot be edited""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token define the coordinates of the center of the via""" + + size: float = 0.0 + """The ``size`` token define the diameter of the via annular ring""" + + drill: float = 0.0 + """The ``drill`` token define the drill diameter of the via""" + + layers: List[str] = field(default_factory=list) + """The ``layers`` token define the canonical layer set the via connects as a list + of strings""" + + removeUnusedLayers: bool = False + """The ``removeUnusedLayers`` token is undocumented (as of 20.02.2022)""" + + keepEndLayers: bool = False + """The ``keepEndLayers`` token is undocumented (as of 20.02.2022)""" + + free: bool = False + """The ``free`` token indicates that the via is free to be moved outside it's assigned net""" + + net: int = 0 + """The ``net`` token defines by net ordinal number which net in the net section that + the via is part of""" + + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier of the via""" + + @classmethod + def from_sexpr(cls, exp: list) -> Via: + """Convert the given S-Expresstion into a Via object + + Args: + - exp (list): Part of parsed S-Expression ``(via ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not via + + Returns: + - Via: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'via': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + if item == 'micro' or item == 'blind': object.type = item + continue + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'size': object.size = item[1] + if item[0] == 'drill': object.drill = item[1] + if item[0] == 'layers': + for layer in item[1:]: + object.layers.append(layer) + if item[0] == 'remove_unused_layers': object.removeUnusedLayers = True + if item[0] == 'keep_end_layers': object.keepEndLayers = True + if item[0] == 'free': object.free = True + if item[0] == 'net': object.net = item[1] + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + type = f' {self.type}' if self.type is not None else '' + locked = f' locked' if self.locked else '' + + layers = '' + for layer in self.layers: + layers += f' "{dequote(layer)}"' + rum = f' (remove_unused_layers)' if self.removeUnusedLayers else '' + kel = f' (keep_end_layers)' if self.keepEndLayers else '' + free = f' (free)' if self.free else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + + return f'{indents}(via{type}{locked} (at {self.position.X} {self.position.Y}) (size {self.size}) (drill {self.drill}) (layers{layers}){rum}{kel}{free} (net {self.net}){uuid}){endline}' + +@dataclass +class Arc(): + """The ``arc`` token defines a track arc, which will be generated when using the length-matching + feature on differential pairs. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_arc + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the beginning of the arc""" + + mid: Position = field(default_factory=lambda: Position()) + """The ``mid`` token defines the coordinates of the mid point of the radius of the arc""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the end of the arc""" + + width: float = 0.2 + """The ``width`` token defines the line width of the arc. Defaults to 0,2.""" + + layer: str = "F.Cu" + """The ``layer`` token defiens the canonical layer the track arc resides on. Defaults to `F.Cu`.""" + + locked: bool = False + """The ``locked`` token defines if the arc cannot be edited. Defaults to False.""" + + net: int = 0 + """The ``net`` token defines the net ordinal number which net in the net section that arc is part + of. Defaults to 0.""" + + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the arc""" + + @classmethod + def from_sexpr(cls, exp: list) -> Arc: + """Convert the given S-Expresstion into a Arc object + + Args: + - exp (list): Part of parsed S-Expression ``(arc ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not ``arc`` + + Returns: + - Arc: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'arc': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'start': object.start = Position().from_sexpr(item) + elif item[0] == 'mid': object.mid = Position().from_sexpr(item) + elif item[0] == 'end': object.end = Position().from_sexpr(item) + elif item[0] == 'width': object.width = item[1] + elif item[0] == 'layer': object.layer = item[1] + elif item[0] == 'net': object.net = item[1] + elif item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + locked = f' locked' if self.locked else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + + expression = f'{indents}(arc{locked} (start {self.start.X} {self.start.Y}) ' + expression += f'(mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) ' + expression += f'(width {self.width}) (layer "{dequote(self.layer)}") ' + expression += f'(net {self.net}){uuid}){endline}' + return expression + + +@dataclass +class Target(): + """The ``target`` token defines a target marker on the PCB + + Documentation: + Not found in KiCad docu - 15.06.2022 + """ + + type: str = "plus" + """The ``type`` token specifies the shape of the marker. Valid types are ``plus`` and ``x``.""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token specifies the position of the target marker""" + + size: float = 0 + """The ``size`` token sets the marker's size""" + + width: float = 0.1 + """The ``width`` token sets the marker's line width""" + + layer: str = "F.Cu" + """The ``layer`` token sets the canonical layer where the target marker resides""" + + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier of the target""" + + @classmethod + def from_sexpr(cls, exp: list) -> Target: + """Convert the given S-Expresstion into a Target object + + Args: + - exp (list): Part of parsed S-Expression ``(target ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not target + + Returns: + - Target: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'target': + raise Exception("Expression does not have the correct type") + + object = cls() + object.type = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'size': object.size = item[1] + if item[0] == 'width': object.width = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + return f'{indents}(target {self.type} (at {self.position.X} {self.position.Y}) (size {self.size}) (width {self.width}) (layer "{self.layer}") (uuid {self.uuid})){endline}' diff --git a/kiutils/items/common.py b/kiutils/items/common.py new file mode 100644 index 0000000..707328e --- /dev/null +++ b/kiutils/items/common.py @@ -0,0 +1,1179 @@ +"""Defines all syntax that is shared across the symbol library, footprint library, + schematic, board and work sheet file formats. + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 02.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_common_syntax +""" + +from __future__ import annotations +from abc import ABC, abstractmethod + +from dataclasses import dataclass, field +from typing import Optional, List, Dict + +from kiutils.utils.strings import dequote + +@dataclass +class Position(): + """The ``position`` token defines the positional coordinates and rotation of an object. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_position_identifier + """ + + X: float = 0.0 + """The ``X`` attribute defines the horizontal position of the object""" + + Y: float = 0.0 + """The ``Y`` attribute defines the vertical position of the object""" + + angle: Optional[float] = None + """The optional ``angle`` attribute defines the rotational angle of the object. Not all + objects have rotational position definitions. Symbol text angles are stored in tenths + of a degree. All other angles are stored in degrees.""" + + # TODO: What is this? Documentation does not tell .. + unlocked: bool = False + """The ``unlocked`` token's description has to be defined yet ..""" + + @classmethod + def from_sexpr(cls, exp: list) -> Position: + """Convert the given S-Expresstion into a Position object + + Args: + - exp (list): Part of parsed S-Expression ``(xxx ...)`` + + Raises: + - Exception: When the given expression is not of type ``list`` or the list is less than + 3 items long + + Returns: + - Position: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 3: + raise Exception("Expression does not have the correct type") + + object = cls() + object.X = exp[1] + object.Y = exp[2] + if len(exp) >= 4: + # More than four components means X, Y, and either angle or unlocked are present + if exp[3] != 'unlocked': + object.angle = exp[3] + + for item in exp: + if item == 'unlocked': object.unlocked = True + + return object + + def to_sexpr(self) -> str: + """This object does not have a direct S-Expression representation.""" + raise NotImplementedError("This object does not have a direct S-Expression representation") + + +@dataclass +class Coordinate(): + """The ``coordinate`` token defines a three-dimentional position""" + + X: float = 0.0 + """The ``X`` token defines the position of the object on the x-axis""" + + Y: float = 0.0 + """The ``Y`` token defines the position of the object on the y-axis""" + + Z: float = 0.0 + """The ``Z`` token defines the position of the object on the z-axis""" + + @classmethod + def from_sexpr(cls, exp: list) -> Coordinate: + """Convert the given S-Expresstion into a Coordinate object + + Args: + - exp (list): Part of parsed S-Expression ``(xyz ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is not 4 items long + - Exception: When the first item of the list is not xyz + + Returns: + - Coordinate: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) != 4: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'xyz': + raise Exception("Expression does not have the correct type") + + object = cls() + object.X = exp[1] + object.Y = exp[2] + object.Z = exp[3] + return object + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + return f'{indents}(xyz {self.X} {self.Y} {self.Z}){endline}' + + +@dataclass +class ColorRGBA(): + """The ``color`` token defines a RGBA color""" + + R: int = 0 + """The ``R`` token defines the red channel of the color""" + + G: int = 0 + """The ``G`` token defines the green channel of the color""" + + B: int = 0 + """The ``B`` token defines the blue channel of the color""" + + A: int = 0 + """The ``A`` token defines the alpha channel of the color""" + + precision: Optional[int] = None + """Wether the output of ``to_sexpr()`` should have a set number of precision after the decimal + point of the ``self.A`` attribute""" + + @classmethod + def from_sexpr(cls, exp: list) -> ColorRGBA: + """Convert the given S-Expresstion into a ColorRGBA object + + Args: + - exp (list): Part of parsed S-Expression ``(color ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is not 5 items long + - Exception: When the first item of the list is not color + + Returns: + - ColorRGBA: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) != 5: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'color': + raise Exception("Expression does not have the correct type") + + object = cls() + object.R = exp[1] + object.G = exp[2] + object.B = exp[3] + object.A = exp[4] + return object + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + if self.precision is not None: + alpha = f'{self.A:.{self.precision}f}' + else: + alpha = f'{self.A}' + + return f'{indents}(color {self.R} {self.G} {self.B} {alpha}){endline}' + +@dataclass +class Stroke(): + """The ``stroke`` token defines how the outlines of graphical objects are drawn. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_stroke_definition + """ + + width: float = 0.0 + """The ``width`` token attribute defines the line width of the graphic object""" + + type: Optional[str] = None + """The optional ``type`` token attribute defines the line style of the graphic object. Valid + stroke line styles are: + - ``dash``, ``dash_dot``, ``dash_dot_dot`` (since KiCad v7), ``dot``, ``default``, ``solid`` + """ + + color: Optional[ColorRGBA] = None + """The ``color`` token attributes define the line red, green, blue, and alpha color settings. + Defaults to ``None`` and was made optional since KiCad 7.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Stroke: + """Convert the given S-Expresstion into a Stroke object + + Args: + - exp (list): Part of parsed S-Expression ``(stroke ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is not 4 items long + - Exception: When the first item of the list is not stroke + + Returns: + - Stroke: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'stroke': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + continue + if item[0] == 'width': object.width = item[1] + if item[0] == 'type': object.type = item[1] + if item[0] == 'color': object.color = ColorRGBA.from_sexpr(item) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + color = f' {self.color.to_sexpr()}' if self.color is not None else '' + the_type = f' (type {self.type})' if self.type is not None else '' + return f'{indents}(stroke (width {self.width}){the_type}{color}){endline}' + + + +@dataclass +class Font(): + """The ``font`` token attributes define how text is shown. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects + """ + face: Optional[str] = None + """The optional 'face' token indicates the font family. It should be a TrueType font family + name or "KiCad Font" for the KiCad stroke font. (Kicad version 7)""" + + height: float = 1.0 + """The 'height' token attributes define the font's height""" + + width: float = 1.0 + """The 'width' token attributes define the font's width""" + + thickness: Optional[float] = None + """The 'thickness' token attribute defines the line thickness of the font""" + + bold: bool = False + """The 'bold' token specifies if the font should be bold""" + + italic: bool = False + """The 'italic' token specifies if the font should be italicized""" + + lineSpacing: Optional[float] = None + """The 'line_spacing' token specifies the spacing between lines as a ratio of standard + line-spacing. (Not yet supported)""" + + color: Optional[ColorRGBA] = None + """The optional ``color`` token specifies the color of the text element + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Font: + """Convert the given S-Expresstion into a Font object + + Args: + - exp (list): Part of parsed S-Expression ``(font ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not font + + Returns: + - Font: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'font': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'bold': object.bold = True + if item == 'italic': object.italic = True + continue + if item[0] == 'face': object.face = item[1] + if item[0] == 'size': + object.height = item[1] + object.width = item[2] + if item[0] == 'thickness': object.thickness = item[1] + if item[0] == 'line_spacing': object.lineSpacing = item[1] + if item[0] == 'color': object.color = ColorRGBA.from_sexpr(item) + return object + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + face_name, thickness, bold, italic, linespacing, color = '', '', '', '', '', '' + + if self.face is not None: face_name = f'(face "{dequote(self.face)}") ' + if self.thickness is not None: thickness = f' (thickness {self.thickness})' + if self.bold == True: bold = ' bold' + if self.italic == True: italic = ' italic' + if self.lineSpacing is not None: linespacing = f' (line_spacing {self.lineSpacing})' + if self.color is not None: color = f' {self.color.to_sexpr()}' + + expression = f'{indents}(font {face_name}(size {self.height} {self.width}){color}{thickness}{bold}{italic}{linespacing}){endline}' + return expression + +@dataclass +class Justify(): + """The ``justify`` token defines the justification of a text object + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects + """ + + horizontally: Optional[str] = None + """The ``horizontally`` token sets the horizontal justification. Valid values are ``right`` or ``left``""" + + vertically: Optional[str] = None + """The ``vertically`` token sets the vertical justification. Valid values are ``top`` or ``bottom``""" + + mirror: bool = False + """The ``mirror`` token defines if the text is mirrored or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> Justify: + """Convert the given S-Expresstion into a Justify object + + Args: + - exp (list): Part of parsed S-Expression ``(justify ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not justify + + Returns: + - Justify: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'justify': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + # 'center' is the standard on vertical but not on horizontal in work sheets + if item == 'left' or item == 'right' or item == 'center': object.horizontally = item + if item == 'top' or item == 'bottom': object.vertically = item + if item == 'mirror': object.mirror = True + return object + + def to_sexpr(self, indent=0, newline=False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object or an empty string (depending on given indentation + and newline settings) if no justification is given. This will cause the text to be + horizontally and vertically aligend + """ + indents = ' '*indent + endline = '\n' if newline else '' + + if self.horizontally is None and self.vertically is None and self.mirror == False: + return f'{indents}{endline}'; + + horizontally, vertically, mirror = '', '', '' + + if self.horizontally is not None: horizontally = f' {self.horizontally}' + if self.vertically is not None: vertically = f' {self.vertically}' + if self.mirror: mirror = f' mirror' + + expression = f'{indents}(justify{horizontally}{vertically}{mirror}){endline}' + return expression + +@dataclass +class Effects(): + """All text objects can have an optional effects section that defines how the text is displayed. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects + """ + + font: Font = field(default_factory=lambda: Font()) + """The ``font`` token defines how the text is shown""" + + justify: Justify = field(default_factory=lambda: Justify()) + """The ``justify`` token defines the justification of the text""" + + hide: bool = False + """The optional ``hide`` token defines if the text is hidden""" + + href: Optional[str] = None + """The optional ``href`` token specifies a link that the text element represents. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Effects: + """Convert the given S-Expresstion into a Effects object + + Args: + - exp (list): Part of parsed S-Expression ``(effects ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not effects + + Returns: + - Effects: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'effects': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'hide': object.hide = True + else: continue + if item[0] == 'font': object.font = Font().from_sexpr(item) + if item[0] == 'justify': object.justify = Justify().from_sexpr(item) + if item[0] == 'href': object.href = item[1] + return object + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + justify = f' {self.justify.to_sexpr()}' if self.justify.to_sexpr() != '' else '' + hide = f' hide' if self.hide else '' + href = f' (href "{dequote(self.href)}")' if self.href is not None else '' + + expression = f'{indents}(effects {self.font.to_sexpr()}{justify}{href}{hide}){endline}' + return expression + + +@dataclass +class Net(): + """The ``net`` token defines the number and name of a net""" + + number: int = 0 + """The ``number`` token defines the integer number of the net""" + + name: str = "" + """The ``name`` token defines the name of the net""" + + @classmethod + def from_sexpr(cls, exp: list) -> Net: + """Convert the given S-Expresstion into a Net object + + Args: + - exp (list): Part of parsed S-Expression ``(net ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not net + + Returns: + - Net: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'net': + raise Exception("Expression does not have the correct type") + + object = cls() + object.number = exp[1] + object.name = exp[2] + return object + + def to_sexpr(self, indent: int = 0, newline: bool = False) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + return f'{indents}(net {self.number} "{dequote(self.name)}"){endline}' + +@dataclass +class Group(): + """The ``group`` token defines a group of items. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_group + """ + + name: str = "" + """The ``name`` attribute defines the name of the group""" + + locked: bool = False + """The ``locked`` token defines if the group may be moved or not""" + + id: str = "" + """The ``id`` token attribute defines the unique identifier of the group""" + + members: List[str] = field(default_factory=list) + """The ``members`` token attributes define a list of unique identifiers of the objects belonging to the group""" + + @classmethod + def from_sexpr(cls, exp: list) -> Group: + """Convert the given S-Expresstion into a Group object + + Args: + - exp (list): Part of parsed S-Expression ``(group ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not group + + Returns: + - Group: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'group': + raise Exception("Expression does not have the correct type") + + object = cls() + object.name = exp[1] + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'id': object.id = item[1] + if item[0] == 'members': + for member in item[1:]: + object.members.append(member) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = f' locked' if self.locked else '' + + expression = f'{indents}(group "{dequote(self.name)}"{locked} (id {self.id})\n' + expression += f'{indents} (members\n' + for member in self.members: + expression += f'{indents} {member}\n' + + expression += f'{indents} )\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class PageSettings(): + """The ``paper`` token defines the drawing page size and orientation. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_page_settings + """ + paperSize: str = "A4" + """The ``paperSize`` token defines the size of the paper. Valid sizes are `A0`, `A1`, `A2`, + `A3`, `A4`, `A5`, ``A``, ``B``, ``C``, ``D`` and ``E``. When using user-defines page sizes, set + this to ``User``""" + + width: Optional[float] = None + """The ``width`` token sets the width of a user-defines page size""" + + height: Optional[float] = None + """The ``height`` token sets the height of a user-defines page size""" + + portrait: bool = False + """The ``portrait`` token defines if the page is in portrait or landscape mode""" + + @classmethod + def from_sexpr(cls, exp: list) -> PageSettings: + """Convert the given S-Expresstion into a PageSettings object + + Args: + - exp (list): Part of parsed S-Expression ``(paper ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not paper + - Exception: When the paper type is set to ``User`` and the list's length is not 4 + + Returns: + - PageSettings: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'paper': + raise Exception("Expression does not have the correct type") + + object = cls() + object.paperSize = exp[1] + if object.paperSize == "User": + if len(exp) < 4: + raise Exception("PageSettings: Expected more data for paper type 'User'") + + object.width = exp[2] + object.height = exp[3] + for item in exp: + if type(item) != type([]): + if item == 'portrait': object.portrait = True + continue + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Raises: + - Exception: When paper size is set to ``User`` and width or height is not specified + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + width, height = '', '' + portrait = ' portrait' if self.portrait else '' + if self.paperSize == 'User': + if self.width is None or self.height is None: + raise Exception("Page size set to 'User' but width or height not specified") + width = f' {self.width}' + height = f' {self.height}' + return f'{indents}(paper "{dequote(self.paperSize)}"{width}{height}{portrait}){endline}' + +@dataclass +class TitleBlock(): + """The ``title_block`` token defines the contents of the title block. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_title_block + """ + + title: Optional[str] = None + """The optional ``title`` token attribute is a quoted string that defines the document title""" + + date: Optional[str] = None + """The optional ``date`` token attribute is a quoted string that defines the document date using the YYYY-MM-DD format""" + + revision: Optional[str] = None + """The optional ``revision`` token attribute is a quoted string that defines the document revision""" + + company: Optional[str] = None + """The optional ``company`` token attribute is a quoted string that defines the document company name""" + + comments: Dict[int, str] = field(default_factory=dict) + """The ``comments`` token attributes define a dictionary of document comments where the key is + a number from 1 to 9 and the value is a comment string""" + + @classmethod + def from_sexpr(cls, exp: list) -> TitleBlock: + """Convert the given S-Expresstion into a TitleBlock object + + Args: + - exp (list): Part of parsed S-Expression ``(title_block ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not title_block + + Returns: + - TitleBlock: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'title_block': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'title': object.title = item[1] + if item[0] == 'date': object.date = item[1] + if item[0] == 'rev': object.revision = item[1] + if item[0] == 'company': object.company = item[1] + if item[0] == 'comment': object.comments.update({item[1]: item[2]}) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(title_block\n' + if self.title is not None: + expression += f'{indents} (title "{dequote(self.title)}")\n' + + if self.date is not None: + expression += f'{indents} (date "{dequote(self.date)}")\n' + + if self.revision is not None: + expression += f'{indents} (rev "{dequote(self.revision)}")\n' + + if self.company is not None: + expression += f'{indents} (company "{dequote(self.company)}")\n' + + for number, comment in self.comments.items(): + expression += f'{indents} (comment {number} "{dequote(comment)}")\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class Property(): + """The ``property`` token defines a symbol property when used inside a ``symbol`` definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_property + """ + + key: str = "" + """The ``key`` string defines the name of the property and must be unique""" + + value: str = "" + """The ``value`` string defines the value of the property""" + + id: Optional[int] = None + """The ``id`` token defines an integer ID for the property and must be unique. + + Optional since KiCad v7, but required in older versions""" + + position: Position = field(default_factory=lambda: Position(angle=0)) + """The ``position`` defines the X and Y coordinates as well as the rotation angle of the property. + All three items will initially be set to zero.""" + + effects: Optional[Effects] = None + """The optional ``effects`` section defines how the text is displayed""" + + showName: bool = False + """The ``show_name`` token defines if the property name is visibly shown. Used for netclass + labels. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Property: + """Convert the given S-Expresstion into a Property object + + Args: + - exp (list): Part of parsed S-Expression ``(property ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not property + + Returns: + - Property: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'property': + raise Exception("Expression does not have the correct type") + + object = cls() + object.key = exp[1] + object.value = exp[2] + for item in exp[3:]: + if item[0] == 'id': object.id = item[1] + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'show_name': object.showName = True + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + id = f' (id {self.id})' if self.id is not None else '' + sn = ' (show_name)' if self.showName else '' + + expression = f'{indents}(property "{dequote(self.key)}" "{dequote(self.value)}"{id} (at {self.position.X} {self.position.Y}{posA}){sn}' + if self.effects is not None: + expression += f'\n{self.effects.to_sexpr(indent+2)}' + expression += f'{indents}){endline}' + else: + expression += f'){endline}' + return expression + +@dataclass +class RenderCachePolygon(): + """A polygon used by the ``render_cache`` token + + Used since KiCad v7 + """ + + pts: List[Position] = field(default_factory=list) + """The ``pts`` token defines a list of points that define the outlines of the polygon""" + + @classmethod + def from_sexpr(cls, exp: list) -> RenderCachePolygon: + """Convert the given S-Expresstion into a RenderCachePolygon object + + Args: + - exp (list): Part of parsed S-Expression ``(polygon ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not polygon + + Returns: + - RenderCachePolygon: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'polygon': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'pts': + for point in item[1:]: + object.pts.append(Position.from_sexpr(point)) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(polygon\n' + expression += f'{indents} (pts' + + for i, point in enumerate(self.pts): + if i % 4 == 0: + expression += f'\n' + expression += f'{indents} ' + expression += f'(xy {point.X} {point.Y})' + + # NOTE: This expects the length of the points array to be a multiple of four to get the + # formatting right. + expression += f'\n{indents} )\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class RenderCache(): + """The ``render_cache`` token defines a cache for none-standard fonts. + + Used since KiCad v7 + + Documentation: + - None found (05.03.2023), seems to be used in ''text_box'' tokens for custom fonts + """ + + text: str = "" + """The ``text`` token defines which text the cache represents. Defaults to an empty string.""" + + id: int = 0 + """The ``id`` token is some number after the text. Defaults to 0.""" + + polygons: List[Position] = field(default_factory=list) + """The ``polygons`` token is a list of polygons that define the outline of the cached text""" + + @classmethod + def from_sexpr(cls, exp: list) -> RenderCache: + """Convert the given S-Expresstion into a RenderCache object + + Args: + - exp (list): Part of parsed S-Expression ``(render_cache ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is smaller than 3 + - Exception: When the first item of the list is not render_cache + + Returns: + - RenderCache: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 3: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'render_cache': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + object.id = exp[2] + for item in exp: + if item[0] == 'polygon': object.polygons.append(RenderCachePolygon.from_sexpr(item)) + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(render_cache "{dequote(self.text)}" {self.id}\n' + for poly in self.polygons: + expression += poly.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class Fill(): + """The ``fill`` token defines how schematic and symbol graphical items are filled + + Documentation: + - https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_fill_definition + """ + + type: str = "none" + """The ``type`` attribute defines how the graphical item is filled. Defaults to ``None``. + Possible values are: + - ``none``: Graphic is not filled + - ``outline``: Graphic item filled with the line color + - ``background``: Graphic item filled with the theme background color""" + + color: Optional[ColorRGBA] = None + """The optional ``color`` token defines the color of the filled item. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> Fill: + """Convert the given S-Expresstion into a Fill object + + Args: + - exp (list): Part of parsed S-Expression ``(fill ...)`` + + Raises: + - Exception: When given parameter's type is not a list or the list is smaller than 3 + - Exception: When the first item of the list is not fill + + Returns: + - Fill: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fill': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'type': object.type = item[1] + if item[0] == 'color': object.color = ColorRGBA().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + color = f' {self.color.to_sexpr()}' if self.color is not None else '' + + expression = f'{indents}(fill (type {self.type}){color}){endline}' + return expression + +@dataclass +class Image(): + """The ``image`` token defines an image embedded into the file + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_image_section + """ + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates of the image""" + + scale: Optional[float] = None + """The optional ``scale`` token attribute defines the scale factor (size) of the image""" + + data: List[str] = field(default_factory=list) + """The ``data`` token attribute defines the image data in the portable network graphics + format (PNG) encoded with MIME type base64 as a list of strings""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + layer: Optional[str] = None + """The optional ``layer`` token defines the canonical layer name when the image is used inside + a footprint or PCB. When used inside a schematic, this token is required to be ``None``.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Image: + """Convert the given S-Expresstion into a Image object + + Args: + - exp (list): Part of parsed S-Expression ``(image ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not image + + Returns: + - Image: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'image': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'scale': object.scale = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'data': + for b64part in item[1:]: + object.data.append(b64part) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + scale = f' (scale {self.scale})' if self.scale is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + + expression = f'{indents}(image (at {self.position.X} {self.position.Y}){layer}{scale}\n' + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents} (data\n' + for b64part in self.data: + expression += f'{indents} {b64part}\n' + expression += f'{indents} )\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class ProjectInstance(ABC): + """The ``instances`` token defines a project instance and serves as an abstract base class for + symbol and hierarchical sheet project instances. + + Available since KiCad v7.""" + + name: str = "" + """The ``name`` token defines the name of the project instance""" + + @abstractmethod + def from_sexpr(cls, exp: list) -> ProjectInstance: + raise NotImplementedError + + @abstractmethod + def to_sexpr(self, indent=2, newline=True) -> str: + raise NotImplementedError diff --git a/kiutils/items/dimensions.py b/kiutils/items/dimensions.py new file mode 100644 index 0000000..098c1e4 --- /dev/null +++ b/kiutils/items/dimensions.py @@ -0,0 +1,338 @@ +"""The dimensions are used to mark spots in the board file for their dimensions (units, metric, +imperial, etc) + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 14.06.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List + +from kiutils.items.common import Position +from kiutils.items.gritems import GrText +from kiutils.utils.strings import dequote + +@dataclass +class DimensionFormat(): + """The ``format`` token defines the text formatting of a dimension + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension_format + """ + + prefix: Optional[str] = None + """The optional ``prefix`` token defines the string to add to the beginning of the dimension text""" + + suffix: Optional[str] = None + """The optional ``suffix`` token defines the string to add to the end of the dimension text""" + + units: int = 3 + """The ``units`` token defines the dimension units used to display the dimension text. Valid units + are as follows: + - 0: Inches + - 1: Mils + - 2: Millimeters + - 3: Automatic""" + + unitsFormat: int = 1 + """The ``unitsFormat`` token defines how the unit's suffix is formatted. Valid units formats are + as follows: + - 0: No suffix + - 1: Bare suffix + - 2: Wrap suffix in parenthesis""" + + precision: int = 4 + """The ``precision`` token defines the number of significant digits to display""" + + overrideValue: Optional[str] = None + """The optional ``overrideValue`` token defines the text to substitute for the actual physical + dimension""" + + suppressZeroes: bool = False + """The ``suppressZeroes`` token removes all trailing zeros from the dimension text""" + + @classmethod + def from_sexpr(cls, exp: list) -> DimensionFormat: + """Convert the given S-Expresstion into a DimensionFormat object + + Args: + - exp (list): Part of parsed S-Expression ``(format ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not format + + Returns: + - DimensionFormat: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'format': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp[1:]: + if type(item) != type([]): + if item == 'suppress_zeroes': object.suppressZeroes = True + continue + if item[0] == 'prefix': object.prefix = item[1] + if item[0] == 'suffix': object.suffix = item[1] + if item[0] == 'units': object.units = item[1] + if item[0] == 'units_format': object.unitsFormat = item[1] + if item[0] == 'precision': object.precision = item[1] + if item[0] == 'override_value': object.overrideValue = item[1] + pass + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + prefix = f' (prefix "{dequote(self.prefix)}")' if self.prefix is not None else '' + suffix = f' (suffix "{dequote(self.suffix)}")' if self.suffix is not None else '' + overwrite_val = f' (override_value "{dequote(self.overrideValue)}")' if self.overrideValue is not None else '' + suppress_zeroes = f' suppress_zeroes' if self.suppressZeroes else '' + + expression = f'{indents}(format{prefix}{suffix} (units {self.units}) (units_format {self.unitsFormat}) (precision {self.precision}){overwrite_val}{suppress_zeroes}){endline}' + return expression + +@dataclass +class DimensionStyle(): + """The ``style`` token defines the style of a dimension + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension_style + """ + + thickness: float = 0.0 + """The ``thickness`` token defines the line thickness of the dimension""" + + arrowLength: float = 0.0 + """The ``arrowLength`` token defines the length of the dimension arrows""" + + textPositionMode: int = 0 + """The ``textPositionMode`` token defines the position mode of the dimension text. Valid position + modes are as follows: + - 0: Text is outside the dimension line + - 1: Text is in line with the dimension line + - 2: Text has been manually placed by the user""" + + extensionHeight: Optional[float] = None + """The optional ``extensionHeight`` token defines the length of the extension lines past the + dimension crossbar""" + + textFrame: Optional[int] = None + """The optional ``textFrame`` token defines the style of the frame around the dimension text. This + only applies to leader dimensions. Valid text frames are as follows: + - 0: No text frame + - 1: Rectangle + - 2: Circle + - 3:Rounded rectangle""" + + extensionOffset: Optional[float] = None + """The optional ``extensionOffset`` token defines the distance from feature points to extension + line start""" + + keepTextAligned: bool = False + """The ``keepTextAligned`` token indicates that the dimension text should be kept in line with the + dimension crossbar. When false, the dimension text is shown horizontally regardless of the + orientation of the dimension.""" + + @classmethod + def from_sexpr(cls, exp: list) -> DimensionStyle: + """Convert the given S-Expresstion into a DimensionStyle object + + Args: + - exp (list): Part of parsed S-Expression ``(style ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not style + + Returns: + - DimensionStyle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'style': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp[1:]: + if type(item) != type([]): + if item == 'keep_text_aligned': object.keepTextAligned = True + continue + if item[0] == 'thickness': object.thickness = item[1] + if item[0] == 'arrow_length': object.arrowLength = item[1] + if item[0] == 'text_position_mode': object.textPositionMode = item[1] + if item[0] == 'extension_height': object.extensionHeight = item[1] + if item[0] == 'text_frame': object.textFrame = item[1] + if item[0] == 'extension_offset': object.extensionOffset = item[1] + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + extension_height = f' (extension_height {self.extensionHeight})' if self.extensionHeight is not None else '' + text_frame = f' (text_frame {self.textFrame})' if self.textFrame is not None else '' + extension_offset = f' (extension_offset {self.extensionOffset})' if self.extensionOffset is not None else '' + keep_aligned = f' keep_text_aligned' if self.keepTextAligned else '' + + expression = f'{indents}(style (thickness {self.thickness}) (arrow_length {self.arrowLength}) (text_position_mode {self.textPositionMode}){extension_height}{text_frame}{extension_offset}{keep_aligned}){endline}' + return expression + +@dataclass +class Dimension(): + """The ``dimension`` token defines a dimension in the PCB + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension + """ + + locked: bool = False + """The optional ``locked`` token specifies if the dimension can be moved""" + + type: str = "aligned" + """The ``type`` token defines the type of dimension. Valid dimension types are ``aligned``, + ``leader``, ``center``, ``orthogonal`` (and ``radial`` in KiCad version 7)""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the polygon resides on""" + + uuid: Optional[str] = None + """The ``uuid`` token defines the unique identifier for the footprint. This only applies + to footprints defined in the board file format.""" + + pts: List[Position] = field(default_factory=list) + """The ``pts`` token define the list of xy coordinates of the dimension""" + + height: Optional[float] = None + """The optional ``height`` token defines the height of aligned dimensions""" + + orientation: Optional[float] = None + """The optional ``orientation`` token defines the rotation angle for orthogonal dimensions""" + + leaderLength: Optional[float] = None + """The optional ``leaderLength`` token attribute defines the distance from the marked radius to + the knee for radial dimensions.""" + + grText: Optional[GrText] = None + """The optional ``grText`` token define the dimension text formatting for all dimension types + except center dimensions""" + + format: Optional[DimensionFormat] = None + """The optional ``format`` token define the dimension formatting for all dimension types except + center dimensions""" + + style: DimensionStyle = field(default_factory=lambda: DimensionStyle()) + """The ``style`` token defines the dimension style information""" + + @classmethod + def from_sexpr(cls, exp: list) -> Dimension: + """Convert the given S-Expresstion into a Dimension object + + Args: + - exp (list): Part of parsed S-Expression ``(dimension ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not dimension + + Returns: + - Dimension: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'dimension': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp[1:]: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'type': object.type = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'height': object.height = item[1] + if item[0] == 'orientation': object.orientation = item[1] + if item[0] == 'leader_length': object.leaderLength = item[1] + if item[0] == 'gr_text': object.grText = GrText().from_sexpr(item) + if item[0] == 'format': object.format = DimensionFormat().from_sexpr(item) + if item[0] == 'style': object.style = DimensionStyle().from_sexpr(item) + if item[0] == 'pts': + for point in item[1:]: + object.pts.append(Position().from_sexpr(point)) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Raises: + - Exception: When number of coordinate points of the dimension equals 0 + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + points = '' + for point in self.pts: + points = f'{points} (xy {point.X} {point.Y})' + if len(points) == 0: + raise Exception("Number of points must not be zero") + + expression = f'{indents}(dimension (type {self.type}) (layer "{self.layer}") (uuid {self.uuid})\n' + expression += f'{indents} (pts{points})\n' + if self.height is not None: + expression += f'{indents} (height {self.height})\n' + if self.orientation is not None: + expression += f'{indents} (orientation {self.orientation})\n' + if self.leaderLength is not None: + expression += f'{indents} (leader_length {self.leaderLength})\n' + if self.grText is not None: + expression += self.grText.to_sexpr(indent+2) + if self.format is not None: + expression += self.format.to_sexpr(indent+2) + expression += self.style.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression \ No newline at end of file diff --git a/kiutils/items/fpitems.py b/kiutils/items/fpitems.py new file mode 100644 index 0000000..4432992 --- /dev/null +++ b/kiutils/items/fpitems.py @@ -0,0 +1,861 @@ +"""Footprint graphical items define all of the drawing items that are used in the footprint +definition. This includes text, text boxes, lines, rectangles, circles, arcs, polygons, curves +and dimensions. + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 08.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_graphics_items +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List + +from kiutils.items.common import RenderCache, Stroke, Position, Effects +from kiutils.utils.strings import dequote + +# FIXME: Several classes have a ``stroke`` member. This feature will be introduced in KiCad 7 and +# has yet to be tested here. + +@dataclass +class FpText(): + """The ``fp_text`` token defines a graphic line in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_text + """ + + type: str = "reference" + """The ``type`` attribute defines the type of text. Valid types are ``reference``, ``value``, and + ``user``""" + + text: str = "%REF" + """The ``text`` attribute is a string that defines the text""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y position coordinates and optional orientation angle of + the text""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the text resides on""" + + hide: bool = False + """The optional ``hide`` token, defines if the text is hidden""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is displayed""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the text object""" + + renderCache: Optional[RenderCache] = None + """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token + should be given in case the font can not be found on the current system. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpText: + """Convert the given S-Expresstion into a FpText object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_text ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_text + + Returns: + - FpText: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_text': + raise Exception("Expression does not have the correct type") + + object = cls() + object.type = exp[1] + object.text = exp[2] + for item in exp[3:]: + if type(item) != type([]): + if item == 'hide': object.hide = True + continue + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + hide = ' hide' if self.hide else '' + unlocked = ' unlocked' if self.position.unlocked else '' + posA = f' {self.position.angle}' if self.position.angle is not None else '' + + expression = f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"){hide}\n' + expression += f'{indents} {self.effects.to_sexpr()}' + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + if self.renderCache is not None: + expression += self.renderCache.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class FpLine(): + """The ``fp_line`` token defines a graphic line in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_line + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the upper left corner of the line""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the low right corner of the line""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the line resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the line. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the line. (version 7)""" + + # FIXME: This is not implemented in to_sexpr() because it does not seem to be used on lines + # in footprints. Further testing required .. + locked: bool = False + """The optional ``locked`` token defines if the line cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the line object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpLine: + """Convert the given S-Expresstion into a FpLine object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_line ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_line + + Returns: + - FpLine: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_line': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + return f'{indents}(fp_line (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{uuid}){endline}' + +@dataclass +class FpRect(): + """The ``fp_rect`` token defines a graphic rectangle in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_rectangle + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the upper left corner of the rectangle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the low right corner of the rectangle""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the rectangle resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the rectangle. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the rectangle. (version 7)""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the rectangle is filled. Valid fill types are solid + and none. If not defined, the rectangle is not filled.""" + + locked: bool = False + """The optional ``locked`` token defines if the rectangle cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpRect: + """Convert the given S-Expresstion into a FpRect object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_rect ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_rect + + Returns: + - FpRect: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_rect': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = ' locked' if self.locked else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + return f'{indents}(fp_rect (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' + +@dataclass +class FpTextBox(): + """The ``fp_text_box`` token defines a rectangle containing line-wrapped text. + + Available since KiCad v7 + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_text_box + """ + + locked: bool = False + """The ``locked`` token specifies if the text box can be moved. Defaults to ``False``.""" + + text: str = "" + """The ``text`` token defines the content of the text box. Defaults to an empty string.""" + + start: Optional[Position] = None + """The optional ``start`` token defines the top-left of a cardinally oriented text box""" + + end: Optional[Position] = None + """The optional ``end`` token defines the bottom-right of a cardinally oriented text box""" + + pts: List[Position] = field(default_factory=list) + """The ``pts`` token defines the four corners of a non-cardianlly oriented text box. The corners + must be in order, but the winding can be either direction.""" + + angle: Optional[float] = None + """The optional ``angle`` token defines the rotation of the text box in degrees. + + Note: + - If ``angle`` is not given, or is a cardinal angle (0, 90, 180 or 270), then the text box + MUST have ``start`` and ``end`` tokens. + - If ``angle`` is given and is not a cardinal angle, then the text box MUST have a ``pts`` + token (with 4 pts). + """ + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the text box resides on. Defaults to + ``F.Cu``.""" + + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the text box""" + + effects: Optional[Effects] = None + """The optional ``effects`` token describes the style of the text in the text box""" + + stroke: Optional[Stroke] = None + """The optional ``stroke`` token describes the style of an optional border to be drawn around + the text box""" + + renderCache: Optional[RenderCache] = None + """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token + should be given in case the font can not be found on the current system.""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpTextBox: + """Convert the given S-Expression into a FpTextBox object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_text_box ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_text_box + + Returns: + - FpTextBox: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_text_box': + raise Exception("Expression does not have the correct type") + + object = cls() + + # Extract "locked" token, if any is present + if exp[1] == "locked" and not isinstance(exp[2], list): + object.locked = True + object.text = exp[2] + start_at = 3 + else: + object.text = exp[1] + start_at = 2 + + for item in exp[start_at:]: + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'pts': + for point in item[1:]: + object.pts.append(Position().from_sexpr(point)) + if item[0] == 'angle': object.angle = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'effects': object.effects = Effects.from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) + if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Raises: + - Exception: When a non-cardinal angle is given and no corner points were defined using + the ``self.pts`` token + - Exception: When a cardinal angle or no angle is given and either start or end token + is undefined + + Returns: + - str: S-Expression of this object + """ + if self.angle is not None and self.angle not in [0.0, 90.0, 180.0, 270.0]: + if len(self.pts) != 4: + raise Exception("None-cardinal angles must have exactly four corner points defined") + if self.angle is None or self.angle in [0.0, 90.0, 180.0, 270.0]: + if self.start is None or self.end is None: + raise Exception("No angle or a cardinal angle needs a start and end token defined") + + indents = ' '*indent + endline = '\n' if newline else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + angle = f'(angle {self.angle}) ' if self.angle is not None else '' + start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else '' + end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else '' + locked = ' locked' if self.locked else '' + + expression = f'{indents}(fp_text_box{locked} "{dequote(self.text)}"\n' + if len(self.pts) == 4: + expression += f'{indents} (pts\n' + expression += f'{indents} (xy {self.pts[0].X} {self.pts[0].Y}) (xy {self.pts[1].X} {self.pts[1].Y}) (xy {self.pts[2].X} {self.pts[2].Y}) (xy {self.pts[3].X} {self.pts[3].Y})\n' + expression += f'{indents} )\n' + expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n' + if self.effects is not None: + expression += self.effects.to_sexpr(indent+2) + if self.stroke is not None: + expression += self.stroke.to_sexpr(indent+2) + if self.renderCache is not None: + expression += self.renderCache.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class FpCircle(): + """The ``fp_circle `` token defines a graphic circle in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_circle + """ + + center: Position = field(default_factory=lambda: Position()) + """The ``center`` token defines the coordinates of the center of the circle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the low right corner of the circle""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the circle resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the circle. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the circle. (version 7)""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the circle is filled. Valid fill types are ``solid`` + and ``none``. If not defined, the circle is not filled.""" + + locked: bool = False + """The optional ``locked`` token defines if the circle cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the circle object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpCircle: + """Convert the given S-Expresstion into a FpCircle object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_circle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_circle + + Returns: + - FpCircle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_circle': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'center': object.center = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = ' locked' if self.locked else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + return f'{indents}(fp_circle (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' + +@dataclass +class FpArc(): + """The ``fp_arc`` token defines a graphic arc in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_arc + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the start position of the arc radius""" + + mid: Position = field(default_factory=lambda: Position()) + """The ``mid`` token defines the coordinates of the midpoint along the arc""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the end position of the arc radius""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the arc resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the arc. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the arc. (version 7)""" + + locked: bool = False + """The optional ``locked`` token defines if the arc cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the arc object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpArc: + """Convert the given S-Expresstion into a FpArc object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_arc ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_arc + + Returns: + - FpArc: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_arc': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'mid': object.mid = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = ' locked' if self.locked else '' + + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + return f'{indents}(fp_arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}' + +@dataclass +class FpPoly(): + """The ``fp_poly`` token defines a graphic polygon in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_polygon + """ + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the polygon resides on""" + + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` define the list of X/Y coordinates of the polygon outline""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the polygon. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the polygon. (version 7)""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the polygon is filled. Valid fill types are solid + and none. If not defined, the rectangle is not filled.""" + + locked: bool = False + """The optional ``locked`` token defines if the polygon cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the polygon object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpPoly: + """Convert the given S-Expresstion into a FpPoly object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_poly ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_poly + + Returns: + - FpPoly: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_poly': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'pts': + for point in item[1:]: + object.coordinates.append(Position().from_sexpr(point)) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the polygon, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = ' locked' if self.locked else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + expression = f'{indents}(fp_poly (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} ) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}' + return expression + +@dataclass +class FpCurve(): + """The ``fp_curve`` token defines a graphic Cubic Bezier curve in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_curve + """ + + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` define the list of X/Y coordinates of the curve outline""" + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the curve resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the curve. (prior to version 7)""" + + stroke: Optional[Stroke] = None # Used for KiCad >= 7 + """The ``stroke`` describes the line width and style of the curve. (version 7)""" + + locked: bool = False + """The optional ``locked`` token defines if the curve cannot be edited""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the curve object""" + + @classmethod + def from_sexpr(cls, exp: list) -> FpCurve: + """Convert the given S-Expresstion into a FpCurve object + + Args: + - exp (list): Part of parsed S-Expression ``(fp_curve ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_curve + + Returns: + - FpCurve: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fp_curve': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'pts': + for point in item[1:]: + object.coordinates.append(Position().from_sexpr(point)) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': + object.width = item[1] + object.stroke = None + if item[0] == 'stroke': + object.stroke = Stroke.from_sexpr(item) + object.width = None + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the curve, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = ' locked' if self.locked else '' + + if self.width is not None: + width = f' (width {self.width})' + elif self.stroke is not None: + width = f' {self.stroke.to_sexpr(indent=0, newline=False)}' + else: + width = '' + + expression = f'{indents}(fp_curve (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}' + return expression diff --git a/kiutils/items/gritems.py b/kiutils/items/gritems.py new file mode 100644 index 0000000..5e00f1f --- /dev/null +++ b/kiutils/items/gritems.py @@ -0,0 +1,780 @@ +"""The graphical items are footprint and board items that are outside of the connectivity items. + This includes graphical items on technical, user, and copper layers. Graphical items are also + used to define complex pad geometries. + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 10.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphic_items +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List + +from kiutils.items.common import Effects, Position, RenderCache, Stroke +from kiutils.utils.strings import dequote + +@dataclass +class GrText(): + """The ``gr_text`` token defines a graphical text. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_text + """ + + text: str = "" + """The ``text`` attribute is a string that defines the text""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y position coordinates and optional orientation angle of the text""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the text resides on""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is displayed""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the text object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + renderCache: Optional[RenderCache] = None + """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token + should be given in case the font can not be found on the current system. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrText: + """Convert the given S-Expresstion into a GrText object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_text ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_text + + Returns: + - GrText: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_text': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + locked = f' locked' if self.locked else '' + + expression = f'{indents}(gr_text{locked} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){layer}{uuid}\n' + expression += f'{indents} {self.effects.to_sexpr()}' + if self.renderCache is not None: + expression += self.renderCache.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class GrTextBox(): + """The ``gr_text_box`` token defines a graphical rectangle containing line-wrapped text. + + Available since KiCad v7 + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_text_box + """ + + locked: bool = False + """The ``locked`` token specifies if the text box can be moved. Defaults to ``False``.""" + + text: str = "" + """The ``text`` token defines the content of the text box. Defaults to an empty string.""" + + start: Optional[Position] = None + """The optional ``start`` token defines the top-left of a cardinally oriented text box""" + + end: Optional[Position] = None + """The optional ``end`` token defines the bottom-right of a cardinally oriented text box""" + + pts: List[Position] = field(default_factory=list) + """The ``pts`` token defines the four corners of a non-cardianlly oriented text box. The corners + must be in order, but the winding can be either direction.""" + + angle: Optional[float] = None + """The optional ``angle`` token defines the rotation of the text box in degrees. + + Note: + - If ``angle`` is not given, or is a cardinal angle (0, 90, 180 or 270), then the text box + MUST have ``start`` and ``end`` tokens. + - If ``angle`` is given and is not a cardinal angle, then the text box MUST have a ``pts`` + token (with 4 pts). + """ + + layer: str = "F.Cu" + """The ``layer`` token defines the canonical layer the text box resides on. Defaults to + ``F.Cu``.""" + + uuid: Optional[str] = None + """The optional ``uuid`` token defines the unique identifier of the text box""" + + effects: Optional[Effects] = None + """The optional ``effects`` token describes the style of the text in the text box""" + + stroke: Optional[Stroke] = None + """The optional ``stroke`` token describes the style of an optional border to be drawn around + the text box""" + + renderCache: Optional[RenderCache] = None + """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token + should be given in case the font can not be found on the current system. + + Available since KiCad v7""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrTextBox: + """Convert the given S-Expression into a GrTextBox object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_text_box ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fp_text_box + + Returns: + - GrTextBox: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_text_box': + raise Exception("Expression does not have the correct type") + + object = cls() + + # Extract "locked" token, if any is present + if exp[1] == "locked" and not isinstance(exp[2], list): + object.locked = True + object.text = exp[2] + start_at = 3 + else: + object.text = exp[1] + start_at = 2 + + for item in exp[start_at:]: + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'pts': + for point in item[1:]: + object.pts.append(Position().from_sexpr(point)) + if item[0] == 'angle': object.angle = item[1] + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'effects': object.effects = Effects.from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) + if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Raises: + - Exception: When a non-cardinal angle is given and no corner points were defined using + the ``self.pts`` token + - Exception: When a cardinal angle or no angle is given and either start or end token + is undefined + + Returns: + - str: S-Expression of this object + """ + if self.angle is not None and self.angle not in [0.0, 90.0, 180.0, 270.0]: + if len(self.pts) != 4: + raise Exception("None-cardinal angles must have exactly four corner points defined") + if self.angle is None or self.angle in [0.0, 90.0, 180.0, 270.0]: + if self.start is None or self.end is None: + raise Exception("No angle or a cardinal angle needs a start and end token defined") + + indents = ' '*indent + endline = '\n' if newline else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + angle = f'(angle {self.angle}) ' if self.angle is not None else '' + start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else '' + end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else '' + locked = ' locked' if self.locked else '' + + expression = f'{indents}(gr_text_box{locked} "{dequote(self.text)}"\n' + if len(self.pts) == 4: + expression += f'{indents} (pts\n' + expression += f'{indents} (xy {self.pts[0].X} {self.pts[0].Y}) (xy {self.pts[1].X} {self.pts[1].Y}) (xy {self.pts[2].X} {self.pts[2].Y}) (xy {self.pts[3].X} {self.pts[3].Y})\n' + expression += f'{indents} )\n' + expression += f'{indents} {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n' + if self.effects is not None: + expression += self.effects.to_sexpr(indent+2) + if self.stroke is not None: + expression += self.stroke.to_sexpr(indent+2) + if self.renderCache is not None: + expression += self.renderCache.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class GrLine(): + """The ``gr_line`` token defines a graphical line. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_line + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the start of the line""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the end of the line""" + + angle: Optional[float] = None + """The optional ``angle`` token defines the rotational angle of the line""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the rectangle resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the rectangle. (prior to version 7)""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrLine: + """Convert the given S-Expresstion into a GrLine object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_line ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_line + + Returns: + - GrLine: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_line': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': object.width = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = f' locked' if self.locked else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + angle = f' (angle {self.angle}' if self.angle is not None else '' + + return f'{indents}(gr_line{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){angle}{layer} (width {self.width}){uuid}){endline}' + +@dataclass +class GrRect(): + """The ``gr_rect`` token defines a graphical rectangle. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_rectangle + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the upper left corner of the rectangle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the low right corner of the rectangle""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the rectangle resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the rectangle. (prior to version 7)""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the rectangle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the rectangle object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrRect: + """Convert the given S-Expresstion into a GrRect object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_rect ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_rect + + Returns: + - GrRect: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_rect': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': object.width = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = f' locked' if self.locked else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + + return f'{indents}(gr_rect{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){fill}{uuid}){endline}' + +@dataclass +class GrCircle(): + """The ``gr_circle `` token defines a graphical circle. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_circle + """ + + center: Position = field(default_factory=lambda: Position()) + """The ``center`` token defines the coordinates of the center of the circle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the low right corner of the circle""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the circle resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the circle. (prior to version 7)""" + + stroke: Optional[Stroke] = None + """The optional ``stroke`` token describes the style of the circle's boundary.""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the circle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the circle object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrCircle: + """Convert the given S-Expresstion into a GrCircle object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_circle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_circle + + Returns: + - GrCircle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_circle': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'center': object.center = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': object.width = item[1] + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = f' locked' if self.locked else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + stroke = self.stroke.to_sexpr() if self.stroke is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + + return f'{indents}(gr_circle{locked} (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}){layer}{stroke} (width {self.width}){fill}{uuid}){endline}' + +@dataclass +class GrArc(): + """The ``gr_arc`` token defines a graphic arc. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_arc + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of the start position of the arc radius""" + + mid: Position = field(default_factory=lambda: Position()) + """The ``mid`` token defines the coordinates of the midpoint along the arc""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of the end position of the arc radius""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the arc resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the arc. (prior to version 7)""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the arc object.""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrArc: + """Convert the given S-Expresstion into a GrArc object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_arc ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_arc + + Returns: + - GrArc: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_arc': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'start': object.start = Position.from_sexpr(item) + if item[0] == 'mid': object.mid = Position.from_sexpr(item) + if item[0] == 'end': object.end = Position.from_sexpr(item) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': object.width = item[1] + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + locked = f' locked' if self.locked else '' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + + return f'{indents}(gr_arc{locked} (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){uuid}){endline}' + +@dataclass +class GrPoly(): + """The ``gr_poly`` token defines a graphic polygon in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_polygon + """ + + layer: Optional[str] = None + """The ``coordinates`` define the list of X/Y coordinates of the polygon outline""" + + coordinates: List[Position] = field(default_factory=list) + """The ``layer`` token defines the canonical layer the polygon resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the polygon. (prior to version 7)""" + + fill: Optional[str] = None + """The optional ``fill`` toke defines how the polygon is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the polygon object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + net: Optional[int] = None + """The ``net`` token defines the net identifier associated with the polygon.""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrPoly: + """Convert the given S-Expresstion into a GrPoly object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_poly ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_poly + + Returns: + - GrPoly: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_poly': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'pts': + for point in item[1:]: + object.coordinates.append(Position().from_sexpr(point)) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fill': object.fill = item[1] + if item[0] == 'width': object.width = item[1] + if item[0] == 'net': object.net = int(item[1]) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True, pts_newline: bool = False) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the polygon, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + - pts_newline (bool): Adds a newline for the ``(pts ..)`` token as KiCad treats + this different in Board files than Footprint files. Defaults to + False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + fill = f' (fill {self.fill})' if self.fill is not None else '' + locked = f' locked' if self.locked else '' + net = f' (net {self.net})' if self.net is not None else '' + + if pts_newline: + expression = f'{indents}(gr_poly{locked}\n' + expression += f'{indents} (pts\n' + else: + expression = f'{indents}(gr_poly{locked} (pts\n' + + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} ){layer} (width {self.width}){fill}{net}{uuid}){endline}' + return expression + +@dataclass +class GrCurve(): + """The ``gr_curve`` token defines a graphic Cubic Bezier curve in a footprint definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_curve + """ + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` define the list of X/Y coordinates of the curve outline""" + + layer: Optional[str] = None + """The ``layer`` token defines the canonical layer the curve resides on""" + + width: Optional[float] = 0.12 # Used for KiCad < 7 + """The ``width`` token defines the line width of the curve. (prior to version 7)""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the curve object""" + + locked: bool = False + """The ``locked`` token defines if the object may be moved or not""" + + @classmethod + def from_sexpr(cls, exp: list) -> GrCurve: + """Convert the given S-Expresstion into a GrCurve object + + Args: + - exp (list): Part of parsed S-Expression ``(gr_curve ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not gr_curve + + Returns: + - GrCurve: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'gr_curve': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + continue + if item[0] == 'pts': + for point in item[1:]: + object.coordinates.append(Position().from_sexpr(point)) + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'width': object.width = item[1] + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the curve, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else '' + locked = f' locked' if self.locked else '' + + expression = f'{indents}(gr_curve{locked} (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents}){layer} (width {self.width}{uuid}){endline}' + return expression diff --git a/kiutils/items/schitems.py b/kiutils/items/schitems.py new file mode 100644 index 0000000..1c31cd5 --- /dev/null +++ b/kiutils/items/schitems.py @@ -0,0 +1,1919 @@ +"""Defines items used in KiCad schematic files + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 19.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/ +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass, field +from typing import Optional, List, Dict + +from kiutils.items.common import Fill, Position, ColorRGBA, ProjectInstance, Stroke, Effects, Property +from kiutils.utils.strings import dequote + +@dataclass +class Junction(): + """The ``junction`` token defines a junction in the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_junction_section + """ + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates of the junction""" + + diameter: float = 0 + """The ``diameter`` token attribute defines the DIAMETER of the junction. A diameter of 0 + is the default diameter in the system settings.""" + + color: ColorRGBA = field(default_factory=lambda: ColorRGBA()) + """The ``color`` token attributes define the Red, Green, Blue, and Alpha transparency of + the junction. If all four attributes are 0, the default junction color is used.""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Junction: + """Convert the given S-Expresstion into a Junction object + + Args: + - exp (list): Part of parsed S-Expression ``(junction ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not junction + + Returns: + - Junction: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'junction': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'color': object.color = ColorRGBA().from_sexpr(item) + if item[0] == 'diameter': object.color = item[1] + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + uuid = f'\n{indents} (uuid {self.uuid})\n' if self.uuid is not None else '' + expression = f'{indents}(junction (at {self.position.X} {self.position.Y}) (diameter {self.diameter}) {self.color.to_sexpr()}{uuid}{indents}){endline}' + return expression + +@dataclass +class NoConnect(): + """The ``no_connect`` token defines a unused pin connection in the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_no_connect_section + """ + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates of the no connect""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> NoConnect: + """Convert the given S-Expresstion into a NoConnect object + + Args: + - exp (list): Part of parsed S-Expression ``(no_connect ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not no_connect + + Returns: + - NoConnect: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'no_connect': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + + return f'{indents}(no_connect (at {self.position.X} {self.position.Y}){uuid}){endline}' + +@dataclass +class BusEntry(): + """The ``bus_entry`` token defines a bus entry in the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_bus_entry_section + """ + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates of the bus entry""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + size: Position = field(default_factory=lambda: Position()) # Re-using Position class here + """The ``size`` token attributes define the X and Y distance of the end point from + the position of the bus entry""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the bus entry is drawn""" + + @classmethod + def from_sexpr(cls, exp: list) -> BusEntry: + """Convert the given S-Expresstion into a BusEntry object + + Args: + - exp (list): Part of parsed S-Expression ``(bus_entry ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not bus_entry + + Returns: + - BusEntry: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'bus_entry': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'size': object.size = Position().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(bus_entry (at {self.position.X} {self.position.Y}) (size {self.size.X} {self.size.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class BusAlias(): + """The ``bus_alias`` token defines a bus entry in the schematic + + Documentation: + https://gitlab.com/kicad/services/kicad-dev-docs/-/merge_requests/53/diffs + """ + + name: str = "" + """The ``name`` of the bus.""" + + members: List[str] = field(default_factory=list) + """The list of ``members`` defined in the bus. Note that when you tap out a bus entry + from a bus using one these members a label will be created with the selected member name""" + + @classmethod + def from_sexpr(cls, exp: list) -> BusAlias: + """Convert the given S-Expresstion into a BusAlias object + + Args: + - exp (list): Part of parsed S-Expression ``(bus_alias ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not bus_alias + - Exception: When the S-Expression is not exactly three items long + - Exception: When the ``members`` token is missing + + Returns: + - BusAlias: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'bus_alias': + raise Exception("Expression does not have the correct type") + + if len(exp) != 3: + raise Exception("Exactly three items are expected in a bus_alias S-Expression.") + + if not isinstance(exp[2], list) or exp[2][0] != 'members': + raise Exception("bus_alias needs to contain a list of members") + + object = cls() + object.name = exp[1] + object.members = [x for x in exp[2][1:]] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + members = [f'"{dequote(member)}"' for member in self.members] + expression = f'{indents}(bus_alias "{dequote(self.name)}" (members {" ".join(members)})){endline}' + return expression + +@dataclass +class Connection(): + """The ``wire`` and ``bus`` tokens define wires and buses in the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_wire_and_bus_section + """ + + type: str = "wire" + """The ``type`` token defines wether the connection is a ``bus`` or a ``wire``""" + + points: List[Position] = field(default_factory=list) + """The ``points`` token defines the list of X and Y coordinates of start and end points + of the wire or bus""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the connection is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Connection: + """Convert the given S-Expresstion into a Connection object + + Args: + - exp (list): Part of parsed S-Expression ``(wire ...)`` or ``(bus ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not wire or bus + + Returns: + - Connection: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if not (exp[0] == 'wire' or exp[0] == 'bus'): + raise Exception("Expression does not have the correct type") + + object = cls() + object.type = exp[0] + for item in exp: + if item[0] == 'pts': + for point in item[1:]: + object.points.append(Position().from_sexpr(point)) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + points = '' + for point in self.points: + points += f' (xy {point.X} {point.Y})' + + expression = f'{indents}({self.type} (pts{points})\n' + expression += self.stroke.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class PolyLine(): + """The ``polyline`` token defines one or more lines that may or may not represent a polygon + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_graphical_line_section + """ + + points: List[Position] = field(default_factory=list) + """The ``points`` token defines the list of X/Y coordinates of to draw line(s) + between. A minimum of two points is required.""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the graphical line is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> PolyLine: + """Convert the given S-Expresstion into a PolyLine object + + Args: + - exp (list): Part of parsed S-Expression ``(polyline ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not polyline + + Returns: + - PolyLine: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'polyline': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'pts': + for point in item[1:]: + object.points.append(Position().from_sexpr(point)) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + points = '' + for point in self.points: + points += f' (xy {point.X} {point.Y})' + + expression = f'{indents}(polyline (pts{points})\n' + expression += self.stroke.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class Text(): + """The ``text`` token defines graphical text in a schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_graphical_text_section + """ + + text: str = "" + """The ``text`` token defines the text string""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the text""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Text: + """Convert the given S-Expresstion into a Text object + + Args: + - exp (list): Part of parsed S-Expression ``(text ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not text + + Returns: + - Text: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'text': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + + expression = f'{indents}(text "{dequote(self.text)}"' + + # Strings longer or equal than 50 chars have the position in the next line + if len(self.text) >= 50: + expression += f'\n{indents} ' + else: + expression += ' ' + expression += f'(at {self.position.X} {self.position.Y}{posA})\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class TextBox(): + """The ``text_box`` token defines a text box inside a schematic + + Available since KiCad v7 + + Documentation: + ???? + """ + text: str = "" + """The ``text`` token defines the text string""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the text""" + + size: Position = field(default_factory=lambda: Position()) + """The ``size`` token defines the size in X and Y direction. Angle is not used.""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` token defines the look of the outline of the text box""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token defines how the text box should be filled""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> TextBox: + """Convert the given S-Expresstion into a TextBox object + + Args: + - exp (list): Part of parsed S-Expression ``(text_box ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not text_box + + Returns: + - TextBox: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'text_box': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'size': object.size = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + + expression = f'{indents}(text_box "{dequote(self.text)}"\n' + expression += f'{indents} (at {self.position.X} {self.position.Y}{posA}) (size {self.size.X} {self.size.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class LocalLabel(): + """The ``label`` token defines an wire or bus label name in a schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#local_label_section + """ + + text: str = "" + """The ``text`` token defines the text in the label""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the label""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the label is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the global label have been place automatically""" + + @classmethod + def from_sexpr(cls, exp: list) -> LocalLabel: + """Convert the given S-Expresstion into a LocalLabel object + + Args: + - exp (list): Part of parsed S-Expression ``(label ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not label + + Returns: + - LocalLabel: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'label': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + fieldsAutoplaced = ' (fields_autoplaced)' if self.fieldsAutoplaced else '' + + expression = f'{indents}(label "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){fieldsAutoplaced}\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class GlobalLabel(): + """The ``global_label`` token defines a label name that is visible across all schematics in a design + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_global_label_section + """ + + text: str = "" + """The ``text`` token defines the text in the label""" + + shape: str = "input" + """The ``shape`` token defines the way the global label is drawn. Possible values are: + ``input``, ``output``, ``bidirectional``, ``tri_state``, ``passive``.""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the global label have been place automatically""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the label""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the label is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + properties: List[Property] = field(default_factory=list) + """ The ``properties`` token defines a list of properties of the global label. Currently, the + only supported property is the inter-sheet reference""" + + @classmethod + def from_sexpr(cls, exp: list) -> GlobalLabel: + """Convert the given S-Expresstion into a GlobalLabel object + + Args: + - exp (list): Part of parsed S-Expression ``(global_label ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not global_label + + Returns: + - GlobalLabel: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'global_label': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'property': object.properties.append(Property().from_sexpr(item)) + if item[0] == 'shape': object.shape = item[1] + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + fa = ' (fields_autoplaced)' if self.fieldsAutoplaced else '' + + expression = f'{indents}(global_label "{dequote(self.text)}" (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fa}\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + for property in self.properties: + expression += property.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class HierarchicalLabel(): + """The ``hierarchical_label`` token defines a label that are used by hierarchical sheets to + define connections between sheet in hierarchical designs + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_label_section + """ + + text: str = "" + """The ``text`` token defines the text in the label""" + + shape: str = "input" + """The ``shape`` token defines the way the global label is drawn. Possible values are: + ``input``, ``output``, ``bidirectional``, ``tri_state``, ``passive``.""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the label""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the label is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the global label have been place automatically""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalLabel: + """Convert the given S-Expresstion into a HierarchicalLabel object + + Args: + - exp (list): Part of parsed S-Expression ``(hierarchical_label ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not hierarchical_label + + Returns: + - HierarchicalLabel: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'hierarchical_label': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'shape': object.shape = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + fieldsAutoplaced = ' (fields_autoplaced)' if self.fieldsAutoplaced else '' + + expression = f'{indents}(hierarchical_label "{dequote(self.text)}" (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fieldsAutoplaced}\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class SymbolProjectPath(): + """The symbol project path defines the ``path`` token to the sheet instance of the instance data + of a symbol. + + Available since KiCad v7. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section + """ + + sheetInstancePath: str = "" + """The ``PATH_INSTANCE`` token defines the path to the symbol instance""" + + reference: str = "" + """The ``reference`` token is a string that defines the reference designator for the symbol + instance""" + + unit: int = 1 + """The ``unit`` token is a integer that defines the symbol unit for the symbol instance. For + symbols that do not define multiple units, this will always be 1.""" + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolProjectPath: + """Convert the given S-Expression into a SymbolProjectPath object + + Args: + - exp (list): Part of parsed S-Expression ``(path ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not path + + Returns: + - SymbolProjectPath: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'path': + raise Exception("Expression does not have the correct type") + + object = cls() + object.sheetInstancePath = exp[1] + for item in exp[2:]: + if item[0] == 'reference': object.reference = item[1] + if item[0] == 'unit': object.unit = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + expression = f'{indents}(path "{dequote(self.sheetInstancePath)}"\n' + expression += f'{indents} (reference "{dequote(self.reference)}") (unit {self.unit})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class SymbolProjectInstance(ProjectInstance): + """The ``project`` token attribute defines the name of the project as well as a list of symbol + project paths (instance data). There can be instance data from other project when schematics + are shared across multiple projects. The projects will have to be sorted by the ``name`` token + in alphabetical order. + + Available since KiCad v7. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section + """ + + paths: List[SymbolProjectPath] = field(default_factory=list) + """The ``paths`` token defines a list of symbol project paths for this project instance""" + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolProjectInstance: + """Convert the given S-Expression into a SymbolProjectInstance object + + Args: + - exp (list): Part of parsed S-Expression ``(project ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not project + + Returns: + - SymbolProjectInstance: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'project': + raise Exception("Expression does not have the correct type") + + object = cls() + object.name = exp[1] + for item in exp[2:]: + if item[0] == 'path': object.paths.append(SymbolProjectPath.from_sexpr(item)) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + expression = f'{indents}(project "{dequote(self.name)}"\n' + for path in self.paths: + expression += path.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SchematicSymbol(): + """The ``symbol`` token in the symbol section of the schematic defines an instance of a symbol + from the library symbol section of the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section + """ + + @property + def libId(self) -> str: + """The ``lib_id`` token defines which symbol in the library symbol section of the schematic + this schematic symbol references. In ``kiutils``, the ``lib_id`` token is a combination of + both the ``libraryNickname`` and ``entryName`` token. Setting the ``lib_id`` token will + update those tokens accordingly. + + Returns: + - Symbol id in the following format: ``:`` or ````, + if ``libraryNickname`` token is not set. + """ + if self.libraryNickname: + return f'{self.libraryNickname}:{self.entryName}' + else: + return f'{self.entryName}' + + @libId.setter + def libId(self, symbol_id: str): + """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname`` and + ``entryName`` token. + + Args: + - symbol_id (str): The symbol id in the following format: ``:`` + or only ```` + """ + parse_symbol_id = re.match(r"^(.+?):(.+?)$", symbol_id) + if parse_symbol_id: + self.libraryNickname = parse_symbol_id.group(1) + self.entryName = parse_symbol_id.group(2) + else: + self.libraryNickname = None + self.entryName = symbol_id + + libraryNickname: Optional[str] = None + """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to + and is a part of the ``id`` token""" + + entryName: str = None + """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id`` + token""" + + libName: Optional[str] = None + """The optional ``lib_name`` token is only set when the symbol was edited in the schematic. + It may be set to ``_X`` where X is a unique number that specifies which variation + this symbol is of its original.""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and angle of rotation of the symbol""" + + unit: Optional[int] = None + """The optional ``unit`` token attribute defines which unit in the symbol library definition + that the schematic symbol represents""" + + inBom: bool = False + """The ``in_bom`` token attribute determines whether the schematic symbol appears in any bill + of materials output""" + + onBoard: bool = False + """The ``on_board`` token attribute determines if the footprint associated with the symbol is + exported to the board via the netlist""" + + dnp: Optional[bool] = None + """The optional ``dnp`` token defines if a symbol is marked as do-not-populate in the schematic. + + Available since KiCad v7""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the global label have been place automatically""" + + uuid: Optional[str] = "" + """The optional `uuid` defines the universally unique identifier""" + + properties: List[Property] = field(default_factory=list) + """The ``properties`` section defines a list of symbol properties of the schematic symbol""" + + pins: Dict[str, str] = field(default_factory=dict) + """The ``pins`` token defines a dictionary with pin numbers in form of strings as keys and + uuid's as values""" + + mirror: Optional[str] = None + """The ``mirror`` token defines if the symbol is mirrored in the schematic. Accepted values: + ``x`` or ``y``. When mirroring around the x and y axis at the same time use some additional + rotation to get the correct orientation of the symbol.""" + + instances: List[SymbolProjectInstance] = field(default_factory=list) + """The ``instances`` token defines a list of symbol instances grouped by project. Every symbol + will have a least one instance. + + Available since KiCad v7.""" + + @classmethod + def from_sexpr(cls, exp: list) -> SchematicSymbol: + """Convert the given S-Expresstion into a SchematicSymbol object + + Args: + - exp (list): Part of parsed S-Expression ``(symbol ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not symbol + + Returns: + - SchematicSymbol: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'symbol': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp[1:]: + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + if item[0] == 'lib_id': object.libId = item[1] + if item[0] == 'lib_name': object.libName = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'unit': object.unit = item[1] + if item[0] == 'in_bom': object.inBom = True if item[1] == 'yes' else False + if item[0] == 'on_board': object.onBoard = True if item[1] == 'yes' else False + if item[0] == 'dnp': object.dnp = True if item[1] == 'yes' else False + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'property': object.properties.append(Property().from_sexpr(item)) + if item[0] == 'pin': object.pins.update({item[1]: item[2][1]}) + if item[0] == 'mirror': object.mirror = item[1] + if item[0] == 'instances': + for instance in item[1:]: + object.instances.append(SymbolProjectInstance.from_sexpr(instance)) + + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + fa = f' (fields_autoplaced)' if self.fieldsAutoplaced else '' + inBom = 'yes' if self.inBom else 'no' + onBoard = 'yes' if self.onBoard else 'no' + mirror = f' (mirror {self.mirror})' if self.mirror is not None else '' + unit = f' (unit {self.unit})' if self.unit is not None else '' + lib_name = f' (lib_name "{dequote(self.libName)}")' if self.libName is not None else '' + if self.dnp is not None: + dnp = ' (dnp yes)' if self.dnp else ' (dnp no)' + else: + dnp = '' + + expression = f'{indents}(symbol{lib_name} (lib_id "{dequote(self.libId)}") (at {self.position.X} {self.position.Y}{posA}){mirror}{unit}\n' + expression += f'{indents} (in_bom {inBom}) (on_board {onBoard}){dnp}{fa}\n' + if self.uuid: + expression += f'{indents} (uuid {self.uuid})\n' + for property in self.properties: + expression += property.to_sexpr(indent+2) + for number, uuid in self.pins.items(): + expression += f'{indents} (pin "{dequote(number)}" (uuid {uuid}))\n' + if len(self.instances) != 0: + expression += f'{indents} (instances\n' + for instance in self.instances: + expression += instance.to_sexpr(indent+4) + expression += f'{indents} )\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class HierarchicalPin(): + """The ``pin`` token in a sheet object defines an electrical connection between the sheet in a + schematic with the hierarchical label defined in the associated schematic file + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_pin_definition + """ + + name: str = "" + """ The ``name`` attribute defines the name of the sheet pin. It must have an identically named + hierarchical label in the associated schematic file.""" + + connectionType: str = "input" + """The electrical connect type token defines the type of electrical connect made by the + sheet pin""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and angle of rotation of the pin""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` section defines how the pin name text is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalPin: + """Convert the given S-Expresstion into a HierarchicalPin object + + Args: + - exp (list): Part of parsed S-Expression ``(pin ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not pin + + Returns: + - HierarchicalPin: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'pin': + raise Exception("Expression does not have the correct type") + + object = cls() + object.name = exp[1] + object.connectionType = exp[2] + for item in exp[3:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + + expression = f'{indents}(pin "{dequote(self.name)}" {self.connectionType} (at {self.position.X} {self.position.Y}{posA})\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + + +@dataclass +class HierarchicalSheetProjectPath(): + """The symbol project path defines the ``path`` token to the sheet instance of the instance data + of a symbol. + + Available since KiCad v7. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section + """ + + sheetInstancePath: str = "" + """The ``PATH_INSTANCE`` token defines the path to the symbol instance""" + + page: str = "" + """The ``page`` token is a string that defines the page number of the sheet instance""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalSheetProjectPath: + """Convert the given S-Expression into a HierarchicalSheetProjectPath object + + Args: + - exp (list): Part of parsed S-Expression ``(path ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not path + + Returns: + - HierarchicalSheetProjectPath: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'path': + raise Exception("Expression does not have the correct type") + + object = cls() + object.sheetInstancePath = exp[1] + for item in exp[2:]: + if item[0] == 'page': object.page = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + return f'{indents}(path "{dequote(self.sheetInstancePath)}" (page "{dequote(self.page)}")){endline}' + +@dataclass +class HierarchicalSheetProjectInstance(ProjectInstance): + """The ``project`` token attribute defines the name of the project as well as a list of + hierarchical sheet project paths (instance data). There can be instance data from other project + when schematics are shared across multiple projects. The projects will have to be sorted by the + ``name`` token in alphabetical order. + + Available since KiCad v7. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section + """ + + paths: List[HierarchicalSheetProjectPath] = field(default_factory=list) + """The ``paths`` token defines a list of hierarchical sheet project paths for this project instance""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalSheetProjectInstance: + """Convert the given S-Expression into a HierarchicalSheetProjectInstance object + + Args: + - exp (list): Part of parsed S-Expression ``(project ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not project + + Returns: + - HierarchicalSheetProjectInstance: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list) or len(exp) < 2: + raise Exception("Expression does not have the correct type") + + if exp[0] != 'project': + raise Exception("Expression does not have the correct type") + + object = cls() + object.name = exp[1] + for item in exp[2:]: + if item[0] == 'path': object.paths.append(HierarchicalSheetProjectPath.from_sexpr(item)) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + expression = f'{indents}(project "{dequote(self.name)}"\n' + for path in self.paths: + expression += path.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class HierarchicalSheet(): + """The ``sheet`` token defines a hierarchical sheet of the schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section + """ + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and angle of rotation of the sheet in the schematic""" + + width: float = 0 + """The ``width`` token defines the width of the sheet""" + + height: float = 0 + """The ``height`` token defines the height of the sheet""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the global label have been place automatically""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the sheet outline is drawn""" + + fill: ColorRGBA = field(default_factory=lambda: ColorRGBA()) + """The fill defines the color how the sheet is filled""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + sheetName: Property = field(default_factory=lambda: Property(key="Sheet name")) + """The ``sheetName`` is a property that defines the name of the sheet. The property's + key should therefore be set to `Sheet name`""" + + fileName: Property = field(default_factory=lambda: Property(key="Sheet file")) + """The ``fileName`` is a property that defines the file name of the sheet. The property's + key should therefore be set to `Sheet file`""" + + properties: List[Property] = field(default_factory=list) + """The ``properties`` section defines a list of properties defined for the hiererchical sheet. + This holds all properties except that held by ``sheetName`` and ``fileName`` members.""" + + pins: List[HierarchicalPin] = field(default_factory=list) + """The ``pins`` section is a list of hierarchical pins that map a hierarchical label defined in + the associated schematic file""" + + instances: List[HierarchicalSheetProjectInstance] = field(default_factory=list) + """The ``instances`` token defines a list of hierachical sheet instances grouped by project. + Every hierarchical sheet will have a least one instance. + + Available since KiCad v7.""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalSheet: + """Convert the given S-Expresstion into a HierarchicalSheet object + + Args: + - exp (list): Part of parsed S-Expression ``(sheet ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not sheet + + Returns: + - HierarchicalSheet: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'sheet': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp[1:]: + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'size': + object.width = item[1] + object.height = item[2] + if item[0] == 'fill': + object.fill = ColorRGBA().from_sexpr(item[1]) + object.fill.precision = 4 + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'property': + p = Property().from_sexpr(item) + if item[1] == 'Sheet name' or item[1] == 'Sheetname': object.sheetName = p + elif item[1] == 'Sheet file' or item[1] == 'Sheetfile': object.fileName = p + else: object.properties.append(p) + if item[0] == 'pin': object.pins.append(HierarchicalPin().from_sexpr(item)) + if item[0] == 'instances': + for instance in item[1:]: + object.instances.append(HierarchicalSheetProjectInstance.from_sexpr(instance)) + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + fa = ' (fields_autoplaced)' if self.fieldsAutoplaced else '' + + expression = f'{indents}(sheet (at {self.position.X} {self.position.Y}) (size {self.width} {self.height}){fa}\n' + expression += self.stroke.to_sexpr(indent+2) + expression += f'{indents} (fill {self.fill.to_sexpr()})\n' + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += self.sheetName.to_sexpr(indent+2) + expression += self.fileName.to_sexpr(indent+2) + for p in self.properties: + expression += p.to_sexpr(indent+2) + for pin in self.pins: + expression += pin.to_sexpr(indent+2) + if len(self.instances) != 0: + expression += f'{indents} (instances\n' + for instance in self.instances: + expression += instance.to_sexpr(indent+4) + expression += f'{indents} )\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class HierarchicalSheetInstance(): + """The sheet_instance token defines the per sheet information for the entire schematic. This + section will only exist in schematic files that are the root sheet of a project + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_instance_section + """ + + instancePath: str = "/" + """The ``instancePath`` attribute is the path to the sheet instance""" + + page: str = "1" + """The ``page`` token defines the page number of the schematic represented by the sheet + instance information. Page numbers can be any valid string.""" + + @classmethod + def from_sexpr(cls, exp: list) -> HierarchicalSheetInstance: + """Convert the given S-Expresstion into a HierarchicalSheetInstance object + + Args: + - exp (list): Part of parsed S-Expression ``(path ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not path + + Returns: + - HierarchicalSheetInstance: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'path': + raise Exception("Expression does not have the correct type") + + object = cls() + object.instancePath = exp[1] + for item in exp[2:]: + if item[0] == 'page': object.page = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + return f'{indents}(path "{dequote(self.instancePath)}" (page "{dequote(self.page)}")){endline}' + +@dataclass +class SymbolInstance(): + """The ``symbol_instance`` token defines the per symbol information for the entire schematic + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_instance_section + """ + + path: str = "/" + """The ``path`` attribute is the path to the sheet instance""" + + reference: str = "" + """The ``reference`` token attribute is a string that defines the reference designator for + the symbol instance""" + + unit: int = 0 + """The unit token attribute is a integer ordinal that defines the symbol unit for the + symbol instance. For symbols that do not define multiple units, this will always be 1.""" + + value: str = "" + """The value token attribute is a string that defines the value field for the symbol instance""" + + footprint: str = "" + """The ``footprint`` token attribute is a string that defines the LIBRARY_IDENTIFIER for footprint associated with the symbol instance""" + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolInstance: + """Convert the given S-Expresstion into a SymbolInstance object + + Args: + - exp (list): Part of parsed S-Expression ``(path ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not path + + Returns: + - SymbolInstance: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'path': + raise Exception("Expression does not have the correct type") + + object = cls() + object.path = exp[1] + for item in exp[2:]: + if item[0] == 'reference': object.reference = item[1] + if item[0] == 'unit': object.unit = item[1] + if item[0] == 'value': object.value = item[1] + if item[0] == 'footprint': object.footprint = item[1] + return object + + def to_sexpr(self, indent=4, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(path "{dequote(self.path)}"\n' + expression += f'{indents} (reference "{dequote(self.reference)}") (unit {self.unit}) (value "{dequote(self.value)}") (footprint "{dequote(self.footprint)}")\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class Rectangle(): + """The ``rectangle`` token defines a graphical rectangle in a schematic. + + Available since KiCad v7 + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_rectangle + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token attributes define the coordinates of the start point of the rectangle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token attributes define the coordinates of the end point of the rectangle""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the rectangle outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how rectangle arc is filled""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Rectangle: + """Convert the given S-Expresstion into a Rectangle object + + Args: + - exp (list): Part of parsed S-Expression ``(rectangle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not rectangle + + Returns: + - Rectangle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'rectangle': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if item[0] == 'start': object.start = Position().from_sexpr(item) + if item[0] == 'end': object.end = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(rectangle (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class Arc(): + """The ``Arc`` token defines a graphical arc in a schematic. + + Available since KiCad v7 + + Documentation: + - ??? + """ + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token attributes define the coordinates of the start point of the arc""" + + mid: Position = field(default_factory=lambda: Position()) + """The ``end`` token attributes define the coordinates of the mid point of the arc""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token attributes define the coordinates of the end point of the arc""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the arc outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how the arc is filled""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Arc: + """Convert the given S-Expresstion into a Arc object + + Args: + - exp (list): Part of parsed S-Expression ``(arc ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not arc + + Returns: + - Arc: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'arc': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if item[0] == 'start': object.start = Position().from_sexpr(item) + if item[0] == 'mid': object.mid = Position().from_sexpr(item) + if item[0] == 'end': object.end = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class Circle(): + """The ``Circle`` token defines a graphical circle in a schematic. + + Available since KiCad v7 + + Documentation: + - ??? + """ + + center: Position = field(default_factory=lambda: Position()) + """The ``center`` token attributes define the coordinates of the center point of the circle""" + + radius: float = 0.0 + """The ``radius`` token attributes define the radius of the circle""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the circle outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how the circle is filled""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> Circle: + """Convert the given S-Expresstion into a Circle object + + Args: + - exp (list): Part of parsed S-Expression ``(circle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not circle + + Returns: + - Circle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'circle': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if item[0] == 'center': object.center = Position().from_sexpr(item) + if item[0] == 'radius': object.radius = item[1] + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(circle (center {self.center.X} {self.center.Y}) (radius {self.radius})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class NetclassFlag(): + """The ``netclass_flag`` token defines a netclass flag in a schematic. + + Available since KiCad v7 + + Documentation: + - ??? + """ + + text: str = "" + """The ``text`` token defines the text the netclass flag""" + + length: float = 2.54 + """The ``length`` token defines the length of the netclass flag""" + + shape: str = "round" + """The ``shape`` token defines the shape of the netclass flag. Valid values are ``round``, + ``rectangle``, ``dot`` or``diamond``.""" + + position: Position = field(default_factory=lambda: Position) + """The ``position`` token defines the position and rotation of the netclass flag""" + + effects: Effects = field(default_factory=lambda: Effects) + """The ``effects`` token defines how the text is drawn""" + + properties: List[Property] = field(default_factory=list) + """The ``properties`` token defines a list of properties the netclass is assigned to""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier""" + + fieldsAutoplaced: bool = False + """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated + with the netclas flag have been place automatically""" + + @classmethod + def from_sexpr(cls, exp: list) -> NetclassFlag: + """Convert the given S-Expresstion into a Circle object + + Args: + - exp (list): Part of parsed S-Expression ``(netclass_flag ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not netclass_flag + + Returns: + - NetclassFlag: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'netclass_flag': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'length': object.length = item[1] + if item[0] == 'shape': object.shape = item[1] + if item[0] == 'at': object.position = Position.from_sexpr(item) + if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True + if item[0] == 'effects': object.effects = Effects.from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'property': object.properties.append(Property.from_sexpr(item)) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + fa = f' (fields_autoplaced)' if self.fieldsAutoplaced else '' + + expression = f'{indents}(netclass_flag "{dequote(self.text)}" (length {self.length}) (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fa}\n' + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + for property in self.properties: + expression += property.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression \ No newline at end of file diff --git a/kiutils/items/syitems.py b/kiutils/items/syitems.py new file mode 100644 index 0000000..a78cb22 --- /dev/null +++ b/kiutils/items/syitems.py @@ -0,0 +1,572 @@ +"""Symbol graphical items define all of the drawing items that are used in the symbol +definition. This includes text, text boxes, lines, rectangles, circles, arcs, polygons +and curves. + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 16.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_graphic_items +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import List, Optional + +from kiutils.items.common import Fill, Position, Stroke, Effects, Fill +from kiutils.utils.strings import dequote + +@dataclass +class SyArc(): + """The ``arc`` token defines a graphical arc in a symbol definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_arc + """ + + private: bool = False + """The ``private`` token defines if the arc is only visible in the symbol editor. Defaults + to ``False``. + + Available since KiCad v7""" + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token defines the coordinates of start point of the arc""" + + mid: Position = field(default_factory=lambda: Position()) + """The ``mid`` token defines the coordinates of mid point of the arc""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token defines the coordinates of end point of the arc""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the arc outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how the arc is filled""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyArc: + """Convert the given S-Expresstion into a SyArc object + + Args: + - exp (list): Part of parsed S-Expression ``(arc ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not arc + + Returns: + - SyArc: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'arc': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if isinstance(item, str): + if item == 'private': object.private = True + continue + if item[0] == 'start': object.start = Position().from_sexpr(item) + if item[0] == 'mid': object.mid = Position().from_sexpr(item) + if item[0] == 'end': object.end = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + startA = f' {self.start.angle}' if self.start.angle is not None else '' + midA = f' {self.mid.angle}' if self.mid.angle is not None else '' + endA = f' {self.end.angle}' if self.end.angle is not None else '' + private = ' private' if self.private else '' + + expression = f'{indents}(arc{private} (start {self.start.X} {self.start.Y}{startA}) (mid {self.mid.X} {self.mid.Y}{midA}) (end {self.end.X} {self.end.Y}{endA})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyCircle(): + """The ``circle`` token defines a graphical circle in a symbol definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_circle + """ + + private: bool = False + """The ``private`` token defines if the circle is only visible in the symbol editor. Defaults + to ``False``. + + Available since KiCad v7""" + + center: Position = field(default_factory=lambda: Position()) + """The ``center`` token defines the coordinates of center point of the circle""" + + radius: float = 0.0 + """The ``radius`` token defines the length of the radius of the circle""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the circle outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how the circle is filled""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyCircle: + """Convert the given S-Expresstion into a SyCircle object + + Args: + - exp (list): Part of parsed S-Expression ``(circle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not circle + + Returns: + - SyCircle: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'circle': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if isinstance(item, str): + if item == 'private': object.private = True + continue + if item[0] == 'center': object.center = Position().from_sexpr(item) + if item[0] == 'radius': object.radius = item[1] + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + private = ' private' if self.private else '' + + expression = f'{indents}(circle{private} (center {self.center.X} {self.center.Y}) (radius {self.radius})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyCurve(): + """The ``curve`` token defines a graphical Qubic Bezier curve. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_curve + """ + + points: List[Position] = field(default_factory=list) + """The ``points`` token defines the four X/Y coordinates of each point of the curve""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the curve outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how curve arc is filled""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyCurve: + """Convert the given S-Expresstion into a SyCurve object + + Args: + - exp (list): Part of parsed S-Expression ``(curve ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not curve + + Returns: + - SyCurve: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'curve': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'pts': + for point in item[1:]: + object.points.append(Position().from_sexpr(point)) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(curve\n' + expression = f'{indents} (pts\n' + for point in self.points: + expression = f'{indents} (xy {point.X} {point.Y})\n' + expression = f'{indents} )\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyPolyLine(): + """The ``polyline`` token defines one or more graphical lines that may or may not define a polygon. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_line + """ + + points: List[Position] = field(default_factory=list) + """The ``points`` token defines the four X/Y coordinates of each point of the polyline""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the polyline outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how polyline arc is filled""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyPolyLine: + """Convert the given S-Expresstion into a SyPolyLine object + + Args: + - exp (list): Part of parsed S-Expression ``(polyline ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not polyline + + Returns: + - SyPolyLine: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'polyline': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'pts': + for point in item[1:]: + object.points.append(Position().from_sexpr(point)) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(polyline\n' + expression += f'{indents} (pts\n' + for point in self.points: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} )\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyRect(): + """The ``rectangle`` token defines a graphical rectangle in a symbol definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_rectangle + """ + + private: bool = False + """The ``private`` token defines if the rectangle is only visible in the symbol editor. Defaults + to ``False``. + + Available since KiCad v7""" + + start: Position = field(default_factory=lambda: Position()) + """The ``start`` token attributes define the coordinates of the start point of the rectangle""" + + end: Position = field(default_factory=lambda: Position()) + """The ``end`` token attributes define the coordinates of the end point of the rectangle""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` defines how the rectangle outline is drawn""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token attributes define how rectangle arc is filled""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyRect: + """Convert the given S-Expresstion into a SyRect object + + Args: + - exp (list): Part of parsed S-Expression ``(rectangle ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not rectangle + + Returns: + - SyRect: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'rectangle': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp: + if isinstance(item, str): + if item == 'private': object.private = True + continue + if item[0] == 'start': object.start = Position().from_sexpr(item) + if item[0] == 'end': object.end = Position().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + private = ' private' if self.private else '' + + expression = f'{indents}(rectangle{private} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyText(): + """The ``text`` token defines a graphical text in a symbol definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_text + """ + + text: str = "" + """The ``text`` attribute is a quoted string that defines the text""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and rotation angle of the text""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is displayed""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyText: + """Convert the given S-Expresstion into a SyText object + + Args: + - exp (list): Part of parsed S-Expression ``(text ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not text + + Returns: + - SyText: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'text': + raise Exception("Expression does not have the correct type") + + object = cls() + object.text = exp[1] + for item in exp[2:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 6, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 6. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + + expression = f'{indents}(text "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA})\n' + expression += f'{indents} {self.effects.to_sexpr()}' + expression += f'{indents}){endline}' + return expression + +@dataclass +class SyTextBox(): + """The ``text_box`` token defines a text box inside a symbol + + Available since KiCad v7 + + Documentation: + ???? + """ + + # NOTE: This is almost the same implementation as in ``kiutils.items.schitems.TextBox`` but + # used in a different context. + + text: str = "" + """The ``text`` token defines the text string""" + + private: bool = False + """The ``private`` token defines if the text box is only visible in the symbol editor. Defaults + to ``False``.""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` token defines the X and Y coordinates and rotation angle of the text""" + + size: Position = field(default_factory=lambda: Position()) + """The ``size`` token defines the size in X and Y direction. Angle is not used.""" + + stroke: Stroke = field(default_factory=lambda: Stroke()) + """The ``stroke`` token defines the look of the outline of the text box""" + + fill: Fill = field(default_factory=lambda: Fill()) + """The ``fill`` token defines how the text box should be filled""" + + effects: Effects = field(default_factory=lambda: Effects()) + """The ``effects`` token defines how the text is drawn""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + @classmethod + def from_sexpr(cls, exp: list) -> SyTextBox: + """Convert the given S-Expresstion into a SyTextBox object + + Args: + - exp (list): Part of parsed S-Expression ``(text_box ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not text_box + + Returns: + - SyTextBox: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'text_box': + raise Exception("Expression does not have the correct type") + + object = cls() + + # Extract "private" token, if any is present + if exp[1] == "private" and not isinstance(exp[2], list): + object.private = True + object.text = exp[2] + start_at = 3 + else: + object.text = exp[1] + start_at = 2 + + for item in exp[start_at:]: + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'size': object.size = Position().from_sexpr(item) + if item[0] == 'effects': object.effects = Effects().from_sexpr(item) + if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item) + if item[0] == 'fill': object.fill = Fill().from_sexpr(item) + if item[0] == 'uuid': object.uuid = item[1] + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + posA = f' {self.position.angle}' if self.position.angle is not None else '' + private = ' private' if self.private else '' + + expression = f'{indents}(text_box{private} "{dequote(self.text)}"\n' + expression += f'{indents} (at {self.position.X} {self.position.Y}{posA}) (size {self.size.X} {self.size.Y})\n' + expression += self.stroke.to_sexpr(indent+2) + expression += self.fill.to_sexpr(indent+2) + expression += self.effects.to_sexpr(indent+2) + if self.uuid is not None: + expression += f'{indents} (uuid {self.uuid})\n' + expression += f'{indents}){endline}' + return expression \ No newline at end of file diff --git a/kiutils/items/zones.py b/kiutils/items/zones.py new file mode 100644 index 0000000..e54945f --- /dev/null +++ b/kiutils/items/zones.py @@ -0,0 +1,657 @@ +"""The zone token defines a zone on the board or footprint. Zones serve two purposes in + KiCad: filled copper zones and keep out areas. + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 11.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_graphics_items +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List + +from kiutils.items.common import Position +from kiutils.utils.strings import dequote + +@dataclass +class KeepoutSettings(): + """The ``keepout `` token attributes define which objects should be kept out of the + zone. This section only applies to keep out zones. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_keep_out_settings + """ + + tracks: str = "allowed" + """The ``tracks`` token attribute defines whether or not tracks should be excluded + from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``.""" + + vias: str = "allowed" + """The ``vias`` token attribute defines whether or not vias should be excluded from + the keep out area. Valid attributes are ``allowed`` and ``not_allowed``.""" + + pads: str = "allowed" + """The ``pads`` token attribute defines whether or not pads should be excluded from + the keep out area. Valid attributes are ``allowed`` and ``not_allowed``.""" + + copperpour: str = "not-allowed" + """The ``copperpour`` token attribute defines whether or not copper pours should be + excluded from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``.""" + + footprints: str = "not-allowed" + """The ``footprints`` token attribute defines whether or not footprints should be + excluded from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``.""" + + @classmethod + def from_sexpr(cls, exp: list) -> KeepoutSettings: + """Convert the given S-Expresstion into a KeepoutSettings object + + Args: + - exp (list): Part of parsed S-Expression ``(keepout ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not keepout + + Returns: + - KeepoutSettings: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'keepout': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + continue + + if item[0] == 'tracks': object.tracks = item[1] + if item[0] == 'vias': object.vias = item[1] + if item[0] == 'pads': object.pads = item[1] + if item[0] == 'copperpour': object.copperpour = item[1] + if item[0] == 'footprints': object.footprints = item[1] + + return object + + def to_sexpr(self, indent: int = 0, newline: bool = False) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the curve, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + # KiCad seems to add a whitespace to the pad token here + return f'{indents}(keepout (tracks {self.tracks}) (vias {self.vias}) (pads {self.pads} ) (copperpour {self.copperpour}) (footprints {self.footprints})){endline}' + +@dataclass +class FillSettings(): + """The ``fill`` token attributes define how the zone is to be filled. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_settings + """ + + yes: bool = False + """The ``yes`` token specifies if the zone should be filled. If not specified, the zone is + not filled and no additional attributes are required.""" + + mode: Optional[str] = None + """The optional ``mode`` token attribute defines how the zone is filled. The only valid fill + mode is ``hatched``. When not defined, the fill mode is solid.""" + + thermalGap: Optional[float] = None + """The optional ``thermalGap`` token attribute defines the distance from the zone to all + pad thermal relief connections to the zone.""" + + thermalBridgeWidth: Optional[float] = None + """The optional ``thermalBridgeWidth`` token attribute defines the spoke width for all + pad thermal relief connection to the zone.""" + + smoothingStyle: Optional[str] = None + """The optional ``smoothingStyle`` token attributes define the style of corner smoothing. Valid + smoothing styles are ``chamfer`` and ``fillet``""" + + smoothingRadius: Optional[float] = None + """The optional ``smoothingRadius`` token attributes define the radius of corner smoothing""" + + islandRemovalMode: Optional[int] = None + """The optional ``islandRemovalMode`` token attribute defines the island removal mode. + Valid island removal modes are: + - 0: Always remove islands. + - 1: Never remove islands. + - 2: Minimum area island to allow. + """ + + islandAreaMin: Optional[float] = None + """The optional ``islandAreaMin`` token attribute defines the minimum allowable zone + island. This only valid when the remove islands mode is set to 2.""" + + hatchThickness: Optional[float] = None + """The optional ``hatchThickness`` token attribute defines the thickness for hatched fills""" + + hatchGap: Optional[float] = None + """The optional ``hatchGap`` token attribute defines the distance between lines for hatched + fills""" + + hatchOrientation: Optional[float] = None + """The optional ``hatchOrientation`` token attribute defines the line angle for hatched fills""" + + hatchSmoothingLevel: Optional[int] = None + """The optional ``hatchSmoothingLevel`` token attribute defines how hatch outlines are + smoothed. Valid hatch smoothing levels are: + - 0: No smoothing + - 1: Fillet + - 2: Arc minimum + - 3: Arc maximum + """ + + hatchSmoothingValue: Optional[float] = None + """The optional ``hatchSmoothingValue`` token attribute defines the ratio between the hole + and the chamfer/fillet size""" + + hatchBorderAlgorithm: Optional[int] = None + """The optional ``hatchBorderAlgorithm`` token attribute defines the if the zone line + thickness is used when performing a hatch fill. Valid values for the hatch border + algorithm are: + - 0: Use zone minimum thickness. + - 1: Use hatch thickness. + """ + + hatchMinHoleArea: Optional[float] = None + """The optional ``hatchMinHoleArea`` token attribute defines the minimum area a hatch file hole can be""" + + @classmethod + def from_sexpr(cls, exp: list) -> FillSettings: + """Convert the given S-Expresstion into a FillSettings object + + Args: + - exp (list): Part of parsed S-Expression ``(fill ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fill + + Returns: + - FillSettings: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fill': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'yes': object.yes = True + else: continue + + if item[0] == 'mode': object.mode = item[1] + if item[0] == 'thermal_gap': object.thermalGap = item[1] + if item[0] == 'thermal_bridge_width': object.thermalBridgeWidth = item[1] + if item[0] == 'smoothing': object.smoothingStyle = item[1] + if item[0] == 'radius': object.smoothingRadius = item[1] + if item[0] == 'island_removal_mode': object.islandRemovalMode = item[1] + if item[0] == 'island_area_min': object.islandAreaMin = item[1] + if item[0] == 'hatch_thickness': object.hatchThickness = item[1] + if item[0] == 'hatch_gap': object.hatchGap = item[1] + if item[0] == 'hatch_orientation': object.hatchOrientation = item[1] + if item[0] == 'hatch_smoothing_level': object.hatchSmoothingLevel = item[1] + if item[0] == 'hatch_smoothing_value': object.hatchSmoothingValue = item[1] + if item[0] == 'hatch_border_algorithm': object.hatchBorderAlgorithm = item[1] + if item[0] == 'hatch_min_hole_area': object.hatchMinHoleArea = item[1] + + return object + + def to_sexpr(self, indent: int = 0, newline: bool = False) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the curve, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to False. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + yes = ' yes' if self.yes else '' + mode = f' (mode {self.mode})' if self.mode is not None else '' + smoothing = f' (smoothing {self.smoothingStyle})' if self.smoothingStyle is not None else '' + radius = f' (radius {self.smoothingRadius})' if self.smoothingRadius is not None else '' + irm = f' (island_removal_mode {self.islandRemovalMode})' if self.islandRemovalMode is not None else '' + iam = f' (island_area_min {self.islandAreaMin})' if self.islandAreaMin is not None else '' + ht = f'\n{indents} (hatch_thickness {self.hatchThickness})' if self.hatchThickness is not None else '' + hg = f' (hatch_gap {self.hatchGap})' if self.hatchGap is not None else '' + ho = f' (hatch_orientation {self.hatchOrientation})' if self.hatchOrientation is not None else '' + hsl = f'\n{indents} (hatch_smoothing_level {self.hatchSmoothingLevel})' if self.hatchSmoothingLevel is not None else '' + hsv = f' (hatch_smoothing_value {self.hatchSmoothingValue})' if self.hatchSmoothingValue is not None else '' + hba = f'\n{indents} (hatch_border_algorithm {self.hatchBorderAlgorithm})' if self.hatchBorderAlgorithm is not None else '' + hmha = f' (hatch_min_hole_area {self.hatchMinHoleArea})' if self.hatchMinHoleArea is not None else '' + + return f'{indents}(fill{yes}{mode} (thermal_gap {self.thermalGap}) (thermal_bridge_width {self.thermalBridgeWidth}){smoothing}{radius}{irm}{iam}{ht}{hg}{ho}{hsl}{hsv}{hba}{hmha}){endline}' + +@dataclass +class ZonePolygon(): + """The ``polygon`` token defines a list of coordinates that define part of a zone""" + + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` defines the list of polygon X/Y coordinates used to define the zone polygon""" + + @classmethod + def from_sexpr(cls, exp: list) -> ZonePolygon: + """Convert the given S-Expresstion into a ZonePolygon object + + Args: + - exp (list): Part of parsed S-Expression ``(polygon ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not polygon + + Returns: + - ZonePolygon: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'polygon': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + continue + if item[0] == 'pts': + for position in item[1:]: + object.coordinates.append(Position().from_sexpr(position)) + + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the polygon, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object. If the polygon has no coordinates, an empty + expression is returned. + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + expression = f'{indents}(polygon\n' + expression += f'{indents} (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} )\n' + expression += f'{indents})\n' + return expression + +@dataclass +class FilledPolygon(): + """The ``filled_polygon`` token defines the polygons used to fill a zone + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_polygons + """ + + layer: str = "F.Cu" + """The ``layer`` token attribute defines the canonical layer the zone fill resides on""" + + # TODO: What is the definiton of this token? + island: bool = False + """The ``island`` token's definition has to be defined ..""" + + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` defines the list of polygon X/Y coordinates used to fill the zone""" + + @classmethod + def from_sexpr(cls, exp: list) -> FilledPolygon: + """Convert the given S-Expresstion into a FilledPolygon object + + Args: + - exp (list): Part of parsed S-Expression ``(filled_polygon ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not filled_polygon + + Returns: + - FilledPolygon: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'filled_polygon': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + continue + + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'island': object.island = True + if item[0] == 'pts': + for position in item[1:]: + object.coordinates.append(Position().from_sexpr(position)) + + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the filled polygon, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object. If the filled polygon has no coordinates, an empty + expression is returned. + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + expression = f'{indents}(filled_polygon\n' + expression += f'{indents} (layer "{dequote(self.layer)}")\n' + if self.island: + expression += f'{indents} (island)\n' + expression += f'{indents} (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} )\n' + expression += f'{indents})\n' + return expression + +# TODO: This is KiCad 4 stuff, has to be tested yet .. +@dataclass +class FillSegments(): + """The ``fill_polygon`` token defines the segments used to fill the zone. This is only + used when loading boards prior to version 4 which filled zones with segments. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_segments + """ + + layer: str = "F.Cu" + """The ``layer`` token attribute defines the canonical layer the zone fill resides on""" + + coordinates: List[Position] = field(default_factory=list) + """The ``coordinates`` defines the list of polygon X/Y coordinates used to fill the zone.""" + + @classmethod + def from_sexpr(cls, exp: list) -> FillSegments: + """Convert the given S-Expresstion into a FillSegments object + + Args: + - exp (list): Part of parsed S-Expression ``(fill_segments ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not fill_segments + + Returns: + - FillSegments: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'fill_segments': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + continue + + if item[0] == 'layer': object.layer = item[1] + if item[0] == 'pts': + for position in item[1:]: + object.coordinates.append(Position().from_sexpr(position)) + + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object. When no coordinates are set + in the curve, the resulting S-Expression will be left empty. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object. If the fill segments has no coordinates, an empty + expression is returned. + """ + indents = ' '*indent + endline = '\n' if newline else '' + if len(self.coordinates) == 0: + return f'{indents}{endline}' + + expression = f'{indents}(fill_segments\n' + expression += f'{indents} (layer "{dequote(self.layer)}")\n' + expression += f'{indents} (pts\n' + for point in self.coordinates: + expression += f'{indents} (xy {point.X} {point.Y})\n' + expression += f'{indents} )\n' + expression += f'{indents})\n' + return expression + +@dataclass +class Hatch(): + """Data wrapper for Zone class hatching attribute""" + + style: str = "none" + """The ``style`` token defines the style of the hatching. Valid hatch styles are ``none``, ``edge`` + and ``full``""" + + pitch: float = 0.0 + """The ``pitch`` token defines the pitch of the hatch""" + +@dataclass +class Zone(): + """The ``zone`` token defines a zone on the board or footprint. Zones serve two purposes + in KiCad: filled copper zones and keep out areas. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone + + """ + locked: bool = False + """The ``locked`` token defines if the zone may be edited or not (Missing in KiCad + docu as of 11.02.2022)""" + + net: int = 0 + """The ``net`` token attribute defines by the net ordinal number which net in the nets + section that the zone is part of""" + + netName: str = "unknown" + """The ``net_name`` token attribute defines the name of the net if the zone is not a keep + out area. The net name attribute will be an empty string if the zone is a keep out area.""" + + layers: List[str] = field(default_factory=list) + """The ``layers`` token define the canonical layer set the zone connects as a list of + strings. When the zone only resides on one layer, the output of ``self.to_sexpr()`` will + change into ``(layer "xyz")`` instead of ``(layers ..)`` automatically.""" + + uuid: Optional[str] = None # Used since KiCad 6 + """The ``uuid`` token defines the unique identifier of the zone object""" + + name: Optional[str] = None + """The optional ``name`` token attribute defines the name of the zone if one has been assigned""" + + hatch: Hatch = field(default_factory=lambda: Hatch()) + """The ``hatch`` token attributes define the zone outline display hatch style and pitch""" + + priority: Optional[int] = None + """The optional ``priority`` attribute defines the zone priority if it is not zero""" + + connectPads: Optional[str] = None # This refers to CONNECTION_TYPE in the docu + """The ``connectPads`` token attributes define the pad connection type and clearance. Valid + pad connection types are ``thru_hole_only``, ``full`` and ``no``. If the pad connection type is not + defined, thermal relief pad connections are used""" + + clearance: float = 0.254 + """The ``clearance`` token defines the thermal relief for pad connections. The usage of this + token is depending on the value of ``connectPads``.""" + + minThickness: float = 0.254 + """The ``minThickness`` token attributed defines the minimum fill width allowed in the zone""" + + filledAreasThickness: Optional[str] = None + """The optional ``filledAreasThickness`` attribute no specifies if the zone like width is + not used when determining the zone fill area. This is to maintain compatibility with older + board files that included the line thickness when performing zone fills when it is not defined.""" + + keepoutSettings: Optional[KeepoutSettings] = None + """The optional ``keepoutSettings`` section defines the keep out items if the zone + defines as a keep out area""" + + fillSettings: Optional[FillSettings] = None + """The optional ``fillSettings`` section defines how the zone is to be filled""" + + polygons: List[ZonePolygon] = field(default_factory=list) + """The ``polygon`` token defines a list of zone polygons that define the shape of the zone""" + + filledPolygons: List[FilledPolygon] = field(default_factory=list) + """The ``filledPolygons`` token defines a list of filled polygons in the zone""" + + # TODO: This is KiCad 4 only stuff, needs to be tested yet .. + fillSegments: Optional[FillSegments] = None + """The optional ``fillSegments`` section defines a list of track segments used to fill + the zone""" + + @classmethod + def from_sexpr(cls, exp: list) -> Zone: + """Convert the given S-Expresstion into a Zone object + + Args: + - exp (list): Part of parsed S-Expression ``(zone ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not zone + + Returns: + - Zone: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'zone': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if type(item) != type([]): + if item == 'locked': object.locked = True + else: continue + + if item[0] == 'net': object.net = item[1] + if item[0] == 'net_name': object.netName = item[1] + if item[0] == 'layers' or item[0] == 'layer': + for layer in item[1:]: + object.layers.append(layer) + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'name': object.name = item[1] + if item[0] == 'hatch': + object.hatch = Hatch(style=item[1], pitch=item[2]) + if item[0] == 'priority': object.priority = item[1] + if item[0] == 'connect_pads': + if len(item) == 2: + object.clearance = item[1][1] + else: + object.connectPads = item[1] + object.clearance = item[2][1] + if item[0] == 'min_thickness': object.minThickness = item[1] + if item[0] == 'filled_areas_thickness': object.filledAreasThickness = item[1] + if item[0] == 'keepout': object.keepoutSettings = KeepoutSettings().from_sexpr(item) + if item[0] == 'fill': object.fillSettings = FillSettings().from_sexpr(item) + if item[0] == 'polygon': object.polygons.append(ZonePolygon().from_sexpr(item)) + if item[0] == 'filled_polygon': object.filledPolygons.append(FilledPolygon().from_sexpr(item)) + if item[0] == 'fill_segments': object.fillSegments = FillSegments().from_sexpr(item) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object. + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Raises: + - Exception: When the zone has no elements in its layer list + + Returns: + - str: S-Expression of this object. + """ + indents = ' '*indent + endline = '\n' if newline else '' + + locked = f' locked' if self.locked else '' + uuid = f' (uuid {self.uuid})' if self.uuid is not None else '' + name = f' (name "{dequote(self.name)}")' if self.name is not None else '' + contype = f' {self.connectPads}' if self.connectPads is not None else '' + fat = f' (filled_areas_thickness {self.filledAreasThickness})' if self.filledAreasThickness is not None else '' + layers, layer_token = '', '' + for layer in self.layers: + layers += f' "{dequote(layer)}"' + + if len(self.layers) == 0: + raise Exception("Zone: No layers set for this zone") + elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu": + layer_token = f' (layer{layers})' + else: + layer_token = f' (layers{layers})' + + expression = f'{indents}(zone{locked} (net {self.net}) (net_name "{dequote(self.netName)}"){layer_token}{uuid}{name} (hatch {self.hatch.style} {self.hatch.pitch})\n' + if self.priority is not None: + expression += f'{indents} (priority {self.priority})\n' + expression += f'{indents} (connect_pads{contype} (clearance {self.clearance}))\n' + expression += f'{indents} (min_thickness {self.minThickness}){fat}\n' + if self.keepoutSettings is not None: + expression += f'{indents} {self.keepoutSettings.to_sexpr()}\n' + if self.fillSettings is not None: + expression += self.fillSettings.to_sexpr(indent+2, True) + + for polygon in self.polygons: + expression += polygon.to_sexpr(indent+2) + + for polygon in self.filledPolygons: + expression += polygon.to_sexpr(indent+2) + + # TODO: This is KiKad 4 stuff... + if self.fillSegments is not None: + expression += self.fillSegments.to_sexpr() + expression += f'{indents}){endline}' + return expression diff --git a/src/kiutils/libraries.py b/kiutils/libraries.py similarity index 100% rename from src/kiutils/libraries.py rename to kiutils/libraries.py diff --git a/src/kiutils/misc/config.py b/kiutils/misc/config.py similarity index 100% rename from src/kiutils/misc/config.py rename to kiutils/misc/config.py diff --git a/src/kiutils/schematic.py b/kiutils/schematic.py similarity index 100% rename from src/kiutils/schematic.py rename to kiutils/schematic.py diff --git a/src/kiutils/symbol.py b/kiutils/symbol.py similarity index 100% rename from src/kiutils/symbol.py rename to kiutils/symbol.py diff --git a/src/kiutils/utils/sexpr.py b/kiutils/utils/sexpr.py similarity index 100% rename from src/kiutils/utils/sexpr.py rename to kiutils/utils/sexpr.py diff --git a/src/kiutils/utils/strings.py b/kiutils/utils/strings.py similarity index 100% rename from src/kiutils/utils/strings.py rename to kiutils/utils/strings.py diff --git a/src/kiutils/wks.py b/kiutils/wks.py similarity index 100% rename from src/kiutils/wks.py rename to kiutils/wks.py diff --git a/libraries.py b/libraries.py new file mode 100644 index 0000000..9098613 --- /dev/null +++ b/libraries.py @@ -0,0 +1,216 @@ +"""Classes to manage KiCad footprint and symbol library tables + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 19.02.2022 - created +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List +from os import path + +from kiutils.utils.strings import dequote +from kiutils.utils import sexpr + +@dataclass +class Library(): + """The ``library`` token defines either a symbol library or a footprint library in + a library table file (``fp_lib_table`` or ``sym_lib_table``)""" + + name: str = "" + """The ``name`` token defines the name of the library as displayed in the project""" + + type: str = "KiCad" + """The ``type`` token defines the type of the library, usually ``KiCad``""" + + uri: str = "" + """The ``uri`` token defines the path to the library files""" + + options: str = "" + """The ``options`` token (..) TBD""" + + description: str = "" + """The ``description`` token (..) TBD""" + + active: bool = True + """The ``active`` token sets if the library is loaded by KiCad""" + + @classmethod + def from_sexpr(cls, exp: list) -> Library: + """Convert the given S-Expresstion into a Library object + + Args: + - exp (list): Part of parsed S-Expression ``(lib ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not lib + + Returns: + - Library: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'lib': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'name': object.name = item[1] + if item[0] == 'type': object.type = item[1] + if item[0] == 'uri': object.uri = item[1] + if item[0] == 'options': object.options = item[1] + if item[0] == 'descr': object.description = item[1] + if item[0] == 'disabled': object.active = False + return object + + def to_sexpr(self, indent=2, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(lib ' + expression += f'(name "{dequote(self.name)}")' + expression += f'(type "{dequote(self.type)}")' + expression += f'(uri "{dequote(self.uri)}")' + expression += f'(options "{dequote(self.options)}")' + expression += f'(descr "{dequote(self.description)}")' + + if not self.active: + expression += '(disabled)' + + expression += f'){endline}' + + return expression + +@dataclass +class LibTable(): + """The ``libtable`` token defines the ``fp_lib_table`` or ``sym_lib_table`` file of KiCad""" + + type: str = 'sym_lib_table' + """The ``type`` token defines the type of the library table. Valid values are ``fp_lib_table`` or + ``sym_lib_table``.""" + + libs: List[Library] = field(default_factory=list) + """The ``libs`` token holds a list of librarys that this library table object holds""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the library file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_sexpr(cls, exp: list) -> LibTable: + """Convert the given S-Expresstion into a LibTable object + + Args: + - exp (list): Part of parsed S-Expression ``(sym_lib_table ...)`` or ``(fp_lib_table ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not lib + + Returns: + - LibTable: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if not (exp[0] == 'fp_lib_table' or exp[0] == 'sym_lib_table'): + raise Exception("Expression does not have the correct type") + + object = cls() + object.type = exp[0] + for item in exp: + if item[0] == 'lib': object.libs.append(Library().from_sexpr(item)) + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> LibTable: + """Load a library table directly from a KiCad library table file and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - LibTable: Object of the LibTable class initialized with the given KiCad library table + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + item = cls.from_sexpr(sexpr.parse_sexp(infile.read())) + item.filePath = filepath + return item + + @classmethod + def create_new(cls, type: str = 'sym_lib_table') -> LibTable: + """Creates a new empty library table with its attributes set as KiCad would create it + + Args: + - type (str): ``fp_lib_table`` or ``sym_lib_table``. Defaults to the latter. + + Returns: + - Library: Empty library table of given type + """ + return cls(type=type) + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}({self.type}\n' + for lib in self.libs: + expression += lib.to_sexpr() + expression += f'{indents}){endline}' + return expression \ No newline at end of file diff --git a/misc/config.py b/misc/config.py new file mode 100644 index 0000000..eb24416 --- /dev/null +++ b/misc/config.py @@ -0,0 +1,17 @@ +"""Configuration variables + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 19.09.2022 - created +""" + +KIUTILS_CREATE_NEW_VERSION_STR = '20211014' +"""Version string used in ``create_new()`` class functions""" + +KIUTILS_CREATE_NEW_GENERATOR_STR = 'kiutils' +"""Generator string used in ``create_new()`` class functions""" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index fa7093a..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build-system] -requires = ["setuptools>=42"] -build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index f619bd4..0000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,5 +0,0 @@ -jinja2 -setuptools -sphinx -sphinx-rtd-theme -build \ No newline at end of file diff --git a/schematic.py b/schematic.py new file mode 100644 index 0000000..a3396ff --- /dev/null +++ b/schematic.py @@ -0,0 +1,351 @@ +"""Class to manage KiCad schematics + +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 19.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/ +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List, Union +from os import path + +from kiutils.items.common import Image, PageSettings, TitleBlock +from kiutils.items.schitems import * +from kiutils.symbol import Symbol +from kiutils.utils import sexpr +from kiutils.misc.config import KIUTILS_CREATE_NEW_GENERATOR_STR, KIUTILS_CREATE_NEW_VERSION_STR + +@dataclass +class Schematic(): + """The ``schematic`` token represents a KiCad schematic as defined by the schematic file format + + Documenatation: + https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/ + """ + + version: str = KIUTILS_CREATE_NEW_VERSION_STR + """The ``version`` token attribute defines the schematic version using the YYYYMMDD date format""" + + generator: str = KIUTILS_CREATE_NEW_GENERATOR_STR + """The ``generator`` token attribute defines the program used to write the file""" + + uuid: Optional[str] = None + """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``""" + + paper: PageSettings = field(default_factory=lambda: PageSettings()) + """The ``paper`` token defines the drawing page size and orientation""" + + titleBlock: Optional[TitleBlock] = None + """The ``titleBlock`` token defines author, date, revision, company and comments of the schematic""" + + libSymbols: List[Symbol] = field(default_factory=list) + """The ``libSymbols`` token defines a list of symbols that are used in the schematic""" + + schematicSymbols: List[SchematicSymbol] = field(default_factory=list) + """The ``schematicSymbols`` token defines a list of instances of symbols used in the schematic""" + + junctions: List[Junction] = field(default_factory=list) + """The ``junctions`` token defines a list of junctions used in the schematic""" + + noConnects: List[NoConnect] = field(default_factory=list) + """The ``noConnect`` token defines a list of no_connect markers used in the schematic""" + + busEntries: List[BusEntry] = field(default_factory=list) + """The ``busEntries`` token defines a list of bus_entry used in the schematic""" + + busAliases: List[BusAlias] = field(default_factory=list) + """The ``busAliases`` token defines a list of bus_alias used in the schematic""" + + graphicalItems: List[Union[Connection, PolyLine]] = field(default_factory=list) + """The ``graphicalItems`` token defines a list of ``bus``, ``wire`` or ``polyline`` elements + used in the schematic""" + + shapes: List[Union[Arc, Circle, Rectangle]] = field(default_factory=list) + """The ``shapes`` token defines a list of graphical shapes (``Arc``, ``Rectangle`` or + ``Circle``) used in the schematic. + + Available since KiCad v7""" + + images: List[Image] = field(default_factory=list) + """The ``images`` token defines a list of images used in the schematic""" + + texts: List[Text] = field(default_factory=list) + """The ``text`` token defines a list of texts used in the schematic""" + + textBoxes: List[TextBox] = field(default_factory=list) + """The ``text_box`` token defines a list of text boxes used in the schematic""" + + labels: List[LocalLabel] = field(default_factory=list) + """The ``labels`` token defines a list of local labels used in the schematic""" + + globalLabels: List[GlobalLabel] = field(default_factory=list) + """The ``globalLabels`` token defines a list of global labels used in the schematic""" + + hierarchicalLabels: List[HierarchicalLabel] = field(default_factory=list) + """The ``herarchicalLabels`` token defines a list of hierarchical labels used in the schematic""" + + netclassFlags: List[NetclassFlag] = field(default_factory=list) + """The ``netclassFlags`` token defines a list of netclass flags used in the schematic. + + Available since KiCad v7""" + + sheets: List[HierarchicalSheet] = field(default_factory=list) + """The ``sheets`` token defines a list of hierarchical sheets used in the schematic""" + + sheetInstances: List[HierarchicalSheetInstance] = field(default_factory=list) + """The ``sheetInstances`` token defines a list of instances of hierarchical sheets used in + the schematic""" + + symbolInstances: List[SymbolInstance] = field(default_factory=list) + """The ``symbolInstances`` token defines a list of instances of symbols from ``libSymbols`` token + used in the schematic""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the schematic file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_sexpr(cls, exp: list) -> Schematic: + """Convert the given S-Expresstion into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(kicad_sch ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not kicad_sch + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'kicad_sch': + raise Exception("Expression does not have the correct type") + + object = cls() + for item in exp: + if item[0] == 'version': object.version = item[1] + if item[0] == 'generator': object.generator = item[1] + if item[0] == 'uuid': object.uuid = item[1] + if item[0] == 'paper': object.paper = PageSettings().from_sexpr(item) + if item[0] == 'title_block': object.titleBlock = TitleBlock().from_sexpr(item) + if item[0] == 'lib_symbols': + for symbol in item[1:]: + object.libSymbols.append(Symbol().from_sexpr(symbol)) + if item[0] == 'junction': object.junctions.append(Junction().from_sexpr(item)) + if item[0] == 'no_connect': object.noConnects.append(NoConnect().from_sexpr(item)) + if item[0] == 'bus_entry': object.busEntries.append(BusEntry().from_sexpr(item)) + if item[0] == 'bus_alias': object.busAliases.append(BusAlias().from_sexpr(item)) + if item[0] == 'wire': object.graphicalItems.append(Connection().from_sexpr(item)) + if item[0] == 'bus': object.graphicalItems.append(Connection().from_sexpr(item)) + if item[0] == 'polyline': object.graphicalItems.append(PolyLine().from_sexpr(item)) + if item[0] == 'arc': object.shapes.append(Arc.from_sexpr(item)) + if item[0] == 'circle': object.shapes.append(Circle.from_sexpr(item)) + if item[0] == 'rectangle': object.shapes.append(Rectangle.from_sexpr(item)) + if item[0] == 'image': object.images.append(Image().from_sexpr(item)) + if item[0] == 'text': object.texts.append(Text().from_sexpr(item)) + if item[0] == 'text_box': object.textBoxes.append(TextBox().from_sexpr(item)) + if item[0] == 'label': object.labels.append(LocalLabel().from_sexpr(item)) + if item[0] == 'global_label': object.globalLabels.append(GlobalLabel().from_sexpr(item)) + if item[0] == 'hierarchical_label': object.hierarchicalLabels.append(HierarchicalLabel().from_sexpr(item)) + if item[0] == 'netclass_flag': object.netclassFlags.append(NetclassFlag.from_sexpr(item)) + if item[0] == 'symbol': object.schematicSymbols.append(SchematicSymbol().from_sexpr(item)) + if item[0] == 'sheet': object.sheets.append(HierarchicalSheet().from_sexpr(item)) + if item[0] == 'sheet_instances': + for instance in item[1:]: + object.sheetInstances.append(HierarchicalSheetInstance().from_sexpr(instance)) + if item[0] == 'symbol_instances': + for instance in item[1:]: + object.symbolInstances.append(SymbolInstance().from_sexpr(instance)) + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Schematic: + """Load a schematic directly from a KiCad schematic file (`.kicad_sch`) and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - Schematic: Object of the Schematic class initialized with the given KiCad schematic + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + item = cls.from_sexpr(sexpr.parse_sexp(infile.read())) + item.filePath = filepath + return item + + @classmethod + def create_new(cls) -> Schematic: + """Creates a new empty schematic page with its attributes set as KiCad would create it + + Returns: + - Schematic: Empty schematic + """ + schematic = cls( + version = KIUTILS_CREATE_NEW_VERSION_STR, + generator = KIUTILS_CREATE_NEW_GENERATOR_STR + ) + schematic.sheetInstances.append(HierarchicalSheetInstance(instancePath='/', page='1')) + return schematic + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(kicad_sch (version {self.version}) (generator {self.generator})\n' + if self.uuid is not None: + expression += f'\n{indents} (uuid {self.uuid})\n\n' + expression += f'{self.paper.to_sexpr(indent+2)}' + if self.titleBlock is not None: + expression += f'\n{self.titleBlock.to_sexpr(indent+2)}' + + if self.libSymbols: + expression += f'\n{indents} (lib_symbols' + for item in self.libSymbols: + expression += '\n' + expression += item.to_sexpr(indent+4) + expression += f'{indents} )\n' + else: + expression += f'{indents} (lib_symbols)\n' + + if self.junctions: + expression += '\n' + for item in self.junctions: + expression += item.to_sexpr(indent+2) + + if self.noConnects: + expression += '\n' + for item in self.noConnects: + expression += item.to_sexpr(indent+2) + + if self.busEntries: + expression += '\n' + for item in self.busEntries: + expression += item.to_sexpr(indent+2) + + if self.busAliases: + expression += '\n' + for item in self.busAliases: + expression += item.to_sexpr(indent+2) + + if self.graphicalItems: + expression += '\n' + for item in self.graphicalItems: + expression += item.to_sexpr(indent+2) + + if self.shapes: + expression += '\n' + for item in self.shapes: + expression += item.to_sexpr(indent+2) + + if self.images: + expression += '\n' + for item in self.images: + expression += item.to_sexpr(indent+2) + + if self.textBoxes: + expression += '\n' + for item in self.textBoxes: + expression += item.to_sexpr(indent+2) + + if self.texts: + expression += '\n' + for item in self.texts: + expression += item.to_sexpr(indent+2) + + if self.labels: + expression += '\n' + for item in self.labels: + expression += item.to_sexpr(indent+2) + + if self.globalLabels: + expression += '\n' + for item in self.globalLabels: + expression += item.to_sexpr(indent+2) + + if self.hierarchicalLabels: + expression += '\n' + for item in self.hierarchicalLabels: + expression += item.to_sexpr(indent+2) + + if self.netclassFlags: + expression += '\n' + for item in self.netclassFlags: + expression += item.to_sexpr(indent+2) + + if self.schematicSymbols: + for item in self.schematicSymbols: + expression += '\n' + expression += item.to_sexpr(indent+2) + + if self.sheets: + for item in self.sheets: + expression += '\n' + expression += item.to_sexpr(indent+2) + + if self.sheetInstances: + expression += '\n' + expression += ' (sheet_instances\n' + for item in self.sheetInstances: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + + if self.symbolInstances: + expression += '\n' + expression += ' (symbol_instances\n' + for item in self.symbolInstances: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + + expression += f'{indents}){endline}' + return expression diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 4cefcc4..0000000 --- a/setup.cfg +++ /dev/null @@ -1,30 +0,0 @@ -[metadata] -name = kiutils -version = 1.4.8 -author = Marvin Mager -author_email = 99667992+mvnmgrx@users.noreply.github.com -description = Simple and SCM-friendly KiCad file parser for KiCad 6.0 and up -long_description = file: README.md -long_description_content_type = text/markdown -url = https://github.com/mvnmgrx/kiutils -project_urls = - Bug Tracker = https://github.com/mvnmgrx/kiutils/issues -classifiers = - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - License :: OSI Approved :: GNU General Public License v3 (GPLv3) - Operating System :: OS Independent - Development Status :: 5 - Production/Stable - Natural Language :: English - Topic :: Scientific/Engineering :: Electronic Design Automation (EDA) - -[options] -package_dir = - = src -python_requires = >=3.7 - -[options.packages.find] -where = src diff --git a/setup.py b/setup.py deleted file mode 100644 index c017ce1..0000000 --- a/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Setup script for kiutils - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -from setuptools import setup - -if __name__ == '__main__': - setup() diff --git a/symbol.py b/symbol.py new file mode 100644 index 0000000..022a229 --- /dev/null +++ b/symbol.py @@ -0,0 +1,592 @@ +""" +Author: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 + +Major changes: + 14.02.2022 - created + +Documentation taken from: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbols +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Optional, List +from os import path +import re + +from kiutils.items.common import Effects, Position, Property, Font +from kiutils.items.syitems import * +from kiutils.utils import sexpr +from kiutils.utils.strings import dequote +from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR + +@dataclass +class SymbolAlternativePin(): + pinName: str = "" + """The ``pinName`` token defines the name of the alternative pin function""" + + electricalType: str = "input" + """The ``electricalType`` defines the pin electrical connection. See symbol documentation for + valid pin electrical connection types and descriptions.""" + + graphicalStyle: str = "line" + """The ``graphicalStyle`` defines the graphical style used to draw the pin. See symbol + documentation for valid pin graphical styles and descriptions.""" + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolAlternativePin: + """Convert the given S-Expresstion into a SymbolAlternativePin object + + Args: + - exp (list): Part of parsed S-Expression ``(alternate ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not alternate + + Returns: + - SymbolAlternativePin: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'alternate': + raise Exception("Expression does not have the correct type") + + object = cls() + object.pinName = exp[1] + object.electricalType = exp[2] + object.graphicalStyle = exp[3] + return object + + def to_sexpr(self, indent: int = 8, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 8. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + return f'{indents}(alternate "{dequote(self.pinName)}" {self.electricalType} {self.graphicalStyle}){endline}' + +@dataclass +class SymbolPin(): + """The ``pin`` token defines a pin in a symbol definition. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_pin + """ + + electricalType: str = "input" + """The ``electricalType`` defines the pin electrical connection. See documentation below for + valid pin electrical connection types and descriptions.""" + + graphicalStyle: str = "line" + """The ``graphicalStyle`` defines the graphical style used to draw the pin. See documentation + below for valid pin graphical styles and descriptions.""" + + position: Position = field(default_factory=lambda: Position()) + """The ``position`` defines the X and Y coordinates and rotation angle of the connection point + of the pin relative to the symbol origin position""" + + length: float = 0.254 + """The ``length`` token attribute defines the LENGTH of the pin""" + + name: str = "" + """The ``name`` token defines a string containing the name of the pin""" + + nameEffects: Optional[Effects] = None + """The optional ``nameEffects`` token define how the pin's name is displayed. This token is + mandatory for KiCad v6 and was made optional since KiCad v7.""" + + number: str = "0" + """The ``number`` token defines a string containing the NUMBER of the pin""" + + numberEffects: Optional[Effects] = None + """The optional ``numberEffects`` token define how the pin's number is displayed. This token is + mandatory for KiCad v6 and was made optional since KiCad v7.""" + + hide: bool = False # Missing in documentation + """The 'hide' token defines if the pin should be hidden""" + + alternatePins: List[SymbolAlternativePin] = field(default_factory=list) + """The 'alternate' token defines one or more alternative definitions for the symbol pin""" + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolPin: + """Convert the given S-Expresstion into a SymbolPin object + + Args: + - exp (list): Part of parsed S-Expression ``(pin ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not pin + + Returns: + - SymbolPin: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'pin': + raise Exception("Expression does not have the correct type") + + object = cls() + object.electricalType = exp[1] + object.graphicalStyle = exp[2] + for item in exp[3:]: + if type(item) != type([]): + if item == 'hide': object.hide = True + else: continue + if item[0] == 'at': object.position = Position().from_sexpr(item) + if item[0] == 'length': object.length = item[1] + if item[0] == 'name': + object.name = item[1] + if len(item) > 2: + object.nameEffects = Effects().from_sexpr(item[2]) + if item[0] == 'number': + object.number = item[1] + if len(item) > 2: + object.numberEffects = Effects().from_sexpr(item[2]) + if item[0] == 'alternate': object.alternatePins.append(SymbolAlternativePin().from_sexpr(item)) + return object + + def to_sexpr(self, indent: int = 4, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 4. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + newLineAdded = False + + hide = ' hide' if self.hide else '' + posA = f' {self.position.angle}' if self.position.angle is not None else '' + nameEffects = f' {self.nameEffects.to_sexpr(newline=False)}' if self.nameEffects is not None else '' + numberEffects = f' {self.numberEffects.to_sexpr(newline=False)}' if self.numberEffects is not None else '' + + expression = f'{indents}(pin {self.electricalType} {self.graphicalStyle} (at {self.position.X} {self.position.Y}{posA}) (length {self.length}){hide}' + + # Since KiCad v7 nightly: Missing name and number effects print both other tokens into + # the same line. + # Constrained in: schematic/since_v7/test_symbolPinOptionalTokens + if self.nameEffects is None and self.numberEffects is None: + expression += f' (name "{dequote(self.name)}") (number "{dequote(self.number)}")' + else: + expression += f'\n{indents} (name "{dequote(self.name)}"{nameEffects})\n' + expression += f'{indents} (number "{dequote(self.number)}"{numberEffects})\n' + newLineAdded = True + + # Alternative pins always generate a line break + if self.alternatePins: + if not newLineAdded: + expression += '\n' + newLineAdded = True + for alternativePin in self.alternatePins: + expression += alternativePin.to_sexpr(indent+2) + + if newLineAdded: + expression += f'{indents}){endline}' + else: + expression += f'){endline}' + return expression + +@dataclass +class Symbol(): + """The ``symbol`` token defines a symbol or sub-unit of a parent symbol. There can be zero or more + ``symbol`` tokens in a symbol library file. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbols + """ + + """Each symbol must have """ + @property + def libId(self) -> str: + """The ``lib_id`` token defines a unique "LIBRARY_ID" for each top level symbol in the + library or a unique "UNIT_ID" for each unit embedded in a parent symbol. Library identifiers + are only valid it top level symbols and unit identifiers are on valid as unit symbols inside + a parent symbol. + + The following conventions apply: + - "LIBRARY_ID" (top-level symbol): ``[:]`` (the library + nickname part is optional here) + - "UNIT_ID" (child symbol): ``__`` + + In ``kiutils``, the ``lib_id`` token is a combination of ``libraryNickname``, ``entryName``, + ``unitId`` and ``styleId`` tokens. Setting the ``lib_id`` token will update all those tokens + accordingly. + + Returns: + - If the ``libraryNickname`` is set: ``:`` + - If the ``libraryNickname`` is ``None``: ```` or ``__``, + depending if these tokens are set. + """ + if (self.unitId is not None and self.styleId is not None): + unit_style_ids = f"_{self.unitId}_{self.styleId}" + else: + unit_style_ids = "" + + if self.libraryNickname: + return f'{self.libraryNickname}:{self.entryName}' + else: + return f'{self.entryName}{unit_style_ids}' + + @libId.setter + def libId(self, symbol_id: str): + """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname``, + ``entryName``, ``unitId`` and ``styleId`` token. + + See self.libId property description for more information. + + Args: + - symbol_id (str): The symbol id in the following format: ``:``, + ``__`` or only ````, depending on if the symbol + is a top-level symbol or a child symbol + + Raises: + - Exception: If the given ID is neither a top-level nor a child symbol + """ + # Try to parse the given ID + parse_symbol_id = re.match(r"^(.+?):(.+?)$", symbol_id) + if parse_symbol_id: + # The symbol is a top-level symbol with a library nickname + self.libraryNickname = parse_symbol_id.group(1) + self.entryName = parse_symbol_id.group(2) + self.unitId = None + self.styleId = None + else: + parse_symbol_id = re.match(r"^(.+?)_(\d+?)_(\d+?)$", symbol_id) + if parse_symbol_id: + # The symbol is a child symbol + self.libraryNickname = None + self.entryName = parse_symbol_id.group(1) + self.unitId = int(parse_symbol_id.group(2)) + self.styleId = int(parse_symbol_id.group(3)) + else: + # The symbol is a top-level symbol without a library nickname + self.libraryNickname = None + self.entryName = symbol_id + self.unitId = None + self.styleId = None + + # Update units id to match parent id + for unit in self.units: + unit.entryName = self.entryName + + libraryNickname: Optional[str] = None + """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to + and is a part of the ``id`` token""" + + entryName: str = None + """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id`` + token""" + + unitId: Optional[int] = None + """The ``unitId`` token identifies which unit the symbol represents and is a part of + the ``id`` token""" + + styleId: Optional[int] = None + """The ``styleId`` token indicates which body style the unit represents and is a part of the + ``id`` token""" + + extends: Optional[str] = None + """The optional ``extends`` token attribute defines the "LIBRARY_ID" of another symbol inside the + current library from which to derive a new symbol. Extended symbols currently can only have + different symbol properties than their parent symbol.""" + + hidePinNumbers: bool = False + """The ``pin_numbers`` token defines the visibility setting of the symbol pin numbers for + the entire symbol. If set to False, the all of the pin numbers in the symbol are visible.""" + + pinNames: bool = False + """The optional ``pinNames`` token defines the attributes for all of the pin names of the symbol. + If the ``pinNames`` token is not defined, all symbol pins are shown with the default offset.""" + + pinNamesHide: bool = False + """The optional ``pinNamesOffset`` token defines the pin name of all pins should be hidden""" + + pinNamesOffset: Optional[float] = None + """The optional ``pinNamesOffset`` token defines the pin name offset for all pin names of the + symbol. If not defined, the pin name offset is 0.508mm (0.020")""" + + inBom: Optional[bool] = None + """The optional ``inBom`` token, defines if a symbol is to be include in the bill of material + output. If undefined, the token will not be generated in `self.to_sexpr()`.""" + + onBoard: Optional[bool] = None + """The ``onBoard`` token, defines if a symbol is to be exported from the schematic to the printed + circuit board. If undefined, the token will not be generated in `self.to_sexpr()`.""" + + # TODO: Describe this token + isPower: bool = False # Missing in documentation, added when "Als Spannungssymbol" is checked + """The ``isPower`` token's documentation was not done yet ..""" + + properties: List[Property] = field(default_factory=list) + """The ``properties`` is a list of properties that define the symbol. The following properties are + mandatory when defining a parent symbol: "Reference", "Value", "Footprint", and "Datasheet". + All other properties are optional. Unit symbols cannot have any properties.""" + + graphicItems: List = field(default_factory=list) + """The ``graphicItems`` section is list of graphical arcs, circles, curves, lines, polygons, + rectangles, text and text boxes that define the symbol drawing. Possible items are defined in + ``kiutils.items.syitems``. This section can be empty if the symbol has no graphical items.""" + + pins: List[SymbolPin] = field(default_factory=list) + """The ``pins`` section is a list of pins that are used by the symbol. This section can be empty if + the symbol does not have any pins.""" + + units: List[Symbol] = field(default_factory=list) + """The ``units`` can be one or more child symbol tokens embedded in a parent symbol""" + + @classmethod + def from_sexpr(cls, exp: list) -> Symbol: + """Convert the given S-Expression into a Symbol object + + Args: + - exp (list): Part of parsed S-Expression ``(symbol ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not symbol + + Returns: + - Symbol: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'symbol': + raise Exception("Expression does not have the correct type") + + object = cls() + object.libId = exp[1] + for item in exp[2:]: + if item[0] == 'extends': object.extends = item[1] + if item[0] == 'pin_numbers': + if item[1] == 'hide': + object.hidePinNumbers = True + if item[0] == 'pin_names': + object.pinNames = True + for property in item[1:]: + if type(property) == type([]): + if property[0] == 'offset': object.pinNamesOffset = property[1] + else: + if property == 'hide': object.pinNamesHide = True + if item[0] == 'in_bom': object.inBom = True if item[1] == 'yes' else False + if item[0] == 'on_board': object.onBoard = True if item[1] == 'yes' else False + if item[0] == 'power': object.isPower = True + + if item[0] == 'symbol': object.units.append(Symbol().from_sexpr(item)) + if item[0] == 'property': object.properties.append(Property().from_sexpr(item)) + + if item[0] == 'pin': object.pins.append(SymbolPin().from_sexpr(item)) + if item[0] == 'arc': object.graphicItems.append(SyArc().from_sexpr(item)) + if item[0] == 'circle': object.graphicItems.append(SyCircle().from_sexpr(item)) + if item[0] == 'curve': object.graphicItems.append(SyCurve().from_sexpr(item)) + if item[0] == 'polyline': object.graphicItems.append(SyPolyLine().from_sexpr(item)) + if item[0] == 'rectangle': object.graphicItems.append(SyRect().from_sexpr(item)) + if item[0] == 'text': object.graphicItems.append(SyText().from_sexpr(item)) + if item[0] == 'text_box': object.graphicItems.append(SyTextBox().from_sexpr(item)) + + return object + + @classmethod + def create_new(cls, id: str, reference: str, value: str, + footprint: str = "", datasheet: str = "") -> Symbol: + """Creates a new empty symbol as KiCad would create it + + Args: + - id (str): ID token of the symbol + - reference (str): Reference designator + - value (str): Value of the ``value`` property + - footprint (str): Value of the ``footprint`` property. Defaults to "" (empty string). + - datasheet (str): Value of the ``datasheet`` property. Defaults to "" (empty string). + + Returns: + - Symbol: New symbol initialized with default values + """ + symbol = cls() + symbol.inBom = True + symbol.onBoard = True + symbol.libId = id + symbol.properties.extend( + [ + Property(key = "Reference", value = reference, id = 0, + effects = Effects(font=Font(width=1.27, height=1.27))), + Property(key = "Value", value = value, id = 1, + effects = Effects(font=Font(width=1.27, height=1.27))), + Property(key = "Footprint", value = footprint, id = 2, + effects = Effects(font=Font(width=1.27, height=1.27), hide=True)), + Property(key = "Datasheet", value = datasheet, id = 3, + effects = Effects(font=Font(width=1.27, height=1.27), hide=True)) + ] + ) + return symbol + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + obtext, ibtext = '', '' + + if self.inBom is not None: + ibtext = 'yes' if self.inBom else 'no' + inbom = f' (in_bom {ibtext})' if self.inBom is not None else '' + if self.onBoard is not None: + obtext = 'yes' if self.onBoard else 'no' + onboard = f' (on_board {obtext})' if self.onBoard is not None else '' + power = f' (power)' if self.isPower else '' + pnhide = f' hide' if self.pinNamesHide else '' + pnoffset = f' (offset {self.pinNamesOffset})' if self.pinNamesOffset is not None else '' + pinnames = f' (pin_names{pnoffset}{pnhide})' if self.pinNames else '' + pinnumbers = f' (pin_numbers hide)' if self.hidePinNumbers else '' + extends = f' (extends "{dequote(self.extends)}")' if self.extends is not None else '' + + expression = f'{indents}(symbol "{dequote(self.libId)}"{extends}{power}{pinnumbers}{pinnames}{inbom}{onboard}\n' + for item in self.properties: + expression += item.to_sexpr(indent+2) + for item in self.graphicItems: + expression += item.to_sexpr(indent+2) + for item in self.pins: + expression += item.to_sexpr(indent+2) + for item in self.units: + expression += item.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class SymbolLib(): + """A symbol library defines the common format of ``.kicad_sym`` files. A symbol library may contain + zero or more symbols. + + Documentation: + https://dev-docs.kicad.org/en/file-formats/sexpr-symbol-lib/ + """ + version: str = KIUTILS_CREATE_NEW_VERSION_STR + """The ``version`` token attribute defines the symbol library version using the YYYYMMDD date format""" + + generator: Optional[str] = None + """The ``generator`` token attribute defines the program used to write the file""" + + symbols: List[Symbol] = field(default_factory=list) + """The ``symbols`` token defines a list of zero or more symbols that are part of the symbol library""" + + filePath: Optional[str] = None + """The ``filePath`` token defines the path-like string to the library file. Automatically set when + ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters.""" + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None) -> SymbolLib: + """Load a symbol library directly from a KiCad footprint file (`.kicad_sym`) and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - SymbolLib: Object of the SymbolLib class initialized with the given KiCad symbol library + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + item = cls.from_sexpr(sexpr.parse_sexp(infile.read())) + item.filePath = filepath + return item + + @classmethod + def from_sexpr(cls, exp: list) -> SymbolLib: + """Convert the given S-Expresstion into a SymbolLib object + + Args: + - exp (list): Part of parsed S-Expression ``(kicad_symbol_lib ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not kicad_symbol_lib + + Returns: + - SymbolLib: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'kicad_symbol_lib': + raise Exception("Expression does not have the correct type") + + object = cls() + + for item in exp[1:]: + if item[0] == 'version': object.version = item[1] + if item[0] == 'generator': object.generator = item[1] + if item[0] == 'symbol': object.symbols.append(Symbol().from_sexpr(item)) + return object + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent: int = 0, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(kicad_symbol_lib (version {self.version}) (generator {self.generator})\n' + for item in self.symbols: + expression += f'{indents}{item.to_sexpr(indent+2)}' + expression += f'{indents}){endline}' + return expression diff --git a/test.py b/test.py deleted file mode 100644 index 7daeb33..0000000 --- a/test.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Some simple tests for the classes that read and write to files - -Author: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" -import unittest - -import os -import sys - -PROJECT_PATH = os.getcwd() -SOURCE_PATH = os.path.join( - PROJECT_PATH, "src" -) -sys.path.append(SOURCE_PATH) - -from tests.test_board import * -from tests.test_designrules import * -from tests.test_footprint import * -from tests.test_libtable import * -from tests.test_schematic import * -from tests.test_symbol import * -from tests.test_worksheets import * -from tests.test_misc import * -from tests.reporter.runner import HTMLTestRunner - -if __name__ == "__main__": - unittest.main(testRunner=HTMLTestRunner( - combine_reports = True, - verbosity = 3, - report_title = 'KiUtils Unittest Report', - report_name = 'KiUtils_Testreport', - open_in_browser = True - )) \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index bc4689a..0000000 --- a/tests/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Initialization of kiutils tests - -Author: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import os -import sys - -PROJECT_PATH = os.getcwd() -SOURCE_PATH = os.path.join( - PROJECT_PATH, "src" -) -sys.path.append(SOURCE_PATH) diff --git a/tests/reporter/README.md b/tests/reporter/README.md deleted file mode 100644 index 5a59f2e..0000000 --- a/tests/reporter/README.md +++ /dev/null @@ -1,208 +0,0 @@ -# KiUtils HTML Reporter - -This is a custom version of [oldani/HtmlTestRunner](https://github.com/oldani/HtmlTestRunner). It was modified -to fit `kiutils`'s testing framework. Credits go to the original author. - -Original author: Ordanis Sanchez - @oldani -Release when forked: v1.2.1 - September 2019 - -# HtmlTestRunner - - -[![Pypi link](https://img.shields.io/pypi/v/html-testRunner.svg)](https://pypi.python.org/pypi/html-testRunner) -[![Travis job](https://img.shields.io/travis/oldani/HtmlTestRunner.svg)](https://travis-ci.org/oldani/HtmlTestRunner) - -HtmlTest runner is a unittest test runner that saves results in a human-readable HTML format. - -This Package was inspired by ``unittest-xml-reporting`` and -``HtmlTestRunner by tungwaiyip`` and began by combining the methodology of the former with the functionality of the latter. - -## Table of Content - -- [Intallation](#installation) -- [Usage](#usage) -- [Console Output](#console-output) -- [Test Results](#test-result) -- [Todo](#todo) -- [Contributing](#contributing) -- [Credits](#credits) - -## Installation - - -To install HtmlTestRunner, run this command in your terminal: - -```batch -$ pip install html-testRunner -``` - -This is the preferred method to install HtmlTestRunner, as it will always install the most recent stable release. -If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide -you through the process. - - -## Usage: - -### With unittest.main() - -```python - -import HtmlTestRunner -import unittest - - -class TestStringMethods(unittest.TestCase): - """ Example test for HtmlRunner. """ - - def test_upper(self): - self.assertEqual('foo'.upper(), 'FOO') - - def test_isupper(self): - self.assertTrue('FOO'.isupper()) - self.assertFalse('Foo'.isupper()) - - def test_split(self): - s = 'hello world' - self.assertEqual(s.split(), ['hello', 'world']) - # check that s.split fails when the separator is not a string - with self.assertRaises(TypeError): - s.split(2) - - def test_error(self): - """ This test should be marked as error one. """ - raise ValueError - - def test_fail(self): - """ This test should fail. """ - self.assertEqual(1, 2) - - @unittest.skip("This is a skipped test.") - def test_skip(self): - """ This test should be skipped. """ - pass - -if __name__ == '__main__': - unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner()) -``` - -Just import `HtmlTestRunner` from package, then pass it to `unittest.main` with the `testRunner` keyword. -Tests will be saved under a reports/ directory by default (the `output` kwarg controls this.). - -### With Test Suites -`HtmlTestRunner` can also be used with `test suites`; just create a runner instance and call the run method with your suite. -Here an example: - -```python -from unittest import TestLoader, TestSuite -from HtmlTestRunner import HTMLTestRunner -import ExampleTest -import Example2Test - -example_tests = TestLoader().loadTestsFromTestCase(ExampleTest) -example2_tests = TestLoader().loadTestsFromTestCase(Example2Test) - -suite = TestSuite([example_tests, example2_tests]) - -runner = HTMLTestRunner(output='example_suite') - -runner.run(suite) -``` - -### Combining Reports into a Single Report - -By default, separate reports will be produced for each `TestCase`. -The `combine_reports` boolean kwarg can be used to tell `HTMLTestRunner` to instead produce a single report: - ```python -import HtmlTestRunner -h = HtmlTestRunner.HTMLTestRunner(combine_reports=True).run(suite) - ``` - -### Setting a filename -By default the name of the HTML file(s) produced will be created by joining the names of each test case together. -The `report_name` kwarg can be used to specify a custom filename. -For example, the following will produce a report file called "MyReport.html": - -```python -import HtmlTestRunner -h = HtmlTestRunner.HTMLTestRunner(combine_reports=True, report_name="MyReport", add_timestamp=False).run(suite) -``` - -## Console output: - -![Console output](docs/console_output.png) - -This is an example of the console output expected when using `HTMLTestRunner`. - - -## Test Result: - -![Test Results](docs/test_results.gif) - -This is a sample of the results from the template that came by default with the runner. - -## Custom Templates: - -If you want to use your own template you can pass the absolute path when instantiating the `HTMLTestRunner` class using the `template` kwarg: - ```python -import HtmlTestRunner -h = HtmlTestRunner.HTMLTestRunner(template='path/to/template') - ``` -Your template must use `jinja2` syntax, since this is the engine we use. - - -When using any template, the following variables will be available by default for use by `jinja2`: - -- `title`: This is the report title - by default this is "Unittests Results" but can be changed using the `report_title` kwarg -- `headers`: This is a dict with 2 items: - - `start_time`: A `datetime` object representing when the test was run - - `status`: A dict of of the same form as the sub-dicts described below for `summaries` but for all tests combined -- `all_results`: A dict - keys are the names of each test case and values are lists containing test result objects (see the source code or the template for what information these provide) -- `summaries`: A dict - keys are the names of each test case and values are dicts containing: - - `total`: The total number of tests - - `success`: The number of passed tests - - `failure`: The number of failed tests - - `error`: The number of errored tests - - `skip`: The number of skipped tests - - `duration`: A string showing how long all these tests took to run in either seconds or milliseconds - -Furthermore, you can provide any number of further variables to access from the template using the `template_args` kwarg. -For example, if you wanted to have the name of the logged in user available to insert into reports that could be achieved as follows: -```python -import getpass -import HtmlTestRunner - -template_args = { - "user": getpass.getuser() -} -h = HtmlTestRunner.HTMLTestRunner(template='path/to/template', template_args=template_args) -``` - -Now the user name can be accessed from a template using `jinja2` syntax: `{{ user }}`. - - -Click [here](docs/example_template.html) for a template example, this is the default one shipped with the package. - - - -## TODO - -- [ ] Add Test -- [ ] Improve documentation -- [x] Add custom templates -- [ ] Add xml results -- [ ] Add support for Python2.7 -- [x] Add support for one report when running test suites. - -## Contributing - -Contributions are welcome, and they are greatly appreciated! Every -little bit helps, and credit will always be given. - -For more info please click [here](./CONTRIBUTING.md) - -## Credits - -This package was created with Cookiecutter and the `audreyr/cookiecutter-pypackage` project template. - -- [Cookiecutter](https://github.com/audreyr/cookiecutter) -- [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) diff --git a/tests/reporter/result.py b/tests/reporter/result.py deleted file mode 100644 index 6ebd53d..0000000 --- a/tests/reporter/result.py +++ /dev/null @@ -1,483 +0,0 @@ -from __future__ import print_function - -import os -import platform -import sys -import time -import copy -import difflib -import traceback -from unittest import TestResult, TextTestResult -from unittest.result import failfast - -from jinja2 import Template - - -DEFAULT_TEMPLATE = os.path.join(os.path.dirname(__file__), "template", "report_template.html") - - -def load_template(template): - """ Try to read a file from a given path, if file - does not exist, load default one. """ - file = None - try: - if template: - with open(template, "r") as f: - file = f.read() - except Exception as err: - print("Error: Your Template wasn't loaded", err, - "Loading Default Template", sep="\n") - finally: - if not file: - with open(DEFAULT_TEMPLATE, "r") as f: - file = f.read() - return file - - -def render_html(template, **kwargs): - template_file = load_template(template) - if template_file: - template = Template(template_file) - return template.render(**kwargs) - - -def testcase_name(test_method): - testcase = type(test_method) - - module = testcase.__module__ + "." - if module == "__main__.": - module = "" - result = module + testcase.__name__ - return result - - -def strip_module_names(testcase_names): - """Examine all given test case names and strip them the minimal - names needed to distinguish each. This prevents cases where test - cases housed in different files but with the same names cause clashes.""" - result = copy.copy(testcase_names) - for i, testcase in enumerate(testcase_names): - classname = testcase.split(".")[-1] - duplicate_found = False - testcase_names_ = copy.copy(testcase_names) - del testcase_names_[i] - for testcase_ in testcase_names_: - classname_ = testcase_.split(".")[-1] - if classname_ == classname: - duplicate_found = True - if not duplicate_found: - result[i] = classname - return result - - -class _TestInfo(object): - """" Keeps information about the execution of a test method. """ - - (SUCCESS, FAILURE, ERROR, SKIP) = range(4) - - def __init__(self, test_result, test_method, outcome=SUCCESS, - err=None, subTest=None): - self.test_result = test_result - self.outcome = outcome - self.elapsed_time = 0 - self.err = err - self.stdout = test_result._stdout_data - self.stderr = test_result._stderr_data - - self.is_subtest = subTest is not None - - self.test_description = self.test_result.getDescription(test_method) - self.test_exception_info = ( - '' if outcome in (self.SUCCESS, self.SKIP) - else self.test_result._exc_info_to_string( - self.err, test_method)) - - self.test_name = testcase_name(test_method) - if not self.is_subtest: - self.test_id = test_method.id() - else: - self.test_id = subTest.id() - - # KiUtils stuff starts here .. - - self.kiutils_expected_output = 'No expected output specified ..' - self.kiutils_produced_output = 'No produced output specified ..' - self.kiutils_description = 'No test description provided ..' - - if hasattr(test_method, 'testData'): - if test_method.testData.ownDescription is not None: - self.kiutils_description = test_method.testData.ownDescription - elif hasattr(test_method, '_testMethodDoc'): - self.kiutils_description = test_method._testMethodDoc - else: - # No further description provided - pass - - if test_method.testData.expectedOutput is not None: - self.kiutils_expected_output = test_method.testData.expectedOutput - - if test_method.testData.producedOutput is not None: - self.kiutils_produced_output = test_method.testData.producedOutput - - if self.kiutils_expected_output is not None and self.kiutils_produced_output is not None: - self.diff = difflib.HtmlDiff().make_file( - self.kiutils_expected_output.split("\n"), - self.kiutils_produced_output.split("\n"), - ) - - pass - # .. KiUtils stuff ends here - - def id(self): - return self.test_id - - def test_finished(self): - self.elapsed_time = self.test_result.stop_time - self.test_result.start_time - - def get_description(self): - return self.test_description - - def get_error_info(self): - return self.test_exception_info - - -class _SubTestInfos(object): - # TODO: make better: inherit _TestInfo? - (SUCCESS, FAILURE, ERROR, SKIP) = range(4) - - def __init__(self, test_id, subtests): - self.subtests = subtests - self.test_id = test_id - self.outcome = self.check_outcome() - - def check_outcome(self): - outcome = _TestInfo.SUCCESS - for subtest in self.subtests: - if subtest.outcome != _TestInfo.SUCCESS: - outcome = _TestInfo.FAILURE - break - return outcome - - -class HtmlTestResult(TextTestResult): - """ A test result class that express test results in Html. """ - - start_time = None - stop_time = None - default_prefix = "TestResults_" - - def __init__(self, stream, descriptions, verbosity): - TextTestResult.__init__(self, stream, descriptions, verbosity) - self.buffer = True - self._stdout_data = None - self._stderr_data = None - self.successes = [] - self.subtests = {} - self.callback = None - self.infoclass = _TestInfo - self.report_files = [] - - def _prepare_callback(self, test_info, target_list, verbose_str, - short_str): - """ Appends a 'info class' to the given target list and sets a - callback method to be called by stopTest method.""" - target_list.append(test_info) - - def callback(): - """ Print test method outcome to the stream and elapsed time too.""" - test_info.test_finished() - - if self.showAll: - self.stream.writeln( - "{} ({:3f})s".format(verbose_str, test_info.elapsed_time)) - elif self.dots: - self.stream.write(short_str) - - self.callback = callback - - def getDescription(self, test): - """ Return the test description if not have test name. """ - return str(test) - - def startTest(self, test): - """ Called before execute each method. """ - self.start_time = time.time() - TestResult.startTest(self, test) - - if self.showAll: - self.stream.write(" " + self.getDescription(test)) - self.stream.write(" ... ") - - def _save_output_data(self): - try: - self._stdout_data = sys.stdout.getvalue() - self._stderr_data = sys.stderr.getvalue() - except AttributeError: - pass - - def stopTest(self, test): - """ Called after excute each test method. """ - self._save_output_data() - TextTestResult.stopTest(self, test) - self.stop_time = time.time() - - if self.callback and callable(self.callback): - self.callback() - self.callback = None - - def addSuccess(self, test): - """ Called when a test executes successfully. """ - self._save_output_data() - self._prepare_callback(self.infoclass(self, test), self.successes, "OK", ".") - - @failfast - def addFailure(self, test, err): - """ Called when a test method fails. """ - self._save_output_data() - testinfo = self.infoclass(self, test, self.infoclass.FAILURE, err) - self._prepare_callback(testinfo, self.failures, "FAIL", "F") - - @failfast - def addError(self, test, err): - """" Called when a test method raises an error. """ - self._save_output_data() - testinfo = self.infoclass(self, test, self.infoclass.ERROR, err) - self._prepare_callback(testinfo, self.errors, 'ERROR', 'E') - - def addSubTest(self, testcase, test, err): - """ Called when a subTest completes. """ - self._save_output_data() - # TODO: should ERROR cases be considered here too? - if err is None: - testinfo = self.infoclass(self, testcase, self.infoclass.SUCCESS, err, subTest=test) - self._prepare_callback(testinfo, self.successes, "OK", ".") - else: - testinfo = self.infoclass(self, testcase, self.infoclass.FAILURE, err, subTest=test) - self._prepare_callback(testinfo, self.failures, "FAIL", "F") - - test_id_components = str(testcase).rstrip(')').split(' (') - test_id = test_id_components[1] + '.' + test_id_components[0] - if test_id not in self.subtests: - self.subtests[test_id] = [] - self.subtests[test_id].append(testinfo) - - def addSkip(self, test, reason): - """" Called when a test method was skipped. """ - self._save_output_data() - testinfo = self.infoclass(self, test, self.infoclass.SKIP, reason) - self._prepare_callback(testinfo, self.skipped, "SKIP", "S") - - def printErrorList(self, flavour, errors): - """ - Writes information about the FAIL or ERROR to the stream. - """ - for test_info in errors: - self.stream.writeln(self.separator1) - self.stream.writeln( - '{} [{:3f}s]: {}'.format(flavour, test_info.elapsed_time, - test_info.test_id) - ) - self.stream.writeln(self.separator2) - self.stream.writeln('%s' % test_info.get_error_info()) - - def _get_info_by_testcase(self): - """ Organize test results by TestCase module. """ - - tests_by_testcase = {} - - subtest_names = set(self.subtests.keys()) - for test_name, subtests in self.subtests.items(): - subtest_info = _SubTestInfos(test_name, subtests) - testcase_name = ".".join(test_name.split(".")[:-1]) - if testcase_name not in tests_by_testcase: - tests_by_testcase[testcase_name] = [] - tests_by_testcase[testcase_name].append(subtest_info) - - for tests in (self.successes, self.failures, self.errors, self.skipped): - for test_info in tests: - # subtests will be contained by _SubTestInfos objects but there is also the - # case where all subtests pass and the method is added as a success as well - # which must be filtered out - if test_info.is_subtest or test_info.test_id in subtest_names: - continue - if isinstance(test_info, tuple): # TODO: does this ever occur? - test_info = test_info[0] - testcase_name = ".".join(test_info.test_id.split(".")[:-1]) - if testcase_name not in tests_by_testcase: - tests_by_testcase[testcase_name] = [] - tests_by_testcase[testcase_name].append(test_info) - - # unittest tests in alphabetical order based on test name so re-assert this - for testcase in tests_by_testcase.values(): - testcase.sort(key=lambda x: x.test_id) - - return tests_by_testcase - - @staticmethod - def _format_duration(elapsed_time): - """Format the elapsed time in seconds, or milliseconds if the duration is less than 1 second.""" - if elapsed_time > 1: - duration = '{:2.2f} s'.format(elapsed_time) - else: - duration = '{:d} ms'.format(int(elapsed_time * 1000)) - return duration - - def get_results_summary(self, tests): - """Create a summary of the outcomes of all given tests.""" - - failures = errors = skips = successes = 0 - for test in tests: - outcome = test.outcome - if outcome == test.ERROR: - errors += 1 - elif outcome == test.FAILURE: - failures += 1 - elif outcome == test.SKIP: - skips += 1 - elif outcome == test.SUCCESS: - successes += 1 - - elapsed_time = 0 - for testinfo in tests: - if not isinstance(testinfo, _SubTestInfos): - elapsed_time += testinfo.elapsed_time - else: - for subtest in testinfo.subtests: - elapsed_time += subtest.elapsed_time - - results_summary = { - "total": len(tests), - "error": errors, - "failure": failures, - "skip": skips, - "success": successes, - "duration": self._format_duration(elapsed_time) - } - - return results_summary - - def _get_header_info(self, tests, start_time): - results_summary = self.get_results_summary(tests) - - header_info = { - "start_time": start_time, - "status": results_summary, - "python_version": f"{sys.version} on {platform.system()}" - } - return header_info - - def _get_report_summaries(self, all_results, testRunner): - """ Generate headers and summaries for all given test cases.""" - summaries = {} - for test_case_class_name, test_case_tests in all_results.items(): - summaries[test_case_class_name] = self.get_results_summary(test_case_tests) - - return summaries - - def generate_reports(self, testRunner): - """ Generate report(s) for all given test cases that have been run. """ - status_tags = ('success', 'danger', 'warning', 'info') - all_results = self._get_info_by_testcase() - summaries = self._get_report_summaries(all_results, testRunner) - - if not testRunner.combine_reports: - for test_case_class_name, test_case_tests in all_results.items(): - header_info = self._get_header_info(test_case_tests, testRunner.start_time) - html_file = render_html( - testRunner.template, - title=testRunner.report_title, - header_info=header_info, - all_results={test_case_class_name: test_case_tests}, - status_tags=status_tags, - summaries=summaries, - **testRunner.template_args - ) - # append test case name if multiple reports to be generated - if testRunner.report_name is None: - report_name_body = self.default_prefix + test_case_class_name - else: - report_name_body = "{}_{}".format(testRunner.report_name, test_case_class_name) - self.generate_file(testRunner, report_name_body, html_file) - - else: - header_info = self._get_header_info( - [item for sublist in all_results.values() for item in sublist], - testRunner.start_time - ) - html_file = render_html( - testRunner.template, - title=testRunner.report_title, - header_info=header_info, - all_results=all_results, - status_tags=status_tags, - summaries=summaries, - **testRunner.template_args - ) - # if available, use user report name - if testRunner.report_name is not None: - report_name_body = testRunner.report_name - else: - report_name_body = self.default_prefix + "_".join(strip_module_names(list(all_results.keys()))) - self.generate_file(testRunner, report_name_body, html_file) - - def generate_file(self, testRunner, report_name, report): - """ Generate the report file in the given path. """ - dir_to = testRunner.output - if not os.path.exists(dir_to): - os.makedirs(dir_to) - - if testRunner.timestamp: - report_name += "_" + testRunner.timestamp - report_name += ".html" - - path_file = os.path.abspath(os.path.join(dir_to, report_name)) - self.stream.writeln(os.path.relpath(path_file)) - self.report_files.append(path_file) - with open(path_file, 'w') as report_file: - report_file.write(report) - - def _exc_info_to_string(self, err, test): - """ Converts a sys.exc_info()-style tuple of values into a string.""" - # if six.PY3: - # # It works fine in python 3 - # try: - # return super(_HTMLTestResult, self)._exc_info_to_string( - # err, test) - # except AttributeError: - # # We keep going using the legacy python <= 2 way - # pass - - # This comes directly from python2 unittest - exctype, value, tb = err - # Skip test runner traceback levels - # while tb and self._is_relevant_tb_level(tb): - # tb = tb.tb_next - - if exctype is test.failureException: - # Skip assert*() traceback levels - # length = self._count_relevant_tb_levels(tb) - msg_lines = traceback.format_exception(exctype, value, tb) - else: - msg_lines = traceback.format_exception(exctype, value, tb) - - if self.buffer: - # Only try to get sys.stderr as it might not be - # StringIO yet, e.g. when test fails during __call__ - try: - error = sys.stderr.getvalue() - except AttributeError: - error = None - if error: - if not error.endswith('\n'): - error += '\n' - msg_lines.append(error) - # This is the extra magic to make sure all lines are str - encoding = getattr(sys.stdout, 'encoding', 'utf-8') - lines = [] - for line in msg_lines: - if not isinstance(line, str): - # utf8 shouldn't be hard-coded, but not sure f - line = line.encode(encoding) - lines.append(line) - - return ''.join(lines) diff --git a/tests/reporter/runner.py b/tests/reporter/runner.py deleted file mode 100644 index 89a3f8f..0000000 --- a/tests/reporter/runner.py +++ /dev/null @@ -1,119 +0,0 @@ -import sys -import time -from datetime import datetime - -from unittest import TextTestRunner -from .result import HtmlTestResult - -UTF8 = "UTF-8" - - -class HTMLTestRunner(TextTestRunner): - """" A test runner class that output the results. """ - - time_format = "%Y-%m-%d_%H-%M-%S" - - def __init__(self, output="./reports/", verbosity=2, stream=sys.stderr, - descriptions=True, failfast=False, buffer=False, - report_title=None, report_name=None, template=None, resultclass=None, - add_timestamp=True, open_in_browser=False, - combine_reports=False, template_args=None): - self.verbosity = verbosity - self.output = output - self.encoding = UTF8 - - TextTestRunner.__init__(self, stream, descriptions, verbosity, - failfast=failfast, buffer=buffer) - - if add_timestamp: - self.timestamp = time.strftime(self.time_format) - else: - self.timestamp = "" - - if resultclass is None: - self.resultclass = HtmlTestResult - else: - self.resultclass = resultclass - - if template_args is not None and not isinstance(template_args, dict): - raise ValueError("template_args must be a dict-like.") - self.template_args = template_args or {} - - self.report_title = report_title or "Unittest Results" - self.report_name = report_name - self.template = template - - self.open_in_browser = open_in_browser - self.combine_reports = combine_reports - - self.start_time = 0 - self.time_taken = 0 - - def _make_result(self): - """ Create a TestResult object which will be used to store - information about the executed tests. """ - return self.resultclass(self.stream, self.descriptions, self.verbosity) - - def run(self, test): - """ Runs the given testcase or testsuite. """ - try: - - result = self._make_result() - result.failfast = self.failfast - if hasattr(test, 'properties'): - # junit testsuite properties - result.properties = test.properties - - self.stream.writeln() - self.stream.writeln("Running tests... ") - self.stream.writeln(result.separator2) - - self.start_time = datetime.now() - test(result) - stop_time = datetime.now() - self.time_taken = stop_time - self.start_time - - result.printErrors() - self.stream.writeln(result.separator2) - run = result.testsRun - self.stream.writeln("Ran {} test{} in {}".format(run, - run != 1 and "s" or "", str(self.time_taken)[:7])) - self.stream.writeln() - - expectedFails = len(result.expectedFailures) - unexpectedSuccesses = len(result.unexpectedSuccesses) - skipped = len(result.skipped) - - infos = [] - if not result.wasSuccessful(): - self.stream.writeln("FAILED") - failed, errors = map(len, (result.failures, result.errors)) - if failed: - infos.append("Failures={0}".format(failed)) - if errors: - infos.append("Errors={0}".format(errors)) - else: - self.stream.writeln("OK") - - if skipped: - infos.append("Skipped={}".format(skipped)) - if expectedFails: - infos.append("Expected Failures={}".format(expectedFails)) - if unexpectedSuccesses: - infos.append("Unexpected Successes={}".format(unexpectedSuccesses)) - - if infos: - self.stream.writeln(" ({})".format(", ".join(infos))) - else: - self.stream.writeln("\n") - - self.stream.writeln() - self.stream.writeln('Generating HTML reports... ') - result.generate_reports(self) - if self.open_in_browser: - import webbrowser - for report in result.report_files: - webbrowser.open_new_tab('file://' + report) - finally: - pass - return result diff --git a/tests/reporter/template/report_template.html b/tests/reporter/template/report_template.html deleted file mode 100644 index f1b8f89..0000000 --- a/tests/reporter/template/report_template.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - {{ title }} - - - - - - -
-
-
-

{{ title }}

-
-

Python Version {{ header_info.python_version }}

-

Start Time: {{ header_info.start_time.strftime("%Y-%m-%d %H:%M:%S") }}

-

Duration: {{ header_info.status.duration }}

-

Summary: Total: {{ header_info.status.total }}, Pass: {{ header_info.status.success }}{% if header_info.status.failure %}, Fail: {{ header_info.status.failure }}{% endif %}{% if header_info.status.error %}, Error: {{ header_info.status.error }}{% endif %}{% if header_info.status.skip %}, Skip: {{ header_info.status.skip }}{% endif %}

-
-
-
- {%- for test_case_name, tests_results in all_results.items() %} - {%- if tests_results %} -
-
- - - - - - - - - - {%- for test_case in tests_results %} - {%- if not test_case.subtests is defined %} - - - - - - {%- if not (test_case.stdout or test_case.err or test_case.err) %} - - - - {%- endif %} - {%- if (test_case.stdout or test_case.err or test_case.err) and test_case.outcome != test_case.SKIP %} - - - - {%- endif %} - {%- if (test_case.stdout or test_case.err or test_case.err) and test_case.outcome == test_case.SKIP %} - - - - {%- endif %} - {%- else %} - - - - - - {%- if test_case.subtests %} - - - - {%- endif %} - {%- endif %} - {%- endfor %} - - - - -
{{ test_case_name }}Status
{{ test_case.test_id.split(".")[-1] }} - - {%- if test_case.outcome == test_case.SUCCESS -%} - Pass - {%- elif test_case.outcome == test_case.SKIP -%} - Skip - {%- elif test_case.outcome == test_case.FAILURE -%} - Fail - {%- else -%} - Error - {%- endif -%} - - - {%- if (test_case.stdout or test_case.err) %} - - {%- endif %} - {%- if not (test_case.stdout or test_case.err or test_case.err) %} - - {%- endif %} -
-

{{ test_case.kiutils_description }}

-
-

{{ test_case.kiutils_description }}

- {%- if test_case.stdout %}

{{ test_case.stdout }}

{% endif %} - {%- if test_case.err %}

{{ test_case.err[0].__name__ }}: {{ test_case.err[1] }}

{% endif %} - {%- if test_case.err %}

{{ test_case.test_exception_info }}

{% endif %} -
Expected (left) vs produced (right):
-
{{ test_case.diff|safe }}
-
- {%- if test_case.stdout %}

{{ test_case.stdout }}

{% endif %} - {%- if test_case.err %}

{{ test_case.err }}

{% endif %} -
{{ test_case.test_id.split(".")[-1] }} - - {%- if test_case.outcome == test_case.SUCCESS -%} - Pass - {%- else -%} - Fail - {%- endif -%} - - - {%- if test_case.subtests %} - - {%- endif %} -
- - - - {%- for subtest in test_case.subtests %} - - - - - - {%- if subtest.err or subtest.err %} - - - - {%- endif %} - {% endfor %} - -
{{ subtest.test_id.split(".")[-1] }} - - {%- if subtest.outcome == subtest.SUCCESS -%} - Pass - {%- else -%} - Fail - {%- endif -%} - - - {%- if subtest.err %} - - {%- endif %} -
- {%- if subtest.err %}

{{ subtest.err[0].__name__ }}: {{ subtest.err[1] }}

{% endif %} - {%- if subtest.err %}

{{ subtest.test_exception_info }}

{% endif %} -
-
- Total: {{ summaries[test_case_name].total }}, Pass: {{ summaries[test_case_name].success }}{% if summaries[test_case_name].failure %}, Fail: {{ summaries[test_case_name].failure }}{% endif %}{% if summaries[test_case_name].error %}, Error: {{ summaries[test_case_name].error }}{% endif %}{% if summaries[test_case_name].skip %}, Skip: {{ summaries[test_case_name].skip }}{% endif %} -- Duration: {{ summaries[test_case_name].duration }} -
-
-
- {%- endif %} - {%- endfor %} -
- - - - None: -# prepare_test(self) -# return super().setUp() diff --git a/tests/test_board.py b/tests/test_board.py deleted file mode 100644 index 94dfb63..0000000 --- a/tests/test_board.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Unittests of board related classes - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path -from kiutils.footprint import Attributes - -from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE -from kiutils.board import Board - -BOARD_BASE = path.join(TEST_BASE, 'board') - -class Tests_Board(unittest.TestCase): - """Test cases for Boards""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_boardTraceArcs(self): - """Tests the parser's handling of traces with arcs""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardTraceArcs') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_boardStackup32LayerDielectricsVias(self): - """Tests the parsing of a board with 32 layers, all different dielectric layers and all - available via combinations""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardStackup32LayerDielectricsVias') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_boardWithAllPrimitives(self): - """Tests the parsing of a board containting all primitives (traces, texts, forms, dimensions, - markers, polygons, etc)""" - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardWithAllPrimitives') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_allFpManufacturingAttributes(self): - """Tests the parsing of a board with footprints that feature all combinations of - manufacturing attributes. Tests all possible combinations of the following: -
    -
  • Board Only: True / False
  • -
  • Exclude from BOM: True / False
  • -
  • excludeFromPosFiles: True / False
  • -
  • Type: SMD, THT, Other
  • -
- - Furthermore tests if the Attributes() object of a footprint is correctly created even - when the parsed footprint has no (attr ...) token in its S-Expression.""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_allFpManufacturingAttributes') - board = Board().from_file(self.testData.pathToTestFile) - - # Test parsing - self.assertTrue(to_file_and_compare(board, self.testData)) - - # Test that attributes object is created, even when an empty attribute list is present in - # parsed footprint - attr = Attributes(boardOnly=False, excludeFromBom=False, excludeFromPosFiles=False, type=None) - self.assertEqual(attr, board.footprints[11].attributes, - msg="Parsing of footprint without `attr` field does not yield expected Attributes() object") - - def test_createEmptyBoard(self): - """Tests the behavior when creating an empty board""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_createEmptyBoard') - board = Board().create_new() - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_footprintPadNewLines(self): - """Renames the libId token (setting and unsetting) of footprints on a board""" - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_renameFootprintIdToken') - board = Board().from_file(self.testData.pathToTestFile) - board.footprints[0].libId = "I_was_renamed:BUS_PCIexpress_x1" - board.footprints[1].libId = "I_was_added:BUS_PCIexpress_x1" - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_pcbPlotParams(self): - """Tests the parsing of board plot params""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_pcbPlotParams') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_zoneOnOuterLayersOnly(self): - """Tests the parsing of a zone that is only on the outer board layers (F.Cu and B.Cu). - Regression test for bug in PR #89.""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_zoneOnOuterLayersOnly') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_zoneOnAllLayersWildcard(self): - """Tests the parsing of a zone that is present on all copper layers in this form: "*.Cu" - Regression test for bug in PR #114.""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_zoneOnAllLayersWildcard') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - -class Tests_Board_Since_V7(unittest.TestCase): - """Test cases for Boards since KiCad 7""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_textBoxAllVariants(self): - """Tests all variants of the ``text_box`` token for text boxes in PCBs""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textBoxAllVariants') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_imageWithLayerToken(self): - """Tests the new ``layer`` token for images in PCBs""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_imageWithLayerToken') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_pcbPlotParams(self): - """Tests the parsing of board plot params since KiCad v7""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_pcbPlotParams') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_textsWithRenderCaches(self): - """Tests text elements with the ``render_cache`` token""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textsWithRenderCaches') - board = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(board, self.testData)) - - def test_testKnockout(self): - """Tests the ``knockout`` token of a graphical text""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textKnockout') - footprint = Board().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) diff --git a/tests/test_designrules.py b/tests/test_designrules.py deleted file mode 100644 index 27a7bdf..0000000 --- a/tests/test_designrules.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Unittests of design-rules related classes - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path - -from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE -from kiutils.dru import DesignRules - -DESIGNRULE_BASE = path.join(TEST_BASE, 'designrules') - -class Tests_DesignRules(unittest.TestCase): - """Test cases for Design Rules""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_allDesignRuleItems(self): - """Tests the parsing of all available design rule items""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'test_allDesignRuleItems') - dru = DesignRules.from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(dru, self.testData)) - - def test_createNewDesignRules(self): - """Tests the ``create_new()`` function to create a new set of design rules""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'test_createNewDesignRules') - dru = DesignRules.create_new() - self.assertTrue(to_file_and_compare(dru, self.testData)) - -class Tests_DesignRules_Since_V7(unittest.TestCase): - """Test cases for Design Rules since KiCad v7""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_severityToken(self): - """Tests the parsing the new severity token""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'since_v7', 'test_severityToken') - dru = DesignRules.from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(dru, self.testData)) diff --git a/tests/test_footprint.py b/tests/test_footprint.py deleted file mode 100644 index 56244fc..0000000 --- a/tests/test_footprint.py +++ /dev/null @@ -1,183 +0,0 @@ -"""Unittests of footprint related classes - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path - -from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE -from kiutils.footprint import Footprint - -FOOTPRINT_BASE = path.join(TEST_BASE, 'footprint') - -class Tests_Footprint_Legacy(unittest.TestCase): - """Test cases for Footprints from legacy KiCad versions (<= 5)""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_moduleNameOnlyNumbers(self): - """Constraints the behavior of legacy footprint names that are only numbers. As they are not - quoted strings, our parser does parse them as numbers. The behavior was changed in PR #91 - to convert numbers back to strings when exporting to S-Expression""" - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'legacy', 'test_moduleNameOnlyNumbers') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - -class Tests_Footprint(unittest.TestCase): - """Test cases for Footprints""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_allFootprintItems(self): - """Tests the parsing of all available footprint items""" - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_allFootprintItems') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_footprintPadNewLines(self): - """Tests the ability of the parser to create the correct new-line breaks when using - exotic footprint pad combinations""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_footprintPadNewLines') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_footprintEmptyAttributes(self): - """Tests the correct parsing of a footprint with empty ``Attributes`` field - -

Note: Some earlier versions of KiCad seemed to include the ``(attr ..)`` token in footprints even - when no attributes are set (or when using standard attributes). This test includes an empty - attribute token in the footprint and expects it to be gone after parsing.

- """ - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_footprintEmptyAttributes') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_createNewFootprintTypeSMD(self): - """Tests the ``create_new()`` function to create a new footprint with the type ``smd``""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeSMD') - - # Create footprint with correct type - footprint = Footprint().create_new( - type = 'smd', - library_id = 'empty-footprint-smd', - value = 'empty-footprint-smd' - ) - - # Set timestamps to be the same as in the expected test output - footprint.tedit = '6328915F' - - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_createNewFootprintTypeTHT(self): - """Tests the ``create_new()`` function to create a new footprint with the type ``through_hole``""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeTHT') - - # Create footprint with correct type - footprint = Footprint().create_new( - type = 'through_hole', - library_id = 'empty-footprint-through_hole', - value = 'empty-footprint-through_hole' - ) - - # Set timestamps to be the same as in the expected test output - footprint.tedit = '63289145' - - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_createNewFootprintTypeOther(self): - """Tests the ``create_new()`` function to create a new footprint with the type ``other``""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeOther') - - # Create footprint with correct type - footprint = Footprint().create_new( - type = 'other', - library_id = 'empty-footprint-other', - value = 'empty-footprint-other' - ) - # Set timestamps to be the same as in the expected test output - footprint.tedit = '6328916A' - - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_3dModelHideProperty(self): - """Tests the 3d model hide property (see issue #96)""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_3dModelHideProperty') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - -class Tests_Footprint_Since_V7(unittest.TestCase): - """Test cases for Footprints since KiCad 7""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_textBoxAllVariants(self): - """Tests all variants of the ``text_box`` token for text boxes in footprints""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textBoxAllVariants') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_imageWithLayerToken(self): - """Tests the new ``layer`` token for images in footprints""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_imageWithLayerToken') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_textsWithRenderCaches(self): - """Tests text elements with the ``render_cache`` token""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textsWithRenderCaches') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_exemptFromCourtyardToken(self): - """Tests the ``allow_missing_courtyard`` token""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_exemptFromCourtyardToken') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_3dModelOpacityToken(self): - """Tests the ``opacity`` token of a 3d-model""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_3dModelOpacityToken') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_privateLayersToken(self): - """Tests the ``private_layers`` token of a footprint""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_privateLayersToken') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_netTiePadGroups(self): - """Tests the ``net_tie_pad_groups`` token of a footprint""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_netTiePadGroups') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) - - def test_testKnockout(self): - """Tests the ``knockout`` token of a footprint text""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textKnockout') - footprint = Footprint().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(footprint, self.testData)) diff --git a/tests/test_libtable.py b/tests/test_libtable.py deleted file mode 100644 index b21df39..0000000 --- a/tests/test_libtable.py +++ /dev/null @@ -1,65 +0,0 @@ -"""Unittests of library table related classes - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path - -from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE -from kiutils.libraries import LibTable, Library - -LIBTABLE_BASE = path.join(TEST_BASE, 'libtable') - -class Tests_LibTable(unittest.TestCase): - """Test cases for library tables""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_parseFpLibTable(self): - """Tests the correct parsing of an example `fp-lib-table`""" - self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_parseFpLibTable') - libtable = LibTable().from_file(f'{self.testData.pathToTestFile}.expected') - self.assertTrue(to_file_and_compare(libtable, self.testData)) - - def test_parseSymLibTable(self): - """Tests the correct parsing of an example `sym-lib-table`""" - self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_parseSymLibTable') - libtable = LibTable().from_file(f'{self.testData.pathToTestFile}.expected') - self.assertTrue(to_file_and_compare(libtable, self.testData)) - - def test_addLibraryObjectToLibTable(self): - """Tests adding a library object to a library table""" - self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_addLibraryObjectToLibTable') - libtable = LibTable(type='fp_lib_table') - libtable.libs.append(Library( - name = 'object1', - type = "KiCad", - uri = '${KIPRJMOD}/my/library.pretty', - options = 'Some options with "quoted strings"', - description = 'Some description with "quoted strings"', - active = False - )) - self.assertTrue(to_file_and_compare(libtable, self.testData)) - - def test_addEmptyLibraryObjectToLibTable(self): - """Tests adding an empty library object to a library table""" - self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_addEmptyLibraryObjectToLibTable') - libtable = LibTable(type='fp_lib_table') - libtable.libs.append(Library()) - self.assertTrue(to_file_and_compare(libtable, self.testData)) - - def test_createNewLibTable(self): - """Tests the ``create_new()`` function to create a new library table""" - self.testData.compareToTestFile = True - self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_createNewLibTable') - libtable = LibTable.create_new() - self.assertTrue(to_file_and_compare(libtable, self.testData)) - - # TODO: Tests with invalid type token \ No newline at end of file diff --git a/tests/test_misc.py b/tests/test_misc.py deleted file mode 100644 index 21904a4..0000000 --- a/tests/test_misc.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Unittests for misc stuff - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path -from kiutils.schematic import Schematic - -from tests.testfunctions import to_file_and_compare, prepare_test, TEST_BASE - -MISC_BASE = path.join(TEST_BASE, 'misc') - -class Tests_Misc(unittest.TestCase): - """Misc test cases""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_quotesAndBackslashInSexpr(self): - """Tests the correct parsing of all variants of quoted strings as well as of backslashes - in said strings. - - Related issues: - - [Pull request 73](https://github.com/mvnmgrx/kiutils/pull/73) - """ - self.testData.pathToTestFile = path.join(MISC_BASE, 'test_quotesAndBackslashInSexpr') - self.testData.compareToTestFile = True - libtable = Schematic().from_file(self.testData.pathToTestFile) - self.assertTrue(to_file_and_compare(libtable, self.testData)) diff --git a/tests/test_schematic.py b/tests/test_schematic.py deleted file mode 100644 index 24cdea6..0000000 --- a/tests/test_schematic.py +++ /dev/null @@ -1,210 +0,0 @@ -"""Unittests of schematic related classes - -Authors: - (C) Marvin Mager - @mvnmgrx - 2022 - -License identifier: - GPL-3.0 -""" - -import unittest -from os import path -from kiutils.items.schitems import HierarchicalSheetInstance - -from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE -from kiutils.schematic import Schematic -from kiutils.items.common import Property - -SCHEMATIC_BASE = path.join(TEST_BASE, 'schematic') - -class Tests_Schematic(unittest.TestCase): - """Test cases for Schematics""" - - def setUp(self) -> None: - prepare_test(self) - return super().setUp() - - def test_addPropertyToSchematicSymbol(self): - """Adds a new property to an already existing symbol in the schematic and verifies the - correct initial values for the Property() class.""" - self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_addPropertyToSchematicSymbol') - schematic = Schematic().from_file(self.testData.pathToTestFile) - schematic.schematicSymbols[0].properties.append( - Property(key='Property3', value='I was added from "outside" of KiCad', id=6) - ) - self.assertTrue(to_file_and_compare(schematic, self.testData)) - - def test_createEmptySchematic(self): - """Tests that an empty schematic generates S-Expression as expected from KiCad - - Note: This test currently disregards an empty ``(symbol_instances)`` token as it seems that this - only exists when empty KiCad schematics are created. This is what should be expected for - empty schematics: - -

-        (kicad_sch (version 20211123) (generator kicad-python-tools)
-            (paper "A4")
-            (lib_symbols)
-            (symbol_instances)
-        )
-        """
-        schematic = Schematic.create_new()
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_createEmptySchematic')
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_schematicWithAllPrimitives(self):
-        """Tests the parsing of a schematic with all primitives (lines, traces, busses, connections,
-        images, etc)"""
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_schematicWithAllPrimitives')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_hierarchicalSchematicWithAllPrimitives(self):
-        """Tests the parsing of a hierarchical schematic with all primitives (lines, traces, busses,
-        connections, images, etc)"""
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_hierarchicalSchematicWithAllPrimitives')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_renameSymbolIdTokenInSchematic(self):
-        """Tests if renaming (setting and unsetting) schematic symbols as well as normal symbols 
-        using their ID token works as expected. Checks that the ``Value`` property does not change."""
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_renameSymbolIdTokenInSchematic')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        schematic.libSymbols[0].libId = "RenamedSwitch:SW_Coded_New"        # Setting library nickname
-        schematic.libSymbols[1].libId = "Unset_Lib_Id"                      # Unsetting library nickname
-        schematic.schematicSymbols[0].libId = "SwitchRenamed:SW_Coded_2"    # Setting library nickname
-        schematic.schematicSymbols[1].libId = "Unset_Lib_Id"                # Unsetting library nickname
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_setSymbolLibNameToken(self):
-        """Tests if setting and unsetting the lib_name token generates the correct S-Expression"""
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_setSymbolLibNameToken')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        schematic.schematicSymbols[0].libName = f"{schematic.schematicSymbols[0].entryName}_1"
-        schematic.schematicSymbols[1].libName = None
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_parseStrokeTokens(self):
-        """Tests the correct parsing of the Stroke token (with and without the color token)
-         
-        See:
-            https://github.com/mvnmgrx/kiutils/pull/57
-        """
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_parseStrokeTokens')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-class Tests_Schematic_Since_V7(unittest.TestCase):
-    """Schematic related test cases since KiCad 7"""
-
-    def setUp(self) -> None:
-        prepare_test(self)
-        return super().setUp()
-
-    def test_textBoxAllVariants(self):
-        """Tests all variants of the ``text_box`` token for text boxes in schematics"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_textBoxAllVariants')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_rectangleAllVariants(self):
-        """Tests all variants of the ``rectangle`` token for rectangles in schematics"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_rectangleAllVariants')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_circleAllVariants(self):
-        """Tests all variants of the ``circle`` token for circles in schematics"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_circleAllVariants')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_arcAllVariants(self):
-        """Tests all variants of the ``arc`` token for arcs in schematics"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_arcAllVariants')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_schematicWithAllPrimitives(self):
-        """Tests the parsing of a schematic with all primitives (lines, traces, busses, connections,
-        images, etc) for KiCad 7"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_schematicWithAllPrimitives')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_netclassFlags(self):
-        """Tests the parsing netclass flags for KiCad 7"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_netclassFlags')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_symbolPinOptionalTokens(self):
-        """Tests the parsing of the optional name and number effects on symbol pins since KiCad v7.
-        Came up in PR #73."""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_symbolPinOptionalTokens')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_strokeOptionalTokens(self):
-        """Tests the parsing of the optional tokens on strokes since KiCad v7.
-        Came up in PR #73."""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_strokeOptionalTokens')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_busAliases(self):
-        """Tests the parsing of bus aliases since KiCad v7.
-        Came up in PR #92."""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_busAliases')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_sheetProperties(self):
-        """Tests the parsing of sheet file properties since KiCad v7.
-        Came up in PR #106."""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_sheetProperties')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
-
-    def test_specialLibIdWithMultipleUnderscoresAndNumbers(self):
-        """Tests special library IDs with multiple underscores and numbers. Came up in PR #112"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_specialLibIdWithMultipleUnderscoresAndNumbers')
-        schematic = Schematic().from_file(self.testData.pathToTestFile)
-        self.assertTrue(schematic.libSymbols[0].entryName == "Filter_EMI_LLL_162534")
-        self.assertTrue(schematic.libSymbols[0].libraryNickname == "Device")
-        self.assertTrue(schematic.libSymbols[0].libId == "Device:Filter_EMI_LLL_162534")
-        self.assertTrue(schematic.libSymbols[0].units[0].entryName == "Filter_EMI_LLL_162534")
-        self.assertTrue(schematic.libSymbols[0].units[0].unitId == 0)
-        self.assertTrue(schematic.libSymbols[0].units[0].styleId == 1)
-        self.assertTrue(schematic.libSymbols[0].units[0].libId == "Filter_EMI_LLL_162534_0_1")
-        self.assertTrue(schematic.libSymbols[0].units[1].entryName == "Filter_EMI_LLL_162534")
-        self.assertTrue(schematic.libSymbols[0].units[1].unitId == 1)
-        self.assertTrue(schematic.libSymbols[0].units[1].styleId == 1)
-        self.assertTrue(schematic.libSymbols[0].units[1].libId == "Filter_EMI_LLL_162534_1_1")
-        
-        self.assertTrue(schematic.libSymbols[1].entryName == "Filter_EMI_LLL_162534_1")
-        self.assertTrue(schematic.libSymbols[1].libraryNickname is None)
-        self.assertTrue(schematic.libSymbols[1].libId == "Filter_EMI_LLL_162534_1")
-        self.assertTrue(schematic.libSymbols[1].units[0].entryName == "Filter_EMI_LLL_162534_1")
-        self.assertTrue(schematic.libSymbols[1].units[0].unitId == 0)
-        self.assertTrue(schematic.libSymbols[1].units[0].styleId == 1)
-        self.assertTrue(schematic.libSymbols[1].units[0].libId == "Filter_EMI_LLL_162534_1_0_1")
-        self.assertTrue(schematic.libSymbols[1].units[1].entryName == "Filter_EMI_LLL_162534_1")
-        self.assertTrue(schematic.libSymbols[1].units[1].unitId == 1)
-        self.assertTrue(schematic.libSymbols[1].units[1].styleId == 1)
-        self.assertTrue(schematic.libSymbols[1].units[1].libId == "Filter_EMI_LLL_162534_1_1_1")
-
-        self.assertTrue(to_file_and_compare(schematic, self.testData))
diff --git a/tests/test_symbol.py b/tests/test_symbol.py
deleted file mode 100644
index 44b0a66..0000000
--- a/tests/test_symbol.py
+++ /dev/null
@@ -1,169 +0,0 @@
-"""Unittests of library symbol related classes
-
-Authors:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-"""
-
-import unittest
-from os import path
-
-from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE
-from kiutils.symbol import SymbolLib, Symbol
-from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR
-from kiutils.utils.sexpr import parse_sexp
-
-SYMBOL_BASE = path.join(TEST_BASE, 'symbol')
-
-class Tests_Symbol(unittest.TestCase):
-    """Test cases for Symbols"""
-
-    def setUp(self) -> None:
-        prepare_test(self)
-        return super().setUp()
-
-    def test_allSymbolPinVariations(self):
-        """Tests the parsing of all pin types of a symbol in a symbol library"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_allSymbolPinVariations')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_allSymbolAlternatePins(self):
-        """Tests the parsing of all alternate pin definitions of a symbol in a symbol library"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_allSymbolAlternatePins')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_symbolParameters(self):
-        """Tests the parsing of a symbol's parameters in a symbol library"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolParameters')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_symbolDemorganUnits(self):
-        """Tests the parsing of a symbol's de-morgan unit represenations in a symbol library"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolDemorganUnits')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_symbolDemorganSyItems(self):
-        """Tests the parsing of a symbol' in a symbol library that has all SyItems in different
-        de-morgan variations in it"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolDemorganSyItems')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_bigSymbolLibrary(self):
-        """Tests the parsing of a big symbol library with many symbols of different kinds in it"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_bigSymbolLibrary')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_createNewSymbolInEmptyLibrary(self):
-        """Tests the ``create_new()`` function to create an empty symbol that is added to a
-        symbol library"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_createNewSymbolInEmptyLibrary')
-
-        # Create an empty symbol library
-        symbolLib = SymbolLib(
-            version = KIUTILS_CREATE_NEW_VERSION_STR,
-            generator = 'kiutils'
-        )
-
-        # Add a symbol to it via create_new()
-        symbol = Symbol().create_new(
-            id = 'testsymbol',
-            reference = 'U',
-            value = 'testvalue'
-        )
-        symbolLib.symbols.append(symbol)
-
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_renameParentIdUsingIdToken(self):
-        """Rename symbol inside library using the id token setter and verify all units are renamed
-        correctly as well as the ``Value`` property stayed the same."""
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_renameParentIdUsingIdToken')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        symbolLib.symbols[0].libId = 'ExampleLibrary:AD2023'    # Setting library nickname
-        symbolLib.symbols[1].libId = 'AD2023'                   # Unsetting library nickname
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_createNewTopLevelSymbolFromChild(self):
-        """Take a child symbol, rename its library id and make a new top-level symbol out of it.
-        Tests if resetting both ``unitId`` and ``styleId`` works."""
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_createNewTopLevelSymbolFromChild')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-
-        # Copy the symbol
-        childSymbol = Symbol.from_sexpr(parse_sexp(symbolLib.symbols[0].units[0].to_sexpr()))
-
-        # Rename it and save it as a new top-level symbol to the library
-        childSymbol.libId = "SomeNewName:AD2023"
-        symbolLib.symbols.append(childSymbol)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_mergeLibraries(self):
-        """Merge the symbols of two symbol libraries together"""
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_mergeLibraries')
-        symbolLib1 = SymbolLib().from_file(self.testData.pathToTestFile)
-        symbolLib2 = SymbolLib().from_file(path.join(SYMBOL_BASE, 'test_symbolDemorganSyItems'))
-        for symbol in symbolLib2.symbols:
-            symbolLib1.symbols.insert(0, symbol)
-        self.assertTrue(to_file_and_compare(symbolLib1, self.testData))
-
-    def test_symbolIdParser(self):
-        """Tests edge cases of parsing the symbol ID token and checks if the ID was split into
-        its parts correctly
-
-        Related issues:
-            - [Pull request 73](https://github.com/mvnmgrx/kiutils/pull/73)
-        """
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolIdParser')
-        self.testData.compareToTestFile = True
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-class Tests_Symbol_Since_V7(unittest.TestCase):
-    """Test cases for Symbols since KiCad 7"""
-
-    def setUp(self) -> None:
-        prepare_test(self)
-        return super().setUp()
-
-    def test_textBoxAllVariants(self):
-        """Tests all variants of the ``text_box`` token for text boxes in symbols"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_textBoxAllVariants')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_rectangleAllVariants(self):
-        """Tests all variants of the ``rectangle`` token for rectangles in symbols"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_rectangleAllVariants')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_circleAllVariants(self):
-        """Tests all variants of the ``circle`` token for circles in symbols"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_circleAllVariants')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
-
-    def test_arcAllVariants(self):
-        """Tests all variants of the ``arc`` token for arcs in symbols"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_arcAllVariants')
-        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
\ No newline at end of file
diff --git a/tests/test_worksheets.py b/tests/test_worksheets.py
deleted file mode 100644
index 4eadfbe..0000000
--- a/tests/test_worksheets.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""Unittests of worksheet related classes
-
-Authors:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-"""
-
-import unittest
-from os import path
-
-from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE
-from kiutils.wks import WorkSheet
-
-WORKSHEET_BASE = path.join(TEST_BASE, 'worksheets')
-
-class Tests_WorkSheets(unittest.TestCase):
-    """Test cases for Worksheets"""
-
-    def setUp(self) -> None:
-        prepare_test(self)
-        return super().setUp()
-
-    def test_allWorkSheetItems(self):
-        """Tests the parsing of all available worksheet items"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(WORKSHEET_BASE, 'test_allWorkSheetItems')
-        wks = WorkSheet().from_file(self.testData.pathToTestFile)
-        self.assertTrue(to_file_and_compare(wks, self.testData))
-
-    def test_createNewWorksheet(self):
-        """Tests the ``create_new()`` function to create a new empty worksheet"""
-        self.testData.compareToTestFile = True
-        self.testData.pathToTestFile = path.join(WORKSHEET_BASE, 'test_createNewWorksheet')
-        wks = WorkSheet.create_new()
-        self.assertTrue(to_file_and_compare(wks, self.testData))
diff --git a/tests/testdata/board/since_v7/test_imageWithLayerToken b/tests/testdata/board/since_v7/test_imageWithLayerToken
deleted file mode 100644
index 05fa6f9..0000000
--- a/tests/testdata/board/since_v7/test_imageWithLayerToken
+++ /dev/null
@@ -1,28 +0,0 @@
-(kicad_pcb (version 20221018) (generator kiutils)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (image (at 203.2 99.06) (layer "F.Cu") (scale 7.875)
-    (data
-      iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAA3NCSVQICAjb4U/gAAAACXBIWXMA
-      AA50AAAOdAFrJLPWAAAA9ElEQVRIiWP88OEDA20AE43MHbJGs+CX1pp4hUiDruXroIkMzQAZmkYT
-      iEZMIMHDWmEvaS3P8/33v1NPvvYfffH002+sKhnx50a0FCLBw7o+WoWfg5kYR5Dm6go7SX4O5kuX
-      Li1atIiRkTEuLk5XV5c6Rlsr8DAwMCxevBji14kTJ8Kl5syZg6aYXtFIMO+dePTFWZkvLi5u0aJF
-      DAwM8fHxOjromRAOUKKRoNGKguzLw5X42GkQjfff/wxYcqfcTsJanvf777+nnnydcOwlJPFhliEk
-      p+sXX34XbntMjMqhmdFHjaaf0QRKPkrA0AyQUaPRAACmk1AZ+UHU4QAAAABJRU5ErkJggg==
-    )
-  )
-
-)
diff --git a/tests/testdata/board/since_v7/test_pcbPlotParams b/tests/testdata/board/since_v7/test_pcbPlotParams
deleted file mode 100644
index fa053a5..0000000
--- a/tests/testdata/board/since_v7/test_pcbPlotParams
+++ /dev/null
@@ -1,52 +0,0 @@
-(kicad_pcb (version 20211014) (generator kiutils)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-    (pcbplotparams
-      (layerselection 0x7ffffff_ffffffff)
-      (plot_on_all_layers_selection 0x7ffff00_00000000)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes false)
-      (usegerberadvancedattributes false)
-      (creategerberjobfile false)
-      (dashed_line_dash_ratio 12.000000)
-      (dashed_line_gap_ratio 3.000000)
-      (svgprecision 4)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 15.000000)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference false)
-      (plotvalue false)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 1)
-      (mirror false)
-      (drillshape 0)
-      (scaleselection 1)
-      (outputdirectory "")
-    )
-  )
-
-  (net 0 "")
-
-)
diff --git a/tests/testdata/board/since_v7/test_textBoxAllVariants b/tests/testdata/board/since_v7/test_textBoxAllVariants
deleted file mode 100644
index 33a2b28..0000000
--- a/tests/testdata/board/since_v7/test_textBoxAllVariants
+++ /dev/null
@@ -1,306 +0,0 @@
-(kicad_pcb (version 20221018) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (gr_text "Orientation" (at 86.36 25.4) (layer "F.Cu") (tstamp 2aef365d-026c-4e7b-8a1a-69e289eb35f3)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-  (gr_text "Alignment" (at 50.8 25.4) (layer "F.Cu") (tstamp 35bc1f07-99ef-4b1e-8c5b-e35d7575308c)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-  (gr_text "Reverse" (at 68.58 25.4) (layer "F.Cu") (tstamp a35cd807-1b9d-4d28-85af-0710e5504aa3)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-  (gr_text "Different Font" (at 104.14 25.4) (layer "F.Cu") (tstamp abe4ed03-98ee-40a1-82aa-1a59f442b08b)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-  (gr_text "Style" (at 33.02 25.4) (layer "F.Cu") (tstamp b4ff3bb7-20b9-457f-bcb7-b8bac0425071)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 139.7) (end 83.82 147.32) (layer "F.Cu") (tstamp 193f87d0-d2db-4b7a-a5d8-dcd57b541ed3)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify right top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 88.9) (end 83.82 96.52) (layer "F.Cu") (tstamp 1f0995e7-62e9-48c8-89ae-7285298cab3a)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify left top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 48.26) (end 83.82 55.88) (layer "F.Cu") (tstamp 3d243660-c71c-4ff1-b30f-0c0b4bb46e90)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify right top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 129.54) (end 83.82 137.16) (layer "F.Cu") (tstamp 3fb87bbd-6f08-4d18-b592-eb728ce7438e)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 78.74) (end 66.04 86.36) (layer "F.Cu") (tstamp 3ffe0af5-c0af-4bed-81f1-503911a91b39)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify right top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 129.54) (end 48.26 137.16) (layer "F.Cu") (tstamp 4a32eeb2-a229-45dc-89cc-dcd231d8a98a)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 27.94) (end 83.82 35.56) (layer "F.Cu") (tstamp 582c3c7b-aed3-47c2-ba88-2bdb10313198)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 119.38) (end 48.26 127) (layer "F.Cu") (tstamp 5ca60f61-1883-469d-b156-c888bc8e6956)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 68.58) (end 66.04 76.2) (layer "F.Cu") (tstamp 5d55e141-d872-4686-843a-76c36b28ff34)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 93.98 55.88) (end 86.36 71.12) (angle 270) (layer "F.Cu") (tstamp 66faf55a-c406-4fa7-9e95-a943b14a8bf7)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 109.22) (end 48.26 116.84) (layer "F.Cu") (tstamp 7664a9ab-212d-4cef-8cfa-594460637df2)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 109.22) (end 66.04 116.84) (layer "F.Cu") (tstamp 7910f706-c83c-46e7-807c-b87b9c7df732)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify right top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "t a"
-    (start 104.14 27.94) (end 119.38 35.56) (layer "F.Cu") (tstamp 795acc99-4d66-42ec-8d37-7620a2c4d719)
-    (effects (font (face "Wingdings 3") (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-    (render_cache "t a" 0
-      (polygon
-        (pts
-          (xy 107.041029 30.765662)          (xy 105.480683 29.866605)          (xy 107.041029 28.966814)
-        )
-      )
-      (polygon
-        (pts
-          (xy 111.119762 29.854515)          (xy 110.45591 30.522763)          (xy 110.341605 30.522763)          (xy 110.341605 30.171053)
-          (xy 109.464528 30.171053)          (xy 109.464528 30.030369)          (xy 109.691308 30.030369)          (xy 110.565087 30.030369)
-          (xy 110.565087 30.234068)          (xy 110.942808 29.854515)          (xy 110.565087 29.482288)          (xy 110.565087 29.67866)
-          (xy 109.691308 29.67866)          (xy 109.691308 30.030369)          (xy 109.464528 30.030369)          (xy 109.464528 29.537976)
-          (xy 110.341605 29.537976)          (xy 110.341605 29.186266)          (xy 110.45591 29.186266)
-        )
-      )
-    )
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 38.1) (end 48.26 45.72) (layer "F.Cu") (tstamp 80cd9b80-e60d-4ebd-8b61-3c201d55df04)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 99.06) (end 66.04 106.68) (layer "F.Cu") (tstamp 80d92b28-b963-45a4-b801-24e56e81a486)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 68.58) (end 83.82 76.2) (layer "F.Cu") (tstamp 81f627fd-31bd-4b66-b287-bfc09f2e7e65)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 86.36 27.94) (end 101.6 35.56) (layer "F.Cu") (tstamp 8accd321-35f2-4514-b2bc-32bd8f65efe8)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type default))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 27.94) (end 66.04 35.56) (layer "F.Cu") (tstamp 8f2e742e-8eee-4481-9b06-7c27dcdb1a42)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 58.42) (end 48.26 66.04) (layer "F.Cu") (tstamp 90bd1535-0935-4917-a126-4196081d3708)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type dot))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 139.7) (end 48.26 147.32) (layer "F.Cu") (tstamp 91f4e82a-0a31-45b8-ad06-ca18176c8b98)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 109.22) (end 83.82 116.84) (layer "F.Cu") (tstamp 93075751-e035-4c96-8632-5b3e2e1dee4c)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify right top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 99.06) (end 83.82 106.68) (layer "F.Cu") (tstamp a122364f-f796-4619-9be3-3521a1abeec3)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 78.74) (end 48.26 86.36) (layer "F.Cu") (tstamp a7dbac5e-89dd-4a6e-92b6-1e7caa07bbe4)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type dash_dot_dot))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 58.42) (end 66.04 66.04) (layer "F.Cu") (tstamp abb18c0b-6a69-4b09-b109-d1cc975183e9)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 88.9) (end 66.04 96.52) (layer "F.Cu") (tstamp b587c4ee-c3b8-4c0e-b9ff-6d108e44f32b)
-    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 48.26) (end 66.04 55.88) (layer "F.Cu") (tstamp ba17cdd0-413b-4f8e-bf25-f93c9c31a802)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify right top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 86.36 53.34) (end 93.98 38.1) (angle 90) (layer "F.Cu") (tstamp c3cbd0ce-efda-44e2-a403-1f29af44b6cc)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 139.7) (end 66.04 147.32) (layer "F.Cu") (tstamp cb552089-d909-429f-bcb1-d9b62dcacba4)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify right top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 129.54) (end 66.04 137.16) (layer "F.Cu") (tstamp cf5dcae0-7470-4bae-a46d-9585baecf050)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 99.06) (end 48.26 106.68) (layer "F.Cu") (tstamp d19923cb-4cbb-41a4-9c93-91bb337005c0)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 119.38) (end 83.82 127) (layer "F.Cu") (tstamp d3081fb8-e9ce-4cff-9fd7-55bbf5277535)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify left top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 119.38) (end 66.04 127) (layer "F.Cu") (tstamp d43aed92-134c-4594-96cc-b735400649c2)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 48.26) (end 48.26 55.88) (layer "F.Cu") (tstamp d8ecd2e8-1fcd-489d-9819-66343345a3c2)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type dash))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 88.9) (end 48.26 96.52) (layer "F.Cu") (tstamp d9291bf2-f5e1-4b11-b99c-f3c4e9b4f428)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 38.1) (end 83.82 45.72) (layer "F.Cu") (tstamp e0a1cfbc-4cc7-49b3-a338-162718dc87c8)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 58.42) (end 83.82 66.04) (layer "F.Cu") (tstamp f3ee4a80-2fca-44b4-919e-bbc320830802)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 27.94) (end 48.26 35.56) (layer "F.Cu") (tstamp f62827ea-f8c0-47ab-8e13-bc2b8799c401)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type default))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 50.8 38.1) (end 66.04 45.72) (layer "F.Cu") (tstamp f86952c7-6db0-4205-8dfc-a8f471d6a422)
-    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 68.58 78.74) (end 83.82 86.36) (layer "F.Cu") (tstamp fa155af2-98aa-464c-93b5-39570ca49eeb)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify right top mirror))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 33.02 68.58) (end 48.26 76.2) (layer "F.Cu") (tstamp fd977cba-949e-42a0-acd0-8e7fc1187a55)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type dash_dot))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (start 101.6 81.28) (end 86.36 73.66) (angle 180) (layer "F.Cu") (tstamp ff558bd7-572b-4244-ab6d-97c7985392b7)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (pts
-      (xy 92.511663 121.665927)        (xy 90.127602 106.613557)        (xy 97.653787 105.421526)        (xy 100.037849 120.473896)
-    )
-    (angle 99) (layer "F.Cu") (tstamp 0b14faf9-1fe4-4381-9d65-e19c9f02ebea)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (pts
-      (xy 86.36 96.211846)        (xy 97.136307 85.435539)        (xy 102.524461 90.823692)        (xy 91.748154 101.6)
-    )
-    (angle 45) (layer "F.Cu") (tstamp 4cf1f31d-933d-47cd-b835-ed5f92690f10)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
-    (pts
-      (xy 103.958042 132.837259)        (xy 92.283525 142.633342)        (xy 87.385483 136.796083)        (xy 99.06 127)
-    )
-    (angle 220) (layer "F.Cu") (tstamp ff6ce36a-56bd-46bc-96fb-31ce64a2b523)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-  (gr_text_box locked "locked"
-    (start 33.02 149.86) (end 48.26 157.48) (layer "F.Cu") (tstamp 1604e3c4-6dfe-4116-bf50-703b6b6d6d75)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-  )
-
-)
diff --git a/tests/testdata/board/since_v7/test_textKnockout b/tests/testdata/board/since_v7/test_textKnockout
deleted file mode 100644
index bee6532..0000000
--- a/tests/testdata/board/since_v7/test_textKnockout
+++ /dev/null
@@ -1,50 +0,0 @@
-(kicad_pcb (version 20221018) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (gr_text "test" (at 168.42 92.81) (layer "F.Cu" knockout) (tstamp 37d6611e-bb8c-49f5-bc61-44562605f28f)
-    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-  )
-
-)
diff --git a/tests/testdata/board/since_v7/test_textsWithRenderCaches b/tests/testdata/board/since_v7/test_textsWithRenderCaches
deleted file mode 100644
index dda0111..0000000
--- a/tests/testdata/board/since_v7/test_textsWithRenderCaches
+++ /dev/null
@@ -1,85 +0,0 @@
-(kicad_pcb (version 20221018) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (gr_text "cached stuff\n\n" (at 137.16 93.98) (layer "F.Cu") (tstamp 25874870-6d4f-4bc3-8a66-95a041f89adb)
-    (effects (font (face "Bell MT") (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
-    (render_cache "cached stuff\n\n" 0
-      (polygon
-        (pts
-          (xy 140.623846 91.204918)          (xy 140.618478 91.205)          (xy 140.602633 91.205)          (xy 140.58679 91.205)
-          (xy 140.571994 91.205)          (xy 140.555749 91.205)          (xy 140.538056 91.205)          (xy 140.522857 91.205)
-          (xy 140.506991 91.205)          (xy 140.49168 91.205)          (xy 140.476924 91.205)          (xy 140.459948 91.205)
-          (xy 140.443771 91.205)          (xy 140.4309 91.205)          (xy 140.41575 91.205)          (xy 140.400799 91.205)
-          (xy 140.386048 91.205)          (xy 140.366691 91.205)          (xy 140.347689 91.205)          (xy 140.329041 91.205)
-          (xy 140.310749 91.205)          (xy 140.292812 91.205)          (xy 140.279591 91.205)          (xy 140.263187 91.205)
-          (xy 140.247508 91.205)          (xy 140.230335 91.205)          (xy 140.214882 91.205)          (xy 140.198392 91.205)
-          (xy 140.188 91.205)          (xy 140.172158 91.202746)          (xy 140.160335 91.193076)          (xy 140.157958 91.181919)
-        )
-      )
-      (polygon
-        (pts
-          (xy 142.953316 89.798302)          (xy 142.97018 89.798176)          (xy 142.97933 89.798161)          (xy 143.251538 89.798161)
-        )
-      )
-      (polygon
-        (pts
-          (xy 144.705109 90.747322)          (xy 144.717093 90.761103)          (xy 144.726177 90.773056)          (xy 144.734816 90.785833)
-          (xy 144.743007 90.799434)          (xy 144.750478 90.813539)          (xy 144.756952 90.827827)          (xy 144.76243 90.842299)
-          (xy 144.766912 90.856953)          (xy 144.770399 90.871791)          (xy 144.772889 90.886812)          (xy 144.774383 90.902016)
-        )
-      )
-      (polygon
-        (pts
-          (xy 145.254478 90.074243)          (xy 145.261175 90.060128)          (xy 145.268431 90.046533)          (xy 145.270572 90.043258)
-          (xy 145.282908 90.034128)          (xy 145.29292 90.032634)          (xy 145.307265 90.036488)          (xy 145.316915 90.048051)
-          (xy 145.321175 90.062374)          (xy 145.322566 90.078362)          (xy 145.322595 90.08136)
-        )
-      )
-    )
-  )
-  (gr_text_box "cached stuff"
-    (start 134.62 93.98) (end 149.86 101.6) (layer "F.Cu") (tstamp b8512651-2382-43ae-b65a-eb7f3bf81913)
-    (effects (font (face "Baskerville Old Face") (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
-    (stroke (width 0.2) (type solid))
-    (render_cache "cached stuff" 0
-      (polygon
-        (pts
-          (xy 136.498814 96.634875)          (xy 136.512674 96.627047)          (xy 136.525961 96.618015)          (xy 136.538674 96.607779)
-          (xy 136.550815 96.596338)          (xy 136.55859 96.588042)          (xy 136.568481 96.575409)          (xy 136.578461 96.559949)
-          (xy 136.586509 96.545547)          (xy 136.594615 96.529335)          (xy 136.600732 96.515989)          (xy 136.606881 96.501626)
-          (xy 136.613063 96.486245)          (xy 136.619276 96.469847)
-        )
-      )
-      (polygon
-        (pts
-          (xy 137.4812 96.599439)          (xy 137.494971 96.605788)          (xy 137.510853 96.609113)          (xy 137.521395 96.609658)
-          (xy 137.536632 96.60902)          (xy 137.552422 96.606509)          (xy 137.566092 96.601598)          (xy 137.578611 96.593112)
-          (xy 137.589836 96.583244)          (xy 137.601124 96.572054)          (xy 137.611887 96.560565)          (xy 137.645593 96.580715)
-          (xy 137.63985 96.595577)          (xy 137.633337 96.60948)          (xy 137.626054 96.622424)          (xy 137.613686 96.640043)
-          (xy 137.599585 96.655505)          (xy 137.583753 96.668809)          (xy 137.566187 96.679955)          (xy 137.54689 96.688944)
-          (xy 138.967801 96.634937)          (xy 138.967801 96.68)          (xy 138.490062 96.68)          (xy 138.490062 96.63457)
-        )
-      )
-      (polygon
-        (pts
-          (xy 140.057137 95.789378)          (xy 140.076786 95.789002)
-        )
-      )
-    )
-  )
-
-)
diff --git a/tests/testdata/board/test_allFpManufacturingAttributes b/tests/testdata/board/test_allFpManufacturingAttributes
deleted file mode 100644
index d75c055..0000000
--- a/tests/testdata/board/test_allFpManufacturingAttributes
+++ /dev/null
@@ -1,874 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-    (pcbplotparams
-      (layerselection 0x00010fc_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes true)
-      (usegerberadvancedattributes true)
-      (creategerberjobfile true)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer true)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 15.000000)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 1)
-      (mirror false)
-      (drillshape 1)
-      (scaleselection 1)
-      (outputdirectory "")
-    )
-  )
-
-  (net 0 "")
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 0eb1464b-f2bf-4f14-9186-d2f038802259)
-    (at 130.5 90)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 0978854b-7f2d-4e70-81ad-b8366855ab91))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 36570266-ac30-48fb-a957-d39c502c9460))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 520ddf64-73f0-4767-8391-a2c8400d2889))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 61a51970-fbbc-4b1e-a7ae-feb21648f6ac))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 6f6fc535-e6ac-4715-a245-11d18639fbe6))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7807c7b7-7ef2-4f78-b820-a3d80a6a5558))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp ab5fd570-a8ed-41be-bdc9-9bca7f01f72f))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp b2b23386-d0d5-4278-8953-0c9c0e5e73f7))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp cdbebb5e-a816-472c-9169-2f89317f1f2a))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp df8ca82e-d7eb-4065-8722-73c6f9311432))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 91696539-77c4-4a75-8e58-8ed056557991))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 48ced388-1009-47c0-9121-927d687fa0e0))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 743d8da9-eb43-4371-8313-505007abb989))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 973b69bd-3173-4927-bd5c-d73e14d856a7))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp f220da3f-d9e9-4b5a-81e2-bb395123fe5f))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 0fa684b1-37bd-4ad2-bdc2-d75e04b6861a)
-    (at 90.5 75.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 0673bd15-bb27-42a3-b8dd-ff34de638161)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp d618158f-4184-4754-aa33-65a98e706342)
-    )
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 2798cc00-37db-458a-b5f8-bea65ae99be7))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 2926e945-d9e3-4a4e-9b51-aad244dc04f4))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 334446cd-af18-48a8-bb73-a88f4d220620))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 92adc2a7-705f-4e7b-90a7-1c91d9f5977d))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 978f5906-8b9c-49a6-9b77-25cbc28e396e))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 9c1b71cf-44fe-4b7f-bf7f-4966704258c9))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a54a2d51-4b66-4d14-b33d-1444b55de06d))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp bff35e53-0373-44e5-a0ce-05175bbecd57))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp e085e529-431d-4fe9-aed9-287036ceabd6))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f7eedf75-4d8e-4db5-a979-879f661d7288))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 432045b0-7589-468b-8659-999ac30c51fa))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 17c7b03d-e4b9-4587-b2ce-0ee7a9d30575))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 2009ab3a-f4bf-4c63-a0fe-9d170c762787))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 4d290f63-844a-4f7b-8aec-c610c29b1e2f))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp fdd0a3ff-3d05-4dc5-8f2c-3aa967326c19))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 3f8f771a-1298-4ccc-b64b-d7ab6925ef3c)
-    (at 90.5 120)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd board_only exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 381ea437-8589-413a-8d00-c27a465a3773)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp e12ec3e8-0d5b-47b1-abb9-9b31a4bb451e)
-    )
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 168a0226-3f44-46ec-a72a-15290137bd66))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 18406746-0f9d-4d88-9ef2-8423e08576f0))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 20ac7a70-5cb9-4418-b061-8e4ee8d36b79))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 54562a16-6662-4d1b-9b50-45ed0ae36481))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 6f581e98-caac-4a3a-b0ed-76aab462e56a))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 73b08644-febb-4c1e-9b8f-826cf4cd7348))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a1bbbcb7-3394-4d47-a7e2-c5aca5915b62))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d0823f78-79d3-470b-87e6-694e750395bc))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp dfdaa22a-0489-48da-8a56-737e4c4366e1))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f47ba0cc-ecae-4aef-a30d-acee22ce59db))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp ccefc75b-fd16-4e82-963f-281710a98051))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 2b7fcec9-f103-4c1e-8056-817283941746))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 318b1c02-8f98-40e0-8672-6e5f766110ad))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp ae0ad2a8-816d-4ed9-8122-ce73b249d5bc))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp cd008119-17d3-4098-90f3-4ace8a150683))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 4162ea85-08df-4ac2-99e0-fc35a4bc249d)
-    (at 90.5 60.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 956f8a88-9acc-4e52-9280-d386fdb26e68)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 37c732a1-cf44-4113-843f-85a5910958ec)
-    )
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 33193802-955d-4a94-98cf-a3ed27526865))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 570b0686-0fc3-46c1-be51-39569bba54ce))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7966563c-e279-4a7c-bf41-af45d42c4a74))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7cc91655-208f-4c40-986f-00fd054b4b29))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a5129eb7-d259-4824-8f60-442feba02c79))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c61a2d85-d3d7-4faf-9bef-d07618588ca0))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp ce824579-a256-4757-8547-32bf1db63637))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp e0795232-a4f5-40af-bd8a-4a69f1a39aa6))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e567c545-204a-4e4a-bfa9-ae48e2366f9a))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f66b82ab-c203-4cb4-84ea-abcb2cd50a9c))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 49956dd5-35c0-4b9f-8b2a-6f2b8918bd8c))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 21491966-3c4c-414a-8ddc-0c7176ddff87))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 363809f4-b895-434e-8ee8-f8b8fb35d4fe))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 791a5e22-eefd-4c9f-8145-64da9c193893))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 7d6a83ee-b39d-480d-9568-6e909628ec27))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 4197fd6e-d0dc-4cad-a61b-00b708d61f8e)
-    (at 170.5 90)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4159a1b3-645b-4fcf-a72d-9242b2067a63)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp d7b44d07-2cb6-4c10-bad9-adf2185ee6fd)
-    )
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 06691abe-4a61-4d84-ab64-63ace23bf8b5))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 1b73c962-e471-4ec3-ab97-9114c97a5609))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 24e41c56-597e-4023-adfa-f1d5bfd2a519))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 3e6949fd-a9d6-4530-9145-d07c13ad2635))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 5632ff9d-82e3-45b5-a86b-5a4683beef51))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 5c080aa7-74cc-491d-a4fa-a35e9d41b2a9))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp be78c320-66c9-47db-84c6-e07682b2c3ee))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e41ebddf-cb62-48cb-abb2-1cc22a5eecdd))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp e5ef96dd-e14b-40bb-acac-746f5d3aee37))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp fb7d0d2c-09e5-46e0-8091-1901472a84d1))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 79094860-9de1-4089-9ad1-fb708c7e674c))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 0e39e32b-7468-4f6e-a6f0-b54d61a16933))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 40b12084-e9ea-4a47-a64f-d44ca516c9e8))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 564c737a-c22b-400c-8665-990100e2bad2))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp c83a95be-f351-410b-916d-b5948688be99))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 4f600c3b-938e-4f15-a3d5-2f7b84b7a114)
-    (at 130.5 75.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 565082b3-06ce-46fa-857c-fecdf53c89f1)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 7db41bda-359c-420f-bdf5-221e6a8efd3d)
-    )
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 34f20938-82be-4faa-a3bd-ea4ff60955a6))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 49b6beb3-5d64-4af2-830b-e99a8a5ac007))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 4b8ea754-7305-433d-91ba-90a4340e15a7))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 78e707fb-3e9a-4f67-9527-ee34cdefd91a))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7fd7cb09-496d-4f85-a95b-f531a0ea6ec8))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 99187cb6-681b-4886-9fc6-864207b7616f))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b5c8a737-214c-4638-bb5c-b013b02f97ab))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b67db6fb-e010-4837-9b46-419c0d446aba))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp bb857b3f-cfd2-48ea-8ae4-988435afb17f))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e60f5c1d-c97e-4327-8023-b78c1d20bdfb))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp e93f1ff9-82cc-426b-b31b-274f08cc4327))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 0739a502-7fa1-4e85-8cae-604fd21c9156))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 7de04273-7eda-4419-ad6c-938bfee9f2d2))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp baa2bb27-3ff4-481e-b331-7cfee71362fe))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp dc463df2-2692-4a08-9d95-1a693251e4f0))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 57ebeabe-b600-4237-a37f-55fc1fe8a51e)
-    (at 170.5 60.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp f42c2843-70f0-463a-bc38-eee11dd73b5f)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp c435621a-1e7b-4aea-a701-d5d27a54bd0d)
-    )
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 0ece2b87-02c1-4250-9204-efdee0b5a9d0))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 311a70eb-5859-4da6-8fe4-344b06368e0f))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 3fcf515a-b2e5-4769-a263-706606d34687))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 4362e6ac-6290-4071-922f-911c69fdd561))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 437daa66-7365-482e-804c-8098c6a0905c))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 70791199-43db-4ae1-bf3d-59e94aad8d59))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 971c1271-0f6f-46b9-8494-7107930ab4af))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp cd74d053-e62a-45a3-9f24-631862f85655))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp cdb2878b-f702-4635-9e4c-1cc8cfe5a84c))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e26f0b22-8514-418f-977b-cb0a9761b0f5))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 1aa01b33-85ec-45ea-bfaa-b88738576f2f))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 0afc6592-c2db-4caa-a22b-f13f9e7e1c40))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 4d759aa0-1145-43ae-a507-a45f6fc89e2a))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 62b6b2b3-6ade-4e95-8062-936451a2172f))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 9c8b409b-0d1b-49e5-8fed-acd83e0e8b3e))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 6504cfdc-6446-4592-b544-df5485f34a07)
-    (at 90.5 150)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd board_only exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 3f6533ba-c4f9-46fc-b56b-e4570f6ba8d8)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp f6662114-e94f-4466-8b01-5f4d76363a86)
-    )
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 2f1df4d4-ea41-4805-990c-fc64e9beb3f8))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 3d38eca7-b037-4400-970c-46db57e3c3cb))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 8ae8bcca-6404-4249-9a1b-d6efa82cff52))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 8c497335-9f19-4d8f-81b9-d3f6e5560190))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 93b580d1-c2df-48c4-9d06-465ca9d3eebc))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 95e16380-a797-4ef6-bc92-67bfd44afe75))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp ac5a5c45-797a-4bbe-bfd5-5ce5a8aa3463))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ba80136a-34d0-4a97-a9c9-c43ab3f7be6e))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp d0d2152d-05bb-45b9-922c-65dc46f5a5df))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d628bd18-95ed-41eb-b4b4-f043ded47592))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 1a657991-5c9c-41a4-9f2e-22f0c7450b3a))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 0e0a4b84-f32d-4d0d-bb01-e1a33da32acb))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 4445e598-1c38-4291-936b-eafc95d0cf78))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 6d4529c3-e736-41f4-9e85-842fded7472a))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp fe9073de-b4ae-429c-945b-a199d6313a17))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 684df057-312b-4a12-b960-3d0e61cf3ada)
-    (at 130.5 135.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole board_only exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1c55eaff-dfb6-4adc-bdb2-1121eb73358d)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp b2561a4b-5655-4b54-95c4-147a5b85fc10)
-    )
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 3491c78b-620e-46ca-a1c1-053b49774cc7))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 4a151dd5-28d8-42af-b70d-d52cf427540e))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 4ed19592-a5c4-4f6f-8e35-67fef4315ee4))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 4f4277d9-4ff1-4fe4-9af0-84cedee4b2b6))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 5baacfaf-4f9b-484a-b0ad-900c2c96f940))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 92563de1-61c4-4e3f-8603-96474790934f))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b5a26653-4e77-4514-a8f1-63ca7c4f9ab9))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d789eb5c-7750-4e88-bd51-088f1d8d4899))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp db3e62ed-d2c4-4262-9844-874282d066c8))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp dcbc5a2e-2561-4663-8736-09acc9fe0209))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 97816a30-8562-4b40-bfd6-82faaadf14b2))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 06d56cea-efec-4ee2-a30e-da196d83ccb4))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 7b66c522-eb2b-4ac5-8fa6-badbd9e03844))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 7c938fcf-5266-4f01-b9d8-797ff7c61f4c))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp dc4bf440-2891-440b-98cc-4ec7ceadee72))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 69403dd4-fea9-4899-966c-fff003244a4c)
-    (at 130.5 120)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole board_only exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 0504c604-5989-41d4-98b3-73baf39661a4)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 737d10d1-31d2-4ac3-8e9f-c01d3ad411b5)
-    )
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 20a40fd4-4825-456a-b45d-96e8fe1622a5))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 572f678c-7489-4a0c-81c3-6f024e0707be))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 5d4ed9ca-985c-4d79-b913-0fd671b604bc))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 6fb81dc6-41d5-4f97-ab8d-08492b739776))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a4a90bd3-5586-4453-acbb-4d2c22443f49))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a82cec30-45c1-49b3-b9e6-e30cc49eb759))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp b5e1d796-f3d8-4363-a6bf-5bf078e880e8))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b89e3fe5-d3a3-4087-a7a3-319b60fcc6e9))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp dc538eb4-034b-4b8a-a5e5-4a3e1e9a8cd3))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp edbc17dd-aa76-4d77-81ec-11ed42efea05))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 0368658f-3125-4888-be8d-2d00cf819e46))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 21443f6e-c9cb-43b6-9145-0fe007529b00))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 36915340-9dd2-4d10-bb2e-946e32cc121b))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 82f0532d-1a6d-464b-ad29-fc3e8108d6a8))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp d3ea5011-250b-4076-bf21-0457c1dc2816))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 7a550720-ee66-4d31-b0f9-0a57a3b133ea)
-    (at 90.5 90)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp ca6052ba-b6c7-4761-b3cb-c749f8cbf361)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 606cc23c-679a-4fa3-b3b1-c023026298b1)
-    )
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 02ca9350-9e0f-471f-a345-bee2587bb572))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 07e820f6-5352-4622-89c6-9dc8d877ae52))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 13d0922b-6304-4dca-bf30-664d82859d66))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 85c4eb9a-1efe-40fd-86af-36f89108b5f9))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 959ed360-eb0a-4a79-8f34-5faaf7fec5ad))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b67591ef-79c1-406a-9cdd-2d6de62566a6))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp bf1a0735-8349-4149-9917-9c06c3ec36d7))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c8d1a84b-8d98-4130-891c-9d4b5bdb0535))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d1c3595d-d061-4c53-823c-19aa0d9a8865))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp d28736e8-ee75-491e-b9af-2d7eb8b3297e))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 08895aac-0eaf-4885-9893-39d7cbab257b))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 251bbd6b-00ad-4956-8621-28b4b522b62b))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 8699357b-081e-4490-9c44-11d25a40de14))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp d0164702-426e-4c87-abe5-fbfeda4c6ede))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp eccdf86f-23ac-4077-b13e-27dc356e9a70))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp 87b0d27d-8c92-47f5-b6cf-66578b6858e7)
-    (at 170.5 45.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp b9937346-f6e7-4a0d-8b88-940809bc0c5f)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp d205f026-5c37-4a8f-96d0-c67ab0976f34)
-    )
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 5b1cf420-b469-4a8f-a998-9abdfd8b7687))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 60e61964-6ea7-468c-b4d5-c464c2964fb4))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 8b8cbcc8-2fab-4017-82d7-9e2b0dd87d55))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ae9a2cfc-2e02-4731-9394-e388bba596f8))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b4bb129a-27c6-47af-a65b-1d062a176af1))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b555eee7-8149-4892-8ba4-057aabcbbee2))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c40d36bb-2efa-4bc3-859b-223faaa66f3e))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp c97ec1e3-38c3-4514-9704-1b06a25c7c8d))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f686f314-e4c1-4c2d-a83a-58da96d3edf9))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp fae1c1af-89ba-4c18-88bc-46f514e9bd6f))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp de673e63-5f43-4989-8aea-860e28e93f50))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 4ab287b0-f7e5-4d54-ac56-3885f4c05418))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 5f6e226e-a567-408b-beb0-c8a8e2ec508f))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp f37be837-3bee-4441-b239-c214f98ba58a))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp ff667a13-f89b-40a5-99a3-00684de2da09))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp ac132512-c893-4cc0-8b4f-a1bad93547b0)
-    (at 170.5 150)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr board_only exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp ba54b977-6e85-4849-863a-8aba90c0983f)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 7b0b2e9d-7b62-4d86-ba92-8de66c2be81f)
-    )
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 4ed59335-4075-4e12-a596-bab87aafc796))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 56b75d3c-fa69-4f57-9aa5-64cfbf200c32))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7614d1b3-3ead-4914-90b1-e5e05187dd06))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 7ab2c56a-308f-45dd-b534-f28d44e59352))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 8d258870-19f3-4d71-9a3d-1390358a4e5a))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp afd59d07-bfd6-4bc9-8176-e0ddec1872a1))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ddb83956-0781-4967-adf3-cb27a82b32ef))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp f254f8e4-0eca-46a4-a3de-477f70bd6ec4))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f2d404b6-1993-4de0-b78d-3ca9612287c7))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp f80a85fd-e6d4-41d6-ba9f-12f575651e85))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 389820b3-dc0f-41a8-9487-f37594ec848d))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 4cb674e3-7fd0-4bdf-83d4-7b2424e2e5c0))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 58518ef0-9375-45b7-b518-1100f14f6963))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 75fcab2b-759b-4221-b3ed-5bcbea1afb05))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 94865570-11cc-4b49-8ee4-db024780b3ae))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp b16ab301-4abd-43a9-8923-4ae36109ad1e)
-    (at 170.5 75.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4035093c-8c14-4085-bfea-fcb41c163f69)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 71c1b4b1-fe29-4ef4-89f5-de4386e105a9)
-    )
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 26584013-aa69-4f6e-9469-cf96829118fe))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 42921c6f-25e8-4512-9139-83b5b81397a7))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 5841a60a-7434-4694-9b2f-60c2321b8bd0))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 8fecaef3-3ec3-48db-b92b-42aba82b3c34))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 94f92a53-a887-4e67-921d-9685969e3c14))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 9d1d67aa-bd89-4416-8ff1-ea3aed8edbd3))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a07f1e79-1d7d-4a07-b840-3da61e06e5e0))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d9209bac-cc1b-4bd5-9b0c-8896b0dbce47))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp d9c7258e-64f4-44a0-b9ed-474106f56c42))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ff3f0dce-48a8-4a4e-9a85-b6808253807b))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 14b6a088-e29e-4f65-bb62-fd783c1ab88e))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 1d3dd843-278a-491c-aee7-c4ca56549357))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 6b4ae552-c3dc-4d02-ab1a-556e15ae247d))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 8157d0c3-4115-4fef-882d-18ff9f3b1e49))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp a3c07522-2d1f-4d1c-a6e5-18097136531a))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp bf7f7976-c492-4b38-9696-c24926909542)
-    (at 130.5 150)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole board_only exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 53d63574-d294-4160-8943-1f901b80728f)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 9d221b3b-0bfe-4439-a426-0f2594b9c7bf)
-    )
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 0a1ac2c6-8da8-4410-b772-69afa2855077))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 119a2ba9-03f2-48af-8f1a-4a96cb25a3bf))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 251435cb-df17-46ab-aac4-3d24ccac8db0))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 3450ae82-42ae-493f-904b-d8b1a09c107a))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 741e6598-04b9-4005-a079-9081c23103ab))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 742f6656-c86d-41c0-937e-ef6ded3bd482))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c355ca51-32bc-4d88-a250-07d5621dd709))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp dff62e1d-c592-4963-80cb-25d776cdc1f4))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e68fac9b-3de3-4acb-9bb0-3dee3685df22))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp f252e204-5b1e-4386-b15b-42d6a51ae097))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 7efaeda2-e767-44b9-adb2-3a0c3f4d2f1d))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 9004cee7-358e-4c08-9d64-a05f28a4e7b6))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp b2ecb88a-4c09-46d5-b24a-de38dbb48f75))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp d8ebdeb0-2bbd-4a1b-a259-f95c97f44cbe))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp dacfc6b2-f197-4446-86ee-d141533404be))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp cc888f43-ca19-462c-adfd-2e20cb8dfede)
-    (at 90.5 105.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd board_only)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 7d512d14-3ca4-4934-b506-eb07d268c7dc)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 3d927ca0-f4ad-42ab-b902-dfef8d84eebb)
-    )
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 1fbda89d-82ba-4f0a-b113-988f269883dc))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 27b5a6bb-bf08-4e16-abae-290afd548f36))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 2fa17bd4-23af-495d-84c8-95f8b6beb5a8))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 3fc3a397-ec3a-4314-aa6a-44925ef4cbbe))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 4736f749-4a0e-4a05-b1aa-d51f1c3fc23d))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 76d9276c-0bff-44cf-81b5-cc0de1c97f12))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 782b86fa-ef9f-4c16-a991-b44a80f0f0c3))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 90dda447-2750-402e-9a9e-df264b0c0bc9))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 961e37cd-505c-40aa-baef-0a680d665d8f))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ddcf9a83-0126-4df6-88fa-3363d508d3a6))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp e03d7bc9-2bd0-42b5-96ba-4ca164fb4c50))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 74796a55-82bc-4f74-9e9c-c7cb232069e3))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp b6fc4182-53d3-44c8-80e1-53918daa9139))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp cf672f56-2d68-4c6c-a783-23e23c937b72))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp e721274f-b458-4ab5-8d4d-44bffaffa7c9))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp d24fa136-4598-4aef-8742-bfb5c4659871)
-    (at 130.5 45.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 325006ce-4c23-4f07-9871-dc0cd047f7fd)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 96930a67-6215-4f2b-a9cc-16f78c9fd164)
-    )
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 20d6997e-64c7-454b-9573-baf26e1ad11b))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 240fde71-00e0-458d-bf75-b4d973cb180b))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 4b1dbc88-c8c5-476c-80ac-830e56684be9))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 511ddebd-9f54-463b-bc54-5ebdd708d33d))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 764ce9a2-c363-448f-a68c-a7dbf5cd80c1))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 9a7ade3c-a81d-4038-a57c-b220b9c3cd90))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp adfaccc9-bb80-495a-9038-d58935037d76))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c60ba6ae-e013-424d-bb59-f3de27f735b1))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d2d83bcc-f2f8-4838-be35-0f2248bff3b6))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp f587f477-194d-41ae-8a6d-91fbd85f9d3f))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp c7a7077f-9289-4bb4-8f3b-a449cb499057))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 2415334a-b998-4d19-a8b5-e60e8af2aff4))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 345a9ac1-be31-400b-9c5d-4af388112d4b))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 835ada2e-dc88-46f5-b472-12f6a1e8c9f4))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 9421d8ab-ec24-4783-b746-a12fbd00100e))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp d39f803e-b408-4148-9dc1-1268cfb6cee1)
-    (at 170.5 105.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr board_only)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 88ec470b-1595-4040-bc2a-91476c84ca2e)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp a5e5a32b-d259-4833-9676-56ada82e83c2)
-    )
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 05fda319-28dc-4877-8331-02cb10501361))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 1330eb77-c16f-4a58-a897-f5af49736826))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 15f86f86-6612-462a-a1d2-f730a8788a9a))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 163cdeae-7841-4f2c-b738-e36b081d5e19))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 28f5d24e-b605-4fad-9e07-a157526f5710))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 7759bcaf-350b-4897-a675-aaf4fb3e75fe))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b4450c83-6da6-4393-a892-92bf8cbec8aa))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp cba11463-444d-4fb1-9f76-b3065c51a98b))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp d6c6796b-c630-4de8-9473-cbbc978a0a21))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp e5abcaa8-c89a-49d4-9e47-28a25f37d322))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp e51830a2-6dc5-4f13-834b-b490ff3a07e5))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 4b9a4b22-a241-4855-9d5c-4ff2f9005b1b))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp c3c15276-82a5-4b64-990f-7f503a97141e))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp e4f6c439-e664-4982-a00a-ae1d4844df2b))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp fd27925d-9b2e-4663-bdb7-e46b9715b801))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp d5f3c190-b3be-48f3-b8a6-e41bba2e269e)
-    (at 170.5 120)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr board_only exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 5c16107e-b60f-4f98-bbed-8abfeb5d4011)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4e72994f-410e-42ab-a8f9-f801527ca6d0)
-    )
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 22abab2e-9885-4da7-9852-348f356dd096))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 58a22765-7f2e-4f66-9ea8-f56fcca75dda))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 7da919a6-904e-41c7-b0f6-91d865a93890))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 99a76074-fcd3-4150-83c8-79f76bdad1c5))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b748f219-0f44-41d7-bcf2-9a96e7f8b594))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp b9e0ba15-f372-4a9e-a627-d594778258ac))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp cc016ca4-b9a4-4d80-91ba-91d6e0df5bcc))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d28c26df-aeff-4f6a-a1dc-f734efaf55cb))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp dcff1695-539e-442e-afee-9485378ce13a))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp dea160a0-c7eb-439d-aa99-b60757115fc7))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp eb5c3818-51cd-4092-a6a2-1d306912382e))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 83fee08f-7316-4ff9-a4fd-e9a9372f4d8f))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 9256f7aa-4f1a-4001-bdef-7fbb32e451e0))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 94e689a1-e70f-45cb-8a5b-dc77827f725b))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp be0c7a50-2d41-4fd6-8c28-37a4cf00d900))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp d605dd99-2afa-4862-ad86-bb1825478583)
-    (at 130.5 105.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole board_only)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 23f1f71f-cee3-412e-8e0b-8dacdc450a11)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 57e128ae-5e07-4818-9f5a-1cee0e65c680)
-    )
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 106f01f3-bf47-4150-bb7b-1a3318a6eb3d))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 10ddf54c-6d59-4755-8fb8-43466141a83a))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 26769327-3160-41f1-82e7-11d5d542abde))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 31446a24-8ce7-4dca-ab0b-d907a8be5e8d))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 537c2196-fe60-48a5-847c-84653e479b38))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 5cab06cf-94fa-4c5d-abc1-110cb0208f01))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7eebb937-5634-42da-bd7e-2e0260369d0e))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 9a17b82f-671a-43cc-889d-8f643334e78c))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp a5e505c0-c0af-4f61-a9d4-cf031c548012))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp ed265626-f6f5-4029-beb9-f6ad275e86b5))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 9ade8aaa-dfca-436d-be8a-be74784ef565))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp a64a7c06-7057-47f9-be64-f537af3193b4))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp bc2b91cd-dad2-489e-a5a6-c25b0772eb90))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp c884feb5-afbc-4baf-9f12-868c0ed27bc9))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp d633a4de-1388-46e7-ac55-24bd558a0816))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp e0aaa7e5-905d-4c84-ab35-31fe60dcdd68)
-    (at 170.5 135.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr board_only exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 2e4a6d1a-b585-4ad5-95d8-aff8c32bcfec)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp e0441cbd-426e-47d4-952b-8c03883e1f7a)
-    )
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 006bc43b-d3a8-4a38-a8dc-5a24da3f9b4d))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 0157ed9d-375b-4b39-a7c1-9cb08dcf67bf))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 11b49d13-b047-4242-be65-9a9b1c80ec58))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 430b98dc-0155-464c-95fc-2bf720cc2dd3))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 434de308-3c0f-471e-b2ea-4b1db61e07dc))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 496eb987-d081-4e1e-a63a-28ee1d48f2f8))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 6c55033c-55b9-4835-9ab8-f334f8a3ffed))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 776fdb81-16bd-40fc-866b-5d7c4f5af091))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 96e87ac2-5565-47ab-ae62-263f85b93211))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp f0d59009-bdb6-4150-8249-d2a9c5928391))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 42dd1fad-d6e1-4a22-bcd7-61c29a70aea6))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 2a891096-042c-4004-b161-8bd2c0b59fd7))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 771145ed-2e00-4172-ac95-37a36c6a35ce))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp a27ad806-2f49-493b-a712-5cefb34fea4e))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp b81cd904-69d1-4c8b-81f2-302fdf1cfeb0))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp e6383cf2-63bd-44ca-86d7-73cab8c5a669)
-    (at 90.5 45.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 920d067c-09ea-4120-b810-77cbd11822fb)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 2629f374-664b-4a6a-877f-847eba3a2928)
-    )
-    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
-      (effects (font (size 0.5 0.5) (thickness 0.1)))
-      (tstamp e096fb6c-9c86-457b-8f2e-4be4f1ee308e)
-    )
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 058fedcc-704d-4293-8197-34a17ef8dc07))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 3bd1d24a-0ba6-444e-896e-ab4ac7dd5127))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 4e26d1df-a557-446c-8724-16a2959e6714))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 5417d93e-ea72-4615-a825-50b48895bd92))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 99e5628a-8c61-4f9d-aa6e-5b585271b505))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 9f289b4a-cc82-473b-9973-1ab4c36355f8))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a1f64cc6-dc73-41aa-a86c-99d2c0c7e9e8))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c27162ce-dec2-4696-8422-f740d31716cf))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp c7050574-27e1-4a80-9dab-24805663409e))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp c9af433b-c759-435f-b23f-8e61bde22221))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 46c31fef-8b6d-4892-b7d6-1b9818ed82f5))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 11ccd497-2713-4d03-8a7a-1dbd53fbc1f7))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 328b655f-3682-4d72-b986-09747092cdfb))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 7dd46673-4551-4937-beee-2ea3f888f7bc))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp d46f6682-7aa3-41f8-8dfe-bfed3b1f9948))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp e9e920f6-baec-4cdb-8085-ad6ca5c3b307)
-    (at 130.5 60.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr through_hole exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp bade9875-e59b-4d52-b529-c48d7c265fc4)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 3b398e0a-4c10-4dcc-aa1f-5dcd51a576d9)
-    )
-    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
-      (effects (font (size 0.5 0.5) (thickness 0.1)))
-      (tstamp a32fe8ab-5810-40f6-8eab-48332c0ee5a0)
-    )
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 17540f0f-267d-4f0f-8f00-5539a89bd637))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 36d7002b-bf2e-428b-a91a-b4ed755cac59))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 66734891-cd33-4205-a68e-7aa74d4b75f8))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 8a2de683-0cbb-47f9-b48d-61ac1c60565d))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 8f0e1ea6-d278-4117-9e02-aaadcc59362e))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 92587ea2-e589-4cd0-a110-fdbbe9573c25))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp a5d527e3-93e5-4f7c-9403-79aabfbdc470))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp b3eebb03-af8c-48e8-a7d9-5ec3741206fa))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp c587e41e-e411-44d4-a360-b7b652a17e87))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp ec7a7d72-678f-4bfb-a06b-17a4d013c413))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 99f4f4aa-2f14-4bf9-b8a7-da1480e9e168))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 286a9e39-c26f-49c3-809f-c04839a4ac04))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 5696a53f-2631-4279-8564-21adeaab997c))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 706bece9-b980-4420-a866-a63a48a63c89))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp f57b03a6-125b-453a-8f2a-24b446ebba66))
-  )
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp eece7241-cf79-4005-a419-afcb7ea2f1aa)
-    (at 90.5 135.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr smd board_only exclude_from_pos_files)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 8b664cd6-f39e-4636-850d-30ba11a608d8)
-    )
-    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp eba6f904-5352-4ca5-9d68-7095d5553d23)
-    )
-    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
-      (effects (font (size 0.5 0.5) (thickness 0.1)))
-      (tstamp 6995beeb-7854-4705-ae35-78174cb5e8c5)
-    )
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 03590f33-763d-44e7-bd58-7b869bb7ef20))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 20cc5dd3-f607-44c7-ac7e-e7aebd9790dd))
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 26aff78d-1dc4-4822-8817-49ee707b8453))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 3a013e8f-5b12-499b-8d2d-0ad49966db1a))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 58b75830-9e39-45c9-8547-367ebee8a907))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 66f97120-6c7e-441a-9997-acbf3e610e6e))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7b32ef33-8c7b-417f-9260-1a8773398f8f))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 97208e50-b896-4df8-8da4-ea2fc6b46da5))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp d92cfbfa-da4b-4f63-8ad6-7bb6977d4f44))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp e6a27cb0-d090-4b8c-9a7b-e787b9ea11b6))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 07b7ccce-8895-49f2-b220-e85ac43040b1))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 65d50500-96c3-4685-9691-5f83fde7ff57))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 7850e091-0fbf-4f7c-a328-cd019df441e0))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 8fac398c-22c9-4741-a001-aab7ea92da04))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp bcd9d733-3cca-4780-8540-cda4d5f83456))
-  )
-
-  (gr_text "+ / + / +" (at 75 150) (layer "F.Cu") (tstamp 03b7ea59-04ff-4bfc-a26f-17e4b04b9d62)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "+ / + / -" (at 75 135) (layer "F.Cu") (tstamp 0bc45e0a-f3b4-457e-8294-593a75a7697d)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "- / - / +" (at 75 60) (layer "F.Cu") (tstamp 19cf3f75-846d-40c4-99e9-986cfa896c10)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "- / - / -" (at 75 45) (layer "F.Cu") (tstamp 3cd62bef-586b-4354-a0d8-b45f0b86f8d4)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "Footprint Type\nOther" (at 180 30) (layer "F.Cu") (tstamp 5e01567b-a9f5-4f86-b76a-2572d29d2d44)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "Tests all manufacturing attribute\ncombinations possible" (at 45 25) (layer "F.Cu") (tstamp 6bde0840-e503-4c9f-a8c0-10fd7be12888)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "+ / - / +" (at 75 120) (layer "F.Cu") (tstamp 6ee20d1c-a46d-41e5-9769-e0e93e111749)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "- / + / -" (at 75 75) (layer "F.Cu") (tstamp 7d7dfbee-e276-47ab-a29b-12b4be9b22c4)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "+ / - / -" (at 75 105) (layer "F.Cu") (tstamp 80e098c7-ff0f-40d9-839f-9ee0ada137c7)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "Footprint Type\nSMD" (at 100 30) (layer "F.Cu") (tstamp aff48226-032f-4dae-a36a-f783c883d29a)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "Footprint Type\nTHT" (at 140 30) (layer "F.Cu") (tstamp b576af53-9779-4b42-bea4-4d91783d8c4b)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "- / + / +" (at 75 90) (layer "F.Cu") (tstamp db3f768b-4ec7-4178-b70b-b4b036c84502)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (gr_text "Attributes" (at 75 37.5) (layer "F.Cu") (tstamp e0ff723e-9da4-419a-9b7c-537137a1c661)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-
-)
diff --git a/tests/testdata/board/test_boardStackup32LayerDielectricsVias b/tests/testdata/board/test_boardStackup32LayerDielectricsVias
deleted file mode 100644
index c3b2634..0000000
--- a/tests/testdata/board/test_boardStackup32LayerDielectricsVias
+++ /dev/null
@@ -1,302 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 1.584757)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (1 "In1.Cu" signal)
-    (2 "In2.Cu" signal)
-    (3 "In3.Cu" signal)
-    (4 "In4.Cu" signal)
-    (5 "In5.Cu" signal)
-    (6 "In6.Cu" signal)
-    (7 "In7.Cu" signal)
-    (8 "In8.Cu" signal)
-    (9 "In9.Cu" signal)
-    (10 "In10.Cu" signal)
-    (11 "In11.Cu" signal)
-    (12 "In12.Cu" signal)
-    (13 "In13.Cu" signal)
-    (14 "In14.Cu" signal)
-    (15 "In15.Cu" signal)
-    (16 "In16.Cu" signal)
-    (17 "In17.Cu" signal)
-    (18 "In18.Cu" signal)
-    (19 "In19.Cu" signal)
-    (20 "In20.Cu" signal)
-    (21 "In21.Cu" signal)
-    (22 "In22.Cu" signal)
-    (23 "In23.Cu" signal)
-    (24 "In24.Cu" signal)
-    (25 "In25.Cu" signal)
-    (26 "In26.Cu" signal)
-    (27 "In27.Cu" signal)
-    (28 "In28.Cu" signal)
-    (29 "In29.Cu" signal)
-    (30 "In30.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (stackup
-      (layer "F.SilkS" (type "Top Silk Screen"))
-      (layer "F.Paste" (type "Top Solder Paste"))
-      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
-      (layer "F.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 1" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
-        addsublayer (thickness 0.014347)
-        addsublayer (thickness 0.014347) (material "Ceramic") (epsilon_r 1) (loss_tangent 0)
-        addsublayer (thickness 0.014347) (material "Teflon") (epsilon_r 2.1) (loss_tangent 0.0002)
-        addsublayer (thickness 0.014347) (material "PTFE") (epsilon_r 2.1) (loss_tangent 0.0002)
-        addsublayer (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
-        addsublayer (thickness 0.014347) (material "FR408-HR") (epsilon_r 3.69) (loss_tangent 0.0091)
-        addsublayer (thickness 0.014347) (material "Polyimide") (epsilon_r 3.2) (loss_tangent 0.004)
-        addsublayer (thickness 0.014347) (material "Kapton") (epsilon_r 3.2) (loss_tangent 0.004)
-        addsublayer (thickness 0.014347) (material "Polyolefin") (epsilon_r 1) (loss_tangent 0)
-        addsublayer (thickness 0.014347) (material "Al") (epsilon_r 8.7) (loss_tangent 0.001))
-      (layer "In1.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 2" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In2.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 3" (type "core") (thickness 0.014347) (material "FR408-HR") (epsilon_r 3.69) (loss_tangent 0.0091))
-      (layer "In3.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 4" (type "core") (thickness 0.014347) (material "Polyimide") (epsilon_r 3.2) (loss_tangent 0.004))
-      (layer "In4.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 5" (type "core") (thickness 0.014347) (material "Kapton") (epsilon_r 3.2) (loss_tangent 0.004))
-      (layer "In5.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 6" (type "prepreg") (thickness 0.014347) (material "Polyolefin") (epsilon_r 1) (loss_tangent 0))
-      (layer "In6.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 7" (type "core") (thickness 0.014347) (material "Al") (epsilon_r 8.7) (loss_tangent 0.001))
-      (layer "In7.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 8" (type "prepreg") (thickness 0.014347) (material "PTFE") (epsilon_r 2.1) (loss_tangent 0.0002))
-      (layer "In8.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 9" (type "core") (thickness 0.014347) (material "Teflon") (epsilon_r 2.1) (loss_tangent 0.0002))
-      (layer "In9.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 10" (type "prepreg") (thickness 0.014347) (material "Ceramic") (epsilon_r 1) (loss_tangent 0))
-      (layer "In10.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 11" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In11.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 12" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In12.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 13" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In13.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 14" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In14.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 15" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
-        addsublayer (thickness 0.014347))
-      (layer "In15.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 16" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In16.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 17" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In17.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 18" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
-        addsublayer (thickness 0.014347)
-        addsublayer (thickness 0.014347)
-        addsublayer (thickness 0.014347))
-      (layer "In18.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 19" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
-        addsublayer (thickness 0.014347))
-      (layer "In19.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 20" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In20.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 21" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In21.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 22" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In22.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 23" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In23.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 24" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In24.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 25" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In25.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 26" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In26.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 27" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In27.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 28" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In28.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 29" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In29.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 30" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In30.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 31" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "B.Cu" (type "copper") (thickness 0.035))
-      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
-      (layer "B.Paste" (type "Bottom Solder Paste"))
-      (layer "B.SilkS" (type "Bottom Silk Screen"))
-      (copper_finish "None")
-      (dielectric_constraints yes)
-    )
-    (pad_to_mask_clearance 0)
-    (pcbplotparams
-      (layerselection 0x00010fc_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes true)
-      (usegerberadvancedattributes true)
-      (creategerberjobfile true)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer true)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 15.000000)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 1)
-      (mirror false)
-      (drillshape 1)
-      (scaleselection 1)
-      (outputdirectory "")
-    )
-  )
-
-  (net 0 "")
-
-  (gr_rect (start 114.7 121) (end 190.65 45.05) (layer "Edge.Cuts") (width 0.1) (fill none) (tstamp 2f680110-9ea0-4f48-b5a6-990648d3cde2))
-  (gr_text "Test: 32layer with vias, all stackup options" (at 152.95 118.75) (layer "Cmts.User") (tstamp 234e1024-0b7f-410c-90bb-bae43af1eb25)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-
-  (segment (start 144.7 59.75) (end 137.3 59.75) (width 0.25) (layer "F.Cu") (net 0) (tstamp 5eac54c5-305d-41d6-8b17-f9ef74142fc5))
-  (segment (start 145.15 60.2) (end 144.7 59.75) (width 0.25) (layer "F.Cu") (net 0) (tstamp 685bf253-7e51-40ec-8d43-57d69d12e5e2))
-  (via (at 153.5 64.65) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 1e3639f5-e7e3-4694-9294-3921c4c3d8d8))
-  (via (at 156.2 55.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 220ae943-0254-4741-8fa8-609b50152f00))
-  (via (at 164 58.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 2ba79d5f-5977-4383-8973-1b3369469cc2))
-  (via (at 145.15 60.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 2eae7d9d-0d7d-4755-80a4-ff458c263895))
-  (via (at 168.5 62.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 31fa6d01-f08a-43ea-8ee1-231130e6a24b))
-  (via (at 149.3 62.7) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 450796ed-160e-4912-8510-5adfc8f1a2f5))
-  (via (at 153.9 59.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 4a1889be-7ec6-405b-ae5a-773fc21e97e9))
-  (via (at 151.6 54.35) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 57720542-bdde-4812-ae04-f6c39f4da1e5))
-  (via (at 154.55 57.7) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 5b939979-83f4-492c-9866-1d110eaa3f6d))
-  (via (at 162.95 67.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 5c4ef3fb-31b1-4cc2-b877-62be82f2b495))
-  (via (at 165.1 63.65) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 5e906fab-cbda-4297-8a09-9e12dae7620b))
-  (via (at 156 65.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 6483a61d-b10a-47a8-8abb-aca573d14ee8))
-  (via (at 152.05 56.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 724c973a-b963-461f-871b-611c05be41a1))
-  (via (at 169.85 65.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 79e2f0c8-67c7-4822-912a-bfefb7447fda))
-  (via (at 158.15 58.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 836aa7f5-ce01-4f10-a876-590770e0c112))
-  (via (at 168.3 67.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 854c27b1-9f79-4add-b6f5-27fba8034c5b))
-  (via (at 148.45 55.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 88b32a43-2aa8-4784-ba7a-1ffdefcc0b42))
-  (via (at 147.65 61.1) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 8ebf6100-3981-45dc-a269-6504480f2134))
-  (via (at 148.15 57.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 90d375ea-7f4d-4536-858b-4b9304172f6b))
-  (via (at 162.1 60.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 925aa975-acb4-40c2-9c04-99557189f722))
-  (via (at 159.05 63.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 993ff105-4d18-4c9e-91c5-e8c562468585))
-  (via (at 166.5 60.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp 9fa95695-028d-49e5-b6f4-7e3b558d3e99))
-  (via (at 165.65 66.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp a12ccdb6-3679-4846-a6aa-1c003e3aea6b))
-  (via (at 151.15 63.5) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp aed52a1c-d78d-4328-9a5b-0dae9cca9894))
-  (via (at 160.85 68.6) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp b2d2c42f-0606-483f-b2ca-07b067e11e4c))
-  (via (at 155.8 62.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp cca20c0e-4dd8-43e2-8d36-77b8f7eb2b62))
-  (via (at 151.9 59.45) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp d610351c-a190-40a1-99e0-2223063accfd))
-  (via (at 160.25 56.4) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp f2432da9-7fb9-4817-b2fc-dc1f41d2c4ed))
-  (via (at 161.85 64.9) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp f525c2ca-e7ba-4514-91bc-134c7eeb6847))
-  (via (at 158.65 67.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (tstamp f7a08f47-28a3-4664-b73f-efd412909c91))
-  (segment (start 146.75 60.2) (end 147.65 61.1) (width 0.25) (layer "In1.Cu") (net 0) (tstamp 03180fc3-312d-4869-989b-36a0aa8fbbab))
-  (segment (start 145.15 60.2) (end 146.75 60.2) (width 0.25) (layer "In1.Cu") (net 0) (tstamp 2da0c218-f525-488e-ae52-b37371a9c8c4))
-  (segment (start 147.65 61.1) (end 147.7 61.1) (width 0.25) (layer "In2.Cu") (net 0) (tstamp 6911136d-fdd3-47b3-b66b-8d24bb74a91c))
-  (segment (start 147.7 61.1) (end 149.3 62.7) (width 0.25) (layer "In2.Cu") (net 0) (tstamp b1bbf5fc-248f-4f6e-a178-1cd932e30d02))
-  (segment (start 149.3 62.7) (end 150.35 62.7) (width 0.25) (layer "In3.Cu") (net 0) (tstamp 731de235-0a1b-4129-aca9-586f376a2413))
-  (segment (start 150.35 62.7) (end 151.15 63.5) (width 0.25) (layer "In3.Cu") (net 0) (tstamp f241e0ee-d3d0-4acb-927b-10754037fbc9))
-  (segment (start 153.35 64.45) (end 153.5 64.6) (width 0.25) (layer "In4.Cu") (net 0) (tstamp 274414ab-1890-467f-a7af-4d612100a2a6))
-  (segment (start 153.5 64.6) (end 153.5 64.65) (width 0.25) (layer "In4.Cu") (net 0) (tstamp 5732fe89-5269-4719-98b5-f2ef3f341659))
-  (segment (start 152.4 63.5) (end 153.35 64.45) (width 0.25) (layer "In4.Cu") (net 0) (tstamp 5740f5f1-37d4-456c-875e-9ebb35ecd00c))
-  (segment (start 151.15 63.5) (end 152.4 63.5) (width 0.25) (layer "In4.Cu") (net 0) (tstamp ff9989c6-7a02-4da9-9a30-c5fc15f960c5))
-  (segment (start 154.7 64.65) (end 156 65.95) (width 0.25) (layer "In6.Cu") (net 0) (tstamp 87b77cd9-8a80-463a-8114-083d84bc0705))
-  (segment (start 153.5 64.65) (end 154.7 64.65) (width 0.25) (layer "In6.Cu") (net 0) (tstamp e2b3c6db-26a0-4a0f-91e3-f3850153add5))
-  (segment (start 157.55 65.95) (end 158.65 67.05) (width 0.25) (layer "In7.Cu") (net 0) (tstamp 4f4ed3ff-b7e3-455c-be2d-f1d3c4be2168))
-  (segment (start 156 65.95) (end 157.55 65.95) (width 0.25) (layer "In7.Cu") (net 0) (tstamp d375f196-6f2b-4a02-b59f-0abcafe1e5a7))
-  (segment (start 158.65 67.05) (end 160.2 68.6) (width 0.25) (layer "In8.Cu") (net 0) (tstamp 3df43fbc-36ba-406a-97a8-4326d8392fc2))
-  (segment (start 160.2 68.6) (end 160.85 68.6) (width 0.25) (layer "In8.Cu") (net 0) (tstamp 5cca554f-4493-4aeb-a530-f254ededae9e))
-  (segment (start 161.4 68.6) (end 162.95 67.05) (width 0.25) (layer "In9.Cu") (net 0) (tstamp 136f24ab-7b8a-4b96-87e9-b51854289072))
-  (segment (start 160.85 68.6) (end 161.4 68.6) (width 0.25) (layer "In9.Cu") (net 0) (tstamp faa455ea-93b0-4a12-9af2-c32e7eee6d37))
-  (segment (start 162.95 66) (end 161.85 64.9) (width 0.25) (layer "In10.Cu") (net 0) (tstamp 63f4f2c3-230e-4140-b561-60dc7b883135))
-  (segment (start 162.95 67.05) (end 162.95 66) (width 0.25) (layer "In10.Cu") (net 0) (tstamp db661329-9c51-496c-9e62-370ebf0236be))
-  (segment (start 161.85 64.9) (end 160.15 63.2) (width 0.25) (layer "In11.Cu") (net 0) (tstamp 86819d76-65c8-4796-96b4-d5a97cd6067b))
-  (segment (start 160.15 63.2) (end 159.05 63.2) (width 0.25) (layer "In11.Cu") (net 0) (tstamp f79600f0-8aca-4c42-bd73-ad5321120380))
-  (segment (start 159.05 63.2) (end 158 62.15) (width 0.25) (layer "In12.Cu") (net 0) (tstamp 4defc198-fb73-4f9a-8a9d-cd22f4be094e))
-  (segment (start 158 62.15) (end 155.8 62.15) (width 0.25) (layer "In12.Cu") (net 0) (tstamp b83aa53f-6f3f-48bf-b41f-2e5458df2888))
-  (segment (start 155.8 61.85) (end 153.9 59.95) (width 0.25) (layer "In13.Cu") (net 0) (tstamp cd5690a3-890c-4d22-9010-3d73ae7c1982))
-  (segment (start 155.8 62.15) (end 155.8 61.85) (width 0.25) (layer "In13.Cu") (net 0) (tstamp ff164f5f-b65f-4b7d-ba28-85fe41257652))
-  (segment (start 153.9 58.35) (end 154.5 57.75) (width 0.25) (layer "In14.Cu") (net 0) (tstamp 4175c327-a7fe-4d84-ba69-9ba6e02c58fb))
-  (segment (start 154.5 57.75) (end 154.55 57.7) (width 0.25) (layer "In14.Cu") (net 0) (tstamp a4c2edd2-4235-4d48-bf1f-9b46ae9e7214))
-  (segment (start 153.9 59.95) (end 153.9 58.35) (width 0.25) (layer "In14.Cu") (net 0) (tstamp f25081e3-594c-4e20-a3a0-8c78739d4347))
-  (segment (start 154.55 57.7) (end 157.6 57.7) (width 0.25) (layer "In15.Cu") (net 0) (tstamp 067e1f81-db05-4864-9809-2651e108d482))
-  (segment (start 157.6 57.7) (end 158.15 58.25) (width 0.25) (layer "In15.Cu") (net 0) (tstamp 6f4bf812-138c-435a-8325-99bdfcb7fb2e))
-  (segment (start 160.25 58.25) (end 161.25 59.25) (width 0.25) (layer "In16.Cu") (net 0) (tstamp 18db2e23-c07f-425e-8626-59b05d187cdb))
-  (segment (start 161.25 59.25) (end 162.05 60.05) (width 0.25) (layer "In16.Cu") (net 0) (tstamp 6b483d33-c0bf-448c-b303-85c0149143f3))
-  (segment (start 158.15 58.25) (end 160.25 58.25) (width 0.25) (layer "In16.Cu") (net 0) (tstamp c1b00961-3b9d-43ec-8cf1-783520d22caf))
-  (segment (start 162.05 60.05) (end 162.1 60.05) (width 0.25) (layer "In16.Cu") (net 0) (tstamp f4b00c54-9ad1-49cc-a893-af751b7bbde3))
-  (segment (start 162.6 60.05) (end 164.6 62.05) (width 0.25) (layer "In17.Cu") (net 0) (tstamp 06d2d69f-d8bf-4375-b5cb-db5a5577fb80))
-  (segment (start 164.6 62.05) (end 165.1 62.55) (width 0.25) (layer "In17.Cu") (net 0) (tstamp 2a66e9ef-e8ab-4c4d-87c1-6f2381e86cbc))
-  (segment (start 162.1 60.05) (end 162.6 60.05) (width 0.25) (layer "In17.Cu") (net 0) (tstamp 5f88dafe-e614-4523-9531-1af57eb8ba33))
-  (segment (start 165.1 62.55) (end 165.1 63.65) (width 0.25) (layer "In17.Cu") (net 0) (tstamp 72cfee45-fa9b-45ce-b9fa-cc4411a7e95d))
-  (segment (start 165.1 63.65) (end 165.65 64.2) (width 0.25) (layer "In18.Cu") (net 0) (tstamp 103a284d-ee0f-4a43-aeda-897caf2e8367))
-  (segment (start 165.65 64.2) (end 165.65 66.75) (width 0.25) (layer "In18.Cu") (net 0) (tstamp bc663e7e-08a9-4a6b-8220-6d0f3194a366))
-  (segment (start 166.85 67.95) (end 168.3 67.95) (width 0.25) (layer "In19.Cu") (net 0) (tstamp 2f28b0db-d4f5-43f6-9931-bc649cfd4f51))
-  (segment (start 165.65 66.75) (end 166.85 67.95) (width 0.25) (layer "In19.Cu") (net 0) (tstamp 6ff25e28-6290-4c29-a474-b6a86c1058fa))
-  (segment (start 169.85 66.4) (end 169.85 65.75) (width 0.25) (layer "In20.Cu") (net 0) (tstamp 65ed6649-7f77-42ba-8364-96e8d5d3ec59))
-  (segment (start 168.3 67.95) (end 169.85 66.4) (width 0.25) (layer "In20.Cu") (net 0) (tstamp e5c3f5b3-a5f3-46be-9b89-679fc8febc4b))
-  (segment (start 169.85 64.15) (end 168.5 62.8) (width 0.25) (layer "In21.Cu") (net 0) (tstamp 6f351650-f7b7-4858-94c3-8f05440b4c8e))
-  (segment (start 169.85 65.75) (end 169.85 64.15) (width 0.25) (layer "In21.Cu") (net 0) (tstamp adc472b6-4ccf-4707-a522-ea736bab0160))
-  (segment (start 168.5 62.8) (end 166.5 60.8) (width 0.25) (layer "In22.Cu") (net 0) (tstamp c8f58c2d-07ec-4355-92b4-a1615dc2f910))
-  (segment (start 166.5 60.8) (end 166.5 60.25) (width 0.25) (layer "In22.Cu") (net 0) (tstamp f94a9243-578c-48e9-80e5-08059b48ed8f))
-  (segment (start 166.05 60.25) (end 164 58.2) (width 0.25) (layer "In23.Cu") (net 0) (tstamp 2c44890e-4662-4746-a19e-78e2193fd9f2))
-  (segment (start 166.5 60.25) (end 166.05 60.25) (width 0.25) (layer "In23.Cu") (net 0) (tstamp 74e4453c-acbd-445e-81b1-19ce1f70bca9))
-  (segment (start 164 58.2) (end 162.2 56.4) (width 0.25) (layer "In24.Cu") (net 0) (tstamp 0c926f8b-4916-443b-b8d5-b5866414d198))
-  (segment (start 162.2 56.4) (end 160.25 56.4) (width 0.25) (layer "In24.Cu") (net 0) (tstamp f6dfbb3b-b43f-42d3-96ef-f25f5dec1e4e))
-  (segment (start 159.6 55.75) (end 156.2 55.75) (width 0.25) (layer "In25.Cu") (net 0) (tstamp bb715cff-2ca3-46b1-abaa-1d9fa4c43041))
-  (segment (start 160.25 56.4) (end 159.6 55.75) (width 0.25) (layer "In25.Cu") (net 0) (tstamp ee1ec701-2df3-4881-b756-1b8be0691e2c))
-  (segment (start 156.2 55.75) (end 152.55 55.75) (width 0.25) (layer "In26.Cu") (net 0) (tstamp 7121bed1-5309-4e64-a00e-2832628aef31))
-  (segment (start 152.55 55.75) (end 152.05 56.25) (width 0.25) (layer "In26.Cu") (net 0) (tstamp 94b2fe74-b15f-4aa7-83b4-ef7298874c10))
-  (segment (start 152.05 59.3) (end 151.9 59.45) (width 0.25) (layer "In27.Cu") (net 0) (tstamp 065d0979-edbd-499d-acf7-48acd2b15b4e))
-  (segment (start 152.05 56.25) (end 152.05 59.3) (width 0.25) (layer "In27.Cu") (net 0) (tstamp a3fb90e3-ac89-447a-8b70-fc5712ec8136))
-  (segment (start 149.8 59.45) (end 148.15 57.8) (width 0.25) (layer "In28.Cu") (net 0) (tstamp 067a4748-f609-4499-b85b-6eef639d260e))
-  (segment (start 151.9 59.45) (end 149.8 59.45) (width 0.25) (layer "In28.Cu") (net 0) (tstamp a8c4cc10-c733-4c4d-841f-01c8a6a861e8))
-  (segment (start 148.15 57.8) (end 148.15 55.45) (width 0.25) (layer "In29.Cu") (net 0) (tstamp a22ef832-33fc-4544-9dac-b6ed3c7ca675))
-  (segment (start 148.15 55.45) (end 148.45 55.15) (width 0.25) (layer "In29.Cu") (net 0) (tstamp e7b1a473-dadf-489b-a0f8-58c84c047f98))
-  (segment (start 150.8 55.15) (end 151.6 54.35) (width 0.25) (layer "In30.Cu") (net 0) (tstamp c9b3d24b-4abb-43e2-ae80-4d577887d84a))
-  (segment (start 148.45 55.15) (end 150.8 55.15) (width 0.25) (layer "In30.Cu") (net 0) (tstamp d30d9ed3-c9de-4a8d-a687-0b172219a5f4))
-  (segment (start 153.2 52.75) (end 154.4 52.75) (width 0.25) (layer "B.Cu") (net 0) (tstamp 2c186cbf-9cac-4388-adb2-6d310baf89db))
-  (segment (start 151.6 54.35) (end 153.2 52.75) (width 0.25) (layer "B.Cu") (net 0) (tstamp 728c79e9-5768-4bc5-81e1-e9810ba43862))
-
-)
diff --git a/tests/testdata/board/test_boardTraceArcs b/tests/testdata/board/test_boardTraceArcs
deleted file mode 100644
index 749a3c8..0000000
--- a/tests/testdata/board/test_boardTraceArcs
+++ /dev/null
@@ -1,397 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-    (pcbplotparams
-      (layerselection 0x00010fc_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes true)
-      (usegerberadvancedattributes true)
-      (creategerberjobfile true)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer true)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 15.000000)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 1)
-      (mirror false)
-      (drillshape 1)
-      (scaleselection 1)
-      (outputdirectory "")
-    )
-  )
-
-  (net 0 "")
-  (net 1 "TEST_N")
-  (net 2 "TEST_P")
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp a6a16e4a-47c2-4244-ba11-78b40782f3f4)
-    (at 73.5 110.75)
-    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
-    (tags "PCIe")
-    (attr exclude_from_pos_files exclude_from_bom)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
-      (effects (font (size 0.5 0.5) (thickness 0.1)))
-      (tstamp 5886e575-b80c-446f-a435-0b4c9526c94e)
-    )
-    (fp_text user "${REFERENCE}" (at 16 -3.5) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp e8ae8aa2-6c83-4751-87be-af18c04f637b)
-    )
-    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 0978854b-7f2d-4e70-81ad-b8366855ab91))
-    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 36570266-ac30-48fb-a957-d39c502c9460))
-    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp 520ddf64-73f0-4767-8391-a2c8400d2889))
-    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 61a51970-fbbc-4b1e-a7ae-feb21648f6ac))
-    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 6f6fc535-e6ac-4715-a245-11d18639fbe6))
-    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp 7807c7b7-7ef2-4f78-b820-a3d80a6a5558))
-    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp ab5fd570-a8ed-41be-bdc9-9bca7f01f72f))
-    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (tstamp b2b23386-d0d5-4278-8953-0c9c0e5e73f7))
-    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp cdbebb5e-a816-472c-9169-2f89317f1f2a))
-    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (tstamp df8ca82e-d7eb-4065-8722-73c6f9311432))
-    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (tstamp 91696539-77c4-4a75-8e58-8ed056557991))
-    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 48ced388-1009-47c0-9121-927d687fa0e0))
-    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (tstamp 743d8da9-eb43-4371-8313-505007abb989))
-    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp 973b69bd-3173-4927-bd5c-d73e14d856a7))
-    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (tstamp f220da3f-d9e9-4b5a-81e2-bb395123fe5f))
-    (pad "A1" connect rect locked (at 0 -0.55) (size 0.7 3.2) (layers "B.Cu" "B.Mask") (tstamp de88ea3f-d699-4a70-9d06-d3f653a880a1))
-    (pad "A2" connect rect locked (at 1 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp e408af70-9a3d-4b30-a91f-1a69c4a24a80))
-    (pad "A3" connect rect locked (at 2 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp c5d90d50-8815-42b3-bdfe-855c387da089))
-    (pad "A4" connect rect locked (at 3 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 63622b85-ffc5-43a3-94fb-f01b29a8acd4))
-    (pad "A5" connect rect locked (at 4 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 66bacf32-932b-40ed-a996-33703e38cc32))
-    (pad "A6" connect rect locked (at 5 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 0963774c-b376-4594-a90e-ed8e9692b9ea))
-    (pad "A7" connect rect locked (at 6 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp aa662617-353d-45f8-8bab-007a7f6b3467))
-    (pad "A8" connect rect locked (at 7 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp de853116-f19f-4819-861d-91762ab22b12))
-    (pad "A9" connect rect locked (at 8 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp c7c0e390-c203-4145-83d2-d45b2a38bf27))
-    (pad "A10" connect rect locked (at 9 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 482345a1-5db6-4976-998d-99689809f8b9))
-    (pad "A11" connect rect locked (at 10 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 708ae4a5-cc3f-4ad0-be7f-b39e38a69ee8))
-    (pad "A12" connect rect locked (at 13 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 82e0154d-bac7-4cee-a21e-0b2c2ee07d0b))
-    (pad "A13" connect rect locked (at 14 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 76fc4407-90fd-4aaf-98db-fa3f5f5824d3))
-    (pad "A14" connect rect locked (at 15 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp cfa6ece6-c4c2-463e-8243-39f87684a7cc))
-    (pad "A15" connect rect locked (at 16 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp 2b94326e-f7bf-4dbf-8a23-87f97d0455b1))
-    (pad "A16" connect rect locked (at 17 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp e73ce984-61c1-440b-8d6a-e6928e7cdf0d))
-    (pad "A17" connect rect locked (at 18 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp c1819ec4-16c4-4ca2-a3c6-660ab0af6d34))
-    (pad "A18" connect rect locked (at 19 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (tstamp bd8ee00d-ca1d-429c-904e-a26bd6cdb80f))
-    (pad "B1" connect rect locked (at 0 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 19a4e55b-bef5-4b8e-a8cb-f21d84bcf738))
-    (pad "B2" connect rect locked (at 1 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 1dd7e11e-43e2-490d-b80a-72ae7a1e8bc8))
-    (pad "B3" connect rect locked (at 2 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp c43cbf1b-8636-4086-a009-2ead27837232))
-    (pad "B4" connect rect locked (at 3 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp eafafa71-871e-4e08-a0ad-415cc5927655))
-    (pad "B5" connect rect locked (at 4 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 5012e427-2605-4ef6-8acf-e8763ef0a984))
-    (pad "B6" connect rect locked (at 5 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 7f280c56-2afd-45c5-b3ee-e6225c105eda))
-    (pad "B7" connect rect locked (at 6 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp c1344181-1d9e-48c4-b279-ab0e274e51f6))
-    (pad "B8" connect rect locked (at 7 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp c358d6d3-3fc1-4255-889b-dd8456b5bf5d))
-    (pad "B9" connect rect locked (at 8 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp b0901133-9ac8-4fae-b1c3-23a5c59648f4))
-    (pad "B10" connect rect locked (at 9 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 76f0ae03-8a81-4e03-82cc-697b8a2d3dc9))
-    (pad "B11" connect rect locked (at 10 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 4a6f7f58-ffa1-4ce0-84a4-a43028bdaf25))
-    (pad "B12" connect rect locked (at 13 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 9608f371-5068-4dfe-bc11-cbcdf54d5e25))
-    (pad "B13" connect rect locked (at 14 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp d9ecd9ae-ef0a-439f-b17a-557e46b82925))
-    (pad "B14" connect rect locked (at 15 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask")
-      (net 1 "TEST_N") (tstamp 50b3c388-70c2-40f0-bcab-91360d921fbd))
-    (pad "B15" connect rect locked (at 16 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask")
-      (net 2 "TEST_P") (tstamp 56d30706-3bc3-4351-80e6-e342c04c34e6))
-    (pad "B16" connect rect locked (at 17 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 6ff6dbdb-8494-4d96-9edf-cb4316c92b89))
-    (pad "B17" connect rect locked (at 18 -0.55) (size 0.7 3.2) (layers "F.Cu" "F.Mask") (tstamp a3299ab5-3dc3-46bd-84ec-03bef122851b))
-    (pad "B18" connect rect locked (at 19 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (tstamp 1c359650-9720-4ff5-b7eb-b9ba37db5887))
-  )
-
-  (segment (start 79.575 85.25) (end 79.575 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 1f70f301-365b-4bf3-883c-59357e017501))
-  (segment (start 77.625 85.847553) (end 77.625 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 3134b71b-94df-4d19-a697-2cd2ff759022))
-  (segment (start 81.525 85.847553) (end 81.525 85.575) (width 0.25) (layer "F.Cu") (net 0) (tstamp 5d09d6c7-c8e2-47a4-9a31-bc7069da0fda))
-  (segment (start 78.925 85.847553) (end 78.925 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 66f6c454-1819-42e3-98dd-fb819b52f248))
-  (segment (start 80.225 85.847553) (end 80.225 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 72e72cc1-10bf-4bad-8b18-04e994c8c31d))
-  (segment (start 81.85 85.25) (end 86.5 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 74773e57-ce2a-4420-b5af-ba52c5ad2f54))
-  (segment (start 77.625 85.25) (end 77.625 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 7b1c3ce2-19ed-4193-a707-747b919e6b12))
-  (segment (start 76.975 84.925) (end 76.975 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 8849523f-7a7f-4ff3-9ba1-4622e67251c7))
-  (segment (start 76.975 84.652447) (end 76.975 84.925) (width 0.25) (layer "F.Cu") (net 0) (tstamp 89bab1ec-7b06-4cde-aad6-c05ecfe09008))
-  (segment (start 90.85 89.6) (end 93.15 89.6) (width 0.25) (layer "F.Cu") (net 0) (tstamp 8f4e3db5-05f0-4080-87ad-27c79291edcf))
-  (segment (start 97.5 85.25) (end 99.8 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 99f32141-9573-4c1d-adc2-894e0513462c))
-  (segment (start 80.875 85.25) (end 80.875 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 9d3545bb-4848-4d9f-a3e2-b087c5a7b710))
-  (segment (start 66.5 85.25) (end 76 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp aa402c32-bc32-4c87-8324-7695fad8e379))
-  (segment (start 99.8 85.25) (end 154.25 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp ac9969d1-3a18-4e1a-92dd-1c23de623e5e))
-  (segment (start 78.275 84.652447) (end 78.275 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp d45298b6-27af-4d03-bace-df63014b28a0))
-  (segment (start 78.275 85.25) (end 78.275 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp e0578357-4dd3-4a10-b08b-9f0eb05be146))
-  (segment (start 80.875 84.652447) (end 80.875 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp e0c87e08-6f21-440c-ae07-39c8087e28b9))
-  (segment (start 79.575 84.652447) (end 79.575 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp e25b0f05-f1d8-4137-9ec4-3f98aeb0c3ca))
-  (segment (start 80.225 85.25) (end 80.225 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp f1878df8-3f7d-4948-9a45-bfaee4115961))
-  (segment (start 76.325 84.925) (end 76.325 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp f1dbc5df-b393-4115-8517-40dcc9e91ecf))
-  (segment (start 78.925 85.25) (end 78.925 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp f651eb1d-6032-4461-a4c6-b3851a4abb2c))
-  (arc (start 78.6 86.172553) (mid 78.82981 86.077363) (end 78.925 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 052e1588-3d10-4882-8522-7ef5c69d2fb5))
-  (arc (start 79.25 84.327447) (mid 79.47981 84.422637) (end 79.575 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 10f4b14f-a3f2-45ee-990e-884505edc545))
-  (arc (start 77.3 86.172553) (mid 77.52981 86.077363) (end 77.625 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 1a4b5e66-99ad-408b-8389-f20db8ca9b26))
-  (arc (start 77.625 84.652447) (mid 77.72019 84.422637) (end 77.95 84.327447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 27105bf6-d25e-43b2-9995-951213911b71))
-  (arc (start 93.15 89.6) (mid 94.687957 88.962957) (end 95.325 87.425) (width 0.25) (layer "F.Cu") (net 0) (tstamp 28f56bd3-9283-48fb-83c0-7e3c278ab060))
-  (arc (start 88.675 87.425) (mid 89.312043 88.962957) (end 90.85 89.6) (width 0.25) (layer "F.Cu") (net 0) (tstamp 2c8e825d-6b3d-41c0-a78b-d002906b71c4))
-  (arc (start 76.325 84.652447) (mid 76.42019 84.422637) (end 76.65 84.327447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 3e36ab66-1e68-4565-b340-48ef54c5f43a))
-  (arc (start 80.55 84.327447) (mid 80.77981 84.422637) (end 80.875 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 3f8abd62-9048-4be2-be46-7f58d9159afa))
-  (arc (start 80.225 84.652447) (mid 80.32019 84.422637) (end 80.55 84.327447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 49327086-73d2-4050-9183-c50425fa3341))
-  (arc (start 81.525 85.575) (mid 81.62019 85.34519) (end 81.85 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 4b67d223-90b5-4fe0-89a1-84d28e97e760))
-  (arc (start 76.975 85.847553) (mid 77.07019 86.077363) (end 77.3 86.172553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 53345ba3-3905-4973-8b65-ea17a19768d3))
-  (arc (start 95.325 87.425) (mid 95.962043 85.887043) (end 97.5 85.25) (width 0.25) (layer "F.Cu") (net 0) (tstamp 5d3109c3-af88-4052-91c9-ebca37e2bef0))
-  (arc (start 86.5 85.25) (mid 88.037957 85.887043) (end 88.675 87.425) (width 0.25) (layer "F.Cu") (net 0) (tstamp 6c347053-8fc9-4fd0-999a-80cd1d05ea04))
-  (arc (start 80.875 85.847553) (mid 80.97019 86.077363) (end 81.2 86.172553) (width 0.25) (layer "F.Cu") (net 0) (tstamp 6db4b0e2-2878-4810-a65f-f8f880c4cb95))
-  (arc (start 77.95 84.327447) (mid 78.17981 84.422637) (end 78.275 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 83453e05-b539-45a3-8b31-e4019df6a03b))
-  (arc (start 78.925 84.652447) (mid 79.02019 84.422637) (end 79.25 84.327447) (width 0.25) (layer "F.Cu") (net 0) (tstamp 9d0a4cb0-b9ef-4f0e-8fc8-06d04a746603))
-  (arc (start 81.2 86.172553) (mid 81.42981 86.077363) (end 81.525 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp bdccf0ff-3344-434a-a650-8e5899794311))
-  (arc (start 79.575 85.847553) (mid 79.67019 86.077363) (end 79.9 86.172553) (width 0.25) (layer "F.Cu") (net 0) (tstamp bfcd0536-6978-4c54-8935-7ecc7b6a0b86))
-  (arc (start 76.65 84.327447) (mid 76.87981 84.422637) (end 76.975 84.652447) (width 0.25) (layer "F.Cu") (net 0) (tstamp d9a67ef6-2743-4b61-9ba1-307cb1b078b1))
-  (arc (start 79.9 86.172553) (mid 80.12981 86.077363) (end 80.225 85.847553) (width 0.25) (layer "F.Cu") (net 0) (tstamp e0f21f4e-b518-4935-9749-606087d4a884))
-  (arc (start 76 85.25) (mid 76.22981 85.15481) (end 76.325 84.925) (width 0.25) (layer "F.Cu") (net 0) (tstamp f4686051-11de-4ef5-ae3f-499b723a2637))
-  (arc (start 78.275 85.847553) (mid 78.37019 86.077363) (end 78.6 86.172553) (width 0.25) (layer "F.Cu") (net 0) (tstamp fd17b531-df9d-42e3-8f77-6b00b931f015))
-  (segment (start 71.675 98.55) (end 71.675 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp 039aa012-f1fa-43f7-ae22-9712ce6700f1))
-  (segment (start 86.1568 97.975) (end 88.775 100.5932) (width 0.2) (layer "F.Cu") (net 1) (tstamp 2da591a3-6e1f-401e-b546-57e02f378ea9))
-  (segment (start 72.075 96.95) (end 72.075 97.525) (width 0.2) (layer "F.Cu") (net 1) (tstamp 35db8d54-eaa9-4183-b556-a8cb68d057d1))
-  (segment (start 88.775 107.249999) (end 88.5 107.524999) (width 0.2) (layer "F.Cu") (net 1) (tstamp 4f5c21a3-4c79-48b4-ab90-c65789597287))
-  (segment (start 70.375 96.95) (end 70.375 97.525) (width 0.2) (layer "F.Cu") (net 1) (tstamp 5f945720-da45-4930-a5ed-b66aa71c5314))
-  (segment (start 73.375 98.55) (end 73.375 98.175) (width 0.2) (layer "F.Cu") (net 1) (tstamp 7d6d6475-6516-4a66-a923-a295358a0cb5))
-  (segment (start 66.975 98.175) (end 66.975 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp 7e4179eb-ba11-40f3-b081-d1c757b70262))
-  (segment (start 71.675 97.975) (end 71.675 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp 8a6e7823-3391-4e54-96e2-3184c60c4d52))
-  (segment (start 69.975 97.975) (end 69.975 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp 8c99c5d3-7ae5-4206-97ab-5d6b29a4fec4))
-  (segment (start 68.275 98.175) (end 68.275 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp 906bfecb-f12b-4023-b80a-3fe48766fac3))
-  (segment (start 88.775 100.5932) (end 88.775 107.249999) (width 0.2) (layer "F.Cu") (net 1) (tstamp a0300586-99e5-4491-8eb2-41e7d745bf10))
-  (segment (start 70.375 97.525) (end 70.375 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp b07d43c0-4d18-408b-9d9e-0ce113f0ef7f))
-  (segment (start 69.975 98.55) (end 69.975 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp b32da7db-26e4-4806-82f7-ed6613bffe02))
-  (segment (start 68.675 96.95) (end 68.675 97.525) (width 0.2) (layer "F.Cu") (net 1) (tstamp baf567e9-6da6-4636-91dd-b9fa515ca620))
-  (segment (start 68.275 98.55) (end 68.275 98.175) (width 0.2) (layer "F.Cu") (net 1) (tstamp c026dea3-3d96-4512-94b8-79a9373e38ac))
-  (segment (start 63.5 97.975) (end 66.775 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp dbdf2d02-16f4-455d-9ecf-e9ca499a5cb6))
-  (segment (start 73.575 97.975) (end 74.250366 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp e54d383b-e580-4fbf-a456-ae5e1bc7264d))
-  (segment (start 72.075 97.525) (end 72.075 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp ea013a3f-712a-4034-aa66-dccc401f3edc))
-  (segment (start 88.5 107.524999) (end 88.5 110.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp f15b7890-7890-4f03-b09f-f68ac18a7833))
-  (segment (start 68.675 97.525) (end 68.675 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp f3762dae-846e-4946-a834-2ea4d6f8a8fb))
-  (segment (start 74.250366 97.975) (end 86.1568 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp fa9c0566-7ecb-4410-afc3-4a0d94e75136))
-  (arc (start 71.875 96.75) (mid 72.016421 96.808579) (end 72.075 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp 08e3c2a3-9d19-4492-9a15-6f3eb748a9dd))
-  (arc (start 66.775 97.975) (mid 66.916421 98.033579) (end 66.975 98.175) (width 0.2) (layer "F.Cu") (net 1) (tstamp 193ab06f-2dc8-4ef9-b68e-8a6fdb811a8c))
-  (arc (start 71.675 96.95) (mid 71.733579 96.808579) (end 71.875 96.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp 1cf300a2-4cfc-4a49-b119-55be9ca6e530))
-  (arc (start 69.325 99.2) (mid 69.784619 99.009619) (end 69.975 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp 2f9261a4-6d77-4f48-9946-887df68c5623))
-  (arc (start 72.075 98.55) (mid 72.265381 99.009619) (end 72.725 99.2) (width 0.2) (layer "F.Cu") (net 1) (tstamp 38d8900c-0189-4d8a-8850-cc4c7d182607))
-  (arc (start 70.175 96.75) (mid 70.316421 96.808579) (end 70.375 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp 443c2a07-e2da-4dee-95b1-1da39022b7ed))
-  (arc (start 67.625 99.2) (mid 68.084619 99.009619) (end 68.275 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp 49d6181e-da6a-4ba4-8d73-06cb84808826))
-  (arc (start 71.025 99.2) (mid 71.484619 99.009619) (end 71.675 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp 4fd04d76-bcdf-4e8c-9ee9-52f4b923099d))
-  (arc (start 72.725 99.2) (mid 73.184619 99.009619) (end 73.375 98.55) (width 0.2) (layer "F.Cu") (net 1) (tstamp 5d3f5ed0-e6d7-43ca-a26c-f5c2b5c27710))
-  (arc (start 73.375 98.175) (mid 73.433579 98.033579) (end 73.575 97.975) (width 0.2) (layer "F.Cu") (net 1) (tstamp 75df9d90-1b85-489e-9b08-365c60ea6910))
-  (arc (start 68.275 96.95) (mid 68.333579 96.808579) (end 68.475 96.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp 88b4c3b5-cdba-451d-bfa9-6540b576b863))
-  (arc (start 66.975 98.55) (mid 67.165381 99.009619) (end 67.625 99.2) (width 0.2) (layer "F.Cu") (net 1) (tstamp 91968e3e-0a82-4f3d-ae95-acdd7a443f61))
-  (arc (start 68.675 98.55) (mid 68.865381 99.009619) (end 69.325 99.2) (width 0.2) (layer "F.Cu") (net 1) (tstamp afe1fad1-80ab-4362-b624-3fd8630ed17e))
-  (arc (start 68.475 96.75) (mid 68.616421 96.808579) (end 68.675 96.95) (width 0.2) (layer "F.Cu") (net 1) (tstamp e4699690-a3e3-4276-a309-fb7c9e011a61))
-  (arc (start 69.975 96.95) (mid 70.033579 96.808579) (end 70.175 96.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp e944669e-51b4-498b-8735-89631f6245f7))
-  (arc (start 70.375 98.55) (mid 70.565381 99.009619) (end 71.025 99.2) (width 0.2) (layer "F.Cu") (net 1) (tstamp f172e016-140e-4bc0-8a5a-df92d434e6ea))
-  (segment (start 69.125 97.525) (end 69.125 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp 01fc260c-f31b-4832-be9d-3335baefaf2f))
-  (segment (start 86.873528 97.66642) (end 87.191727 97.348222) (width 0.2) (layer "F.Cu") (net 2) (tstamp 04444529-526d-4f2a-801e-dfe5c849cb62))
-  (segment (start 67.825 98.55) (end 67.825 98.175) (width 0.2) (layer "F.Cu") (net 2) (tstamp 058f2974-a8da-4750-b8d4-e6c07c627654))
-  (segment (start 69.125 96.95) (end 69.125 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 05f1a672-320e-4a5d-b6c5-95c030b2f091))
-  (segment (start 88.429163 99.222053) (end 88.429162 99.222054) (width 0.2) (layer "F.Cu") (net 2) (tstamp 067bbb6e-f07e-473c-b0c7-2674420bcd03))
-  (segment locked (start 81.05 96.8) (end 81.05 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 0a51a454-56f1-4dee-be3d-931fa35c032d))
-  (segment locked (start 81.6 97.25) (end 81.6 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 10ffd6b8-5b30-427b-858f-b0033a6792d4))
-  (segment (start 89.5 102.0318) (end 89.95 102.0318) (width 0.2) (layer "F.Cu") (net 2) (tstamp 12bd2cc9-8270-4199-8899-5875333b66f1))
-  (segment (start 87.262435 98.444235) (end 87.262437 98.444237) (width 0.2) (layer "F.Cu") (net 2) (tstamp 13c6dcdb-11f1-4796-b5ce-53297f88bc7a))
-  (segment (start 89.95 103.6818) (end 89.5 103.6818) (width 0.2) (layer "F.Cu") (net 2) (tstamp 140def30-b7f8-4c15-b41a-1c4ec4f7ee21))
-  (segment (start 69.525 97.975) (end 69.525 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp 17335c66-5b48-47c8-9759-58939a5d451a))
-  (segment locked (start 83.25 96.8) (end 83.25 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 1bfc93fe-1c12-4335-b667-796f42ec48c0))
-  (segment (start 89.225 105.0568) (end 89.225 105.1068) (width 0.2) (layer "F.Cu") (net 2) (tstamp 236d6a3c-a18f-4fc7-8b86-877d5dcc595d))
-  (segment (start 73.575 97.525) (end 74.250366 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 25e69933-f67e-4342-bb6f-a94359a68e3d))
-  (segment locked (start 84.35 96.8) (end 84.35 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 278c3bc5-9b5a-4ceb-9ca4-7526c588549f))
-  (segment (start 87.580634 97.737131) (end 87.580635 97.73713) (width 0.2) (layer "F.Cu") (net 2) (tstamp 27dd17a6-8c6a-4f6d-8137-2a5cda6ea892))
-  (segment (start 89.136269 99.292764) (end 88.818069 99.610961) (width 0.2) (layer "F.Cu") (net 2) (tstamp 289f3222-691c-4792-b29a-953f304e5ce8))
-  (segment (start 89.225 100.4068) (end 89.225 100.6568) (width 0.2) (layer "F.Cu") (net 2) (tstamp 29e6c587-f9bb-49bc-bdd5-79643f36cb42))
-  (segment (start 88.429162 99.222054) (end 88.747361 98.903856) (width 0.2) (layer "F.Cu") (net 2) (tstamp 2a62f7e4-4a12-4b4e-aa31-70e6403fc30c))
-  (segment (start 69.525 98.55) (end 69.525 97.975) (width 0.2) (layer "F.Cu") (net 2) (tstamp 2c305703-3966-433f-a6f8-a6ae00035ee4))
-  (segment locked (start 77.75 96.8) (end 77.75 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 2fbb84e9-e012-44ee-81cc-8ff8088c2cb3))
-  (segment locked (start 82.7 97.25) (end 82.7 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 304f25fe-e38d-4377-b8f1-26289354f05c))
-  (segment locked (start 77.2 97.25) (end 77.2 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 32ffc3d7-adad-4f8b-a8fd-80686b74dbe9))
-  (segment (start 88.358453 98.12604) (end 88.358452 98.126039) (width 0.2) (layer "F.Cu") (net 2) (tstamp 33b2fad1-ba9a-43f3-8f55-743fade69647))
-  (segment locked (start 74.250366 97.525) (end 74.725 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3403c3ad-e3de-407c-8567-62d5134ef526))
-  (segment locked (start 84.9 97.25) (end 84.9 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 358414db-7f31-4504-a43d-29c53be1cc33))
-  (segment locked (start 85.45 96.8) (end 85.45 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3858089b-206d-43ca-8c24-189c8db5c5f7))
-  (segment locked (start 79.4 97.25) (end 79.4 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3dc108df-82d3-4ed6-b48d-0d3e1f490f7b))
-  (segment (start 67.825 98.175) (end 67.825 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3f87240f-2364-4bde-8631-ccd90d42850e))
-  (segment (start 89.95 101.4818) (end 89.5 101.4818) (width 0.2) (layer "F.Cu") (net 2) (tstamp 454fe726-8b63-4777-b61a-b44d84b3794d))
-  (segment (start 89.136268 99.292765) (end 89.136269 99.292764) (width 0.2) (layer "F.Cu") (net 2) (tstamp 49fec00e-0920-4074-aaa4-3fe85dfeaac2))
-  (segment (start 89.95 104.7818) (end 89.5 104.7818) (width 0.2) (layer "F.Cu") (net 2) (tstamp 4ba2b419-0f87-4491-aada-797b96e1dd3a))
-  (segment (start 88.040252 99.222052) (end 88.040254 99.222054) (width 0.2) (layer "F.Cu") (net 2) (tstamp 4db32d37-3877-478b-adc0-ed728e01783b))
-  (segment (start 88.040253 99.222053) (end 88.040252 99.222052) (width 0.2) (layer "F.Cu") (net 2) (tstamp 4e9738af-e8ba-4ced-b663-f99130b6faa1))
-  (segment (start 87.651346 98.444236) (end 87.651345 98.444237) (width 0.2) (layer "F.Cu") (net 2) (tstamp 583bc4cd-f57f-4a91-894c-99b8b57b3090))
-  (segment (start 85.775 97.525) (end 86.3432 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5a27b605-4732-4c97-9bdf-61c5b4d95352))
-  (segment locked (start 78.3 97.25) (end 78.3 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5edf4000-7676-4e5a-b87b-ac599a169ad5))
-  (segment (start 70.825 96.95) (end 70.825 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 61c70c63-99e1-4960-ad0c-4e5b49c331a4))
-  (segment (start 86.873529 97.666419) (end 86.873528 97.66642) (width 0.2) (layer "F.Cu") (net 2) (tstamp 61f72c36-94a2-4137-9a14-90e0a29c3a8d))
-  (segment (start 63.5 97.525) (end 66.775 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6dcf5309-f59d-4d1b-a15e-9165aead77fa))
-  (segment locked (start 78.85 96.8) (end 78.85 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 748bdd2d-da0a-4240-ba60-0bf881d2ec56))
-  (segment locked (start 76.65 96.8) (end 76.65 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 74ad519a-50ef-46d2-9b21-9f4d66417d83))
-  (segment (start 89.225 107.249999) (end 89.5 107.524999) (width 0.2) (layer "F.Cu") (net 2) (tstamp 76037792-5928-4a66-ba22-2dc11c197fb8))
-  (segment (start 89.5 107.524999) (end 89.5 110.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp 769b8a2a-d29e-4838-af3e-7930e6380ae0))
-  (segment (start 86.3432 97.525) (end 86.48462 97.66642) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7cae3ceb-8a10-4ac4-b7de-33ea3e12d529))
-  (segment (start 87.262436 98.444236) (end 87.262435 98.444235) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7d0d42fc-7dba-45cc-8a77-275fc87797c8))
-  (segment (start 72.525 96.95) (end 72.525 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7d4ff933-cd0c-468c-a149-65f0100f466e))
-  (segment locked (start 80.5 97.25) (end 80.5 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 801da923-9d7d-4f2f-bb46-6dae73790587))
-  (segment (start 88.818069 99.999869) (end 89.225 100.4068) (width 0.2) (layer "F.Cu") (net 2) (tstamp 8b915f44-d92b-4376-8a4d-f445b50a784a))
-  (segment (start 89.225 105.1068) (end 89.225 107.249999) (width 0.2) (layer "F.Cu") (net 2) (tstamp 91c01983-6be9-41dd-87a5-1e3538da6df3))
-  (segment (start 88.81807 99.99987) (end 88.818069 99.999869) (width 0.2) (layer "F.Cu") (net 2) (tstamp 9496b38f-3119-4623-b62d-5288a4bb5152))
-  (segment (start 89.13627 98.903857) (end 89.136269 98.903856) (width 0.2) (layer "F.Cu") (net 2) (tstamp 9791bbdf-86d5-485a-baa5-8068046e3b36))
-  (segment (start 70.825 97.525) (end 70.825 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp 9cbc95c6-541a-457c-99c9-f0940b8421b1))
-  (segment (start 88.358451 98.514948) (end 88.358452 98.514947) (width 0.2) (layer "F.Cu") (net 2) (tstamp a9e9547e-c064-4790-9898-9b0831b6ea29))
-  (segment (start 89.95 102.5818) (end 89.5 102.5818) (width 0.2) (layer "F.Cu") (net 2) (tstamp ac285269-cb11-4151-b6d2-066785156349))
-  (segment (start 72.525 97.525) (end 72.525 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp ac6d4abb-5313-4db1-b383-9e6fd4658dd3))
-  (segment (start 89.5 104.2318) (end 89.95 104.2318) (width 0.2) (layer "F.Cu") (net 2) (tstamp b04075d2-3602-43e6-92be-9dd21513a200))
-  (segment locked (start 83.8 97.25) (end 83.8 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp b2246d15-cb0e-4e3f-84fb-c1a652084bc6))
-  (segment (start 88.358452 98.514947) (end 88.040252 98.833144) (width 0.2) (layer "F.Cu") (net 2) (tstamp b6331aeb-9bb0-41ea-8fc6-68dcb3fafafe))
-  (segment (start 89.5 103.1318) (end 89.95 103.1318) (width 0.2) (layer "F.Cu") (net 2) (tstamp cb428b0a-31d9-482e-aaeb-be1bd1808598))
-  (segment locked (start 76.1 97.25) (end 76.1 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp cc30120b-5491-407f-8078-f17c31fa62c1))
-  (segment (start 87.580636 97.348223) (end 87.580635 97.348222) (width 0.2) (layer "F.Cu") (net 2) (tstamp d55e5429-799a-404c-8b68-a67cd2b42ddd))
-  (segment locked (start 82.15 96.8) (end 82.15 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp d629d4f5-d630-4f01-a953-ae79e19db036))
-  (segment (start 72.925 98.55) (end 72.925 98.175) (width 0.2) (layer "F.Cu") (net 2) (tstamp d666b0ef-26af-43b4-8d0f-47aa0fc43171))
-  (segment (start 89.5 100.9318) (end 89.95 100.9318) (width 0.2) (layer "F.Cu") (net 2) (tstamp d6693521-5fd1-41ec-a68f-c2778ffc076f))
-  (segment locked (start 79.95 96.8) (end 79.95 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp d6bd327a-d697-404f-a5b7-0c1f2f1bf9b6))
-  (segment locked (start 75.55 96.8) (end 75.55 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp d9ce81c5-6965-488c-be98-3d147c2bd0bd))
-  (segment (start 67.425 98.175) (end 67.425 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp dda16b84-a36a-48a3-bdb6-768971b8cb87))
-  (segment locked (start 85.725 97.525) (end 85.775 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp e714b783-f99e-4c38-8985-6f6207dd2c48))
-  (segment (start 87.580635 97.73713) (end 87.262435 98.055327) (width 0.2) (layer "F.Cu") (net 2) (tstamp e9b48fa5-cde0-4e05-a40c-dfeb25f5dacb))
-  (segment (start 87.651345 98.444237) (end 87.969544 98.126039) (width 0.2) (layer "F.Cu") (net 2) (tstamp edb35209-55c3-49a8-9aaf-369715e21308))
-  (segment (start 71.225 98.55) (end 71.225 97.975) (width 0.2) (layer "F.Cu") (net 2) (tstamp ef5e1760-0b06-48c8-86e8-68381890707d))
-  (segment (start 71.225 97.975) (end 71.225 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp f8ed3297-3ff6-42b0-bd35-4246303ceee2))
-  (segment locked (start 75 97.25) (end 75 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp f9be2e45-56e0-4e20-a353-ef4b2b80874c))
-  (arc locked (start 78.85 97.25) (mid 78.930546 97.444454) (end 79.125 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 044d96d4-3f69-4cf6-af5a-c45410369a4e))
-  (arc (start 71.025 98.75) (mid 71.166421 98.691421) (end 71.225 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp 065aad83-c790-4a2d-b9ad-1a3c7c55741f))
-  (arc locked (start 78.575 96.525) (mid 78.769454 96.605546) (end 78.85 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 07e8d0c7-23d7-413b-9dea-d0b0910724a8))
-  (arc (start 71.225 96.95) (mid 71.415381 96.490381) (end 71.875 96.3) (width 0.2) (layer "F.Cu") (net 2) (tstamp 087ed1f2-9335-4867-8f5c-4ab273dfff17))
-  (arc locked (start 82.15 97.25) (mid 82.230546 97.444454) (end 82.425 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 0bb6ad0b-76dd-4100-af88-32e8793c64cc))
-  (arc (start 89.95 103.1318) (mid 90.144454 103.212346) (end 90.225 103.4068) (width 0.2) (layer "F.Cu") (net 2) (tstamp 0c4deb65-0fc2-4582-bf94-bf317032277f))
-  (arc (start 88.818069 99.610961) (mid 88.737524 99.805416) (end 88.81807 99.99987) (width 0.2) (layer "F.Cu") (net 2) (tstamp 0ea29eea-ed68-49b2-9e22-6c18bf8d49ad))
-  (arc (start 88.040252 98.833144) (mid 87.959707 99.027599) (end 88.040253 99.222053) (width 0.2) (layer "F.Cu") (net 2) (tstamp 10e198cd-38a3-4361-8b70-40c2b7939490))
-  (arc (start 72.725 98.75) (mid 72.866421 98.691421) (end 72.925 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp 1202702f-b32a-436f-8374-861ee1f53c02))
-  (arc locked (start 75.825 97.525) (mid 76.019454 97.444454) (end 76.1 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 19e88170-88b9-4731-ba08-a947a7eccd42))
-  (arc locked (start 77.2 96.8) (mid 77.280546 96.605546) (end 77.475 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 1a14eec8-b2e1-4cba-9a61-9d9dd04e902e))
-  (arc (start 72.525 98.55) (mid 72.583579 98.691421) (end 72.725 98.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp 1c2b0fb8-9679-4148-81f5-d0736d96945b))
-  (arc locked (start 83.8 96.8) (mid 83.880546 96.605546) (end 84.075 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 2093cca6-1bfd-4d8c-9891-b8c54bb1814b))
-  (arc (start 88.747361 98.903856) (mid 88.941816 98.823311) (end 89.13627 98.903857) (width 0.2) (layer "F.Cu") (net 2) (tstamp 230bbd84-3245-4a3e-b569-4ac5f0310fa4))
-  (arc (start 67.625 98.75) (mid 67.766421 98.691421) (end 67.825 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp 2651d18a-2251-4cd5-b8f4-590b15231fe3))
-  (arc (start 70.175 96.3) (mid 70.634619 96.490381) (end 70.825 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3428f28d-793b-429a-a9b4-e0f4b6d446c9))
-  (arc (start 86.48462 97.66642) (mid 86.679075 97.746965) (end 86.873529 97.666419) (width 0.2) (layer "F.Cu") (net 2) (tstamp 35fd67e8-578b-4a94-bf70-4756131c7443))
-  (arc locked (start 80.775 96.525) (mid 80.969454 96.605546) (end 81.05 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3787190a-13d1-457f-8c25-0bd5791eeaa0))
-  (arc locked (start 81.6 96.8) (mid 81.680546 96.605546) (end 81.875 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3f568a9c-0a20-410e-bbc4-184c52230511))
-  (arc locked (start 79.125 97.525) (mid 79.319454 97.444454) (end 79.4 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 4168e5cc-e1cd-48db-a8c0-0f082fcd3be5))
-  (arc (start 89.5 102.5818) (mid 89.305546 102.662346) (end 89.225 102.8568) (width 0.2) (layer "F.Cu") (net 2) (tstamp 4c2c821a-c29d-4338-ad3f-2c17b86a54dc))
-  (arc locked (start 82.975 96.525) (mid 83.169454 96.605546) (end 83.25 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 51e7aed3-1eff-4dc5-848a-49a40d3d545b))
-  (arc locked (start 82.7 96.8) (mid 82.780546 96.605546) (end 82.975 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 525d1009-7a9b-4765-8f6a-6032ff85bd3b))
-  (arc (start 87.262437 98.444237) (mid 87.456892 98.524782) (end 87.651346 98.444236) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5a2b9db2-a98d-4fef-935c-07884fe935cb))
-  (arc (start 68.475 96.3) (mid 68.934619 96.490381) (end 69.125 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5cee08cf-3747-4086-b183-0c61f61933a6))
-  (arc locked (start 75.55 97.25) (mid 75.630546 97.444454) (end 75.825 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5d8eae69-5916-4c67-bf03-1013c55599d6))
-  (arc locked (start 74.725 97.525) (mid 74.919454 97.444454) (end 75 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 5e72a3e7-490a-43c3-a227-73e139161515))
-  (arc (start 89.225 103.9568) (mid 89.305546 104.151254) (end 89.5 104.2318) (width 0.2) (layer "F.Cu") (net 2) (tstamp 600975ea-a700-4310-9060-721a117699ef))
-  (arc locked (start 85.175 96.525) (mid 85.369454 96.605546) (end 85.45 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp 64d0b53a-8d38-4f33-98a7-2bf7415a2828))
-  (arc (start 70.825 98.55) (mid 70.883579 98.691421) (end 71.025 98.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp 67623a6e-679f-4db5-9778-ff4b2144034b))
-  (arc (start 89.136269 98.903856) (mid 89.216814 99.098311) (end 89.136268 99.292765) (width 0.2) (layer "F.Cu") (net 2) (tstamp 67f1aadd-abbf-42af-b69d-c0bc8ff3c54d))
-  (arc (start 87.191727 97.348222) (mid 87.386182 97.267677) (end 87.580636 97.348223) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6eca8f04-982c-4e7d-be01-74c84433ede0))
-  (arc (start 89.5 103.6818) (mid 89.305546 103.762346) (end 89.225 103.9568) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6ff37887-4994-46f8-820b-36c5ae472f8d))
-  (arc (start 66.775 97.525) (mid 67.234619 97.715381) (end 67.425 98.175) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6ffd5611-99ed-4f7d-80b5-fd74ac95b246))
-  (arc (start 89.95 104.2318) (mid 90.144454 104.312346) (end 90.225 104.5068) (width 0.2) (layer "F.Cu") (net 2) (tstamp 74a830ac-db02-4ee0-b658-8b525b51103a))
-  (arc (start 89.95 102.0318) (mid 90.144454 102.112346) (end 90.225 102.3068) (width 0.2) (layer "F.Cu") (net 2) (tstamp 76239d3a-6947-4841-a7e3-1476cd80a018))
-  (arc (start 71.875 96.3) (mid 72.334619 96.490381) (end 72.525 96.95) (width 0.2) (layer "F.Cu") (net 2) (tstamp 77fa6575-e37e-4e4f-a8bd-859802ea4376))
-  (arc locked (start 76.65 97.25) (mid 76.730546 97.444454) (end 76.925 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 780f867b-32a9-4333-8408-14d0a954cfb2))
-  (arc (start 87.580635 97.348222) (mid 87.66118 97.542677) (end 87.580634 97.737131) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7b24c536-470a-4e2d-ac6c-16770002d80b))
-  (arc (start 89.225 101.7568) (mid 89.305546 101.951254) (end 89.5 102.0318) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7d6de20c-c688-4223-ab79-e63840887579))
-  (arc locked (start 75 96.8) (mid 75.080546 96.605546) (end 75.275 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 838daf59-e2cb-4307-89db-62da916b85ba))
-  (arc (start 67.825 96.95) (mid 68.015381 96.490381) (end 68.475 96.3) (width 0.2) (layer "F.Cu") (net 2) (tstamp 85474f84-989d-4fc9-be26-de58f9f54ba7))
-  (arc (start 89.225 102.8568) (mid 89.305546 103.051254) (end 89.5 103.1318) (width 0.2) (layer "F.Cu") (net 2) (tstamp 86fc755e-723f-4202-bd7f-8f17acf8da93))
-  (arc locked (start 78.3 96.8) (mid 78.380546 96.605546) (end 78.575 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 88107d2c-0171-463a-9c46-4413953e1e43))
-  (arc locked (start 80.225 97.525) (mid 80.419454 97.444454) (end 80.5 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 89965ab8-14d9-452b-bde8-069f652c966e))
-  (arc (start 72.925 98.175) (mid 73.115381 97.715381) (end 73.575 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 8b083406-8cf2-405e-843e-769aa4f51fff))
-  (arc (start 90.225 101.2068) (mid 90.144454 101.401254) (end 89.95 101.4818) (width 0.2) (layer "F.Cu") (net 2) (tstamp 96bb9d8a-b6de-4c1a-a2b4-15c5e7df8321))
-  (arc (start 90.225 104.5068) (mid 90.144454 104.701254) (end 89.95 104.7818) (width 0.2) (layer "F.Cu") (net 2) (tstamp 991668f8-5dbe-4c03-89ac-c3e876a4f30c))
-  (arc (start 87.262435 98.055327) (mid 87.18189 98.249782) (end 87.262436 98.444236) (width 0.2) (layer "F.Cu") (net 2) (tstamp 99c270ac-dd12-496c-b9d1-dbd5feb281a2))
-  (arc locked (start 77.75 97.25) (mid 77.830546 97.444454) (end 78.025 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 9f1cbe50-f185-4335-bc70-80f48db5223f))
-  (arc locked (start 80.5 96.8) (mid 80.580546 96.605546) (end 80.775 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp 9ffacd58-8cd1-442c-8087-0df19e25bc84))
-  (arc locked (start 83.25 97.25) (mid 83.330546 97.444454) (end 83.525 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp a0ac6d6b-6f13-43b4-8d29-23fd49bf127b))
-  (arc locked (start 84.625 97.525) (mid 84.819454 97.444454) (end 84.9 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp a23da91c-f91b-4391-aa54-6f76878bcde2))
-  (arc (start 90.225 102.3068) (mid 90.144454 102.501254) (end 89.95 102.5818) (width 0.2) (layer "F.Cu") (net 2) (tstamp a2453869-af65-49c8-8d90-5836ebc9ca12))
-  (arc (start 89.5 104.7818) (mid 89.305546 104.862346) (end 89.225 105.0568) (width 0.2) (layer "F.Cu") (net 2) (tstamp abcaac62-8f19-45e5-b7f1-8c8276abc3c0))
-  (arc locked (start 76.925 97.525) (mid 77.119454 97.444454) (end 77.2 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp abd9d4f4-111b-4640-8118-e9bde5642673))
-  (arc locked (start 76.1 96.8) (mid 76.180546 96.605546) (end 76.375 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp acf7da60-c7aa-4992-8db3-a6ff91160570))
-  (arc locked (start 84.9 96.8) (mid 84.980546 96.605546) (end 85.175 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp ae310006-c987-441d-873f-e532b3dbe5b8))
-  (arc locked (start 81.875 96.525) (mid 82.069454 96.605546) (end 82.15 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp af6bb242-9ab2-487c-a2ad-325b40b7fe92))
-  (arc locked (start 84.35 97.25) (mid 84.430546 97.444454) (end 84.625 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp b03e4849-8256-41e0-845f-780dcce71f55))
-  (arc locked (start 84.075 96.525) (mid 84.269454 96.605546) (end 84.35 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp b042bb16-5644-44a0-a638-35b4a7278716))
-  (arc (start 89.5 101.4818) (mid 89.305546 101.562346) (end 89.225 101.7568) (width 0.2) (layer "F.Cu") (net 2) (tstamp b056c1fe-ef6b-452d-9a46-bdea7738eb5f))
-  (arc locked (start 79.675 96.525) (mid 79.869454 96.605546) (end 79.95 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp bce645a0-10e2-43ad-b783-1d325e305eed))
-  (arc (start 69.525 96.95) (mid 69.715381 96.490381) (end 70.175 96.3) (width 0.2) (layer "F.Cu") (net 2) (tstamp c4277be2-8ea1-4763-9c5f-287ddbd9f87e))
-  (arc (start 67.425 98.55) (mid 67.483579 98.691421) (end 67.625 98.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp c45a4901-91c0-406c-88bb-4e05006694e5))
-  (arc (start 89.95 100.9318) (mid 90.144454 101.012346) (end 90.225 101.2068) (width 0.2) (layer "F.Cu") (net 2) (tstamp ca0f9c33-78f8-41d7-980d-db7b0aa19e57))
-  (arc (start 87.969544 98.126039) (mid 88.163999 98.045494) (end 88.358453 98.12604) (width 0.2) (layer "F.Cu") (net 2) (tstamp d0daa854-2ed4-4c44-8695-6f21be6c244a))
-  (arc locked (start 79.95 97.25) (mid 80.030546 97.444454) (end 80.225 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp d38ab5d8-aa5d-4f99-b915-e105e57bde2a))
-  (arc locked (start 78.025 97.525) (mid 78.219454 97.444454) (end 78.3 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp d7031db2-63d6-44c4-a59f-8fb5abead861))
-  (arc locked (start 81.325 97.525) (mid 81.519454 97.444454) (end 81.6 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp d7c36500-c4a6-49eb-b664-9c96c12d21f8))
-  (arc locked (start 82.425 97.525) (mid 82.619454 97.444454) (end 82.7 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp dc439fb8-3e2b-4f0c-81cc-3fd64a263585))
-  (arc (start 90.225 103.4068) (mid 90.144454 103.601254) (end 89.95 103.6818) (width 0.2) (layer "F.Cu") (net 2) (tstamp e08db445-55c7-4a8f-92ed-e70699e18669))
-  (arc (start 89.225 100.6568) (mid 89.305546 100.851254) (end 89.5 100.9318) (width 0.2) (layer "F.Cu") (net 2) (tstamp e1885d11-e8fd-45e1-9237-1f5c33816018))
-  (arc locked (start 77.475 96.525) (mid 77.669454 96.605546) (end 77.75 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp e3345484-d946-4858-94fb-5e27e75e5fdf))
-  (arc locked (start 76.375 96.525) (mid 76.569454 96.605546) (end 76.65 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp e3cf67c8-3e14-4db8-aebe-01c72e800a36))
-  (arc (start 88.040254 99.222054) (mid 88.234709 99.302599) (end 88.429163 99.222053) (width 0.2) (layer "F.Cu") (net 2) (tstamp e3d64774-9e78-40c1-9325-685f973ec399))
-  (arc locked (start 79.4 96.8) (mid 79.480546 96.605546) (end 79.675 96.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp e66b1e5e-fe3a-4361-b33f-d3f859555733))
-  (arc locked (start 83.525 97.525) (mid 83.719454 97.444454) (end 83.8 97.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp e9455298-081b-4082-ac68-a76b7eb46d07))
-  (arc (start 88.358452 98.126039) (mid 88.438997 98.320494) (end 88.358451 98.514948) (width 0.2) (layer "F.Cu") (net 2) (tstamp eb8dd993-5e26-48ef-89bd-e1ed9bb825f8))
-  (arc locked (start 81.05 97.25) (mid 81.130546 97.444454) (end 81.325 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp eb951edb-217b-4551-9040-f08ae4929ab8))
-  (arc (start 69.125 98.55) (mid 69.183579 98.691421) (end 69.325 98.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp ed080efd-8428-41db-b4e3-4c7e44c1e281))
-  (arc locked (start 85.45 97.25) (mid 85.530546 97.444454) (end 85.725 97.525) (width 0.2) (layer "F.Cu") (net 2) (tstamp eeb4521d-f88d-46bd-8556-75a4a756a9ee))
-  (arc (start 69.325 98.75) (mid 69.466421 98.691421) (end 69.525 98.55) (width 0.2) (layer "F.Cu") (net 2) (tstamp fc70381a-63cd-4b0f-8fff-e19b4b679692))
-  (arc locked (start 75.275 96.525) (mid 75.469454 96.605546) (end 75.55 96.8) (width 0.2) (layer "F.Cu") (net 2) (tstamp ff0b35ee-2c79-4359-a1c7-5c7232881f80))
-
-)
diff --git a/tests/testdata/board/test_boardWithAllPrimitives b/tests/testdata/board/test_boardWithAllPrimitives
deleted file mode 100644
index eab4f0d..0000000
--- a/tests/testdata/board/test_boardWithAllPrimitives
+++ /dev/null
@@ -1,1466 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 19.11)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (1 "In1.Cu" signal)
-    (2 "In2.Cu" signal)
-    (3 "In3.Cu" signal)
-    (4 "In4.Cu" signal)
-    (5 "In5.Cu" signal)
-    (6 "In6.Cu" signal)
-    (7 "In7.Cu" signal)
-    (8 "In8.Cu" signal)
-    (9 "In9.Cu" signal)
-    (10 "In10.Cu" signal)
-    (11 "In11.Cu" signal)
-    (12 "In12.Cu" signal)
-    (13 "In13.Cu" signal)
-    (14 "In14.Cu" signal)
-    (15 "In15.Cu" signal)
-    (16 "In16.Cu" signal)
-    (17 "In17.Cu" signal)
-    (18 "In18.Cu" signal)
-    (19 "In19.Cu" signal)
-    (20 "In20.Cu" signal)
-    (21 "In21.Cu" signal)
-    (22 "In22.Cu" signal)
-    (23 "In23.Cu" signal)
-    (24 "In24.Cu" signal)
-    (25 "In25.Cu" signal)
-    (26 "In26.Cu" signal)
-    (27 "In27.Cu" signal)
-    (28 "In28.Cu" signal)
-    (29 "In29.Cu" signal)
-    (30 "In30.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (stackup
-      (layer "F.SilkS" (type "Top Silk Screen") (color "Yellow"))
-      (layer "F.Paste" (type "Top Solder Paste"))
-      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
-      (layer "F.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.021))
-      (layer "In1.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 2" (type "prepreg") (thickness 1.51) (material "FR4") (epsilon_r 4.52) (loss_tangent 0.02))
-      (layer "In2.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 3" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.024))
-      (layer "In3.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 4" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In4.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 5" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In5.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 6" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In6.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 7" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In7.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 8" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In8.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 9" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In9.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 10" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In10.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 11" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In11.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 12" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In12.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 13" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In13.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 14" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In14.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 15" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In15.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 16" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In16.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 17" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In17.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 18" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In18.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 19" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In19.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 20" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In20.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 21" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In21.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 22" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In22.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 23" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In23.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 24" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In24.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 25" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In25.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 26" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In26.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 27" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In27.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 28" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In28.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 29" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In29.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 30" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In30.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 31" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "B.Cu" (type "copper") (thickness 0.035))
-      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
-      (layer "B.Paste" (type "Bottom Solder Paste"))
-      (layer "B.SilkS" (type "Bottom Silk Screen") (color "Green"))
-      (copper_finish "HAL lead-free")
-      (dielectric_constraints no)
-      (edge_connector bevelled)
-      (castellated_pads yes)
-      (edge_plating yes)
-    )
-    (pad_to_mask_clearance 1)
-    (solder_mask_min_width 1)
-    (pad_to_paste_clearance -1)
-    (pad_to_paste_clearance_ratio -0.01)
-    (aux_axis_origin 177.65 97.75)
-    (grid_origin 182.8 82.55)
-    (pcbplotparams
-      (layerselection 0x00010fc_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes true)
-      (usegerberadvancedattributes true)
-      (creategerberjobfile true)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer true)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 12.344291)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 0)
-      (mirror false)
-      (drillshape 0)
-      (scaleselection 1)
-      (outputdirectory "D:/home/Desktop/Temp/")
-    )
-  )
-
-  (property "123456" "45641523")
-  (property "test" "test test")
-  (property "xdfa" "xdfadsf ")
-
-  (net 0 "")
-  (net 1 "/NET1")
-  (net 2 "unconnected-(SW101-Pad2)")
-  (net 3 "unconnected-(SW101-Pad3)")
-  (net 4 "/HIER_LABEL")
-
-  (footprint "test" (layer "F.Cu")
-    (tedit 621D235F) (tstamp 3cfcbcc7-4f45-46ab-82a8-c414c7972161)
-    (at 104.78 48.237399)
-    (attr smd)
-    (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
-    )
-    (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp c58960d9-4cac-4036-ad2e-1aef26946dae)
-    )
-    (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu")
-      (effects (font (size 1.5 1.5) (thickness 0.3)))
-      (tstamp 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
-    )
-    (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp ec9e24d8-d1c5-40e2-9812-dc315d05f470)
-    )
-    (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
-    )
-    (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 53c85970-3e21-4fae-a84f-721cfc0513b5)
-    )
-    (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
-    )
-    (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (tstamp 003c2200-0632-4808-a662-8ddd5d30c768))
-    (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (tstamp 6ff874d0-4ac5-414c-83a7-573eda4c7703))
-    (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (tstamp be0953c0-632d-4dd2-85e9-4d41239f22d2))
-    (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 7f3eb118-a20c-4239-b800-c9211c66847d))
-    (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (tstamp 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
-    (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (tstamp fc0a4225-db46-4d48-8163-d522602d57cd))
-    (fp_poly (pts
-        (xy 8.4 14.95)
-        (xy 1.15 14.95)
-        (xy 1.15 6.7)
-        (xy 1.9 6.7)
-        (xy 8.4 0.2)
-      ) (layer "F.SilkS") (width 0.12) (fill solid) (tstamp f6ee98b5-4773-4eeb-a825-33c1705abace))
-    (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (tstamp 127679a9-3981-4934-815e-896a4e3ff56e))
-    (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
-    (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
-    (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 0520f61d-4522-4301-a3fa-8ed0bf060f69))
-    (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 0f560957-a8c5-442f-b20c-c2d88613742c))
-    (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
-    (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
-    (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
-    (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
-    (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
-    (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
-    (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
-    (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
-    (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp c43663ee-9a0d-4f27-a292-89ba89964065))
-    (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp c67ad10d-2f75-4ec6-a139-47058f7f06b2))
-    (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
-      (die_length 1) (tstamp 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
-    (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
-      (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
-      (options (clearance convexhull) (anchor circle))
-      (primitives
-        (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
-        (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
-        (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
-        (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
-        (gr_poly (pts
-            (xy 12.8 4.2)
-            (xy 8.2 8.8)
-            (xy 3.8 4.4)
-            (xy 8.4 -0.2)
-          ) (width 0.2) (fill yes))
-    (gr_arc (start 6.4 0.2) (mid 6.594453 -0.786584) (end 7.148728 -1.625594) (width 0.2))
-            (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
-            (gr_poly (pts
-            (xy -0.6 2.8)
-            (xy -1.8 4)
-            (xy -6.4 4)
-            (xy -6.4 1)
-            (xy -0.6 1)
-          ) (width 0.2) (fill yes))
-            (gr_poly (pts
-            (xy 0.870847 -0.746121)
-            (xy 0.983248 -0.691178)
-            (xy 1.071791 -0.602789)
-            (xy 1.12693 -0.490484)
-            (xy 1.143 -0.381)
-            (xy 1.143 0.381)
-            (xy 1.127121 0.489847)
-            (xy 1.072178 0.602248)
-            (xy 0.983789 0.690791)
-            (xy 0.871484 0.74593)
-            (xy 0.762 0.762)
-            (xy -0.762 0.762)
-            (xy -0.870847 0.746121)
-            (xy -0.983248 0.691178)
-            (xy -1.071791 0.602789)
-            (xy -1.12693 0.490484)
-            (xy -1.143 0.381)
-            (xy -1.143 -0.381)
-            (xy -1.127121 -0.489847)
-            (xy -1.072178 -0.602248)
-            (xy -0.983789 -0.690791)
-            (xy -0.871484 -0.74593)
-            (xy -0.762 -0.762)
-            (xy 0.762 -0.762)
-          ) (width 0) (fill yes))
-      ) (tstamp d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
-    (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
-      (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
-      (die_length 15) (tstamp e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
-    (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
-    (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
-      (connect_pads (clearance 0))
-      (min_thickness 0.254)
-      (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
-      (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-      (polygon
-        (pts
-          (xy 154.38 59.237399)
-          (xy 141.58 60.437399)
-          (xy 141.58 46.437399)
-        )
-      )
-    )
-    (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
-      (members
-        7f3eb118-a20c-4239-b800-c9211c66847d
-        f6ee98b5-4773-4eeb-a825-33c1705abace
-      )
-    )
-  )
-
-  (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (layer "F.Cu")
-    (tedit 5B784ED0) (tstamp 907b59ac-a3f3-4819-aae3-2f3689254127)
-    (at 103.5875 101.8875)
-    (descr "Generic Phoenix Contact connector footprint for: MCV_1,5/4-G-3.5; number of pins: 04; pin pitch: 3.50mm; Vertical || order number: 1843622 8A 160V")
-    (tags "phoenix_contact connector MCV_01x04_G_3.5mm")
-    (property "Sheetfile" "test.kicad_sch")
-    (property "Sheetname" "")
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6")
-    (attr through_hole)
-    (fp_text reference "SW101" (at 5.25 -5.45) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp cc90c745-434f-4e54-89c7-cbf24870aeb9)
-    )
-    (fp_text value "SW_Coded" (at 5.25 4.2) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 7e47f703-9790-4c34-9d14-1de39c308f06)
-    )
-    (fp_text user "${REFERENCE}" (at 5.25 -3.55) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 122cd6ff-87b3-455d-9734-dd35dee6c1d9)
-    )
-    (fp_line (start 5.75 -2.4) (end 5.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 02426097-2343-483f-9184-b1021f11f671))
-    (fp_line (start 6.25 -2.05) (end 6.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 0757ecdd-1a4f-4f75-825e-ff54cc68895a))
-    (fp_line (start 12 -3.4) (end 11.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 1257fa4c-2f92-4e07-b43d-826125b0853c))
-    (fp_line (start -1.5 -2.05) (end -0.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 14ae6814-97a1-417e-bec2-8de437fc055e))
-    (fp_line (start 4.25 -2.05) (end 5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 1e0832ec-61bb-4753-a703-f800e50c87e9))
-    (fp_line (start 9 -2.05) (end 9.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 1fa150d9-4de3-4b9f-8fca-6651616614be))
-    (fp_line (start -0.75 2.25) (end -1.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 207c68d8-2bd6-401c-bbd5-e50fcc95bf20))
-    (fp_line (start 5.5 -3.4) (end 8.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 20dc8b19-954b-4369-b580-dab885da8ae2))
-    (fp_line (start 12 2.25) (end 11.25 2.25) (layer "F.SilkS") (width 0.12) (tstamp 229202cd-20dc-4eab-ac2e-7f028bc91419))
-    (fp_line (start 1.5 -2.05) (end 1.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 22b553ec-39b6-4275-9347-df53a7c0db1d))
-    (fp_line (start 2 -3.4) (end 5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 24a65fad-0331-474b-b5bf-d945e8eff4b2))
-    (fp_line (start 7.75 -2.05) (end 8.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 258fcb41-7033-4835-9fdf-423793cb23b3))
-    (fp_line (start 4.75 -2.4) (end 4.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 2afa4af3-c77f-43e1-bb65-33635d9d9bde))
-    (fp_line (start 2.25 -2.4) (end 2 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 302baa85-ea14-4bc3-9ee0-750ac99c372c))
-    (fp_line (start 2.75 -2.05) (end 2.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 30ebadca-c9f5-4eef-93a6-e46a7f5dcb8a))
-    (fp_line (start 0.75 -2.05) (end 1.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 3311faf7-cebf-4b03-887f-81682eb2d766))
-    (fp_line (start 2.75 2.25) (end 2 2.25) (layer "F.SilkS") (width 0.12) (tstamp 37f83d32-45f1-46b2-96b2-a40681275916))
-    (fp_line (start 8.5 -3.4) (end 8.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 3e7ae60c-e895-4a5a-a7e3-6a535a3a8283))
-    (fp_line (start -1.5 2.25) (end -1.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 4713b701-0d77-40e8-8184-3a11f9df2324))
-    (fp_line (start 2 2.25) (end 2 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 48eaa494-0ad3-4e7e-a203-8b82c0c90232))
-    (fp_line (start 0.75 -2.4) (end 0.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 49b3f8e5-beb0-46c0-af33-92b06a5bdff5))
-    (fp_line (start 1.5 2.25) (end 0.75 2.25) (layer "F.SilkS") (width 0.12) (tstamp 4b9cce0d-afc3-48b9-a22f-0ea23c5574b8))
-    (fp_line (start -2.56 3.11) (end 13.06 3.11) (layer "F.SilkS") (width 0.12) (tstamp 5166ee21-16cc-47d4-a438-2c0e2aa8959c))
-    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.SilkS") (width 0.12) (tstamp 5c458ff7-d3f7-4417-a611-6f2981d0e9cc))
-    (fp_line (start 1.5 -3.4) (end 1.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 67dca7e5-24d8-4654-9579-d6404307654b))
-    (fp_line (start 5.5 -2.05) (end 6.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 68310a47-af11-4665-bffb-5d4b7b98d48d))
-    (fp_line (start 8.5 -2.05) (end 8.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 6b1d8153-1929-422b-bfbd-285ab66db86b))
-    (fp_line (start -0.75 -2.4) (end -1.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 6d8a3226-b0be-4ce6-99a7-7bc208219506))
-    (fp_line (start 5.5 2.25) (end 5.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 702c939c-cd20-4967-a0a8-e2ffe549a816))
-    (fp_line (start -2.56 -4.36) (end -2.56 3.11) (layer "F.SilkS") (width 0.12) (tstamp 76c255ae-be6f-425d-a22f-ead2d9b08f5a))
-    (fp_line (start 6.25 -2.4) (end 5.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 77db9235-89b0-4b41-9039-5e76b93e13e4))
-    (fp_line (start 11.75 -2.4) (end 11.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 7b4da999-f9e4-4c1d-bc75-0b3a3ebad32a))
-    (fp_line (start 9.25 -2.4) (end 9 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 7e67823e-2810-490d-bd9b-8b337d7a4ad5))
-    (fp_line (start 7.75 -2.4) (end 7.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 830d86b3-78eb-4c6c-a352-bf19ba50bd18))
-    (fp_line (start 13.06 3.11) (end 13.06 -4.36) (layer "F.SilkS") (width 0.12) (tstamp 83aeead6-c04f-4f61-9dc1-08cad4116066))
-    (fp_line (start -1.5 -3.4) (end 1.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 8bf37a13-e175-4246-a4f0-4ab526c58c2e))
-    (fp_line (start 9 2.25) (end 9 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 8c64c50b-8acd-44f2-8c5f-ba9201a3c7bd))
-    (fp_line (start 5 2.25) (end 4.25 2.25) (layer "F.SilkS") (width 0.12) (tstamp 8c8154c7-2b7b-44e1-8694-dfe76312b3d9))
-    (fp_line (start 1.25 -2.4) (end 0.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 9e477ee6-ad97-4cd4-b02b-4729979c40e2))
-    (fp_line (start 11.25 -2.05) (end 12 -2.05) (layer "F.SilkS") (width 0.12) (tstamp a23e3eb7-dcb3-4b09-a1b0-ba2cb214f0a5))
-    (fp_line (start 8.25 -2.4) (end 7.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp a2abc84b-8987-4a83-b329-dceb6c04fe7c))
-    (fp_line (start -0.75 -2.05) (end -0.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp a7e7a44c-68d8-4576-a798-ee1db6824dc3))
-    (fp_line (start 5 -2.05) (end 5 2.25) (layer "F.SilkS") (width 0.12) (tstamp abb284d1-6005-460a-b044-acdfa77fc3f5))
-    (fp_line (start 4.25 -2.4) (end 4.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp ae1dcbf9-6071-40f9-ab17-78192e75b9a1))
-    (fp_line (start -1.25 -2.4) (end -1.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp ae923668-2cb7-47ea-99c5-b6a079045296))
-    (fp_line (start 12 -2.05) (end 12 2.25) (layer "F.SilkS") (width 0.12) (tstamp b3a5f2e6-3207-4af3-89e3-6d0fa469246e))
-    (fp_line (start 2 -2.05) (end 2.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp b401eca2-204c-47b0-a6cc-cbd09a8de2ad))
-    (fp_line (start 11.25 -2.4) (end 11.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp b589a08d-5a8e-4bb2-90d4-ef5270d09c90))
-    (fp_line (start 2.75 -2.4) (end 2.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp c47a7547-e6f0-4cd8-b807-5ca888e9c3ce))
-    (fp_line (start 9.75 -2.4) (end 9.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp cc96e2af-7657-4ad3-b12e-a025de438a67))
-    (fp_line (start 5 -3.4) (end 4.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp cd82725d-cd4e-4b86-b196-accebbf4a913))
-    (fp_line (start 9.75 -2.05) (end 9.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp d7fda904-08f2-46d0-8e07-896b262d7e46))
-    (fp_line (start 6.25 2.25) (end 5.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp e2bf3c5a-b014-4f85-8305-86de33fb2476))
-    (fp_line (start 9 -3.4) (end 12 -3.4) (layer "F.SilkS") (width 0.12) (tstamp e9f6f543-7ec8-488b-9aca-e6a196514d16))
-    (fp_line (start 13.06 -4.36) (end -2.56 -4.36) (layer "F.SilkS") (width 0.12) (tstamp eb2337fd-ed0c-4c82-a320-4407e6ace0bd))
-    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.SilkS") (width 0.12) (tstamp ed095ff3-b1af-4001-bf59-d68ad7ef3289))
-    (fp_line (start 9.75 2.25) (end 9 2.25) (layer "F.SilkS") (width 0.12) (tstamp fa37a123-2087-449f-b3d4-b734192c4b4e))
-    (fp_line (start 8.5 2.25) (end 7.75 2.25) (layer "F.SilkS") (width 0.12) (tstamp fec34bd8-21b5-4daa-be59-cc1bb53df336))
-    (fp_arc (start 6.25 2.25) (mid 6.999807 2.09191) (end 7.749647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 194e61d5-d73f-45e1-86ab-95585456b360))
-    (fp_arc (start 2.75 2.25) (mid 3.499807 2.09191) (end 4.249647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 262f677a-322e-4b8f-8c30-977fdf9e837a))
-    (fp_arc (start 9.75 2.25) (mid 10.499807 2.09191) (end 11.249647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 485f2f0b-adc4-4fd0-914c-e6cdebf32b20))
-    (fp_arc (start -0.75 2.25) (mid -0.000193 2.09191) (end 0.749647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp d07c9852-1fa4-40ca-9b3a-45379faf2beb))
-    (fp_line (start -2.95 -4.75) (end -2.95 3.5) (layer "F.CrtYd") (width 0.05) (tstamp 15a65612-f6a1-48be-8425-8f5afb06c4fd))
-    (fp_line (start 13.45 -4.75) (end -2.95 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp 9f2913ee-f300-41d4-9b7a-339ae5970c4d))
-    (fp_line (start -2.95 3.5) (end 13.45 3.5) (layer "F.CrtYd") (width 0.05) (tstamp c464ac67-d07b-4878-905a-ea6f8d27cd1e))
-    (fp_line (start 13.45 3.5) (end 13.45 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp f4a6f22f-2296-4e86-8dc7-ba0df5bfb77c))
-    (fp_line (start -2.45 -4.25) (end -2.45 3) (layer "F.Fab") (width 0.1) (tstamp 534d87c1-bf1e-4965-ad11-3e2aa081e8e8))
-    (fp_line (start 12.95 -4.25) (end -2.45 -4.25) (layer "F.Fab") (width 0.1) (tstamp 549455c3-ab6e-454e-94b0-5ca9e521ae0b))
-    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.Fab") (width 0.1) (tstamp 6b74ce51-0851-44d9-ba35-f631aa075f73))
-    (fp_line (start 12.95 3) (end 12.95 -4.25) (layer "F.Fab") (width 0.1) (tstamp c6821f6d-ae1c-499e-ad7d-74e9a034a4b5))
-    (fp_line (start -2.45 3) (end 12.95 3) (layer "F.Fab") (width 0.1) (tstamp c7bd964e-6063-4802-85ea-2a5dd3fba324))
-    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.Fab") (width 0.1) (tstamp d0bf1a00-cfe8-4773-a4cd-b6dcc139ab1d))
-    (pad "1" thru_hole roundrect locked (at 0 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask) (roundrect_rratio 0.1388888889)
-      (net 1 "/NET1") (pinfunction "CM") (pintype "passive") (tstamp 11af36ff-3959-41d6-86f2-35df83d416be))
-    (pad "2" thru_hole oval locked (at 3.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 2 "unconnected-(SW101-Pad2)") (pinfunction "D0") (pintype "passive+no_connect") (tstamp 95367dce-7348-4e46-8b79-617f0b078986))
-    (pad "3" thru_hole oval locked (at 7 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 3 "unconnected-(SW101-Pad3)") (pinfunction "D1") (pintype "passive+no_connect") (tstamp 11e65687-dee5-42e2-a938-d539a0761571))
-    (pad "4" thru_hole oval locked (at 10.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 4 "/HIER_LABEL") (pinfunction "D2") (pintype "passive") (tstamp 9eacd685-19fc-4714-9d5a-cb390df54aea))
-    (model "${KICAD6_3DMODEL_DIR}/Connector_Phoenix_MC.3dshapes/PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical.wrl"
-      (offset (xyz 0 0 0))
-      (scale (xyz 1 1 1))
-      (rotate (xyz 0 0 0))
-    )
-  )
-
-  (footprint "Button_Switch_THT:KSA_Tactile_SPST" (layer "F.Cu")
-    (tedit 5A02FE31) (tstamp ed271cf0-3644-46cb-8a42-a46a5167bf3a)
-    (at 89.525 96.075)
-    (descr "KSA http://www.ckswitches.com/media/1457/ksa_ksl.pdf")
-    (tags "SWITCH SMD KSA SW")
-    (attr through_hole)
-    (fp_text reference "REF**" (at 2.54 -2) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp a12511d6-4c71-4b67-a69e-bd467835661b)
-    )
-    (fp_text value "KSA_Tactile_SPST" (at 2.54 10) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 53f096c1-b7f7-4874-85c3-924e94be286f)
-    )
-    (fp_text user "${REFERENCE}" (at 2.54 4) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 6b964f6c-f00c-401e-8610-6bad4637fe5c)
-    )
-    (fp_line (start 6.35 8.89) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (tstamp 1b5dc09e-ca2b-4554-ac89-aae722507997))
-    (fp_line (start -1.27 -1.27) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (tstamp 3214ed34-563c-460f-89e6-d8867c1cc4d2))
-    (fp_line (start -1.27 -1.27) (end -1.27 8.89) (layer "F.SilkS") (width 0.12) (tstamp 3de0b227-472e-4982-9629-f04af83c07a9))
-    (fp_line (start -1.27 8.89) (end 6.35 8.89) (layer "F.SilkS") (width 0.12) (tstamp 88343d9a-29c0-4487-b63e-ec337e903e90))
-    (fp_circle (center 2.54 3.81) (end 0.54 3.81) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 9cf6862a-c0fd-40f3-a4fa-9e9556bb2763))
-    (fp_line (start 6.49 8.75) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (tstamp 1c5ec7dc-5f51-4802-a669-cad436b66b04))
-    (fp_line (start -1.41 -1.14) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (tstamp 924f5213-afbb-4698-8672-719373011a99))
-    (fp_line (start -1.41 -1.14) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (tstamp 9859c259-3292-45a3-af2d-b6599b20ac97))
-    (fp_line (start 6.49 8.75) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (tstamp c08fbfd3-8364-4a63-b1e9-c40a8e38215b))
-    (fp_line (start -1.16 7.91) (end 6.24 7.91) (layer "F.Fab") (width 0.1) (tstamp 3e56d9ee-e4f1-41fc-9d6a-2d6e6e8ad807))
-    (fp_line (start -1.16 7.91) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (tstamp 572d3c99-e59e-4806-82c8-859558b9b13b))
-    (fp_line (start 6.24 -0.29) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (tstamp 5c709334-45d7-4554-9230-9b41117caa33))
-    (fp_line (start 6.24 7.91) (end 6.24 -0.29) (layer "F.Fab") (width 0.1) (tstamp e930be25-e735-4d31-9a6c-7edf2422df64))
-    (pad "1" thru_hole circle locked (at 0 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp a651f5b0-a0e4-4740-98e6-9187d16156f9))
-    (pad "2" thru_hole circle locked (at 5.08 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 8ca2c50b-bf3a-438b-a227-f2ee9e498fd9))
-    (pad "3" thru_hole circle locked (at 5.08 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp c1291491-bcea-4574-b726-596afcbff93e))
-    (pad "4" thru_hole circle locked (at 2.54 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 676ccbc4-b247-4ed4-9cf8-54a2b7e7576a))
-    (pad "5" thru_hole circle locked (at 0 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 91f2b286-8ad5-4def-9631-08c498eb7cb7))
-    (model "${KICAD6_3DMODEL_DIR}/Button_Switch_THT.3dshapes/KSA_Tactile_SPST.wrl"
-      (offset (xyz 0 0 0))
-      (scale (xyz 1 1 1))
-      (rotate (xyz 0 0 0))
-    )
-  )
-
-  (gr_rect locked (start 147.025 116.75) (end 157.925 105.85) (layer "F.Cu") (width 0.2) (fill none) (tstamp 18f33c15-2d89-4304-9c8f-98c3582bdb83))
-  (gr_poly locked
-    (pts
-      (xy 188.4 119.05)
-      (xy 182.7 119.05)
-      (xy 182.7 110.8)
-      (xy 188.4 105.1)
-    ) (layer "F.Cu") (width 0.2) (fill solid) (tstamp 4255abab-787c-46e3-9144-7ad5270c0729))
-  (gr_circle locked (center 168.8 112.075) (end 174.025 106.85) (layer "F.Cu") (width 0.2) (fill none) (tstamp 84c6ade4-472b-49ab-bf5d-7989d8cac908))
-  (gr_arc (start 103.852782 112.425) (mid 108.738891 110.401107) (end 113.625 112.425) (layer "F.Cu") (width 0.2) (tstamp b1ddb058-f7b2-429c-9489-f4e2242ad7e5))
-  (gr_text "buried via" (at 156.875 98.25) (layer "Eco1.User") (tstamp 49dcd1b7-f635-4f5a-8a01-f8c834a847dc)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "seg. locked" (at 143.9 92.95) (layer "Eco1.User") (tstamp 65f11e1d-190b-4074-a639-471d7ae0fbd9)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify left))
-  )
-  (gr_text "via" (at 156.8 95.85) (layer "Eco1.User") (tstamp aaedf2ea-4032-4703-9274-9907b7dc3e85)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "micro via" (at 156.975 100.075) (layer "Eco1.User") (tstamp cea17333-7d14-4b4f-a096-7d6db0e55544)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "segment" (at 152.3 90.25) (layer "Eco1.User") (tstamp e8055a1b-b857-489c-a9c9-cfccd187e14d)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 00c745e6-aece-4592-bb45-863e0c3493e6)
-    (pts (xy 195.53876 71.610323) (xy 222.33876 63.010323))
-    (height -2.473234)
-    (gr_text "28,1460 mm" (at 207.831685 63.860365 17.79120311) (layer "Dwgs.User") (tstamp 00c745e6-aece-4592-bb45-863e0c3493e6)
-      (effects (font (size 1 1) (thickness 0.15) italic))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
-    (pts (xy 193.33876 65.060323) (xy 220.13876 56.460323))
-    (height -2.267462)
-    (gr_text "28,1460 mm" (at 205.694558 57.506296 17.79120311) (layer "Dwgs.User") (tstamp 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
-      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 5841a60a-7434-4694-9b2f-60c2321b8bd0)
-    (pts (xy 199.6 87.1) (xy 226.4 78.5))
-    (height -11.090722)
-    (gr_text "28,1460 mm" (at 209.259859 71.144674 17.79120311) (layer "Dwgs.User") (tstamp 5841a60a-7434-4694-9b2f-60c2321b8bd0)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
-    (pts (xy 194.38876 68.410323) (xy 221.18876 59.810323))
-    (height -2.69421)
-    (gr_text "28,1460 mm" (at 206.614166 60.449957 17.79120311) (layer "Dwgs.User") (tstamp 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
-      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
-    (pts (xy 217.835151 147.360714) (xy 198.185151 127.360714))
-    (height -11.684997)
-    (gr_text "pre\"fix\"hello i \"am overwritten\" mmsuf\"fix\"" (at 200.495319 144.744037 -45.50575037) (layer "Dwgs.User") (tstamp bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) (override_value "hello i \"am overwritten\"") suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp d13f6c50-ce8f-484d-9604-839a4d68748d)
-    (pts (xy 231.035151 118.060714) (xy 211.385151 98.060714))
-    (height -11.684997)
-    (gr_text "28,0379 mm" (at 213.695319 115.444037 -45.50575037) (layer "Dwgs.User") (tstamp d13f6c50-ce8f-484d-9604-839a4d68748d)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4) suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp de180ffc-3a6e-4a65-ab2c-90a4360b215c)
-    (pts (xy 228.685151 136.360714) (xy 209.035151 116.360714))
-    (height -11.684997)
-    (gr_text "pre\"fix\"28,0379 mmsuf\"fix\"" (at 211.345319 133.744037 -45.50575037) (layer "Dwgs.User") (tstamp de180ffc-3a6e-4a65-ab2c-90a4360b215c)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp ff870511-3a90-49f1-9990-5aec7ad35822)
-    (pts (xy 235.75 99.75) (xy 216.1 79.75))
-    (height -11.684997)
-    (gr_text "28,0379 mm" (at 218.410168 97.133323 -45.50575037) (layer "Dwgs.User") (tstamp ff870511-3a90-49f1-9990-5aec7ad35822)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
-    (pts (xy 236.05 90.15) (xy 242.9 84.25))
-    (gr_text "hello i am a test" (at 249.1 90.45) (layer "Dwgs.User") (tstamp 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
-    (pts (xy 235.015611 93.021751) (xy 226 92.35))
-    (gr_text "hello i am a test \"quoted\"" (at 226 83.581876 135) (layer "Dwgs.User") (tstamp 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\""))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
-    (pts (xy 251.15 120.15) (xy 258 114.25))
-    (gr_text "hello i am a test" (at 264.2 120.45) (layer "Dwgs.User") (tstamp 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 2) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 8006915c-347c-427e-8da6-50ddf24e6b51)
-    (pts (xy 247.65 130.55) (xy 254.5 124.65))
-    (gr_text "hello i am a test" (at 260.7 130.85) (layer "Dwgs.User") (tstamp 8006915c-347c-427e-8da6-50ddf24e6b51)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 1) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 84c59850-a617-4b8e-9935-4a3c13fa674f)
-    (pts (xy 239.9 93.1) (xy 245.8 99.949999))
-    (gr_text "hello i am a test \"quoted\" cursive" (at 239.6 106.149999 270) (layer "Dwgs.User") (tstamp 84c59850-a617-4b8e-9935-4a3c13fa674f)
-      (effects (font (size 1 1) (thickness 0.15) italic))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
-    (pts (xy 174.65 117.55) (xy 180.55 124.399999))
-    (gr_text "hello i am a test \"quoted\" mirrored" (at 174.35 130.599999 270) (layer "Dwgs.User") (tstamp a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
-      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" mirrored"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
-    (pts (xy 138.35 115.8) (xy 131.500001 121.7))
-    (gr_text "hello i am a test \"quoted\" cursive mirrored" (at 125.300001 115.5 180) (layer "Dwgs.User") (tstamp b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
-      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive mirrored"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type center) (layer "Dwgs.User") (tstamp 61c5e7b9-ec75-459b-8f55-aa6dcdc47663)
-    (pts (xy 236.2 90.2) (xy 243.2 90.2))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type center) (layer "Dwgs.User") (tstamp cc6d04c1-5e89-4a69-8589-2307dd2129a4)
-    (pts (xy 261.6 91.35) (xy 272 80.95))
-    (style (thickness 0.5) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 01eecbde-a293-4e72-9ab7-4a5a43218203)
-    (pts (xy 253.85 51.5) (xy 279.85 52.35))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 264.1 50.4) (layer "Dwgs.User") (tstamp 01eecbde-a293-4e72-9ab7-4a5a43218203)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 2) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 030f7528-01d8-4f5d-b375-396511a3f702)
-    (pts (xy 226.4 78) (xy 252.4 78.85))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "26,0000 mm" (at 239.4 68.45) (layer "Dwgs.User") (tstamp 030f7528-01d8-4f5d-b375-396511a3f702)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 03748331-c066-4d57-aa54-2f8ca06e3f46)
-    (pts (xy 253.55 76.05) (xy 279.55 76.9))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.0 mm" (at 266.55 73.75) (layer "Dwgs.User") (tstamp 03748331-c066-4d57-aa54-2f8ca06e3f46)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 1))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
-    (pts (xy 253.5 48.95) (xy 279.5 49.8))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.5 46.65) (layer "Dwgs.User") (tstamp 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
-      (effects (font (size 1 1) (thickness 0.15)) (justify left))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
-    (pts (xy 253.55 61.25) (xy 279.55 62.1))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26" (at 266.55 58.95) (layer "Dwgs.User") (tstamp 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 0) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 30508594-c6b7-4560-96ac-05f6655ba783)
-    (pts (xy 253.55 45.95) (xy 279.55 46.8))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 43.65) (layer "Dwgs.User") (tstamp 30508594-c6b7-4560-96ac-05f6655ba783)
-      (effects (font (size 1 1) (thickness 0.15)) (justify right))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 3f6d185e-f550-440a-899d-361dc95bf216)
-    (pts (xy 253.55 68.75) (xy 279.55 69.6))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.0000 mm" (at 266.55 66.45) (layer "Dwgs.User") (tstamp 3f6d185e-f550-440a-899d-361dc95bf216)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 60bfe360-791c-4b4d-8701-dc29f0022c68)
-    (pts (xy 253.55 58) (xy 279.55 58.85))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 (mm)" (at 266.55 55.7) (layer "Dwgs.User") (tstamp 60bfe360-791c-4b4d-8701-dc29f0022c68)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 2) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 617f513f-16c9-4ee5-8499-a80fee4befb0)
-    (pts (xy 226.6 49.6) (xy 252.6 50.45))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "1.0236 in" (at 239.6 40.05) (layer "Dwgs.User") (tstamp 617f513f-16c9-4ee5-8499-a80fee4befb0)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 8e806abb-0abf-436e-9eb2-accf0328e785)
-    (pts (xy 253.55 54.55) (xy 279.55 55.4))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 53.4) (layer "Dwgs.User") (tstamp 8e806abb-0abf-436e-9eb2-accf0328e785)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 1) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 96e02d72-1a83-4ed2-a755-b81e76c5893f)
-    (pts (xy 253.55 71.25) (xy 279.55 72.1))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.000 mm" (at 266.55 68.95) (layer "Dwgs.User") (tstamp 96e02d72-1a83-4ed2-a755-b81e76c5893f)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 3))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
-    (pts (xy 253.55 73.65) (xy 279.55 74.5))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.00 mm" (at 266.55 71.35) (layer "Dwgs.User") (tstamp 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 2))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp a53fb125-0a87-4020-929f-425458b00a06)
-    (pts (xy 226.45 58.95) (xy 252.45 59.8))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "1023.6220 mils" (at 239.45 49.4) (layer "Dwgs.User") (tstamp a53fb125-0a87-4020-929f-425458b00a06)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 1) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp e5614058-70e1-453c-9f71-7593e14c6cda)
-    (pts (xy 253.55 66.2) (xy 279.55 67.05))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.00000 mm" (at 266.55 63.9) (layer "Dwgs.User") (tstamp e5614058-70e1-453c-9f71-7593e14c6cda)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 5))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
-    (pts (xy 226.4 68.15) (xy 252.4 69))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "26.0000 mm" (at 239.4 58.6) (layer "Dwgs.User") (tstamp e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
-    (pts (xy 253.55 78.35) (xy 279.55 79.2))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 76.05) (layer "Dwgs.User") (tstamp ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (target plus (at 185.8 93.35) (size 5) (width 0.1) (layer "Edge.Cuts") (tstamp 3bf82ecb-0898-4a14-bef0-d88c4f838b87))
-  (target x (at 187.95 98.8) (size 4) (width 1) (layer "Edge.Cuts") (tstamp 47941cd1-b5c0-40bd-bc68-af434db15455))
-
-  (segment (start 124.6875 110.7875) (end 125.9625 109.5125) (width 0.25) (layer "F.Cu") (net 0) (tstamp 504cb9e4-5572-4208-bc9d-30a7efff8b9a))
-  (segment (start 159.025 90.4) (end 165.575 90.4) (width 0.25) (layer "F.Cu") (net 0) (tstamp 50bf00c7-c69d-47e9-8d7f-002d8001f5dd))
-  (segment (start 125.9625 109.5125) (end 125.9625 102.4125) (width 0.25) (layer "F.Cu") (net 0) (tstamp a6187c22-3622-4a1a-a49a-b21e96986f96))
-  (segment locked (start 159.175 92.975) (end 165.725 92.975) (width 0.25) (layer "F.Cu") (net 0) (tstamp c5a64cb0-571c-4101-abb8-a1e8072455d4))
-  (segment (start 119.9625 110.7875) (end 124.6875 110.7875) (width 0.25) (layer "F.Cu") (net 0) (tstamp e1df8cea-32a4-457d-86df-d8e326022a52))
-  (segment (start 125.9625 102.4125) (end 119.6875 96.1375) (width 0.25) (layer "F.Cu") (net 0) (tstamp fda94f0a-876e-4bf0-ad10-35819851e3e9))
-  (via (at 132.5125 111.2125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 061b0977-703d-47fc-ba64-d6fb3f8737c3))
-  (via blind (at 172 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 0b395f32-97e7-46c6-81cd-8e3bc4675bce))
-  (via micro (at 169.3 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 395a31c4-0d27-409b-a4a6-ae65750e20db))
-  (via locked (at 163.125 95.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 3b1a1b76-9d29-4248-9ac9-c210fdba845b))
-  (via (at 159.925 95.775) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 3e210438-9173-4d97-83d2-94157dc53997))
-  (via micro (at 160.1 100) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 4c281a99-3a6b-44dc-8cbd-1a650e634550))
-  (via micro (at 163.3 100.025) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 502d494e-96a1-40b8-8acf-8ae38ec1c400))
-  (via (at 171.925 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 7589d575-3c60-4338-8ad2-67381d8dbc00))
-  (via blind (at 163.2 98.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 77fe0dab-427e-435f-9eed-6fa58fe5cee1))
-  (via blind (at 166.275 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 79a898f8-ad5e-4dbc-aa10-5d83271b9b43))
-  (via blind (at 169.2 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 8c872ef3-cd1d-4b0d-96d3-51a74e92ff52))
-  (via blind (at 160 98.175) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 954cb567-fc2b-4b8d-918a-46eb7b1f43e2))
-  (via micro (at 172.1 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp afce51bc-694a-4ac0-b46f-9657eb6057d8))
-  (via blind locked (at 128.4375 106.0125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp b2cac11a-5f3b-43d7-88e5-8d0241ac6453))
-  (via locked (at 174.6 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp ba1f567b-429c-4539-9500-750f9f41e977))
-  (via blind (at 174.675 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp c02cbdff-6228-4696-9621-0c9f24504b5a))
-  (via locked (at 169.125 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp c5dbc2f4-347d-4e8b-9dc5-05ae6c8ee4e9))
-  (via micro (at 166.375 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp ed159ec6-8461-40d0-99dc-879cac3b491e))
-  (via (at 166.2 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp f5a28a1a-7f56-478a-aad0-76861dd7b0e0))
-  (via micro (at 174.775 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp f90de4aa-337a-492e-a29b-d742cf541973))
-  (via micro (at 127.5625 98.8875) (size 0.8) (drill 0.4) (layers "In1.Cu" "B.Cu") (free) (net 0) (tstamp 557d128f-cf69-4c70-9959-d139ac95c63c))
-  (segment (start 129.6375 99.8625) (end 129.6375 107.5125) (width 0.25) (layer "F.Cu") (net 4) (tstamp 58588507-da7d-4bcc-b9cd-bfc861c19ac1))
-  (segment (start 114.0875 101.8875) (end 114.0875 95.7625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 6586c7bc-7012-4335-b0bd-43918f23a8fd))
-  (segment (start 116.2875 93.5625) (end 123.3375 93.5625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 71ae16fb-a509-4131-a92e-a0b0b25743ff))
-  (segment (start 114.0875 95.7625) (end 116.2875 93.5625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 93bf1c04-96c6-49e8-9a85-ee6cc4606fcb))
-  (segment (start 123.3375 93.5625) (end 129.6375 99.8625) (width 0.25) (layer "F.Cu") (net 4) (tstamp f07599c7-599f-45fe-bd1e-15999cff5f04))
-
-  (zone locked (net 4) (net_name "/HIER_LABEL") (layers "F.Cu" "In18.Cu" "In21.Cu") (tstamp 001057ce-186a-458c-93e5-a6d8479d28a0) (name "test") (hatch full 0.508)
-    (priority 2)
-    (connect_pads (clearance 0.508))
-    (min_thickness 0.254) (filled_areas_thickness no)
-    (fill yes (mode hatch) (thermal_gap 0.508) (thermal_bridge_width 0.508) (smoothing chamfer) (island_removal_mode 2) (island_area_min 1)
-      (hatch_thickness 1.016) (hatch_gap 1.524) (hatch_orientation 0)
-      (hatch_smoothing_level 1) (hatch_smoothing_value 0.1)
-      (hatch_border_algorithm hatch_thickness) (hatch_min_hole_area 0.3))
-    (polygon
-      (pts
-        (xy 170.375 133)
-        (xy 155.55 133)
-        (xy 155.55 130)
-        (xy 146.425 130)
-        (xy 156.9 119.525)
-      )
-    )
-    (filled_polygon
-      (layer "F.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 156.94919 131.3858)
-        (xy 157.07858 131.51519)
-        (xy 158.3458 131.51519)
-        (xy 158.47519 131.3858)
-        (xy 159.48919 131.3858)
-        (xy 159.61858 131.51519)
-        (xy 160.8858 131.51519)
-        (xy 161.01519 131.3858)
-        (xy 162.02919 131.3858)
-        (xy 162.15858 131.51519)
-        (xy 163.4258 131.51519)
-        (xy 163.55519 131.3858)
-        (xy 164.56919 131.3858)
-        (xy 164.69858 131.51519)
-        (xy 165.9658 131.51519)
-        (xy 166.09519 131.3858)
-        (xy 166.09519 130.33522)
-        (xy 165.74916 129.98919)
-        (xy 164.69858 129.98919)
-        (xy 164.56919 130.11858)
-        (xy 164.56919 131.3858)
-        (xy 163.55519 131.3858)
-        (xy 163.55519 130.11858)
-        (xy 163.4258 129.98919)
-        (xy 162.15858 129.98919)
-        (xy 162.02919 130.11858)
-        (xy 162.02919 131.3858)
-        (xy 161.01519 131.3858)
-        (xy 161.01519 130.11858)
-        (xy 160.8858 129.98919)
-        (xy 159.61858 129.98919)
-        (xy 159.48919 130.11858)
-        (xy 159.48919 131.3858)
-        (xy 158.47519 131.3858)
-        (xy 158.47519 130.11858)
-        (xy 158.3458 129.98919)
-        (xy 157.07858 129.98919)
-        (xy 156.94919 130.11858)
-        (xy 156.94919 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 151.67719 130)
-        (xy 151.609069 129.979998)
-        (xy 151.588095 129.963095)
-        (xy 150.43518 128.81018)
-        (xy 151.86919 128.81018)
-        (xy 151.91701 128.858)
-        (xy 153.38299 128.858)
-        (xy 153.39519 128.8458)
-        (xy 154.40919 128.8458)
-        (xy 154.42139 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.863166 128.917824)
-        (xy 155.93519 128.8458)
-        (xy 156.94919 128.8458)
-        (xy 157.07858 128.97519)
-        (xy 158.3458 128.97519)
-        (xy 158.47519 128.8458)
-        (xy 159.48919 128.8458)
-        (xy 159.61858 128.97519)
-        (xy 160.8858 128.97519)
-        (xy 161.01519 128.8458)
-        (xy 162.02919 128.8458)
-        (xy 162.15858 128.97519)
-        (xy 163.4258 128.97519)
-        (xy 163.55519 128.8458)
-        (xy 163.55519 127.79522)
-        (xy 163.20916 127.44919)
-        (xy 162.15858 127.44919)
-        (xy 162.02919 127.57858)
-        (xy 162.02919 128.8458)
-        (xy 161.01519 128.8458)
-        (xy 161.01519 127.57858)
-        (xy 160.8858 127.44919)
-        (xy 159.61858 127.44919)
-        (xy 159.48919 127.57858)
-        (xy 159.48919 128.8458)
-        (xy 158.47519 128.8458)
-        (xy 158.47519 127.57858)
-        (xy 158.3458 127.44919)
-        (xy 157.07858 127.44919)
-        (xy 156.94919 127.57858)
-        (xy 156.94919 128.8458)
-        (xy 155.93519 128.8458)
-        (xy 155.93519 127.57858)
-        (xy 155.8058 127.44919)
-        (xy 154.53858 127.44919)
-        (xy 154.40919 127.57858)
-        (xy 154.40919 128.8458)
-        (xy 153.39519 128.8458)
-        (xy 153.39519 127.57858)
-        (xy 153.2658 127.44919)
-        (xy 151.99858 127.44919)
-        (xy 151.86919 127.57858)
-        (xy 151.86919 128.81018)
-        (xy 150.43518 128.81018)
-        (xy 149.114095 127.489095)
-        (xy 149.080069 127.426783)
-        (xy 149.085134 127.355968)
-        (xy 149.114095 127.310905)
-        (xy 150.1192 126.3058)
-        (xy 151.86919 126.3058)
-        (xy 151.99858 126.43519)
-        (xy 153.2658 126.43519)
-        (xy 153.39519 126.3058)
-        (xy 154.40919 126.3058)
-        (xy 154.53858 126.43519)
-        (xy 155.8058 126.43519)
-        (xy 155.93519 126.3058)
-        (xy 156.94919 126.3058)
-        (xy 157.07858 126.43519)
-        (xy 158.3458 126.43519)
-        (xy 158.47519 126.3058)
-        (xy 159.48919 126.3058)
-        (xy 159.61858 126.43519)
-        (xy 160.8858 126.43519)
-        (xy 161.01519 126.3058)
-        (xy 161.01519 125.25522)
-        (xy 160.66916 124.90919)
-        (xy 159.61858 124.90919)
-        (xy 159.48919 125.03858)
-        (xy 159.48919 126.3058)
-        (xy 158.47519 126.3058)
-        (xy 158.47519 125.03858)
-        (xy 158.3458 124.90919)
-        (xy 157.07858 124.90919)
-        (xy 156.94919 125.03858)
-        (xy 156.94919 126.3058)
-        (xy 155.93519 126.3058)
-        (xy 155.93519 125.03858)
-        (xy 155.8058 124.90919)
-        (xy 154.53858 124.90919)
-        (xy 154.40919 125.03858)
-        (xy 154.40919 126.3058)
-        (xy 153.39519 126.3058)
-        (xy 153.39519 125.03858)
-        (xy 153.2658 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.86919 126.17084)
-        (xy 151.86919 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.40919 123.7658)
-        (xy 154.53858 123.89519)
-        (xy 155.8058 123.89519)
-        (xy 155.93519 123.7658)
-        (xy 156.94919 123.7658)
-        (xy 157.07858 123.89519)
-        (xy 158.3458 123.89519)
-        (xy 158.47519 123.7658)
-        (xy 158.47519 122.71522)
-        (xy 158.12916 122.36919)
-        (xy 157.07858 122.36919)
-        (xy 156.94919 122.49858)
-        (xy 156.94919 123.7658)
-        (xy 155.93519 123.7658)
-        (xy 155.93519 122.49858)
-        (xy 155.8058 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.40919 123.63084)
-        (xy 154.40919 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-    (filled_polygon
-      (layer "In18.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 157.01519 131.3858)
-        (xy 157.14458 131.51519)
-        (xy 158.4118 131.51519)
-        (xy 158.54119 131.3858)
-        (xy 159.55519 131.3858)
-        (xy 159.68458 131.51519)
-        (xy 160.9518 131.51519)
-        (xy 161.08119 131.3858)
-        (xy 162.09519 131.3858)
-        (xy 162.22458 131.51519)
-        (xy 163.4918 131.51519)
-        (xy 163.62119 131.3858)
-        (xy 164.63519 131.3858)
-        (xy 164.76458 131.51519)
-        (xy 166.0318 131.51519)
-        (xy 166.16119 131.3858)
-        (xy 166.16119 130.40122)
-        (xy 165.74916 129.98919)
-        (xy 164.76458 129.98919)
-        (xy 164.63519 130.11858)
-        (xy 164.63519 131.3858)
-        (xy 163.62119 131.3858)
-        (xy 163.62119 130.11858)
-        (xy 163.4918 129.98919)
-        (xy 162.22458 129.98919)
-        (xy 162.09519 130.11858)
-        (xy 162.09519 131.3858)
-        (xy 161.08119 131.3858)
-        (xy 161.08119 130.11858)
-        (xy 160.9518 129.98919)
-        (xy 159.68458 129.98919)
-        (xy 159.55519 130.11858)
-        (xy 159.55519 131.3858)
-        (xy 158.54119 131.3858)
-        (xy 158.54119 130.11858)
-        (xy 158.4118 129.98919)
-        (xy 157.14458 129.98919)
-        (xy 157.01519 130.11858)
-        (xy 157.01519 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 146.72919 130)
-        (xy 146.661069 129.979998)
-        (xy 146.614576 129.926342)
-        (xy 146.604472 129.856068)
-        (xy 146.633966 129.791488)
-        (xy 146.640095 129.784905)
-        (xy 147.5792 128.8458)
-        (xy 149.39519 128.8458)
-        (xy 149.40739 128.858)
-        (xy 150.90899 128.858)
-        (xy 150.92119 128.8458)
-        (xy 151.93519 128.8458)
-        (xy 151.94739 128.858)
-        (xy 153.44899 128.858)
-        (xy 153.46119 128.8458)
-        (xy 154.47519 128.8458)
-        (xy 154.48739 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.918216 128.928774)
-        (xy 156.00119 128.8458)
-        (xy 157.01519 128.8458)
-        (xy 157.14458 128.97519)
-        (xy 158.4118 128.97519)
-        (xy 158.54119 128.8458)
-        (xy 159.55519 128.8458)
-        (xy 159.68458 128.97519)
-        (xy 160.9518 128.97519)
-        (xy 161.08119 128.8458)
-        (xy 162.09519 128.8458)
-        (xy 162.22458 128.97519)
-        (xy 163.4918 128.97519)
-        (xy 163.62119 128.8458)
-        (xy 163.62119 127.86122)
-        (xy 163.20916 127.44919)
-        (xy 162.22458 127.44919)
-        (xy 162.09519 127.57858)
-        (xy 162.09519 128.8458)
-        (xy 161.08119 128.8458)
-        (xy 161.08119 127.57858)
-        (xy 160.9518 127.44919)
-        (xy 159.68458 127.44919)
-        (xy 159.55519 127.57858)
-        (xy 159.55519 128.8458)
-        (xy 158.54119 128.8458)
-        (xy 158.54119 127.57858)
-        (xy 158.4118 127.44919)
-        (xy 157.14458 127.44919)
-        (xy 157.01519 127.57858)
-        (xy 157.01519 128.8458)
-        (xy 156.00119 128.8458)
-        (xy 156.00119 127.57858)
-        (xy 155.8718 127.44919)
-        (xy 154.60458 127.44919)
-        (xy 154.47519 127.57858)
-        (xy 154.47519 128.8458)
-        (xy 153.46119 128.8458)
-        (xy 153.46119 127.57858)
-        (xy 153.3318 127.44919)
-        (xy 152.06458 127.44919)
-        (xy 151.93519 127.57858)
-        (xy 151.93519 128.8458)
-        (xy 150.92119 128.8458)
-        (xy 150.92119 127.57858)
-        (xy 150.7918 127.44919)
-        (xy 150.59084 127.44919)
-        (xy 149.39519 128.64484)
-        (xy 149.39519 128.8458)
-        (xy 147.5792 128.8458)
-        (xy 150.1192 126.3058)
-        (xy 151.93519 126.3058)
-        (xy 152.06458 126.43519)
-        (xy 153.3318 126.43519)
-        (xy 153.46119 126.3058)
-        (xy 154.47519 126.3058)
-        (xy 154.60458 126.43519)
-        (xy 155.8718 126.43519)
-        (xy 156.00119 126.3058)
-        (xy 157.01519 126.3058)
-        (xy 157.14458 126.43519)
-        (xy 158.4118 126.43519)
-        (xy 158.54119 126.3058)
-        (xy 159.55519 126.3058)
-        (xy 159.68458 126.43519)
-        (xy 160.9518 126.43519)
-        (xy 161.08119 126.3058)
-        (xy 161.08119 125.32122)
-        (xy 160.66916 124.90919)
-        (xy 159.68458 124.90919)
-        (xy 159.55519 125.03858)
-        (xy 159.55519 126.3058)
-        (xy 158.54119 126.3058)
-        (xy 158.54119 125.03858)
-        (xy 158.4118 124.90919)
-        (xy 157.14458 124.90919)
-        (xy 157.01519 125.03858)
-        (xy 157.01519 126.3058)
-        (xy 156.00119 126.3058)
-        (xy 156.00119 125.03858)
-        (xy 155.8718 124.90919)
-        (xy 154.60458 124.90919)
-        (xy 154.47519 125.03858)
-        (xy 154.47519 126.3058)
-        (xy 153.46119 126.3058)
-        (xy 153.46119 125.03858)
-        (xy 153.3318 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.93519 126.10484)
-        (xy 151.93519 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.47519 123.7658)
-        (xy 154.60458 123.89519)
-        (xy 155.8718 123.89519)
-        (xy 156.00119 123.7658)
-        (xy 157.01519 123.7658)
-        (xy 157.14458 123.89519)
-        (xy 158.4118 123.89519)
-        (xy 158.54119 123.7658)
-        (xy 158.54119 122.78122)
-        (xy 158.12916 122.36919)
-        (xy 157.14458 122.36919)
-        (xy 157.01519 122.49858)
-        (xy 157.01519 123.7658)
-        (xy 156.00119 123.7658)
-        (xy 156.00119 122.49858)
-        (xy 155.8718 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.47519 123.56484)
-        (xy 154.47519 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-    (filled_polygon
-      (layer "In21.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 157.01519 131.3858)
-        (xy 157.14458 131.51519)
-        (xy 158.4118 131.51519)
-        (xy 158.54119 131.3858)
-        (xy 159.55519 131.3858)
-        (xy 159.68458 131.51519)
-        (xy 160.9518 131.51519)
-        (xy 161.08119 131.3858)
-        (xy 162.09519 131.3858)
-        (xy 162.22458 131.51519)
-        (xy 163.4918 131.51519)
-        (xy 163.62119 131.3858)
-        (xy 164.63519 131.3858)
-        (xy 164.76458 131.51519)
-        (xy 166.0318 131.51519)
-        (xy 166.16119 131.3858)
-        (xy 166.16119 130.40122)
-        (xy 165.74916 129.98919)
-        (xy 164.76458 129.98919)
-        (xy 164.63519 130.11858)
-        (xy 164.63519 131.3858)
-        (xy 163.62119 131.3858)
-        (xy 163.62119 130.11858)
-        (xy 163.4918 129.98919)
-        (xy 162.22458 129.98919)
-        (xy 162.09519 130.11858)
-        (xy 162.09519 131.3858)
-        (xy 161.08119 131.3858)
-        (xy 161.08119 130.11858)
-        (xy 160.9518 129.98919)
-        (xy 159.68458 129.98919)
-        (xy 159.55519 130.11858)
-        (xy 159.55519 131.3858)
-        (xy 158.54119 131.3858)
-        (xy 158.54119 130.11858)
-        (xy 158.4118 129.98919)
-        (xy 157.14458 129.98919)
-        (xy 157.01519 130.11858)
-        (xy 157.01519 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 146.72919 130)
-        (xy 146.661069 129.979998)
-        (xy 146.614576 129.926342)
-        (xy 146.604472 129.856068)
-        (xy 146.633966 129.791488)
-        (xy 146.640095 129.784905)
-        (xy 147.5792 128.8458)
-        (xy 149.39519 128.8458)
-        (xy 149.40739 128.858)
-        (xy 150.90899 128.858)
-        (xy 150.92119 128.8458)
-        (xy 151.93519 128.8458)
-        (xy 151.94739 128.858)
-        (xy 153.44899 128.858)
-        (xy 153.46119 128.8458)
-        (xy 154.47519 128.8458)
-        (xy 154.48739 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.918216 128.928774)
-        (xy 156.00119 128.8458)
-        (xy 157.01519 128.8458)
-        (xy 157.14458 128.97519)
-        (xy 158.4118 128.97519)
-        (xy 158.54119 128.8458)
-        (xy 159.55519 128.8458)
-        (xy 159.68458 128.97519)
-        (xy 160.9518 128.97519)
-        (xy 161.08119 128.8458)
-        (xy 162.09519 128.8458)
-        (xy 162.22458 128.97519)
-        (xy 163.4918 128.97519)
-        (xy 163.62119 128.8458)
-        (xy 163.62119 127.86122)
-        (xy 163.20916 127.44919)
-        (xy 162.22458 127.44919)
-        (xy 162.09519 127.57858)
-        (xy 162.09519 128.8458)
-        (xy 161.08119 128.8458)
-        (xy 161.08119 127.57858)
-        (xy 160.9518 127.44919)
-        (xy 159.68458 127.44919)
-        (xy 159.55519 127.57858)
-        (xy 159.55519 128.8458)
-        (xy 158.54119 128.8458)
-        (xy 158.54119 127.57858)
-        (xy 158.4118 127.44919)
-        (xy 157.14458 127.44919)
-        (xy 157.01519 127.57858)
-        (xy 157.01519 128.8458)
-        (xy 156.00119 128.8458)
-        (xy 156.00119 127.57858)
-        (xy 155.8718 127.44919)
-        (xy 154.60458 127.44919)
-        (xy 154.47519 127.57858)
-        (xy 154.47519 128.8458)
-        (xy 153.46119 128.8458)
-        (xy 153.46119 127.57858)
-        (xy 153.3318 127.44919)
-        (xy 152.06458 127.44919)
-        (xy 151.93519 127.57858)
-        (xy 151.93519 128.8458)
-        (xy 150.92119 128.8458)
-        (xy 150.92119 127.57858)
-        (xy 150.7918 127.44919)
-        (xy 150.59084 127.44919)
-        (xy 149.39519 128.64484)
-        (xy 149.39519 128.8458)
-        (xy 147.5792 128.8458)
-        (xy 150.1192 126.3058)
-        (xy 151.93519 126.3058)
-        (xy 152.06458 126.43519)
-        (xy 153.3318 126.43519)
-        (xy 153.46119 126.3058)
-        (xy 154.47519 126.3058)
-        (xy 154.60458 126.43519)
-        (xy 155.8718 126.43519)
-        (xy 156.00119 126.3058)
-        (xy 157.01519 126.3058)
-        (xy 157.14458 126.43519)
-        (xy 158.4118 126.43519)
-        (xy 158.54119 126.3058)
-        (xy 159.55519 126.3058)
-        (xy 159.68458 126.43519)
-        (xy 160.9518 126.43519)
-        (xy 161.08119 126.3058)
-        (xy 161.08119 125.32122)
-        (xy 160.66916 124.90919)
-        (xy 159.68458 124.90919)
-        (xy 159.55519 125.03858)
-        (xy 159.55519 126.3058)
-        (xy 158.54119 126.3058)
-        (xy 158.54119 125.03858)
-        (xy 158.4118 124.90919)
-        (xy 157.14458 124.90919)
-        (xy 157.01519 125.03858)
-        (xy 157.01519 126.3058)
-        (xy 156.00119 126.3058)
-        (xy 156.00119 125.03858)
-        (xy 155.8718 124.90919)
-        (xy 154.60458 124.90919)
-        (xy 154.47519 125.03858)
-        (xy 154.47519 126.3058)
-        (xy 153.46119 126.3058)
-        (xy 153.46119 125.03858)
-        (xy 153.3318 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.93519 126.10484)
-        (xy 151.93519 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.47519 123.7658)
-        (xy 154.60458 123.89519)
-        (xy 155.8718 123.89519)
-        (xy 156.00119 123.7658)
-        (xy 157.01519 123.7658)
-        (xy 157.14458 123.89519)
-        (xy 158.4118 123.89519)
-        (xy 158.54119 123.7658)
-        (xy 158.54119 122.78122)
-        (xy 158.12916 122.36919)
-        (xy 157.14458 122.36919)
-        (xy 157.01519 122.49858)
-        (xy 157.01519 123.7658)
-        (xy 156.00119 123.7658)
-        (xy 156.00119 122.49858)
-        (xy 155.8718 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.47519 123.56484)
-        (xy 154.47519 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-  )
-  (zone locked (net 0) (net_name "") (layer "F.Cu") (tstamp 2e82f573-84c7-4545-ae28-f9e6f082319e) (name "asdf") (hatch full 0.508)
-    (connect_pads (clearance 0))
-    (min_thickness 0.254)
-    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour not_allowed) (footprints not_allowed))
-    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-    (polygon
-      (pts
-        (xy 154.05 132.425)
-        (xy 141.925 132.425)
-        (xy 141.925 128.325)
-        (xy 128.25 128.325)
-        (xy 139.1 117.475)
-      )
-    )
-  )
-  (group "Testgroup, locked" locked (id e0de2bab-8c83-4a7c-aa08-f6e63338fc80)
-    (members
-      18f33c15-2d89-4304-9c8f-98c3582bdb83
-      4255abab-787c-46e3-9144-7ad5270c0729
-      84c6ade4-472b-49ab-bf5d-7989d8cac908
-    )
-  )
-)
diff --git a/tests/testdata/board/test_boardWithAllPrimitives.expected b/tests/testdata/board/test_boardWithAllPrimitives.expected
deleted file mode 100644
index 30e71b5..0000000
--- a/tests/testdata/board/test_boardWithAllPrimitives.expected
+++ /dev/null
@@ -1,1466 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 19.11)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (1 "In1.Cu" signal)
-    (2 "In2.Cu" signal)
-    (3 "In3.Cu" signal)
-    (4 "In4.Cu" signal)
-    (5 "In5.Cu" signal)
-    (6 "In6.Cu" signal)
-    (7 "In7.Cu" signal)
-    (8 "In8.Cu" signal)
-    (9 "In9.Cu" signal)
-    (10 "In10.Cu" signal)
-    (11 "In11.Cu" signal)
-    (12 "In12.Cu" signal)
-    (13 "In13.Cu" signal)
-    (14 "In14.Cu" signal)
-    (15 "In15.Cu" signal)
-    (16 "In16.Cu" signal)
-    (17 "In17.Cu" signal)
-    (18 "In18.Cu" signal)
-    (19 "In19.Cu" signal)
-    (20 "In20.Cu" signal)
-    (21 "In21.Cu" signal)
-    (22 "In22.Cu" signal)
-    (23 "In23.Cu" signal)
-    (24 "In24.Cu" signal)
-    (25 "In25.Cu" signal)
-    (26 "In26.Cu" signal)
-    (27 "In27.Cu" signal)
-    (28 "In28.Cu" signal)
-    (29 "In29.Cu" signal)
-    (30 "In30.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (stackup
-      (layer "F.SilkS" (type "Top Silk Screen") (color "Yellow"))
-      (layer "F.Paste" (type "Top Solder Paste"))
-      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
-      (layer "F.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.021))
-      (layer "In1.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 2" (type "prepreg") (thickness 1.51) (material "FR4") (epsilon_r 4.52) (loss_tangent 0.02))
-      (layer "In2.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 3" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.024))
-      (layer "In3.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 4" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In4.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 5" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In5.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 6" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In6.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 7" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In7.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 8" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In8.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 9" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In9.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 10" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In10.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 11" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In11.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 12" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In12.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 13" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In13.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 14" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In14.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 15" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In15.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 16" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In16.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 17" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In17.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 18" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In18.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 19" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In19.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 20" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In20.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 21" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In21.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 22" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In22.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 23" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In23.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 24" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In24.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 25" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In25.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 26" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In26.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 27" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In27.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 28" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In28.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 29" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In29.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 30" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "In30.Cu" (type "copper") (thickness 0.035))
-      (layer "dielectric 31" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
-      (layer "B.Cu" (type "copper") (thickness 0.035))
-      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
-      (layer "B.Paste" (type "Bottom Solder Paste"))
-      (layer "B.SilkS" (type "Bottom Silk Screen") (color "Green"))
-      (copper_finish "HAL lead-free")
-      (dielectric_constraints no)
-      (edge_connector bevelled)
-      (castellated_pads yes)
-      (edge_plating yes)
-    )
-    (pad_to_mask_clearance 1)
-    (solder_mask_min_width 1)
-    (pad_to_paste_clearance -1)
-    (pad_to_paste_clearance_ratio -0.01)
-    (aux_axis_origin 177.65 97.75)
-    (grid_origin 182.8 82.55)
-    (pcbplotparams
-      (layerselection 0x00010fc_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes true)
-      (usegerberadvancedattributes true)
-      (creategerberjobfile true)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer true)
-      (plotframeref false)
-      (viasonmask false)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 12.344291)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext false)
-      (sketchpadsonfab false)
-      (subtractmaskfromsilk false)
-      (outputformat 0)
-      (mirror false)
-      (drillshape 0)
-      (scaleselection 1)
-      (outputdirectory "D:/home/Desktop/Temp/")
-    )
-  )
-
-  (property "123456" "45641523")
-  (property "test" "test test")
-  (property "xdfa" "xdfadsf ")
-
-  (net 0 "")
-  (net 1 "/NET1")
-  (net 2 "unconnected-(SW101-Pad2)")
-  (net 3 "unconnected-(SW101-Pad3)")
-  (net 4 "/HIER_LABEL")
-
-  (footprint "test" (layer "F.Cu")
-    (tedit 621D235F) (tstamp 3cfcbcc7-4f45-46ab-82a8-c414c7972161)
-    (at 104.78 48.237399)
-    (attr smd)
-    (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
-    )
-    (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp c58960d9-4cac-4036-ad2e-1aef26946dae)
-    )
-    (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu")
-      (effects (font (size 1.5 1.5) (thickness 0.3)))
-      (tstamp 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
-    )
-    (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp ec9e24d8-d1c5-40e2-9812-dc315d05f470)
-    )
-    (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
-    )
-    (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 53c85970-3e21-4fae-a84f-721cfc0513b5)
-    )
-    (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
-    )
-    (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (tstamp 003c2200-0632-4808-a662-8ddd5d30c768))
-    (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (tstamp 6ff874d0-4ac5-414c-83a7-573eda4c7703))
-    (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (tstamp be0953c0-632d-4dd2-85e9-4d41239f22d2))
-    (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 7f3eb118-a20c-4239-b800-c9211c66847d))
-    (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (tstamp 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
-    (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (tstamp fc0a4225-db46-4d48-8163-d522602d57cd))
-    (fp_poly (pts
-        (xy 8.4 14.95)
-        (xy 1.15 14.95)
-        (xy 1.15 6.7)
-        (xy 1.9 6.7)
-        (xy 8.4 0.2)
-      ) (layer "F.SilkS") (width 0.12) (fill solid) (tstamp f6ee98b5-4773-4eeb-a825-33c1705abace))
-    (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (tstamp 127679a9-3981-4934-815e-896a4e3ff56e))
-    (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
-    (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
-    (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 0520f61d-4522-4301-a3fa-8ed0bf060f69))
-    (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 0f560957-a8c5-442f-b20c-c2d88613742c))
-    (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
-    (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
-    (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
-    (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
-    (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
-    (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
-    (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
-    (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
-    (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-      (die_length 21) (tstamp c43663ee-9a0d-4f27-a292-89ba89964065))
-    (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
-      (die_length 21) (tstamp c67ad10d-2f75-4ec6-a139-47058f7f06b2))
-    (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
-      (die_length 1) (tstamp 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
-    (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
-      (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
-      (options (clearance convexhull) (anchor circle))
-      (primitives
-        (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
-        (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
-        (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
-        (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
-        (gr_poly (pts
-            (xy 12.8 4.2)
-            (xy 8.2 8.8)
-            (xy 3.8 4.4)
-            (xy 8.4 -0.2)
-          ) (width 0.2) (fill yes))
-        (gr_arc (start 6.4 0.2) (mid 6.594453 -0.786584) (end 7.148728 -1.625594) (width 0.2))
-        (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
-        (gr_poly (pts
-            (xy -0.6 2.8)
-            (xy -1.8 4)
-            (xy -6.4 4)
-            (xy -6.4 1)
-            (xy -0.6 1)
-          ) (width 0.2) (fill yes))
-        (gr_poly (pts
-            (xy 0.870847 -0.746121)
-            (xy 0.983248 -0.691178)
-            (xy 1.071791 -0.602789)
-            (xy 1.12693 -0.490484)
-            (xy 1.143 -0.381)
-            (xy 1.143 0.381)
-            (xy 1.127121 0.489847)
-            (xy 1.072178 0.602248)
-            (xy 0.983789 0.690791)
-            (xy 0.871484 0.74593)
-            (xy 0.762 0.762)
-            (xy -0.762 0.762)
-            (xy -0.870847 0.746121)
-            (xy -0.983248 0.691178)
-            (xy -1.071791 0.602789)
-            (xy -1.12693 0.490484)
-            (xy -1.143 0.381)
-            (xy -1.143 -0.381)
-            (xy -1.127121 -0.489847)
-            (xy -1.072178 -0.602248)
-            (xy -0.983789 -0.690791)
-            (xy -0.871484 -0.74593)
-            (xy -0.762 -0.762)
-            (xy 0.762 -0.762)
-          ) (width 0) (fill yes))
-      ) (tstamp d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
-    (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
-      (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
-      (die_length 15) (tstamp e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
-    (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
-    (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
-      (connect_pads (clearance 0))
-      (min_thickness 0.254)
-      (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
-      (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-      (polygon
-        (pts
-          (xy 154.38 59.237399)
-          (xy 141.58 60.437399)
-          (xy 141.58 46.437399)
-        )
-      )
-    )
-    (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
-      (members
-        7f3eb118-a20c-4239-b800-c9211c66847d
-        f6ee98b5-4773-4eeb-a825-33c1705abace
-      )
-    )
-  )
-
-  (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (layer "F.Cu")
-    (tedit 5B784ED0) (tstamp 907b59ac-a3f3-4819-aae3-2f3689254127)
-    (at 103.5875 101.8875)
-    (descr "Generic Phoenix Contact connector footprint for: MCV_1,5/4-G-3.5; number of pins: 04; pin pitch: 3.50mm; Vertical || order number: 1843622 8A 160V")
-    (tags "phoenix_contact connector MCV_01x04_G_3.5mm")
-    (property "Sheetfile" "test.kicad_sch")
-    (property "Sheetname" "")
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6")
-    (attr through_hole)
-    (fp_text reference "SW101" (at 5.25 -5.45) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp cc90c745-434f-4e54-89c7-cbf24870aeb9)
-    )
-    (fp_text value "SW_Coded" (at 5.25 4.2) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 7e47f703-9790-4c34-9d14-1de39c308f06)
-    )
-    (fp_text user "${REFERENCE}" (at 5.25 -3.55) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 122cd6ff-87b3-455d-9734-dd35dee6c1d9)
-    )
-    (fp_line (start 5.75 -2.4) (end 5.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 02426097-2343-483f-9184-b1021f11f671))
-    (fp_line (start 6.25 -2.05) (end 6.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 0757ecdd-1a4f-4f75-825e-ff54cc68895a))
-    (fp_line (start 12 -3.4) (end 11.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 1257fa4c-2f92-4e07-b43d-826125b0853c))
-    (fp_line (start -1.5 -2.05) (end -0.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 14ae6814-97a1-417e-bec2-8de437fc055e))
-    (fp_line (start 4.25 -2.05) (end 5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 1e0832ec-61bb-4753-a703-f800e50c87e9))
-    (fp_line (start 9 -2.05) (end 9.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 1fa150d9-4de3-4b9f-8fca-6651616614be))
-    (fp_line (start -0.75 2.25) (end -1.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 207c68d8-2bd6-401c-bbd5-e50fcc95bf20))
-    (fp_line (start 5.5 -3.4) (end 8.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 20dc8b19-954b-4369-b580-dab885da8ae2))
-    (fp_line (start 12 2.25) (end 11.25 2.25) (layer "F.SilkS") (width 0.12) (tstamp 229202cd-20dc-4eab-ac2e-7f028bc91419))
-    (fp_line (start 1.5 -2.05) (end 1.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 22b553ec-39b6-4275-9347-df53a7c0db1d))
-    (fp_line (start 2 -3.4) (end 5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 24a65fad-0331-474b-b5bf-d945e8eff4b2))
-    (fp_line (start 7.75 -2.05) (end 8.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 258fcb41-7033-4835-9fdf-423793cb23b3))
-    (fp_line (start 4.75 -2.4) (end 4.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 2afa4af3-c77f-43e1-bb65-33635d9d9bde))
-    (fp_line (start 2.25 -2.4) (end 2 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 302baa85-ea14-4bc3-9ee0-750ac99c372c))
-    (fp_line (start 2.75 -2.05) (end 2.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 30ebadca-c9f5-4eef-93a6-e46a7f5dcb8a))
-    (fp_line (start 0.75 -2.05) (end 1.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 3311faf7-cebf-4b03-887f-81682eb2d766))
-    (fp_line (start 2.75 2.25) (end 2 2.25) (layer "F.SilkS") (width 0.12) (tstamp 37f83d32-45f1-46b2-96b2-a40681275916))
-    (fp_line (start 8.5 -3.4) (end 8.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 3e7ae60c-e895-4a5a-a7e3-6a535a3a8283))
-    (fp_line (start -1.5 2.25) (end -1.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 4713b701-0d77-40e8-8184-3a11f9df2324))
-    (fp_line (start 2 2.25) (end 2 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 48eaa494-0ad3-4e7e-a203-8b82c0c90232))
-    (fp_line (start 0.75 -2.4) (end 0.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 49b3f8e5-beb0-46c0-af33-92b06a5bdff5))
-    (fp_line (start 1.5 2.25) (end 0.75 2.25) (layer "F.SilkS") (width 0.12) (tstamp 4b9cce0d-afc3-48b9-a22f-0ea23c5574b8))
-    (fp_line (start -2.56 3.11) (end 13.06 3.11) (layer "F.SilkS") (width 0.12) (tstamp 5166ee21-16cc-47d4-a438-2c0e2aa8959c))
-    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.SilkS") (width 0.12) (tstamp 5c458ff7-d3f7-4417-a611-6f2981d0e9cc))
-    (fp_line (start 1.5 -3.4) (end 1.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 67dca7e5-24d8-4654-9579-d6404307654b))
-    (fp_line (start 5.5 -2.05) (end 6.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 68310a47-af11-4665-bffb-5d4b7b98d48d))
-    (fp_line (start 8.5 -2.05) (end 8.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp 6b1d8153-1929-422b-bfbd-285ab66db86b))
-    (fp_line (start -0.75 -2.4) (end -1.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 6d8a3226-b0be-4ce6-99a7-7bc208219506))
-    (fp_line (start 5.5 2.25) (end 5.5 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 702c939c-cd20-4967-a0a8-e2ffe549a816))
-    (fp_line (start -2.56 -4.36) (end -2.56 3.11) (layer "F.SilkS") (width 0.12) (tstamp 76c255ae-be6f-425d-a22f-ead2d9b08f5a))
-    (fp_line (start 6.25 -2.4) (end 5.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 77db9235-89b0-4b41-9039-5e76b93e13e4))
-    (fp_line (start 11.75 -2.4) (end 11.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 7b4da999-f9e4-4c1d-bc75-0b3a3ebad32a))
-    (fp_line (start 9.25 -2.4) (end 9 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 7e67823e-2810-490d-bd9b-8b337d7a4ad5))
-    (fp_line (start 7.75 -2.4) (end 7.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 830d86b3-78eb-4c6c-a352-bf19ba50bd18))
-    (fp_line (start 13.06 3.11) (end 13.06 -4.36) (layer "F.SilkS") (width 0.12) (tstamp 83aeead6-c04f-4f61-9dc1-08cad4116066))
-    (fp_line (start -1.5 -3.4) (end 1.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp 8bf37a13-e175-4246-a4f0-4ab526c58c2e))
-    (fp_line (start 9 2.25) (end 9 -2.05) (layer "F.SilkS") (width 0.12) (tstamp 8c64c50b-8acd-44f2-8c5f-ba9201a3c7bd))
-    (fp_line (start 5 2.25) (end 4.25 2.25) (layer "F.SilkS") (width 0.12) (tstamp 8c8154c7-2b7b-44e1-8694-dfe76312b3d9))
-    (fp_line (start 1.25 -2.4) (end 0.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp 9e477ee6-ad97-4cd4-b02b-4729979c40e2))
-    (fp_line (start 11.25 -2.05) (end 12 -2.05) (layer "F.SilkS") (width 0.12) (tstamp a23e3eb7-dcb3-4b09-a1b0-ba2cb214f0a5))
-    (fp_line (start 8.25 -2.4) (end 7.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp a2abc84b-8987-4a83-b329-dceb6c04fe7c))
-    (fp_line (start -0.75 -2.05) (end -0.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp a7e7a44c-68d8-4576-a798-ee1db6824dc3))
-    (fp_line (start 5 -2.05) (end 5 2.25) (layer "F.SilkS") (width 0.12) (tstamp abb284d1-6005-460a-b044-acdfa77fc3f5))
-    (fp_line (start 4.25 -2.4) (end 4.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp ae1dcbf9-6071-40f9-ab17-78192e75b9a1))
-    (fp_line (start -1.25 -2.4) (end -1.5 -3.4) (layer "F.SilkS") (width 0.12) (tstamp ae923668-2cb7-47ea-99c5-b6a079045296))
-    (fp_line (start 12 -2.05) (end 12 2.25) (layer "F.SilkS") (width 0.12) (tstamp b3a5f2e6-3207-4af3-89e3-6d0fa469246e))
-    (fp_line (start 2 -2.05) (end 2.75 -2.05) (layer "F.SilkS") (width 0.12) (tstamp b401eca2-204c-47b0-a6cc-cbd09a8de2ad))
-    (fp_line (start 11.25 -2.4) (end 11.25 -2.05) (layer "F.SilkS") (width 0.12) (tstamp b589a08d-5a8e-4bb2-90d4-ef5270d09c90))
-    (fp_line (start 2.75 -2.4) (end 2.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp c47a7547-e6f0-4cd8-b807-5ca888e9c3ce))
-    (fp_line (start 9.75 -2.4) (end 9.25 -2.4) (layer "F.SilkS") (width 0.12) (tstamp cc96e2af-7657-4ad3-b12e-a025de438a67))
-    (fp_line (start 5 -3.4) (end 4.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp cd82725d-cd4e-4b86-b196-accebbf4a913))
-    (fp_line (start 9.75 -2.05) (end 9.75 -2.4) (layer "F.SilkS") (width 0.12) (tstamp d7fda904-08f2-46d0-8e07-896b262d7e46))
-    (fp_line (start 6.25 2.25) (end 5.5 2.25) (layer "F.SilkS") (width 0.12) (tstamp e2bf3c5a-b014-4f85-8305-86de33fb2476))
-    (fp_line (start 9 -3.4) (end 12 -3.4) (layer "F.SilkS") (width 0.12) (tstamp e9f6f543-7ec8-488b-9aca-e6a196514d16))
-    (fp_line (start 13.06 -4.36) (end -2.56 -4.36) (layer "F.SilkS") (width 0.12) (tstamp eb2337fd-ed0c-4c82-a320-4407e6ace0bd))
-    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.SilkS") (width 0.12) (tstamp ed095ff3-b1af-4001-bf59-d68ad7ef3289))
-    (fp_line (start 9.75 2.25) (end 9 2.25) (layer "F.SilkS") (width 0.12) (tstamp fa37a123-2087-449f-b3d4-b734192c4b4e))
-    (fp_line (start 8.5 2.25) (end 7.75 2.25) (layer "F.SilkS") (width 0.12) (tstamp fec34bd8-21b5-4daa-be59-cc1bb53df336))
-    (fp_arc (start 6.25 2.25) (mid 6.999807 2.09191) (end 7.749647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 194e61d5-d73f-45e1-86ab-95585456b360))
-    (fp_arc (start 2.75 2.25) (mid 3.499807 2.09191) (end 4.249647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 262f677a-322e-4b8f-8c30-977fdf9e837a))
-    (fp_arc (start 9.75 2.25) (mid 10.499807 2.09191) (end 11.249647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp 485f2f0b-adc4-4fd0-914c-e6cdebf32b20))
-    (fp_arc (start -0.75 2.25) (mid -0.000193 2.09191) (end 0.749647 2.249844) (layer "F.SilkS") (width 0.12) (tstamp d07c9852-1fa4-40ca-9b3a-45379faf2beb))
-    (fp_line (start -2.95 -4.75) (end -2.95 3.5) (layer "F.CrtYd") (width 0.05) (tstamp 15a65612-f6a1-48be-8425-8f5afb06c4fd))
-    (fp_line (start 13.45 -4.75) (end -2.95 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp 9f2913ee-f300-41d4-9b7a-339ae5970c4d))
-    (fp_line (start -2.95 3.5) (end 13.45 3.5) (layer "F.CrtYd") (width 0.05) (tstamp c464ac67-d07b-4878-905a-ea6f8d27cd1e))
-    (fp_line (start 13.45 3.5) (end 13.45 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp f4a6f22f-2296-4e86-8dc7-ba0df5bfb77c))
-    (fp_line (start -2.45 -4.25) (end -2.45 3) (layer "F.Fab") (width 0.1) (tstamp 534d87c1-bf1e-4965-ad11-3e2aa081e8e8))
-    (fp_line (start 12.95 -4.25) (end -2.45 -4.25) (layer "F.Fab") (width 0.1) (tstamp 549455c3-ab6e-454e-94b0-5ca9e521ae0b))
-    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.Fab") (width 0.1) (tstamp 6b74ce51-0851-44d9-ba35-f631aa075f73))
-    (fp_line (start 12.95 3) (end 12.95 -4.25) (layer "F.Fab") (width 0.1) (tstamp c6821f6d-ae1c-499e-ad7d-74e9a034a4b5))
-    (fp_line (start -2.45 3) (end 12.95 3) (layer "F.Fab") (width 0.1) (tstamp c7bd964e-6063-4802-85ea-2a5dd3fba324))
-    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.Fab") (width 0.1) (tstamp d0bf1a00-cfe8-4773-a4cd-b6dcc139ab1d))
-    (pad "1" thru_hole roundrect locked (at 0 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask) (roundrect_rratio 0.1388888889)
-      (net 1 "/NET1") (pinfunction "CM") (pintype "passive") (tstamp 11af36ff-3959-41d6-86f2-35df83d416be))
-    (pad "2" thru_hole oval locked (at 3.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 2 "unconnected-(SW101-Pad2)") (pinfunction "D0") (pintype "passive+no_connect") (tstamp 95367dce-7348-4e46-8b79-617f0b078986))
-    (pad "3" thru_hole oval locked (at 7 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 3 "unconnected-(SW101-Pad3)") (pinfunction "D1") (pintype "passive+no_connect") (tstamp 11e65687-dee5-42e2-a938-d539a0761571))
-    (pad "4" thru_hole oval locked (at 10.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
-      (net 4 "/HIER_LABEL") (pinfunction "D2") (pintype "passive") (tstamp 9eacd685-19fc-4714-9d5a-cb390df54aea))
-    (model "${KICAD6_3DMODEL_DIR}/Connector_Phoenix_MC.3dshapes/PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical.wrl"
-      (offset (xyz 0 0 0))
-      (scale (xyz 1 1 1))
-      (rotate (xyz 0 0 0))
-    )
-  )
-
-  (footprint "Button_Switch_THT:KSA_Tactile_SPST" (layer "F.Cu")
-    (tedit 5A02FE31) (tstamp ed271cf0-3644-46cb-8a42-a46a5167bf3a)
-    (at 89.525 96.075)
-    (descr "KSA http://www.ckswitches.com/media/1457/ksa_ksl.pdf")
-    (tags "SWITCH SMD KSA SW")
-    (attr through_hole)
-    (fp_text reference "REF**" (at 2.54 -2) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp a12511d6-4c71-4b67-a69e-bd467835661b)
-    )
-    (fp_text value "KSA_Tactile_SPST" (at 2.54 10) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 53f096c1-b7f7-4874-85c3-924e94be286f)
-    )
-    (fp_text user "${REFERENCE}" (at 2.54 4) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 6b964f6c-f00c-401e-8610-6bad4637fe5c)
-    )
-    (fp_line (start 6.35 8.89) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (tstamp 1b5dc09e-ca2b-4554-ac89-aae722507997))
-    (fp_line (start -1.27 -1.27) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (tstamp 3214ed34-563c-460f-89e6-d8867c1cc4d2))
-    (fp_line (start -1.27 -1.27) (end -1.27 8.89) (layer "F.SilkS") (width 0.12) (tstamp 3de0b227-472e-4982-9629-f04af83c07a9))
-    (fp_line (start -1.27 8.89) (end 6.35 8.89) (layer "F.SilkS") (width 0.12) (tstamp 88343d9a-29c0-4487-b63e-ec337e903e90))
-    (fp_circle (center 2.54 3.81) (end 0.54 3.81) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 9cf6862a-c0fd-40f3-a4fa-9e9556bb2763))
-    (fp_line (start 6.49 8.75) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (tstamp 1c5ec7dc-5f51-4802-a669-cad436b66b04))
-    (fp_line (start -1.41 -1.14) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (tstamp 924f5213-afbb-4698-8672-719373011a99))
-    (fp_line (start -1.41 -1.14) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (tstamp 9859c259-3292-45a3-af2d-b6599b20ac97))
-    (fp_line (start 6.49 8.75) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (tstamp c08fbfd3-8364-4a63-b1e9-c40a8e38215b))
-    (fp_line (start -1.16 7.91) (end 6.24 7.91) (layer "F.Fab") (width 0.1) (tstamp 3e56d9ee-e4f1-41fc-9d6a-2d6e6e8ad807))
-    (fp_line (start -1.16 7.91) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (tstamp 572d3c99-e59e-4806-82c8-859558b9b13b))
-    (fp_line (start 6.24 -0.29) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (tstamp 5c709334-45d7-4554-9230-9b41117caa33))
-    (fp_line (start 6.24 7.91) (end 6.24 -0.29) (layer "F.Fab") (width 0.1) (tstamp e930be25-e735-4d31-9a6c-7edf2422df64))
-    (pad "1" thru_hole circle locked (at 0 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp a651f5b0-a0e4-4740-98e6-9187d16156f9))
-    (pad "2" thru_hole circle locked (at 5.08 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 8ca2c50b-bf3a-438b-a227-f2ee9e498fd9))
-    (pad "3" thru_hole circle locked (at 5.08 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp c1291491-bcea-4574-b726-596afcbff93e))
-    (pad "4" thru_hole circle locked (at 2.54 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 676ccbc4-b247-4ed4-9cf8-54a2b7e7576a))
-    (pad "5" thru_hole circle locked (at 0 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (tstamp 91f2b286-8ad5-4def-9631-08c498eb7cb7))
-    (model "${KICAD6_3DMODEL_DIR}/Button_Switch_THT.3dshapes/KSA_Tactile_SPST.wrl"
-      (offset (xyz 0 0 0))
-      (scale (xyz 1 1 1))
-      (rotate (xyz 0 0 0))
-    )
-  )
-
-  (gr_rect locked (start 147.025 116.75) (end 157.925 105.85) (layer "F.Cu") (width 0.2) (fill none) (tstamp 18f33c15-2d89-4304-9c8f-98c3582bdb83))
-  (gr_poly locked
-    (pts
-      (xy 188.4 119.05)
-      (xy 182.7 119.05)
-      (xy 182.7 110.8)
-      (xy 188.4 105.1)
-    ) (layer "F.Cu") (width 0.2) (fill solid) (tstamp 4255abab-787c-46e3-9144-7ad5270c0729))
-  (gr_circle locked (center 168.8 112.075) (end 174.025 106.85) (layer "F.Cu") (width 0.2) (fill none) (tstamp 84c6ade4-472b-49ab-bf5d-7989d8cac908))
-  (gr_arc (start 103.852782 112.425) (mid 108.738891 110.401107) (end 113.625 112.425) (layer "F.Cu") (width 0.2) (tstamp b1ddb058-f7b2-429c-9489-f4e2242ad7e5))
-  (gr_text "buried via" (at 156.875 98.25) (layer "Eco1.User") (tstamp 49dcd1b7-f635-4f5a-8a01-f8c834a847dc)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "seg. locked" (at 143.9 92.95) (layer "Eco1.User") (tstamp 65f11e1d-190b-4074-a639-471d7ae0fbd9)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify left))
-  )
-  (gr_text "via" (at 156.8 95.85) (layer "Eco1.User") (tstamp aaedf2ea-4032-4703-9274-9907b7dc3e85)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "micro via" (at 156.975 100.075) (layer "Eco1.User") (tstamp cea17333-7d14-4b4f-a096-7d6db0e55544)
-    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
-  )
-  (gr_text "segment" (at 152.3 90.25) (layer "Eco1.User") (tstamp e8055a1b-b857-489c-a9c9-cfccd187e14d)
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 00c745e6-aece-4592-bb45-863e0c3493e6)
-    (pts (xy 195.53876 71.610323) (xy 222.33876 63.010323))
-    (height -2.473234)
-    (gr_text "28,1460 mm" (at 207.831685 63.860365 17.79120311) (layer "Dwgs.User") (tstamp 00c745e6-aece-4592-bb45-863e0c3493e6)
-      (effects (font (size 1 1) (thickness 0.15) italic))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
-    (pts (xy 193.33876 65.060323) (xy 220.13876 56.460323))
-    (height -2.267462)
-    (gr_text "28,1460 mm" (at 205.694558 57.506296 17.79120311) (layer "Dwgs.User") (tstamp 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
-      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 5841a60a-7434-4694-9b2f-60c2321b8bd0)
-    (pts (xy 199.6 87.1) (xy 226.4 78.5))
-    (height -11.090722)
-    (gr_text "28,1460 mm" (at 209.259859 71.144674 17.79120311) (layer "Dwgs.User") (tstamp 5841a60a-7434-4694-9b2f-60c2321b8bd0)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
-    (pts (xy 194.38876 68.410323) (xy 221.18876 59.810323))
-    (height -2.69421)
-    (gr_text "28,1460 mm" (at 206.614166 60.449957 17.79120311) (layer "Dwgs.User") (tstamp 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
-      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
-    (pts (xy 217.835151 147.360714) (xy 198.185151 127.360714))
-    (height -11.684997)
-    (gr_text "pre\"fix\"hello i \"am overwritten\" mmsuf\"fix\"" (at 200.495319 144.744037 -45.50575037) (layer "Dwgs.User") (tstamp bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) (override_value "hello i \"am overwritten\"") suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp d13f6c50-ce8f-484d-9604-839a4d68748d)
-    (pts (xy 231.035151 118.060714) (xy 211.385151 98.060714))
-    (height -11.684997)
-    (gr_text "28,0379 mm" (at 213.695319 115.444037 -45.50575037) (layer "Dwgs.User") (tstamp d13f6c50-ce8f-484d-9604-839a4d68748d)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4) suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp de180ffc-3a6e-4a65-ab2c-90a4360b215c)
-    (pts (xy 228.685151 136.360714) (xy 209.035151 116.360714))
-    (height -11.684997)
-    (gr_text "pre\"fix\"28,0379 mmsuf\"fix\"" (at 211.345319 133.744037 -45.50575037) (layer "Dwgs.User") (tstamp de180ffc-3a6e-4a65-ab2c-90a4360b215c)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) suppress_zeroes)
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type aligned) (layer "Dwgs.User") (tstamp ff870511-3a90-49f1-9990-5aec7ad35822)
-    (pts (xy 235.75 99.75) (xy 216.1 79.75))
-    (height -11.684997)
-    (gr_text "28,0379 mm" (at 218.410168 97.133323 -45.50575037) (layer "Dwgs.User") (tstamp ff870511-3a90-49f1-9990-5aec7ad35822)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
-    (pts (xy 236.05 90.15) (xy 242.9 84.25))
-    (gr_text "hello i am a test" (at 249.1 90.45) (layer "Dwgs.User") (tstamp 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
-    (pts (xy 235.015611 93.021751) (xy 226 92.35))
-    (gr_text "hello i am a test \"quoted\"" (at 226 83.581876 135) (layer "Dwgs.User") (tstamp 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\""))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
-    (pts (xy 251.15 120.15) (xy 258 114.25))
-    (gr_text "hello i am a test" (at 264.2 120.45) (layer "Dwgs.User") (tstamp 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 2) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 8006915c-347c-427e-8da6-50ddf24e6b51)
-    (pts (xy 247.65 130.55) (xy 254.5 124.65))
-    (gr_text "hello i am a test" (at 260.7 130.85) (layer "Dwgs.User") (tstamp 8006915c-347c-427e-8da6-50ddf24e6b51)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 1) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp 84c59850-a617-4b8e-9935-4a3c13fa674f)
-    (pts (xy 239.9 93.1) (xy 245.8 99.949999))
-    (gr_text "hello i am a test \"quoted\" cursive" (at 239.6 106.149999 270) (layer "Dwgs.User") (tstamp 84c59850-a617-4b8e-9935-4a3c13fa674f)
-      (effects (font (size 1 1) (thickness 0.15) italic))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
-    (pts (xy 174.65 117.55) (xy 180.55 124.399999))
-    (gr_text "hello i am a test \"quoted\" mirrored" (at 174.35 130.599999 270) (layer "Dwgs.User") (tstamp a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
-      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" mirrored"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type leader) (layer "Dwgs.User") (tstamp b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
-    (pts (xy 138.35 115.8) (xy 131.500001 121.7))
-    (gr_text "hello i am a test \"quoted\" cursive mirrored" (at 125.300001 115.5 180) (layer "Dwgs.User") (tstamp b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
-      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
-    )
-    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive mirrored"))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
-  )
-  (dimension (type center) (layer "Dwgs.User") (tstamp 61c5e7b9-ec75-459b-8f55-aa6dcdc47663)
-    (pts (xy 236.2 90.2) (xy 243.2 90.2))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type center) (layer "Dwgs.User") (tstamp cc6d04c1-5e89-4a69-8589-2307dd2129a4)
-    (pts (xy 261.6 91.35) (xy 272 80.95))
-    (style (thickness 0.5) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 01eecbde-a293-4e72-9ab7-4a5a43218203)
-    (pts (xy 253.85 51.5) (xy 279.85 52.35))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 264.1 50.4) (layer "Dwgs.User") (tstamp 01eecbde-a293-4e72-9ab7-4a5a43218203)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 2) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 030f7528-01d8-4f5d-b375-396511a3f702)
-    (pts (xy 226.4 78) (xy 252.4 78.85))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "26,0000 mm" (at 239.4 68.45) (layer "Dwgs.User") (tstamp 030f7528-01d8-4f5d-b375-396511a3f702)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 3) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 03748331-c066-4d57-aa54-2f8ca06e3f46)
-    (pts (xy 253.55 76.05) (xy 279.55 76.9))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.0 mm" (at 266.55 73.75) (layer "Dwgs.User") (tstamp 03748331-c066-4d57-aa54-2f8ca06e3f46)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 1))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
-    (pts (xy 253.5 48.95) (xy 279.5 49.8))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.5 46.65) (layer "Dwgs.User") (tstamp 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
-      (effects (font (size 1 1) (thickness 0.15)) (justify left))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
-    (pts (xy 253.55 61.25) (xy 279.55 62.1))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26" (at 266.55 58.95) (layer "Dwgs.User") (tstamp 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 0) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 30508594-c6b7-4560-96ac-05f6655ba783)
-    (pts (xy 253.55 45.95) (xy 279.55 46.8))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 43.65) (layer "Dwgs.User") (tstamp 30508594-c6b7-4560-96ac-05f6655ba783)
-      (effects (font (size 1 1) (thickness 0.15)) (justify right))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 3f6d185e-f550-440a-899d-361dc95bf216)
-    (pts (xy 253.55 68.75) (xy 279.55 69.6))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.0000 mm" (at 266.55 66.45) (layer "Dwgs.User") (tstamp 3f6d185e-f550-440a-899d-361dc95bf216)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 60bfe360-791c-4b4d-8701-dc29f0022c68)
-    (pts (xy 253.55 58) (xy 279.55 58.85))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 (mm)" (at 266.55 55.7) (layer "Dwgs.User") (tstamp 60bfe360-791c-4b4d-8701-dc29f0022c68)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 2) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 617f513f-16c9-4ee5-8499-a80fee4befb0)
-    (pts (xy 226.6 49.6) (xy 252.6 50.45))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "1.0236 in" (at 239.6 40.05) (layer "Dwgs.User") (tstamp 617f513f-16c9-4ee5-8499-a80fee4befb0)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 0) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 8e806abb-0abf-436e-9eb2-accf0328e785)
-    (pts (xy 253.55 54.55) (xy 279.55 55.4))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 53.4) (layer "Dwgs.User") (tstamp 8e806abb-0abf-436e-9eb2-accf0328e785)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 1) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 96e02d72-1a83-4ed2-a755-b81e76c5893f)
-    (pts (xy 253.55 71.25) (xy 279.55 72.1))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.000 mm" (at 266.55 68.95) (layer "Dwgs.User") (tstamp 96e02d72-1a83-4ed2-a755-b81e76c5893f)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 3))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
-    (pts (xy 253.55 73.65) (xy 279.55 74.5))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.00 mm" (at 266.55 71.35) (layer "Dwgs.User") (tstamp 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 2))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp a53fb125-0a87-4020-929f-425458b00a06)
-    (pts (xy 226.45 58.95) (xy 252.45 59.8))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "1023.6220 mils" (at 239.45 49.4) (layer "Dwgs.User") (tstamp a53fb125-0a87-4020-929f-425458b00a06)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 1) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp e5614058-70e1-453c-9f71-7593e14c6cda)
-    (pts (xy 253.55 66.2) (xy 279.55 67.05))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26.00000 mm" (at 266.55 63.9) (layer "Dwgs.User") (tstamp e5614058-70e1-453c-9f71-7593e14c6cda)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 5))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
-    (pts (xy 226.4 68.15) (xy 252.4 69))
-    (height -8.4)
-    (orientation 0)
-    (gr_text "26.0000 mm" (at 239.4 58.6) (layer "Dwgs.User") (tstamp e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 4))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (dimension (type orthogonal) (layer "Dwgs.User") (tstamp ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
-    (pts (xy 253.55 78.35) (xy 279.55 79.2))
-    (height -1.15)
-    (orientation 0)
-    (gr_text "26 mm" (at 266.55 76.05) (layer "Dwgs.User") (tstamp ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
-      (effects (font (size 1 1) (thickness 0.15)))
-    )
-    (format (units 2) (units_format 1) (precision 0))
-    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
-  )
-  (target plus (at 185.8 93.35) (size 5) (width 0.1) (layer "Edge.Cuts") (tstamp 3bf82ecb-0898-4a14-bef0-d88c4f838b87))
-  (target x (at 187.95 98.8) (size 4) (width 1) (layer "Edge.Cuts") (tstamp 47941cd1-b5c0-40bd-bc68-af434db15455))
-
-  (segment (start 124.6875 110.7875) (end 125.9625 109.5125) (width 0.25) (layer "F.Cu") (net 0) (tstamp 504cb9e4-5572-4208-bc9d-30a7efff8b9a))
-  (segment (start 159.025 90.4) (end 165.575 90.4) (width 0.25) (layer "F.Cu") (net 0) (tstamp 50bf00c7-c69d-47e9-8d7f-002d8001f5dd))
-  (segment (start 125.9625 109.5125) (end 125.9625 102.4125) (width 0.25) (layer "F.Cu") (net 0) (tstamp a6187c22-3622-4a1a-a49a-b21e96986f96))
-  (segment locked (start 159.175 92.975) (end 165.725 92.975) (width 0.25) (layer "F.Cu") (net 0) (tstamp c5a64cb0-571c-4101-abb8-a1e8072455d4))
-  (segment (start 119.9625 110.7875) (end 124.6875 110.7875) (width 0.25) (layer "F.Cu") (net 0) (tstamp e1df8cea-32a4-457d-86df-d8e326022a52))
-  (segment (start 125.9625 102.4125) (end 119.6875 96.1375) (width 0.25) (layer "F.Cu") (net 0) (tstamp fda94f0a-876e-4bf0-ad10-35819851e3e9))
-  (via (at 132.5125 111.2125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 061b0977-703d-47fc-ba64-d6fb3f8737c3))
-  (via blind (at 172 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 0b395f32-97e7-46c6-81cd-8e3bc4675bce))
-  (via micro (at 169.3 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 395a31c4-0d27-409b-a4a6-ae65750e20db))
-  (via locked (at 163.125 95.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 3b1a1b76-9d29-4248-9ac9-c210fdba845b))
-  (via (at 159.925 95.775) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 3e210438-9173-4d97-83d2-94157dc53997))
-  (via micro (at 160.1 100) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 4c281a99-3a6b-44dc-8cbd-1a650e634550))
-  (via micro (at 163.3 100.025) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 502d494e-96a1-40b8-8acf-8ae38ec1c400))
-  (via (at 171.925 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 7589d575-3c60-4338-8ad2-67381d8dbc00))
-  (via blind (at 163.2 98.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 77fe0dab-427e-435f-9eed-6fa58fe5cee1))
-  (via blind (at 166.275 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 79a898f8-ad5e-4dbc-aa10-5d83271b9b43))
-  (via blind (at 169.2 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp 8c872ef3-cd1d-4b0d-96d3-51a74e92ff52))
-  (via blind (at 160 98.175) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (tstamp 954cb567-fc2b-4b8d-918a-46eb7b1f43e2))
-  (via micro (at 172.1 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp afce51bc-694a-4ac0-b46f-9657eb6057d8))
-  (via blind locked (at 128.4375 106.0125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp b2cac11a-5f3b-43d7-88e5-8d0241ac6453))
-  (via locked (at 174.6 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp ba1f567b-429c-4539-9500-750f9f41e977))
-  (via blind (at 174.675 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp c02cbdff-6228-4696-9621-0c9f24504b5a))
-  (via locked (at 169.125 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp c5dbc2f4-347d-4e8b-9dc5-05ae6c8ee4e9))
-  (via micro (at 166.375 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp ed159ec6-8461-40d0-99dc-879cac3b491e))
-  (via (at 166.2 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp f5a28a1a-7f56-478a-aad0-76861dd7b0e0))
-  (via micro (at 174.775 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (tstamp f90de4aa-337a-492e-a29b-d742cf541973))
-  (via micro (at 127.5625 98.8875) (size 0.8) (drill 0.4) (layers "In1.Cu" "B.Cu") (free) (net 0) (tstamp 557d128f-cf69-4c70-9959-d139ac95c63c))
-  (segment (start 129.6375 99.8625) (end 129.6375 107.5125) (width 0.25) (layer "F.Cu") (net 4) (tstamp 58588507-da7d-4bcc-b9cd-bfc861c19ac1))
-  (segment (start 114.0875 101.8875) (end 114.0875 95.7625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 6586c7bc-7012-4335-b0bd-43918f23a8fd))
-  (segment (start 116.2875 93.5625) (end 123.3375 93.5625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 71ae16fb-a509-4131-a92e-a0b0b25743ff))
-  (segment (start 114.0875 95.7625) (end 116.2875 93.5625) (width 0.25) (layer "F.Cu") (net 4) (tstamp 93bf1c04-96c6-49e8-9a85-ee6cc4606fcb))
-  (segment (start 123.3375 93.5625) (end 129.6375 99.8625) (width 0.25) (layer "F.Cu") (net 4) (tstamp f07599c7-599f-45fe-bd1e-15999cff5f04))
-
-  (zone locked (net 4) (net_name "/HIER_LABEL") (layers "F.Cu" "In18.Cu" "In21.Cu") (tstamp 001057ce-186a-458c-93e5-a6d8479d28a0) (name "test") (hatch full 0.508)
-    (priority 2)
-    (connect_pads (clearance 0.508))
-    (min_thickness 0.254) (filled_areas_thickness no)
-    (fill yes (mode hatch) (thermal_gap 0.508) (thermal_bridge_width 0.508) (smoothing chamfer) (island_removal_mode 2) (island_area_min 1)
-      (hatch_thickness 1.016) (hatch_gap 1.524) (hatch_orientation 0)
-      (hatch_smoothing_level 1) (hatch_smoothing_value 0.1)
-      (hatch_border_algorithm hatch_thickness) (hatch_min_hole_area 0.3))
-    (polygon
-      (pts
-        (xy 170.375 133)
-        (xy 155.55 133)
-        (xy 155.55 130)
-        (xy 146.425 130)
-        (xy 156.9 119.525)
-      )
-    )
-    (filled_polygon
-      (layer "F.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 156.94919 131.3858)
-        (xy 157.07858 131.51519)
-        (xy 158.3458 131.51519)
-        (xy 158.47519 131.3858)
-        (xy 159.48919 131.3858)
-        (xy 159.61858 131.51519)
-        (xy 160.8858 131.51519)
-        (xy 161.01519 131.3858)
-        (xy 162.02919 131.3858)
-        (xy 162.15858 131.51519)
-        (xy 163.4258 131.51519)
-        (xy 163.55519 131.3858)
-        (xy 164.56919 131.3858)
-        (xy 164.69858 131.51519)
-        (xy 165.9658 131.51519)
-        (xy 166.09519 131.3858)
-        (xy 166.09519 130.33522)
-        (xy 165.74916 129.98919)
-        (xy 164.69858 129.98919)
-        (xy 164.56919 130.11858)
-        (xy 164.56919 131.3858)
-        (xy 163.55519 131.3858)
-        (xy 163.55519 130.11858)
-        (xy 163.4258 129.98919)
-        (xy 162.15858 129.98919)
-        (xy 162.02919 130.11858)
-        (xy 162.02919 131.3858)
-        (xy 161.01519 131.3858)
-        (xy 161.01519 130.11858)
-        (xy 160.8858 129.98919)
-        (xy 159.61858 129.98919)
-        (xy 159.48919 130.11858)
-        (xy 159.48919 131.3858)
-        (xy 158.47519 131.3858)
-        (xy 158.47519 130.11858)
-        (xy 158.3458 129.98919)
-        (xy 157.07858 129.98919)
-        (xy 156.94919 130.11858)
-        (xy 156.94919 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 151.67719 130)
-        (xy 151.609069 129.979998)
-        (xy 151.588095 129.963095)
-        (xy 150.43518 128.81018)
-        (xy 151.86919 128.81018)
-        (xy 151.91701 128.858)
-        (xy 153.38299 128.858)
-        (xy 153.39519 128.8458)
-        (xy 154.40919 128.8458)
-        (xy 154.42139 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.863166 128.917824)
-        (xy 155.93519 128.8458)
-        (xy 156.94919 128.8458)
-        (xy 157.07858 128.97519)
-        (xy 158.3458 128.97519)
-        (xy 158.47519 128.8458)
-        (xy 159.48919 128.8458)
-        (xy 159.61858 128.97519)
-        (xy 160.8858 128.97519)
-        (xy 161.01519 128.8458)
-        (xy 162.02919 128.8458)
-        (xy 162.15858 128.97519)
-        (xy 163.4258 128.97519)
-        (xy 163.55519 128.8458)
-        (xy 163.55519 127.79522)
-        (xy 163.20916 127.44919)
-        (xy 162.15858 127.44919)
-        (xy 162.02919 127.57858)
-        (xy 162.02919 128.8458)
-        (xy 161.01519 128.8458)
-        (xy 161.01519 127.57858)
-        (xy 160.8858 127.44919)
-        (xy 159.61858 127.44919)
-        (xy 159.48919 127.57858)
-        (xy 159.48919 128.8458)
-        (xy 158.47519 128.8458)
-        (xy 158.47519 127.57858)
-        (xy 158.3458 127.44919)
-        (xy 157.07858 127.44919)
-        (xy 156.94919 127.57858)
-        (xy 156.94919 128.8458)
-        (xy 155.93519 128.8458)
-        (xy 155.93519 127.57858)
-        (xy 155.8058 127.44919)
-        (xy 154.53858 127.44919)
-        (xy 154.40919 127.57858)
-        (xy 154.40919 128.8458)
-        (xy 153.39519 128.8458)
-        (xy 153.39519 127.57858)
-        (xy 153.2658 127.44919)
-        (xy 151.99858 127.44919)
-        (xy 151.86919 127.57858)
-        (xy 151.86919 128.81018)
-        (xy 150.43518 128.81018)
-        (xy 149.114095 127.489095)
-        (xy 149.080069 127.426783)
-        (xy 149.085134 127.355968)
-        (xy 149.114095 127.310905)
-        (xy 150.1192 126.3058)
-        (xy 151.86919 126.3058)
-        (xy 151.99858 126.43519)
-        (xy 153.2658 126.43519)
-        (xy 153.39519 126.3058)
-        (xy 154.40919 126.3058)
-        (xy 154.53858 126.43519)
-        (xy 155.8058 126.43519)
-        (xy 155.93519 126.3058)
-        (xy 156.94919 126.3058)
-        (xy 157.07858 126.43519)
-        (xy 158.3458 126.43519)
-        (xy 158.47519 126.3058)
-        (xy 159.48919 126.3058)
-        (xy 159.61858 126.43519)
-        (xy 160.8858 126.43519)
-        (xy 161.01519 126.3058)
-        (xy 161.01519 125.25522)
-        (xy 160.66916 124.90919)
-        (xy 159.61858 124.90919)
-        (xy 159.48919 125.03858)
-        (xy 159.48919 126.3058)
-        (xy 158.47519 126.3058)
-        (xy 158.47519 125.03858)
-        (xy 158.3458 124.90919)
-        (xy 157.07858 124.90919)
-        (xy 156.94919 125.03858)
-        (xy 156.94919 126.3058)
-        (xy 155.93519 126.3058)
-        (xy 155.93519 125.03858)
-        (xy 155.8058 124.90919)
-        (xy 154.53858 124.90919)
-        (xy 154.40919 125.03858)
-        (xy 154.40919 126.3058)
-        (xy 153.39519 126.3058)
-        (xy 153.39519 125.03858)
-        (xy 153.2658 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.86919 126.17084)
-        (xy 151.86919 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.40919 123.7658)
-        (xy 154.53858 123.89519)
-        (xy 155.8058 123.89519)
-        (xy 155.93519 123.7658)
-        (xy 156.94919 123.7658)
-        (xy 157.07858 123.89519)
-        (xy 158.3458 123.89519)
-        (xy 158.47519 123.7658)
-        (xy 158.47519 122.71522)
-        (xy 158.12916 122.36919)
-        (xy 157.07858 122.36919)
-        (xy 156.94919 122.49858)
-        (xy 156.94919 123.7658)
-        (xy 155.93519 123.7658)
-        (xy 155.93519 122.49858)
-        (xy 155.8058 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.40919 123.63084)
-        (xy 154.40919 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-    (filled_polygon
-      (layer "In18.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 157.01519 131.3858)
-        (xy 157.14458 131.51519)
-        (xy 158.4118 131.51519)
-        (xy 158.54119 131.3858)
-        (xy 159.55519 131.3858)
-        (xy 159.68458 131.51519)
-        (xy 160.9518 131.51519)
-        (xy 161.08119 131.3858)
-        (xy 162.09519 131.3858)
-        (xy 162.22458 131.51519)
-        (xy 163.4918 131.51519)
-        (xy 163.62119 131.3858)
-        (xy 164.63519 131.3858)
-        (xy 164.76458 131.51519)
-        (xy 166.0318 131.51519)
-        (xy 166.16119 131.3858)
-        (xy 166.16119 130.40122)
-        (xy 165.74916 129.98919)
-        (xy 164.76458 129.98919)
-        (xy 164.63519 130.11858)
-        (xy 164.63519 131.3858)
-        (xy 163.62119 131.3858)
-        (xy 163.62119 130.11858)
-        (xy 163.4918 129.98919)
-        (xy 162.22458 129.98919)
-        (xy 162.09519 130.11858)
-        (xy 162.09519 131.3858)
-        (xy 161.08119 131.3858)
-        (xy 161.08119 130.11858)
-        (xy 160.9518 129.98919)
-        (xy 159.68458 129.98919)
-        (xy 159.55519 130.11858)
-        (xy 159.55519 131.3858)
-        (xy 158.54119 131.3858)
-        (xy 158.54119 130.11858)
-        (xy 158.4118 129.98919)
-        (xy 157.14458 129.98919)
-        (xy 157.01519 130.11858)
-        (xy 157.01519 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 146.72919 130)
-        (xy 146.661069 129.979998)
-        (xy 146.614576 129.926342)
-        (xy 146.604472 129.856068)
-        (xy 146.633966 129.791488)
-        (xy 146.640095 129.784905)
-        (xy 147.5792 128.8458)
-        (xy 149.39519 128.8458)
-        (xy 149.40739 128.858)
-        (xy 150.90899 128.858)
-        (xy 150.92119 128.8458)
-        (xy 151.93519 128.8458)
-        (xy 151.94739 128.858)
-        (xy 153.44899 128.858)
-        (xy 153.46119 128.8458)
-        (xy 154.47519 128.8458)
-        (xy 154.48739 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.918216 128.928774)
-        (xy 156.00119 128.8458)
-        (xy 157.01519 128.8458)
-        (xy 157.14458 128.97519)
-        (xy 158.4118 128.97519)
-        (xy 158.54119 128.8458)
-        (xy 159.55519 128.8458)
-        (xy 159.68458 128.97519)
-        (xy 160.9518 128.97519)
-        (xy 161.08119 128.8458)
-        (xy 162.09519 128.8458)
-        (xy 162.22458 128.97519)
-        (xy 163.4918 128.97519)
-        (xy 163.62119 128.8458)
-        (xy 163.62119 127.86122)
-        (xy 163.20916 127.44919)
-        (xy 162.22458 127.44919)
-        (xy 162.09519 127.57858)
-        (xy 162.09519 128.8458)
-        (xy 161.08119 128.8458)
-        (xy 161.08119 127.57858)
-        (xy 160.9518 127.44919)
-        (xy 159.68458 127.44919)
-        (xy 159.55519 127.57858)
-        (xy 159.55519 128.8458)
-        (xy 158.54119 128.8458)
-        (xy 158.54119 127.57858)
-        (xy 158.4118 127.44919)
-        (xy 157.14458 127.44919)
-        (xy 157.01519 127.57858)
-        (xy 157.01519 128.8458)
-        (xy 156.00119 128.8458)
-        (xy 156.00119 127.57858)
-        (xy 155.8718 127.44919)
-        (xy 154.60458 127.44919)
-        (xy 154.47519 127.57858)
-        (xy 154.47519 128.8458)
-        (xy 153.46119 128.8458)
-        (xy 153.46119 127.57858)
-        (xy 153.3318 127.44919)
-        (xy 152.06458 127.44919)
-        (xy 151.93519 127.57858)
-        (xy 151.93519 128.8458)
-        (xy 150.92119 128.8458)
-        (xy 150.92119 127.57858)
-        (xy 150.7918 127.44919)
-        (xy 150.59084 127.44919)
-        (xy 149.39519 128.64484)
-        (xy 149.39519 128.8458)
-        (xy 147.5792 128.8458)
-        (xy 150.1192 126.3058)
-        (xy 151.93519 126.3058)
-        (xy 152.06458 126.43519)
-        (xy 153.3318 126.43519)
-        (xy 153.46119 126.3058)
-        (xy 154.47519 126.3058)
-        (xy 154.60458 126.43519)
-        (xy 155.8718 126.43519)
-        (xy 156.00119 126.3058)
-        (xy 157.01519 126.3058)
-        (xy 157.14458 126.43519)
-        (xy 158.4118 126.43519)
-        (xy 158.54119 126.3058)
-        (xy 159.55519 126.3058)
-        (xy 159.68458 126.43519)
-        (xy 160.9518 126.43519)
-        (xy 161.08119 126.3058)
-        (xy 161.08119 125.32122)
-        (xy 160.66916 124.90919)
-        (xy 159.68458 124.90919)
-        (xy 159.55519 125.03858)
-        (xy 159.55519 126.3058)
-        (xy 158.54119 126.3058)
-        (xy 158.54119 125.03858)
-        (xy 158.4118 124.90919)
-        (xy 157.14458 124.90919)
-        (xy 157.01519 125.03858)
-        (xy 157.01519 126.3058)
-        (xy 156.00119 126.3058)
-        (xy 156.00119 125.03858)
-        (xy 155.8718 124.90919)
-        (xy 154.60458 124.90919)
-        (xy 154.47519 125.03858)
-        (xy 154.47519 126.3058)
-        (xy 153.46119 126.3058)
-        (xy 153.46119 125.03858)
-        (xy 153.3318 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.93519 126.10484)
-        (xy 151.93519 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.47519 123.7658)
-        (xy 154.60458 123.89519)
-        (xy 155.8718 123.89519)
-        (xy 156.00119 123.7658)
-        (xy 157.01519 123.7658)
-        (xy 157.14458 123.89519)
-        (xy 158.4118 123.89519)
-        (xy 158.54119 123.7658)
-        (xy 158.54119 122.78122)
-        (xy 158.12916 122.36919)
-        (xy 157.14458 122.36919)
-        (xy 157.01519 122.49858)
-        (xy 157.01519 123.7658)
-        (xy 156.00119 123.7658)
-        (xy 156.00119 122.49858)
-        (xy 155.8718 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.47519 123.56484)
-        (xy 154.47519 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-    (filled_polygon
-      (layer "In21.Cu")
-      (island)
-      (pts
-        (xy 156.944032 119.585134)
-        (xy 156.989095 119.614095)
-        (xy 170.159905 132.784905)
-        (xy 170.193931 132.847217)
-        (xy 170.188866 132.918032)
-        (xy 170.146319 132.974868)
-        (xy 170.079799 132.999679)
-        (xy 170.07081 133)
-        (xy 155.676 133)
-        (xy 155.607879 132.979998)
-        (xy 155.561386 132.926342)
-        (xy 155.55 132.874)
-        (xy 155.55 131.3858)
-        (xy 157.01519 131.3858)
-        (xy 157.14458 131.51519)
-        (xy 158.4118 131.51519)
-        (xy 158.54119 131.3858)
-        (xy 159.55519 131.3858)
-        (xy 159.68458 131.51519)
-        (xy 160.9518 131.51519)
-        (xy 161.08119 131.3858)
-        (xy 162.09519 131.3858)
-        (xy 162.22458 131.51519)
-        (xy 163.4918 131.51519)
-        (xy 163.62119 131.3858)
-        (xy 164.63519 131.3858)
-        (xy 164.76458 131.51519)
-        (xy 166.0318 131.51519)
-        (xy 166.16119 131.3858)
-        (xy 166.16119 130.40122)
-        (xy 165.74916 129.98919)
-        (xy 164.76458 129.98919)
-        (xy 164.63519 130.11858)
-        (xy 164.63519 131.3858)
-        (xy 163.62119 131.3858)
-        (xy 163.62119 130.11858)
-        (xy 163.4918 129.98919)
-        (xy 162.22458 129.98919)
-        (xy 162.09519 130.11858)
-        (xy 162.09519 131.3858)
-        (xy 161.08119 131.3858)
-        (xy 161.08119 130.11858)
-        (xy 160.9518 129.98919)
-        (xy 159.68458 129.98919)
-        (xy 159.55519 130.11858)
-        (xy 159.55519 131.3858)
-        (xy 158.54119 131.3858)
-        (xy 158.54119 130.11858)
-        (xy 158.4118 129.98919)
-        (xy 157.14458 129.98919)
-        (xy 157.01519 130.11858)
-        (xy 157.01519 131.3858)
-        (xy 155.55 131.3858)
-        (xy 155.55 130)
-        (xy 146.72919 130)
-        (xy 146.661069 129.979998)
-        (xy 146.614576 129.926342)
-        (xy 146.604472 129.856068)
-        (xy 146.633966 129.791488)
-        (xy 146.640095 129.784905)
-        (xy 147.5792 128.8458)
-        (xy 149.39519 128.8458)
-        (xy 149.40739 128.858)
-        (xy 150.90899 128.858)
-        (xy 150.92119 128.8458)
-        (xy 151.93519 128.8458)
-        (xy 151.94739 128.858)
-        (xy 153.44899 128.858)
-        (xy 153.46119 128.8458)
-        (xy 154.47519 128.8458)
-        (xy 154.48739 128.858)
-        (xy 155.55 128.858)
-        (xy 155.574581 128.860421)
-        (xy 155.918216 128.928774)
-        (xy 156.00119 128.8458)
-        (xy 157.01519 128.8458)
-        (xy 157.14458 128.97519)
-        (xy 158.4118 128.97519)
-        (xy 158.54119 128.8458)
-        (xy 159.55519 128.8458)
-        (xy 159.68458 128.97519)
-        (xy 160.9518 128.97519)
-        (xy 161.08119 128.8458)
-        (xy 162.09519 128.8458)
-        (xy 162.22458 128.97519)
-        (xy 163.4918 128.97519)
-        (xy 163.62119 128.8458)
-        (xy 163.62119 127.86122)
-        (xy 163.20916 127.44919)
-        (xy 162.22458 127.44919)
-        (xy 162.09519 127.57858)
-        (xy 162.09519 128.8458)
-        (xy 161.08119 128.8458)
-        (xy 161.08119 127.57858)
-        (xy 160.9518 127.44919)
-        (xy 159.68458 127.44919)
-        (xy 159.55519 127.57858)
-        (xy 159.55519 128.8458)
-        (xy 158.54119 128.8458)
-        (xy 158.54119 127.57858)
-        (xy 158.4118 127.44919)
-        (xy 157.14458 127.44919)
-        (xy 157.01519 127.57858)
-        (xy 157.01519 128.8458)
-        (xy 156.00119 128.8458)
-        (xy 156.00119 127.57858)
-        (xy 155.8718 127.44919)
-        (xy 154.60458 127.44919)
-        (xy 154.47519 127.57858)
-        (xy 154.47519 128.8458)
-        (xy 153.46119 128.8458)
-        (xy 153.46119 127.57858)
-        (xy 153.3318 127.44919)
-        (xy 152.06458 127.44919)
-        (xy 151.93519 127.57858)
-        (xy 151.93519 128.8458)
-        (xy 150.92119 128.8458)
-        (xy 150.92119 127.57858)
-        (xy 150.7918 127.44919)
-        (xy 150.59084 127.44919)
-        (xy 149.39519 128.64484)
-        (xy 149.39519 128.8458)
-        (xy 147.5792 128.8458)
-        (xy 150.1192 126.3058)
-        (xy 151.93519 126.3058)
-        (xy 152.06458 126.43519)
-        (xy 153.3318 126.43519)
-        (xy 153.46119 126.3058)
-        (xy 154.47519 126.3058)
-        (xy 154.60458 126.43519)
-        (xy 155.8718 126.43519)
-        (xy 156.00119 126.3058)
-        (xy 157.01519 126.3058)
-        (xy 157.14458 126.43519)
-        (xy 158.4118 126.43519)
-        (xy 158.54119 126.3058)
-        (xy 159.55519 126.3058)
-        (xy 159.68458 126.43519)
-        (xy 160.9518 126.43519)
-        (xy 161.08119 126.3058)
-        (xy 161.08119 125.32122)
-        (xy 160.66916 124.90919)
-        (xy 159.68458 124.90919)
-        (xy 159.55519 125.03858)
-        (xy 159.55519 126.3058)
-        (xy 158.54119 126.3058)
-        (xy 158.54119 125.03858)
-        (xy 158.4118 124.90919)
-        (xy 157.14458 124.90919)
-        (xy 157.01519 125.03858)
-        (xy 157.01519 126.3058)
-        (xy 156.00119 126.3058)
-        (xy 156.00119 125.03858)
-        (xy 155.8718 124.90919)
-        (xy 154.60458 124.90919)
-        (xy 154.47519 125.03858)
-        (xy 154.47519 126.3058)
-        (xy 153.46119 126.3058)
-        (xy 153.46119 125.03858)
-        (xy 153.3318 124.90919)
-        (xy 153.13084 124.90919)
-        (xy 151.93519 126.10484)
-        (xy 151.93519 126.3058)
-        (xy 150.1192 126.3058)
-        (xy 152.6592 123.7658)
-        (xy 154.47519 123.7658)
-        (xy 154.60458 123.89519)
-        (xy 155.8718 123.89519)
-        (xy 156.00119 123.7658)
-        (xy 157.01519 123.7658)
-        (xy 157.14458 123.89519)
-        (xy 158.4118 123.89519)
-        (xy 158.54119 123.7658)
-        (xy 158.54119 122.78122)
-        (xy 158.12916 122.36919)
-        (xy 157.14458 122.36919)
-        (xy 157.01519 122.49858)
-        (xy 157.01519 123.7658)
-        (xy 156.00119 123.7658)
-        (xy 156.00119 122.49858)
-        (xy 155.8718 122.36919)
-        (xy 155.67084 122.36919)
-        (xy 154.47519 123.56484)
-        (xy 154.47519 123.7658)
-        (xy 152.6592 123.7658)
-        (xy 156.810905 119.614095)
-        (xy 156.873217 119.580069)
-      )
-    )
-  )
-  (zone locked (net 0) (net_name "") (layer "F.Cu") (tstamp 2e82f573-84c7-4545-ae28-f9e6f082319e) (name "asdf") (hatch full 0.508)
-    (connect_pads (clearance 0))
-    (min_thickness 0.254)
-    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour not_allowed) (footprints not_allowed))
-    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-    (polygon
-      (pts
-        (xy 154.05 132.425)
-        (xy 141.925 132.425)
-        (xy 141.925 128.325)
-        (xy 128.25 128.325)
-        (xy 139.1 117.475)
-      )
-    )
-  )
-  (group "Testgroup, locked" locked (id e0de2bab-8c83-4a7c-aa08-f6e63338fc80)
-    (members
-      18f33c15-2d89-4304-9c8f-98c3582bdb83
-      4255abab-787c-46e3-9144-7ad5270c0729
-      84c6ade4-472b-49ab-bf5d-7989d8cac908
-    )
-  )
-)
diff --git a/tests/testdata/board/test_createEmptyBoard b/tests/testdata/board/test_createEmptyBoard
deleted file mode 100644
index ae65896..0000000
--- a/tests/testdata/board/test_createEmptyBoard
+++ /dev/null
@@ -1,46 +0,0 @@
-(kicad_pcb (version 20211014) (generator kiutils)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0.0)
-  )
-
-  (net 0 "")
-
-)
diff --git a/tests/testdata/board/test_pcbPlotParams b/tests/testdata/board/test_pcbPlotParams
deleted file mode 100644
index 85e26ea..0000000
--- a/tests/testdata/board/test_pcbPlotParams
+++ /dev/null
@@ -1,51 +0,0 @@
-(kicad_pcb (version 20211014) (generator kiutils)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-    (pcbplotparams
-      (layerselection 0x00010ff_ffffffff)
-      (disableapertmacros false)
-      (usegerberextensions false)
-      (usegerberattributes false)
-      (usegerberadvancedattributes false)
-      (creategerberjobfile false)
-      (svguseinch false)
-      (svgprecision 6)
-      (excludeedgelayer false)
-      (plotframeref true)
-      (viasonmask true)
-      (mode 1)
-      (useauxorigin false)
-      (hpglpennumber 1)
-      (hpglpenspeed 20)
-      (hpglpendiameter 15.000000)
-      (dxfpolygonmode true)
-      (dxfimperialunits true)
-      (dxfusepcbnewfont true)
-      (psnegative false)
-      (psa4output false)
-      (plotreference true)
-      (plotvalue true)
-      (plotinvisibletext true)
-      (sketchpadsonfab true)
-      (subtractmaskfromsilk false)
-      (outputformat 1)
-      (mirror false)
-      (drillshape 0)
-      (scaleselection 1)
-      (outputdirectory "")
-    )
-  )
-
-  (net 0 "")
-
-)
diff --git a/tests/testdata/board/test_renameFootprintIdToken b/tests/testdata/board/test_renameFootprintIdToken
deleted file mode 100644
index d40bc36..0000000
--- a/tests/testdata/board/test_renameFootprintIdToken
+++ /dev/null
@@ -1,72 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp a6a16e4a-47c2-4244-ba11-78b40782f3f4)
-    (at 73.5 110.75)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-  )
-
-  (footprint "BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp a6a16e4a-47c2-4244-ba11-78b40782f3f4)
-    (at 73.5 110.75)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-  )
-
-)
diff --git a/tests/testdata/board/test_renameFootprintIdToken.expected b/tests/testdata/board/test_renameFootprintIdToken.expected
deleted file mode 100644
index bd4c9c7..0000000
--- a/tests/testdata/board/test_renameFootprintIdToken.expected
+++ /dev/null
@@ -1,72 +0,0 @@
-(kicad_pcb (version 20211014) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-    (32 "B.Adhes" user "B.Adhesive")
-    (33 "F.Adhes" user "F.Adhesive")
-    (34 "B.Paste" user)
-    (35 "F.Paste" user)
-    (36 "B.SilkS" user "B.Silkscreen")
-    (37 "F.SilkS" user "F.Silkscreen")
-    (38 "B.Mask" user)
-    (39 "F.Mask" user)
-    (40 "Dwgs.User" user "User.Drawings")
-    (41 "Cmts.User" user "User.Comments")
-    (42 "Eco1.User" user "User.Eco1")
-    (43 "Eco2.User" user "User.Eco2")
-    (44 "Edge.Cuts" user)
-    (45 "Margin" user)
-    (46 "B.CrtYd" user "B.Courtyard")
-    (47 "F.CrtYd" user "F.Courtyard")
-    (48 "B.Fab" user)
-    (49 "F.Fab" user)
-    (50 "User.1" user)
-    (51 "User.2" user)
-    (52 "User.3" user)
-    (53 "User.4" user)
-    (54 "User.5" user)
-    (55 "User.6" user)
-    (56 "User.7" user)
-    (57 "User.8" user)
-    (58 "User.9" user)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (footprint "I_was_renamed:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp a6a16e4a-47c2-4244-ba11-78b40782f3f4)
-    (at 73.5 110.75)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-  )
-
-  (footprint "I_was_added:BUS_PCIexpress_x1" (layer "F.Cu")
-    (tedit 62BC9CDF) (tstamp a6a16e4a-47c2-4244-ba11-78b40782f3f4)
-    (at 73.5 110.75)
-    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 1fe1971a-7016-45bb-8345-401820ae3862)
-    )
-    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
-      (effects (font (size 1 1) (thickness 0.15)))
-      (tstamp 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
-    )
-  )
-
-)
diff --git a/tests/testdata/board/test_zoneOnAllLayersWildcard b/tests/testdata/board/test_zoneOnAllLayersWildcard
deleted file mode 100644
index 367128f..0000000
--- a/tests/testdata/board/test_zoneOnAllLayersWildcard
+++ /dev/null
@@ -1,24 +0,0 @@
-(kicad_pcb (version 20221018) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (zone (net 0) (net_name "") (layers "*.Cu") (tstamp 3562b45e-4bdd-495d-8608-16ebe61c5885) (hatch edge 0.5)
-    (connect_pads (clearance 0.5))
-    (min_thickness 0.25) (filled_areas_thickness no)
-    (fill yes (thermal_gap 0.5) (thermal_bridge_width 0.5) (island_removal_mode 1) (island_area_min 10))
-  )
-)
diff --git a/tests/testdata/board/test_zoneOnOuterLayersOnly b/tests/testdata/board/test_zoneOnOuterLayersOnly
deleted file mode 100644
index 365368d..0000000
--- a/tests/testdata/board/test_zoneOnOuterLayersOnly
+++ /dev/null
@@ -1,24 +0,0 @@
-(kicad_pcb (version 20221018) (generator pcbnew)
-
-  (general
-    (thickness 1.6)
-  )
-
-  (paper "A4")
-  (layers
-    (0 "F.Cu" signal)
-    (31 "B.Cu" signal)
-  )
-
-  (setup
-    (pad_to_mask_clearance 0)
-  )
-
-  (net 0 "")
-
-  (zone (net 0) (net_name "") (layers "F&B.Cu") (tstamp 3562b45e-4bdd-495d-8608-16ebe61c5885) (hatch edge 0.5)
-    (connect_pads (clearance 0.5))
-    (min_thickness 0.25) (filled_areas_thickness no)
-    (fill yes (thermal_gap 0.5) (thermal_bridge_width 0.5) (island_removal_mode 1) (island_area_min 10))
-  )
-)
diff --git a/tests/testdata/designrules/since_v7/test_severityToken b/tests/testdata/designrules/since_v7/test_severityToken
deleted file mode 100644
index 0ac96b3..0000000
--- a/tests/testdata/designrules/since_v7/test_severityToken
+++ /dev/null
@@ -1,15 +0,0 @@
-(version 1)
-
-(rule "HV"
-  (constraint clearance (min "1.5mm"))
-  (condition "A.NetClass == 'HV'")
-  (severity ignore))
-(rule "HV"
-  (layer "outer")
-  (constraint clearance (min "1.5mm"))
-  (condition "A.NetClass == 'HV'")
-  (severity error))
-(rule "HV_HV"
-  (constraint clearance (min "1.5mm + 2.0mm"))
-  (condition "A.NetClass == 'HV' && B.NetClass == 'HV'")
-  (severity warning))
diff --git a/tests/testdata/designrules/test_allDesignRuleItems b/tests/testdata/designrules/test_allDesignRuleItems
deleted file mode 100644
index 8afc948..0000000
--- a/tests/testdata/designrules/test_allDesignRuleItems
+++ /dev/null
@@ -1,52 +0,0 @@
-(version 1)
-
-(rule "HV"
-  (constraint clearance (min "1.5mm"))
-  (condition "A.NetClass == 'HV'"))
-(rule "HV"
-  (layer "outer")
-  (constraint clearance (min "1.5mm"))
-  (condition "A.NetClass == 'HV'"))
-(rule "HV_HV"
-  (constraint clearance (min "1.5mm + 2.0mm"))
-  (condition "A.NetClass == 'HV' && B.NetClass == 'HV'"))
-(rule "HV_unshielded"
-  (constraint clearance (min "2mm"))
-  (condition "A.NetClass == 'HV' && !A.insideArea('Shield*')"))
-(rule "copper keepout"
-  (constraint disallow track via zone)
-  (condition "A.insideArea('zone3')"))
-(rule "BGA neckdown"
-  (constraint track_width (min "0.2mm") (opt "0.25mm"))
-  (constraint clearance (min "0.05mm") (opt "0.08mm"))
-  (condition "A.insideCourtyard('U3')"))
-(rule "silk_over_via"
-  (constraint silk_clearance (min "0.2mm"))
-  (condition "A.Type == '*Text' && B.Type == 'Via'"))
-(rule "Distance between Vias of Different Nets"
-  (constraint hole_to_hole (min "0.254mm"))
-  (condition "A.Type =='Via' && B.Type =='Via' && A.Net != B.Net"))
-(rule "Clearance between Pads of Different Nets"
-  (constraint clearance (min "3.0mm"))
-  (condition "A.Type =='Pad' && B.Type =='Pad' && A.Net != B.Net"))
-(rule "Via Hole to Track Clearance"
-  (constraint hole_clearance (min "0.254mm"))
-  (condition "A.Type =='Via' && B.Type =='Track'"))
-(rule "Pad to Track Clearance"
-  (constraint clearance (min "0.2mm"))
-  (condition "A.Type =='Pad' && B.Type =='Track'"))
-(rule "clearance-to-1mm-cutout"
-  (constraint clearance (min "0.8mm"))
-  (condition "A.Layer=='Edge.Cuts' && A.Thickness == 1.0mm"))
-(rule "Max Drill Hole Size Mechanical"
-  (constraint hole_size (max "6.3mm"))
-  (condition "A.Pad_Type == 'NPTH, mechanical'"))
-(rule "Max Drill Hole Size PTH"
-  (constraint hole_size (max "6.35mm"))
-  (condition "A.Pad_Type == 'Through-hole'"))
-(rule "dp clock gap"
-  (constraint diff_pair_gap (opt "0.8mm"))
-  (condition "A.inDiffPair('CLK') && AB.isCoupledDiffPair()"))
-(rule "dp clearance"
-  (constraint clearance (min "1.5mm"))
-  (condition "A.inDiffPair('*') && !AB.isCoupledDiffPair()"))
diff --git a/tests/testdata/designrules/test_createNewDesignRules b/tests/testdata/designrules/test_createNewDesignRules
deleted file mode 100644
index 575162e..0000000
--- a/tests/testdata/designrules/test_createNewDesignRules
+++ /dev/null
@@ -1 +0,0 @@
-(version 1)
diff --git a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers
deleted file mode 100644
index 0684ed6..0000000
--- a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers
+++ /dev/null
@@ -1,3 +0,0 @@
-(module 0402 (layer F.Cu) (tedit 5E68CD62)
-  (attr smd)
-)
\ No newline at end of file
diff --git a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected
deleted file mode 100644
index 2aeba2b..0000000
--- a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected
+++ /dev/null
@@ -1,5 +0,0 @@
-(footprint "402"
-  (layer "F.Cu")
-  (tedit 5E68CD62)
-  (attr smd)
-)
diff --git a/tests/testdata/footprint/since_v7/test_3dModelOpacityToken b/tests/testdata/footprint/since_v7/test_3dModelOpacityToken
deleted file mode 100644
index a6c55ec..0000000
--- a/tests/testdata/footprint/since_v7/test_3dModelOpacityToken
+++ /dev/null
@@ -1,10 +0,0 @@
-(footprint "test"
-  (layer "F.Cu")
-  (tedit 64b312a4)
-  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
-    (opacity 0.54)
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken b/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken
deleted file mode 100644
index 2eb2a70..0000000
--- a/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken
+++ /dev/null
@@ -1,7 +0,0 @@
-(footprint "BatteryClip_Keystone_54_D16-19mm" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 64dbffd5)
-  (descr "some description")
-  (tags "some tags")
-  (attr through_hole board_only exclude_from_pos_files exclude_from_bom allow_missing_courtyard)
-)
diff --git a/tests/testdata/footprint/since_v7/test_imageWithLayerToken b/tests/testdata/footprint/since_v7/test_imageWithLayerToken
deleted file mode 100644
index 094e3a0..0000000
--- a/tests/testdata/footprint/since_v7/test_imageWithLayerToken
+++ /dev/null
@@ -1,27 +0,0 @@
-(footprint "image_test" (version 20221018) (generator kiutils)
-  (layer "F.Cu")
-  (tedit 640a506b)
-  (attr smd)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)))
-    (tstamp 8fee236d-a937-47a4-b037-5b1ec0ea729a)
-  )
-  (fp_text value "image_test" (at 0 1 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp aeb0c71a-d788-467d-a13c-49ed75f3dbdb)
-  )
-  (image (at 5.08 -7.62) (layer "F.SilkS") (scale 7.875)
-    (data
-      iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAA3NCSVQICAjb4U/gAAAACXBIWXMA
-      AA50AAAOdAFrJLPWAAAA9ElEQVRIiWP88OEDA20AE43MHbJGs+CX1pp4hUiDruXroIkMzQAZmkYT
-      iEZMIMHDWmEvaS3P8/33v1NPvvYfffH002+sKhnx50a0FCLBw7o+WoWfg5kYR5Dm6go7SX4O5kuX
-      Li1atIiRkTEuLk5XV5c6Rlsr8DAwMCxevBji14kTJ8Kl5syZg6aYXtFIMO+dePTFWZkvLi5u0aJF
-      DAwM8fHxOjromRAOUKKRoNGKguzLw5X42GkQjfff/wxYcqfcTsJanvf777+nnnydcOwlJPFhliEk
-      p+sXX34XbntMjMqhmdFHjaaf0QRKPkrA0AyQUaPRAACmk1AZ+UHU4QAAAABJRU5ErkJggg==
-    )
-  )
-  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp a5217a7a-3aed-4722-8474-750c47ad16eb)
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_netTiePadGroups b/tests/testdata/footprint/since_v7/test_netTiePadGroups
deleted file mode 100644
index 29b8c58..0000000
--- a/tests/testdata/footprint/since_v7/test_netTiePadGroups
+++ /dev/null
@@ -1,18 +0,0 @@
-(footprint "test" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 651dbffc)
-  (attr smd)
-  (net_tie_pad_groups "Test" "Test {dblquote}Test{dblquote}" "°!{dblquote}§$%&/()=?²²³{[[]}]\}\\" "###'''+++**~~~" ",,,;;;...::---__" "äöü")
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)))
-    (tstamp 59323fba-83c2-4ee2-ab11-b887cdf7a9c1)
-  )
-  (fp_text value "test" (at 0 1 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 828258c2-6d00-4e3a-b5c5-8beb8f262be5)
-  )
-  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 3210958f-d220-4c0f-bb30-50169792bb2a)
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_privateLayersToken b/tests/testdata/footprint/since_v7/test_privateLayersToken
deleted file mode 100644
index 93e1c0d..0000000
--- a/tests/testdata/footprint/since_v7/test_privateLayersToken
+++ /dev/null
@@ -1,27 +0,0 @@
-(footprint "JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 64de8dfa)
-  (descr "JST EH series connector, B2B-EH-A (http://www.jst-mfg.com/product/pdf/eng/eEH.pdf), generated with kicad-footprint-generator")
-  (tags "connector JST EH vertical")
-  (attr through_hole)
-  (private_layers "User.1" "User.2" "User.3" "User.4" "User.5" "User.6" "User.7" "User.8" "User.9")
-  (fp_text reference "REF**" (at 1.25 -2.8) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp f638d0bf-d856-439a-9a7a-de96b7095635)
-  )
-  (fp_text value "JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical" (at 1.25 3.4) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp e9466767-d800-41ed-923d-b2c6bd7625e6)
-  )
-  (fp_text user "${REFERENCE}" (at 1.25 1.5) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp a538f7fb-153f-40d4-b79d-371fd4e198af)
-  )
-  (pad "1" thru_hole roundrect (at 0 0) (size 1.7 2) (drill 1) (layers "F.Cu" "B.Cu") (roundrect_rratio 0.147059) (tstamp b9960672-3af1-4d13-99fc-2f62dd24a4bc))
-  (pad "2" thru_hole oval (at 2.5 0) (size 1.7 2) (drill 1) (layers "F.Cu" "B.Cu") (tstamp 94cccd64-f718-491b-83c2-3fc50ed44c7e))
-  (model "${KICAD6_3DMODEL_DIR}/Connector_JST.3dshapes/JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical.wrl"
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_textBoxAllVariants b/tests/testdata/footprint/since_v7/test_textBoxAllVariants
deleted file mode 100644
index 2496a9c..0000000
--- a/tests/testdata/footprint/since_v7/test_textBoxAllVariants
+++ /dev/null
@@ -1,439 +0,0 @@
-(footprint "test" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 6404ec1a)
-  (attr smd)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS") hide
-    (effects (font (size 1 1) (thickness 0.1)))
-    (tstamp 04078fb9-e314-429a-815b-4c1c86725037)
-  )
-  (fp_text value "fdsafsad" (at 0 1 unlocked) (layer "F.Fab") hide
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp ca15cc33-7395-4013-af8d-afa553f77a01)
-  )
-  (fp_text user "Misc" (at 83.82 2.54 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
-    (tstamp 1dab3b23-458d-42ae-a96f-af7098325988)
-  )
-  (fp_text user "Orientation" (at 58.42 2.54 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
-    (tstamp 2a90a8ae-4bfe-4e41-806e-a8f5556a4533)
-  )
-  (fp_text user "Style" (at 7.62 2.54 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
-    (tstamp 93fbf946-e879-4b7c-addf-b508290404f1)
-  )
-  (fp_text user "Alignmeht" (at 33.02 2.54 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
-    (tstamp eba2a418-b7cf-4e37-8641-780fd732dff7)
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 83.82 10.16) (end 106.68 12.7) (layer "F.Paste") (tstamp d2c1b9e8-7717-4509-b816-10978d73269f)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 81.28) (end 55.88 83.82) (layer "F.SilkS") (tstamp 075ac5dc-d8fe-4385-8466-6ca73fbf873e)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify left top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 15.24) (end 55.88 17.78) (layer "F.SilkS") (tstamp 0cc7f2dd-d40b-4228-afd5-0e40ccebb1c6)
-    (effects (font (size 1 1) (thickness 0.1)) (justify right top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 45.72) (end 55.88 48.26) (layer "F.SilkS") (tstamp 19aa2dfe-8e81-4696-91b2-6293a03112d3)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify right top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 35.56) (end 55.88 38.1) (layer "F.SilkS") (tstamp 1dbd5b15-621a-45e0-9e0a-84a64137d125)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 60.96 35.56) (end 58.42 58.42) (angle 270) (layer "F.SilkS") (tstamp 1dbedb60-3a16-4543-b5e1-33aafa8fba46)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 106.68) (end 55.88 109.22) (layer "F.SilkS") (tstamp 1ddb9369-023f-46d4-a270-b5633a5ac338)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify right top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 86.36) (end 55.88 88.9) (layer "F.SilkS") (tstamp 22238a34-72ee-400b-80d3-5e54ad3de17a)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 50.8) (end 55.88 53.34) (layer "F.SilkS") (tstamp 22657e6e-100d-4d3a-a3c3-fb8a57a6ab75)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 25.4) (end 55.88 27.94) (layer "F.SilkS") (tstamp 2de82614-e4ad-4a86-94c1-b42fc39caa09)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 5.08) (end 30.48 7.62) (layer "F.SilkS") (tstamp 32346b54-f7bb-4b3a-b599-1f99940ebdf8)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type default))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 30.48) (end 55.88 33.02) (layer "F.SilkS") (tstamp 38b19ef6-3b2e-47b2-999a-a277e1b79652)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify right top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 25.4) (end 30.48 27.94) (layer "F.SilkS") (tstamp 38c362a6-d4c5-46ae-94b6-412e71e42ef1)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type dash_dot))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 40.64) (end 30.48 43.18) (layer "F.SilkS") (tstamp 47f050b6-ff37-423d-bb39-bc5a6708c285)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 35.56) (end 30.48 38.1) (layer "F.SilkS") (tstamp 61b0f568-9b3b-4275-917a-0596fc54880f)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 96.52) (end 55.88 99.06) (layer "F.SilkS") (tstamp 722bb73b-d9b5-4896-ab08-b94c5e51b720)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify left top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 60.96) (end 55.88 63.5) (layer "F.SilkS") (tstamp 84d117bc-8774-4a68-8f27-a907c3e275ff)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify right top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 55.88) (end 30.48 58.42) (layer "F.SilkS") (tstamp 8b7f237a-9227-408a-a4c8-1840905efb42)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 20.32) (end 55.88 22.86) (layer "F.SilkS") (tstamp 8d20babe-adfe-43ea-8b8a-471fa69e8eba)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 116.84) (end 55.88 119.38) (layer "F.SilkS") (tstamp 8e8ecceb-51eb-4c0a-8dca-62e6b38f8546)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 45.72) (end 30.48 48.26) (layer "F.SilkS") (tstamp 956964a4-3080-4393-97fd-7de631bc9c75)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 15.24) (end 30.48 17.78) (layer "F.SilkS") (tstamp 9ceff9b9-909e-49a5-ba55-d3f1c7a0edd7)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type dash))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 111.76) (end 55.88 114.3) (layer "F.SilkS") (tstamp a1462a23-eef0-4434-8353-111d6567f099)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify left top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 58.42 5.08) (end 81.28 7.62) (layer "F.SilkS") (tstamp a7aa41e6-8fea-4b7d-9884-f47b5102bea0)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type default))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 20.32) (end 30.48 22.86) (layer "F.SilkS") (tstamp a91ccabb-ae9f-4982-93aa-6771fd8111eb)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type dot))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 5.08) (end 55.88 7.62) (layer "F.SilkS") (tstamp b5d16d8e-c631-48b2-b456-20705dcd25e7)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 81.28 63.5) (end 58.42 60.96) (angle 180) (layer "F.SilkS") (tstamp b61515a3-1c99-4a61-b6ab-f03cce68809f)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 10.16) (end 30.48 12.7) (layer "F.SilkS") (tstamp bcea8bf2-0c5c-4b3e-bfeb-3141b7e0e6d3)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 71.12) (end 55.88 73.66) (layer "F.SilkS") (tstamp bd31944d-5cd0-491b-bb40-3c38ca05c99d)
-    (effects (font (size 1 1) (thickness 0.1)) (justify top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 40.64) (end 55.88 43.18) (layer "F.SilkS") (tstamp c04984b2-2670-4380-a9ac-6c69e7772c59)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 60.96) (end 30.48 63.5) (layer "F.SilkS") (tstamp c20d5ee9-7396-4dff-945c-a8f762d9db3b)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 121.92) (end 55.88 124.46) (layer "F.SilkS") (tstamp c29911b4-ee3a-42f0-b5e3-330c73e204a4)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify right top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 30.48) (end 30.48 33.02) (layer "F.SilkS") (tstamp c5ba9f23-cb66-440f-9e8a-7bc0f7d576cf)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type dash_dot_dot))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 55.88) (end 55.88 58.42) (layer "F.SilkS") (tstamp c6ec68b1-9e6b-4b2c-8c39-1131651342fe)
-    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 58.42 33.02) (end 60.96 10.16) (angle 90) (layer "F.SilkS") (tstamp cd6299be-521a-47a8-b5e1-ed68be3bea8b)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 66.04) (end 55.88 68.58) (layer "F.SilkS") (tstamp d78808b1-0a48-4221-a74a-1edf7b504e07)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 7.62 50.8) (end 30.48 53.34) (layer "F.SilkS") (tstamp e5503340-1733-4e02-8d62-7b238f53651f)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 101.6) (end 55.88 104.14) (layer "F.SilkS") (tstamp e55d9467-e61f-4c22-b2a7-2d89e7a31fec)
-    (effects (font (size 1 1) (thickness 0.1) italic) (justify top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 10.16) (end 55.88 12.7) (layer "F.SilkS") (tstamp e7e12072-0086-4935-a831-ea9643c7ee8d)
-    (effects (font (size 1 1) (thickness 0.1)) (justify top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 91.44) (end 55.88 93.98) (layer "F.SilkS") (tstamp f4022187-7c2b-4191-beb9-8a6e1add5cdd)
-    (effects (font (size 1 1) (thickness 0.2) bold) (justify right top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "t a"
-    (start 83.82 5.08) (end 106.68 7.62) (layer "F.SilkS") (tstamp f47d60bc-33ea-4fbd-a273-1843ab00f907)
-    (effects (font (face "Wingdings") (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-    (render_cache "t a" 0
-      (polygon
-        (pts
-          (xy 84.738946 6.364403)          (xy 85.14561 5.785792)          (xy 85.552274 6.364403)          (xy 85.14561 6.942526)
-        )
-      )
-      (polygon
-        (pts
-          (xy 88.236416 6.223771)          (xy 88.24928 6.224662)          (xy 88.261908 6.226145)          (xy 88.2743 6.228222)
-          (xy 88.286455 6.230893)          (xy 88.298373 6.234157)          (xy 88.310055 6.238014)          (xy 88.3215 6.242465)
-          (xy 88.332708 6.247509)          (xy 88.34368 6.253146)          (xy 88.354415 6.259377)          (xy 88.364914 6.266202)
-          (xy 88.375176 6.27362)          (xy 88.385201 6.281631)          (xy 88.39499 6.290236)          (xy 88.404542 6.299434)
-          (xy 88.413711 6.309051)          (xy 88.422288 6.318913)          (xy 88.430274 6.329018)          (xy 88.437668 6.339368)
-          (xy 88.44447 6.349962)          (xy 88.450681 6.3608)          (xy 88.456301 6.371883)          (xy 88.461329 6.38321)
-          (xy 88.465765 6.394781)          (xy 88.46961 6.406596)          (xy 88.472864 6.418655)          (xy 88.475525 6.430959)
-          (xy 88.477596 6.443507)          (xy 88.479075 6.456299)          (xy 88.479962 6.469336)          (xy 88.480258 6.482616)
-          (xy 88.480055 6.493231)          (xy 88.479449 6.503733)          (xy 88.478437 6.514123)          (xy 88.477021 6.524401)
-          (xy 88.475201 6.534567)          (xy 88.472976 6.544621)          (xy 88.470347 6.554562)          (xy 88.467313 6.564392)
-          (xy 88.463874 6.574109)          (xy 88.460031 6.583715)          (xy 88.455784 6.593208)          (xy 88.451132 6.602589)
-          (xy 88.446075 6.611858)          (xy 88.440614 6.621015)          (xy 88.434748 6.63006)          (xy 88.428478 6.638993)
-          (xy 88.421804 6.647814)          (xy 88.414724 6.656522)          (xy 88.407241 6.665119)          (xy 88.399352 6.673603)
-          (xy 88.391059 6.681975)          (xy 88.382362 6.690235)          (xy 88.37326 6.698383)          (xy 88.363754 6.706419)
-          (xy 88.353843 6.714343)          (xy 88.343528 6.722155)          (xy 88.332808 6.729854)          (xy 88.321683 6.737442)
-          (xy 88.310154 6.744917)          (xy 88.29822 6.752281)          (xy 88.285882 6.759532)          (xy 88.27314 6.766671)
-          (xy 88.260092 6.773643)          (xy 88.246838 6.780394)          (xy 88.233378 6.786924)          (xy 88.219712 6.793232)
-          (xy 88.205839 6.799319)          (xy 88.191761 6.805185)          (xy 88.177477 6.810829)          (xy 88.162986 6.816252)
-          (xy 88.14829 6.821454)          (xy 88.133387 6.826434)          (xy 88.118278 6.831193)          (xy 88.102964 6.83573)
-          (xy 88.087443 6.840047)          (xy 88.071716 6.844142)          (xy 88.055783 6.848015)          (xy 88.039644 6.851667)
-          (xy 88.023298 6.855098)          (xy 88.006747 6.858308)          (xy 87.98999 6.861296)          (xy 87.973026 6.864063)
-          (xy 87.955857 6.866608)          (xy 87.938481 6.868932)          (xy 87.9209 6.871035)          (xy 87.903112 6.872916)
-          (xy 87.885118 6.874577)          (xy 87.866918 6.876015)          (xy 87.848512 6.877233)          (xy 87.8299 6.878229)
-          (xy 87.811082 6.879003)          (xy 87.792058 6.879557)          (xy 87.772827 6.879889)          (xy 87.753391 6.88)
-          (xy 87.736493 6.87986)          (xy 87.719537 6.879441)          (xy 87.702521 6.878744)          (xy 87.685446 6.877767)
-          (xy 87.668311 6.876511)          (xy 87.651118 6.874976)          (xy 87.633866 6.873162)          (xy 87.616554 6.871069)
-          (xy 87.599183 6.868697)          (xy 87.581753 6.866046)          (xy 87.564264 6.863116)          (xy 87.546716 6.859907)
-          (xy 87.529108 6.856418)          (xy 87.511442 6.852651)          (xy 87.493716 6.848605)          (xy 87.475931 6.844279)
-          (xy 87.458087 6.839674)          (xy 87.440184 6.834791)          (xy 87.422222 6.829628)          (xy 87.4042 6.824186)
-          (xy 87.386119 6.818465)          (xy 87.36798 6.812465)          (xy 87.349781 6.806186)          (xy 87.331523 6.799628)
-          (xy 87.313205 6.792791)          (xy 87.294829 6.785675)          (xy 87.276393 6.77828)          (xy 87.257899 6.770605)
-          (xy 87.239345 6.762652)          (xy 87.220732 6.75442)          (xy 87.20206 6.745908)          (xy 87.183328 6.737117)
-          (xy 87.183328 6.631849)          (xy 87.203274 6.640384)          (xy 87.223178 6.648648)          (xy 87.24304 6.656641)
-          (xy 87.26286 6.664364)          (xy 87.282638 6.671815)          (xy 87.302374 6.678995)          (xy 87.322068 6.685905)
-          (xy 87.34172 6.692543)          (xy 87.36133 6.698911)          (xy 87.380898 6.705007)          (xy 87.400424 6.710833)
-          (xy 87.419908 6.716387)          (xy 87.43935 6.721671)          (xy 87.45875 6.726684)          (xy 87.478108 6.731425)
-          (xy 87.497424 6.735896)          (xy 87.516699 6.740096)          (xy 87.535931 6.744025)          (xy 87.555121 6.747683)
-          (xy 87.574269 6.75107)          (xy 87.593376 6.754186)          (xy 87.61244 6.757031)          (xy 87.631462 6.759605)
-          (xy 87.650443 6.761908)          (xy 87.669381 6.76394)          (xy 87.688277 6.765701)          (xy 87.707132 6.767192)
-          (xy 87.725944 6.768411)          (xy 87.744715 6.769359)          (xy 87.763443 6.770037)          (xy 87.78213 6.770443)
-          (xy 87.800774 6.770579)          (xy 87.812885 6.770531)          (xy 87.824854 6.77039)          (xy 87.836681 6.770154)
-          (xy 87.848367 6.769823)          (xy 87.859911 6.769398)          (xy 87.871314 6.768879)          (xy 87.882574 6.768265)
-          (xy 87.893693 6.767556)          (xy 87.904671 6.766753)          (xy 87.915506 6.765856)          (xy 87.9262 6.764864)
-          (xy 87.936752 6.763778)          (xy 87.947163 6.762597)          (xy 87.957432 6.761322)          (xy 87.967559 6.759953)
-          (xy 87.977545 6.758489)          (xy 87.987389 6.75693)          (xy 87.997091 6.755277)          (xy 88.01607 6.751688)
-          (xy 88.034483 6.747721)          (xy 88.052329 6.743376)          (xy 88.069608 6.738653)          (xy 88.086321 6.733553)
-          (xy 88.102466 6.728075)          (xy 88.118046 6.722219)          (xy 88.108518 6.717164)          (xy 88.099292 6.711953)
-          (xy 88.090368 6.706585)          (xy 88.081745 6.701061)          (xy 88.073424 6.695381)          (xy 88.065404 6.689544)
-          (xy 88.057685 6.68355)          (xy 88.046673 6.674266)          (xy 88.036339 6.664631)          (xy 88.026683 6.654643)
-          (xy 88.017706 6.644303)          (xy 88.009407 6.633611)          (xy 88.001786 6.622568)          (xy 87.994846 6.611119)
-          (xy 87.988588 6.599306)          (xy 87.983013 6.587128)          (xy 87.978121 6.574585)          (xy 87.973912 6.561677)
-          (xy 87.970385 6.548405)          (xy 87.96754 6.534767)          (xy 87.965379 6.520764)          (xy 87.963899 6.506396)
-          (xy 87.963293 6.496615)          (xy 87.962989 6.486672)          (xy 87.962957 6.482372)          (xy 88.030851 6.482372)
-          (xy 88.031072 6.492238)          (xy 88.032234 6.506712)          (xy 88.034392 6.520795)          (xy 88.037547 6.534487)
-          (xy 88.041697 6.547788)          (xy 88.046843 6.560699)          (xy 88.052985 6.573219)          (xy 88.060124 6.585348)
-          (xy 88.068258 6.597087)          (xy 88.077389 6.608435)          (xy 88.084029 6.615783)          (xy 88.087515 6.619392)
-          (xy 88.094686 6.626343)          (xy 88.102032 6.632845)          (xy 88.113381 6.641757)          (xy 88.125125 6.64966)
-          (xy 88.137263 6.656555)          (xy 88.149797 6.66244)          (xy 88.162726 6.667317)          (xy 88.176049 6.671184)
-          (xy 88.189768 6.674043)          (xy 88.203882 6.675893)          (xy 88.21839 6.676733)          (xy 88.223314 6.676789)
-          (xy 88.233082 6.676571)          (xy 88.247383 6.675424)          (xy 88.261263 6.673294)          (xy 88.274723 6.67018)
-          (xy 88.287762 6.666084)          (xy 88.30038 6.661004)          (xy 88.312577 6.654941)          (xy 88.324354 6.647895)
-          (xy 88.33571 6.639866)          (xy 88.346645 6.630853)          (xy 88.357159 6.620858)          (xy 88.36698 6.61015)
-          (xy 88.375835 6.598999)          (xy 88.383724 6.587406)          (xy 88.390647 6.575371)          (xy 88.396604 6.562894)
-          (xy 88.401595 6.549975)          (xy 88.40562 6.536613)          (xy 88.408679 6.52281)          (xy 88.410772 6.508564)
-          (xy 88.411631 6.498821)          (xy 88.41206 6.488881)          (xy 88.412114 6.483838)          (xy 88.411897 6.473645)
-          (xy 88.411248 6.463646)          (xy 88.410165 6.453839)          (xy 88.407728 6.43949)          (xy 88.404317 6.425574)
-          (xy 88.399932 6.412092)          (xy 88.394571 6.399044)          (xy 88.388237 6.38643)          (xy 88.380927 6.374249)
-          (xy 88.372643 6.362502)          (xy 88.363385 6.351188)          (xy 88.356671 6.343886)          (xy 88.349678 6.336877)
-          (xy 88.338843 6.32721)          (xy 88.327591 6.318562)          (xy 88.315922 6.31093)          (xy 88.303837 6.304316)
-          (xy 88.291336 6.29872)          (xy 88.278418 6.294141)          (xy 88.265083 6.29058)          (xy 88.251333 6.288036)
-          (xy 88.237165 6.28651)          (xy 88.222581 6.286001)          (xy 88.212692 6.286225)          (xy 88.198207 6.287402)
-          (xy 88.184144 6.289588)          (xy 88.170501 6.292783)          (xy 88.157279 6.296987)          (xy 88.144478 6.3022)
-          (xy 88.132097 6.308422)          (xy 88.120137 6.315652)          (xy 88.108598 6.323892)          (xy 88.09748 6.33314)
-          (xy 88.090302 6.339867)          (xy 88.086782 6.343398)          (xy 88.08001 6.350667)          (xy 88.073674 6.358125)
-          (xy 88.064989 6.369666)          (xy 88.057287 6.381632)          (xy 88.050569 6.394024)          (xy 88.044834 6.40684)
-          (xy 88.040082 6.420081)          (xy 88.036313 6.433748)          (xy 88.033527 6.447839)          (xy 88.031725 6.462356)
-          (xy 88.031069 6.472269)          (xy 88.030851 6.482372)          (xy 87.962957 6.482372)          (xy 87.962951 6.481639)
-          (xy 87.96325 6.468507)          (xy 87.964146 6.455608)          (xy 87.965639 6.442945)          (xy 87.967729 6.430516)
-          (xy 87.970417 6.418322)          (xy 87.973702 6.406363)          (xy 87.977584 6.394638)          (xy 87.982063 6.383148)
-          (xy 87.98714 6.371893)          (xy 87.992814 6.360873)          (xy 87.999085 6.350087)          (xy 88.005953 6.339536)
-          (xy 88.013419 6.329219)          (xy 88.021482 6.319138)          (xy 88.030142 6.309291)          (xy 88.039399 6.299678)
-          (xy 88.049105 6.290451)          (xy 88.059049 6.281818)          (xy 88.069232 6.273781)          (xy 88.079654 6.266339)
-          (xy 88.090313 6.259493)          (xy 88.101212 6.253242)          (xy 88.112349 6.247586)          (xy 88.123724 6.242526)
-          (xy 88.135338 6.238061)          (xy 88.147191 6.234191)          (xy 88.159282 6.230917)          (xy 88.171611 6.228237)
-          (xy 88.184179 6.226154)          (xy 88.196986 6.224665)          (xy 88.210031 6.223772)          (xy 88.223314 6.223475)
-        )
-      )
-      (polygon
-        (pts
-          (xy 87.927137 5.864089)          (xy 87.944135 5.864509)          (xy 87.96119 5.865209)          (xy 87.9783 5.866189)
-          (xy 87.995468 5.86745)          (xy 88.012691 5.86899)          (xy 88.029971 5.87081)          (xy 88.047307 5.87291)
-          (xy 88.064699 5.87529)          (xy 88.082148 5.87795)          (xy 88.099652 5.880891)          (xy 88.117214 5.884111)
-          (xy 88.134831 5.887611)          (xy 88.152505 5.891391)          (xy 88.170235 5.895452)          (xy 88.188021 5.899792)
-          (xy 88.205864 5.904412)          (xy 88.223763 5.909313)          (xy 88.241718 5.914493)          (xy 88.259729 5.919953)
-          (xy 88.277797 5.925694)          (xy 88.295921 5.931714)          (xy 88.314101 5.938015)          (xy 88.332338 5.944595)
-          (xy 88.350631 5.951456)          (xy 88.36898 5.958596)          (xy 88.387386 5.966017)          (xy 88.405848 5.973717)
-          (xy 88.424366 5.981698)          (xy 88.44294 5.989959)          (xy 88.461571 5.998499)          (xy 88.480258 6.00732)
-          (xy 88.480258 6.112344)          (xy 88.460312 6.103794)          (xy 88.440407 6.095515)          (xy 88.420544 6.087508)
-          (xy 88.400722 6.079772)          (xy 88.380942 6.072308)          (xy 88.361204 6.065115)          (xy 88.341507 6.058193)
-          (xy 88.321851 6.051543)          (xy 88.302237 6.045164)          (xy 88.282664 6.039057)          (xy 88.263133 6.033221)
-          (xy 88.243644 6.027657)          (xy 88.224196 6.022364)          (xy 88.204789 6.017342)          (xy 88.185424 6.012592)
-          (xy 88.1661 6.008114)          (xy 88.146818 6.003906)          (xy 88.127578 5.999971)          (xy 88.108379 5.996306)
-          (xy 88.089221 5.992913)          (xy 88.070105 5.989792)          (xy 88.05103 5.986942)          (xy 88.031997 5.984363)
-          (xy 88.013006 5.982056)          (xy 87.994056 5.98002)          (xy 87.975147 5.978256)          (xy 87.95628 5.976763)
-          (xy 87.937455 5.975542)          (xy 87.918671 5.974592)          (xy 87.899928 5.973913)          (xy 87.881227 5.973506)
-          (xy 87.862568 5.97337)          (xy 87.850441 5.973418)          (xy 87.838456 5.973562)          (xy 87.826612 5.973802)
-          (xy 87.81491 5.974137)          (xy 87.803348 5.974569)          (xy 87.791928 5.975096)          (xy 87.780649 5.975719)
-          (xy 87.769511 5.976438)          (xy 87.758514 5.977253)          (xy 87.747659 5.978164)          (xy 87.736945 5.979171)
-          (xy 87.726372 5.980274)          (xy 87.71594 5.981472)          (xy 87.705649 5.982767)          (xy 87.6955 5.984157)
-          (xy 87.685491 5.985643)          (xy 87.675624 5.987225)          (xy 87.665899 5.988903)          (xy 87.646871 5.992547)
-          (xy 87.628407 5.996574)          (xy 87.610509 6.000985)          (xy 87.593175 6.005779)          (xy 87.576407 6.010957)
-          (xy 87.560203 6.016518)          (xy 87.544563 6.022463)          (xy 87.554179 6.027431)          (xy 87.563488 6.032565)
-          (xy 87.57249 6.037864)          (xy 87.581185 6.04333)          (xy 87.589572 6.048962)          (xy 87.597652 6.05476)
-          (xy 87.605425 6.060724)          (xy 87.616508 6.069981)          (xy 87.6269 6.079612)          (xy 87.636601 6.089616)
-          (xy 87.64561 6.099994)          (xy 87.653929 6.110745)          (xy 87.661556 6.12187)          (xy 87.668496 6.133316)
-          (xy 87.674753 6.145122)          (xy 87.680328 6.15729)          (xy 87.685221 6.169818)          (xy 87.68943 6.182706)
-          (xy 87.692957 6.195955)          (xy 87.695801 6.209565)          (xy 87.697963 6.223536)          (xy 87.699442 6.237867)
-          (xy 87.700049 6.247621)          (xy 87.700352 6.257536)          (xy 87.70039 6.262554)          (xy 87.700091 6.275686)
-          (xy 87.699192 6.288585)          (xy 87.697694 6.301248)          (xy 87.695597 6.313677)          (xy 87.692901 6.325871)
-          (xy 87.689605 6.33783)          (xy 87.685711 6.349555)          (xy 87.681217 6.361045)          (xy 87.676124 6.3723)
-          (xy 87.670432 6.38332)          (xy 87.664141 6.394106)          (xy 87.657251 6.404657)          (xy 87.649761 6.414974)
-          (xy 87.641673 6.425055)          (xy 87.632985 6.434902)          (xy 87.623698 6.444515)          (xy 87.614022 6.453713)
-          (xy 87.604105 6.462318)          (xy 87.593948 6.470329)          (xy 87.583551 6.477747)          (xy 87.572913 6.484571)
-          (xy 87.562034 6.490802)          (xy 87.550916 6.49644)          (xy 87.539556 6.501484)          (xy 87.527957 6.505935)
-          (xy 87.516117 6.509792)          (xy 87.504036 6.513056)          (xy 87.491715 6.515727)          (xy 87.479154 6.517804)
-          (xy 87.466352 6.519287)          (xy 87.45331 6.520177)          (xy 87.440027 6.520474)          (xy 87.426868 6.520177)
-          (xy 87.413951 6.519287)          (xy 87.401276 6.517804)          (xy 87.388843 6.515727)          (xy 87.376653 6.513056)
-          (xy 87.364705 6.509792)          (xy 87.353 6.505935)          (xy 87.341536 6.501484)          (xy 87.330316 6.49644)
-          (xy 87.319337 6.490802)          (xy 87.308601 6.484571)          (xy 87.298107 6.477747)          (xy 87.287856 6.470329)
-          (xy 87.277846 6.462318)          (xy 87.268079 6.453713)          (xy 87.258555 6.444515)          (xy 87.249445 6.434898)
-          (xy 87.240924 6.42504)          (xy 87.23299 6.414939)          (xy 87.225643 6.404596)          (xy 87.218885 6.394011)
-          (xy 87.212714 6.383183)          (xy 87.20713 6.372113)          (xy 87.202135 6.3608)          (xy 87.197727 6.349245)
-          (xy 87.193907 6.337448)          (xy 87.190675 6.325409)          (xy 87.18803 6.313127)          (xy 87.185973 6.300603)
-          (xy 87.184504 6.287837)          (xy 87.183622 6.274828)          (xy 87.183328 6.261577)          (xy 87.183356 6.260111)
-          (xy 87.251228 6.260111)          (xy 87.251443 6.270304)          (xy 87.25209 6.280307)          (xy 87.253168 6.290119)
-          (xy 87.255594 6.304478)          (xy 87.25899 6.318409)          (xy 87.263356 6.33191)          (xy 87.268693 6.344982)
-          (xy 87.275 6.357624)          (xy 87.282277 6.369837)          (xy 87.290525 6.381621)          (xy 87.299742 6.392975)
-          (xy 87.306427 6.400307)          (xy 87.313449 6.407287)          (xy 87.324325 6.416912)          (xy 87.335614 6.425525)
-          (xy 87.347314 6.433124)          (xy 87.359427 6.43971)          (xy 87.371952 6.445283)          (xy 87.38489 6.449842)
-          (xy 87.398239 6.453388)          (xy 87.412001 6.455921)          (xy 87.426174 6.457441)          (xy 87.44076 6.457948)
-          (xy 87.45065 6.457723)          (xy 87.465134 6.456541)          (xy 87.479198 6.454345)          (xy 87.492841 6.451137)
-          (xy 87.506063 6.446915)          (xy 87.518864 6.44168)          (xy 87.531244 6.435432)          (xy 87.543204 6.42817)
-          (xy 87.554743 6.419896)          (xy 87.565862 6.410608)          (xy 87.57304 6.403853)          (xy 87.576559 6.400307)
-          (xy 87.583332 6.392981)          (xy 87.589668 6.385476)          (xy 87.598353 6.373883)          (xy 87.606054 6.361886)
-          (xy 87.612773 6.349485)          (xy 87.618508 6.336681)          (xy 87.62326 6.323474)          (xy 87.627029 6.309862)
-          (xy 87.629814 6.295847)          (xy 87.631617 6.281429)          (xy 87.632272 6.271592)          (xy 87.632491 6.261577)
-          (xy 87.632268 6.251624)          (xy 87.631598 6.241854)          (xy 87.629756 6.227543)          (xy 87.626909 6.213644)
-          (xy 87.623058 6.200157)          (xy 87.618203 6.187083)          (xy 87.612342 6.17442)          (xy 87.605477 6.16217)
-          (xy 87.597607 6.150332)          (xy 87.588733 6.138906)          (xy 87.582259 6.131517)          (xy 87.575338 6.124312)
-          (xy 87.568139 6.117391)          (xy 87.560767 6.110917)          (xy 87.549389 6.102043)          (xy 87.537623 6.094173)
-          (xy 87.525472 6.087308)          (xy 87.512934 6.081448)          (xy 87.50001 6.076592)          (xy 87.486699 6.072741)
-          (xy 87.473002 6.069894)          (xy 87.458918 6.068052)          (xy 87.444448 6.067215)          (xy 87.439539 6.067159)
-          (xy 87.429742 6.067378)          (xy 87.415406 6.068525)          (xy 87.401498 6.070655)          (xy 87.38802 6.073768)
-          (xy 87.374971 6.077865)          (xy 87.362352 6.082945)          (xy 87.350161 6.089008)          (xy 87.3384 6.096054)
-          (xy 87.327069 6.104083)          (xy 87.316167 6.113095)          (xy 87.305694 6.123091)          (xy 87.29596 6.133799)
-          (xy 87.287184 6.14495)          (xy 87.279365 6.156542)          (xy 87.272504 6.168577)          (xy 87.266599 6.181054)
-          (xy 87.261653 6.193974)          (xy 87.257664 6.207335)          (xy 87.254632 6.221139)          (xy 87.252557 6.235385)
-          (xy 87.251706 6.245128)          (xy 87.251281 6.255068)          (xy 87.251228 6.260111)          (xy 87.183356 6.260111)
-          (xy 87.18353 6.250932)          (xy 87.184137 6.240402)          (xy 87.185149 6.229985)          (xy 87.186564 6.219681)
-          (xy 87.188385 6.209491)          (xy 87.19061 6.199415)          (xy 87.193239 6.189452)          (xy 87.196273 6.179603)
-          (xy 87.199712 6.169867)          (xy 87.203555 6.160244)          (xy 87.207802 6.150736)          (xy 87.212454 6.14134)
-          (xy 87.217511 6.132059)          (xy 87.222972 6.122891)          (xy 87.228837 6.113836)          (xy 87.235108 6.104895)
-          (xy 87.241782 6.096067)          (xy 87.248862 6.087353)          (xy 87.256345 6.078753)          (xy 87.264234 6.070266)
-          (xy 87.272526 6.061892)          (xy 87.281224 6.053632)          (xy 87.290326 6.045486)          (xy 87.299832 6.037453)
-          (xy 87.309743 6.029534)          (xy 87.320058 6.021728)          (xy 87.330778 6.014036)          (xy 87.341903 6.006457)
-          (xy 87.353432 5.998992)          (xy 87.365365 5.991641)          (xy 87.377704 5.984402)          (xy 87.390446 5.977278)
-          (xy 87.403494 5.970306)          (xy 87.416748 5.963555)          (xy 87.430208 5.957025)          (xy 87.443874 5.950717)
-          (xy 87.457746 5.94463)          (xy 87.471825 5.938764)          (xy 87.486109 5.93312)          (xy 87.5006 5.927697)
-          (xy 87.515296 5.922495)          (xy 87.530199 5.917515)          (xy 87.545308 5.912756)          (xy 87.560622 5.908218)
-          (xy 87.576143 5.903902)          (xy 87.59187 5.899807)          (xy 87.607803 5.895934)          (xy 87.623942 5.892281)
-          (xy 87.640287 5.888851)          (xy 87.656839 5.885641)          (xy 87.673596 5.882653)          (xy 87.69056 5.879886)
-          (xy 87.707729 5.877341)          (xy 87.725105 5.875017)          (xy 87.742686 5.872914)          (xy 87.760474 5.871032)
-          (xy 87.778468 5.869372)          (xy 87.796668 5.867933)          (xy 87.815074 5.866716)          (xy 87.833686 5.86572)
-          (xy 87.852504 5.864945)          (xy 87.871528 5.864392)          (xy 87.890759 5.86406)          (xy 87.910195 5.863949)
-        )
-      )
-    )
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (start 33.02 76.2) (end 55.88 78.74) (layer "F.SilkS") (tstamp fe318c2f-59b7-4360-ab2c-33e18a3dbd5c)
-    (effects (font (size 1 1) (thickness 0.1)) (justify right top mirror))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (pts
-      (xy 81.6335 93.955281)      (xy 58.995972 97.136778)      (xy 58.642472 94.621498)      (xy 81.28 91.44)
-    )
-    (angle 188) (layer "F.SilkS") (tstamp 51b2d208-7c09-4cd1-9949-746d68c5bd7f)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
-    (pts
-      (xy 60.433949 83.293949)      (xy 76.59841 67.129488)      (xy 78.394461 68.925539)      (xy 62.23 85.09)
-    )
-    (angle 45) (layer "F.SilkS") (tstamp de4ab058-9f00-491e-af02-d7f3141c07c1)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-  (fp_text_box locked "locked"
-    (start 7.62 66.04) (end 30.48 68.58) (layer "F.SilkS") (tstamp 05c2c330-50fb-44ff-8350-688ca4c39be3)
-    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
-    (stroke (width 0.1) (type solid))
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_textKnockout b/tests/testdata/footprint/since_v7/test_textKnockout
deleted file mode 100644
index b6a8e9f..0000000
--- a/tests/testdata/footprint/since_v7/test_textKnockout
+++ /dev/null
@@ -1,15 +0,0 @@
-(footprint "CP_Elec_3x5.4" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 65bd7f8d)
-  (descr "SMD capacitor, aluminum electrolytic, Nichicon, 3.0x5.4mm")
-  (tags "capacitor electrolytic")
-  (attr smd)
-  (fp_text reference "REF**" (at 0 -2.7) (layer "F.SilkS" knockout)
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 44d2ce4a-f555-443e-872b-4f08845b4e47)
-  )
-  (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
-    (effects (font (size 0.6 0.6) (thickness 0.09)))
-    (tstamp b78f3199-5a9c-4fe8-bce1-484a2ec30068)
-  )
-)
diff --git a/tests/testdata/footprint/since_v7/test_textsWithRenderCaches b/tests/testdata/footprint/since_v7/test_textsWithRenderCaches
deleted file mode 100644
index 7dea980..0000000
--- a/tests/testdata/footprint/since_v7/test_textsWithRenderCaches
+++ /dev/null
@@ -1,61 +0,0 @@
-(footprint "a footprint" (version 20221018) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 641e2f5a)
-  (attr smd)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.1)))
-    (tstamp 39612553-f75d-48ef-a666-bc78242caa79)
-  )
-  (fp_text user "kiutils" (at 0 7.62 unlocked) (layer "F.SilkS")
-    (effects (font (face "Castellar") (size 1 1) (thickness 0.1)) (justify left bottom))
-    (tstamp ae264a1b-4ca8-442a-b9d6-22029292138f)
-    (render_cache "kiutils" 0
-      (polygon
-        (pts
-          (xy 0.352077 7.397931)          (xy 0.353925 7.410487)          (xy 0.354396 7.413363)          (xy 0.531716 7.45)
-          (xy 0.017096 7.45)          (xy 0.173168 7.41605)          (xy 0.174699 7.405317)          (xy 0.176179 7.394185)
-          (xy 0.182805 7.332537)          (xy 0.183975 7.319009)          (xy 0.185095 7.305082)          (xy 0.186162 7.290756)
-          (xy 0.19837 7.023551)          (xy 0.198491 7.011627)          (xy 0.198557 6.999944)          (xy 0.198569 6.992288)
-          (xy 0.17957 6.49273)          (xy 0.178541 6.486217)          (xy 0.154864 6.480844)          (xy 0.216399 6.480844)
-          (xy 0.154864 6.480844)          (xy 0.017096 6.449581)          (xy 0.533182 6.449581)
-        )
-      )
-      (polygon
-        (pts
-          (xy 1.312601 6.480844)          (xy 1.371667 6.480844)          (xy 1.371667 7.418736)          (xy 1.419783 7.418736)
-          (xy 1.419783 6.480844)          (xy 1.371667 6.480844)          (xy 1.312601 6.480844)          (xy 1.162107 6.449581)
-          (xy 1.681612 6.449581)
-        )
-      )
-      (polygon
-        (pts
-          (xy 1.930006 7.137613)          (xy 1.930006 6.465212)          (xy 1.881891 6.465212)          (xy 1.757473 6.465212)
-          (xy 1.701884 6.45642)          (xy 1.701884 6.449581)          (xy 2.202581 6.449581)
-        )
-      )
-    )
-  )
-  (fp_text_box "Nice\n"
-    (start 0 10.16) (end 10.16 7.62) (layer "F.SilkS") (tstamp a32718d7-06ea-404e-852f-6d57a686862d)
-    (effects (font (face "Cascadia Mono") (size 2 2)))
-    (stroke (width 0.1) (type solid))
-    (render_cache "Nice" 0
-      (polygon
-        (pts
-          (xy 2.900377 10.05)          (xy 2.296121 8.57575)          (xy 2.169603 8.57575)          (xy 2.169603 8.111688)
-          (xy 2.350831 8.111688)          (xy 2.955576 9.585938)          (xy 3.023964 9.585938)          (xy 3.023964 10.05)
-        )
-      )
-      (polygon
-        (pts
-          (xy 4.479163 10.05)          (xy 4.479163 9.807711)          (xy 4.95446 9.807711)          (xy 4.95446 10.05)
-        )
-      )
-      (polygon
-        (pts
-          (xy 3.743015 8.822923)          (xy 3.743015 8.580635)          (xy 4.507007 8.580635)          (xy 4.507007 8.822923)
-        )
-      )
-    )
-  )
-)
diff --git a/tests/testdata/footprint/test_3dModelHideProperty b/tests/testdata/footprint/test_3dModelHideProperty
deleted file mode 100644
index 54b5136..0000000
--- a/tests/testdata/footprint/test_3dModelHideProperty
+++ /dev/null
@@ -1,9 +0,0 @@
-(footprint "test"
-  (layer "F.Cu")
-  (tedit 64b312a4)
-  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl" hide
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/footprint/test_allFootprintItems b/tests/testdata/footprint/test_allFootprintItems
deleted file mode 100644
index 6ba4a18..0000000
--- a/tests/testdata/footprint/test_allFootprintItems
+++ /dev/null
@@ -1,149 +0,0 @@
-(footprint "test" (version 20211014) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 621D235F)
-  (attr smd)
-  (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
-  )
-  (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp c58960d9-4cac-4036-ad2e-1aef26946dae)
-  )
-  (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu") hide
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-    (tstamp 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
-  )
-  (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp ec9e24d8-d1c5-40e2-9812-dc315d05f470)
-  )
-  (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
-  )
-  (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 53c85970-3e21-4fae-a84f-721cfc0513b5)
-  )
-  (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
-  )
-  (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (tstamp 003c2200-0632-4808-a662-8ddd5d30c768))
-  (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (tstamp 6ff874d0-4ac5-414c-83a7-573eda4c7703))
-  (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (tstamp be0953c0-632d-4dd2-85e9-4d41239f22d2))
-  (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 7f3eb118-a20c-4239-b800-c9211c66847d))
-  (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (tstamp 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
-  (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (tstamp fc0a4225-db46-4d48-8163-d522602d57cd))
-  (fp_poly (pts
-      (xy 8.4 14.95)
-      (xy 1.15 14.95)
-      (xy 1.15 6.7)
-      (xy 1.9 6.7)
-      (xy 8.4 0.2)
-    ) (layer "F.SilkS") (width 0.12) (fill solid) (tstamp f6ee98b5-4773-4eeb-a825-33c1705abace))
-  (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (tstamp 127679a9-3981-4934-815e-896a4e3ff56e))
-  (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
-  (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
-  (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 0520f61d-4522-4301-a3fa-8ed0bf060f69))
-  (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 0f560957-a8c5-442f-b20c-c2d88613742c))
-  (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
-  (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
-  (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
-  (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
-  (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
-  (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
-  (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
-  (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
-  (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp c43663ee-9a0d-4f27-a292-89ba89964065))
-  (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp c67ad10d-2f75-4ec6-a139-47058f7f06b2))
-  (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
-    (die_length 1) (tstamp 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
-  (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
-    (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
-    (options (clearance convexhull) (anchor circle))
-    (primitives
-      (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
-      (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
-      (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
-      (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
-      (gr_poly (pts
-          (xy 12.8 4.2)
-          (xy 8.2 8.8)
-          (xy 3.8 4.4)
-          (xy 8.4 -0.2)
-        ) (width 0.2) (fill yes))
-  (gr_arc (start 6.4 0.2) (mid 6.596181 -0.790785) (end 7.155119 -1.632052) (width 0.2))
-          (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
-          (gr_poly (pts
-          (xy -0.6 2.8)
-          (xy -1.8 4)
-          (xy -6.4 4)
-          (xy -6.4 1)
-          (xy -0.6 1)
-        ) (width 0.2) (fill yes))
-          (gr_poly (pts
-          (xy 0.870847 -0.746121)
-          (xy 0.983248 -0.691178)
-          (xy 1.071791 -0.602789)
-          (xy 1.12693 -0.490484)
-          (xy 1.143 -0.381)
-          (xy 1.143 0.381)
-          (xy 1.127121 0.489847)
-          (xy 1.072178 0.602248)
-          (xy 0.983789 0.690791)
-          (xy 0.871484 0.74593)
-          (xy 0.762 0.762)
-          (xy -0.762 0.762)
-          (xy -0.870847 0.746121)
-          (xy -0.983248 0.691178)
-          (xy -1.071791 0.602789)
-          (xy -1.12693 0.490484)
-          (xy -1.143 0.381)
-          (xy -1.143 -0.381)
-          (xy -1.127121 -0.489847)
-          (xy -1.072178 -0.602248)
-          (xy -0.983789 -0.690791)
-          (xy -0.871484 -0.74593)
-          (xy -0.762 -0.762)
-          (xy 0.762 -0.762)
-        ) (width 0) (fill yes))
-    ) (tstamp d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
-  (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
-    (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
-    (die_length 15) (tstamp e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
-  (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
-  (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
-    (connect_pads (clearance 0))
-    (min_thickness 0.254)
-    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
-    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-    (polygon
-      (pts
-        (xy 49.6 11)
-        (xy 36.8 12.2)
-        (xy 36.8 -1.8)
-      )
-    )
-  )
-  (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
-    (members
-      7f3eb118-a20c-4239-b800-c9211c66847d
-      f6ee98b5-4773-4eeb-a825-33c1705abace
-    )
-  )
-)
diff --git a/tests/testdata/footprint/test_allFootprintItems.expected b/tests/testdata/footprint/test_allFootprintItems.expected
deleted file mode 100644
index 383e6f5..0000000
--- a/tests/testdata/footprint/test_allFootprintItems.expected
+++ /dev/null
@@ -1,149 +0,0 @@
-(footprint "test" (version 20211014) (generator pcbnew)
-  (layer "F.Cu")
-  (tedit 621D235F)
-  (attr smd)
-  (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
-  )
-  (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp c58960d9-4cac-4036-ad2e-1aef26946dae)
-  )
-  (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu") hide
-    (effects (font (size 1.5 1.5) (thickness 0.3)))
-    (tstamp 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
-  )
-  (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp ec9e24d8-d1c5-40e2-9812-dc315d05f470)
-  )
-  (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
-  )
-  (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 53c85970-3e21-4fae-a84f-721cfc0513b5)
-  )
-  (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-    (tstamp 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
-  )
-  (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (tstamp 003c2200-0632-4808-a662-8ddd5d30c768))
-  (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (tstamp 6ff874d0-4ac5-414c-83a7-573eda4c7703))
-  (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (tstamp be0953c0-632d-4dd2-85e9-4d41239f22d2))
-  (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 7f3eb118-a20c-4239-b800-c9211c66847d))
-  (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (tstamp 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
-  (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (tstamp fc0a4225-db46-4d48-8163-d522602d57cd))
-  (fp_poly (pts
-      (xy 8.4 14.95)
-      (xy 1.15 14.95)
-      (xy 1.15 6.7)
-      (xy 1.9 6.7)
-      (xy 8.4 0.2)
-    ) (layer "F.SilkS") (width 0.12) (fill solid) (tstamp f6ee98b5-4773-4eeb-a825-33c1705abace))
-  (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (tstamp 127679a9-3981-4934-815e-896a4e3ff56e))
-  (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
-  (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
-  (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 0520f61d-4522-4301-a3fa-8ed0bf060f69))
-  (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 0f560957-a8c5-442f-b20c-c2d88613742c))
-  (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
-  (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
-  (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
-  (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
-  (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
-  (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
-  (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
-  (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
-  (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (die_length 21) (tstamp c43663ee-9a0d-4f27-a292-89ba89964065))
-  (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
-    (die_length 21) (tstamp c67ad10d-2f75-4ec6-a139-47058f7f06b2))
-  (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
-    (die_length 1) (tstamp 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
-  (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
-    (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
-    (options (clearance convexhull) (anchor circle))
-    (primitives
-      (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
-      (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
-      (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
-      (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
-      (gr_poly (pts
-          (xy 12.8 4.2)
-          (xy 8.2 8.8)
-          (xy 3.8 4.4)
-          (xy 8.4 -0.2)
-        ) (width 0.2) (fill yes))
-      (gr_arc (start 6.4 0.2) (mid 6.596181 -0.790785) (end 7.155119 -1.632052) (width 0.2))
-      (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
-      (gr_poly (pts
-          (xy -0.6 2.8)
-          (xy -1.8 4)
-          (xy -6.4 4)
-          (xy -6.4 1)
-          (xy -0.6 1)
-        ) (width 0.2) (fill yes))
-      (gr_poly (pts
-          (xy 0.870847 -0.746121)
-          (xy 0.983248 -0.691178)
-          (xy 1.071791 -0.602789)
-          (xy 1.12693 -0.490484)
-          (xy 1.143 -0.381)
-          (xy 1.143 0.381)
-          (xy 1.127121 0.489847)
-          (xy 1.072178 0.602248)
-          (xy 0.983789 0.690791)
-          (xy 0.871484 0.74593)
-          (xy 0.762 0.762)
-          (xy -0.762 0.762)
-          (xy -0.870847 0.746121)
-          (xy -0.983248 0.691178)
-          (xy -1.071791 0.602789)
-          (xy -1.12693 0.490484)
-          (xy -1.143 0.381)
-          (xy -1.143 -0.381)
-          (xy -1.127121 -0.489847)
-          (xy -1.072178 -0.602248)
-          (xy -0.983789 -0.690791)
-          (xy -0.871484 -0.74593)
-          (xy -0.762 -0.762)
-          (xy 0.762 -0.762)
-        ) (width 0) (fill yes))
-    ) (tstamp d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
-  (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
-    (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
-    (die_length 15) (tstamp e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
-  (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (tstamp 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
-  (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
-    (connect_pads (clearance 0))
-    (min_thickness 0.254)
-    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
-    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
-    (polygon
-      (pts
-        (xy 49.6 11)
-        (xy 36.8 12.2)
-        (xy 36.8 -1.8)
-      )
-    )
-  )
-  (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
-    (members
-      7f3eb118-a20c-4239-b800-c9211c66847d
-      f6ee98b5-4773-4eeb-a825-33c1705abace
-    )
-  )
-)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeOther b/tests/testdata/footprint/test_createNewFootprintTypeOther
deleted file mode 100644
index e45fc46..0000000
--- a/tests/testdata/footprint/test_createNewFootprintTypeOther
+++ /dev/null
@@ -1,13 +0,0 @@
-(footprint "empty-footprint-other" (version 20211014) (generator kiutils)
-  (layer "F.Cu")
-  (tedit 6328916A)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text value "empty-footprint-other" (at 0 1 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeSMD b/tests/testdata/footprint/test_createNewFootprintTypeSMD
deleted file mode 100644
index d5c7da8..0000000
--- a/tests/testdata/footprint/test_createNewFootprintTypeSMD
+++ /dev/null
@@ -1,14 +0,0 @@
-(footprint "empty-footprint-smd" (version 20211014) (generator kiutils)
-  (layer "F.Cu")
-  (tedit 6328915F)
-  (attr smd)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text value "empty-footprint-smd" (at 0 1 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeTHT b/tests/testdata/footprint/test_createNewFootprintTypeTHT
deleted file mode 100644
index 5552cb7..0000000
--- a/tests/testdata/footprint/test_createNewFootprintTypeTHT
+++ /dev/null
@@ -1,14 +0,0 @@
-(footprint "empty-footprint-through_hole" (version 20211014) (generator kiutils)
-  (layer "F.Cu")
-  (tedit 63289145)
-  (attr through_hole)
-  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text value "empty-footprint-through_hole" (at 0 1 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
-    (effects (font (size 1.0 1.0) (thickness 0.15)))
-  )
-)
diff --git a/tests/testdata/footprint/test_footprintEmptyAttributes b/tests/testdata/footprint/test_footprintEmptyAttributes
deleted file mode 100644
index 6352be1..0000000
--- a/tests/testdata/footprint/test_footprintEmptyAttributes
+++ /dev/null
@@ -1,19 +0,0 @@
-(footprint "Battery_CR1225"
-  (layer "F.Cu")
-  (tedit 5B93F51B)
-  (descr "CR1225 battery")
-  (tags "battery CR1225 coin cell")
-  (attr)
-  (fp_text reference "REF**" (at 0 -1) (layer "F.SilkS") hide
-    (effects (font (size 1 1) (thickness 0.15)))
-  )
-  (fp_text value "Battery_CR1225" (at 0 0.5) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-  )
-  (fp_circle (center 0 0) (end 6.25 0) (layer "F.Fab") (width 0.1))
-  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/footprint/test_footprintEmptyAttributes.expected b/tests/testdata/footprint/test_footprintEmptyAttributes.expected
deleted file mode 100644
index 61c050f..0000000
--- a/tests/testdata/footprint/test_footprintEmptyAttributes.expected
+++ /dev/null
@@ -1,18 +0,0 @@
-(footprint "Battery_CR1225"
-  (layer "F.Cu")
-  (tedit 5B93F51B)
-  (descr "CR1225 battery")
-  (tags "battery CR1225 coin cell")
-  (fp_text reference "REF**" (at 0 -1) (layer "F.SilkS") hide
-    (effects (font (size 1 1) (thickness 0.15)))
-  )
-  (fp_text value "Battery_CR1225" (at 0 0.5) (layer "F.Fab")
-    (effects (font (size 1 1) (thickness 0.15)))
-  )
-  (fp_circle (center 0 0) (end 6.25 0) (layer "F.Fab") (width 0.1))
-  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/footprint/test_footprintPadNewLines b/tests/testdata/footprint/test_footprintPadNewLines
deleted file mode 100644
index e10b428..0000000
--- a/tests/testdata/footprint/test_footprintPadNewLines
+++ /dev/null
@@ -1,97 +0,0 @@
-(footprint "hSOC_DFN_QFN:QFN-20_EP_4x4_Pitch0.5mm"
-  (layer "F.Cu")
-  (tedit 62B45F33) (tstamp 1cdb27c8-e9b7-413d-a6e6-8ef8360142f4)
-  (at 179.5 112.02 90)
-  (property "Hersteller" "Texas Instruments")
-  (path "/734873a3-b8ea-4cad-829d-8172e8b13cae/5e792133-030d-439a-b4b8-8e56d81fd968")
-  (attr smd)
-  (fp_text reference "IC503" (at 0 -3.5 90) (layer "F.SilkS") hide
-    (effects (font (size 0.75 0.6) (thickness 0.12)))
-    (tstamp 2780c17a-23cc-4d6f-be7e-01bb3e085eb8)
-  )
-  (fp_text value "TPS386000" (at 0 3.5 90) (layer "F.Fab") hide
-    (effects (font (size 0.75 0.6) (thickness 0.12)))
-    (tstamp aa57c053-4d35-4346-a3d7-4a863d13e85d)
-  )
-  (fp_text user "${REFERENCE}" (at 4.72 -0.85 unlocked) (layer "F.Fab")
-    (effects (font (size 0.75 0.6) (thickness 0.12)))
-    (tstamp 02a37157-7ae3-4605-983d-fe3e3c753836)
-  )
-  (fp_line (start -1.5 2.15) (end -2.15 2.15) (layer "F.SilkS") (width 0.12) (tstamp 4c6c330c-cc6b-4d8d-abd2-3c1da6527c9c))
-  (fp_line (start 2.15 2.15) (end 2.15 1.5) (layer "F.SilkS") (width 0.12) (tstamp 7e026e92-de50-4cc6-90ab-760ef28ab9f4))
-  (fp_line (start 1.5 -2.15) (end 2.15 -2.15) (layer "F.SilkS") (width 0.12) (tstamp 81b0d9d3-c407-4a3b-8d34-e3e1776be096))
-  (fp_line (start -2.15 2.15) (end -2.15 1.5) (layer "F.SilkS") (width 0.12) (tstamp c6b0c515-b1d7-4924-8d81-21bd17dd19bf))
-  (fp_line (start 2.15 -2.15) (end 2.15 -1.5) (layer "F.SilkS") (width 0.12) (tstamp cdecef17-5c1f-4a1b-ae1b-8cb458520405))
-  (fp_line (start 1.5 2.15) (end 2.15 2.15) (layer "F.SilkS") (width 0.12) (tstamp e5695963-1995-40f2-a447-1a0682028cef))
-  (fp_circle (center -2.25 -2.25) (end -2.25 -2.15) (layer "F.SilkS") (width 0.2) (fill none) (tstamp 402b0611-75e2-4922-87d8-1fc09aa060e9))
-  (fp_line (start 2.5 2.5) (end -2.5 2.5) (layer "F.CrtYd") (width 0.05) (tstamp 12f325c5-b623-4cff-b8a0-015d34e040dd))
-  (fp_line (start 2.5 -2.5) (end 2.5 2.5) (layer "F.CrtYd") (width 0.05) (tstamp 3a9cc810-76e7-454b-8c0e-7e87c4bc2be9))
-  (fp_line (start -2.5 -2.5) (end 2.5 -2.5) (layer "F.CrtYd") (width 0.05) (tstamp 85e0f304-8795-4d48-a2db-186f7193f03b))
-  (fp_line (start -2.5 2.5) (end -2.5 -2.5) (layer "F.CrtYd") (width 0.05) (tstamp aa931d1e-996d-4e9c-81e8-51f27dfe7349))
-  (fp_line (start 2 2) (end 2 -2) (layer "F.Fab") (width 0.12) (tstamp 0e07c34a-af7b-4a69-96e5-048192852585))
-  (fp_line (start -2 -1) (end -2 2) (layer "F.Fab") (width 0.12) (tstamp 41d7c7cb-e379-47e8-8fce-d65178cef7b7))
-  (fp_line (start -2 2) (end 2 2) (layer "F.Fab") (width 0.12) (tstamp 5334bde5-08dc-4e10-b149-3f61f513611e))
-  (fp_line (start 2 -2) (end -1 -2) (layer "F.Fab") (width 0.12) (tstamp c0b6e338-5160-4e09-a222-1ba04797ad2d))
-  (fp_poly (pts
-      (xy -2 -1)
-      (xy -2 -2)
-      (xy -1 -2)
-    ) (layer "F.Fab") (width 0.12) (fill solid) (tstamp 08af2f41-e64a-465c-8644-5d4990d4c603))
-  (pad "1" smd roundrect (at -1.9 -1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 109 "/FPGA System/~{SV_MR}") (pinfunction "~{MR}") (pintype "input") (tstamp 48f7e780-702d-4e86-bd97-a9b42f164b68))
-  (pad "2" smd roundrect (at -1.9 -0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 508 "unconnected-(IC503-Pad2)") (pinfunction "CT4") (pintype "passive+no_connect") (tstamp c2ce275a-6e6e-4177-9ad1-b577b29e6538))
-  (pad "3" smd roundrect (at -1.9 0 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 131 "/FPGA System/SV_CT3") (pinfunction "CT3") (pintype "passive") (tstamp 2628d390-7145-4f38-9907-6302f37a7a59))
-  (pad "4" smd roundrect (at -1.9 0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 133 "/FPGA System/SV_CT2") (pinfunction "CT2") (pintype "passive") (tstamp 9dd16ffd-6e3f-45f7-9c64-78e09a9df256))
-  (pad "5" smd roundrect (at -1.9 1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 134 "/FPGA System/SV_CT1") (pinfunction "CT1") (pintype "passive") (tstamp aa4de06a-4af6-4151-b3a9-7b59240efd38))
-  (pad "6" smd roundrect (at -1 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 1 "GND") (pinfunction "SENSE4H") (pintype "passive") (tstamp b41fe68d-681f-4666-bc7c-41900a5b075d))
-  (pad "7" smd roundrect (at -0.5 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 1 "GND") (pinfunction "SENSE4L") (pintype "passive") (tstamp c5e74868-a1ed-4e70-90cb-81414aa15b1d))
-  (pad "8" smd roundrect (at 0 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 106 "/FPGA System/SV_SENSE3") (pinfunction "SENSE3") (pintype "passive") (tstamp e663486f-625f-4ea0-9b01-655c199f19a0))
-  (pad "9" smd roundrect (at 0.5 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 107 "/FPGA System/SV_SENSE2") (pinfunction "SENSE2") (pintype "passive") (tstamp 3c5722ad-5f46-4ba5-b8a0-e88aada335f3))
-  (pad "10" smd roundrect (at 1 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 108 "/FPGA System/SV_SENSE1") (pinfunction "SENSE1") (pintype "passive") (tstamp e7207ed6-3f23-4ca0-ac46-eda1b2a0f97d))
-  (pad "11" smd roundrect (at 1.9 1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 509 "unconnected-(IC503-Pad11)") (pinfunction "NC") (pintype "no_connect") (tstamp 13f736b7-ba74-478a-80d1-43514a0ffaef))
-  (pad "12" smd roundrect (at 1.9 0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 1 "GND") (pinfunction "GND") (pintype "power_in") (tstamp cd8c90d6-073d-47ab-944a-b04517abadcf))
-  (pad "13" smd roundrect (at 1.9 0 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 510 "unconnected-(IC503-Pad13)") (pinfunction "VREF") (pintype "power_in+no_connect") (tstamp ea4cf986-f7f5-42af-b371-4604d1a85402))
-  (pad "14" smd roundrect (at 1.9 -0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 10 "+3V3") (pinfunction "VDD") (pintype "power_in") (tstamp e9df98de-f561-4f41-88e1-d806ba3aeee8))
-  (pad "15" smd roundrect (at 1.9 -1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET1}") (pintype "open_collector") (tstamp ff9eae3c-1036-460c-8cf8-102ddc01be13))
-  (pad "16" smd roundrect (at 1 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET2}") (pintype "open_collector") (tstamp e0e93dc1-fd0b-46c3-87e5-3c3527e296bf))
-  (pad "17" smd roundrect (at 0.5 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET3}") (pintype "open_collector") (tstamp 27d3145d-fe13-499a-a7f5-b5f720e42fc2))
-  (pad "18" smd roundrect (at 0 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 511 "unconnected-(IC503-Pad18)") (pinfunction "~{RESET4}") (pintype "open_collector+no_connect") (tstamp c296457d-ee5b-4878-8ac9-4dfa25752d0b))
-  (pad "19" smd roundrect (at -0.5 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 512 "unconnected-(IC503-Pad19)") (pinfunction "~{WDO}") (pintype "open_collector+no_connect") (tstamp 421fca03-6322-43b9-9cd9-c4997ec6a38f))
-  (pad "20" smd roundrect (at -1 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
-    (net 280 "/FPGA System/SV_WDI") (pinfunction "WDI") (pintype "input") (tstamp 9eb656d2-148d-4e86-a5da-e1697ce150e6))
-  (pad "21" thru_hole circle (at 0.8 -0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (tstamp 1a4095c5-2a67-4704-8748-b9d0d44454eb))
-  (pad "21" thru_hole circle (at 0.8 0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (tstamp 1f162824-4818-4d22-86ef-f9972403692b))
-  (pad "21" thru_hole circle (at 0 0 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (tstamp 604fe231-a5fb-4924-800d-f92df3406afd))
-  (pad "21" thru_hole circle (at -0.8 0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (tstamp 9f4fad38-be4f-4d87-9302-8387474f9268))
-  (pad "21" thru_hole circle (at -0.8 -0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (tstamp c2df6d65-2a91-48e3-9326-b921c414dfd0))
-  (pad "21" smd rect (at 0 0 90) (size 2.15 2.15) (layers "F.Cu" "F.Paste" "F.Mask")
-    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (solder_paste_margin_ratio -0.1) (tstamp fad97280-7d2a-4a8f-8388-0c1f39d99017))
-  (model "${KIPRJMOD}/hil-kicad-libraries/3dmodels/Package_DFN_QFN.3dshapes/QFN-20-1EP_4x4mm_P0.5mm_EP2.5x2.5mm.wrl"
-    (offset (xyz 0 0 0))
-    (scale (xyz 1 1 1))
-    (rotate (xyz 0 0 0))
-  )
-)
diff --git a/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected b/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected
deleted file mode 100644
index 2e18c26..0000000
--- a/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-(fp_lib_table
-  (lib (name "")(type "KiCad")(uri "")(options "")(descr ""))
-)
diff --git a/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected b/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected
deleted file mode 100644
index 5e2e569..0000000
--- a/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-(fp_lib_table
-  (lib (name "object1")(type "KiCad")(uri "${KIPRJMOD}/my/library.pretty")(options "Some options with \"quoted strings\"")(descr "Some description with \"quoted strings\"")(disabled))
-)
diff --git a/tests/testdata/libtable/test_createNewLibTable b/tests/testdata/libtable/test_createNewLibTable
deleted file mode 100644
index 9c00ee7..0000000
--- a/tests/testdata/libtable/test_createNewLibTable
+++ /dev/null
@@ -1,2 +0,0 @@
-(sym_lib_table
-)
diff --git a/tests/testdata/libtable/test_parseFpLibTable.expected b/tests/testdata/libtable/test_parseFpLibTable.expected
deleted file mode 100644
index dce3003..0000000
--- a/tests/testdata/libtable/test_parseFpLibTable.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-(fp_lib_table
-  (lib (name "vn-mcu-own-footprints")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-ownlibs/vn-mcu-own-footprints.pretty")(options "")(descr ""))
-  (lib (name "vn-mcu-footprints")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-librarys/vn-mcu-footprints.pretty")(options "")(descr "")(disabled))
-)
diff --git a/tests/testdata/libtable/test_parseSymLibTable.expected b/tests/testdata/libtable/test_parseSymLibTable.expected
deleted file mode 100644
index 30d435a..0000000
--- a/tests/testdata/libtable/test_parseSymLibTable.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-(sym_lib_table
-  (lib (name "vn-mcu-own")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-ownlibs/vn-mcu-own.kicad_sym")(options "")(descr "")(disabled))
-  (lib (name "vn-mcu-symbols")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-librarys/vn-mcu-symbols.kicad_sym")(options "")(descr ""))
-)
diff --git a/tests/testdata/misc/test_quotesAndBackslashInSexpr b/tests/testdata/misc/test_quotesAndBackslashInSexpr
deleted file mode 100644
index 8b13731..0000000
--- a/tests/testdata/misc/test_quotesAndBackslashInSexpr
+++ /dev/null
@@ -1,61 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "A4 \"quote\" \\")
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "SomeLayer")
-    (comment 2 "Some \"quoted\" Layer")
-    (comment 3 "Some Layer\\\")
-    (comment 4 "Some \"quoted\" Layer\\\")
-    (comment 5 "\\\\\\\\\\\\\\"\\\\\\\\\\\"")
-    (comment 6 "|\\")
-    (comment 7 "!\"§$%&/()=?`´+*~#'-_.:,;<>|")
-  )
-
-  (lib_symbols
-    (symbol "TEST"
-      (property "Normal string without quotes" "abc" (id 0) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Normal string \"with\" quotes" " " (id 1) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Normal string with \\backslashes\\" "\\" (id 2) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Normal string with \\backslashes\\ and \"quotes\" "\"" (id 3) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "|\\" "\\"\"" (id 4) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "\\\\\\\\\\\\\\"\\\\\\\\\\\"" "" (id 5) (at 0 9.525 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-
-    (symbol "TEST with \"quoted\" strings "
-    )
-
-    (symbol "TEST with \\backslashes\\"
-    )
-
-    (symbol "TEST with \"quoted\" strings and \\backslashes\\"
-    )
-
-    (symbol "|\\"
-    )
-
-    (symbol "\\\\\\\\\\"\\\\\"\\\\"\"\\\"
-    )
-
-    (symbol "!\"§$%&/()=?`´+*~#'-_.:,;<>|"
-    )
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_arcAllVariants b/tests/testdata/schematic/since_v7/test_arcAllVariants
deleted file mode 100644
index 6cb0993..0000000
--- a/tests/testdata/schematic/since_v7/test_arcAllVariants
+++ /dev/null
@@ -1,132 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid 721ffcf0-2683-45a5-82ff-f53d532e9160)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (arc (start 83.818 63.498) (mid 89.7702 49.1302) (end 104.138 43.178)
-    (stroke (width 1) (type solid) (color 255 7 109 1))
-    (fill (type none))
-    (uuid 03fb5ce1-8772-494c-8da7-c1f482601fa8)
-  )
-  (arc (start 119.378 101.598) (mid 125.3302 87.2302) (end 139.698 81.278)
-    (stroke (width 1) (type dot) (color 255 206 31 1))
-    (fill (type color) (color 27 255 171 1))
-    (uuid 0c9a4cd8-68d9-4296-bdfe-c16e3d49f0cb)
-  )
-  (arc (start 91.438 138.428) (mid 97.3902 124.0602) (end 111.758 118.108)
-    (stroke (width 1) (type dash_dot_dot) (color 255 158 28 1))
-    (fill (type none))
-    (uuid 0f1a04d7-c6d5-436f-be2a-e41d33c1bcab)
-  )
-  (arc (start 86.358 81.278) (mid 92.3102 66.9102) (end 106.678 60.958)
-    (stroke (width 1) (type dash) (color 124 16 255 1))
-    (fill (type none))
-    (uuid 12ea35b3-90af-43b5-bdbc-4591893ea5a1)
-  )
-  (arc (start 46.988 121.918) (mid 52.9402 107.5502) (end 67.308 101.598)
-    (stroke (width 0) (type dash_dot))
-    (fill (type none))
-    (uuid 2668cdeb-1f6d-450d-9aa0-ef9d1bd01954)
-  )
-  (arc (start 151.13 44.45) (mid 157.0822 30.0822) (end 171.45 24.13)
-    (stroke (width -0.0001) (type default) (color 255 76 168 1))
-    (fill (type color) (color 255 31 2 1))
-    (uuid 2e0ba40c-7440-403b-b1c8-680ce0c206a7)
-  )
-  (arc (start 152.398 120.648) (mid 158.3502 106.2802) (end 172.718 100.328)
-    (stroke (width -0.0001) (type dash_dot) (color 36 193 255 1))
-    (fill (type color) (color 255 255 36 1))
-    (uuid 402f8784-f8c7-40b2-9a3f-3dbb34008527)
-  )
-  (arc (start 118.108 121.918) (mid 124.0602 107.5502) (end 138.428 101.598)
-    (stroke (width 1) (type dash_dot) (color 36 193 255 1))
-    (fill (type color) (color 255 255 36 1))
-    (uuid 50e9bfc6-5b90-4059-89d9-a2aa9afb9535)
-  )
-  (arc (start 116.838 64.768) (mid 122.7902 50.4002) (end 137.158 44.448)
-    (stroke (width 1) (type solid) (color 255 7 109 1))
-    (fill (type color) (color 255 213 39 1))
-    (uuid 5f868c05-1d62-4f22-8a82-ad3e993d2404)
-  )
-  (arc (start 53.338 139.698) (mid 59.2902 125.3302) (end 73.658 119.378)
-    (stroke (width 0) (type dash_dot_dot))
-    (fill (type none))
-    (uuid 6adf748d-6ed9-415f-b6ba-27660de76b00)
-  )
-  (arc (start 85.088 120.648) (mid 91.0402 106.2802) (end 105.408 100.328)
-    (stroke (width 1) (type dash_dot) (color 36 193 255 1))
-    (fill (type none))
-    (uuid 71994075-b49b-4d47-95a4-88b2807b3767)
-  )
-  (arc (start 86.358 100.328) (mid 92.3102 85.9602) (end 106.678 80.008)
-    (stroke (width 1) (type dot) (color 255 206 31 1))
-    (fill (type none))
-    (uuid 749f101b-47c1-4c13-857e-a5dc34acf924)
-  )
-  (arc (start 45.718 64.768) (mid 51.6702 50.4002) (end 66.038 44.448)
-    (stroke (width 0) (type solid))
-    (fill (type none))
-    (uuid 7c9ffc2a-6cba-4fa7-8dd7-a30382ea14a2)
-  )
-  (arc (start 83.82 44.45) (mid 89.7722 30.0822) (end 104.14 24.13)
-    (stroke (width 1) (type default) (color 255 76 168 1))
-    (fill (type none))
-    (uuid 7ca3d834-6614-4786-b638-40db9ee056a6)
-  )
-  (arc (start 116.84 45.72) (mid 122.7922 31.3522) (end 137.16 25.4)
-    (stroke (width 1) (type default) (color 255 76 168 1))
-    (fill (type color) (color 255 31 2 1))
-    (uuid 85e5312f-320f-43d9-906a-275ab3297bd9)
-  )
-  (arc (start 119.378 82.548) (mid 125.3302 68.1802) (end 139.698 62.228)
-    (stroke (width 1) (type dash) (color 124 16 255 1))
-    (fill (type color) (color 38 78 255 1))
-    (uuid 8957af50-7906-4079-be4c-cb6035c19fd8)
-  )
-  (arc (start 153.668 81.278) (mid 159.6202 66.9102) (end 173.988 60.958)
-    (stroke (width -0.0001) (type dash) (color 124 16 255 1))
-    (fill (type color) (color 38 78 255 1))
-    (uuid 8d631f00-f7bd-4202-af5f-ab8f8fb88d0e)
-  )
-  (arc (start 48.258 101.598) (mid 54.2102 87.2302) (end 68.578 81.278)
-    (stroke (width 0) (type dot))
-    (fill (type none))
-    (uuid 9ffbd003-f6cf-4406-9a4a-7a44c8b2f998)
-  )
-  (arc (start 48.258 82.548) (mid 54.2102 68.1802) (end 68.578 62.228)
-    (stroke (width 0) (type dash))
-    (fill (type none))
-    (uuid ae39850f-f4b3-4bf1-a3ae-7e7b207fbb0c)
-  )
-  (arc (start 158.748 138.428) (mid 164.7002 124.0602) (end 179.068 118.108)
-    (stroke (width -0.0001) (type dash_dot_dot) (color 255 158 28 1))
-    (fill (type color) (color 35 255 55 1))
-    (uuid c22fb512-4064-4088-9906-161da3143f8f)
-  )
-  (arc (start 153.668 100.328) (mid 159.6202 85.9602) (end 173.988 80.008)
-    (stroke (width -0.0001) (type dot) (color 255 206 31 1))
-    (fill (type color) (color 27 255 171 1))
-    (uuid d4c2cc1f-f64b-4c32-abe5-4052a195fbb8)
-  )
-  (arc (start 151.128 63.498) (mid 157.0802 49.1302) (end 171.448 43.178)
-    (stroke (width -0.0001) (type solid) (color 255 7 109 1))
-    (fill (type color) (color 255 213 39 1))
-    (uuid d606a7e8-4902-4a4b-ab3c-eb64a68e4bf7)
-  )
-  (arc (start 124.458 139.698) (mid 130.4102 125.3302) (end 144.778 119.378)
-    (stroke (width 1) (type dash_dot_dot) (color 255 158 28 1))
-    (fill (type color) (color 35 255 55 1))
-    (uuid d948e413-5ab1-42be-a7fb-a998552f7fb5)
-  )
-  (arc (start 45.72 45.72) (mid 51.6722 31.3522) (end 66.04 25.4)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid f110e2d5-8caf-4210-a8b3-4a6ae67cb535)
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_busAliases b/tests/testdata/schematic/since_v7/test_busAliases
deleted file mode 100644
index f898331..0000000
--- a/tests/testdata/schematic/since_v7/test_busAliases
+++ /dev/null
@@ -1,16 +0,0 @@
-(kicad_sch (version 20230121) (generator kiutils)
-
-  (uuid 80899fed-1b75-4222-a6b3-1ed87b4e7bbb)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (bus_alias "" (members ))
-  (bus_alias "test (not empty)" (members "" "m0" "m2" "\"test\"" "!\"§$%&/()=?"))
-  (bus_alias "test (empty)" (members ))
-  (bus_alias "test (empty, \"quoted\")" (members ))
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_circleAllVariants b/tests/testdata/schematic/since_v7/test_circleAllVariants
deleted file mode 100644
index 19b2844..0000000
--- a/tests/testdata/schematic/since_v7/test_circleAllVariants
+++ /dev/null
@@ -1,92 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid 3a563ed9-b266-4375-be29-6a2d9f906b82)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (circle (center 179.07 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type dash_dot))
-    (fill (type none))
-    (uuid 10f67b74-259d-4569-bc67-523ab4b3ccf2)
-  )
-  (circle (center 80.01 40.64) (radius 14.3684)
-    (stroke (width 2) (type default))
-    (fill (type none))
-    (uuid 16d91da5-0b12-42b6-970d-ddf7b42947b3)
-  )
-  (circle (center 48.26 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type default))
-    (fill (type none))
-    (uuid 37b15c16-7542-40d6-9191-d24af787f4d6)
-  )
-  (circle (center 212.09 71.12) (radius 14.3684)
-    (stroke (width 0) (type dash_dot_dot))
-    (fill (type none))
-    (uuid 50d5af19-333f-4ad1-9ed9-ee5990ec10f6)
-  )
-  (circle (center 179.07 71.12) (radius 14.3684)
-    (stroke (width 0) (type dash_dot))
-    (fill (type none))
-    (uuid 55dd3320-e7af-4681-88c1-98593c6bf7a8)
-  )
-  (circle (center 212.09 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type dash_dot_dot))
-    (fill (type none))
-    (uuid 72af28c4-e958-4729-8288-3b7dcada1350)
-  )
-  (circle (center 80.01 71.12) (radius 14.3684)
-    (stroke (width 0) (type solid))
-    (fill (type none))
-    (uuid 74290032-e2ac-45a1-8bc5-76ed6df208f6)
-  )
-  (circle (center 48.26 71.12) (radius 14.3684)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid 7d2aae1d-18e7-4ef4-b103-4005799a43f6)
-  )
-  (circle (center 146.05 40.64) (radius 14.3684)
-    (stroke (width 2) (type default) (color 137 255 16 1))
-    (fill (type color) (color 255 243 25 1))
-    (uuid 93f9ae38-0ce9-4446-be2a-4fc255f84a35)
-  )
-  (circle (center 113.03 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type dash))
-    (fill (type none))
-    (uuid ab42f3f3-f33c-4c8c-b063-87ab7e46e89d)
-  )
-  (circle (center 146.05 71.12) (radius 14.3684)
-    (stroke (width 0) (type dot))
-    (fill (type none))
-    (uuid bfe7e384-1bb9-41fd-a66a-a2976f83a4a1)
-  )
-  (circle (center 113.03 71.12) (radius 14.3684)
-    (stroke (width 0) (type dash))
-    (fill (type none))
-    (uuid c2090aec-b2f7-4752-a921-ba0c7f208468)
-  )
-  (circle (center 80.01 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type solid))
-    (fill (type none))
-    (uuid dcce03fa-6dda-4ef8-a70b-6b47ba8e01ef)
-  )
-  (circle (center 48.26 40.64) (radius 14.3684)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid e8b79b64-55ca-4565-a730-cd2ac6385df8)
-  )
-  (circle (center 146.05 101.6) (radius 14.3684)
-    (stroke (width -0.0001) (type dot))
-    (fill (type none))
-    (uuid e8de0d20-c231-4ffb-9760-739c86b6f332)
-  )
-  (circle (center 113.03 40.64) (radius 14.3684)
-    (stroke (width 2) (type default) (color 137 255 16 1))
-    (fill (type none))
-    (uuid f2e3adbf-e95f-4add-a3c7-8897f192f908)
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_netclassFlags b/tests/testdata/schematic/since_v7/test_netclassFlags
deleted file mode 100644
index 8b208b7..0000000
--- a/tests/testdata/schematic/since_v7/test_netclassFlags
+++ /dev/null
@@ -1,166 +0,0 @@
-(kicad_sch (version 20230121) (generator kiutils)
-
-  (uuid 16318c8c-4df8-43cf-928b-35195771e827)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (wire (pts (xy 78.74 78.74) (xy 125.73 78.74))
-    (stroke (width 0) (type default))
-    (uuid 03dbf5d2-7288-42e6-aa7c-ddfd4c37b275)
-  )
-
-  (netclass_flag "" (length 2.54) (shape round) (at 167.64 104.14 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 08080298-2bdd-4ee6-8da5-5662f27e6762)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 101.6 0)
-      (effects (font (size 1.27 1.27) italic) (justify bottom))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape rectangle) (at 87.63 138.43 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 1b6cd7b9-8149-4c44-99e4-514ecd25616c)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 135.89 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 76.2 109.22 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 30c40ad8-fcc1-4072-b63a-e313b1a7440d)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 106.68 0)
-      (effects (font (size 1.27 1.27) italic) (justify right))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 167.64 109.22 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 357d8a58-696a-4651-b40d-2b163cb48226)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 106.68 0)
-      (effects (font (size 1.27 1.27) italic) (justify right bottom))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 146.05 137.16 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 37e2df8e-282c-425c-b356-52b15b0ee755)
-    (property "Netclass" "test1" (at 146.7485 134.62 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-    (property "Netclass" "test2" (at 146.7485 136.0805 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-    (property "Netclass" "test3" (at 146.7485 137.541 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-    (property "Netclass" "test4" (at 146.7485 139.0015 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-    (property "Netclass" "test5" (at 146.7485 140.462 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape rectangle) (at 87.63 142.24 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27) (color 255 105 97 1)) (justify left bottom))
-    (uuid 43631342-fcf4-43e8-87e6-f93f66ca188f)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 139.7 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape dot) (at 87.63 127 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 4ea51e98-11f8-471f-9684-25eb32460c81)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.3285 124.46 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape diamond) (at 87.63 134.62 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 4ef43825-a2c4-40af-9996-f1eb2acd9039)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 132.08 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 87.63 130.81 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 651b7cd6-0fe3-4279-b571-ae923f97d2af)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.3285 128.27 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 160.02 135.89 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 70b4b5a7-a7ae-4e81-ac2d-3eccd7f1aec1)
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 76.2 104.14 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 839eb452-c124-4716-bdbc-249248b4631d)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 101.6 0)
-      (effects (font (size 1.27 1.27) italic))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 123.19 104.14 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ba07de68-3086-4253-bac0-76e491ff5078)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 101.6 0)
-      (effects (font (size 1.27 1.27) italic) (justify top))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 78.74 78.74 90) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid bf81418c-1c27-4f48-ba57-679395f33ad4)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.2 78.0415 90) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 88.9 78.74 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right bottom))
-    (uuid c21f558d-d2db-4218-8490-3e001be8ffa9)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 89.5985 81.28 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 167.64 99.06 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d291308b-6fa3-4eee-b3c5-a92f1ccce99e)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 96.52 0)
-      (effects (font (size 1.27 1.27) italic) (justify left bottom))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 76.2 99.06 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d851db7c-14b1-4058-8431-38c79581307a)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 96.52 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 123.19 99.06 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid dcf17a5a-7997-408e-9cb0-4a4de2c5a8f4)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 96.52 0)
-      (effects (font (size 1.27 1.27) italic) (justify left top))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 86.36 78.74 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid e00118d5-06cb-4e6e-99be-3b70b43de4af)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 87.0585 76.2 0) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 123.19 109.22 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid e839d16d-7efa-4757-9df6-d9ed53d5894c)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 106.68 0)
-      (effects (font (size 1.27 1.27) italic) (justify right top))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 125.73 78.74 270) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right bottom))
-    (uuid f33895c1-c956-42e1-bc32-1baebd3b8a0f)
-    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 128.27 78.0415 90) (show_name)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_rectangleAllVariants b/tests/testdata/schematic/since_v7/test_rectangleAllVariants
deleted file mode 100644
index 8b7b9ac..0000000
--- a/tests/testdata/schematic/since_v7/test_rectangleAllVariants
+++ /dev/null
@@ -1,102 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid c1ef0f5b-928d-41cb-9d70-a66e71feb54d)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (rectangle (start 106.68 102.87) (end 116.84 105.41)
-    (stroke (width 1) (type solid) (color 255 111 208 1))
-    (fill (type color) (color 255 67 133 1))
-    (uuid 0ffe7370-0f86-4ed2-aa0e-042a77ff4fcf)
-  )
-  (rectangle (start 83.82 102.87) (end 93.98 105.41)
-    (stroke (width 0) (type solid))
-    (fill (type none))
-    (uuid 13a9b608-1006-421c-9430-d341c2b42faa)
-  )
-  (rectangle (start 83.82 114.3) (end 93.98 116.84)
-    (stroke (width 0) (type dash_dot))
-    (fill (type none))
-    (uuid 291cd07e-badd-4979-a935-058778bb6e1d)
-  )
-  (rectangle (start 106.68 99.06) (end 116.84 101.6)
-    (stroke (width 1) (type default) (color 255 29 62 1))
-    (fill (type color) (color 255 118 101 1))
-    (uuid 404354a5-74f0-48f5-b3a0-24a2d17be6f0)
-  )
-  (rectangle (start 95.25 99.06) (end 105.41 101.6)
-    (stroke (width 1) (type default) (color 255 29 62 1))
-    (fill (type none))
-    (uuid 44c5959b-f42f-4832-8b3f-adcf58fc97c9)
-  )
-  (rectangle (start 83.82 118.11) (end 93.98 120.65)
-    (stroke (width 0) (type dash_dot_dot))
-    (fill (type none))
-    (uuid 51eb8703-ef52-47c0-be23-954d88654c6b)
-  )
-  (rectangle (start 83.82 99.06) (end 93.98 101.6)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid 6298cf3e-1361-4a1b-b18b-ac9885df9591)
-  )
-  (rectangle (start 95.25 114.3) (end 105.41 116.84)
-    (stroke (width 1) (type dash_dot) (color 255 205 48 1))
-    (fill (type none))
-    (uuid 6439e013-5a17-4d2d-82f7-2dba64d7e222)
-  )
-  (rectangle (start 83.82 110.49) (end 93.98 113.03)
-    (stroke (width 0) (type dot))
-    (fill (type none))
-    (uuid 68eaaa0e-2900-4b9a-9504-3af60a7152be)
-  )
-  (rectangle (start 106.68 106.68) (end 116.84 109.22)
-    (stroke (width 1) (type dash) (color 255 98 72 1))
-    (fill (type color) (color 255 123 41 1))
-    (uuid 75ef5c11-7b2e-4099-acf2-bc1360321847)
-  )
-  (rectangle (start 106.68 110.49) (end 116.84 113.03)
-    (stroke (width 1) (type dot) (color 93 255 89 1))
-    (fill (type color) (color 255 141 44 1))
-    (uuid 7bad4420-7874-436e-bb91-cd6fc113f242)
-  )
-  (rectangle (start 95.25 102.87) (end 105.41 105.41)
-    (stroke (width 1) (type solid) (color 255 111 208 1))
-    (fill (type none))
-    (uuid 80d6c30c-f860-457c-9285-26b392dc18e8)
-  )
-  (rectangle (start 106.68 118.11) (end 116.84 120.65)
-    (stroke (width 1) (type dash_dot_dot) (color 73 152 255 1))
-    (fill (type color) (color 255 149 16 1))
-    (uuid 8b4bf7a5-c1a6-4371-a51b-e294e137a8f5)
-  )
-  (rectangle (start 95.25 118.11) (end 105.41 120.65)
-    (stroke (width 1) (type dash_dot_dot) (color 73 152 255 1))
-    (fill (type none))
-    (uuid 93a3b606-675e-4fad-87be-a0b3f696df94)
-  )
-  (rectangle (start 95.25 106.68) (end 105.41 109.22)
-    (stroke (width 1) (type dash) (color 255 98 72 1))
-    (fill (type none))
-    (uuid b8ed7a4c-f137-44aa-97fb-74029e8e69ec)
-  )
-  (rectangle (start 95.25 110.49) (end 105.41 113.03)
-    (stroke (width 1) (type dot) (color 93 255 89 1))
-    (fill (type none))
-    (uuid c36f51bb-5c1f-49cb-bd3b-492664be8406)
-  )
-  (rectangle (start 106.68 114.3) (end 116.84 116.84)
-    (stroke (width 1) (type dash_dot) (color 255 205 48 1))
-    (fill (type color) (color 77 255 11 1))
-    (uuid c461a677-d9f1-47ce-a580-5e692886001d)
-  )
-  (rectangle (start 83.82 106.68) (end 93.98 109.22)
-    (stroke (width 0) (type dash))
-    (fill (type none))
-    (uuid e84a05a3-8c6c-45ff-9878-0aaf464c6c7c)
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives b/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives
deleted file mode 100644
index 30ee696..0000000
--- a/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives
+++ /dev/null
@@ -1,989 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "Comment 1")
-    (comment 2 "Comment 2")
-    (comment 3 "Comment 3")
-    (comment 4 "Comment 4")
-    (comment 5 "Comment 5")
-    (comment 6 "Comment 6")
-    (comment 7 "Comment 7")
-    (comment 8 "Comment 8")
-    (comment 9 "Comment 9")
-  )
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
-    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
-  )
-  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
-    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
-  )
-
-  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
-  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
-
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default))
-    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
-  )
-
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default))
-    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
-  )
-  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
-    (stroke (width 0) (type default))
-    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
-  )
-  (polyline (pts (xy 171.45 38.1) (xy 171.45 44.45))
-    (stroke (width 0) (type default))
-    (uuid 239609dc-93b9-4af6-a2d0-4d49e97cfc69)
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default))
-    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
-  )
-  (polyline (pts (xy 170.18 44.45) (xy 171.45 44.45))
-    (stroke (width 0) (type default))
-    (uuid 332c931b-a5c1-454a-ba33-bf257b7236ce)
-  )
-  (polyline (pts (xy 160.02 49.53) (xy 160.02 38.1))
-    (stroke (width 0) (type default))
-    (uuid 3e737101-0002-472c-9928-434173405cb3)
-  )
-  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
-    (stroke (width 0) (type default))
-    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
-  )
-  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
-    (stroke (width 0) (type default))
-    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
-    (stroke (width 0) (type default))
-    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
-  )
-  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
-  )
-  (polyline (pts (xy 160.02 38.1) (xy 171.45 38.1))
-    (stroke (width 0) (type default))
-    (uuid 6bca95ca-caa6-4733-b53b-b13a5b3aff78)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
-    (stroke (width 0) (type default))
-    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
-  )
-  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
-    (stroke (width 0) (type default))
-    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
-  )
-  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
-    (stroke (width 0) (type default))
-    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
-  )
-  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
-    (stroke (width 0) (type default))
-    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
-  )
-  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
-  )
-  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
-    (stroke (width 0) (type default))
-    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
-  )
-  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
-    (stroke (width 0) (type default))
-    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
-  )
-  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
-    (stroke (width 0) (type default))
-    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
-  )
-  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
-  )
-  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
-    (stroke (width 0) (type default))
-    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
-  )
-  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
-    (stroke (width 0) (type default))
-    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
-  )
-  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
-    (stroke (width 0) (type default))
-    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
-  )
-  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
-    (stroke (width 0) (type default))
-    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
-  )
-  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
-    (stroke (width 0) (type default))
-    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
-  )
-  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
-    (stroke (width 0) (type default))
-    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
-  )
-  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
-  )
-  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
-    (stroke (width 0) (type default))
-    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
-  )
-
-  (rectangle (start 128.27 38.1) (end 137.16 46.99)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid 3e8e15a8-b6d2-4745-84db-536941a85922)
-  )
-  (circle (center 147.32 43.18) (radius 6.8392)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid 7d41d819-a280-411d-be7a-c4adc58c378c)
-  )
-  (arc (start 114.3 49.53) (mid 116.7537 41.0789) (end 124.46 36.83)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid aba1e979-3b38-465e-a0c0-135206233135)
-  )
-  (rectangle (start 256.54 154.94) (end 297.18 182.88)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (uuid cb1226ce-a04e-4b33-b357-328997e70057)
-  )
-
-  (image (at 267.97 113.665)
-    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
-    (data
-      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
-    )
-  )
-  (image (at 293.37 124.46) (scale 2.546)
-    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
-    (data
-      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
-    )
-  )
-
-  (text_box "s"
-    (at 100.33 39.37 0) (size 11.43 8.89)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid a10cb9ba-5cf6-4f20-9b2d-be925c7e3715)
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.17 225.2494 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 71.12 228.6 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 69.215 208.915 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
-  )
-  (text "test text" (at 238.76 125.73 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 71.805 234.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 69.215 215.9 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
-  )
-  (text "some mirrored stuff" (at 100.33 139.065 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
-  )
-  (text "test text" (at 217.17 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 574c189f-038f-4bc8-9345-58278240344b)
-  )
-  (text "test text" (at 165.735 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 71.805 241.1244 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.805 244.2994 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 71.17 237.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
-  )
-  (text "test text with \"quotes\"" (at 132.08 167.64 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 69.215 219.075 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
-  )
-  (text "test text" (at 261.62 172.72 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 68.58 212.09 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
-  )
-
-  (label "BUS1" (at 201.93 132.08 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
-  )
-  (label "NET1" (at 190.5 125.095 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
-  )
-
-  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
-    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 159.1793 138.5094 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
-  )
-
-  (netclass_flag "" (length 2.54) (shape round) (at 165.1 119.38 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 4c4cb004-9824-418b-b69d-0d1b89afb674)
-    (property "Netclass" "test1" (at 165.7985 116.84 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-  (netclass_flag "" (length 2.54) (shape round) (at 181.61 119.38 0) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid a7e7d6a1-f06f-4646-92ff-7afffc1e21b5)
-    (property "Netclass" "test2" (at 182.3085 116.84 0)
-      (effects (font (size 1.27 1.27) italic) (justify left))
-    )
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
-    (property "Reference" "SW102" (at 120.65 147.9549 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (at 120.65 150.4949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
-    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
-    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
-    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
-    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
-          (reference "SW102") (unit 1)
-        )
-      )
-    )
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
-    (property "Reference" "SW103" (at 103.505 163.1949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
-    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
-    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
-    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
-    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
-          (reference "SW103") (unit 1)
-        )
-      )
-    )
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
-    (property "Reference" "SW104" (at 121.285 178.4349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (at 121.285 180.9749 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
-    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
-    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
-    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
-    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
-          (reference "SW104") (unit 1)
-        )
-      )
-    )
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
-    (property "Reference" "SW101" (at 148.59 113.03 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "SW_Coded" (at 148.59 115.57 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
-    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
-    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
-    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
-    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
-          (reference "SW101") (unit 1)
-        )
-      )
-    )
-  )
-
-  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
-    (fill (color 4 0 255 1.0000))
-    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
-    (property "Sheetname" "hier_test" (at 203.835 159.9434 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
-    )
-    (property "Sheetfile" "hier_test.kicad_sch" (at 203.835 170.7646 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 162.56 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
-    )
-    (pin "OUTPUT" output (at 203.835 165.1 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
-    )
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55" (page "2"))
-      )
-    )
-  )
-
-  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid))
-    (fill (color 0 0 0 0.0000))
-    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
-    (property "Sheetname" "hier_test1" (at 203.835 178.3584 0)
-      (effects (font (size 1.27 1.27)) (justify left bottom))
-    )
-    (property "Sheetfile" "hier_test.kicad_sch" (at 203.835 189.1796 0)
-      (effects (font (size 1.27 1.27)) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 180.975 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
-    )
-    (pin "OUTPUT" output (at 203.835 183.515 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
-    )
-    (instances
-      (project "allPrimitives"
-        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55" (page "3"))
-      )
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
-  )
-
-  (symbol_instances
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
-      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
-      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
-      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
-      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_sheetProperties b/tests/testdata/schematic/since_v7/test_sheetProperties
deleted file mode 100644
index de6945f..0000000
--- a/tests/testdata/schematic/since_v7/test_sheetProperties
+++ /dev/null
@@ -1,40 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid b6528edb-33c3-487d-9ca3-4d67bb7a5a12)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (sheet (at 31.75 34.29) (size 43.815 15.24)
-    (stroke (width 0.1524) (type solid))
-    (fill (color 0 0 0 0.0000))
-    (uuid 34ae3b7c-6af7-425f-8025-a9ad084df767)
-    (property "Sheetname" "Untitled Sheet" (at 31.75 33.5784 0)
-      (effects (font (size 1.27 1.27)) (justify left bottom))
-    )
-    (property "Sheetfile" "untitled.kicad_sch" (at 31.75 50.1146 0)
-      (effects (font (size 1.27 1.27)) (justify left top))
-    )
-    (property "test" "test1" (at 31.75 34.29 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "test \"123\"" "!\"§$%&/()=?`²³{[]}\\}\\_:;-.,+#*'~" (at 31.75 34.29 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "field" "a \"field\"" (at 31.75 34.29 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "p" "some properties" (at 41.91 29.21 0) (show_name)
-      (effects (font (size 1.27 1.27) bold italic))
-    )
-    (instances
-      (project "test-sheet-properties"
-        (path "/b6528edb-33c3-487d-9ca3-4d67bb7a5a12" (page "2"))
-      )
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers b/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers
deleted file mode 100644
index 0eacc33..0000000
--- a/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers
+++ /dev/null
@@ -1,440 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid 2c11fdc0-748a-43c8-a15c-daadb9c68def)
-
-  (paper "A4")
-
-  (lib_symbols
-    (symbol "Device:Filter_EMI_LLL_162534" (pin_names hide) (in_bom yes) (on_board yes)
-      (property "Reference" "FL1" (at 0.1385 8.89 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Value" "Filter_EMI_LLL_162534" (at 0.1385 6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Footprint" "" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "three phase common mode choke" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "EMI 3-inductor filter" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_fp_filters" "L* L_CommonMode*" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "Filter_EMI_LLL_162534_0_1"
-        (circle (center -2.54 -1.27) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (circle (center -2.54 1.27) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (circle (center -2.54 3.81) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (arc (start -1.27 -2.54) (mid -1.905 -1.9077) (end -2.54 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start -1.27 0) (mid -1.905 0.6323) (end -2.54 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start -1.27 2.54) (mid -1.905 3.1723) (end -2.54 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 -2.54) (mid -0.635 -1.9077) (end -1.27 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 0) (mid -0.635 0.6323) (end -1.27 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -3.175)
-            (xy 2.921 -3.175)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -0.635)
-            (xy 2.921 -0.635)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 1.905)
-            (xy 2.921 1.905)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -2.413)
-            (xy -2.54 -3.175)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 0.127)
-            (xy -2.54 -0.635)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.762 -1.651)
-            (xy -0.254 -2.159)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.762 0.889)
-            (xy -0.254 0.381)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.921 -0.635)
-            (xy 1.27 -1.397)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.921 1.905)
-            (xy 1.27 1.143)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 2.54) (mid -0.635 3.1723) (end -1.27 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 -2.54) (mid 0.635 -1.9077) (end 0 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 0) (mid 0.635 0.6323) (end 0 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 2.54) (mid 0.635 3.1723) (end 0 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 -2.54) (mid 1.905 -1.9077) (end 1.27 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 0) (mid 1.905 0.6323) (end 1.27 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 2.54) (mid 1.905 3.1723) (end 1.27 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-      )
-      (symbol "Filter_EMI_LLL_162534_1_1"
-        (pin passive line (at -5.08 2.54 0) (length 2.54)
-          (name "1" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at -5.08 0 0) (length 2.54)
-          (name "2" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at -5.08 -2.54 0) (length 2.54)
-          (name "3" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 5.08 -2.54 180) (length 2.54)
-          (name "4" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 7.62 0 180) (length 2.54)
-          (name "5" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 5.08 2.54 180) (length 2.54)
-          (name "6" (effects (font (size 1.27 1.27))))
-          (number "6" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-
-    (symbol "Filter_EMI_LLL_162534_1" (pin_names hide) (in_bom yes) (on_board yes)
-      (property "Reference" "FL2" (at 0.1385 8.89 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Value" "Filter_EMI_LLL_162534" (at 0.1385 6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Footprint" "" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "three phase common mode choke" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "EMI 3-inductor filter" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_fp_filters" "L* L_CommonMode*" (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "Filter_EMI_LLL_162534_1_0_1"
-        (circle (center -2.54 -1.27) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (circle (center -2.54 1.27) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (circle (center -2.54 3.81) (radius 0.254)
-          (stroke (width 0) (type default))
-          (fill (type outline))
-        )
-        (arc (start -1.27 -2.54) (mid -1.905 -1.9077) (end -2.54 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start -1.27 0) (mid -1.905 0.6323) (end -2.54 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start -1.27 2.54) (mid -1.905 3.1723) (end -2.54 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 -2.54) (mid -0.635 -1.9077) (end -1.27 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 0) (mid -0.635 0.6323) (end -1.27 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -3.175)
-            (xy 2.921 -3.175)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -0.635)
-            (xy 2.921 -0.635)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 1.905)
-            (xy 2.921 1.905)
-          )
-          (stroke (width 0.3) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -2.413)
-            (xy -2.54 -3.175)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 0.127)
-            (xy -2.54 -0.635)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.762 -1.651)
-            (xy -0.254 -2.159)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.762 0.889)
-            (xy -0.254 0.381)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.921 -0.635)
-            (xy 1.27 -1.397)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.921 1.905)
-            (xy 1.27 1.143)
-          )
-          (stroke (width 0.1524) (type default))
-          (fill (type none))
-        )
-        (arc (start 0 2.54) (mid -0.635 3.1723) (end -1.27 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 -2.54) (mid 0.635 -1.9077) (end 0 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 0) (mid 0.635 0.6323) (end 0 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 1.27 2.54) (mid 0.635 3.1723) (end 0 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 -2.54) (mid 1.905 -1.9077) (end 1.27 -2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 0) (mid 1.905 0.6323) (end 1.27 0)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-        (arc (start 2.54 2.54) (mid 1.905 3.1723) (end 1.27 2.54)
-          (stroke (width 0) (type default))
-          (fill (type none))
-        )
-      )
-      (symbol "Filter_EMI_LLL_162534_1_1_1"
-        (pin passive line (at -5.08 2.54 0) (length 2.54)
-          (name "1" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at -5.08 0 0) (length 2.54)
-          (name "2" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at -5.08 -2.54 0) (length 2.54)
-          (name "3" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 5.08 -2.54 180) (length 2.54)
-          (name "4" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 5.08 0 180) (length 2.54)
-          (name "5" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 5.08 2.54 180) (length 2.54)
-          (name "6" (effects (font (size 1.27 1.27))))
-          (number "6" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (symbol (lib_name "Filter_EMI_LLL_162534_1") (lib_id "Device:Filter_EMI_LLL_162534") (at 92.71 58.42 0) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid 173b7621-b942-4c04-84fb-fe2ac546960b)
-    (property "Reference" "FL2" (at 92.8485 49.53 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "Filter_EMI_LLL_162534" (at 92.8485 52.07 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (at 92.71 58.42 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 92.71 58.42 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "6" (uuid 900bcac1-ad5c-462c-a40b-81b09345b70d))
-    (pin "3" (uuid f1dc681a-dcc0-41b4-bba1-82b21b9cebe2))
-    (pin "2" (uuid 63f32756-0c93-436f-b71a-42ba5a3d5429))
-    (pin "1" (uuid 06fb94d6-8a99-4e62-b402-85814127f392))
-    (pin "4" (uuid 201852e3-1074-48fc-8b10-5dacf59c90e5))
-    (pin "5" (uuid 4e4fed00-9125-422e-b652-e539980e8a25))
-    (instances
-      (project "issue_example"
-        (path "/2c11fdc0-748a-43c8-a15c-daadb9c68def"
-          (reference "FL2") (unit 1)
-        )
-      )
-    )
-  )
-
-  (symbol (lib_id "Device:Filter_EMI_LLL_162534") (at 92.71 78.74 0) (unit 1)
-    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
-    (uuid 37b7130a-acea-4052-8e4f-f14bd0a3b674)
-    (property "Reference" "FL1" (at 92.8485 69.85 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "Filter_EMI_LLL_162534" (at 92.8485 72.39 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (at 92.71 78.74 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (at 92.71 78.74 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "6" (uuid 86fc03ec-8c78-4477-8390-6c67cb702da9))
-    (pin "3" (uuid cf2ed14c-2ba2-4dbc-b896-72d0cfc5432e))
-    (pin "2" (uuid 82eb7ba2-3dde-4d1e-a814-0e5de3eb8462))
-    (pin "1" (uuid ec399bda-871a-400f-8d80-01ce0920db8f))
-    (pin "4" (uuid 1494bc46-e963-4aaf-94f2-9aa7cdebc6a6))
-    (pin "5" (uuid dfad23bc-f169-48eb-a030-0d393e6f35db))
-    (instances
-      (project "issue_example"
-        (path "/2c11fdc0-748a-43c8-a15c-daadb9c68def"
-          (reference "FL1") (unit 1)
-        )
-      )
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_strokeOptionalTokens b/tests/testdata/schematic/since_v7/test_strokeOptionalTokens
deleted file mode 100644
index e5b7c6b..0000000
--- a/tests/testdata/schematic/since_v7/test_strokeOptionalTokens
+++ /dev/null
@@ -1,25 +0,0 @@
-(kicad_sch (version 20200506) (generator kiutils)
-  (paper "A3")
-
-  (title_block
-    (title "test")
-  )
-
-  (lib_symbols
-    (symbol "some_symbol"
-      (symbol "child0"
-        (rectangle (start 5.08 2.54) (end 50.8 -132.08)
-          (stroke (width 0.3048))
-          (fill (type background))
-        )
-      )
-    )
-  )
-
-  (wire (pts (xy 66.04 158.75) (xy 66.04 153.67))
-    (stroke (width 0) (type solid) (color 0 0 0 0))
-  )
-  (wire (pts (xy 66.04 158.75) (xy 66.04 153.67))
-    (stroke (width 0))
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens b/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens
deleted file mode 100644
index d6ba2ec..0000000
--- a/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens
+++ /dev/null
@@ -1,114 +0,0 @@
-(kicad_sch (version 20200506) (generator kiutils)
-  (paper "A3")
-
-  (title_block
-    (title "Self-Balancing Car Controller")
-    (date "2020-04-06")
-    (rev "2.0")
-    (company "Simon Lu")
-  )
-
-  (lib_symbols
-    (symbol "Both name and number effects missing"
-      (symbol "child0"
-        (pin bidirectional line (at 1.27 11.43 270) (length 2.54) (name "X-G") (number "1"))
-        (pin bidirectional line (at 11.43 -5.08 180) (length 2.54) (name "Y-G") (number "1"))
-      )
-    )
-
-    (symbol "Only number effects present"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1")
-          (number "1" (effects (font (size 0.762 0.762))))
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2")
-          (number "2" (effects (font (size 0.762 0.762))))
-        )
-      )
-    )
-
-    (symbol "Only name effects present"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1" (effects (font (size 0.762 0.762))))
-          (number "1")
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2" (effects (font (size 0.762 0.762))))
-          (number "2")
-        )
-      )
-    )
-
-    (symbol "Both name and number effects present"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1")
-          (number "1" (effects (font (size 0.762 0.762))))
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2")
-          (number "2" (effects (font (size 0.762 0.762))))
-        )
-      )
-    )
-
-    (symbol "Both name and number effects missing as well as alternative pins"
-      (symbol "child0"
-        (pin bidirectional line (at 1.27 11.43 270) (length 2.54) (name "X-G") (number "1")
-          (alternate "Alternate1" open_emitter line)
-        )
-        (pin bidirectional line (at 11.43 -5.08 180) (length 2.54) (name "Y-G") (number "1")
-          (alternate "Alternate1" open_emitter line)
-        )
-      )
-    )
-
-    (symbol "Only number effects present as well as alternative pins"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1")
-          (number "1" (effects (font (size 0.762 0.762))))
-          (alternate "Alternate1" open_emitter line)
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2")
-          (number "2" (effects (font (size 0.762 0.762))))
-          (alternate "Alternate1" open_emitter line)
-        )
-      )
-    )
-
-    (symbol "Only name effects present as well as alternative pins"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1" (effects (font (size 0.762 0.762))))
-          (number "1")
-          (alternate "Alternate1" open_emitter line)
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2" (effects (font (size 0.762 0.762))))
-          (number "2")
-          (alternate "Alternate1" open_emitter line)
-        )
-      )
-    )
-
-    (symbol "Both name and number effects present as well as alternative pins"
-      (symbol "child0"
-        (pin passive line (at -2.54 0 0) (length 1.27)
-          (name "1")
-          (number "1" (effects (font (size 0.762 0.762))))
-          (alternate "Alternate1" open_emitter line)
-        )
-        (pin passive line (at 0 -2.54 90) (length 0.635)
-          (name "2")
-          (number "2" (effects (font (size 0.762 0.762))))
-          (alternate "Alternate1" open_emitter line)
-        )
-      )
-    )
-  )
-)
diff --git a/tests/testdata/schematic/since_v7/test_textBoxAllVariants b/tests/testdata/schematic/since_v7/test_textBoxAllVariants
deleted file mode 100644
index e21efee..0000000
--- a/tests/testdata/schematic/since_v7/test_textBoxAllVariants
+++ /dev/null
@@ -1,327 +0,0 @@
-(kicad_sch (version 20230121) (generator eeschema)
-
-  (uuid d0829a30-06bc-4626-976d-ea8fabf3d638)
-
-  (paper "A4")
-  (lib_symbols)
-
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 38.1 0) (size 13.97 6.35)
-    (stroke (width 0) (type dash))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 0e8409e1-6bff-4eb6-ac6a-7cd112dc6abc)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 118.11 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type dash_dot_dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 0ee907e0-a025-4420-8ad4-56be91f3522e)
-  )
-  (text_box "^{over}text_{under}~{neg}"
-    (at 86.36 29.21 0) (size 15.24 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (face "Arial") (size 1.27 1.27)) (justify left top))
-    (uuid 1a85edf6-51ff-410b-b9a7-929d2519bf08)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 55.88 0) (size 13.97 6.35)
-    (stroke (width 0) (type dash_dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 33291841-b782-425f-8c0e-182fc434c868)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 171.45 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right bottom))
-    (uuid 354ad53d-f503-408f-ae65-c3bed2613c14)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 100.33 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 35f2e71d-5c6a-4182-b178-b6f61bcc7b75)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 73.66 0) (size 13.97 6.35)
-    (stroke (width 2) (type default))
-    (fill (type color) (color 255 105 172 1))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 3d91613a-86ff-4556-a3e6-c00a81cc0d2d)
-  )
-  (text_box "Some file"
-    (at 69.85 20.32 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top) (href "#1"))
-    (uuid 4271f45f-18b3-4758-98f5-b6aca2791ba1)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 100.33 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 4d5ed058-008e-4d05-91d9-23c76602962e)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 91.44 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right bottom))
-    (uuid 58bfff9d-3c76-4abd-879d-22fe1fe7b100)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 73.66 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 5b3dcf5f-2326-49c4-b8fe-421980459d50)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 29.21 0) (size 13.97 6.35)
-    (stroke (width 0) (type solid))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 655b02c0-3e2d-466c-b9b6-ce50481c7cb4)
-  )
-  (text_box "github.com"
-    (at 69.85 29.21 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top) (href "http://github.com"))
-    (uuid 69787d36-da65-4eb5-9b51-9ce33ae6c496)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 55.88 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type color) (color 255 147 111 1))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 69ed9e62-51b4-4b9b-88ac-97b44dc93c30)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 91.44 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type dash))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 6ec77603-a8b2-4cc4-bf6e-9b5a37d58fdd)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 127 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid 74b07c7a-629f-4ea6-89b4-967fd1640153)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 118.11 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right top))
-    (uuid 755fa6d1-4a29-453c-be48-c2094a422604)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 46.99 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid 76282932-cde2-4674-a6d5-0989a82c66bd)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 82.55 0) (size 13.97 6.35)
-    (stroke (width 2) (type default) (color 131 56 255 1))
-    (fill (type color) (color 255 102 191 1))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 768f3206-7c31-40d2-a9ae-58df8cbd2ace)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 29.21 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27) (color 119 255 140 1)) (justify left top))
-    (uuid 7bd38f99-27a1-4862-9a9a-7625dc37c5c4)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 20.32 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 880d8269-927b-4191-b840-6eae342d756b)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 38.1 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right top))
-    (uuid 903c514a-e89c-4e8b-ae8c-e8a16f21e300)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 20.32 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 92154ef1-7c38-48f4-80fe-4203c638e8e2)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 55.88 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)))
-    (uuid 999819f1-4fbe-4fa9-9d97-128d0593a4ef)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 153.67 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 99e23c30-b8e4-42d9-b91a-1e9e0bb99f5f)
-  )
-  (text_box "^{over}text_{under}~{neg}"
-    (at 86.36 20.32 0) (size 19.05 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 9e6a0375-707e-4c8b-9c1c-c8dd224c21a6)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 20.32 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid 9f5373ca-2843-4410-903d-ec32a2f1acba)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 109.22 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify top))
-    (uuid a1213e58-bbf7-49ef-87be-e0997e1fc770)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 135.89 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)))
-    (uuid a75d10b5-dee5-4f38-bd2a-0515517cb105)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 82.55 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify bottom))
-    (uuid b151105c-4a84-4b88-b727-f00103d618cb)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 162.56 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify bottom))
-    (uuid bb4ca54c-517d-4dec-84f2-775302dc469c)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 46.99 0) (size 13.97 6.35)
-    (stroke (width 0) (type dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid bbc1a432-ea64-46c5-be45-d29cb3b7b3d1)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 64.77 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type color) (color 255 102 198 1))
-    (effects (font (size 1.27 1.27) (color 119 255 140 1)) (justify left top))
-    (uuid bc788b03-cc06-40f5-bae4-abadba5fc61f)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 82.55 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type solid))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid bd0f6b30-45d0-457c-9f39-eee9af304e61)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 38.1 0) (size 13.97 6.35)
-    (stroke (width 2) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid bd245717-a3ab-4c1a-8eae-4a80a2e59a62)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 64.77 0) (size 13.97 6.35)
-    (stroke (width 0) (type dash_dot_dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid c0690a84-08e0-4beb-9b46-e287c06e3523)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 64.77 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid c086bd04-a465-45b8-a636-a494d9ae22b3)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 73.66 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d954ca3a-1ea4-46b9-bbdb-a71e60746326)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 29.21 0) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify top))
-    (uuid e1cc4c11-f718-4378-9a0c-e1fa3f2b59d0)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 19.05 109.22 0) (size 13.97 6.35)
-    (stroke (width -0.0001) (type dash_dot))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid e4db0f62-5446-419e-807a-4c38e4d077fc)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 36.83 144.78 90) (size 13.97 6.35)
-    (stroke (width 0) (type default))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid eb475ae2-cd89-4417-8dc1-2a025e45bfb4)
-  )
-  (text_box "Test \"test\" \\\\test\\\\"
-    (at 53.34 46.99 0) (size 13.97 6.35)
-    (stroke (width 2) (type default) (color 131 56 255 1))
-    (fill (type none))
-    (effects (font (size 1.27 1.27)) (justify left top))
-    (uuid f0912024-d068-4f99-b14f-8be690c2f8ce)
-  )
-
-  (text "Hyperlinks" (at 69.85 19.05 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 0fd0de2c-5e2f-444f-bf95-eea3714c134e)
-  )
-  (text "Misc" (at 86.36 19.05 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 1f3432ca-65b2-4665-a4ca-f4e50f4a32a6)
-  )
-  (text "Style" (at 20.32 19.05 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 2801bf9e-313c-48ce-9b17-9c0cf8ce3fcf)
-  )
-  (text "Text style" (at 53.34 19.05 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 3f507998-5b20-44ce-86fc-7b7e8636533c)
-  )
-  (text "Alignment" (at 38.1 19.05 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 736f09e5-8e11-4495-a56f-e77e7a6b258d)
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/test.kicad_sch.expected b/tests/testdata/schematic/test.kicad_sch.expected
deleted file mode 100644
index a279a8b..0000000
--- a/tests/testdata/schematic/test.kicad_sch.expected
+++ /dev/null
@@ -1,887 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "Comment 1")
-    (comment 2 "Comment 2")
-    (comment 3 "Comment 3")
-    (comment 4 "Comment 4")
-    (comment 5 "Comment 5")
-    (comment 6 "Comment 6")
-    (comment 7 "Comment 7")
-    (comment 8 "Comment 8")
-    (comment 9 "Comment 9")
-  )
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
-    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
-  )
-  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
-    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
-  )
-
-  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
-  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
-
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
-  )
-
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
-  )
-  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
-  )
-  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
-  )
-  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
-  )
-  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
-  )
-  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
-  )
-  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
-  )
-  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
-  )
-  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
-  )
-  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
-  )
-  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
-  )
-  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
-  )
-  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
-  )
-  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
-  )
-  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
-  )
-  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
-  )
-  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
-  )
-  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
-  )
-  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
-  )
-  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
-  )
-  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
-  )
-
-  (image (at 267.97 113.665)
-    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
-    (data
-      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
-    )
-  )
-  (image (at 293.37 124.46) (scale 2.546)
-    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
-    (data
-      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
-    )
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.17 225.2494 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 71.12 228.6 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 69.215 208.915 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
-  )
-  (text "test text" (at 238.76 125.73 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 71.805 234.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 69.215 215.9 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
-  )
-  (text "some mirrored stuff" (at 100.33 139.065 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
-  )
-  (text "test text" (at 217.17 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 574c189f-038f-4bc8-9345-58278240344b)
-  )
-  (text "test text" (at 165.735 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 71.805 241.1244 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.805 244.2994 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 71.17 237.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
-  )
-  (text "test text with \"quotes\"" (at 132.08 167.64 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 69.215 219.075 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
-  )
-  (text "test text" (at 261.62 172.72 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 68.58 212.09 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
-  )
-
-  (label "BUS1" (at 201.93 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
-  )
-  (label "NET1" (at 190.5 125.095 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
-  )
-
-  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
-    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
-    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
-    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
-    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
-    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
-    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
-    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
-    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
-    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
-    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
-    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
-    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
-    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
-    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
-    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
-    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
-    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
-    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
-    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
-    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
-    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
-    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
-  )
-
-  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
-    (fill (color 4 0 255 1.0000))
-    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
-    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 162.56 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
-    )
-    (pin "OUTPUT" output (at 203.835 165.1 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
-    )
-  )
-
-  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
-    (fill (color 0 0 0 0.0000))
-    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
-    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
-      (effects (font (size 1.27 1.27)) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
-      (effects (font (size 1.27 1.27)) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 180.975 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
-    )
-    (pin "OUTPUT" output (at 203.835 183.515 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
-  )
-
-  (symbol_instances
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
-      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
-      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
-      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
-      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_addPropertyToSchematicSymbol b/tests/testdata/schematic/test_addPropertyToSchematicSymbol
deleted file mode 100644
index 71519e1..0000000
--- a/tests/testdata/schematic/test_addPropertyToSchematicSymbol
+++ /dev/null
@@ -1,140 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "A4")
-
-  (lib_symbols
-    (symbol "Diode:1.5KExxCA" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
-      (property "Reference" "D" (id 0) (at 0 2.54 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Value" "1.5KExxCA" (id 1) (at 0 -2.54 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 0 -5.08 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "diode TVS voltage suppressor" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_fp_filters" "D?DO?201AE*" (id 6) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "1.5KExxCA_0_1"
-        (polyline
-          (pts
-            (xy 1.27 0)
-            (xy -1.27 0)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -1.27)
-            (xy 0 0)
-            (xy -2.54 1.27)
-            (xy -2.54 -1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.508 1.27)
-            (xy 0 1.27)
-            (xy 0 -1.27)
-            (xy -0.508 -1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.54 1.27)
-            (xy 2.54 -1.27)
-            (xy 0 0)
-            (xy 2.54 1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-      )
-      (symbol "1.5KExxCA_1_1"
-        (pin passive line (at -3.81 0 0) (length 2.54)
-          (name "A1" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 3.81 0 180) (length 2.54)
-          (name "A2" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-
-  (wire (pts (xy 139.065 91.44) (xy 134.62 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 62009989-8103-49af-b226-a7bac174e878)
-  )
-  (wire (pts (xy 120.65 103.505) (xy 139.065 103.505))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 62b3c9b2-7111-4fb4-8944-c22c00c06d9d)
-  )
-  (wire (pts (xy 139.065 103.505) (xy 139.065 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 6d34db10-7ee4-4cde-a4af-6e0f89095ed8)
-  )
-  (wire (pts (xy 120.65 91.44) (xy 120.65 103.505))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid e452492d-035a-4361-8fab-fa3eca341746)
-  )
-  (wire (pts (xy 127 91.44) (xy 120.65 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid ff1f874f-92dd-4417-98ba-01533012ca7a)
-  )
-
-  (label "NET" (at 126.365 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 82f2e0d6-2fda-41d6-9b1f-1d94d4f9cb34)
-  )
-
-  (symbol (lib_id "Diode:1.5KExxCA") (at 130.81 91.44 0) (unit 1)
-    (in_bom yes) (on_board yes)
-    (uuid d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c)
-    (property "Reference" "D?" (id 0) (at 130.81 85.09 0))
-    (property "Value" "1.5KExxCA" (id 1) (at 130.81 87.63 0))
-    (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 130.81 96.52 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Property1" "This is a property" (id 4) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Property2" "This is another property featuring \"quoted\" strings" (id 5) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 28f921ab-5f55-47f8-b726-02e567145cd5))
-    (pin "2" (uuid e89e5b16-554a-4d97-8f95-fc89c9b40d74))
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-
-  (symbol_instances
-    (path "/d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c"
-      (reference "D?") (unit 1) (value "1.5KExxCA") (footprint "Diode_THT:D_DO-201AE_P15.24mm_Horizontal")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected b/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected
deleted file mode 100644
index 90e163e..0000000
--- a/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected
+++ /dev/null
@@ -1,140 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "A4")
-
-  (lib_symbols
-    (symbol "Diode:1.5KExxCA" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
-      (property "Reference" "D" (id 0) (at 0 2.54 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Value" "1.5KExxCA" (id 1) (at 0 -2.54 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 0 -5.08 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "diode TVS voltage suppressor" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_fp_filters" "D?DO?201AE*" (id 6) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "1.5KExxCA_0_1"
-        (polyline
-          (pts
-            (xy 1.27 0)
-            (xy -1.27 0)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -2.54 -1.27)
-            (xy 0 0)
-            (xy -2.54 1.27)
-            (xy -2.54 -1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 0.508 1.27)
-            (xy 0 1.27)
-            (xy 0 -1.27)
-            (xy -0.508 -1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy 2.54 1.27)
-            (xy 2.54 -1.27)
-            (xy 0 0)
-            (xy 2.54 1.27)
-          )
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-      )
-      (symbol "1.5KExxCA_1_1"
-        (pin passive line (at -3.81 0 0) (length 2.54)
-          (name "A1" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 3.81 0 180) (length 2.54)
-          (name "A2" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (wire (pts (xy 139.065 91.44) (xy 134.62 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 62009989-8103-49af-b226-a7bac174e878)
-  )
-  (wire (pts (xy 120.65 103.505) (xy 139.065 103.505))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 62b3c9b2-7111-4fb4-8944-c22c00c06d9d)
-  )
-  (wire (pts (xy 139.065 103.505) (xy 139.065 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 6d34db10-7ee4-4cde-a4af-6e0f89095ed8)
-  )
-  (wire (pts (xy 120.65 91.44) (xy 120.65 103.505))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid e452492d-035a-4361-8fab-fa3eca341746)
-  )
-  (wire (pts (xy 127 91.44) (xy 120.65 91.44))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid ff1f874f-92dd-4417-98ba-01533012ca7a)
-  )
-
-  (label "NET" (at 126.365 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 82f2e0d6-2fda-41d6-9b1f-1d94d4f9cb34)
-  )
-
-  (symbol (lib_id "Diode:1.5KExxCA") (at 130.81 91.44 0) (unit 1)
-    (in_bom yes) (on_board yes)
-    (uuid d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c)
-    (property "Reference" "D?" (id 0) (at 130.81 85.09 0))
-    (property "Value" "1.5KExxCA" (id 1) (at 130.81 87.63 0))
-    (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 130.81 96.52 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Property1" "This is a property" (id 4) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Property2" "This is another property featuring \"quoted\" strings" (id 5) (at 130.81 91.44 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Property3" "I was added from \"outside\" of KiCad" (id 6) (at 0.0 0.0 0))
-    (pin "1" (uuid 28f921ab-5f55-47f8-b726-02e567145cd5))
-    (pin "2" (uuid e89e5b16-554a-4d97-8f95-fc89c9b40d74))
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-
-  (symbol_instances
-    (path "/d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c"
-      (reference "D?") (unit 1) (value "1.5KExxCA") (footprint "Diode_THT:D_DO-201AE_P15.24mm_Horizontal")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_createEmptySchematic.expected b/tests/testdata/schematic/test_createEmptySchematic.expected
deleted file mode 100644
index 46de15d..0000000
--- a/tests/testdata/schematic/test_createEmptySchematic.expected
+++ /dev/null
@@ -1,8 +0,0 @@
-(kicad_sch (version 20211014) (generator kiutils)
-  (paper "A4")
-  (lib_symbols)
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives
deleted file mode 100644
index 82cf29d..0000000
--- a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives
+++ /dev/null
@@ -1,755 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid 6e843ea7-4071-4f6c-927e-0a85e27d67ff)
-
-  (paper "A4")
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 81.915 82.55) (diameter 0) (color 0 0 0 0)
-    (uuid 5bceda0d-fb78-44a3-a29a-ea07e0a5929e)
-  )
-
-  (no_connect (at 52.705 83.185) (uuid 3dfda617-5f32-441f-b084-963be5408bae))
-  (no_connect (at 52.705 80.645) (uuid 477819ad-79ff-4d5d-89c1-732b044f2082))
-
-  (bus_entry (at 91.44 82.55) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 18831711-c623-41d8-9212-3655becaa56d)
-  )
-
-  (wire (pts (xy 63.5 88.265) (xy 63.5 95.885))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0e7574b9-8d09-4ea5-a886-d2ce80444647)
-  )
-  (wire (pts (xy 66.04 111.125) (xy 66.04 85.725))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 2ed3dc6d-8e4d-4865-868d-a1da880817db)
-  )
-  (wire (pts (xy 68.58 111.125) (xy 66.04 111.125))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 31cb89f7-66e2-4cbe-926c-7b7b9c36f9c7)
-  )
-  (wire (pts (xy 97.79 114.3) (xy 127 114.3))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid 359d4095-7e08-4e54-945e-63f380a9ecd6)
-  )
-  (polyline (pts (xy 133.985 100.33) (xy 133.985 93.345))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 6db7da7f-af3b-4506-ae16-7d3c30043925)
-  )
-  (wire (pts (xy 81.915 82.55) (xy 81.915 92.075))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 77eb5e67-b395-4b8f-b355-c9978aa1a254)
-  )
-  (polyline (pts (xy 107.95 93.345) (xy 133.985 93.345))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 880e21ec-04c1-4f84-b0b1-e2a1deb77409)
-  )
-  (wire (pts (xy 81.915 82.55) (xy 91.44 82.55))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 897e013f-e31e-417f-b355-ca9b9f9dad45)
-  )
-  (wire (pts (xy 97.79 111.76) (xy 127 111.76))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid 8a43a549-7c53-4159-9079-e3706117cb9f)
-  )
-  (polyline (pts (xy 93.98 100.33) (xy 133.985 100.33))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 993d4deb-f3bd-4daf-a633-6a6f3f8cbf09)
-  )
-  (wire (pts (xy 97.79 116.84) (xy 127 116.84))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid b26f05c6-45b4-4835-b8be-d2c660fd83ad)
-  )
-  (wire (pts (xy 81.915 76.835) (xy 81.915 82.55))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bd5238e4-3d13-4f80-8c81-e607942cb6c2)
-  )
-  (wire (pts (xy 66.04 85.725) (xy 52.705 85.725))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d45e4606-e8b1-4c12-9fd9-0c03f8aa8d64)
-  )
-  (wire (pts (xy 97.79 119.38) (xy 127 119.38))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid d4f7fae7-033b-42f6-b7ba-d553a4e26289)
-  )
-  (wire (pts (xy 52.705 76.835) (xy 81.915 76.835))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d5006b7f-8c6e-4019-8600-ede16e238028)
-  )
-  (bus (pts (xy 93.98 85.09) (xy 93.98 93.98))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d72f4dfe-cd6b-4029-88de-1ebbe52a7481)
-  )
-  (wire (pts (xy 81.915 92.075) (xy 75.565 92.075))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid e2c964f0-ce92-433d-9cb2-b6bc8e78ff43)
-  )
-  (wire (pts (xy 52.705 88.265) (xy 63.5 88.265))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f8094f9e-1288-42f7-aa5f-0008dd97eebf)
-  )
-  (wire (pts (xy 63.5 95.885) (xy 59.69 95.885))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f8164270-f2b4-4d38-b6cd-1ebcbb4cc15d)
-  )
-
-  (image (at 112.395 58.42)
-    (uuid 49d344ac-ce14-464c-a802-3dfe8261b773)
-    (data
-      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
-    )
-  )
-  (image (at 24.765 127.635) (scale 2.546)
-    (uuid 7b2f6028-5234-4df8-8d41-bf003f728f58)
-    (data
-      iVBORw0KGgoAAAANSUhEUgAAAEAAAAIkCAIAAAAh8brsAAAAA3NCSVQICAjb4U/gAAAACXBIWXMA
-      AA50AAAOdAFrJLPWAAAgAElEQVR4nO2deVwV1/33vzN3X9k3BUQWQXZFERSJIiKKiUnUqCU2m2ma
-      n0/T/vq06ZI0Jm36+vX1NEl/rc2TxKpJ84s1Wo27ooDgElnEBQUERFbZ18vdt5nnj8ErXu7MnbkL
-      E5/c9yuvvHDm3DPfz5z9nO+cg4yNjcHjDMq2Ac7iEcA2HgFs89gL4NIJhJlNmvEB5ViPUa/GzEa7
-      4SXbjlhdUe9+hqZBKIfHE0jkvjPFsgAEtW+e3RC4YrhztO8uzcc7D2Y26jVjg5oxAPALjpX5hQIg
-      FOGpsxA+0FU3ndZbMdzXNNh1GwCnCEMlQDHcqRnvd7VVzFCPD4yP3KcIQJqFMLPJ5rvHcfx06bV7
-      7b1W1328pesLFotFAscMpWCkt0nqHYKSlAfSFNAoB2xeV6q19U2dOr3R6r/e/tHWDncll1Y5RHaL
-      VIBytMfmdZlEHBURMvW6j5c0IizQAePooCIxBiiykEmvtnkdQWB9QabBaMKwh2ULRRA+n1aN7BgG
-      nZLsFulTzZT1PZ/nRnOnQmHMY98SewTYApcLKf7pWtySlTUfrQaA9//yNQC8/Z+b3fEIC54sxDYe
-      AWzz2AtwV4NqNmNarRYAMAxH0UdGJJKfngK1geK3uJSv+e8Cmg9yTzuA4x/8/V99fX19fX0f7zmM
-      44+OSCitBwBEZSfAI4HJphbb60vox2JFQ1P7hx/vt/xzxowZAsHDccJ/1dsfM/wmQW91Zffu3TZD
-      esqALeJiwuNjIxqa2gEgaW7kT3/8HIJMKgZT5iymQr/9dksKoCj6sx9vCg4ODg4OfuO1R60HwKV8
-      6p/bDTAZd9VCHA4qEokAwKoKAgD6NQwd3Dgu0eutC6I7cIGAqpr6kgs1SzKSly2ZR1wZHVMePHq+
-      p6eHw+E4Hz81LhCw/5sSpUrT2d2fnZkCACUXao6dvqTTG/h8Xv6KDOfjp8YFAvQGIwCYTObG5o4D
-      R0vv9wwCQEpi9A/Wr/T383Y+fmpcWQY++uQAjuOB/j4/2LAyKT7KhTFT4AIBlvkVDgddszJzzcrF
-      PK511i+/Unf7TvvkPgWCID5e0ifzFnrJJc483SUpMGHWO798aWZIwNTber2x+kbz1Ota3Uh9U9fi
-      hXHOPNsFDRmKTkQSQJLj+XxuVETw1OsCPi/S1nVGkKYAMSS3SX9/v0ajof8MBEHWFyzWG4xWvVIe
-      l8PhOPsGp2+CTcDnuSNaUgH0u1Ov/+IDg8HOulPR+eu3GzusBwaTCPT32vJMtgMiXVAGMAwj/mhp
-      tb0SYTZj1NYDwMCQ4n4P6Rw6BS4QYOlsfvTJgV1fHh9TKAGAc72Xc3tiuYDDQdOSo7jk3QoURUND
-      /MJm2qjB7OKCMmARIODzqmrqb9xqfmrpovVVOixEak4KIm7lZCXnZCU7/6ypuHI88PYvXkxLiTUY
-      jLKjjciACr3dj3a43RWGVACHQ7c8EWsFKIoG+vv8xyvP7nj6qWWoLwAgGG680u4KI6mMIRXAFUpp
-      xr5xXU5IsP/GdcuJSj22ViFAJqKVtI0zsZMUvlBGdou0DMh9ZgyqR+nEnpWRnJUxkb/RPhXGR/H5
-      MwCHuo4erXI4CccBoVqppoPE28aqHAGpALHMkToBC5bqt0+MAb7+y9cAkOS09QAgkZMuH5JmIQTl
-      +gXHOv9s5/ENmYOg5FUwxS9lfqEU0qcHiVew3DeMIgB1NYoEhCX5hrCWDr7BsQGhCdTOHnYbMkTu
-      Gyb1DtEqh8ZHu006FfXyq/NwODy+UCbxDpHIAylyzkP7PG6XLOMRwDYeAWzjEcA2HgFs4xHANh4B
-      bPP9E6BWq0tLS787nXDG44EzZ84cPnxYLBZv2bIlMzPTTWbRh3EKGI1GANBoNHv27Pn444/Hx10z
-      8+MwDpYB/6AZfL7gxo0b77zzztWrV11rEyMcFBAcGrHmuZdnzopSqVSfffbZzp072SoVjtdCQrFk
-      6apnluQ+yeMLamtr33vvvWvXrrnQMpo4W42GRcau3vBCcOgspVL5ySeffPrppyqVyiWW0cQF7YBY
-      Kn9i9YaF2Xk8Hr+mpuadd965ceOG89HShKoa/dOf/tTS0mLz1qzouZk51l4zatV4dXlRf08nACxY
-      sOD555+XSulOcTuMK1tiiVS+rGDjwuw8LpdXU1OzY8eOmzdvujB+mzBuyI4fP378+PHEtMWJaYvJ
-      wqiViqoLRQM9XQCwYMGCrVu3SiRO+RNQ4NQa2clOrLQHMz+6+shHkc1R8uUFz7U23b5+5XxNTU1L
-      S8vWrVtTUlKcspQEp7JQeS9unrJ2asDwK/0YgiBRccmrN7wYGBI2Nja2c+fOPXv26HQ6Zx5nE6cE
-      LAtBOFNmjvkosjhoIlqp3DvnyecWZudxuLyKioodO3bcuXPHmSdOxakstDYcXRtu9xUgUXHJAUEz
-      qy4UDQ/0fvTRR0uXLt20adNkV1hnmKbxgNzHb8VTW1LSsxEUvXjx4jvvvNPY2OiSmKdvQIOi6NzU
-      9FXPbvUNCB4eHv7www+//PJL5z0bp3tE5uXjn7vuBynp2QiCXLx48d13321utuELRR8WhpQPkuKH
-      vv5Bg4ODf/7zn7/88kuDgYHH+iOxudY4+nj5+q98utCSFDt27HAsKab1i0IrEBSdm5oeNDO8qryI
-      SIqpLjnR0dG//vWvKSJ57Gcl2EwBHMMab9XcrrmMYVhAQMDLL78cExPDNBLWBChGhqrKz4wM9SMI
-      kp2dvXnzZj6fgde9BdcIONmJne/FckLoNMyAYVjTpBf/0ksvzZkzx+FHu0YA0Sct7cHsClCMDlWV
-      F40M9jn54i24RgDRJ53aM53MxIu/9i1mNvv5+b300ktxcU757BK4eDzwRoWJg8CKGdZ5aXx0mOjM
-      ES/ehZ05pwTYHA+YcSjvxdeGWy7g9xpv36goMxmNfn5+L7744ty5c515qBVOCVgWgpT2WGvgILAs
-      ZGKUoBpXVF8oGujtAoDMzMzCwkKh0MUfR7tmPPBGhYm48rfMiQhxHCeGlGaTydvb231DSioBFNMq
-      SsUj7nRCFHQYCB9k+8dmUG/huSj0ch+eFYwQL/7GlTKTyejl5bV169bU1FSXPIIMV06rsDKx5ZoU
-      IF78zYpyo9Egl8u3bt06b948l8RsFxcIUCvHr14623e/A6bxxVtwVkBXa1P1xXNGg14ulxcWFqal
-      pbnELPo4LkCnUV+9dK674x4ALFiwoLCwUCYjdRB2Hw4K6Lvf3nz7msGgl0qlhYWFCxcudK1Z9HFQ
-      wFB/DwDMmzdv69atcrncpSYxg7EAHo8HAN+dZVbGArKzs/l8flpamre327+TpIPH8ZVtPALYxiOA
-      bTwC2MYjgG08AtjGI4BtHnsBtMYDFW0V+67uQ4XomHbs+NXjAJA/Px8Aiq4XWf1NQFwhmHzd6pZN
-      +By+t8g7IShhWeSy2AD7HxHaEaDUKbcf2H789kOj3Y3BbBhQDQyoBsrulWWEZ7y26DURT0QRnkqA
-      UqfM/zi/vrfe1UbSpbKzsne8992V71JooCoD2w9sZ9F6go6xjl1VuygCkAqoaKsgcg7rVHRWNA02
-      kd0lFfBV9VfusccRLrReILtFKuDb1m/dY4wjNAw0kN0iFdCn6HOPMY4wrBkmu0UqQGdyvYMeADR3
-      O+KSYiT/Cnu6XQ1a+1tRFI0OiZ58UaPXDCgGRlWjBpPBYDLwuXw+l+8j9Qn0ChQLxNQRul1AiE9I
-      7+gjW+W39LYAgEVDY3dje3/75ABqUANA/1h/4/1GP7lfUniSkE+6tukWATjgyIMv+ZNnJwPAVA2E
-      DLsMjw9XNFVkxpJOwrqlM1fbWos/2DkMASQ5InmG7wyHY9Mb9XWddWR3XSaAz33os9E31veIBgRJ
-      mpXkjIahcebnD9BHpVUBQHpMujMaeAj8NACuzYHeBKiMgZ8F0M3cTgkgLK6+W63UKaUi6aI5iwS8
-      hy4c9DWgAP8Khz8EQ4wAJCjEC+H3wXAoAqb6NU/FwUKs0qqkIml6THr13WqDyXC1+erCOQtlQhlx
-      RW/UWzQgbUjy7GSiTCMIkhyRnBxhvdXTYqxvlfkm8L1g6WcwYxn0fwtlL+XIxjd4wQF7k/+MU8Dm
-      Wyc0KHVKiVCSHpM+OR16R3tvtd3CKY9iScKHAQDmvgrha4ArhpkrIeF1AMilsWjIQMDkvD7VYmoN
-      k/OSLSOIfdIm5RjcDAA6zKUC7L51Cg1W5cGKWsQfAKDhM+g8BSY1dJ6G+k8A4DyN76FIl5i8f2Fj
-      CYzP5RN5Xa1TE3mdzhX7RiBwYBbkP5phTo5DYSdYPGHHPrBtJ7MyQOetE1dUWpVEKFkYTWv9GMdh
-      Swf8rg8adDBmhmY9/K4Ptk6yngLGhZimhuq71QAgFdF1mjDj8NdByLgL4Q2woBn+OmjHhdBxARQa
-      Jr91g8lBb3Sb+Mv9yW4xaAcECJhxIHzLbNb91Xerc5JzyN56dEi0VS8aAOo66+4PUZ0VBQBCnjBx
-      ViLZXVop8Jw3VM2B/kQYSIKjEZAofKiB/lufaj0AJIQlUPeR/OX+GXEZQp4T3ent/vBfxC5vHAFq
-      NuTI8BIJ5N2DWzog8jrFW7cL0TZHh0QPKAbG1GN6g96IGXkoT8AXeEu8nRrQEPNwMjC+ZywHMAuy
-      PuDP+xmuG9Gd2yruOPt+CDzVBuCivC4WiCMCIxz7rZ0sNAcf5YMZ9Uvkz//fgHAQUYAg+68AkCWl
-      1dOaBuxkIQxHAADMOsAxIHZQNOsAQIcBjWaeCp1RV99RP6waJvZbnTofjKKon8wvITyBogCA3RRo
-      QH01wMXGWnRl/4EpO8z9V3UlrwBAiZJWK0NBfUf94PigZbfYqWAYNqgYrO+0M7dJmgKWaXHcC74I
-      B6j7zFj3GXGl2whvW59ox5hh1TAALJfy/xgiC+KioJ30OfvcgD4T9lavslxlGFaSzggR2K9Gjytg
-      5T04roB2AzTp4dMheKIFOh/M00hp7+ppBfHu3yesn0IwF30/WAaTNvQlg1ZDdk0Dz3fauD7Td2Z8
-      eDw86Gkzgsj0wVrSfQRCeCidFQkHR2QchBMXFhfmHwYAPcM99V314ERqOIMjAiRCSWpkqkwoM+Pm
-      5vvNHYMdwDw1iDLWF+MXbCsLAUCvESu683AJiwzGAghDOShHrVPfbL2p1CkdSw0URTEMe6tX+ccQ
-      2VQNvUbsrV4lTNrY3QUCphpqxswOp4afzG9QMViuMiy5Owzk64J+Mj+XCciMy5SKpGbM3NDZ0D3S
-      DbRTA0XR2JnW640J4Qn1nfXDymGyeoZoyBLDSfuhjAUQPbaKxgqVTkU/NSQCSUpkilxk7Rwr5AnT
-      omw7WjNaDiUVIOQKbS4RqHQqoJcaABDkHZQ0K4nLcXYKmUe+7zRp1CFeIW3DbWR37aYGkW1mBcxy
-      zvIJ/MSkJYFUQFZUFoUAArLUkAglqbNTZSKqeSmrztxUJnfmEoISyOIhraQK0wuprbdgSQ3C+hl+
-      MxbHLaa2Hhh25rJnZ5MFI02BjIiMp1OePlp71K4AAiI1ACB5Fq1d7q07c48yuTOXOSuTwmmCqpnY
-      uXFn4gw7tZjD0OzMJQQnvLboNYp4KDfOFsqKthc9k0L3gHMHIOtHAEAID12fuv7M9jNCLtWAxk4F
-      JxVIP9/6+WtZr/2r5l+IABnRjjhoKX04Ao4kmBuSIYh5dk/QfLvBPe73bOMRwDYeAWzjEcA2HgFs
-      4xHANh4BbOMRwDaMZ2xe+qatqkttdTEpSLR/UxRxEjEO8OKhtqvd1mEWhkq+WD+bWFjDcNhy4N7t
-      fq1VmEVhks+fnc3IHsYpMNV6ALjdr9UYJ+YXDCZsqvUAcPW+2mCaCKMxYlOtJ4ucmsc+Cz32AmiN
-      iSdvc3Ml6Wc2wyxq+IRj1gMAhnAqE39iM0xG3U4UNwOAmSOoin/dZpjFt/+b+MPuFnkEtFKAbJMe
-      t0LzoQxqoc0/+gUAXHmwF5IV61/8iZADAGDCoLLKdpjnXvlPYh5IZ4aqatthiKd8vesDmlY99mXA
-      I4BtPALYhrGARB9ExAGr/yJliODB+X8cFKK9bPgShUkQy3nWAg7MFNsIE858qZ9xZ+5HcXZOKkQA
-      3oi3H+ZXKfZPPKQDrRQgTiAeGep3ySNdCy0BS5YsAYCLRd9oVCyfeTIVWgKef/75uLg4nUZ9+dwx
-      dxvEFFoCuFzu9u3b4TuZi+jWQiIR1VfJLPL9awe+a3xvBGi1Nsbg3wVoCTCZTB9//DEA+PoHudke
-      xtAS8NVXXzU2NgrFkqy8de42iCm0BHz77bcAkJ3/rFjK5q6ENqElgNhV/zuYf8CB3ujfG8zNCmu/
-      71lS5OdJE/74OMDOenPL+JSTBLyQn8Q/9Nm3Gw9NGFejU58KAB0qXG+e+NuMwVTrAaBFgZsneTfZ
-      jYcm35t24DuLRwDbPPYCGFSjE/OVJLPTh7/YaZmdBpLZ6YN7/kLMTtOJhya0UiA62sZHeO6G5kMZ
-      +8zF/9X2Fg/Vr8dL+SgA6E3YvI9tb0ZzY3u84IGbot14aPLYl4HHXgDjvtCy2bLrPRqri9F+QjFv
-      4l3wuejCUMnV+9brjQmBIv4kN1e78dDE4zfKNh4BbOMRwDYeAWzjEcA2HgFs4xHANh4BbENrQGM0
-      Gm/fvn358uX29vbx8Ydr3a+++irxxz/+8Y+pv6K+S4ZcLo+MjFyyZEliYiJxaA819gVUVlbu3bvX
-      7gYVrmJ8fPzmzZs3b95EUXTbtm3p6enU4e0I2L9/f2lpqevMYwCGYbt27Wptbd28eTNFMCoBlZWV
-      Nq1//vnnrda9X331Va1W+9VX9jdKnvpbAKD4bUlJSVRUFMVpW6QCjEbj3r17bd6yuWpPcymf7LeW
-      AjMVHMe1Wi1Z/KS1UG1t7bTle2pwHB8YGCC7SyrgypUr7rHHERQKBdkt0izU3t5Odstmgmo0j0zy
-      eHl5Wf6WSqUqlYr6t/v27SN7HAB4e3t/8IFtV1jSeaFt27ZRxEiNl5fXunXrLOffGgyGw4cPWzQ4
-      xu7du21ed0tLnJKSMvn0Xj6f777zQd0iYOphce47Ps4tAqaWOYpS6CRuEXD9+nWD4eEGenq9/tat
-      W+54EDi2w5Pd1lSpVB45cmTTpk3EP48cOaJUKmn+limkAiiaRptYmTW502qxfmowy0Wmj7Pw2I8H
-      HnsBpFmIYhRiMx9btcRkONYSA8CiRYtsXnekEDtc4Jz8rU0e+yw0HQJCQkLcF7kbBVhKRX5+vvs0
-      2BEQHh6elJQUGhrqQNQnT55Uq9UAwOVy8/PzZ8xw/AAFCkgLMYIgubm5ERERxD9bWlrKysqIv2m2
-      pgqF4tSpUwUFBRKJhMvlrlq16uzZszk5Oa5tiUnHA++9915+viPnd2m12lOnTo2OjhL/9PLyWrt2
-      rVhsZ/Niu5BVo6RZyN+fdLNtakQiUUFBgaX/rFAoTp48SbOVcABSASMjju9GJRKJ1q5da6WBKA8u
-      hzQLvfrqqzk5OZGRkcQ/W1tbz58/T3jAkrXE+/btCwoKWr16NTElaJWXCCh+S20o2ZCSakyMIEhY
-      WJiPj8/w8HB3dzdOb59juxocw5ExMY7jnZ2dtbW19+/fp2k9APT39xcVFRmNRnhQHpjaygi3NGR9
-      fX1FRRObnrr74xt3tcR9fdN0nBmt3qhEIlm7dq1cLgcAlUp14sQJJyd5XAipgBdeeMHyN4qiXO5E
-      SKlUunHjxqnTpuPj42fOnNHp3HIMGwWkWYg/CYv1BFwulz8Ff39/x1puJ3FlGfDzs7NDsTtwpQDi
-      o9dpxiPAKjp7G3W7nP9/BXA4jnwy7qZcRDG5TSpg8gQ/fdwkYPZs0l2TSAXIZDROM5sanXuyEPFN
-      vO0nkt0ICgpy4HW6QwCXy01IYL5xtkgkCgwMZPowd2Shbdu2UThNUL2w8PBwogNHH5enQF5e3oIF
-      CygCUPVGURSNjY3t7OwcGBigOaBxYQpwudxt27ZRWw92u9MoikZERAQFBQ0MDCgUCoPBYDZTfSvo
-      fAp4e3tHRkYuXrw4ISGBjruN5/sBtvEIYBuPALbxCGAbjwC28QhgG1pzo1qtlujM6fV6d/tioigq
-      EAi8vLwCAwPpzGzb6cxhGNbV1dXf309/fcBVIAgSFBQUGhpKPb1AJQDDsObmZvd5i9mloqJCqVS+
-      9dZbFL10qjLQ1dXFrvV1dXUymayrq4siGKkAjUbT38/apmzV1dV1dXWJiYmZmZn9/f0Uq7SkAgYH
-      B6c/3xNUV1fX1tYS1gMAjuODg4NkgUkFsJV5rKy3awypAL2ewe4UrsKm9QAw2YnTCtJ2wB31/YhK
-      5ysVAkBzc7Pl4pw5c4g/yKwHAIqZBGeP+6NPU/dwedGJ1155EQAuXLhguU4I+Kbk2+G2BpvWUzN9
-      AsovX0Exo81b1dXVw20NcQlJmZkZTKOdpr5Q28AYOm575ZjIOT3+89CYLAdinqYUUGoMk6fILX+P
-      jo4S1reHPNGmMi4JYBzzNAlIjgiEiFzLP3NzcwGgurq6ra2NsB4AjLgj05LTJGBMrR8b7AUAwoet
-      vb397t277e3tFusBwF/gSL03TWVAKuKdKf+2uLiY+GdxcbGV9QhAmi/DHdoAYNoEcFE0LHHio8Lq
-      6moAmGw9ACwJMM0QfYdTAADWLogRRqZZ6pzJ1sfJsa2zSdtaaqavHQCAWJmptrZWFZzaHjBhvQ8f
-      WxlsygsxMtufcBLTJ2BST2GhwqgZMyBiLvgLMCdXRJwVMK5SKxUTY7qZM2eSBbPq53jxcC+ea/rq
-      zgo4ePQkrp342oT4jKRfC0GPjsUpemnO42whtlhvYV9xtX5SdeJW68EdtZCsv3bvpXtE/nC39eB8
-      Fpq6lhwYGIgrGsrv+UuGm9xtPVBMq1RVVTkTr8vfvSu/oQEAlVojlYgBYPJwOyAggLjS0NDQ3Nw8
-      EDAvLCUdwL0zeY4IMJlM+w8defWFQgA4evThGdhELURc6fGf1x78xF+bsHcStTL7q72O40gh/vZG
-      PRhsT9RY9XOG9OinLUKzO2dnGAswGo1Ndba/7LTZz2lQcA528Knj7NOh9QqOwaFGmXEWut7Q4iMV
-      Akycm23xpdLpdFOtJzjXxwuTYFkBtg9fOtnN/6aLiwMSIMB/laDz4zMrM66phWy++8lwEHgzXjdH
-      Zt3jLx/g/bP1YfrEybE347U2E4LxJyg20Wh1igcQVxQKxaVLl6itBwAzDv+3WTBqeORxN0a5/9P6
-      SO5qHEfL+5llCmahv9p/ADFPdNyJOufgwYMwZXRiE4UR2dnM/+VcvYiDA0CDAv3kro1B5L87+ak+
-      mA/tjMRMgMV6AptjKwraVJwdt4TpfuYxI1I5xLVZO2nNyD/b+D+LpetE7nhXwm6+t8mgHj3VYyff
-      1o5yKoe5GX62C70VzARYPgczGo0OWE+ffW38eLlZTmPMQKsQW9YXCgsLCwsLY2JijEaj+6wHAJUJ
-      2d9By3GVloBzlbXEH1qt9sqVK2599xYqhzjXR+x7D9vPQiq1erDtDkAmPPiceRqsJ/iyTRAn14gp
-      bSRNAYv/4bmKm4CZgXmd4zwKI/LvTgFQ+hLa8Z02Go1D7U3gaJ3jPBcGuK0qlM8n7U3Z8Z1GOByt
-      OAAAWLEeAHCAIT1K4X9Lmr8CAwMHBwe5KJoyO/huXV9AdHJq8iKA6f5IScyFeC8zxae1pAKkUqmP
-      j8/p06fvTqzXLgJwZPLVeXx9fSlc6amq0YiIiO7ubnePyqkRiUSWL2ptYsfZw2Aw3Lt3b/JGKdOJ
-      l5dXdHS01VdsVtByPR4ZGRkYGFAqldOz7xmKojKZLCgoyMfHx25gj+8023gEsI1HANt4BLCNRwDb
-      eASwDa15IWSsAWn+Eu8tR1SdYGKw0Y7sDRwAlH9jMm/OFePScAhZjs95Abzj7Ae3c9+sR67+Fmn+
-      HHBnl9TpYtIgY40w1og07oK4V7C094FDtbxAmYXMeqRkA9K0B3A2dg/GzXBnF1K6EcxUfiBUApCr
-      v0H6LrnaLmYgvRfQa29TBCCfFxprQJq/cL1FDtC4BxlrJLtJLqD5S3ZyzlRwMzT/k+wmeRbqLXeH
-      MQ7SW0Z2h7wWUlF57dePBt5RBM316k/wId2T24Ugqi6yiXbyFDBRbUrWMu5/uiu2ZdzBrdwYQ27M
-      96MltnB33P+uwg8AWpT+xP9Pd8UCQIzXcIx8iOmzj3XET724bpbtExXJYCagYTTwWOfDp9aPBtaP
-      BgLAuvAGRwR0TruAaPnQmrAmeJAUlhcfzdx6AFgXzsxWmzATkOAzQFQ7xzri7yr84r36mb6wyTjz
-      Wwvfs0JsId5ngIeaY7yGXWuNAzgoIEY+5ECpdQePfRbyCGAbjwC2eewFkC4xTT5I5rsA2fegj30K
-      kDZkzGajSCAmts6dO+d8VK7xWvwO4hHANh4BbPO9FMDSbg22YSzg3rjvH2pXjBmEAKA0Cv5Ym9Ok
-      mK7pLVswHpEdbEtuV/p8cDv7x3GVu5oy7qvlh9qSfptS5sAmi9TnidKEcQr8r/iKUImiRyPfcX3l
-      fbV8pnj8J/FX2NjueALGKSDj6X8cV/W7aytxQBDAX4urkvMd3ELD4ROwJsNYgNIo+LQxg7AeB+TT
-      xkVvJl+U8xzxZmQnC/29IZPIOb9PKyby0s561lwCwYEU2BxZ+3Vb6va4K3K+/pdJF//ekLkp0sHj
-      6tychbgSm7Pys2Wjv0meWC+R8fS/SSl33gi7cHEt2S3yLCQNc4stDsE3k3omkgrAQ5a7xxhH8OYz
-      3+EJn/MCII7sXu5yENwcMIv0YFHyLOQdB3GvuMUihgQjbcJAG0shBFTVKJb2Pj7t/vZWeBlbwxds
-      pAhA2Q5w+PiKf8PcH7GSlxDcHAItcZnrqZ097LUDHD6W/n+QOS9D8z+htxxRdTByt3EALqYR4Aov
-      rjpg9jxhYKHd8B7fabbxCGAbjwC28QhgG48AtvEIYBu6g/raXs3pZkVll6pPZVLq3fVRpUzACZZy
-      M8KkBShsiPcAAAuhSURBVLFeycG0jnO135kbVJvePd9d1qqkDuZyciJlO3JmBkjsvGI7AhoHda8d
-      ax9Um6R8dEuKf16M12wfgUzgruHBuN7cNqI/d3dsf+2w2ogFSrifPR0R6y+k+AmVgEG1acP+lkG1
-      KTNc+uGaWX7UH7e7lGGN6eenOyo7VYES7r+3RAVIHDrK6N3z3YT1u5+NnE7rAcBPzN3zbOSiMOmA
-      2vT7sl6KkKQCans1Za1KKR/9qGAWF2Vh9pmLIh8VzJLw0NJ747f7mE9snW5WAMCWFH9f0bS++8n4
-      i7mbU/wA4FQT84mtyi4VAOTFUHlMnD17dvv27Z9//rkTRtohL8YbACrvM3c97lUaASDSl6oGKCoq
-      0mg0Fy9edN824ZG+AgDoU9reLhkoBKgMGABI+VSlPCMjAwASEhKYHltGH7mAAwDj5E0n4/zd29t7
-      4sSJF154QSAQbNq0ad26dUIhVSq5G8Z9oUOHDlVUVOzevZvYG59d64GpgPb29hs3bgBATU3NmTNn
-      iIvTs1MAGcwEHDlyxHIowaFDh27dujUyMvLmm2+ePHnSDbbRgkEZaGlpuXXr4WoSjuN/+9vfeDye
-      Tqc7duxYampqaGioGyy0A4MU+Oabb6yumM1m4khok8m0d+9eVvISgxRITU1NTEwku4sgiMlkothH
-      x00wEJCXl+c+OxzmsR9SegSwjUcA23gEsI1HANt4BLDNYy/AjXM+sR/VWl1p+nmKzetTIULS4bFP
-      AY8AtvEIYBs31kJkNQn9GoYOnhQgh+V2gFjJc9+KKk0UOjMAeAlJlxVJBQRLuQDQNsrC8ZqTaR3R
-      A0CQlHSRjzQLZYRJ7w7rzzaP0Vxwpo+cySptcYsCADLCJGQBSJdZb/VpNh9olfDQ4lfmTvMSpYVB
-      tTFvb6PWiH29OSopyPZp0aRZKDlYnBMpUxuxn5/uMGEsfHhlwvCfn+7UGLHcaDmZ9UBdje7ImRko
-      4VZ2ql4+3DqkoXWcgasYVBtfOtxa3aUKknLfXhZCEdKOq0HTkO61o+0DapOEh25O8cuL8Y70FTDK
-      xIxQ6MytI/riFsX+2iGNEQuScj9bFzHHYVcDgkG18fdlvaX3pnvr6ZXR8reXhVA4GRDQdT2+3ac9
-      1TRW0aXqV5ko1gydRC7gBMt4GWGSglhvinw/GY/vNNt4BLCNRwDbeASwjUcA23gEsI27hloDA0PF
-      xeXF58qMJtOKFctWrnwiLGyGOx7k4s6cWq25cOFK0ZnSmzfrAYGkKAGCIrXNOhzH4+dGr8zLycnJ
-      8vOzf7YJfVwjAMOw69dvFRWVlZdf1ukMs0IEOQvEqzIlMwN4ADA0Ziqr0ZRd19y+q0VRJDExLj8/
-      Z8WKbInEBdMFzgpoa+ssKio7ders2JiSy0WSooTPr/ZKT7Ddle/oNZZeVZdc1XT16QV83oKF8/Lz
-      l2dlLeLxHD+91UEBRBY/ebKkq6ubz+ctTZ/N43FqG3p6+xUCPid7nmhVpnRhvIjMZbmpQ19UoS67
-      phkeM0oloqylmfn5y+fPT6Y4d8w1AlQq9eXLVadOFd+4UYeiSGxU0DOrE1ctmysW8QAAx/Gb9d2n
-      ShpKL99VqfX+PryV6eL8TGnkTNteUBgOdS26s5Xqkmq1RmcODPB5YtnS5cuXJCeTfv7soACDwXj1
-      6o2ysstlZd/q9YbwEIHZjPUMGgEgJX5mQW58bnasVPzQSr3BdKHi3unShoprHRiGxYSLVmWIVqZL
-      fb1szwbojXhNg/ZspfrSTY3JhM2eHbp8efaqVctmzqSaj6AloKmppaio7Ny58wqFKsiPvzRVVLBE
-      Gh3GB4CBEVNxterkZfX9fgOfx1k0f1bBivgnFkdzOQ+zwbhSV3q5+VTpndr6bhRB5sUJ8zMly+ZL
-      hQLbeUulxS7fVJ+t1Fxv1GEYFhsblZ+/Ijd3qY+PN2MBv/rVH27dqlcq1XIJd3maKC9DmhQttLkJ
-      DJGhS6o1Y0qjXCZckTVnzYq5qQmPnFnf2jlccrH5ZElDb79CKuYuSRHmZ0rT4kRku8r0j5hKqlUl
-      1dqWLh2KooGBfocO7WUmICvrSQBAECRljnBlumRZmlguoZoOMpjwq/Xas5WaSzfUJjM2O9w3d2ns
-      k3kJIYEP3aoxDL91p+d06Z2isjtanTHAh5e3SFKQJQ0Lsq6FuvqNJdWq4ipNV78BQRAcxy9fPsFY
-      QF4aRyZGKhqgZ9iEosi8WGF+puSJ+VIRSQYgGFeby6+piyq0t1s0KIIkzQ0pyI23FHQClUZ/4UrL
-      6fONV2924jgeGyFatUi8MkOCIlB+TV1Uqalr0eI4xIQLchcKhsbM/y5VOyJg/VLuhqUcAOgaxKsa
-      sUt1MDBq4vPQBXOF+YulWSliHpdKyb37hqIKZXG1dnjMKBLyViyNWZOTkJYcik6qXHv7x0+fv3Oq
-      pKGrZxRBAEEQDMNnhfCyUwW56cIZ/lwA+PK06n/OqMgE0OoLhQUgYQGcZ7Pw5vu8qkas4o7+yi2N
-      TMxZnCJanibJTBbbrO+jQvnbN/q9vgGu1muKKtTFF5pOFjcE+ctWr5i7Jid+drgvhuFdPaOd3aPD
-      o2oAQFHER4a+9aJXYhQD51MGnTkUQeLCkLgw9Ie5UN+BXryNXbyuOVuh8vfmLUsTL08T2yzlKAKL
-      EsWLEsVqLXa+Rl1Uof7nweovDlT7eov0Rkyt1kslgmWLowtWzD186tbwQAcj65kJsIAgkBiBJkag
-      BhPcbjNfrsOOlo8fKlUE+/NWLJCsyZKGTymUACARoUlRwsFR88CIqW/YODKmlYj5f/rt2uzMKB6X
-      AwCHTzuyzY9T3Wk+F9JiOGkxoNFDTbO5qhH/+pxiX9HY7BmCZWni1YulIf5ceLQzhyBIwmzeljx5
-      cbVOZ5avWDrHGQOcFWBBLIDsJE52Eoyq0Mo7WMUd8+cnRr84ORYdxgccv3ffiOF43GzB6+vly+YL
-      feUoAJyv0bnknEsXD2h8pMjqhZzVC6F/FL3SYD5WYQBACvMlOQtEoYFuWVVw14gsyAd5Zgm3rt3I
-      43N/uEbqpqeAWxe6aaLTG8uv3DtV2lB9ozMzibH3PpsCFEr9ex+eLbvSotboE6LEbzwnW5ZG61jr
-      ybAmAEVgcFhZdb3lqSxu3iJZaKCDlrAm4IdrpBtX4GlzBU5+aMqaAKYtLhmP/cSWRwDbeASwjUcA
-      23gEsI1HANt4BLANaW9UIOCfrDSNqfCV89FZQezovNdtPH5JW3pVT7HwQSpg164PDx48XlxcXnrD
-      GBfOXTkfWRSHcqZFiMmMX7qpP35JW3dPz+Vyly/P2rjxKbLAdtYH1GpNaenFA18f6ejs8ZaiSxPR
-      vDTU34vuGOQP+4w8PveDN3xphh8Zx4qrNccv6QdGjP5+3qvyczdsWBsQ4EfxE1orNMQi5LGjRRcu
-      XgEcUqOQ1emchFmo3T3j6Qu422X8plxTfk1nMuOxsVEbNz6Vm5vN5dofb9EakaEoumBB6oIFqd3d
-      vcePnztx4swf/6UO8eOsnI8sT+EInRhaGYz4hRu6w2Xae/cNYrFwTcGqDRvWRkbOoh+DI6uUBoPx
-      /PlLBw8ebW5uEwvRjDgkfyEnLMBGclCkQPeg+cwV7ZlK3bjKFBoa/OSTq556Kl8mYzyD5NQ6cVNT
-      y7FjZ88WndcbDLFh6OqF6MI5nMkVxlQBGIbfvGs4Uq6tqtchgMxPS9m48cnFixcijh5h4IKV+pGR
-      0TNnSo98c6qvf8hXhi5PRfPSOHKxtQC1Dj9bqT1SrukbNnl7ywsK8p55ZnVwcKCTT3eZrwSGYRUV
-      NQcPHr9+/RaXA/Oj0dXp6MELZh6f++NnZScuaUtr9HqDOXZO1Lqn8/Pzc1y1hYbrPXfb2jqPHDl9
-      5kyJVqsXC1AERdRas0DAz819Yv36gjlzolz7OHe5HqvVmqKi87t3f2U2Yy+9tKWgIFcul7njQR7f
-      abbxCGAbjwC28QhgG48AtvEIYJvHXsD/A6bfCVPpNjVjAAAAAElFTkSuQmCC
-    )
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 159.385 94.615 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 150b4643-ceae-41af-ad53-ecad8e9e3b00)
-  )
-  (text "test text" (at 109.22 89.535 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 17da00c8-511b-4e36-8725-4aab64bd1eb5)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 159.435 91.2644 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 3eb9ee9f-ea5b-46ea-bb6a-e2bdf664f98c)
-  )
-  (text "test text with \"quotes\"" (at 222.935 58.8794 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 50675082-562c-4536-9f6d-9686c9013db3)
-  )
-  (text "some mirrored stuff" (at 191.185 30.3044 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 560675e5-8bcf-4b40-956e-938b62b29e5a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 162.66 132.3638 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 6914c59d-3754-4af1-9c34-a108c9a97289)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 161.975 119.8394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96305798-f70e-497f-8e67-db5f376dd81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 160.07 110.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 994ec885-6884-4cc7-adb2-8624a30a017c)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 160.07 100.1544 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b9443135-c28c-470a-b131-f04eed8cf352)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 160.07 107.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ba8d3aee-36c0-4b07-805a-43ef0e25285a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 162.025 116.4888 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid bb0370f1-34b3-4b8e-9761-843455def526)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 162.66 125.3788 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid bb34cb8b-8eb4-468f-8bfa-2fbe3446fa35)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 159.435 103.3294 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d8afd384-ce86-4dde-b0cb-3b4bdcf89a36)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 162.66 135.5388 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid df457be3-eca7-4c79-820a-3339d1aff598)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 162.025 128.5538 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid e17d7b76-0c3e-40c5-b0b8-2b2f1e7e7b80)
-  )
-
-  (label "BUS1" (at 93.98 89.535 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 59419ac3-6c2c-49bf-bb7f-cf754b00d367)
-  )
-  (label "NET1" (at 82.55 82.55 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d9321ffd-0666-43a7-8284-7d646d5051df)
-  )
-
-  (global_label "PORT1" (shape input) (at 59.69 95.885 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 9538ac08-5497-4cfe-969a-d84b5b1efad5)
-    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 51.2293 95.9644 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "INPUT" (shape input) (at 68.58 111.125 0)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid a27475de-e9bb-4b6d-8ca3-640675f4791e)
-  )
-  (hierarchical_label "OUTPUT" (shape output) (at 75.565 92.075 180)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid c8905471-f39e-4cac-90f8-2265c893933d)
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 203.885 71.5794 0) (mirror y)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 0cd888ec-79f0-49c1-bee4-7f19c90f9704)
-    (property "Reference" "SW203" (id 0) (at 212.14 69.6743 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 212.14 72.2143 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 70.9444 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 204.52 70.9444 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid a61e07f7-4d38-42f6-9a2c-64b53a5403df))
-    (pin "2" (uuid 4b515f84-8477-4976-881d-2a3c6a2d5c42))
-    (pin "3" (uuid 0c65036a-a2a3-41ee-ae0e-0b5af6f3a0fd))
-    (pin "4" (uuid 023c54ea-f210-49cd-b4e0-e8f28a89b5a6))
-    (pin "5" (uuid 7cb3f40b-ba22-4774-bae6-daad7b2f7e90))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 203.885 39.8294 180)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 32c7dd17-7fb4-40dd-af25-9c33f4bdc487)
-    (property "Reference" "SW201" (id 0) (at 211.505 39.1943 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 211.505 41.7343 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 40.4644 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 204.52 40.4644 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 9ed5f09d-f428-462b-978c-7a9dd8637c06))
-    (pin "2" (uuid 39e21440-6d5d-43f9-994d-f84527e450a7))
-    (pin "3" (uuid bc35d20a-3a1b-48e8-a2f8-83c0dfacde63))
-    (pin "4" (uuid eda6507e-e276-4ffa-92fd-6ed8e881e32b))
-    (pin "5" (uuid 2ca5eb5b-161b-4bdd-9321-319f7ccae350))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 40.005 83.185 0)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid bdef23b1-6007-45e3-b7f6-a3982b9ea650)
-    (property "Reference" "SW204" (id 0) (at 40.64 70.485 0))
-    (property "Value" "SW_Coded" (id 1) (at 40.64 73.025 0))
-    (property "Footprint" "" (id 2) (at 39.37 82.55 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 39.37 82.55 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid ba130c3b-b370-4055-b47f-c1b337773748))
-    (pin "2" (uuid 0072ba71-a7b0-4ea9-a9eb-7ed9defd9bb1))
-    (pin "3" (uuid d5ba225e-3b99-4a05-92ff-d20366c7b769))
-    (pin "4" (uuid 39383f40-80c3-422f-a3e5-c1a7d6da66ec))
-    (pin "5" (uuid 6e4cc567-d5ce-4e86-b7ac-aa9aaa1840a2))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 202.615 55.0694 0) (mirror x)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid e7ef55bd-b405-45b8-9c2e-c2b3259d390d)
-    (property "Reference" "SW202" (id 0) (at 194.36 54.4343 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 194.36 56.9743 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 201.98 55.7044 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 201.98 55.7044 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 62f6c29e-6f92-40a3-b7ed-8a33e7b489d2))
-    (pin "2" (uuid 837505cc-04f5-48c3-b210-0520292d70d0))
-    (pin "3" (uuid bb7c7038-8fd8-4519-9f07-3d6e261570db))
-    (pin "4" (uuid d87f1eb8-2b6f-4c3d-b2e5-fa1e62b7f193))
-    (pin "5" (uuid 6dc5c987-e66b-420e-8b13-a723c76a94b2))
-  )
-)
diff --git a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected
deleted file mode 100644
index 82cf29d..0000000
--- a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected
+++ /dev/null
@@ -1,755 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid 6e843ea7-4071-4f6c-927e-0a85e27d67ff)
-
-  (paper "A4")
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 81.915 82.55) (diameter 0) (color 0 0 0 0)
-    (uuid 5bceda0d-fb78-44a3-a29a-ea07e0a5929e)
-  )
-
-  (no_connect (at 52.705 83.185) (uuid 3dfda617-5f32-441f-b084-963be5408bae))
-  (no_connect (at 52.705 80.645) (uuid 477819ad-79ff-4d5d-89c1-732b044f2082))
-
-  (bus_entry (at 91.44 82.55) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 18831711-c623-41d8-9212-3655becaa56d)
-  )
-
-  (wire (pts (xy 63.5 88.265) (xy 63.5 95.885))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0e7574b9-8d09-4ea5-a886-d2ce80444647)
-  )
-  (wire (pts (xy 66.04 111.125) (xy 66.04 85.725))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 2ed3dc6d-8e4d-4865-868d-a1da880817db)
-  )
-  (wire (pts (xy 68.58 111.125) (xy 66.04 111.125))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 31cb89f7-66e2-4cbe-926c-7b7b9c36f9c7)
-  )
-  (wire (pts (xy 97.79 114.3) (xy 127 114.3))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid 359d4095-7e08-4e54-945e-63f380a9ecd6)
-  )
-  (polyline (pts (xy 133.985 100.33) (xy 133.985 93.345))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 6db7da7f-af3b-4506-ae16-7d3c30043925)
-  )
-  (wire (pts (xy 81.915 82.55) (xy 81.915 92.075))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 77eb5e67-b395-4b8f-b355-c9978aa1a254)
-  )
-  (polyline (pts (xy 107.95 93.345) (xy 133.985 93.345))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 880e21ec-04c1-4f84-b0b1-e2a1deb77409)
-  )
-  (wire (pts (xy 81.915 82.55) (xy 91.44 82.55))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 897e013f-e31e-417f-b355-ca9b9f9dad45)
-  )
-  (wire (pts (xy 97.79 111.76) (xy 127 111.76))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid 8a43a549-7c53-4159-9079-e3706117cb9f)
-  )
-  (polyline (pts (xy 93.98 100.33) (xy 133.985 100.33))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 993d4deb-f3bd-4daf-a633-6a6f3f8cbf09)
-  )
-  (wire (pts (xy 97.79 116.84) (xy 127 116.84))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid b26f05c6-45b4-4835-b8be-d2c660fd83ad)
-  )
-  (wire (pts (xy 81.915 76.835) (xy 81.915 82.55))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bd5238e4-3d13-4f80-8c81-e607942cb6c2)
-  )
-  (wire (pts (xy 66.04 85.725) (xy 52.705 85.725))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d45e4606-e8b1-4c12-9fd9-0c03f8aa8d64)
-  )
-  (wire (pts (xy 97.79 119.38) (xy 127 119.38))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid d4f7fae7-033b-42f6-b7ba-d553a4e26289)
-  )
-  (wire (pts (xy 52.705 76.835) (xy 81.915 76.835))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d5006b7f-8c6e-4019-8600-ede16e238028)
-  )
-  (bus (pts (xy 93.98 85.09) (xy 93.98 93.98))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d72f4dfe-cd6b-4029-88de-1ebbe52a7481)
-  )
-  (wire (pts (xy 81.915 92.075) (xy 75.565 92.075))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid e2c964f0-ce92-433d-9cb2-b6bc8e78ff43)
-  )
-  (wire (pts (xy 52.705 88.265) (xy 63.5 88.265))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f8094f9e-1288-42f7-aa5f-0008dd97eebf)
-  )
-  (wire (pts (xy 63.5 95.885) (xy 59.69 95.885))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f8164270-f2b4-4d38-b6cd-1ebcbb4cc15d)
-  )
-
-  (image (at 112.395 58.42)
-    (uuid 49d344ac-ce14-464c-a802-3dfe8261b773)
-    (data
-      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
-    )
-  )
-  (image (at 24.765 127.635) (scale 2.546)
-    (uuid 7b2f6028-5234-4df8-8d41-bf003f728f58)
-    (data
-      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
-    )
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 159.385 94.615 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 150b4643-ceae-41af-ad53-ecad8e9e3b00)
-  )
-  (text "test text" (at 109.22 89.535 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 17da00c8-511b-4e36-8725-4aab64bd1eb5)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 159.435 91.2644 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 3eb9ee9f-ea5b-46ea-bb6a-e2bdf664f98c)
-  )
-  (text "test text with \"quotes\"" (at 222.935 58.8794 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 50675082-562c-4536-9f6d-9686c9013db3)
-  )
-  (text "some mirrored stuff" (at 191.185 30.3044 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 560675e5-8bcf-4b40-956e-938b62b29e5a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 162.66 132.3638 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 6914c59d-3754-4af1-9c34-a108c9a97289)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 161.975 119.8394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96305798-f70e-497f-8e67-db5f376dd81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 160.07 110.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 994ec885-6884-4cc7-adb2-8624a30a017c)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 160.07 100.1544 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b9443135-c28c-470a-b131-f04eed8cf352)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 160.07 107.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ba8d3aee-36c0-4b07-805a-43ef0e25285a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 162.025 116.4888 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid bb0370f1-34b3-4b8e-9761-843455def526)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 162.66 125.3788 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid bb34cb8b-8eb4-468f-8bfa-2fbe3446fa35)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 159.435 103.3294 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d8afd384-ce86-4dde-b0cb-3b4bdcf89a36)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 162.66 135.5388 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid df457be3-eca7-4c79-820a-3339d1aff598)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 162.025 128.5538 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid e17d7b76-0c3e-40c5-b0b8-2b2f1e7e7b80)
-  )
-
-  (label "BUS1" (at 93.98 89.535 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 59419ac3-6c2c-49bf-bb7f-cf754b00d367)
-  )
-  (label "NET1" (at 82.55 82.55 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid d9321ffd-0666-43a7-8284-7d646d5051df)
-  )
-
-  (global_label "PORT1" (shape input) (at 59.69 95.885 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 9538ac08-5497-4cfe-969a-d84b5b1efad5)
-    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 51.2293 95.9644 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "INPUT" (shape input) (at 68.58 111.125 0)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid a27475de-e9bb-4b6d-8ca3-640675f4791e)
-  )
-  (hierarchical_label "OUTPUT" (shape output) (at 75.565 92.075 180)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid c8905471-f39e-4cac-90f8-2265c893933d)
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 203.885 71.5794 0) (mirror y)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 0cd888ec-79f0-49c1-bee4-7f19c90f9704)
-    (property "Reference" "SW203" (id 0) (at 212.14 69.6743 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 212.14 72.2143 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 70.9444 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 204.52 70.9444 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid a61e07f7-4d38-42f6-9a2c-64b53a5403df))
-    (pin "2" (uuid 4b515f84-8477-4976-881d-2a3c6a2d5c42))
-    (pin "3" (uuid 0c65036a-a2a3-41ee-ae0e-0b5af6f3a0fd))
-    (pin "4" (uuid 023c54ea-f210-49cd-b4e0-e8f28a89b5a6))
-    (pin "5" (uuid 7cb3f40b-ba22-4774-bae6-daad7b2f7e90))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 203.885 39.8294 180)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 32c7dd17-7fb4-40dd-af25-9c33f4bdc487)
-    (property "Reference" "SW201" (id 0) (at 211.505 39.1943 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 211.505 41.7343 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 40.4644 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 204.52 40.4644 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 9ed5f09d-f428-462b-978c-7a9dd8637c06))
-    (pin "2" (uuid 39e21440-6d5d-43f9-994d-f84527e450a7))
-    (pin "3" (uuid bc35d20a-3a1b-48e8-a2f8-83c0dfacde63))
-    (pin "4" (uuid eda6507e-e276-4ffa-92fd-6ed8e881e32b))
-    (pin "5" (uuid 2ca5eb5b-161b-4bdd-9321-319f7ccae350))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 40.005 83.185 0)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid bdef23b1-6007-45e3-b7f6-a3982b9ea650)
-    (property "Reference" "SW204" (id 0) (at 40.64 70.485 0))
-    (property "Value" "SW_Coded" (id 1) (at 40.64 73.025 0))
-    (property "Footprint" "" (id 2) (at 39.37 82.55 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 39.37 82.55 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid ba130c3b-b370-4055-b47f-c1b337773748))
-    (pin "2" (uuid 0072ba71-a7b0-4ea9-a9eb-7ed9defd9bb1))
-    (pin "3" (uuid d5ba225e-3b99-4a05-92ff-d20366c7b769))
-    (pin "4" (uuid 39383f40-80c3-422f-a3e5-c1a7d6da66ec))
-    (pin "5" (uuid 6e4cc567-d5ce-4e86-b7ac-aa9aaa1840a2))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 202.615 55.0694 0) (mirror x)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid e7ef55bd-b405-45b8-9c2e-c2b3259d390d)
-    (property "Reference" "SW202" (id 0) (at 194.36 54.4343 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 194.36 56.9743 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 201.98 55.7044 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 201.98 55.7044 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 62f6c29e-6f92-40a3-b7ed-8a33e7b489d2))
-    (pin "2" (uuid 837505cc-04f5-48c3-b210-0520292d70d0))
-    (pin "3" (uuid bb7c7038-8fd8-4519-9f07-3d6e261570db))
-    (pin "4" (uuid d87f1eb8-2b6f-4c3d-b2e5-fa1e62b7f193))
-    (pin "5" (uuid 6dc5c987-e66b-420e-8b13-a723c76a94b2))
-  )
-)
diff --git a/tests/testdata/schematic/test_parseStrokeTokens b/tests/testdata/schematic/test_parseStrokeTokens
deleted file mode 100644
index 3793d3a..0000000
--- a/tests/testdata/schematic/test_parseStrokeTokens
+++ /dev/null
@@ -1,64 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "Comment 1")
-    (comment 2 "Comment 2")
-    (comment 3 "Comment 3")
-    (comment 4 "Comment 4")
-    (comment 5 "Comment 5")
-    (comment 6 "Comment 6")
-    (comment 7 "Comment 7")
-    (comment 8 "Comment 8")
-    (comment 9 "Comment 9")
-  )
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-    )
-  )
-
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-  )
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default))
-  )
-
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 132 50 37 0))
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-  )
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default))
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default))
-  )
-)
diff --git a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic
deleted file mode 100644
index 921c41a..0000000
--- a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic
+++ /dev/null
@@ -1,41 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded"
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (symbol "SW_Coded_0_1"
-      )
-      (symbol "SW_Coded_1_1"
-      )
-    )
-    (symbol "SomeLibNickName:Unset_Lib_Id"
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (symbol "SW_Coded_New_0_1"
-      )
-      (symbol "SW_Coded_New_1_1"
-      )
-    )
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0)
-    (in_bom no) (on_board no)
-    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-  )
-
-  (symbol (lib_id "Switch:Some_Component") (at 111.76 163.83 0)
-    (in_bom no) (on_board no)
-    (property "Value" "Some_Component" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected
deleted file mode 100644
index cb17373..0000000
--- a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected
+++ /dev/null
@@ -1,42 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (lib_symbols
-    (symbol "RenamedSwitch:SW_Coded_New"
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (symbol "SW_Coded_New_0_1"
-      )
-      (symbol "SW_Coded_New_1_1"
-      )
-    )
-
-    (symbol "Unset_Lib_Id"
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (symbol "Unset_Lib_Id_0_1"
-      )
-      (symbol "Unset_Lib_Id_1_1"
-      )
-    )
-  )
-
-  (symbol (lib_id "SwitchRenamed:SW_Coded_2") (at 111.76 163.83 0)
-    (in_bom no) (on_board no)
-    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-  )
-
-  (symbol (lib_id "Unset_Lib_Id") (at 111.76 163.83 0)
-    (in_bom no) (on_board no)
-    (property "Value" "Some_Component" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_schematicWithAllPrimitives b/tests/testdata/schematic/test_schematicWithAllPrimitives
deleted file mode 100644
index 12e1f50..0000000
--- a/tests/testdata/schematic/test_schematicWithAllPrimitives
+++ /dev/null
@@ -1,891 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "Comment 1")
-    (comment 2 "Comment 2")
-    (comment 3 "Comment 3")
-    (comment 4 "Comment 4")
-    (comment 5 "Comment 5")
-    (comment 6 "Comment 6")
-    (comment 7 "Comment 7")
-    (comment 8 "Comment 8")
-    (comment 9 "Comment 9")
-  )
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
-    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
-  )
-  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
-    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
-  )
-
-  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
-  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
-
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
-  )
-
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
-  )
-  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
-  )
-
-  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
-  )
-  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
-  )
-
-  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
-  )
-  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
-  )
-  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
-  )
-
-  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
-  )
-  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
-  )
-  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
-  )
-  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
-  )
-  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
-  )
-  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
-  )
-  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
-  )
-  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
-  )
-  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
-  )
-  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
-  )
-  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
-  )
-
-  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
-  )
-  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
-  )
-  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
-  )
-  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
-  )
-
-  (image (at 267.97 113.665)
-    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
-    (data
-      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
-    )
-  )
-  (image (at 293.37 124.46) (scale 2.546)
-    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
-    (data
-      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
-    )
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.17 225.2494 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 71.12 228.6 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 69.215 208.915 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
-  )
-  (text "test text" (at 238.76 125.73 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 71.805 234.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 69.215 215.9 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
-  )
-  (text "some mirrored stuff" (at 100.33 139.065 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
-  )
-  (text "test text" (at 217.17 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 574c189f-038f-4bc8-9345-58278240344b)
-  )
-  (text "test text" (at 165.735 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 71.805 241.1244 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.805 244.2994 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 71.17 237.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
-  )
-  (text "test text with \"quotes\"" (at 132.08 167.64 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 69.215 219.075 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
-  )
-  (text "test text" (at 261.62 172.72 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 68.58 212.09 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
-  )
-
-  (label "BUS1" (at 201.93 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
-  )
-  (label "NET1" (at 190.5 125.095 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
-  )
-
-  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
-    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
-    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
-    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
-    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
-    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
-    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
-    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
-    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
-    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
-    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
-    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
-    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
-    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
-    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
-    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
-    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
-    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
-    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
-    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
-    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
-    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
-    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
-  )
-
-  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
-    (fill (color 4 0 255 1.0000))
-    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
-    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 162.56 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
-    )
-    (pin "OUTPUT" output (at 203.835 165.1 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
-    )
-  )
-
-  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
-    (fill (color 0 0 0 0.0000))
-    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
-    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
-      (effects (font (size 1.27 1.27)) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
-      (effects (font (size 1.27 1.27)) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 180.975 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
-    )
-    (pin "OUTPUT" output (at 203.835 183.515 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
-  )
-
-  (symbol_instances
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
-      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
-      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
-      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
-      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_schematicWithAllPrimitives.expected b/tests/testdata/schematic/test_schematicWithAllPrimitives.expected
deleted file mode 100644
index a279a8b..0000000
--- a/tests/testdata/schematic/test_schematicWithAllPrimitives.expected
+++ /dev/null
@@ -1,887 +0,0 @@
-(kicad_sch (version 20211123) (generator eeschema)
-
-  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
-
-  (paper "User" 431.8 279.4)
-
-  (title_block
-    (title "The title")
-    (date "19.02.2022")
-    (rev "A")
-    (company "The company")
-    (comment 1 "Comment 1")
-    (comment 2 "Comment 2")
-    (comment 3 "Comment 3")
-    (comment 4 "Comment 4")
-    (comment 5 "Comment 5")
-    (comment 6 "Comment 6")
-    (comment 7 "Comment 7")
-    (comment 8 "Comment 8")
-    (comment 9 "Comment 9")
-  )
-
-  (lib_symbols
-    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
-      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
-        (effects (font (size 1.27 1.27)) hide)
-      )
-      (symbol "SW_Coded_0_1"
-        (circle (center -0.635 0.635) (radius 3.81)
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (polyline
-          (pts
-            (xy -0.889 -1.905)
-            (xy -0.889 2.667)
-            (xy -1.397 2.159)
-            (xy -1.905 2.159)
-            (xy -0.635 3.429)
-            (xy 0.635 2.159)
-            (xy 0.127 2.159)
-            (xy -0.381 2.667)
-            (xy -0.381 -1.905)
-            (xy -0.889 -1.905)
-            (xy -0.889 -1.905)
-          )
-          (stroke (width 0) (type default) (color 0 0 0 0))
-          (fill (type none))
-        )
-        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
-          (stroke (width 0.254) (type default) (color 0 0 0 0))
-          (fill (type background))
-        )
-      )
-      (symbol "SW_Coded_1_1"
-        (pin passive line (at 12.7 6.35 180) (length 5.08)
-          (name "CM" (effects (font (size 1.27 1.27))))
-          (number "1" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 2.54 180) (length 5.08)
-          (name "D0" (effects (font (size 1.27 1.27))))
-          (number "2" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 0 180) (length 5.08)
-          (name "D1" (effects (font (size 1.27 1.27))))
-          (number "3" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -2.54 180) (length 5.08)
-          (name "D2" (effects (font (size 1.27 1.27))))
-          (number "4" (effects (font (size 1.27 1.27))))
-        )
-        (pin passive line (at 12.7 -5.08 180) (length 5.08)
-          (name "D3" (effects (font (size 1.27 1.27))))
-          (number "5" (effects (font (size 1.27 1.27))))
-        )
-      )
-    )
-  )
-
-  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
-    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
-  )
-  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
-    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
-  )
-
-  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
-  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
-
-  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
-  )
-
-  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
-  )
-  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
-  )
-  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
-  )
-  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
-  )
-  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
-  )
-  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
-    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
-    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
-  )
-  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
-  )
-  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
-  )
-  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
-  )
-  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
-  )
-  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
-    (stroke (width 0) (type solid) (color 237 53 69 1))
-    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
-  )
-  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
-  )
-  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
-  )
-  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
-  )
-  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
-    (stroke (width 1) (type dash) (color 119 68 255 1))
-    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
-  )
-  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
-  )
-  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
-  )
-  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
-  )
-  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
-  )
-  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
-  )
-  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
-  )
-  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
-    (stroke (width 2) (type dot) (color 54 255 245 1))
-    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
-  )
-  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
-    (stroke (width 0) (type default) (color 0 0 0 0))
-    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
-  )
-
-  (image (at 267.97 113.665)
-    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
-    (data
-      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
-    )
-  )
-  (image (at 293.37 124.46) (scale 2.546)
-    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
-    (data
-      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
-    )
-  )
-
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.17 225.2494 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
-    (at 71.12 228.6 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 69.215 208.915 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
-  )
-  (text "test text" (at 238.76 125.73 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
-    (at 71.805 234.1394 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 69.215 215.9 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
-  )
-  (text "some mirrored stuff" (at 100.33 139.065 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
-  )
-  (text "test text" (at 217.17 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 574c189f-038f-4bc8-9345-58278240344b)
-  )
-  (text "test text" (at 165.735 103.505 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
-    (at 71.805 241.1244 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 71.805 244.2994 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 71.17 237.3144 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
-  )
-  (text "test text with \"quotes\"" (at 132.08 167.64 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
-    (at 69.215 219.075 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
-  )
-  (text "test text" (at 261.62 172.72 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
-  )
-  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
-    (at 68.58 212.09 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
-  )
-
-  (label "BUS1" (at 201.93 132.08 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
-  )
-  (label "NET1" (at 190.5 125.095 0)
-    (effects (font (size 1.27 1.27)) (justify left bottom))
-    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
-  )
-
-  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
-    (effects (font (size 1.27 1.27)) (justify right))
-    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
-    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
-      (effects (font (size 1.27 1.27)) (justify right) hide)
-    )
-  )
-
-  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
-    (effects (font (size 1.27 1.27)) (justify left))
-    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
-    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
-    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
-    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
-    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
-    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
-    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
-    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
-    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
-    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
-    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
-    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
-    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
-    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
-    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
-    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
-  )
-
-  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
-    (in_bom yes) (on_board yes) (fields_autoplaced)
-    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
-    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
-    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
-    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
-    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
-    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
-    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
-    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
-  )
-
-  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
-    (fill (color 4 0 255 1.0000))
-    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
-    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
-      (effects (font (size 1.27 1.27) bold italic) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 162.56 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
-    )
-    (pin "OUTPUT" output (at 203.835 165.1 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
-    )
-  )
-
-  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
-    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
-    (fill (color 0 0 0 0.0000))
-    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
-    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
-      (effects (font (size 1.27 1.27)) (justify left bottom))
-    )
-    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
-      (effects (font (size 1.27 1.27)) (justify left top))
-    )
-    (pin "INPUT" input (at 203.835 180.975 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
-    )
-    (pin "OUTPUT" output (at 203.835 183.515 180)
-      (effects (font (size 1.27 1.27)) (justify left))
-      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
-    )
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
-  )
-
-  (symbol_instances
-    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
-      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
-      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
-      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
-      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
-      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
-      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
-      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
-    )
-    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
-      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
-    )
-  )
-)
diff --git a/tests/testdata/schematic/test_setSymbolLibNameToken b/tests/testdata/schematic/test_setSymbolLibNameToken
deleted file mode 100644
index 9a20963..0000000
--- a/tests/testdata/schematic/test_setSymbolLibNameToken
+++ /dev/null
@@ -1,36 +0,0 @@
-(kicad_sch (version 20211014) (generator kiutils)
-  (paper "A4")
-  (lib_symbols)
-
-  (symbol (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
-    (in_bom no) (on_board yes) (fields_autoplaced)
-    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
-    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
-    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
-    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
-  )
-
-  (symbol (lib_name "AVR-JTAG-10_1") (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
-    (in_bom no) (on_board yes) (fields_autoplaced)
-    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
-    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
-    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
-    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
-  )
-  
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/schematic/test_setSymbolLibNameToken.expected b/tests/testdata/schematic/test_setSymbolLibNameToken.expected
deleted file mode 100644
index fa7495e..0000000
--- a/tests/testdata/schematic/test_setSymbolLibNameToken.expected
+++ /dev/null
@@ -1,36 +0,0 @@
-(kicad_sch (version 20211014) (generator kiutils)
-  (paper "A4")
-  (lib_symbols)
-
-  (symbol (lib_name "AVR-JTAG-10_1") (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
-    (in_bom no) (on_board yes) (fields_autoplaced)
-    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
-    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
-    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
-    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
-  )
-
-  (symbol (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
-    (in_bom no) (on_board yes) (fields_autoplaced)
-    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
-    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
-    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
-    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
-  )
-
-  (sheet_instances
-    (path "/" (page "1"))
-  )
-)
diff --git a/tests/testdata/symbol/since_v7/test_arcAllVariants b/tests/testdata/symbol/since_v7/test_arcAllVariants
deleted file mode 100644
index ac742f3..0000000
--- a/tests/testdata/symbol/since_v7/test_arcAllVariants
+++ /dev/null
@@ -1,162 +0,0 @@
-(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
-  (symbol "arc" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "arc_0_1"
-      (arc (start 1.27 -22.86) (mid 3.9641 -21.7441) (end 5.08 -19.05)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type none))
-      )
-      (arc (start 1.27 -19.05) (mid 3.9641 -17.9341) (end 5.08 -15.24)
-        (stroke (width 0) (type dash_dot))
-        (fill (type none))
-      )
-      (arc (start 1.27 -15.24) (mid 3.9641 -14.1241) (end 5.08 -11.43)
-        (stroke (width 0) (type dot))
-        (fill (type none))
-      )
-      (arc (start 1.27 -11.43) (mid 3.9641 -10.3141) (end 5.08 -7.62)
-        (stroke (width 0) (type dash))
-        (fill (type none))
-      )
-      (arc (start 1.27 -7.62) (mid 3.9641 -6.5041) (end 5.08 -3.81)
-        (stroke (width 0) (type solid))
-        (fill (type none))
-      )
-      (arc (start 1.27 -3.81) (mid 3.9641 -2.6941) (end 5.08 0)
-        (stroke (width 0) (type default))
-        (fill (type none))
-      )
-      (arc (start 6.35 -22.86) (mid 9.0441 -21.7441) (end 10.16 -19.05)
-        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
-        (fill (type none))
-      )
-      (arc (start 6.35 -19.05) (mid 9.0441 -17.9341) (end 10.16 -15.24)
-        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
-        (fill (type none))
-      )
-      (arc (start 6.35 -15.24) (mid 9.0441 -14.1241) (end 10.16 -11.43)
-        (stroke (width 1) (type dot) (color 172 32 255 1))
-        (fill (type none))
-      )
-      (arc (start 6.35 -11.43) (mid 9.0441 -10.3141) (end 10.16 -7.62)
-        (stroke (width 1) (type dash) (color 255 44 112 1))
-        (fill (type none))
-      )
-      (arc (start 6.35 -7.62) (mid 9.0441 -6.5041) (end 10.16 -3.81)
-        (stroke (width 1) (type solid) (color 255 128 19 1))
-        (fill (type none))
-      )
-      (arc (start 6.35 -3.81) (mid 9.0441 -2.6941) (end 10.16 0)
-        (stroke (width 1) (type default) (color 255 197 66 1))
-        (fill (type none))
-      )
-      (arc (start 11.43 -22.86) (mid 14.1241 -21.7441) (end 15.24 -19.05)
-        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
-        (fill (type outline))
-      )
-      (arc (start 11.43 -19.05) (mid 14.1241 -17.9341) (end 15.24 -15.24)
-        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
-        (fill (type outline))
-      )
-      (arc (start 11.43 -15.24) (mid 14.1241 -14.1241) (end 15.24 -11.43)
-        (stroke (width 1) (type dot) (color 172 32 255 1))
-        (fill (type outline))
-      )
-      (arc (start 11.43 -11.43) (mid 14.1241 -10.3141) (end 15.24 -7.62)
-        (stroke (width 1) (type dash) (color 255 44 112 1))
-        (fill (type outline))
-      )
-      (arc (start 11.43 -7.62) (mid 14.1241 -6.5041) (end 15.24 -3.81)
-        (stroke (width 1) (type solid) (color 255 128 19 1))
-        (fill (type outline))
-      )
-      (arc (start 11.43 -3.81) (mid 14.1241 -2.6941) (end 15.24 0)
-        (stroke (width 1) (type default) (color 255 197 66 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -22.86) (mid 19.2041 -21.7441) (end 20.32 -19.05)
-        (stroke (width -0.0001) (type dash_dot_dot) (color 45 64 255 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -19.05) (mid 19.2041 -17.9341) (end 20.32 -15.24)
-        (stroke (width -0.0001) (type dash_dot) (color 255 175 34 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -15.24) (mid 19.2041 -14.1241) (end 20.32 -11.43)
-        (stroke (width -0.0001) (type dot) (color 172 32 255 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -11.43) (mid 19.2041 -10.3141) (end 20.32 -7.62)
-        (stroke (width -0.0001) (type dash) (color 255 44 112 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -7.62) (mid 19.2041 -6.5041) (end 20.32 -3.81)
-        (stroke (width -0.0001) (type solid) (color 255 128 19 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -22.86) (mid 24.2841 -21.7441) (end 25.4 -19.05)
-        (stroke (width -0.0001) (type dash_dot_dot) (color 45 64 255 1))
-        (fill (type outline))
-      )
-      (arc (start 16.51 -3.81) (mid 19.2041 -2.6941) (end 20.32 0)
-        (stroke (width -0.0001) (type default) (color 255 197 66 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -19.05) (mid 24.2841 -17.9341) (end 25.4 -15.24)
-        (stroke (width -0.0001) (type dash_dot) (color 255 175 34 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -15.24) (mid 24.2841 -14.1241) (end 25.4 -11.43)
-        (stroke (width -0.0001) (type dot) (color 172 32 255 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -11.43) (mid 24.2841 -10.3141) (end 25.4 -7.62)
-        (stroke (width -0.0001) (type dash) (color 255 44 112 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -7.62) (mid 24.2841 -6.5041) (end 25.4 -3.81)
-        (stroke (width -0.0001) (type solid) (color 255 128 19 1))
-        (fill (type outline))
-      )
-      (arc private (start 21.59 -3.81) (mid 24.2841 -2.6941) (end 25.4 0)
-        (stroke (width -0.0001) (type default) (color 255 197 66 1))
-        (fill (type outline))
-      )
-      (arc (start 26.67 -22.86) (mid 29.3641 -21.7441) (end 30.48 -19.05)
-        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
-        (fill (type background))
-      )
-      (arc (start 26.67 -19.05) (mid 29.3641 -17.9341) (end 30.48 -15.24)
-        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
-        (fill (type background))
-      )
-      (arc (start 26.67 -15.24) (mid 29.3641 -14.1241) (end 30.48 -11.43)
-        (stroke (width 1) (type dot) (color 172 32 255 1))
-        (fill (type background))
-      )
-      (arc (start 26.67 -11.43) (mid 29.3641 -10.3141) (end 30.48 -7.62)
-        (stroke (width 1) (type dash) (color 255 44 112 1))
-        (fill (type background))
-      )
-      (arc (start 26.67 -7.62) (mid 29.3641 -6.5041) (end 30.48 -3.81)
-        (stroke (width 1) (type solid) (color 255 128 19 1))
-        (fill (type background))
-      )
-      (arc (start 26.67 -3.81) (mid 29.3641 -2.6941) (end 30.48 0)
-        (stroke (width 1) (type default) (color 255 197 66 1))
-        (fill (type background))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/since_v7/test_circleAllVariants b/tests/testdata/symbol/since_v7/test_circleAllVariants
deleted file mode 100644
index e26cc49..0000000
--- a/tests/testdata/symbol/since_v7/test_circleAllVariants
+++ /dev/null
@@ -1,138 +0,0 @@
-(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
-  (symbol "circle" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "circle_0_1"
-      (circle (center 0 -21.59) (radius 1.27)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type none))
-      )
-      (circle (center 0 -17.78) (radius 1.27)
-        (stroke (width 0) (type dash_dot))
-        (fill (type none))
-      )
-      (circle (center 0 -13.97) (radius 1.27)
-        (stroke (width 0) (type dot))
-        (fill (type none))
-      )
-      (circle (center 0 -10.16) (radius 1.27)
-        (stroke (width 0) (type dash))
-        (fill (type none))
-      )
-      (circle (center 0 -6.35) (radius 1.27)
-        (stroke (width 0) (type solid))
-        (fill (type none))
-      )
-      (circle (center 0 -2.54) (radius 1.27)
-        (stroke (width 0) (type default))
-        (fill (type none))
-      )
-      (circle (center 3.81 -21.59) (radius 1.27)
-        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -21.59) (radius 1.27)
-        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
-        (fill (type none))
-      )
-      (circle (center 3.81 -17.78) (radius 1.27)
-        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -17.78) (radius 1.27)
-        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
-        (fill (type none))
-      )
-      (circle (center 3.81 -13.97) (radius 1.27)
-        (stroke (width 1) (type dot) (color 255 64 66 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -13.97) (radius 1.27)
-        (stroke (width 1) (type dot) (color 255 64 66 1))
-        (fill (type none))
-      )
-      (circle (center 3.81 -10.16) (radius 1.27)
-        (stroke (width 1) (type dash) (color 94 255 73 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -10.16) (radius 1.27)
-        (stroke (width 1) (type dash) (color 94 255 73 1))
-        (fill (type none))
-      )
-      (circle (center 3.81 -6.35) (radius 1.27)
-        (stroke (width 1) (type solid) (color 255 242 67 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -6.35) (radius 1.27)
-        (stroke (width 1) (type solid) (color 255 242 67 1))
-        (fill (type none))
-      )
-      (circle (center 3.81 -2.54) (radius 1.27)
-        (stroke (width 1) (type default) (color 189 255 31 1))
-        (fill (type none))
-      )
-      (circle private (center 15.24 -2.54) (radius 1.27)
-        (stroke (width 1) (type default) (color 189 255 31 1))
-        (fill (type none))
-      )
-      (circle (center 7.62 -21.59) (radius 1.27)
-        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
-        (fill (type outline))
-      )
-      (circle (center 7.62 -17.78) (radius 1.27)
-        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
-        (fill (type outline))
-      )
-      (circle (center 7.62 -13.97) (radius 1.27)
-        (stroke (width 1) (type dot) (color 255 64 66 1))
-        (fill (type outline))
-      )
-      (circle (center 7.62 -10.16) (radius 1.27)
-        (stroke (width 1) (type dash) (color 94 255 73 1))
-        (fill (type outline))
-      )
-      (circle (center 7.62 -6.35) (radius 1.27)
-        (stroke (width 1) (type solid) (color 255 242 67 1))
-        (fill (type outline))
-      )
-      (circle (center 7.62 -2.54) (radius 1.27)
-        (stroke (width 1) (type default) (color 189 255 31 1))
-        (fill (type outline))
-      )
-      (circle (center 11.43 -21.59) (radius 1.27)
-        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
-        (fill (type background))
-      )
-      (circle (center 11.43 -17.78) (radius 1.27)
-        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
-        (fill (type background))
-      )
-      (circle (center 11.43 -13.97) (radius 1.27)
-        (stroke (width 1) (type dot) (color 255 64 66 1))
-        (fill (type background))
-      )
-      (circle (center 11.43 -10.16) (radius 1.27)
-        (stroke (width 1) (type dash) (color 94 255 73 1))
-        (fill (type background))
-      )
-      (circle (center 11.43 -6.35) (radius 1.27)
-        (stroke (width 1) (type solid) (color 255 242 67 1))
-        (fill (type background))
-      )
-      (circle (center 11.43 -2.54) (radius 1.27)
-        (stroke (width 1) (type default) (color 189 255 31 1))
-        (fill (type background))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/since_v7/test_rectangleAllVariants b/tests/testdata/symbol/since_v7/test_rectangleAllVariants
deleted file mode 100644
index faad494..0000000
--- a/tests/testdata/symbol/since_v7/test_rectangleAllVariants
+++ /dev/null
@@ -1,138 +0,0 @@
-(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
-  (symbol "rect" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "rect_0_1"
-      (rectangle (start 0 -20.32) (end 8.89 -22.86)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type none))
-      )
-      (rectangle (start 0 -16.51) (end 8.89 -19.05)
-        (stroke (width 0) (type dash_dot))
-        (fill (type none))
-      )
-      (rectangle (start 0 -12.7) (end 8.89 -15.24)
-        (stroke (width 0) (type dot))
-        (fill (type none))
-      )
-      (rectangle (start 0 -8.89) (end 8.89 -11.43)
-        (stroke (width 0) (type dash))
-        (fill (type none))
-      )
-      (rectangle (start 0 -5.08) (end 8.89 -7.62)
-        (stroke (width 0) (type solid))
-        (fill (type none))
-      )
-      (rectangle (start 0 -1.27) (end 8.89 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -20.32) (end 19.05 -22.86)
-        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -16.51) (end 19.05 -19.05)
-        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -12.7) (end 19.05 -15.24)
-        (stroke (width 1) (type dot) (color 255 156 20 1))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -8.89) (end 19.05 -11.43)
-        (stroke (width 1) (type dash) (color 182 21 255 1))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -5.08) (end 19.05 -7.62)
-        (stroke (width 1) (type solid) (color 255 19 235 1))
-        (fill (type none))
-      )
-      (rectangle (start 10.16 -1.27) (end 19.05 -3.81)
-        (stroke (width 1) (type default) (color 255 36 19 1))
-        (fill (type none))
-      )
-      (rectangle (start 20.32 -20.32) (end 29.21 -22.86)
-        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -20.32) (end 49.53 -22.86)
-        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
-        (fill (type outline))
-      )
-      (rectangle (start 20.32 -16.51) (end 29.21 -19.05)
-        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -16.51) (end 49.53 -19.05)
-        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
-        (fill (type outline))
-      )
-      (rectangle (start 20.32 -12.7) (end 29.21 -15.24)
-        (stroke (width 1) (type dot) (color 255 156 20 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -12.7) (end 49.53 -15.24)
-        (stroke (width 1) (type dot) (color 255 156 20 1))
-        (fill (type outline))
-      )
-      (rectangle (start 20.32 -8.89) (end 29.21 -11.43)
-        (stroke (width 1) (type dash) (color 182 21 255 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -8.89) (end 49.53 -11.43)
-        (stroke (width 1) (type dash) (color 182 21 255 1))
-        (fill (type outline))
-      )
-      (rectangle (start 20.32 -5.08) (end 29.21 -7.62)
-        (stroke (width 1) (type solid) (color 255 19 235 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -5.08) (end 49.53 -7.62)
-        (stroke (width 1) (type solid) (color 255 19 235 1))
-        (fill (type outline))
-      )
-      (rectangle (start 20.32 -1.27) (end 29.21 -3.81)
-        (stroke (width 1) (type default) (color 255 36 19 1))
-        (fill (type outline))
-      )
-      (rectangle private (start 40.64 -1.27) (end 49.53 -3.81)
-        (stroke (width 1) (type default) (color 255 36 19 1))
-        (fill (type outline))
-      )
-      (rectangle (start 30.48 -20.32) (end 39.37 -22.86)
-        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
-        (fill (type background))
-      )
-      (rectangle (start 30.48 -16.51) (end 39.37 -19.05)
-        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
-        (fill (type background))
-      )
-      (rectangle (start 30.48 -12.7) (end 39.37 -15.24)
-        (stroke (width 1) (type dot) (color 255 156 20 1))
-        (fill (type background))
-      )
-      (rectangle (start 30.48 -8.89) (end 39.37 -11.43)
-        (stroke (width 1) (type dash) (color 182 21 255 1))
-        (fill (type background))
-      )
-      (rectangle (start 30.48 -5.08) (end 39.37 -7.62)
-        (stroke (width 1) (type solid) (color 255 19 235 1))
-        (fill (type background))
-      )
-      (rectangle (start 30.48 -1.27) (end 39.37 -3.81)
-        (stroke (width 1) (type default) (color 255 36 19 1))
-        (fill (type background))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/since_v7/test_textBoxAllVariants b/tests/testdata/symbol/since_v7/test_textBoxAllVariants
deleted file mode 100644
index 79cbc5e..0000000
--- a/tests/testdata/symbol/since_v7/test_textBoxAllVariants
+++ /dev/null
@@ -1,708 +0,0 @@
-(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
-  (symbol "test" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "test_0_0"
-      (text "Alignment, all combinations" (at 53.34 -1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "Misc" (at 195.58 -1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "Options" (at 165.1 -1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "Style" (at 11.43 -1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text_box "^{high}test_{low}~{over}"
-        (at 191.77 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -185.42 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type color) (color 255 62 122 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -179.07 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot))
-        (fill (type color) (color 255 50 110 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -172.72 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dot))
-        (fill (type color) (color 255 61 78 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -166.37 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash))
-        (fill (type color) (color 255 69 98 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -160.02 0) (size 27.94 -3.81)
-        (stroke (width 0) (type solid))
-        (fill (type color) (color 255 38 36 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -153.67 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type color) (color 255 83 78 1))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -147.32 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 67 133 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -140.97 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 51 140 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -134.62 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 43 114 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -128.27 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 66 118 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -121.92 0) (size 27.94 -3.81)
-        (stroke (width 0) (type solid))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 47 80 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -115.57 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (color 255 54 81 1)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -110.49 0) (size 27.94 -3.81)
-        (stroke (width 2) (type dash_dot_dot) (color 255 43 221 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -104.14 0) (size 27.94 -3.81)
-        (stroke (width 2) (type dash_dot) (color 255 59 237 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -97.79 0) (size 27.94 -3.81)
-        (stroke (width 2) (type dot) (color 255 39 208 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -91.44 0) (size 27.94 -3.81)
-        (stroke (width 2) (type dash) (color 255 43 228 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -85.09 0) (size 27.94 -3.81)
-        (stroke (width 2) (type solid) (color 255 71 237 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -78.74 0) (size 27.94 -3.81)
-        (stroke (width 2) (type default) (color 241 129 255 1))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -73.66 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type dash_dot_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -67.31 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type dash_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -60.96 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -54.61 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type dash))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -48.26 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type solid))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -41.91 0) (size 27.94 -3.81)
-        (stroke (width -0.0001) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash_dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dot))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -48.26 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type dash))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type solid))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -41.91 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 191.77 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (face "Wingdings") (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -99.06 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -80.01 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -60.96 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -48.26 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -105.41 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -86.36 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -67.31 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -54.61 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -111.76 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -92.71 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 39.37 -73.66 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -41.91 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -99.06 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -80.01 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -60.96 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -48.26 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -105.41 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -86.36 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -67.31 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -54.61 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -111.76 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -92.71 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 100.33 -73.66 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) italic) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -41.91 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -99.06 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -80.01 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -60.96 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -48.26 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -105.41 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -86.36 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -67.31 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -54.61 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -111.76 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -92.71 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 69.85 -73.66 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -41.91 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -22.86 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -99.06 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -80.01 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -60.96 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -48.26 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -105.41 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -86.36 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -67.31 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -54.61 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -111.76 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right bottom))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -92.71 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 130.81 -73.66 90) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right top))
-      )
-    )
-    (symbol "test_0_1"
-      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -35.56 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 8.89 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -10.16 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-    )
-    (symbol "test_1_0"
-      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -41.91 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -16.51 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-    )
-    (symbol "test_1_1"
-      (text_box private "private"
-        (at 161.29 -29.21 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
-        (at 161.29 -3.81 0) (size 27.94 -3.81)
-        (stroke (width 0) (type default))
-        (fill (type none))
-        (effects (font (size 1.27 1.27)) (justify left top))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_allSymbolAlternatePins b/tests/testdata/symbol/test_allSymbolAlternatePins
deleted file mode 100644
index f9fc7a4..0000000
--- a/tests/testdata/symbol/test_allSymbolAlternatePins
+++ /dev/null
@@ -1,174 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "Test_Alternate" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "Test_Alternate" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "Test_Alternate_1_1"
-      (pin input line (at 0 -5.08 0) (length 2.54)
-        (name "Pin1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" input line)
-        (alternate "Alternate2" input inverted)
-        (alternate "Alternate3" input clock)
-        (alternate "Alternate4" input inverted_clock)
-        (alternate "Alternate5" input input_low)
-        (alternate "Alternate6" input clock_low)
-        (alternate "Alternate7" input output_low)
-        (alternate "Alternate8" input edge_clock_high)
-        (alternate "Alternate9" input non_logic)
-      )
-      (pin open_collector line (at 0 -22.225 0) (length 2.54)
-        (name "Pin10" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" open_collector line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin open_emitter line (at 0 -24.13 0) (length 2.54)
-        (name "Pin11" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" open_emitter line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin no_connect line (at 0 -26.035 0) (length 2.54)
-        (name "Pin12" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" no_connect line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin output line (at 0 -6.985 0) (length 2.54)
-        (name "Pin2" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" output line)
-        (alternate "Alternate2" output inverted)
-        (alternate "Alternate3" output clock)
-        (alternate "Alternate4" output inverted_clock)
-        (alternate "Alternate5" output input_low)
-        (alternate "Alternate6" output clock_low)
-        (alternate "Alternate7" output output_low)
-        (alternate "Alternate8" output edge_clock_high)
-        (alternate "Alternate9" output non_logic)
-      )
-      (pin bidirectional line (at 0 -8.89 0) (length 2.54)
-        (name "Pin3" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" bidirectional line)
-        (alternate "Alternate2" bidirectional inverted)
-        (alternate "Alternate3" bidirectional clock)
-        (alternate "Alternate4" bidirectional inverted_clock)
-        (alternate "Alternate5" bidirectional input_low)
-        (alternate "Alternate6" bidirectional clock_low)
-        (alternate "Alternate7" bidirectional output_low)
-        (alternate "Alternate8" bidirectional edge_clock_high)
-        (alternate "Alternate9" bidirectional non_logic)
-      )
-      (pin tri_state line (at 0 -10.795 0) (length 2.54)
-        (name "Pin4" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" tri_state line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin passive line (at 0 -12.7 0) (length 2.54)
-        (name "Pin5\"quoted\"" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" passive line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3\"quoted\"" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin free line (at 0 -14.605 0) (length 2.54)
-        (name "Pin6" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" free line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin unspecified line (at 0 -16.51 0) (length 2.54)
-        (name "Pin7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" unspecified line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin power_in line (at 0 -18.415 0) (length 2.54)
-        (name "Pin8" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" power_in line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-      (pin power_out line (at 0 -20.32 0) (length 2.54)
-        (name "Pin9" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-        (alternate "Alternate1" power_out line)
-        (alternate "Alternate2" tri_state inverted)
-        (alternate "Alternate3" tri_state clock)
-        (alternate "Alternate4" tri_state inverted_clock)
-        (alternate "Alternate5" tri_state input_low)
-        (alternate "Alternate6" tri_state clock_low)
-        (alternate "Alternate7" tri_state output_low)
-        (alternate "Alternate8" tri_state edge_clock_high)
-        (alternate "Alternate9" tri_state non_logic)
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_allSymbolPinVariations b/tests/testdata/symbol/test_allSymbolPinVariations
deleted file mode 100644
index 36d380f..0000000
--- a/tests/testdata/symbol/test_allSymbolPinVariations
+++ /dev/null
@@ -1,402 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "test" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 3.175 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "test" (id 1) (at 0 1.27 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "test_1_1"
-      (pin no_connect line (at -6.35 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at -6.35 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector line (at -6.35 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at -6.35 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -6.35 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified line (at -6.35 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free line (at -6.35 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -6.35 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at -6.35 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -6.35 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -6.35 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -6.35 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect inverted (at 33.655 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter inverted (at 33.655 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector inverted (at 33.655 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out inverted (at 33.655 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in inverted (at 33.655 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified inverted (at 33.655 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free inverted (at 33.655 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive inverted (at 33.655 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state inverted (at 33.655 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional inverted (at 33.655 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output inverted (at 33.655 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at 33.655 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect inverted (at 74.295 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter inverted (at 74.295 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector inverted (at 74.295 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out inverted (at 74.295 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in inverted (at 74.295 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified inverted (at 74.295 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free inverted (at 74.295 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive inverted (at 74.295 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state inverted (at 74.295 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional inverted (at 74.295 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output inverted (at 74.295 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 74.295 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect clock (at 116.84 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter clock (at 116.84 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector clock (at 116.84 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out clock (at 116.84 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in clock (at 116.84 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified clock (at 116.84 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free clock (at 116.84 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive clock (at 116.84 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state clock (at 116.84 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional clock (at 116.84 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output clock (at 116.84 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 116.84 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect clock (at 158.75 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter clock (at 158.75 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector clock (at 158.75 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out clock (at 158.75 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in clock (at 158.75 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified clock (at 158.75 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free clock (at 158.75 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive clock (at 158.75 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state clock (at 158.75 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional clock (at 158.75 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output clock (at 158.75 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input input_low (at 158.75 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect input_low (at 201.295 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter input_low (at 201.295 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector input_low (at 201.295 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out input_low (at 201.295 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in input_low (at 201.295 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified input_low (at 201.295 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free input_low (at 201.295 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive input_low (at 201.295 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state input_low (at 201.295 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional input_low (at 201.295 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output input_low (at 201.295 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input output_low (at 201.295 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect output_low (at 246.38 -30.48 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter output_low (at 246.38 -27.94 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector output_low (at 246.38 -25.4 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out output_low (at 246.38 -22.86 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in output_low (at 246.38 -20.32 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified output_low (at 246.38 -17.78 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free output_low (at 246.38 -15.24 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive output_low (at 246.38 -12.7 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state output_low (at 246.38 -10.16 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional output_low (at 246.38 -7.62 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output output_low (at 246.38 -5.08 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input edge_clock_high (at 246.38 -2.54 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect edge_clock_high (at 289.56 -29.845 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter edge_clock_high (at 289.56 -27.305 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector edge_clock_high (at 289.56 -24.765 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out edge_clock_high (at 289.56 -22.225 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in edge_clock_high (at 289.56 -19.685 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin unspecified edge_clock_high (at 289.56 -17.145 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin free edge_clock_high (at 289.56 -14.605 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive edge_clock_high (at 289.56 -12.065 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state edge_clock_high (at 289.56 -9.525 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional edge_clock_high (at 289.56 -6.985 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output edge_clock_high (at 289.56 -4.445 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input non_logic (at 289.56 -1.905 180) (length 2.54)
-        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_bigSymbolLibrary b/tests/testdata/symbol/test_bigSymbolLibrary
deleted file mode 100644
index c9550d4..0000000
--- a/tests/testdata/symbol/test_bigSymbolLibrary
+++ /dev/null
@@ -1,3252 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Reference" "U" (id 0) (at 0 9.525 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -12.7 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -14.605 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_locked" "" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD1853_0_0"
-      (text "NormalStuff" (at 0 19.05 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at 13.335 13.97 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_0"
-      (pin input line (at 10.795 24.13 0) (length 2.54)
-        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_1"
-      (text "Unit A, Normal" (at -1.27 0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_2"
-      (text "Unit A, DeMorgan" (at 0.635 -0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 17.145 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_0"
-      (pin input line (at 13.335 22.86 0) (length 2.54)
-        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_1"
-      (text "Unit B, Normal" (at 0 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -15.24 13.335 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_2"
-      (text "Unit B, DeMorgan" (at -1.905 0 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 18.415 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_0"
-      (pin input line (at 15.24 21.59 0) (length 2.54)
-        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_1"
-      (text "Unit C, Normal" (at 0 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.145 17.78 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 18.415 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "8284" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -3.81 19.05 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "8284" (id 1) (at 2.54 19.05 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-18_W7.62mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "http://www.cpu-galaxy.at/cpu/ram%20rom%20eprom/other_intel_chips/other_intel-Dateien/D8284A_Datasheet.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Clock Generator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Clock Generator and Driver for i8086/88 Microcontrollers, PDIP-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "8284_0_0"
-      (rectangle (start -7.62 -17.78) (end 7.62 17.78)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "8284_1_1"
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "CSYNC" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "RESET" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 15.24 0) (length 2.54)
-        (name "~{RES}" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "OSC" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "F/~{C}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -15.24 0) (length 2.54)
-        (name "EFI" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{ASYNC}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -15.24 180) (length 2.54)
-        (name "X2" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 -10.16 180) (length 2.54)
-        (name "X1" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 2.54)
-        (name "PCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{AEN1}" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "RDY1" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 10.16 180) (length 2.54)
-        (name "READY" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 7.62 0) (length 2.54)
-        (name "RDY2" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 2.54)
-        (name "~{AEN2}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 15.24 180) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "82C54" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "82C54" (id 1) (at 2.54 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://download.intel.com/design/archives/periphrl/docs/23124406.pdf" (id 3) (at -11.43 22.86 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CHMOS Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "82C54_0_1"
-      (rectangle (start -7.62 -22.86) (end 7.62 22.86)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "82C54_1_1"
-      (pin bidirectional line (at -10.16 0 0) (length 2.54)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 10.16 180) (length 2.54)
-        (name "OUT0" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 12.7 180) (length 2.54)
-        (name "G0" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 0 180) (length 2.54)
-        (name "G1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 2.54 180) (length 2.54)
-        (name "CLK1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 -12.7 180) (length 2.54)
-        (name "G2" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -15.24 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 -10.16 180) (length 2.54)
-        (name "CLK2" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -12.7 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -17.78 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "~{RD}" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 25.4 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 5.08 0) (length 2.54)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 10.16 0) (length 2.54)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 12.7 0) (length 2.54)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 15.24 0) (length 2.54)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 17.78 0) (length 2.54)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 15.24 180) (length 2.54)
-        (name "CLK0" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "8253" (extends "82C54")
-    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "8253" (id 1) (at 2.54 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.cpcwiki.eu/imgs/e/e3/8253.pdf" (id 3) (at -11.43 22.86 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "8254" (extends "82C54")
-    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "8254" (id 1) (at 2.54 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.scs.stanford.edu/10wi-cs140/pintos/specs/8254.pdf" (id 3) (at -11.43 22.86 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "82C54_PLCC" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -3.81 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "82C54_PLCC" (id 1) (at 2.54 24.13 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_LCC:PLCC-28" (id 2) (at 2.54 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://download.intel.com/design/archives/periphrl/docs/23124406.pdf" (id 3) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CHMOS Programmable Interval Timer, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*PLCC?28*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "82C54_PLCC_0_1"
-      (rectangle (start -7.62 -22.86) (end 7.62 22.86)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "82C54_PLCC_1_1"
-      (pin no_connect line (at -5.08 -22.86 90) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 15.24 180) (length 2.54)
-        (name "CLK0" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at -2.54 -22.86 90) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 10.16 180) (length 2.54)
-        (name "OUT0" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 12.7 180) (length 2.54)
-        (name "G0" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 2.54 -22.86 90) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 0 180) (length 2.54)
-        (name "G1" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 2.54 180) (length 2.54)
-        (name "CLK1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 10.16 -12.7 180) (length 2.54)
-        (name "G2" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 0 0) (length 2.54)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -15.24 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 10.16 -10.16 180) (length 2.54)
-        (name "CLK2" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -12.7 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -17.78 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 5.08 -22.86 90) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "~{RD}" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 25.4 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 5.08 0) (length 2.54)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 10.16 0) (length 2.54)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 12.7 0) (length 2.54)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 15.24 0) (length 2.54)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 17.78 0) (length 2.54)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9513" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "AD9513" (id 1) (at 11.43 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9513.pdf" (id 3) (at 0 15.24 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock distribution LVDS CMOS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "800 MHz, 3 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9513_0_1"
-      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD9513_1_1"
-      (pin power_in line (at -10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "S7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 2.54)
-        (name "S6" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 2.54)
-        (name "S5" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "S4" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "S3" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 15.24 0) (length 2.54)
-        (name "S2" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 17.78 0) (length 2.54)
-        (name "S1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -12.7 180) (length 2.54)
-        (name "OUT2B" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -10.16 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -5.08 180) (length 2.54)
-        (name "OUT1B" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -2.54 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 20.32 0) (length 2.54)
-        (name "S0" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 2.54 180) (length 2.54)
-        (name "OUT0B" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 5.08 180) (length 2.54)
-        (name "OUT0" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -12.7 0) (length 2.54)
-        (name "CLKB" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -27.94 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -22.86 0) (length 2.54)
-        (name "RSET" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -27.94 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -17.78 0) (length 2.54)
-        (name "SYNCB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at 15.24 20.32 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 2.54)
-        (name "S10" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "S9" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "S8" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9514" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "AD9514" (id 1) (at 11.43 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9514.pdf" (id 3) (at 0 16.51 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock distribution LVPECL LVDS CMOS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1.6 GHz, 3 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9514_1_1"
-      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at -10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "S7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 2.54)
-        (name "S6" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 2.54)
-        (name "S5" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "S4" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "S3" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 15.24 0) (length 2.54)
-        (name "S2" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 17.78 0) (length 2.54)
-        (name "S1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -12.7 180) (length 2.54)
-        (name "OUT2B" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -10.16 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -5.08 180) (length 2.54)
-        (name "OUT1B" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -2.54 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 20.32 0) (length 2.54)
-        (name "S0" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 2.54 180) (length 2.54)
-        (name "OUT0B" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 5.08 180) (length 2.54)
-        (name "OUT0" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -12.7 0) (length 2.54)
-        (name "CLKB" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -27.94 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -22.86 0) (length 2.54)
-        (name "RSET" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -27.94 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -17.78 0) (length 2.54)
-        (name "SYNCB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at 15.24 20.32 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 2.54)
-        (name "S10" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "S9" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "S8" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9515" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "AD9515" (id 1) (at 11.43 26.67 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9515.pdf" (id 3) (at 0 15.24 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock distribution LVPECL LVDS CMOS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1.6 GHz, 2 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9515_1_1"
-      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at -10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "S7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 2.54)
-        (name "S6" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 2.54)
-        (name "S5" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "S4" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "S3" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 15.24 0) (length 2.54)
-        (name "S2" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 17.78 0) (length 2.54)
-        (name "S1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -5.08 180) (length 2.54)
-        (name "OUT1B" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -2.54 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 2.54 180) (length 2.54)
-        (name "OUT0B" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 5.08 180) (length 2.54)
-        (name "OUT0" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 20.32 0) (length 2.54)
-        (name "S0" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 12.7 10.16 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 12.7 12.7 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -12.7 0) (length 2.54)
-        (name "CLKB" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 10.16 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -27.94 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -22.86 0) (length 2.54)
-        (name "RSET" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -27.94 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 27.94 270) (length 2.54)
-        (name "VS" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -17.78 0) (length 2.54)
-        (name "SYNCB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at 15.24 20.32 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 2.54)
-        (name "S10" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "S9" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "S8" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ICM7209" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "ICM7209" (id 1) (at 8.636 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://pdf.datasheetcatalog.com/datasheets/320/500974_DS.pdf" (id 3) (at 5.08 -5.08 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timebase generator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timebase generator, DIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "ICM7209_0_1"
-      (rectangle (start -12.7 -5.08) (end 12.7 5.08)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "ICM7209_1_1"
-      (pin output line (at 15.24 -2.54 180) (length 2.54)
-        (name "OSC_OUT" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "OSC_IN" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "DISABLE" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 7.62 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 0 180) (length 2.54)
-        (name "OUT/1" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 2.54 180) (length 2.54)
-        (name "OUT/8" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -7.62 90) (length 2.54)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LM555xMM" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LM555xMM" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LM555xMM_0_0"
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "LM555xMM_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LM555xMM_1_1"
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LMC555xMM" (extends "LM555xMM")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LMC555xMM" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS Timer, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "TLC555xPS" (extends "LM555xMM")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "TLC555xPS" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single LinCMOS Timer, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LM556" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LM556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm556.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual Timer, DIP-14/SOIC-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LM556_0_0"
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "LM556_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LM556_1_1"
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "LM556_2_1"
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ICM7556" (extends "LM556")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "ICM7556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer 556" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual CMOS General Purpose Timer, DIP-14/SOIC-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NA556" (extends "LM556")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NA556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/se556.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14/SSOP-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NE556" (extends "LM556")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NE556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SA556" (extends "LM556")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SA556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SE556" (extends "LM556")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SE556" (id 1) (at -10.16 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LMC555xTP" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LMC555xTP" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_BGA:Texas_DSBGA-8_1.43x1.41mm_Layout3x3_P0.5mm" (id 2) (at 2.54 -12.7 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS Timer, DSBGA-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "Texas*DSBGA*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LMC555xTP_0_0"
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "A2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "A3" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "LMC555xTP_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LMC555xTP_1_1"
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "A1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "B1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "B3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "C1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "C2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "C3" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6902" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6902" (id 1) (at 5.08 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 0 11.43 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/6902f.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock generator dual triple quad signal" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Multiphase oscillator, spread spectrum frequency modulation, MSOP-10" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LTC6902_0_1"
-      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LTC6902_1_1"
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 5.08 0) (length 2.54)
-        (name "SET" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "DIV" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "PH" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 2.54)
-        (name "OUT3" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "OUT4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 2.54 0) (length 2.54)
-        (name "MOD" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6909" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -6.35 11.43 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6909" (id 1) (at 5.08 11.43 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:MSOP-16_3x4mm_P0.5mm" (id 2) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/6909fa.pdf" (id 3) (at -6.35 11.43 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock generator signal" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Multiphase oscillator, spread spectrum frequency modulation, MSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x4mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LTC6909_0_1"
-      (rectangle (start -7.62 10.16) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LTC6909_1_1"
-      (pin power_in line (at -2.54 12.7 270) (length 2.54)
-        (name "V+A" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 -5.08 180) (length 2.54)
-        (name "OUT6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 -7.62 180) (length 2.54)
-        (name "OUT7" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 -10.16 180) (length 2.54)
-        (name "OUT8" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 12.7 270) (length 2.54)
-        (name "V+D" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 -10.16 0) (length 2.54)
-        (name "MOD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "PH2" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 2.54 0) (length 2.54)
-        (name "SET" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "PH0" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "PH1" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 7.62 180) (length 2.54)
-        (name "OUT1" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 5.08 180) (length 2.54)
-        (name "OUT2" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 2.54 180) (length 2.54)
-        (name "OUT3" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 0 180) (length 2.54)
-        (name "OUT4" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 10.16 -2.54 180) (length 2.54)
-        (name "OUT5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6993xS6-1" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6993xS6-1" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Rising-edge input, non-retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LTC6993xS6-1_0_1"
-      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LTC6993xS6-1_1_1"
-      (pin input line (at -10.16 0 0) (length 3.81)
-        (name "TRIG" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -7.62 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 -2.54 0) (length 3.81)
-        (name "SET" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 3.81)
-        (name "DIV" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 7.62 270) (length 2.54)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 3.81)
-        (name "OUT" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6993xS6-2" (extends "LTC6993xS6-1")
-    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6993xS6-2" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Rising-edge input, retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LTC6993xS6-3" (extends "LTC6993xS6-1")
-    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6993xS6-3" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Falling-edge input, non-retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LTC6993xS6-4" (extends "LTC6993xS6-1")
-    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6993xS6-4" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Falling-edge input, retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LTC6994xDCB-1" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6994xDCB-1" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DFN_QFN:DFN-6-1EP_3x2mm_P0.5mm_EP1.65x1.35mm" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "TimerBlox delay block noise discriminator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Delay Block, Programmable, Noise Discriminator, Rising or Falling Edge, DFN-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DFN*1EP*3x2mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LTC6994xDCB-1_0_1"
-      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LTC6994xDCB-1_1_1"
-      (pin power_in line (at 0 7.62 270) (length 2.54)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 3.81)
-        (name "DIV" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 -2.54 0) (length 3.81)
-        (name "SET" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 3.81)
-        (name "IN" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -7.62 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 3.81)
-        (name "OUT" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6994xDCB-2" (extends "LTC6994xDCB-1")
-    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6994xDCB-2" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DFN_QFN:DFN-6-1EP_3x2mm_P0.5mm_EP1.65x1.35mm" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "TimerBlox debouncer noise discriminator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Debouncer, Programmable, Noise Discriminator, Rising and Falling Edges, DFN-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DFN*1EP*3x2mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LTC6994xS6-1" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6994xS6-1" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "TimerBlox delay block noise discriminator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Delay Block, Programmable, Noise Discriminator, Rising or Falling Edge, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "LTC6994xS6-1_0_1"
-      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "LTC6994xS6-1_1_1"
-      (pin input line (at -10.16 0 0) (length 3.81)
-        (name "IN" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -7.62 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -10.16 -2.54 0) (length 3.81)
-        (name "SET" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 3.81)
-        (name "DIV" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 7.62 270) (length 2.54)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 3.81)
-        (name "OUT" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "LTC6994xS6-2" (extends "LTC6994xS6-1")
-    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "LTC6994xS6-2" (id 1) (at 7.62 6.35 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "TimerBlox debouncer noise discriminator" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "TimerBlox Debouncer, Programmable, Noise Discriminator, Rising and Falling Edges, TSOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "MN3101" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -7.62 10.16 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "MN3101" (id 1) (at 7.62 -10.16 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.experimentalistsanonymous.com/diy/Datasheets/MN3101.pdf" (id 3) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Matsushita Panasonic BBD CMOS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Clock Generator Driver/Driver for MN3000 Series BBD (bucket brigade device), -8V to -16V, DIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "MN3101_0_1"
-      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "MN3101_1_1"
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "CP1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -5.08 180) (length 2.54)
-        (name "CP2" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "OX3" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "OX2" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "OX1" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at 10.16 0 180) (length 2.54)
-        (name "VGG_OUT" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "MN3102" (extends "MN3101")
-    (property "Reference" "U" (id 0) (at -7.62 10.16 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "MN3102" (id 1) (at 7.62 -10.16 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.experimentalistsanonymous.com/diy/Datasheets/MN3102.pdf" (id 3) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "Matsushita Panasonic BBD CMOS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Clock Generator Driver/Driver for MN3000 Series BBD (bucket brigade device), 4V to 10V, DIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NE555D" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NE555D" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "NE555D_0_0"
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "NE555D_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "NE555D_1_1"
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ICM7555xB" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "ICM7555xB" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS General Purpose Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LM555xM" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LM555xM" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LMC555xM" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LMC555xM" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "MC1455B" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "MC1455B" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC1455-D.PDF" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NA555D" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NA555D" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SA555D" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SA555D" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SE555D" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SE555D" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "TLC555xD" (extends "NE555D")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "TLC555xD" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single LinCMOS Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NE555P" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NE555P" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible,  PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "NE555P_0_0"
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "NE555P_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "NE555P_1_1"
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "Q" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "R" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CV" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THR" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DIS" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ICM7555xP" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "ICM7555xP" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS General Purpose Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LM555xN" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LM555xN" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "LMC555xN" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "LMC555xN" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "CMOS Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "MC1455P" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "MC1455P" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC1455-D.PDF" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NA555P" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "NA555P" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SA555P" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SA555P" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "SE555P" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "SE555P" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "TLC555xP" (extends "NE555P")
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "TLC555xP" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single LinCMOS Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "NE567" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -2.54 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "NE567" (id 1) (at -2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "" (id 2) (at 1.27 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm567.pdf" (id 3) (at -7.62 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "tone decoder PLL" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tone Decoder/Phase-Locked Loop, DIP-8/SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "NE567_0_1"
-      (rectangle (start -10.16 7.62) (end 12.7 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "NE567_1_1"
-      (pin output line (at 15.24 -5.08 180) (length 2.54)
-        (name "OFLT_C" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 0 180) (length 2.54)
-        (name "LP_FLT_C" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "INPUT" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "TIM_R" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "TIM_RC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 5.08 180) (length 2.54)
-        (name "OUTPUT" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "SE567" (extends "NE567")
-    (property "Reference" "U" (id 0) (at -2.54 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SE567" (id 1) (at -2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Footprint" "" (id 2) (at 1.27 -8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm567.pdf" (id 3) (at -7.62 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "tone decoder PLL" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tone Decoder/Phase-Locked Loop, DIP-8/SOIC-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "PL611-01-xxxT" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -7.62 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "PL611-01-xxxT" (id 1) (at 1.27 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/PL611-01.pdf" (id 3) (at -6.35 8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "clock generator dual programmable" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Programmable Clock, Dual Programmable Clock Outputs, Up To 200MHz, SOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "PL611-01-xxxT_0_1"
-      (rectangle (start -10.16 7.62) (end 10.16 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "PL611-01-xxxT_1_1"
-      (pin output line (at 12.7 2.54 180) (length 2.54)
-        (name "CLK1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "XIN,FIN" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -5.08 0) (length 2.54)
-        (name "XOUT" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 12.7 0 180) (length 2.54)
-        (name "CLK2,OE,~{PDB},FSEL" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "SY58031U" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SY58031U" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58031u.pdf" (id 3) (at 17.78 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "CML 2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1:8 CML Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "SY58031U_0_1"
-      (rectangle (start 12.7 30.48) (end -12.7 -30.48)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "SY58031U_1_1"
-      (pin power_in line (at -10.16 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -27.94 180) (length 2.54)
-        (name "~{Q7}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -25.4 180) (length 2.54)
-        (name "Q7" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -20.32 180) (length 2.54)
-        (name "~{Q6}" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -17.78 180) (length 2.54)
-        (name "Q6" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -12.7 180) (length 2.54)
-        (name "~{Q5}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -10.16 180) (length 2.54)
-        (name "Q5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -5.08 180) (length 2.54)
-        (name "~{Q4}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -33.02 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 -2.54 180) (length 2.54)
-        (name "Q4" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 2.54 180) (length 2.54)
-        (name "~{Q3}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 5.08 180) (length 2.54)
-        (name "Q3" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 10.16 180) (length 2.54)
-        (name "~{Q2}" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 12.7 180) (length 2.54)
-        (name "Q2" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 17.78 180) (length 2.54)
-        (name "~{Q1}" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 20.32 180) (length 2.54)
-        (name "Q1" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "IN" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 25.4 180) (length 2.54)
-        (name "~{Q0}" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 27.94 180) (length 2.54)
-        (name "Q0" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 7.62 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -10.16 0) (length 2.54)
-        (name "VT" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -12.7 0) (length 2.54)
-        (name "VREF-AC" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "~{IN}" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "SY58032U" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SY58032U" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58032u.pdf" (id 3) (at 17.78 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1:8 LVPECL Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "SY58032U_0_1"
-      (rectangle (start 12.7 30.48) (end -12.7 -30.48)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "SY58032U_1_1"
-      (pin power_in line (at -10.16 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -27.94 180) (length 2.54)
-        (name "~{Q7}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -25.4 180) (length 2.54)
-        (name "Q7" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -20.32 180) (length 2.54)
-        (name "~{Q6}" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -17.78 180) (length 2.54)
-        (name "Q6" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -12.7 180) (length 2.54)
-        (name "~{Q5}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -10.16 180) (length 2.54)
-        (name "Q5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -5.08 180) (length 2.54)
-        (name "~{Q4}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -33.02 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 -2.54 180) (length 2.54)
-        (name "Q4" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 2.54 180) (length 2.54)
-        (name "~{Q3}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 5.08 180) (length 2.54)
-        (name "Q3" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 10.16 180) (length 2.54)
-        (name "~{Q2}" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 12.7 180) (length 2.54)
-        (name "Q2" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 17.78 180) (length 2.54)
-        (name "~{Q1}" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 20.32 180) (length 2.54)
-        (name "Q1" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "IN" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 25.4 180) (length 2.54)
-        (name "~{Q0}" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_emitter line (at 15.24 27.94 180) (length 2.54)
-        (name "Q0" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 7.62 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -10.16 0) (length 2.54)
-        (name "VT" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -15.24 -12.7 0) (length 2.54)
-        (name "VREF-AC" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "~{IN}" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 -33.02 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 33.02 270) (length 2.54)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "SY58033U" (extends "SY58032U")
-    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
-      (effects (font (size 1.27 1.27)) (justify right))
-    )
-    (property "Value" "SY58033U" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58033u.pdf" (id 3) (at 17.78 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1:8 400mV LVPECL Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "TLC555xPW" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 2.54 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "TLC555xPW" (id 1) (at 2.54 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-14_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single LinCMOS Timer, TSSOP-14" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "TLC555xPW_0_0"
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "TLC555xPW_0_1"
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "TLC555xPW_1_1"
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "THRES" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 0 0 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "DISCH" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 2.54 0 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at -2.54 5.08 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "TR" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 0 5.08 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 3.81)
-        (name "OUT" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 2.54 5.08 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
-        (name "RESET" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "CONT" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at -2.54 0 270) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "TPL5010" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -8.89 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "TPL5010" (id 1) (at 6.35 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5010.pdf" (id 3) (at -5.08 -7.62 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "timer watchdog nano wake done" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, Nano Power, Watchdog, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "TPL5010_0_1"
-      (rectangle (start -12.7 7.62) (end 10.16 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "TPL5010_1_1"
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "DELAY/M_RST" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 2.54)
-        (name "DONE" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 -2.54 180) (length 2.54)
-        (name "WAKE" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin open_collector line (at 12.7 2.54 180) (length 2.54)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "TPL5110" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "TPL5110" (id 1) (at 6.35 8.89 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5110.pdf" (id 3) (at -5.08 -10.16 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "timer active-low nano wake done" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, Nano Power, Active-Low, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA, SOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "TPL5110_0_1"
-      (rectangle (start -12.7 7.62) (end 10.16 -10.16)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "TPL5110_1_1"
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -12.7 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "DELAY/M_DRV" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -2.54 180) (length 2.54)
-        (name "DONE" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 0 180) (length 2.54)
-        (name "DRV" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "EN/ONE_SHOT" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "TPL5111" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 11.43 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "TPL5111" (id 1) (at 6.35 11.43 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5111.pdf" (id 3) (at -41.91 3.81 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "timer active-high nano wake done" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Timer, Nano Power, Active-High, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA, SOT-23-6" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "TPL5111_0_1"
-      (rectangle (start -12.7 10.16) (end 10.16 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "TPL5111_1_1"
-      (pin power_in line (at 0 12.7 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "DELAY/M_DRV" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 2.54)
-        (name "DONE" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 2.54 180) (length 2.54)
-        (name "~{DRV}" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "EN/ONE_SHOT" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary b/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary
deleted file mode 100644
index dd527ba..0000000
--- a/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary
+++ /dev/null
@@ -1,16 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kiutils)
-  (symbol "testsymbol" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0.0 0.0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "testvalue" (id 1) (at 0.0 0.0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0.0 0.0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "" (id 3) (at 0.0 0.0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild
deleted file mode 100644
index 1af97f0..0000000
--- a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild
+++ /dev/null
@@ -1,16 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD1853_0_0"
-      (text "NormalStuff" (at 0 19.05 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at 13.335 13.97 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
\ No newline at end of file
diff --git a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected
deleted file mode 100644
index 12e15f2..0000000
--- a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected
+++ /dev/null
@@ -1,25 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD1853_0_0"
-      (text "NormalStuff" (at 0 19.05 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at 13.335 13.97 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "SomeNewName:AD2023"
-    (text "NormalStuff" (at 0 19.05 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (pin input line (at 13.335 13.97 0) (length 2.54)
-      (name "NormalPin" (effects (font (size 1.27 1.27))))
-      (number "123" (effects (font (size 1.27 1.27))))
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_mergeLibraries b/tests/testdata/symbol/test_mergeLibraries
deleted file mode 100644
index 2db88ae..0000000
--- a/tests/testdata/symbol/test_mergeLibraries
+++ /dev/null
@@ -1,4760 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD390JD" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD390JD" (id 1) (at 8.89 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 12bit DAC, 4LSB Gain Error, DH-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD390JD_0_1"
-      (rectangle (start -13.97 -29.21) (end 13.97 29.21)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD390JD_1_1"
-      (pin input line (at -17.78 25.4 0) (length 3.81)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "D9" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "D10" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 3.81)
-        (name "D11" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -33.02 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 33.02 270) (length 3.81)
-        (name "-VS" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -25.4 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "REFOUT" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -12.7 180) (length 3.81)
-        (name "REFIN" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 20.32 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 22.86 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 33.02 270) (length 3.81)
-        (name "+VS" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "~{A1}" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{A0}" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{CS1}" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -20.32 0) (length 3.81)
-        (name "~{CS2}" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -22.86 0) (length 3.81)
-        (name "~{CS3}" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -25.4 0) (length 3.81)
-        (name "~{CS4}" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 20.32 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD390KD" (extends "AD390JD")
-    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD390KD" (id 1) (at 8.89 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 12bit DAC, 2LSB Gain Error, DH-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD558JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558JN" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD558JN_0_1"
-      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD558JN_1_1"
-      (pin input line (at -12.7 12.7 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -12.7 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "VSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "VSEN" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 3.81)
-        (name "~{CE}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD558KN" (extends "AD558JN")
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558KN" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD558JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558JP" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD558JP_0_1"
-      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD558JP_1_1"
-      (pin input line (at -12.7 -5.08 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 3.81)
-        (name "~{CE}" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -12.7 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "VSEL" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "VSEN" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 12.7 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD558KP" (extends "AD558JP")
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558KP" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5687BCPZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687BCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5687BCPZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5687BCPZ_1_1"
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 7.62 0) (length 2.54)
-        (name "SDIN" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5687RBCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687RBCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689BCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689BCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689RxCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689RxCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5687BRUZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687BRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5687BRUZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5687BRUZ_1_1"
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 7.62 0) (length 2.54)
-        (name "SDIN" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5687RBRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687RBRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689BRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689BRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689RxRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689RxRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5691RxRM" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5691RxRM" (id 1) (at 8.89 3.81 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tiny, 12-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5691RxRM_0_1"
-      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5691RxRM_1_1"
-      (pin power_in line (at 2.54 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 2.54)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 10.16 -2.54 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5693RxRM" (extends "AD5691RxRM")
-    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5693RxRM" (id 1) (at 8.89 3.81 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tiny, 16-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5697RBCPZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5697RBCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5697RBCPZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5697RBCPZ_1_1"
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5697RBRUZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5697RBRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5697RBRUZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5697RBRUZ_1_1"
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KN" (id 1) (at 6.35 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply 1ch" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KN_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LN" (extends "AD7224KN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LN" (id 1) (at 6.35 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KP" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KP_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LP" (extends "AD7224KP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LP" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KR-1" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KR-1" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KR-1_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LR-1" (extends "AD7224KR-1")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LR-1" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KR-18" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KR-18" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KR-18_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LR-18" (extends "AD7224KR-18")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LR-18" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225BRS" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225BRS" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225BRS_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225BRS_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225CRS" (extends "AD7225BRS")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225CRS" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KN_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LN" (extends "AD7225KN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KP_1_1"
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LP" (extends "AD7225KP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KR_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LR" (extends "AD7225KR")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SO-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7226BRSZ" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226BRSZ" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SSOP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226BRSZ_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226BRSZ_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, DIP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KN_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KP_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KR_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ABN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABN_1_1"
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACN" (extends "AD7228ABN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7228ABP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABP_1_1"
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACP" (extends "AD7228ABP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7228ABR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABR_1_1"
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACR" (extends "AD7228ABR")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7304" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 13.97 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7304" (id 1) (at 2.54 13.97 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 4ch 8bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, SPI Interface, SOIC-16/TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*W*7.5x10.3mm*P1.27mm* TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7304_0_1"
-      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7304_1_1"
-      (pin output line (at 12.7 7.62 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "SDI/SHDN" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -10.16 180) (length 2.54)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 2.54 180) (length 2.54)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 2.54)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 10.16 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -15.24 90) (length 2.54)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -2.54 180) (length 2.54)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -2.54 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -5.08 0) (length 2.54)
-        (name "~{CLR}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7305" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 16.51 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7305" (id 1) (at 3.81 16.51 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 4ch 8bit parallel" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, Parallel Interface, SOIC-20/TSSOP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*W*7.5x12.8mm*P1.27mm* TSSOP*4.4x6.5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7305_0_1"
-      (rectangle (start -10.16 15.24) (end 10.16 -15.24)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7305_1_1"
-      (pin output line (at 12.7 10.16 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -12.7 0) (length 2.54)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "A0/SHDN" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 17.78 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 2.54)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 12.7 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 2.54)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -17.78 90) (length 2.54)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -17.78 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 12.7 0) (length 2.54)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 2.54)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 2.54)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7390" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7390" (id 1) (at 1.27 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "SPI 12 bit DAC" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Serial-Input Micropower 12-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7390_0_0"
-      (polyline
-        (pts
-          (xy 12.7 0)
-          (xy 5.08 7.62)
-          (xy -10.16 7.62)
-          (xy -10.16 -7.62)
-          (xy 5.08 -7.62)
-          (xy 12.7 0)
-        )
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7390_1_1"
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "~{LD}" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "SDI" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "~{CLR}" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "Vss" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 0 180) (length 2.54)
-        (name "Vout" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "Vdd" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -2.54 10.16 270) (length 2.54)
-        (name "Vref" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7391" (extends "AD7390")
-    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7391" (id 1) (at 1.27 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "SPI 10 bit DAC" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Serial-Input Micropower 10-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533JN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533JN_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533JN_1_1"
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7533KN" (extends "AD7533JN")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533LN" (extends "AD7533JN")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533LN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533JP" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533JP_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533JP_1_1"
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -12.7 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7533KP" (extends "AD7533JP")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KP" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KR" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, SOIC-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533KR_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533KR_1_1"
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD775" (pin_names (offset 0.762)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD775" (id 1) (at 8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD775.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "DAC CNA" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "DA Converter 8 bits - 20MHz, PDIP/SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD775_0_1"
-      (rectangle (start -13.97 -16.51) (end 13.97 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD775_1_1"
-      (pin input line (at 17.78 -10.16 180) (length 3.81)
-        (name "~{OE}" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 -5.08 180) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 20.32 270) (length 3.81)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 17.78 -12.7 180) (length 3.81)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 20.32 270) (length 3.81)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "VRTS" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 3.81)
-        (name "VRT" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "VIN" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 -20.32 90) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -20.32 90) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "VRBS" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "VRB" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 12.7 180) (length 3.81)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 10.16 180) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 7.62 180) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 5.08 180) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 2.54 180) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 0 180) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 -2.54 180) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9106BCP" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 29.21 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9106BCP" (id 1) (at 11.43 29.21 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.6x3.6mm" (id 2) (at 0 3.81 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/ad9106.pdf" (id 3) (at 0 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "analog devices DAC DDS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Analog Devices Quad, Low Power, 12-Bit, 180 MSPS, Digital-to-Analog Converter and Waveform Generator" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*LFCSP*1EP*5x5mm*P0.5mm*EP3.6x3.6mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9106BCP_0_0"
-      (rectangle (start -15.24 27.94) (end 15.24 -27.94)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -7.62)
-          (xy 7.62 -7.62)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -5.08)
-          (xy 7.62 -5.08)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 0)
-          (xy 7.62 0)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 2.54)
-          (xy 7.62 2.54)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 7.62)
-          (xy 7.62 7.62)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 10.16)
-          (xy 7.62 10.16)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 15.24)
-          (xy 7.62 15.24)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 17.78)
-          (xy 7.62 17.78)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (text "DAC" (at 1.778 -6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 8.89 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 16.51 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD9106BCP_0_1"
-      (polyline
-        (pts
-          (xy -1.27 -3.81)
-          (xy 3.81 -3.81)
-          (xy 6.35 -6.35)
-          (xy 3.81 -8.89)
-          (xy -1.27 -8.89)
-          (xy -1.27 -3.81)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 3.81)
-          (xy 3.81 3.81)
-          (xy 6.35 1.27)
-          (xy 3.81 -1.27)
-          (xy -1.27 -1.27)
-          (xy -1.27 3.81)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 11.43)
-          (xy 3.81 11.43)
-          (xy 6.35 8.89)
-          (xy 3.81 6.35)
-          (xy -1.27 6.35)
-          (xy -1.27 11.43)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 19.05)
-          (xy 3.81 19.05)
-          (xy 6.35 16.51)
-          (xy 3.81 13.97)
-          (xy -1.27 13.97)
-          (xy -1.27 19.05)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-    )
-    (symbol "AD9106BCP_1_1"
-      (pin input line (at -17.78 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -5.08 180) (length 2.54)
-        (name "IOUTP4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -7.62 180) (length 2.54)
-        (name "IOUTN4" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 30.48 270) (length 2.54)
-        (name "AVDD2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 2.54)
-        (name "IOUTN3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 2.54)
-        (name "IOUTP3" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 -30.48 90) (length 2.54)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -17.78 180) (length 2.54)
-        (name "FSADJ3" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -20.32 180) (length 2.54)
-        (name "FSADJ4" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 -22.86 0) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -30.48 90) (length 2.54)
-        (name "CLKGND" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 7.62 0) (length 2.54)
-        (name "SDIO" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 2.54)
-        (name "CLKN" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 2.54)
-        (name "CLKP" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 -12.7 0) (length 2.54)
-        (name "CLDO" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 30.48 270) (length 2.54)
-        (name "CLKVDD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 17.78 -15.24 180) (length 2.54)
-        (name "FSADJ2/CAL_SENSE" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -12.7 180) (length 2.54)
-        (name "FSADJ1" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 5.08 -30.48 90) (length 2.54) hide
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 2.54)
-        (name "IOUTP1" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 2.54)
-        (name "IOUTN1" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 30.48 270) (length 2.54)
-        (name "AVDD1" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 -30.48 90) (length 2.54)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 2.54)
-        (name "IOUTN2" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 2.54)
-        (name "IOUTP2" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 2.54)
-        (name "~{TRIGGER}" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -5.08 -30.48 90) (length 2.54) hide
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at -17.78 -17.78 0) (length 2.54)
-        (name "DLDO2" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 30.48 270) (length 2.54)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at -17.78 -15.24 0) (length 2.54)
-        (name "DLDO1" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -17.78 5.08 0) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-        (alternate "DOUT" output line)
-        (alternate "SDI2" input line)
-      )
-      (pin input line (at -17.78 12.7 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9142" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9142" (id 1) (at -10.16 -59.69 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-72-1EP_10x10mm_P0.5mm_EP6.15x6.15mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9142.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "16bit DAC 2CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1.6GSPS 16bit dual-channel DAC, LFCSP-72" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*1EP*10x10mm*P0.5mm*EP6.15x6.15mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9142_0_0"
-      (rectangle (start -7.62 46.99) (end -5.08 -41.91)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -1.27 -45.72) (end 3.81 -48.26)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 19.05)
-          (xy -5.08 19.05)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 34.29)
-          (xy -5.08 34.29)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 1.27 -45.72)
-          (xy 1.27 16.51)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 3.81 -21.59)
-          (xy 1.27 -21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -21.59)
-          (xy 3.81 -21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 17.78)
-          (xy 7.62 17.78)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 20.32)
-          (xy 7.62 20.32)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 33.02)
-          (xy 7.62 33.02)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 35.56)
-          (xy 7.62 35.56)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 1.27 11.43)
-          (xy -2.54 11.43)
-          (xy -2.54 26.67)
-          (xy 1.27 26.67)
-          (xy 1.27 31.75)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 21.59)
-          (xy 5.08 21.59)
-          (xy 7.62 19.05)
-          (xy 5.08 16.51)
-          (xy -1.27 16.51)
-          (xy -1.27 21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 36.83)
-          (xy 5.08 36.83)
-          (xy 7.62 34.29)
-          (xy 5.08 31.75)
-          (xy -1.27 31.75)
-          (xy -1.27 36.83)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start 5.08 -11.43) (end 7.62 -31.75)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (text "CTRL" (at 6.35 -20.32 900)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "DAC" (at 2.54 19.05 0)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "DAC" (at 2.54 34.29 0)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "IFC" (at -6.35 2.54 900)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "PLL" (at 1.27 -46.99 0)
-        (effects (font (size 1.524 1.524)))
-      )
-    )
-    (symbol "AD9142_0_1"
-      (rectangle (start -15.24 58.42) (end 15.24 -58.42)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD9142_1_1"
-      (pin power_in line (at 0 60.96 270) (length 2.54)
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -30.48 0) (length 2.54)
-        (name "D15P" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -33.02 0) (length 2.54)
-        (name "D15N" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -25.4 0) (length 2.54)
-        (name "D14P" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -27.94 0) (length 2.54)
-        (name "D14N" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -20.32 0) (length 2.54)
-        (name "D13P" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -22.86 0) (length 2.54)
-        (name "D13N" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 2.54)
-        (name "D12P" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 2.54)
-        (name "D12N" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -45.72 0) (length 2.54)
-        (name "REFP/SYNCP" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 2.54)
-        (name "D11P" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 2.54)
-        (name "D11N" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 2.54)
-        (name "D10P" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 2.54)
-        (name "D10N" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 2.54)
-        (name "D9P" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 2.54)
-        (name "D9N" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 2.54)
-        (name "D8P" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 2.54)
-        (name "D8N" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -38.1 0) (length 2.54)
-        (name "DCIP" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -40.64 0) (length 2.54)
-        (name "DCIN" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -48.26 0) (length 2.54)
-        (name "REFN/SYNCN" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 2.54)
-        (name "D7P" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 2.54)
-        (name "D7N" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 2.54)
-        (name "D6P" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 2.54)
-        (name "D6N" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 20.32 0) (length 2.54)
-        (name "D5P" (effects (font (size 1.27 1.27))))
-        (number "34" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "D5N" (effects (font (size 1.27 1.27))))
-        (number "35" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "36" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "D4P" (effects (font (size 1.27 1.27))))
-        (number "37" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 22.86 0) (length 2.54)
-        (name "D4N" (effects (font (size 1.27 1.27))))
-        (number "38" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 30.48 0) (length 2.54)
-        (name "D3P" (effects (font (size 1.27 1.27))))
-        (number "39" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 27.94 0) (length 2.54)
-        (name "D3N" (effects (font (size 1.27 1.27))))
-        (number "40" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 35.56 0) (length 2.54)
-        (name "D2P" (effects (font (size 1.27 1.27))))
-        (number "41" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 33.02 0) (length 2.54)
-        (name "D2N" (effects (font (size 1.27 1.27))))
-        (number "42" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "43" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 40.64 0) (length 2.54)
-        (name "D1P" (effects (font (size 1.27 1.27))))
-        (number "44" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 38.1 0) (length 2.54)
-        (name "D1N" (effects (font (size 1.27 1.27))))
-        (number "45" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 45.72 0) (length 2.54)
-        (name "D0P" (effects (font (size 1.27 1.27))))
-        (number "46" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 43.18 0) (length 2.54)
-        (name "D0N" (effects (font (size 1.27 1.27))))
-        (number "47" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "48" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "49" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -27.94 180) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -15.24 180) (length 2.54)
-        (name "~{IRQ2}" (effects (font (size 1.27 1.27))))
-        (number "50" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -12.7 180) (length 2.54)
-        (name "~{IRQ1}" (effects (font (size 1.27 1.27))))
-        (number "51" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 17.78 -17.78 180) (length 2.54)
-        (name "SDIO" (effects (font (size 1.27 1.27))))
-        (number "52" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -20.32 180) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "53" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -22.86 180) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "54" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 60.96 270) (length 2.54)
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "55" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 20.32 180) (length 2.54)
-        (name "IOUT2P" (effects (font (size 1.27 1.27))))
-        (number "56" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 2.54)
-        (name "IOUT2N" (effects (font (size 1.27 1.27))))
-        (number "57" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "58" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "59" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -30.48 180) (length 2.54)
-        (name "TXEN" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "60" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -53.34 0) (length 2.54)
-        (name "DACCLKN" (effects (font (size 1.27 1.27))))
-        (number "61" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -50.8 0) (length 2.54)
-        (name "DACCLKP" (effects (font (size 1.27 1.27))))
-        (number "62" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "63" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "64" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "65" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 33.02 180) (length 2.54)
-        (name "IOUT1N" (effects (font (size 1.27 1.27))))
-        (number "66" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 35.56 180) (length 2.54)
-        (name "IOUT1P" (effects (font (size 1.27 1.27))))
-        (number "67" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "68" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 2.54)
-        (name "FSADJ" (effects (font (size 1.27 1.27))))
-        (number "69" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 60.96 270) (length 2.54)
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "70" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "71" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "72" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -60.96 90) (length 2.54)
-        (name "AVSS" (effects (font (size 1.27 1.27))))
-        (number "73" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 53.34 0) (length 2.54)
-        (name "FRAMEP" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 50.8 0) (length 2.54)
-        (name "FRAMEN" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9744" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 -24.13 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9744" (id 1) (at 7.62 24.13 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm" (id 2) (at 15.24 5.08 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9744.pdf" (id 3) (at 15.24 5.08 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "14bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "210MSPS 14bit DAC, TSSOP-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x9.7mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9744_0_1"
-      (rectangle (start 12.7 22.86) (end -12.7 -22.86)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD9744_1_1"
-      (pin input line (at -15.24 -15.24 0) (length 2.54)
-        (name "D13" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 2.54)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 15.24 0) (length 2.54)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 17.78 0) (length 2.54)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 2.54 180) (length 2.54)
-        (name "SLEEP" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -15.24 180) (length 2.54)
-        (name "REFLO" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -12.7 180) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -2.54 180) (length 2.54)
-        (name "FS_ADJ" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -12.7 0) (length 2.54)
-        (name "D12" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -25.4 90) (length 2.54)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 10.16 180) (length 2.54)
-        (name "IOUTB" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 12.7 180) (length 2.54)
-        (name "IOUTA" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 25.4 270) (length 2.54)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 0 180) (length 2.54)
-        (name "MODE" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 2.54)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 2.54)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -20.32 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 2.54)
-        (name "D11" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 2.54)
-        (name "D10" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 2.54)
-        (name "D9" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 2.54)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ADS7830" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 13.716 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "ADS7830" (id 1) (at 1.778 13.716 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 2.54 -17.78 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ads7830.pdf" (id 3) (at 5.08 -11.43 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single-supply, 8bit, 8 ch, SAR, 70kHz SR, 2.7 - 5 VDD, I2C, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "ADS7830_0_1"
-      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "ADS7830_1_1"
-      (pin input line (at -12.7 10.16 0) (length 2.54)
-        (name "CH0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 12.7 0 180) (length 2.54)
-        (name "REFin/REFout" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 2.54)
-        (name "COM" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 7.62 180) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 12.7 10.16 180) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 2.54)
-        (name "CH1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "CH2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "CH3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "CH4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "CH5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "CH6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -7.62 0) (length 2.54)
-        (name "CH7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_mergeLibraries.expected b/tests/testdata/symbol/test_mergeLibraries.expected
deleted file mode 100644
index 9a633a0..0000000
--- a/tests/testdata/symbol/test_mergeLibraries.expected
+++ /dev/null
@@ -1,5128 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Reference" "U" (id 0) (at 0 16.51 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -5.715 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -7.62 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_locked" "" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD1853_0_0"
-      (rectangle (start -44.45 -102.235) (end -18.415 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -28.575 -252.73) (mid -2.8272 -239.9607) (end 6.35 -212.725)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -16.51 -102.235) (end 9.525 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -8.255 -254.635) (mid 17.4928 -241.8657) (end 26.67 -214.63)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 83.82 -252.095)
-          (xy 89.535 -293.37)
-          (xy 116.205 -267.335)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 116.205 -249.555)
-          (xy 121.92 -290.83)
-          (xy 148.59 -264.795)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 151.765 -248.285)
-          (xy 157.48 -289.56)
-          (xy 184.15 -263.525)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -102.235) (end 38.1 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 12.7 -255.27) (mid 38.4478 -242.5007) (end 47.625 -215.265)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 69.215 -99.695) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 111.76 -100.33) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 149.225 -99.06) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (text "NormalStuff" (at 0 26.035 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -62.865 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -59.69 0)
-        (effects (font (size 1.27 1.27) bold) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -56.515 0)
-        (effects (font (size 1.27 1.27) italic) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -53.34 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -43.18 0)
-        (effects (font (size 1.27 1.27) bold italic))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -40.005 0)
-        (effects (font (size 1.27 1.27) bold))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -36.83 0)
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -33.655 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -78.105 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -74.93 0)
-        (effects (font (size 1.27 1.27) bold) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -71.755 0)
-        (effects (font (size 1.27 1.27) italic) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -68.58 0)
-        (effects (font (size 1.27 1.27)) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 262.255 -33.655 900)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 264.795 -33.655 900)
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text "test text with \"quoted\" string" (at 267.335 -34.29 900)
-        (effects (font (size 1.27 1.27) bold))
-      )
-      (text "test text with \"quoted\" string" (at 270.51 -34.925 900)
-        (effects (font (size 1.27 1.27) bold italic))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -59.055 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -55.88 0)
-        (effects (font (size 1.27 1.27) bold) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -52.705 0)
-        (effects (font (size 1.27 1.27) italic) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -49.53 0)
-        (effects (font (size 1.27 1.27)) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -41.91 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -38.735 0)
-        (effects (font (size 1.27 1.27) bold) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -35.56 0)
-        (effects (font (size 1.27 1.27) italic) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -32.385 0)
-        (effects (font (size 1.27 1.27)) (justify top))
-      )
-      (pin input line (at 13.335 20.955 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_0"
-      (pin input line (at 10.795 31.115 0) (length 2.54)
-        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_1"
-      (rectangle (start -44.45 -71.755) (end -18.415 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -44.45 -41.275) (end -18.415 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -24.13 -208.28) (mid 1.6178 -195.5107) (end 10.795 -168.275)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -23.495 -167.005) (mid 2.2528 -154.2357) (end 11.43 -127)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -16.51 -71.755) (end 9.525 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (rectangle (start -16.51 -41.275) (end 9.525 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -3.81 -210.185) (mid 21.9378 -197.4157) (end 31.115 -170.18)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -3.175 -168.91) (mid 22.5728 -156.1407) (end 31.75 -128.905)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 80.645 -208.915)
-          (xy 86.36 -250.19)
-          (xy 113.03 -224.155)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 83.82 -161.29)
-          (xy 89.535 -202.565)
-          (xy 116.205 -176.53)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 113.03 -206.375)
-          (xy 118.745 -247.65)
-          (xy 145.415 -221.615)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 116.205 -158.75)
-          (xy 121.92 -200.025)
-          (xy 148.59 -173.99)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 148.59 -205.105)
-          (xy 154.305 -246.38)
-          (xy 180.975 -220.345)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (polyline
-        (pts
-          (xy 151.765 -157.48)
-          (xy 157.48 -198.755)
-          (xy 184.15 -172.72)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -71.755) (end 38.1 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -41.275) (end 38.1 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 17.145 -210.82) (mid 42.8928 -198.0507) (end 52.07 -170.815)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 17.78 -169.545) (mid 43.5278 -156.7757) (end 52.705 -129.54)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 66.04 -28.575) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 69.85 -64.135) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 108.585 -29.21) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 112.395 -64.77) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 146.05 -27.94) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 149.86 -63.5) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (text "Unit A, Normal" (at -1.27 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 24.765 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_2"
-      (text "Unit A, DeMorgan" (at 0.635 6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 24.13 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_0"
-      (pin input line (at 13.335 29.845 0) (length 2.54)
-        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -15.24 20.32 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_2"
-      (text "Unit B, DeMorgan" (at -1.905 6.985 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_0"
-      (pin input line (at 15.24 28.575 0) (length 2.54)
-        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.145 24.765 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD390JD" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD390JD" (id 1) (at 8.89 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 12bit DAC, 4LSB Gain Error, DH-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD390JD_0_1"
-      (rectangle (start -13.97 -29.21) (end 13.97 29.21)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD390JD_1_1"
-      (pin input line (at -17.78 25.4 0) (length 3.81)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "D9" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "D10" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 3.81)
-        (name "D11" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -33.02 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 33.02 270) (length 3.81)
-        (name "-VS" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -25.4 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "REFOUT" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -12.7 180) (length 3.81)
-        (name "REFIN" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 20.32 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 22.86 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 33.02 270) (length 3.81)
-        (name "+VS" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "~{A1}" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{A0}" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{CS1}" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -20.32 0) (length 3.81)
-        (name "~{CS2}" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -22.86 0) (length 3.81)
-        (name "~{CS3}" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -25.4 0) (length 3.81)
-        (name "~{CS4}" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 20.32 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD390KD" (extends "AD390JD")
-    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD390KD" (id 1) (at 8.89 30.48 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 12bit DAC, 2LSB Gain Error, DH-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD558JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558JN" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD558JN_0_1"
-      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD558JN_1_1"
-      (pin input line (at -12.7 12.7 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -12.7 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "VSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "VSEN" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 3.81)
-        (name "~{CE}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD558KN" (extends "AD558JN")
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558KN" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD558JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558JP" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD558JP_0_1"
-      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD558JP_1_1"
-      (pin input line (at -12.7 -5.08 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 3.81)
-        (name "~{CE}" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -12.7 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "V+" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 3.81)
-        (name "VSEL" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 3.81)
-        (name "VSEN" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 12.7 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD558KP" (extends "AD558JP")
-    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD558KP" (id 1) (at 2.54 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5687BCPZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687BCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5687BCPZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5687BCPZ_1_1"
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 7.62 0) (length 2.54)
-        (name "SDIN" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5687RBCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687RBCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689BCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689BCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689RxCPZ" (extends "AD5687BCPZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689RxCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5687BRUZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687BRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5687BRUZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5687BRUZ_1_1"
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 7.62 0) (length 2.54)
-        (name "SDIN" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 -2.54 180) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5687RBRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5687RBRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689BRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689BRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5689RxRUZ" (extends "AD5687BRUZ")
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5689RxRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5691RxRM" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5691RxRM" (id 1) (at 8.89 3.81 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tiny, 12-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5691RxRM_0_1"
-      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5691RxRM_1_1"
-      (pin power_in line (at 2.54 10.16 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 0 180) (length 2.54)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 0 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 10.16 -2.54 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5693RxRM" (extends "AD5691RxRM")
-    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5693RxRM" (id 1) (at 8.89 3.81 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Tiny, 16-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD5697RBCPZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5697RBCPZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, LFCSP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5697RBCPZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5697RBCPZ_1_1"
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD5697RBRUZ" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD5697RBRUZ" (id 1) (at 8.89 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD5697RBRUZ_0_1"
-      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD5697RBRUZ_1_1"
-      (pin power_in line (at 5.08 15.24 270) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -7.62 0) (length 2.54)
-        (name "GAIN" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VLOGIC" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -5.08 0) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 10.16 0) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -2.54 0) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 2.54 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 -10.16 0) (length 2.54)
-        (name "RSTSEL" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 5.08 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
-        (name "NC" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 10.16 2.54 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -10.16 5.08 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KN" (id 1) (at 6.35 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply 1ch" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KN_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LN" (extends "AD7224KN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LN" (id 1) (at 6.35 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KP" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KP_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LP" (extends "AD7224KP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LP" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KR-1" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KR-1" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KR-1_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LR-1" (extends "AD7224KR-1")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LR-1" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7224KR-18" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224KR-18" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7224KR-18_1_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (pin power_in line (at 2.54 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "~{RST}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7224LR-18" (extends "AD7224KR-18")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7224LR-18" (id 1) (at 5.08 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225BRS" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225BRS" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225BRS_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225BRS_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225CRS" (extends "AD7225BRS")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225CRS" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KN_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LN" (extends "AD7225KN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KP_1_1"
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LP" (extends "AD7225KP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7225KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225KR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7225KR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7225KR_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -7.62 180) (length 3.81)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -5.08 180) (length 3.81)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 3.81)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 3.81)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7225LR" (extends "AD7225KR")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7225LR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SO-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7226BRSZ" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226BRSZ" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SSOP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226BRSZ_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226BRSZ_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, DIP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KN_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KP_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7226KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7226KR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SOIC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7226KR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7226KR_1_1"
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -17.78 180) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ABN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABN_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABN_1_1"
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACN" (extends "AD7228ABN")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACN" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7228ABP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABP_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABP_1_1"
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACP" (extends "AD7228ABP")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACP" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7228ABR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ABR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7228ABR_0_1"
-      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7228ABR_1_1"
-      (pin power_in line (at -5.08 25.4 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 25.4 270) (length 3.81)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 17.78 -17.78 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 3.81)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 3.81)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 3.81)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 3.81)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 3.81)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 3.81)
-        (name "VOUT8" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 3.81)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 3.81)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 3.81)
-        (name "A2" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 3.81)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 3.81)
-        (name "VOUT7" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 5.08 180) (length 3.81)
-        (name "VOUT6" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 3.81)
-        (name "VOUT5" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 3.81)
-        (name "VOUT4" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 12.7 180) (length 3.81)
-        (name "VOUT3" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 3.81)
-        (name "VOUT2" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 3.81)
-        (name "VOUT1" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7228ACR" (extends "AD7228ABR")
-    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7228ACR" (id 1) (at 7.62 22.86 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7304" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 13.97 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7304" (id 1) (at 2.54 13.97 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 4ch 8bit spi" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, SPI Interface, SOIC-16/TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*W*7.5x10.3mm*P1.27mm* TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7304_0_1"
-      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7304_1_1"
-      (pin output line (at 12.7 7.62 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "SDI/SHDN" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "VREFC" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -10.16 180) (length 2.54)
-        (name "VREFD" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 2.54 180) (length 2.54)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 2.54)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 10.16 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -15.24 90) (length 2.54)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -2.54 180) (length 2.54)
-        (name "VREFA" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "VREFB" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -2.54 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -5.08 0) (length 2.54)
-        (name "~{CLR}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7305" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 16.51 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7305" (id 1) (at 3.81 16.51 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "dac 4ch 8bit parallel" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, Parallel Interface, SOIC-20/TSSOP-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SOIC*W*7.5x12.8mm*P1.27mm* TSSOP*4.4x6.5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7305_0_1"
-      (rectangle (start -10.16 15.24) (end 10.16 -15.24)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7305_1_1"
-      (pin output line (at 12.7 10.16 180) (length 2.54)
-        (name "VOUTB" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "DB4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "DB3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "DB2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "DB1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "DB0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -12.7 -12.7 0) (length 2.54)
-        (name "~{WR}" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "A0/SHDN" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 17.78 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 5.08 180) (length 2.54)
-        (name "VOUTD" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 12.7 180) (length 2.54)
-        (name "VOUTA" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 12.7 7.62 180) (length 2.54)
-        (name "VOUTC" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -17.78 90) (length 2.54)
-        (name "VSS" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 0 180) (length 2.54)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -17.78 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 2.54)
-        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 12.7 0) (length 2.54)
-        (name "DB7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 10.16 0) (length 2.54)
-        (name "DB6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 2.54)
-        (name "DB5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7390" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7390" (id 1) (at 1.27 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "SPI 12 bit DAC" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Serial-Input Micropower 12-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7390_0_0"
-      (polyline
-        (pts
-          (xy 12.7 0)
-          (xy 5.08 7.62)
-          (xy -10.16 7.62)
-          (xy -10.16 -7.62)
-          (xy 5.08 -7.62)
-          (xy 12.7 0)
-        )
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7390_1_1"
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "~{LD}" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "SDI" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "~{CLR}" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -10.16 90) (length 2.54)
-        (name "Vss" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 0 180) (length 2.54)
-        (name "Vout" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 10.16 270) (length 2.54)
-        (name "Vdd" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -2.54 10.16 270) (length 2.54)
-        (name "Vref" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7391" (extends "AD7390")
-    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7391" (id 1) (at 1.27 8.89 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "SPI 10 bit DAC" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Serial-Input Micropower 10-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533JN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533JN_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533JN_1_1"
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7533KN" (extends "AD7533JN")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533LN" (extends "AD7533JN")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533LN" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533JP" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533JP_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533JP_1_1"
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -12.7 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD7533KP" (extends "AD7533JP")
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KP" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-  (symbol "AD7533KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD7533KR" (id 1) (at 3.81 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "10bit Multiplying DAC, 1 Channel, SOIC-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD7533KR_0_1"
-      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD7533KR_1_1"
-      (pin passive line (at 15.24 5.08 180) (length 3.81)
-        (name "I_OUT1" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 3.81)
-        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 20.32 270) (length 3.81)
-        (name "VCC" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -10.16 180) (length 3.81)
-        (name "VREF" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 12.7 180) (length 3.81)
-        (name "RFBACK" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 15.24 -2.54 180) (length 3.81)
-        (name "I_OUT2" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -20.32 90) (length 3.81)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 3.81)
-        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 3.81)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD775" (pin_names (offset 0.762)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "AD775" (id 1) (at 8.89 17.78 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD775.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "DAC CNA" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "DA Converter 8 bits - 20MHz, PDIP/SOIC-24" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD775_0_1"
-      (rectangle (start -13.97 -16.51) (end 13.97 16.51)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD775_1_1"
-      (pin input line (at 17.78 -10.16 180) (length 3.81)
-        (name "~{OE}" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 -5.08 180) (length 3.81)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 20.32 270) (length 3.81)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input clock (at 17.78 -12.7 180) (length 3.81)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 20.32 270) (length 3.81)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -7.62 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 3.81)
-        (name "VRTS" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 3.81)
-        (name "VRT" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 20.32 270) (length 3.81)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 3.81)
-        (name "VIN" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 -20.32 90) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -20.32 90) (length 3.81)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 3.81)
-        (name "VRBS" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 3.81)
-        (name "VRB" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 -20.32 90) (length 3.81)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 12.7 180) (length 3.81)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 10.16 180) (length 3.81)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 7.62 180) (length 3.81)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 5.08 180) (length 3.81)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 2.54 180) (length 3.81)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 0 180) (length 3.81)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin tri_state line (at 17.78 -2.54 180) (length 3.81)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9106BCP" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -13.97 29.21 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9106BCP" (id 1) (at 11.43 29.21 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.6x3.6mm" (id 2) (at 0 3.81 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/ad9106.pdf" (id 3) (at 0 -2.54 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "analog devices DAC DDS" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Analog Devices Quad, Low Power, 12-Bit, 180 MSPS, Digital-to-Analog Converter and Waveform Generator" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "*LFCSP*1EP*5x5mm*P0.5mm*EP3.6x3.6mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9106BCP_0_0"
-      (rectangle (start -15.24 27.94) (end 15.24 -27.94)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -7.62)
-          (xy 7.62 -7.62)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -5.08)
-          (xy 7.62 -5.08)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 0)
-          (xy 7.62 0)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 2.54)
-          (xy 7.62 2.54)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 7.62)
-          (xy 7.62 7.62)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 10.16)
-          (xy 7.62 10.16)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 15.24)
-          (xy 7.62 15.24)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 17.78)
-          (xy 7.62 17.78)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (text "DAC" (at 1.778 -6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 8.89 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "DAC" (at 1.778 16.51 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD9106BCP_0_1"
-      (polyline
-        (pts
-          (xy -1.27 -3.81)
-          (xy 3.81 -3.81)
-          (xy 6.35 -6.35)
-          (xy 3.81 -8.89)
-          (xy -1.27 -8.89)
-          (xy -1.27 -3.81)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 3.81)
-          (xy 3.81 3.81)
-          (xy 6.35 1.27)
-          (xy 3.81 -1.27)
-          (xy -1.27 -1.27)
-          (xy -1.27 3.81)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 11.43)
-          (xy 3.81 11.43)
-          (xy 6.35 8.89)
-          (xy 3.81 6.35)
-          (xy -1.27 6.35)
-          (xy -1.27 11.43)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 19.05)
-          (xy 3.81 19.05)
-          (xy 6.35 16.51)
-          (xy 3.81 13.97)
-          (xy -1.27 13.97)
-          (xy -1.27 19.05)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-    )
-    (symbol "AD9106BCP_1_1"
-      (pin input line (at -17.78 10.16 0) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -5.08 180) (length 2.54)
-        (name "IOUTP4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -7.62 180) (length 2.54)
-        (name "IOUTN4" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 30.48 270) (length 2.54)
-        (name "AVDD2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 0 180) (length 2.54)
-        (name "IOUTN3" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 2.54 180) (length 2.54)
-        (name "IOUTP3" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 5.08 -30.48 90) (length 2.54)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -17.78 180) (length 2.54)
-        (name "FSADJ3" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -20.32 180) (length 2.54)
-        (name "FSADJ4" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 -22.86 0) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -30.48 90) (length 2.54)
-        (name "CLKGND" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 7.62 0) (length 2.54)
-        (name "SDIO" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 2.54)
-        (name "CLKN" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 2.54)
-        (name "CLKP" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at -17.78 -12.7 0) (length 2.54)
-        (name "CLDO" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 30.48 270) (length 2.54)
-        (name "CLKVDD" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 17.78 -15.24 180) (length 2.54)
-        (name "FSADJ2/CAL_SENSE" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 -12.7 180) (length 2.54)
-        (name "FSADJ1" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 5.08 -30.48 90) (length 2.54) hide
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 2.54)
-        (name "IOUTP1" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 15.24 180) (length 2.54)
-        (name "IOUTN1" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 30.48 270) (length 2.54)
-        (name "AVDD1" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 -30.48 90) (length 2.54)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 7.62 180) (length 2.54)
-        (name "IOUTN2" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 10.16 180) (length 2.54)
-        (name "IOUTP2" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 2.54)
-        (name "~{TRIGGER}" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -5.08 -30.48 90) (length 2.54) hide
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at -17.78 -17.78 0) (length 2.54)
-        (name "DLDO2" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -5.08 30.48 270) (length 2.54)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_out line (at -17.78 -15.24 0) (length 2.54)
-        (name "DLDO1" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at -17.78 5.08 0) (length 2.54)
-        (name "SDO" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-        (alternate "DOUT" output line)
-        (alternate "SDI2" input line)
-      )
-      (pin input line (at -17.78 12.7 0) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9142" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9142" (id 1) (at -10.16 -59.69 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_CSP:LFCSP-72-1EP_10x10mm_P0.5mm_EP6.15x6.15mm" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9142.pdf" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "16bit DAC 2CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "1.6GSPS 16bit dual-channel DAC, LFCSP-72" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "LFCSP*1EP*10x10mm*P0.5mm*EP6.15x6.15mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9142_0_0"
-      (rectangle (start -7.62 46.99) (end -5.08 -41.91)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -1.27 -45.72) (end 3.81 -48.26)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 19.05)
-          (xy -5.08 19.05)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 34.29)
-          (xy -5.08 34.29)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 1.27 -45.72)
-          (xy 1.27 16.51)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 3.81 -21.59)
-          (xy 1.27 -21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 5.08 -21.59)
-          (xy 3.81 -21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 17.78)
-          (xy 7.62 17.78)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 20.32)
-          (xy 7.62 20.32)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 33.02)
-          (xy 7.62 33.02)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 6.35 35.56)
-          (xy 7.62 35.56)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 1.27 11.43)
-          (xy -2.54 11.43)
-          (xy -2.54 26.67)
-          (xy 1.27 26.67)
-          (xy 1.27 31.75)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 21.59)
-          (xy 5.08 21.59)
-          (xy 7.62 19.05)
-          (xy 5.08 16.51)
-          (xy -1.27 16.51)
-          (xy -1.27 21.59)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy -1.27 36.83)
-          (xy 5.08 36.83)
-          (xy 7.62 34.29)
-          (xy 5.08 31.75)
-          (xy -1.27 31.75)
-          (xy -1.27 36.83)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start 5.08 -11.43) (end 7.62 -31.75)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (text "CTRL" (at 6.35 -20.32 900)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "DAC" (at 2.54 19.05 0)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "DAC" (at 2.54 34.29 0)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "IFC" (at -6.35 2.54 900)
-        (effects (font (size 1.524 1.524)))
-      )
-      (text "PLL" (at 1.27 -46.99 0)
-        (effects (font (size 1.524 1.524)))
-      )
-    )
-    (symbol "AD9142_0_1"
-      (rectangle (start -15.24 58.42) (end 15.24 -58.42)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD9142_1_1"
-      (pin power_in line (at 0 60.96 270) (length 2.54)
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -30.48 0) (length 2.54)
-        (name "D15P" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -33.02 0) (length 2.54)
-        (name "D15N" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -25.4 0) (length 2.54)
-        (name "D14P" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -27.94 0) (length 2.54)
-        (name "D14N" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -20.32 0) (length 2.54)
-        (name "D13P" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -22.86 0) (length 2.54)
-        (name "D13N" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -15.24 0) (length 2.54)
-        (name "D12P" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -17.78 0) (length 2.54)
-        (name "D12N" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "19" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -45.72 0) (length 2.54)
-        (name "REFP/SYNCP" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -10.16 0) (length 2.54)
-        (name "D11P" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -12.7 0) (length 2.54)
-        (name "D11N" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -5.08 0) (length 2.54)
-        (name "D10P" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -7.62 0) (length 2.54)
-        (name "D10N" (effects (font (size 1.27 1.27))))
-        (number "23" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 0 0) (length 2.54)
-        (name "D9P" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -2.54 0) (length 2.54)
-        (name "D9N" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 5.08 0) (length 2.54)
-        (name "D8P" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 2.54 0) (length 2.54)
-        (name "D8N" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -38.1 0) (length 2.54)
-        (name "DCIP" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -40.64 0) (length 2.54)
-        (name "DCIN" (effects (font (size 1.27 1.27))))
-        (number "29" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -48.26 0) (length 2.54)
-        (name "REFN/SYNCN" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 10.16 0) (length 2.54)
-        (name "D7P" (effects (font (size 1.27 1.27))))
-        (number "30" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 7.62 0) (length 2.54)
-        (name "D7N" (effects (font (size 1.27 1.27))))
-        (number "31" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 15.24 0) (length 2.54)
-        (name "D6P" (effects (font (size 1.27 1.27))))
-        (number "32" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 12.7 0) (length 2.54)
-        (name "D6N" (effects (font (size 1.27 1.27))))
-        (number "33" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 20.32 0) (length 2.54)
-        (name "D5P" (effects (font (size 1.27 1.27))))
-        (number "34" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "D5N" (effects (font (size 1.27 1.27))))
-        (number "35" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "36" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "D4P" (effects (font (size 1.27 1.27))))
-        (number "37" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 22.86 0) (length 2.54)
-        (name "D4N" (effects (font (size 1.27 1.27))))
-        (number "38" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 30.48 0) (length 2.54)
-        (name "D3P" (effects (font (size 1.27 1.27))))
-        (number "39" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 27.94 0) (length 2.54)
-        (name "D3N" (effects (font (size 1.27 1.27))))
-        (number "40" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 35.56 0) (length 2.54)
-        (name "D2P" (effects (font (size 1.27 1.27))))
-        (number "41" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 33.02 0) (length 2.54)
-        (name "D2N" (effects (font (size 1.27 1.27))))
-        (number "42" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "43" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 40.64 0) (length 2.54)
-        (name "D1P" (effects (font (size 1.27 1.27))))
-        (number "44" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 38.1 0) (length 2.54)
-        (name "D1N" (effects (font (size 1.27 1.27))))
-        (number "45" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 45.72 0) (length 2.54)
-        (name "D0P" (effects (font (size 1.27 1.27))))
-        (number "46" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 43.18 0) (length 2.54)
-        (name "D0N" (effects (font (size 1.27 1.27))))
-        (number "47" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "48" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "49" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -27.94 180) (length 2.54)
-        (name "~{RESET}" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -15.24 180) (length 2.54)
-        (name "~{IRQ2}" (effects (font (size 1.27 1.27))))
-        (number "50" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -12.7 180) (length 2.54)
-        (name "~{IRQ1}" (effects (font (size 1.27 1.27))))
-        (number "51" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 17.78 -17.78 180) (length 2.54)
-        (name "SDIO" (effects (font (size 1.27 1.27))))
-        (number "52" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -20.32 180) (length 2.54)
-        (name "SCLK" (effects (font (size 1.27 1.27))))
-        (number "53" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -22.86 180) (length 2.54)
-        (name "~{CS}" (effects (font (size 1.27 1.27))))
-        (number "54" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 2.54 60.96 270) (length 2.54)
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "55" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 20.32 180) (length 2.54)
-        (name "IOUT2P" (effects (font (size 1.27 1.27))))
-        (number "56" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 17.78 180) (length 2.54)
-        (name "IOUT2N" (effects (font (size 1.27 1.27))))
-        (number "57" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "58" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "59" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -30.48 180) (length 2.54)
-        (name "TXEN" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "60" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -53.34 0) (length 2.54)
-        (name "DACCLKN" (effects (font (size 1.27 1.27))))
-        (number "61" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 -50.8 0) (length 2.54)
-        (name "DACCLKP" (effects (font (size 1.27 1.27))))
-        (number "62" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "63" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "64" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "65" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 33.02 180) (length 2.54)
-        (name "IOUT1N" (effects (font (size 1.27 1.27))))
-        (number "66" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 17.78 35.56 180) (length 2.54)
-        (name "IOUT1P" (effects (font (size 1.27 1.27))))
-        (number "67" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
-        (name "AVDD33" (effects (font (size 1.27 1.27))))
-        (number "68" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 0 180) (length 2.54)
-        (name "FSADJ" (effects (font (size 1.27 1.27))))
-        (number "69" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 60.96 270) (length 2.54)
-        (name "DVDD18" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 17.78 -2.54 180) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "70" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "71" (effects (font (size 1.27 1.27))))
-      )
-      (pin passive line (at 0 60.96 270) (length 2.54) hide
-        (name "CVDD18" (effects (font (size 1.27 1.27))))
-        (number "72" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -60.96 90) (length 2.54)
-        (name "AVSS" (effects (font (size 1.27 1.27))))
-        (number "73" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 53.34 0) (length 2.54)
-        (name "FRAMEP" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -17.78 50.8 0) (length 2.54)
-        (name "FRAMEN" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "AD9744" (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 -24.13 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD9744" (id 1) (at 7.62 24.13 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm" (id 2) (at 15.24 5.08 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9744.pdf" (id 3) (at 15.24 5.08 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "14bit DAC 1CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "210MSPS 14bit DAC, TSSOP-28" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x9.7mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD9744_0_1"
-      (rectangle (start 12.7 22.86) (end -12.7 -22.86)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "AD9744_1_1"
-      (pin input line (at -15.24 -15.24 0) (length 2.54)
-        (name "D13" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 7.62 0) (length 2.54)
-        (name "D4" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 10.16 0) (length 2.54)
-        (name "D3" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 12.7 0) (length 2.54)
-        (name "D2" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 15.24 0) (length 2.54)
-        (name "D1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 17.78 0) (length 2.54)
-        (name "D0" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 2.54 180) (length 2.54)
-        (name "SLEEP" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -15.24 180) (length 2.54)
-        (name "REFLO" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -12.7 180) (length 2.54)
-        (name "REFIO" (effects (font (size 1.27 1.27))))
-        (number "17" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 -2.54 180) (length 2.54)
-        (name "FS_ADJ" (effects (font (size 1.27 1.27))))
-        (number "18" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -12.7 0) (length 2.54)
-        (name "D12" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 -25.4 90) (length 2.54)
-        (name "AGND" (effects (font (size 1.27 1.27))))
-        (number "20" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 10.16 180) (length 2.54)
-        (name "IOUTB" (effects (font (size 1.27 1.27))))
-        (number "21" (effects (font (size 1.27 1.27))))
-      )
-      (pin output line (at 15.24 12.7 180) (length 2.54)
-        (name "IOUTA" (effects (font (size 1.27 1.27))))
-        (number "22" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 25.4 270) (length 2.54)
-        (name "AVDD" (effects (font (size 1.27 1.27))))
-        (number "24" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 15.24 0 180) (length 2.54)
-        (name "MODE" (effects (font (size 1.27 1.27))))
-        (number "25" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -25.4 90) (length 2.54)
-        (name "DGND" (effects (font (size 1.27 1.27))))
-        (number "26" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at -2.54 25.4 270) (length 2.54)
-        (name "DVDD" (effects (font (size 1.27 1.27))))
-        (number "27" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -20.32 0) (length 2.54)
-        (name "CLK" (effects (font (size 1.27 1.27))))
-        (number "28" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -10.16 0) (length 2.54)
-        (name "D11" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -7.62 0) (length 2.54)
-        (name "D10" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -5.08 0) (length 2.54)
-        (name "D9" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 -2.54 0) (length 2.54)
-        (name "D8" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 0 0) (length 2.54)
-        (name "D7" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 2.54 0) (length 2.54)
-        (name "D6" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -15.24 5.08 0) (length 2.54)
-        (name "D5" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-  (symbol "ADS7830" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
-    (property "Reference" "U" (id 0) (at -10.16 13.716 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Value" "ADS7830" (id 1) (at 1.778 13.716 0)
-      (effects (font (size 1.27 1.27)) (justify left))
-    )
-    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 2.54 -17.78 0)
-      (effects (font (size 1.27 1.27) italic) hide)
-    )
-    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ads7830.pdf" (id 3) (at 5.08 -11.43 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Single-supply, 8bit, 8 ch, SAR, 70kHz SR, 2.7 - 5 VDD, I2C, TSSOP-16" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "ADS7830_0_1"
-      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
-        (stroke (width 0.254) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-    )
-    (symbol "ADS7830_1_1"
-      (pin input line (at -12.7 10.16 0) (length 2.54)
-        (name "CH0" (effects (font (size 1.27 1.27))))
-        (number "1" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 12.7 0 180) (length 2.54)
-        (name "REFin/REFout" (effects (font (size 1.27 1.27))))
-        (number "10" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -10.16 0) (length 2.54)
-        (name "COM" (effects (font (size 1.27 1.27))))
-        (number "11" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -7.62 180) (length 2.54)
-        (name "A0" (effects (font (size 1.27 1.27))))
-        (number "12" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 -5.08 180) (length 2.54)
-        (name "A1" (effects (font (size 1.27 1.27))))
-        (number "13" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at 12.7 7.62 180) (length 2.54)
-        (name "SCL" (effects (font (size 1.27 1.27))))
-        (number "14" (effects (font (size 1.27 1.27))))
-      )
-      (pin bidirectional line (at 12.7 10.16 180) (length 2.54)
-        (name "SDA" (effects (font (size 1.27 1.27))))
-        (number "15" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 15.24 270) (length 2.54)
-        (name "VDD" (effects (font (size 1.27 1.27))))
-        (number "16" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 7.62 0) (length 2.54)
-        (name "CH1" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 5.08 0) (length 2.54)
-        (name "CH2" (effects (font (size 1.27 1.27))))
-        (number "3" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 2.54 0) (length 2.54)
-        (name "CH3" (effects (font (size 1.27 1.27))))
-        (number "4" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 0 0) (length 2.54)
-        (name "CH4" (effects (font (size 1.27 1.27))))
-        (number "5" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -2.54 0) (length 2.54)
-        (name "CH5" (effects (font (size 1.27 1.27))))
-        (number "6" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -5.08 0) (length 2.54)
-        (name "CH6" (effects (font (size 1.27 1.27))))
-        (number "7" (effects (font (size 1.27 1.27))))
-      )
-      (pin input line (at -12.7 -7.62 0) (length 2.54)
-        (name "CH7" (effects (font (size 1.27 1.27))))
-        (number "8" (effects (font (size 1.27 1.27))))
-      )
-      (pin power_in line (at 0 -15.24 90) (length 2.54)
-        (name "GND" (effects (font (size 1.27 1.27))))
-        (number "9" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_renameParentIdUsingIdToken b/tests/testdata/symbol/test_renameParentIdUsingIdToken
deleted file mode 100644
index b1165f6..0000000
--- a/tests/testdata/symbol/test_renameParentIdUsingIdToken
+++ /dev/null
@@ -1,112 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853JRS" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD1853JRS_0_0"
-      (text "Top Unit" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_0"
-      (text "Unit A" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_1"
-      (text "Unit A, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_2"
-      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_0"
-      (text "Unit B" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_2"
-      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_0"
-      (text "Unit C" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-  )
-  (symbol "Has_Library_Nick_Set:AD1853JRS" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD1853JRS_0_0"
-      (text "Top Unit" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_0"
-      (text "Unit A" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_1"
-      (text "Unit A, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_1_2"
-      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_0"
-      (text "Unit B" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_2_2"
-      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_0"
-      (text "Unit C" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD1853JRS_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected b/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected
deleted file mode 100644
index d4b1408..0000000
--- a/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected
+++ /dev/null
@@ -1,112 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "ExampleLibrary:AD2023" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD2023_0_0"
-      (text "Top Unit" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_0"
-      (text "Unit A" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_1"
-      (text "Unit A, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_2"
-      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_0"
-      (text "Unit B" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_2"
-      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_0"
-      (text "Unit C" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-  )
-  (symbol "AD2023" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (symbol "AD2023_0_0"
-      (text "Top Unit" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_0"
-      (text "Unit A" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_1"
-      (text "Unit A, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_1_2"
-      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_0"
-      (text "Unit B" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_2_2"
-      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_0"
-      (text "Unit C" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-    (symbol "AD2023_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_symbolDemorganSyItems b/tests/testdata/symbol/test_symbolDemorganSyItems
deleted file mode 100644
index 7fcce54..0000000
--- a/tests/testdata/symbol/test_symbolDemorganSyItems
+++ /dev/null
@@ -1,370 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Reference" "U" (id 0) (at 0 16.51 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -5.715 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -7.62 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_locked" "" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD1853_0_0"
-      (rectangle (start -44.45 -102.235) (end -18.415 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -28.575 -252.73) (mid -2.8272 -239.9607) (end 6.35 -212.725)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -16.51 -102.235) (end 9.525 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -8.255 -254.635) (mid 17.4928 -241.8657) (end 26.67 -214.63)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 83.82 -252.095)
-          (xy 89.535 -293.37)
-          (xy 116.205 -267.335)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 116.205 -249.555)
-          (xy 121.92 -290.83)
-          (xy 148.59 -264.795)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 151.765 -248.285)
-          (xy 157.48 -289.56)
-          (xy 184.15 -263.525)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -102.235) (end 38.1 -73.025)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 12.7 -255.27) (mid 38.4478 -242.5007) (end 47.625 -215.265)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 69.215 -99.695) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 111.76 -100.33) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 149.225 -99.06) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (text "NormalStuff" (at 0 26.035 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -62.865 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -59.69 0)
-        (effects (font (size 1.27 1.27) bold) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -56.515 0)
-        (effects (font (size 1.27 1.27) italic) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 229.87 -53.34 0)
-        (effects (font (size 1.27 1.27)) (justify left))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -43.18 0)
-        (effects (font (size 1.27 1.27) bold italic))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -40.005 0)
-        (effects (font (size 1.27 1.27) bold))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -36.83 0)
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text "test text with \"quoted\" string" (at 230.505 -33.655 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -78.105 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -74.93 0)
-        (effects (font (size 1.27 1.27) bold) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -71.755 0)
-        (effects (font (size 1.27 1.27) italic) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 231.14 -68.58 0)
-        (effects (font (size 1.27 1.27)) (justify right))
-      )
-      (text "test text with \"quoted\" string" (at 262.255 -33.655 900)
-        (effects (font (size 1.27 1.27)))
-      )
-      (text "test text with \"quoted\" string" (at 264.795 -33.655 900)
-        (effects (font (size 1.27 1.27) italic))
-      )
-      (text "test text with \"quoted\" string" (at 267.335 -34.29 900)
-        (effects (font (size 1.27 1.27) bold))
-      )
-      (text "test text with \"quoted\" string" (at 270.51 -34.925 900)
-        (effects (font (size 1.27 1.27) bold italic))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -59.055 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -55.88 0)
-        (effects (font (size 1.27 1.27) bold) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -52.705 0)
-        (effects (font (size 1.27 1.27) italic) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 304.8 -49.53 0)
-        (effects (font (size 1.27 1.27)) (justify bottom))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -41.91 0)
-        (effects (font (size 1.27 1.27) bold italic) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -38.735 0)
-        (effects (font (size 1.27 1.27) bold) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -35.56 0)
-        (effects (font (size 1.27 1.27) italic) (justify top))
-      )
-      (text "test text with \"quoted\" string" (at 305.435 -32.385 0)
-        (effects (font (size 1.27 1.27)) (justify top))
-      )
-      (pin input line (at 13.335 20.955 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_0"
-      (pin input line (at 10.795 31.115 0) (length 2.54)
-        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_1"
-      (rectangle (start -44.45 -71.755) (end -18.415 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -44.45 -41.275) (end -18.415 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -24.13 -208.28) (mid 1.6178 -195.5107) (end 10.795 -168.275)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (arc (start -23.495 -167.005) (mid 2.2528 -154.2357) (end 11.43 -127)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (rectangle (start -16.51 -71.755) (end 9.525 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (rectangle (start -16.51 -41.275) (end 9.525 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -3.81 -210.185) (mid 21.9378 -197.4157) (end 31.115 -170.18)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (arc (start -3.175 -168.91) (mid 22.5728 -156.1407) (end 31.75 -128.905)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 80.645 -208.915)
-          (xy 86.36 -250.19)
-          (xy 113.03 -224.155)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 83.82 -161.29)
-          (xy 89.535 -202.565)
-          (xy 116.205 -176.53)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (polyline
-        (pts
-          (xy 113.03 -206.375)
-          (xy 118.745 -247.65)
-          (xy 145.415 -221.615)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 116.205 -158.75)
-          (xy 121.92 -200.025)
-          (xy 148.59 -173.99)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (polyline
-        (pts
-          (xy 148.59 -205.105)
-          (xy 154.305 -246.38)
-          (xy 180.975 -220.345)
-        )
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (polyline
-        (pts
-          (xy 151.765 -157.48)
-          (xy 157.48 -198.755)
-          (xy 184.15 -172.72)
-        )
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -71.755) (end 38.1 -42.545)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (rectangle (start 12.065 -41.275) (end 38.1 -12.065)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 17.145 -210.82) (mid 42.8928 -198.0507) (end 52.07 -170.815)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (arc (start 17.78 -169.545) (mid 43.5278 -156.7757) (end 52.705 -129.54)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 66.04 -28.575) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 69.85 -64.135) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type none))
-      )
-      (circle (center 108.585 -29.21) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 112.395 -64.77) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type outline))
-      )
-      (circle (center 146.05 -27.94) (radius 16.7645)
-        (stroke (width 0) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (circle (center 149.86 -63.5) (radius 16.7645)
-        (stroke (width 0.127) (type default) (color 0 0 0 0))
-        (fill (type background))
-      )
-      (text "Unit A, Normal" (at -1.27 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 24.765 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_2"
-      (text "Unit A, DeMorgan" (at 0.635 6.35 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 24.13 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_0"
-      (pin input line (at 13.335 29.845 0) (length 2.54)
-        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_1"
-      (text "Unit B, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -15.24 20.32 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_2"
-      (text "Unit B, DeMorgan" (at -1.905 6.985 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_0"
-      (pin input line (at 15.24 28.575 0) (length 2.54)
-        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_1"
-      (text "Unit C, Normal" (at 0 8.255 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.145 24.765 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 25.4 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_symbolDemorganUnits b/tests/testdata/symbol/test_symbolDemorganUnits
deleted file mode 100644
index 6c104ac..0000000
--- a/tests/testdata/symbol/test_symbolDemorganUnits
+++ /dev/null
@@ -1,109 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
-    (property "Reference" "U" (id 0) (at 0 9.525 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -12.7 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -14.605 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_locked" "" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (symbol "AD1853_0_0"
-      (text "NormalStuff" (at 0 19.05 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at 13.335 13.97 0) (length 2.54)
-        (name "NormalPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_0"
-      (pin input line (at 10.795 24.13 0) (length 2.54)
-        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_1"
-      (text "Unit A, Normal" (at -1.27 0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 17.78 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_1_2"
-      (text "Unit A, DeMorgan" (at 0.635 -0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 17.145 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_0"
-      (pin input line (at 13.335 22.86 0) (length 2.54)
-        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_1"
-      (text "Unit B, Normal" (at 0 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -15.24 13.335 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_2_2"
-      (text "Unit B, DeMorgan" (at -1.905 0 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 18.415 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_0"
-      (pin input line (at 15.24 21.59 0) (length 2.54)
-        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
-        (number "123" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_1"
-      (text "Unit C, Normal" (at 0 1.27 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.145 17.78 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-    (symbol "AD1853_3_2"
-      (text "Unit C, DeMorgan" (at -0.635 0.635 0)
-        (effects (font (size 1.27 1.27)))
-      )
-      (pin input line (at -17.78 18.415 0) (length 2.54)
-        (name "MCLK" (effects (font (size 1.27 1.27))))
-        (number "2" (effects (font (size 1.27 1.27))))
-      )
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_symbolIdParser b/tests/testdata/symbol/test_symbolIdParser
deleted file mode 100644
index ac1d554..0000000
--- a/tests/testdata/symbol/test_symbolIdParser
+++ /dev/null
@@ -1,14 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kiutils)
-  (symbol "AD2023"
-    (symbol "AD2023_0_0"
-    )
-  )
-  (symbol "formula:R_0_2512"
-    (symbol "R_0_2512_0_0"
-    )
-  )
-  (symbol "Some_Library:R_0_2512"
-    (symbol "R_0_2512_0_0"
-    )
-  )
-)
diff --git a/tests/testdata/symbol/test_symbolParameters b/tests/testdata/symbol/test_symbolParameters
deleted file mode 100644
index f9fe42e..0000000
--- a/tests/testdata/symbol/test_symbolParameters
+++ /dev/null
@@ -1,52 +0,0 @@
-(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
-  (symbol "test" (power) (pin_names (offset 0.5334)) (in_bom no) (on_board no)
-    (property "Reference" "U" (id 0) (at 0 1.905 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Value" "test" (id 1) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "Footprint" "" (id 2) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "Datasheet" "this test with \"quoted\" string" (id 3) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "p1" "property with \"quoted\" string" (id 4) (at 0 0 0)
-      (effects (font (size 1.27 1.27)))
-    )
-    (property "1" "2" (id 5) (at 0 0 0)
-      (effects (font (size 1.2954 1.2954) italic) (justify left top))
-    )
-    (property "2" "2" (id 6) (at 0 0 0)
-      (effects (font (size 1.3208 1.3208) bold) (justify left))
-    )
-    (property "3" "3" (id 7) (at 0 0 0)
-      (effects (font (size 1.3462 1.3462) bold italic) (justify left bottom))
-    )
-    (property "4" "4" (id 8) (at 0 0 0)
-      (effects (font (size 1.3716 1.3716) italic) (justify top))
-    )
-    (property "5" "5" (id 9) (at 0 0 0)
-      (effects (font (size 1.397 1.397) bold))
-    )
-    (property "6" "6" (id 10) (at 0 0 0)
-      (effects (font (size 1.4224 1.4224) bold italic) (justify bottom))
-    )
-    (property "7" "7" (id 11) (at 0 0 0)
-      (effects (font (size 1.4478 1.4478) italic) (justify right top))
-    )
-    (property "8" "8" (id 12) (at 0 0 0)
-      (effects (font (size 1.4732 1.4732) bold) (justify right))
-    )
-    (property "9" "9" (id 13) (at 0 0 0)
-      (effects (font (size 1.4986 1.4986) bold italic) (justify right bottom))
-    )
-    (property "ki_keywords" "test with \"quoted\" string" (id 14) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-    (property "ki_description" "test with \"quoted\" string" (id 15) (at 0 0 0)
-      (effects (font (size 1.27 1.27)) hide)
-    )
-  )
-)
diff --git a/tests/testdata/worksheets/test_allWorkSheetItems b/tests/testdata/worksheets/test_allWorkSheetItems
deleted file mode 100644
index dc589a9..0000000
--- a/tests/testdata/worksheets/test_allWorkSheetItems
+++ /dev/null
@@ -1,2104 +0,0 @@
-(kicad_wks (version 20210606) (generator pl_editor)
-  (setup (textsize 1.5 1.5)(linewidth 0.15)(textlinewidth 0.15)
-  (left_margin 10)(right_margin 10)(top_margin 10)(bottom_margin 10))
-  (rect (name "") (start 110 34) (end 2 2) (comment "rect around the title block")
-)
-  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
-  (line (name "") (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50))
-  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
-  (line (name "") (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50))
-  (tbtext "1" (name "") (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
-  (line (name "") (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50))
-  (tbtext "A" (name "") (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
-  (line (name "") (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50))
-  (tbtext "A" (name "") (pos 1 25 rtcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
-  (tbtext "Date: ${ISSUE_DATE}" (name "") (pos 87 6.9))
-  (line (name "") (start 110 5.5) (end 2 5.5))
-  (tbtext "${KICAD_VERSION}" (name "") (pos 109 4.1) (comment "Kicad version")
-)
-  (line (name "") (start 110 8.5) (end 2 8.5))
-  (tbtext "Rev: ${REVISION}" (name "") (pos 24 6.9) (font bold))
-  (tbtext "Size: ${PAPER}" (name "") (pos 109 6.9) (comment "Paper format name")
-)
-  (tbtext "Id: ${#}/${##}" (name "") (pos 24 4.1) (comment "Sheet id")
-)
-  (line (name "") (start 110 12.5) (end 2 12.5))
-  (tbtext "Title: ${TITLE}" (name "") (pos 109 10.7) (font (size 2 2) bold italic))
-  (tbtext "File: ${FILENAME}" (name "") (pos 109 14.3))
-  (line (name "") (start 110 18.5) (end 2 18.5))
-  (tbtext "Sheet: ${SHEETNAME}" (name "") (pos 109 17))
-  (tbtext "${COMPANY}" (name "") (pos 109 20) (font bold) (comment "Company name")
-)
-  (tbtext "${COMMENT1}" (name "") (pos 109 23) (comment "Comment 0")
-)
-  (tbtext "${COMMENT2}" (name "") (pos 109 26) (comment "Comment 1")
-)
-  (tbtext "${COMMENT3}" (name "") (pos 109 29) (comment "Comment 2")
-)
-  (tbtext "${COMMENT4}" (name "") (pos 109 32) (comment "Comment 3")
-)
-  (line (name "") (start 90 8.5) (end 90 5.5))
-  (line (name "") (start 26 8.5) (end 26 2))
-  (rect (name "") (start 392.189 267.402) (end 356.889 261.302) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
-  (line (name "") (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50))
-  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
-  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
-  (tbtext "A" (name "") (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
-  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
-  (rect (name "") (start 390.939 45.702 rtcorner) (end 355.639 39.602 rtcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 54.389 66.2 ltcorner) (end 19.089 60.1 ltcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 53.5 205.9002 lbcorner) (end 18.2 199.8002 lbcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 332.539 45.152 rtcorner) (end 297.239 39.052 rtcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 112.789 65.65 ltcorner) (end 77.489 59.55 ltcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 111.9 206.45 lbcorner) (end 76.6 200.35 lbcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 333.789 267.952) (end 298.489 261.852) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 276.639 267.952) (end 241.339 261.852) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 169.05 206.45 lbcorner) (end 133.75 200.35 lbcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 275.389 45.152 rtcorner) (end 240.089 39.052 rtcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (rect (name "") (start 169.939 65.65 ltcorner) (end 134.639 59.55 ltcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
-)
-  (line (name "") (start 390.939 172.702) (end 352.839 172.702) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 390.939 134.602 rtcorner) (end 352.839 134.602 rtcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 54.389 153.652 ltcorner) (end 16.289 153.652 ltcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 54.389 115.5522 lbcorner) (end 16.289 115.5522 lbcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 111.539 115.552 lbcorner) (end 73.439 115.552 lbcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 333.789 134.602 rtcorner) (end 295.689 134.602 rtcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 333.789 172.702) (end 295.689 172.702) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 111.539 153.652 ltcorner) (end 73.439 153.652 ltcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 276.639 134.602 rtcorner) (end 238.539 134.602 rtcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 168.689 115.552 lbcorner) (end 130.589 115.552 lbcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 168.689 153.652 ltcorner) (end 130.589 153.652 ltcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (line (name "") (start 276.639 172.702) (end 238.539 172.702) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 83.8022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 77.4522) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 90.1522) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 71.1022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 83.8022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 77.4522) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 90.1522) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 71.1022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 20.302) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 7.602) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 20.302) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 321.089 26.652) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 26.652) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 251.239 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 289.339 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 270.289 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 390.939 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 340.139 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 352.839 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 371.889 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (tbtext "Test \"text\"" (name "") (pos 302.039 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
-)
-  (bitmap (name "") (pos 54.389 236.202) (scale 1) (repeat 2) (incrx -10) (incry -10)
-  (pngdata
-    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
-    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
-    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
-    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
-    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
-    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
-    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
-    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
-    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
-    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
-    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
-    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
-    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
-    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
-    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
-    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
-    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
-    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
-    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
-    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
-    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
-    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
-    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
-    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
-    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
-    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
-    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
-    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
-    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
-    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
-    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
-    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
-    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
-    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
-    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
-    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
-    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
-    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
-    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
-    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
-    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
-    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
-    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
-    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
-    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
-    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
-    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
-    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
-    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
-    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
-    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
-    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
-    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
-    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
-    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
-    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
-    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
-    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
-    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
-    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
-    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
-    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
-    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
-    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
-    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
-    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
-    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
-    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
-    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
-    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
-    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
-    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
-    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
-    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
-    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
-    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
-    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
-    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
-    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
-    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
-    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
-    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
-    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
-    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
-    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
-    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
-    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
-    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
-    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
-    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
-    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
-    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
-    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
-    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
-    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
-    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
-    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
-    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
-    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
-    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
-    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
-    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
-    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
-    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
-    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
-    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
-    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
-    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
-    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
-    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
-    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
-    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
-    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
-    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
-    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
-    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
-    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
-    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
-    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
-    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
-    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
-    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
-    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
-    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
-    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
-    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
-    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
-    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
-    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
-    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
-    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
-    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
-    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
-    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
-    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
-    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
-    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
-    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
-    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
-    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
-    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
-    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
-    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
-    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
-    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
-    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
-    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
-    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
-    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
-    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
-    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
-    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
-    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
-    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
-    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
-    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
-    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
-    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
-    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
-    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
-    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
-    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
-    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
-    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
-    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
-    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
-    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
-    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
-    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
-    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
-    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
-    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
-    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
-    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
-    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
-    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
-    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
-    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
-    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
-    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
-    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
-    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
-    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
-    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
-    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
-    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
-    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
-    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
-    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
-    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
-    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
-    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
-    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
-    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
-    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
-    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
-    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
-    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
-    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
-    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
-    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
-    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
-    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
-    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
-    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
-    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
-    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
-    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
-    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
-    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
-    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
-    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
-    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
-    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
-    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
-    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
-    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
-    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
-    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
-    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
-    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
-    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
-    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
-    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
-    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
-    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
-    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
-    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
-    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
-    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
-    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
-    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
-    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
-    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
-    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
-    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
-    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
-    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
-    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
-    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
-    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
-    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
-    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
-    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
-    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
-    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
-    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
-    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
-    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
-    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
-    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
-    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
-    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
-    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
-    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
-    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
-    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
-    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
-    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
-    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
-    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
-    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
-    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
-    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
-    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
-    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
-    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
-    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
-    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
-    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
-    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
-    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
-    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
-    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
-    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
-    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
-    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
-    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
-    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
-    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
-    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
-    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
-    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
-    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
-    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
-    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
-    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
-    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
-    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
-    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
-    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
-    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
-    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
-    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
-    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
-    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
-    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
-    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
-    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
-    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
-    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
-    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
-    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
-    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
-    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
-    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
-    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
-    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
-    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
-    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
-    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
-    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
-    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
-    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
-    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
-    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
-    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
-    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
-    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
-    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
-    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
-    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
-    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
-    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
-    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
-    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
-    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
-    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
-    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
-    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
-    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
-    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
-    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
-    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
-    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
-    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
-    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
-    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
-    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
-    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
-    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
-    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
-    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
-    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
-    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
-    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
-    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
-    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
-    (data "00 00 49 45 4E 44 AE 42 60 82 ")
-    )
-  )
-  (bitmap (name "") (pos 28.989 52.052 rtcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
-  (pngdata
-    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
-    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
-    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
-    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
-    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
-    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
-    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
-    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
-    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
-    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
-    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
-    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
-    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
-    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
-    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
-    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
-    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
-    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
-    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
-    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
-    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
-    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
-    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
-    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
-    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
-    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
-    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
-    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
-    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
-    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
-    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
-    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
-    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
-    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
-    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
-    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
-    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
-    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
-    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
-    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
-    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
-    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
-    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
-    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
-    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
-    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
-    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
-    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
-    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
-    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
-    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
-    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
-    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
-    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
-    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
-    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
-    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
-    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
-    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
-    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
-    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
-    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
-    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
-    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
-    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
-    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
-    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
-    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
-    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
-    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
-    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
-    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
-    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
-    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
-    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
-    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
-    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
-    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
-    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
-    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
-    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
-    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
-    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
-    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
-    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
-    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
-    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
-    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
-    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
-    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
-    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
-    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
-    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
-    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
-    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
-    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
-    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
-    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
-    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
-    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
-    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
-    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
-    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
-    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
-    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
-    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
-    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
-    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
-    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
-    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
-    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
-    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
-    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
-    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
-    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
-    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
-    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
-    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
-    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
-    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
-    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
-    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
-    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
-    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
-    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
-    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
-    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
-    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
-    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
-    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
-    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
-    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
-    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
-    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
-    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
-    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
-    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
-    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
-    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
-    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
-    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
-    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
-    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
-    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
-    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
-    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
-    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
-    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
-    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
-    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
-    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
-    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
-    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
-    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
-    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
-    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
-    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
-    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
-    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
-    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
-    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
-    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
-    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
-    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
-    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
-    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
-    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
-    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
-    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
-    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
-    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
-    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
-    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
-    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
-    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
-    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
-    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
-    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
-    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
-    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
-    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
-    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
-    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
-    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
-    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
-    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
-    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
-    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
-    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
-    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
-    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
-    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
-    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
-    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
-    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
-    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
-    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
-    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
-    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
-    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
-    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
-    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
-    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
-    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
-    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
-    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
-    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
-    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
-    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
-    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
-    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
-    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
-    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
-    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
-    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
-    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
-    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
-    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
-    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
-    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
-    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
-    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
-    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
-    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
-    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
-    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
-    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
-    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
-    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
-    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
-    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
-    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
-    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
-    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
-    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
-    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
-    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
-    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
-    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
-    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
-    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
-    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
-    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
-    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
-    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
-    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
-    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
-    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
-    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
-    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
-    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
-    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
-    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
-    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
-    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
-    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
-    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
-    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
-    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
-    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
-    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
-    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
-    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
-    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
-    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
-    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
-    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
-    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
-    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
-    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
-    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
-    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
-    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
-    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
-    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
-    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
-    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
-    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
-    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
-    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
-    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
-    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
-    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
-    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
-    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
-    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
-    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
-    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
-    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
-    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
-    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
-    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
-    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
-    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
-    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
-    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
-    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
-    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
-    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
-    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
-    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
-    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
-    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
-    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
-    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
-    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
-    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
-    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
-    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
-    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
-    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
-    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
-    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
-    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
-    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
-    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
-    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
-    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
-    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
-    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
-    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
-    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
-    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
-    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
-    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
-    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
-    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
-    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
-    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
-    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
-    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
-    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
-    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
-    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
-    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
-    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
-    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
-    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
-    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
-    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
-    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
-    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
-    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
-    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
-    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
-    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
-    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
-    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
-    (data "00 00 49 45 4E 44 AE 42 60 82 ")
-    )
-  )
-  (bitmap (name "") (pos 352.839 121.902 ltcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
-  (pngdata
-    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
-    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
-    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
-    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
-    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
-    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
-    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
-    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
-    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
-    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
-    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
-    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
-    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
-    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
-    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
-    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
-    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
-    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
-    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
-    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
-    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
-    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
-    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
-    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
-    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
-    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
-    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
-    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
-    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
-    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
-    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
-    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
-    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
-    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
-    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
-    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
-    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
-    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
-    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
-    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
-    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
-    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
-    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
-    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
-    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
-    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
-    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
-    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
-    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
-    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
-    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
-    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
-    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
-    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
-    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
-    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
-    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
-    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
-    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
-    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
-    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
-    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
-    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
-    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
-    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
-    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
-    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
-    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
-    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
-    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
-    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
-    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
-    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
-    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
-    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
-    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
-    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
-    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
-    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
-    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
-    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
-    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
-    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
-    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
-    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
-    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
-    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
-    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
-    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
-    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
-    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
-    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
-    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
-    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
-    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
-    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
-    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
-    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
-    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
-    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
-    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
-    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
-    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
-    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
-    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
-    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
-    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
-    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
-    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
-    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
-    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
-    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
-    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
-    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
-    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
-    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
-    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
-    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
-    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
-    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
-    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
-    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
-    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
-    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
-    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
-    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
-    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
-    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
-    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
-    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
-    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
-    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
-    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
-    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
-    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
-    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
-    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
-    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
-    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
-    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
-    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
-    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
-    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
-    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
-    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
-    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
-    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
-    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
-    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
-    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
-    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
-    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
-    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
-    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
-    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
-    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
-    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
-    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
-    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
-    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
-    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
-    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
-    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
-    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
-    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
-    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
-    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
-    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
-    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
-    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
-    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
-    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
-    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
-    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
-    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
-    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
-    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
-    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
-    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
-    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
-    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
-    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
-    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
-    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
-    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
-    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
-    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
-    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
-    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
-    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
-    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
-    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
-    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
-    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
-    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
-    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
-    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
-    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
-    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
-    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
-    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
-    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
-    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
-    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
-    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
-    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
-    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
-    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
-    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
-    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
-    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
-    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
-    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
-    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
-    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
-    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
-    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
-    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
-    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
-    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
-    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
-    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
-    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
-    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
-    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
-    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
-    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
-    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
-    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
-    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
-    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
-    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
-    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
-    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
-    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
-    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
-    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
-    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
-    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
-    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
-    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
-    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
-    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
-    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
-    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
-    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
-    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
-    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
-    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
-    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
-    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
-    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
-    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
-    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
-    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
-    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
-    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
-    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
-    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
-    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
-    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
-    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
-    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
-    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
-    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
-    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
-    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
-    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
-    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
-    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
-    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
-    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
-    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
-    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
-    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
-    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
-    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
-    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
-    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
-    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
-    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
-    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
-    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
-    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
-    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
-    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
-    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
-    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
-    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
-    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
-    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
-    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
-    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
-    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
-    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
-    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
-    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
-    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
-    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
-    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
-    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
-    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
-    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
-    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
-    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
-    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
-    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
-    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
-    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
-    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
-    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
-    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
-    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
-    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
-    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
-    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
-    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
-    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
-    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
-    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
-    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
-    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
-    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
-    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
-    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
-    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
-    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
-    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
-    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
-    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
-    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
-    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
-    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
-    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
-    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
-    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
-    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
-    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
-    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
-    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
-    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
-    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
-    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
-    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
-    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
-    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
-    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
-    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
-    (data "00 00 49 45 4E 44 AE 42 60 82 ")
-    )
-  )
-  (bitmap (name "") (pos 378.239 121.902 ltcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
-  (pngdata
-    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
-    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
-    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
-    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
-    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
-    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
-    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
-    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
-    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
-    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
-    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
-    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
-    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
-    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
-    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
-    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
-    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
-    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
-    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
-    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
-    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
-    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
-    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
-    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
-    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
-    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
-    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
-    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
-    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
-    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
-    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
-    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
-    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
-    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
-    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
-    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
-    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
-    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
-    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
-    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
-    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
-    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
-    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
-    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
-    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
-    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
-    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
-    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
-    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
-    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
-    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
-    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
-    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
-    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
-    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
-    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
-    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
-    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
-    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
-    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
-    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
-    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
-    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
-    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
-    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
-    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
-    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
-    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
-    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
-    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
-    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
-    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
-    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
-    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
-    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
-    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
-    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
-    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
-    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
-    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
-    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
-    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
-    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
-    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
-    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
-    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
-    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
-    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
-    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
-    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
-    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
-    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
-    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
-    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
-    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
-    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
-    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
-    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
-    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
-    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
-    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
-    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
-    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
-    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
-    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
-    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
-    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
-    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
-    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
-    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
-    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
-    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
-    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
-    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
-    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
-    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
-    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
-    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
-    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
-    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
-    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
-    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
-    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
-    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
-    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
-    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
-    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
-    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
-    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
-    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
-    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
-    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
-    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
-    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
-    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
-    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
-    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
-    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
-    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
-    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
-    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
-    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
-    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
-    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
-    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
-    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
-    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
-    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
-    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
-    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
-    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
-    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
-    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
-    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
-    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
-    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
-    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
-    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
-    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
-    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
-    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
-    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
-    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
-    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
-    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
-    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
-    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
-    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
-    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
-    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
-    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
-    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
-    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
-    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
-    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
-    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
-    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
-    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
-    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
-    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
-    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
-    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
-    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
-    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
-    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
-    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
-    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
-    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
-    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
-    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
-    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
-    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
-    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
-    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
-    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
-    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
-    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
-    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
-    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
-    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
-    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
-    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
-    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
-    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
-    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
-    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
-    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
-    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
-    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
-    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
-    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
-    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
-    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
-    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
-    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
-    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
-    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
-    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
-    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
-    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
-    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
-    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
-    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
-    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
-    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
-    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
-    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
-    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
-    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
-    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
-    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
-    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
-    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
-    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
-    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
-    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
-    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
-    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
-    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
-    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
-    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
-    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
-    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
-    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
-    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
-    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
-    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
-    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
-    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
-    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
-    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
-    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
-    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
-    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
-    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
-    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
-    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
-    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
-    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
-    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
-    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
-    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
-    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
-    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
-    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
-    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
-    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
-    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
-    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
-    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
-    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
-    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
-    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
-    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
-    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
-    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
-    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
-    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
-    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
-    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
-    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
-    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
-    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
-    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
-    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
-    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
-    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
-    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
-    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
-    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
-    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
-    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
-    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
-    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
-    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
-    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
-    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
-    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
-    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
-    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
-    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
-    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
-    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
-    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
-    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
-    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
-    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
-    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
-    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
-    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
-    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
-    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
-    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
-    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
-    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
-    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
-    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
-    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
-    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
-    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
-    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
-    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
-    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
-    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
-    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
-    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
-    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
-    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
-    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
-    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
-    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
-    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
-    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
-    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
-    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
-    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
-    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
-    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
-    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
-    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
-    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
-    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
-    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
-    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
-    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
-    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
-    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
-    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
-    (data "00 00 49 45 4E 44 AE 42 60 82 ")
-    )
-  )
-  (rect (name "") (start 105.189 102.8522) (end 54.389 90.1522))
-  (line (name "") (start 105.189 71.1022) (end 54.389 71.1022))
-  (tbtext "Standard text" (name "") (pos 105.189 58.402))
-  (tbtext "Text" (name "") (pos 0 0))
-  (bitmap (name "") (pos 35.339 83.8022) (scale 1)
-  (pngdata
-    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
-    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
-    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
-    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
-    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
-    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
-    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
-    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
-    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
-    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
-    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
-    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
-    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
-    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
-    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
-    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
-    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
-    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
-    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
-    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
-    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
-    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
-    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
-    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
-    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
-    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
-    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
-    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
-    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
-    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
-    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
-    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
-    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
-    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
-    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
-    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
-    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
-    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
-    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
-    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
-    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
-    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
-    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
-    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
-    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
-    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
-    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
-    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
-    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
-    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
-    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
-    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
-    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
-    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
-    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
-    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
-    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
-    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
-    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
-    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
-    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
-    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
-    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
-    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
-    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
-    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
-    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
-    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
-    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
-    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
-    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
-    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
-    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
-    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
-    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
-    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
-    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
-    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
-    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
-    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
-    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
-    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
-    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
-    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
-    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
-    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
-    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
-    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
-    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
-    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
-    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
-    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
-    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
-    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
-    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
-    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
-    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
-    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
-    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
-    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
-    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
-    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
-    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
-    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
-    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
-    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
-    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
-    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
-    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
-    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
-    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
-    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
-    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
-    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
-    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
-    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
-    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
-    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
-    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
-    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
-    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
-    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
-    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
-    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
-    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
-    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
-    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
-    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
-    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
-    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
-    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
-    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
-    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
-    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
-    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
-    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
-    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
-    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
-    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
-    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
-    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
-    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
-    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
-    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
-    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
-    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
-    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
-    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
-    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
-    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
-    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
-    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
-    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
-    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
-    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
-    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
-    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
-    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
-    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
-    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
-    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
-    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
-    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
-    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
-    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
-    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
-    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
-    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
-    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
-    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
-    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
-    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
-    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
-    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
-    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
-    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
-    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
-    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
-    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
-    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
-    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
-    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
-    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
-    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
-    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
-    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
-    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
-    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
-    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
-    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
-    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
-    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
-    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
-    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
-    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
-    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
-    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
-    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
-    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
-    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
-    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
-    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
-    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
-    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
-    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
-    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
-    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
-    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
-    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
-    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
-    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
-    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
-    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
-    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
-    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
-    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
-    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
-    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
-    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
-    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
-    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
-    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
-    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
-    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
-    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
-    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
-    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
-    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
-    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
-    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
-    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
-    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
-    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
-    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
-    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
-    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
-    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
-    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
-    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
-    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
-    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
-    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
-    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
-    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
-    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
-    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
-    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
-    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
-    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
-    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
-    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
-    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
-    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
-    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
-    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
-    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
-    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
-    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
-    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
-    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
-    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
-    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
-    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
-    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
-    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
-    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
-    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
-    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
-    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
-    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
-    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
-    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
-    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
-    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
-    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
-    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
-    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
-    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
-    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
-    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
-    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
-    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
-    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
-    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
-    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
-    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
-    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
-    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
-    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
-    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
-    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
-    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
-    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
-    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
-    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
-    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
-    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
-    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
-    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
-    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
-    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
-    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
-    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
-    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
-    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
-    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
-    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
-    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
-    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
-    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
-    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
-    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
-    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
-    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
-    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
-    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
-    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
-    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
-    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
-    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
-    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
-    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
-    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
-    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
-    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
-    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
-    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
-    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
-    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
-    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
-    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
-    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
-    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
-    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
-    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
-    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
-    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
-    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
-    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
-    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
-    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
-    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
-    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
-    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
-    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
-    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
-    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
-    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
-    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
-    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
-    (data "00 00 49 45 4E 44 AE 42 60 82 ")
-    )
-  )
-  (tbtext "Text justified center-center" (name "") (pos 187.739 115.552) (justify center))
-  (tbtext "Text justified center-top" (name "") (pos 187.739 109.202) (justify center top))
-  (tbtext "Text justified center-bottom" (name "") (pos 187.739 102.852) (justify center bottom))
-)
diff --git a/tests/testdata/worksheets/test_createNewWorksheet b/tests/testdata/worksheets/test_createNewWorksheet
deleted file mode 100644
index 31e6aaa..0000000
--- a/tests/testdata/worksheets/test_createNewWorksheet
+++ /dev/null
@@ -1,4 +0,0 @@
-(kicad_wks (version 20211014) (generator kiutils)
-  (setup (textsize 1.5 1.5)(linewidth 0.15)(textlinewidth 0.15)
-  (left_margin 10.0)(right_margin 10.0)(top_margin 10.0)(bottom_margin 10.0))
-)
diff --git a/tests/testfunctions.py b/tests/testfunctions.py
deleted file mode 100644
index bee3818..0000000
--- a/tests/testfunctions.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""Helper functions for the unittests
-
-Authors:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-"""
-
-from dataclasses import dataclass
-from typing import Optional
-import filecmp
-import os
-
-TEST_BASE = os.path.join('tests', 'testdata')
-
-@dataclass
-class TestData():
-    """Data container to relay testcase-specific information to the report generator. May be added
-    as a member to ``unittest.TestCase`` in the ``setUp()`` function. The object will then be
-    available in ``result._TestInfo()`` classes constructor."""
-    producedOutput: Optional[str] = None
-    expectedOutput: Optional[str] = None
-    ownDescription: Optional[str] = None
-    pathToTestFile: Optional[str] = None
-    compareToTestFile: bool = False
-    wasSuccessful: bool = False
-
-
-def to_file_and_compare(object, test_data: TestData) -> bool:
-    """Write the object to a file using its ``to_file()`` method and comparing the output with
-    the given expected output supplied by a file with ``.expected`` suffix
-
-    Cleans up the test files afterwards, leaving only failing test outputs behind. Test output
-    is furthermore saved to ``test_data.expectedOutput`` and ``test_data.producedOutput`` to be
-    displayed in the HTML test report.
-
-    Args:
-        - object: KiUtils object with a ``to_file()`` method
-        - test_data (TestData): Test data object of the currently running test (contains path to 
-                                test file)
-
-    Returns:
-        - bool: True, if both the output of ``to_file()`` and the given expected output are the same
-    """
-    # Create S-Expression from object
-    if test_data.pathToTestFile is None:
-        raise Exception("pathToTestFile may not be None!")
-
-    object.to_file(f'{test_data.pathToTestFile}.testoutput')
-
-    # Compare with the expected result
-    if test_data.compareToTestFile:
-        compare_file = test_data.pathToTestFile
-    else:
-        compare_file = f'{test_data.pathToTestFile}.expected'
-
-    test_data.wasSuccessful = filecmp.cmp(f'{test_data.pathToTestFile}.testoutput', compare_file)
-    cleanup_after_test(test_data)
-    return test_data.wasSuccessful
-
-def load_contents(file: str) -> str:
-    """Load contents of a specific file and return it as a joined string
-
-    Args:
-        file (str): Path to file
-
-    Returns:
-        str: Contents of file in one string
-    """
-    with open(file, "r") as outfile:
-        return ''.join(outfile.readlines())
-
-def prepare_test(object):
-    """Prepare a unittest test case in the KiUtils framework
-
-    Args:
-        object: Test case class object
-    """
-    object.testData = TestData()
-
-def cleanup_after_test(test_data: TestData):
-    """Cleanup after a unittest test case ran
-
-    Args:
-        test_data (TestData): Test data structure of test case that finished last
-
-    Raises:
-        Exception: When ``test_data.pathToTestFile`` is None
-    """
-    if test_data.pathToTestFile is None:
-        raise Exception("Path to testfile must not be None!")
-    test_data.producedOutput = load_contents(f'{test_data.pathToTestFile}.testoutput')
-    if test_data.compareToTestFile:
-        test_data.expectedOutput = load_contents(f'{test_data.pathToTestFile}')
-    else:
-        test_data.expectedOutput = load_contents(f'{test_data.pathToTestFile}.expected')
-
-    if test_data.wasSuccessful:
-        os.remove(f'{test_data.pathToTestFile}.testoutput')
\ No newline at end of file
diff --git a/utils/sexpr.py b/utils/sexpr.py
new file mode 100644
index 0000000..764fa58
--- /dev/null
+++ b/utils/sexpr.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# code extracted from: http://rosettacode.org/wiki/S-Expressions
+# Originally taken from: https://gitlab.com/kicad/libraries/kicad-library-utils/-/blob/master/common/sexpr.py
+
+import re
+
+dbg = False
+
+term_regex = r'''(?mx)
+    \s*(?:
+        (?P\()|
+        (?P\))|
+        (?P[+-]?\d+\.\d+(?=[\ \)])|\-?\d+(?=[\ \)]))|
+        (?P"(?:[^"]|(?<=\\)")*"(?:(?=\))|(?=\s)))|
+        (?P[^(^)\s]+)
+       )'''
+
+def parse_sexp(sexp):
+    stack = []
+    out = []
+    if dbg: print("%-6s %-14s %-44s %-s" % tuple("term value out stack".split()))
+    for termtypes in re.finditer(term_regex, sexp):
+        term, value = [(t,v) for t,v in termtypes.groupdict().items() if v][0]
+        if dbg: print("%-7s %-14s %-44r %-r" % (term, value, out, stack))
+        if   term == 'brackl':
+            stack.append(out)
+            out = []
+        elif term == 'brackr':
+            assert stack, "Trouble with nesting of brackets"
+            tmpout, out = out, stack.pop(-1)
+            out.append(tmpout)
+        elif term == 'num':
+            v = float(value)
+            if v.is_integer(): v = int(v)
+            out.append(v)
+        elif term == 'sq':
+            out.append(value[1:-1].replace(r'\"', '"'))
+        elif term == 's':
+            out.append(value)
+        else:
+            raise NotImplementedError("Error: %r" % (term, value))
+    assert not stack, "Trouble with nesting of brackets"
+    return out[0]
\ No newline at end of file
diff --git a/utils/strings.py b/utils/strings.py
new file mode 100644
index 0000000..e2e97a7
--- /dev/null
+++ b/utils/strings.py
@@ -0,0 +1,36 @@
+"""Functions for string manipulation
+
+Author:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+
+Major changes:
+    28.02.2022 - created
+"""
+
+def dequote(input: str) -> str:
+    """Escapes double-quotes in a string using a backslash
+
+    Args:
+        - input (str): String to replace double-quotes
+
+    Returns:
+        - str: String with replaced double-quotes
+    """
+    return str(input).replace("\"", "\\\"")
+
+
+def remove_prefix(input: str, prefix: str) -> str:
+    """Removes the given prefix from a string (to remove incompatibility of ``str.removeprefix()``
+    for Python versions < 3.9)
+
+    Args:
+        - input (str): String to remove the prefix from
+        - prefix (str): The prefix
+
+    Returns:
+        - str: String with removed prefix, or the ``input`` string as is, if the prefix was not found
+    """
+    return input[len(prefix):] if input.startswith(prefix) else input
\ No newline at end of file
diff --git a/wks.py b/wks.py
new file mode 100644
index 0000000..d19ea61
--- /dev/null
+++ b/wks.py
@@ -0,0 +1,962 @@
+"""Classes for worksheets (.kicad_wks) and its contents
+
+Author:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+
+Major changes:
+    24.06.2022 - created
+
+Documentation taken from:
+    https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/
+"""
+
+from __future__ import annotations
+
+from dataclasses import dataclass, field
+from typing import Optional, List
+from os import path
+
+from kiutils.items.common import Justify
+from kiutils.utils.strings import dequote
+from kiutils.utils import sexpr
+from kiutils.misc.config import KIUTILS_CREATE_NEW_GENERATOR_STR, KIUTILS_CREATE_NEW_VERSION_STR
+
+@dataclass
+class WksFontSize():
+    """The ``WksFontSize`` token defines the size of a font in a worksheet"""
+
+    width: float = 1.0
+    """The ``width`` token defines the width of the font. Defaults to 1."""
+
+    height: float = 1.0
+    """The ``height`` token defines the height of the font. Defaults to 1."""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> WksFontSize:
+        """Convert the given S-Expresstion into a WksFontSize object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(size ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list or its length is not equal to 3
+            - Exception: When the first item of the list is not ``size``
+
+        Returns:
+            - WksFontSize: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list) or len(exp) != 3:
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'size':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        object.width = exp[1]
+        object.height = exp[2]
+        return object
+
+    def to_sexpr(self, indent=0, newline=False):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
+            - newline (bool): Adds a newline to the end of the output. Defaults to False.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+        return f'{indents}(size {self.width} {self.height}){endline}'
+
+@dataclass
+class WksFont():
+    """The ``WksFont`` token defines how a text is drawn"""
+
+    linewidth: Optional[float] = None
+    """The optional ``linewidth`` token defines the width of the font's lines"""
+
+    size: Optional[WksFontSize] = None
+    """The optional ``size`` token defines the size of the font"""
+
+    bold: bool = False
+    """The ``bold`` token defines if the font is drawn bold. Defaults to False."""
+
+    italic: bool = False
+    """The ``italic`` token defines if the font is drawn italic. Defaults to False."""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> WksFont:
+        """Convert the given S-Expresstion into a WksFont object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(font ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``font``
+
+        Returns:
+            - WksFont: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'font':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp:
+            if type(item) != type([]):
+                if item == 'bold': object.bold = True
+                if item == 'italic': object.italic = True
+                continue
+            if item[0] == 'linewidth': object.linewidth = item[1]
+            if item[0] == 'size': object.size = WksFontSize().from_sexpr(item)
+        return object
+
+    def to_sexpr(self, indent=0, newline=False):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
+            - newline (bool): Adds a newline to the end of the output. Defaults to False.
+
+        Returns:
+            - str: S-Expression of this object. Will return an empty string, if all members of this
+                   class are set to ``None``.
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        lw = f' (linewidth {self.linewidth})' if self.linewidth is not None else ''
+        size = f' {self.size.to_sexpr()}' if self.size is not None else ''
+        bold = f' bold' if self.bold else ''
+        italic = f' italic' if self.italic else ''
+
+        if lw == '' and size == '' and bold == '' and italic == '':
+            return ''
+        else:
+            return f'{indents}(font{lw}{size}{bold}{italic}){endline}'
+
+@dataclass
+class WksPosition():
+    """The ``WksPosition`` token defines the positional coordinates and rotation of an worksheet
+    object.
+    """
+
+    X: float = 0.0
+    """The ``X`` attribute defines the horizontal position of the object. Defaults to 0."""
+
+    Y: float = 0.0
+    """The ``Y`` attribute defines the vertical position of the object. Defaults to 0."""
+
+    corner: Optional[str] = None
+    """The optional ``corner`` token is used to define the initial corner for repeating"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> WksPosition:
+        """Convert the given S-Expresstion into a WksPosition object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(xxx ...)``
+
+        Raises:
+            - Exception: When the given expression is not of type ``list`` or the list is less than
+                         3 items long
+
+        Returns:
+            - WksPosition: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list) or len(exp) < 3:
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        object.X = exp[1]
+        object.Y = exp[2]
+
+        # The last parameter refers to the corner token, if any is present
+        if len(exp) > 3:
+            object.corner = exp[3]
+
+        return object
+
+    def to_sexpr(self) -> str:
+        """This object does not have a direct S-Expression representation."""
+        raise NotImplementedError("This object does not have a direct S-Expression representation")
+
+@dataclass
+class Line():
+    """The ``Line`` token defines how a line is drawn in a work sheet
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_line"""
+
+    name: str = ""
+    """The ``name`` token defines the name of the line object"""
+
+    start: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``start`` token defines the start position of the line"""
+
+    end: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``end`` token defines the end position of the line"""
+
+    option: Optional[str] = None
+    """The optional ``option`` token defines on which pages the line shall be shown. Possible values
+    are:
+    - None: Item will be shown on all pages
+    - `notonpage1`: On all pages except page 1
+    - `page1only`: Only visible on page 1"""
+
+    lineWidth: Optional[float] = None
+    """The optional ``lineWidth`` token attribute defines the width of the rectangle lines"""
+
+    repeat: Optional[int] = None
+    """The optional ``repeat`` token defines the count for repeated incremental lines"""
+
+    incrx: Optional[float] = None
+    """The optional ``incrx`` token defines the repeat distance on the X axis"""
+
+    incry: Optional[float] = None
+    """The optional ``incry`` token defines the repeat distance on the Y axis"""
+
+    comment: Optional[str] = None
+    """The optional ``comment`` token is a comment for the line object"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> Line:
+        """Convert the given S-Expresstion into a Line object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(line ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``tbtext``
+
+        Returns:
+            - Line: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'line':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp[1:]:
+            if item[0] == 'name': object.name = item[1]
+            if item[0] == 'start': object.start = WksPosition().from_sexpr(item)
+            if item[0] == 'end': object.end = WksPosition().from_sexpr(item)
+            if item[0] == 'option': object.option = item[1]
+            if item[0] == 'linewidth': object.lineWidth = item[1]
+            if item[0] == 'repeat': object.repeat = item[1]
+            if item[0] == 'incrx': object.incrx = item[1]
+            if item[0] == 'incry': object.incry = item[1]
+            if item[0] == 'comment': object.comment = item[1]
+        return object
+
+    def to_sexpr(self, indent=2, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        start_corner = f' {self.start.corner}' if self.start.corner is not None else ''
+        end_corner = f' {self.end.corner}' if self.end.corner is not None else ''
+        option = f' (option {self.option})' if self.option is not None else ''
+        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
+        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
+        incry = f' (incry {self.incry})' if self.incry is not None else ''
+        comment = f' (comment "{dequote(self.comment)}")\n' if self.comment is not None else ''
+        lw = f' (linewidth {self.lineWidth})' if self.lineWidth is not None else ''
+
+        expression  = f'{indents}(line (name "{dequote(self.name)}") '
+        expression += f'(start {self.start.X} {self.start.Y}{start_corner}) '
+        expression += f'(end {self.end.X} {self.end.Y}{end_corner})'
+        expression += f'{option}{lw}{repeat}{incrx}{incry}{comment}){endline}'
+        return expression
+
+@dataclass
+class Rect():
+    """The ``Rect`` token defines how a rectangle is drawn in a work sheet
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_rectangle"""
+
+    name: str = ""
+    """The ``name`` token defines the name of the rectangle object"""
+
+    start: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``start`` token defines the start position of the rectangle"""
+
+    end: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``end`` token defines the end position of the rectangle"""
+
+    option: Optional[str] = None
+    """The optional ``option`` token defines on which pages the rectangle shall be shown. Possible values
+    are:
+    - None: Item will be shown on all pages
+    - `notonpage1`: On all pages except page 1
+    - `page1only`: Only visible on page 1"""
+
+    lineWidth: Optional[float] = None
+    """The optional ``lineWidth`` token attribute defines the width of the rectangle lines"""
+
+    repeat: Optional[int] = None
+    """The optional ``repeat`` token defines the count for repeated incremental rectangles"""
+
+    incrx: Optional[float] = None
+    """The optional ``incrx`` token defines the repeat distance on the X axis"""
+
+    incry: Optional[float] = None
+    """The optional ``incry`` token defines the repeat distance on the Y axis"""
+
+    comment: Optional[str] = None
+    """The optional ``comment`` token is a comment for the rectangle object"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> Rect:
+        """Convert the given S-Expresstion into a Rect object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(rect ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``rect``
+
+        Returns:
+            - Rect: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'rect':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp[1:]:
+            if item[0] == 'name': object.name = item[1]
+            if item[0] == 'start': object.start = WksPosition().from_sexpr(item)
+            if item[0] == 'end': object.end = WksPosition().from_sexpr(item)
+            if item[0] == 'option': object.option = item[1]
+            if item[0] == 'linewidth': object.lineWidth = item[1]
+            if item[0] == 'repeat': object.repeat = item[1]
+            if item[0] == 'incrx': object.incrx = item[1]
+            if item[0] == 'incry': object.incry = item[1]
+            if item[0] == 'comment': object.comment = item[1]
+        return object
+
+    def to_sexpr(self, indent=2, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        start_corner = f' {self.start.corner}' if self.start.corner is not None else ''
+        end_corner = f' {self.end.corner}' if self.end.corner is not None else ''
+        option = f' (option {self.option})' if self.option is not None else ''
+        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
+        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
+        incry = f' (incry {self.incry})' if self.incry is not None else ''
+        comment = f' (comment "{dequote(self.comment)}")\n' if self.comment is not None else ''
+        lw = f' (linewidth {self.lineWidth})' if self.lineWidth is not None else ''
+
+        expression  = f'{indents}(rect (name "{dequote(self.name)}") '
+        expression += f'(start {self.start.X} {self.start.Y}{start_corner}) '
+        expression += f'(end {self.end.X} {self.end.Y}{end_corner})'
+        expression += f'{option}{lw}{repeat}{incrx}{incry}{comment}){endline}'
+        return expression
+
+@dataclass
+class Polygon():
+    """The ``Polygon`` token defines a graphical polygon in a worksheet
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_polygon
+    """
+
+    name: str = ""
+    """The ``name`` token defines the name of the polygon"""
+
+    position: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``position`` token defines the coordinates of the polygon"""
+
+    option: Optional[str] = None
+    """The optional ``option`` token defines on which pages the polygon shall be shown. Possible values
+    are:
+    - None: Item will be shown on all pages
+    - `notonpage1`: On all pages except page 1
+    - `page1only`: Only visible on page 1"""
+
+    rotate: Optional[float] = None
+    """The optional ``rotate`` token defines the rotation angle of the polygon object"""
+
+    coordinates: List[WksPosition] = field(default_factory=list)
+    """The ``coordinates`` token defines a list of X/Y coordinates that forms the polygon"""
+
+    repeat: Optional[int] = None
+    """The optional ``repeat`` token defines the count for repeated incremental polygons"""
+
+    incrx: Optional[float] = None
+    """The optional ``incrx`` token defines the repeat distance on the X axis"""
+
+    incry: Optional[float] = None
+    """The optional ``incry`` token defines the repeat distance on the Y axis"""
+
+    comment: Optional[str] = None
+    """The optional ``comment`` token is a comment for the polygon object"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> Polygon:
+        """Convert the given S-Expresstion into a Polygon object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(polygon ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``polygon``
+
+        Returns:
+            - Polygon: Object of the class initialized with the given S-Expression
+        """
+        # TODO: Polygons seem to not be available in the WKS editor GUI. Are those still a feature?
+        raise NotImplementedError("Polygons are not yet handled! Please report this bug along with the file being parsed.")
+
+    def to_sexpr(self, indent=0, newline=False):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
+            - newline (bool): Adds a newline to the end of the output. Defaults to False.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        raise NotImplementedError("Polygons are not yet handled! Please report this bug along with the file being parsed.")
+
+@dataclass
+class Bitmap():
+    """The ``Polygon`` token defines on or more embedded images
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_image
+    """
+
+    name: str = ""
+    """The ``name`` token defines the name of the bitmap"""
+
+    position: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``position`` token defines the coordinates of the bitmap"""
+
+    option: Optional[str] = None
+    """The optional ``option`` token defines on which pages the image shall be shown. Possible values
+    are:
+    - None: Item will be shown on all pages
+    - `notonpage1`: On all pages except page 1
+    - `page1only`: Only visible on page 1"""
+
+    scale: float = 1.0
+    """The ``scale`` token defines the scale of the bitmap object"""
+
+    repeat: Optional[int] = None
+    """The optional ``repeat`` token defines the count for repeated incremental bitmaps"""
+
+    incrx: Optional[float] = None
+    """The optional ``incrx`` token defines the repeat distance on the X axis"""
+
+    incry: Optional[float] = None
+    """The optional ``incry`` token defines the repeat distance on the Y axis"""
+
+    # Comments seem to be buggy as of 25.06.2022 ..
+    comment: Optional[str] = None
+    """The optional ``comment`` token is a comment for the bitmap object"""
+
+    # TODO: Parse this nonesense as a binary struct to make it more useful
+    pngdata: List[str] = field(default_factory=list)
+    """The ``pngdata`` token defines a list of strings representing up to 32 bytes per entry of
+    the image being saved.
+
+    Format:
+    - "xx xx xx xx xx (..) xx "
+
+    The list must be 32byte aligned, leaving a space after the last byte as shown in the format
+    example.
+    """
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> Bitmap:
+        """Convert the given S-Expresstion into a Bitmap object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(bitmap ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``bitmap``
+
+        Returns:
+            - Bitmap: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'bitmap':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp[1:]:
+            if item[0] == 'name': object.name = item[1]
+            if item[0] == 'pos': object.position = WksPosition().from_sexpr(item)
+            if item[0] == 'option': object.option = item[1]
+            if item[0] == 'scale': object.scale = item[1]
+            if item[0] == 'repeat': object.repeat = item[1]
+            if item[0] == 'incrx': object.incrx = item[1]
+            if item[0] == 'incry': object.incry = item[1]
+            if item[0] == 'comment': object.comment = item[1]
+            if item[0] == 'pngdata':
+                if len(item) < 2: continue
+                for data in item[1:]:
+                    if data[0] != 'data': continue
+                    object.pngdata.append(data[1])
+        return object
+
+    def to_sexpr(self, indent=2, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
+        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
+        incry = f' (incry {self.incry})' if self.incry is not None else ''
+        option = f' (option {self.option})' if self.option is not None else ''
+        corner = f' {self.position.corner}' if self.position.corner is not None else ''
+
+        expression  = f'{indents}(bitmap (name "{dequote(self.name)}") '
+        expression += f'(pos {self.position.X} {self.position.Y}{corner}){option} (scale {self.scale})'
+        expression += f'{repeat}{incrx}{incry}\n'
+        if self.comment is not None:
+            # Here KiCad decides to only use 1 space for some unknown reason ..
+            expression += f' (comment "{dequote(self.comment)}")\n'
+        expression += f'{indents}(pngdata\n'
+        for data in self.pngdata:
+            expression += f'{indents}  (data "{data}")\n'
+        expression += f'{indents}  )\n'
+        expression += f'{indents}){endline}'
+        return expression
+
+
+@dataclass
+class TbText():
+    """The ``TbText`` token define text used in the title block of a work sheet
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_title_block_text"""
+
+    text: str = ""
+    """The ``text`` token defines the text itself"""
+
+    name: str = ""
+    """The ``name`` token defines the name of the text object"""
+
+    position: WksPosition = field(default_factory=lambda: WksPosition())
+    """The ``position`` token defines the position of the text"""
+
+    option: Optional[str] = None
+    """The optional ``option`` token defines on which pages the text shall be shown. Possible values
+    are:
+    - None: Item will be shown on all pages
+    - `notonpage1`: On all pages except page 1
+    - `page1only`: Only visible on page 1"""
+
+    rotate: Optional[float] = None
+    """The optional ``rotate`` token defines the rotation of the text in degrees"""
+
+    font: WksFont = field(default_factory=lambda: WksFont())
+    """The ``font`` token define how the text is drawn"""
+
+    justify: Optional[Justify] = None
+    """The optional ``justify`` token defines the justification of the text"""
+
+    maxlen: Optional[float] = None
+    """The optional ``maxlen`` token defines the maximum length of the text"""
+
+    maxheight: Optional[float] = None
+    """The optional ``maxheight`` token defines the maximum height of the text"""
+
+    repeat: Optional[int] = None
+    """The optional ``repeat`` token defines the count for repeated incremental text"""
+
+    incrx: Optional[float] = None
+    """The optional ``incrx`` token defines the repeat distance on the X axis"""
+
+    incry: Optional[float] = None
+    """The optional ``incry`` token defines the repeat distance on the Y axis"""
+
+    incrlabel: Optional[int] = None
+    """The optional ``incrlabel`` token defines the amount of characters that are moved with every
+    repeated incremental text"""
+
+    comment: Optional[str] = None
+    """The optional ``comment`` token is a comment for the text object"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> TbText:
+        """Convert the given S-Expresstion into a TbText object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(tbtext ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``tbtext``
+
+        Returns:
+            - TbText: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'tbtext':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        object.text = exp[1]
+        for item in exp[2:]:
+            if item[0] == 'name': object.name = item[1]
+            if item[0] == 'pos': object.position = WksPosition().from_sexpr(item)
+            if item[0] == 'option': object.option = item[1]
+            if item[0] == 'rotate': object.rotate = item[1]
+            if item[0] == 'font': object.font = WksFont().from_sexpr(item)
+            if item[0] == 'justify': object.justify = Justify().from_sexpr(item)
+            if item[0] == 'maxlen': object.maxlen = item[1]
+            if item[0] == 'maxheight': object.maxheight = item[1]
+            if item[0] == 'repeat': object.repeat = item[1]
+            if item[0] == 'incrx': object.incrx = item[1]
+            if item[0] == 'incry': object.incry = item[1]
+            if item[0] == 'incrlabel': object.incrlabel = item[1]
+            if item[0] == 'comment': object.comment = item[1]
+        return object
+
+    def to_sexpr(self, indent=2, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        corner = f' {self.position.corner}' if self.position.corner is not None else ''
+        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
+        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
+        incry = f' (incry {self.incry})' if self.incry is not None else ''
+        option = f' (option {self.option})' if self.option is not None else ''
+        rotate = f' (rotate {self.rotate})' if self.rotate is not None else ''
+        justify = f' {self.justify.to_sexpr()}' if self.justify is not None else ''
+        maxlen = f' (maxlen {self.maxlen})' if self.maxlen is not None else ''
+        maxheight = f' (maxheight {self.maxheight})' if self.maxheight is not None else ''
+        incrlabel = f' (incrlabel {self.incrlabel})' if self.incrlabel is not None else ''
+        font = f' {self.font.to_sexpr()}' if self.font.to_sexpr() != '' else ''
+
+        expression  = f'{indents}(tbtext "{dequote(self.text)}" (name "{dequote(self.name)}") '
+        expression += f'(pos {self.position.X} {self.position.Y}{corner}){option}{rotate}'
+        expression += f'{font}{justify}{maxlen}{maxheight}{repeat}{incrx}{incry}{incrlabel}'
+        if self.comment is not None:
+            expression += f' (comment "{dequote(self.comment)}")\n'
+        expression += f'){endline}'
+        return expression
+
+
+@dataclass
+class TextSize():
+    """The ``TextSize`` define the default width and height of text"""
+
+    width: float = 1.5
+    """The ``width`` token defines the default width of a text element. Defaults to 1,5."""
+
+    height: float = 1.5
+    """The ``height`` token defines the default height of a text element. Defaults to 1,5."""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> TextSize:
+        """Convert the given S-Expresstion into a TextSize object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(textsize ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list or when its not exactly 3 long
+            - Exception: When the first item of the list is not ``textsize``
+
+        Returns:
+            - TextSize: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list) or len(exp) != 3:
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'textsize':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        object.width = exp[1]
+        object.height = exp[2]
+        return object
+
+    def to_sexpr(self, indent=0, newline=False):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
+            - newline (bool): Adds a newline to the end of the output. Defaults to False.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+        return f'{indents}(textsize {self.width} {self.height}){endline}'
+
+@dataclass
+class Setup():
+    """The ``setup`` token defines the configuration information for the work sheet
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_set_up_section"""
+
+    textSize: TextSize = field(default_factory=lambda: TextSize())
+    """The ``textSize`` token defines the default width and height of text"""
+
+    lineWidth: float = 0.15
+    """The ``lineWidth`` token attribute defines the default width of lines. Defaults to 0,15."""
+
+    textLineWidth: float = 0.15
+    """The ``textLineWidth`` token attribute define the default width of the lines used to draw 
+    text. Defaults to 0,15."""
+
+    leftMargin: float = 10.0
+    """The ``leftMargin`` token defines the distance from the left edge of the page"""
+
+    rightMargin: float = 10.0
+    """The ``rightMargin`` token defines the distance from the right edge of the page"""
+
+    topMargin: float = 10.0
+    """The ``topMargin`` token defines the distance from the top edge of the page"""
+
+    bottomMargin: float = 10.0
+    """The ``bottomMargin`` token defines the distance from the bottom edge of the page"""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> Setup:
+        """Convert the given S-Expresstion into a Setup object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(setup ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``setup``
+
+        Returns:
+            - Setup: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'setup':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp[1:]:
+            if item[0] == 'textsize': object.textSize = TextSize().from_sexpr(item)
+            if item[0] == 'linewidth': object.lineWidth = item[1]
+            if item[0] == 'textlinewidth': object.textLineWidth = item[1]
+            if item[0] == 'left_margin': object.leftMargin = item[1]
+            if item[0] == 'right_margin': object.rightMargin = item[1]
+            if item[0] == 'top_margin': object.topMargin = item[1]
+            if item[0] == 'bottom_margin': object.bottomMargin = item[1]
+        return object
+
+    def to_sexpr(self, indent=2, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        # KiCad puts no spaces between tokens here
+        expression =  f'{indents}(setup {self.textSize.to_sexpr()}(linewidth {self.lineWidth})'
+        expression += f'(textlinewidth {self.textLineWidth})\n{indents}'
+        expression += f'(left_margin {self.leftMargin})(right_margin {self.rightMargin})'
+        expression += f'(top_margin {self.topMargin})(bottom_margin {self.bottomMargin})'
+        expression += f'){endline}'
+
+        return expression
+
+@dataclass
+class WorkSheet():
+    """The ``WorkSheet`` token defines a KiCad worksheet (.kicad_wks file)
+
+    Documentation:
+        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_header_section"""
+
+    version: str = KIUTILS_CREATE_NEW_VERSION_STR
+    """The ``version`` token defines the work sheet version using the YYYYMMDD date format"""
+
+    generator: str = KIUTILS_CREATE_NEW_GENERATOR_STR
+    """The ``generator`` token defines the program used to write the file"""
+
+    setup: Setup = field(default_factory=lambda: Setup())
+    """The ``setup`` token defines the configuration information for the work sheet"""
+
+    drawingObjects: List = field(default_factory=list)
+    """The ``drawingObjects`` token can contain zero or more texts, lines, rectangles, polys or images"""
+
+    filePath: Optional[str] = None
+    """The ``filePath`` token defines the path-like string to the board file. Automatically set when
+    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
+
+    @classmethod
+    def from_sexpr(cls, exp: list) -> WorkSheet:
+        """Convert the given S-Expresstion into a WorkSheet object
+
+        Args:
+            - exp (list): Part of parsed S-Expression ``(kicad_wks ...)``
+
+        Raises:
+            - Exception: When given parameter's type is not a list
+            - Exception: When the first item of the list is not ``kicad_wks``
+
+        Returns:
+            - WorkSheet: Object of the class initialized with the given S-Expression
+        """
+        if not isinstance(exp, list):
+            raise Exception("Expression does not have the correct type")
+
+        if exp[0] != 'kicad_wks':
+            raise Exception("Expression does not have the correct type")
+
+        object = cls()
+        for item in exp[1:]:
+            if item[0] == 'version': object.version = item[1]
+            if item[0] == 'generator': object.generator = item[1]
+            if item[0] == 'setup': object.setup = Setup().from_sexpr(item)
+            if item[0] == 'rect': object.drawingObjects.append(Rect().from_sexpr(item))
+            if item[0] == 'line': object.drawingObjects.append(Line().from_sexpr(item))
+            if item[0] == 'polygon': object.drawingObjects.append(Polygon().from_sexpr(item))
+            if item[0] == 'tbtext': object.drawingObjects.append(TbText().from_sexpr(item))
+            if item[0] == 'bitmap': object.drawingObjects.append(Bitmap().from_sexpr(item))
+        return object
+
+    @classmethod
+    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> WorkSheet:
+        """Load a worksheet directly from a KiCad worksheet file (`.kicad_wks`) and sets the
+        ``self.filePath`` attribute to the given file path.
+
+        Args:
+            - filepath (str): Path or path-like object that points to the file
+            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
+                                        dependent encoding).
+
+        Raises:
+            - Exception: If the given path is not a file
+
+        Returns:
+            - WorkSheet: Object of the WorkSheet class initialized with the given KiCad worksheet
+        """
+        if not path.isfile(filepath):
+            raise Exception("Given path is not a file!")
+
+        with open(filepath, 'r', encoding=encoding) as infile:
+            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
+            item.filePath = filepath
+            return item
+
+    @classmethod
+    def create_new(cls) -> WorkSheet:
+        """Creates a new empty worksheet as KiCad would create it
+
+        Returns:
+            WorkSheet: A empty worksheet
+        """
+        return cls(
+            version = KIUTILS_CREATE_NEW_VERSION_STR,
+            generator = KIUTILS_CREATE_NEW_GENERATOR_STR
+        )
+
+    def to_file(self, filepath = None):
+        """Save the object to a file in S-Expression format
+
+        Args:
+            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
+                                        the attribute ``self.filePath`` will be used instead.
+
+        Raises:
+            - Exception: If no file path is given via the argument or via `self.filePath`
+        """
+        if filepath is None:
+            if self.filePath is None:
+                raise Exception("File path not set")
+            filepath = self.filePath
+
+        with open(filepath, 'w') as outfile:
+            outfile.write(self.to_sexpr())
+
+    def to_sexpr(self, indent=0, newline=True):
+        """Generate the S-Expression representing this object
+
+        Args:
+            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
+            - newline (bool): Adds a newline to the end of the output. Defaults to True.
+
+        Returns:
+            - str: S-Expression of this object
+        """
+        indents = ' '*indent
+        endline = '\n' if newline else ''
+
+        expression =  f'{indents}(kicad_wks (version {self.version}) (generator {self.generator})\n'
+        expression += self.setup.to_sexpr(indent+2)
+        for item in self.drawingObjects:
+            expression += item.to_sexpr(indent+2)
+        expression += f'{indents}){endline}'
+
+        return expression
\ No newline at end of file

From b7d9fece390f67d7889d3d9ec258c528a021f4d1 Mon Sep 17 00:00:00 2001
From: Manoj Chavva 
Date: Fri, 20 Sep 2024 17:21:12 +0530
Subject: [PATCH 2/3] Minor name change of tstamp to uuid for supporting kicad
 8.0 and Updated the GrPoly of GraphicItems in the board to consist the net
 name

---
 CHANGELOG.md                                  |  168 +
 CONTRIBUTING.md                               |   60 +
 LICENSE                                       |  674 +++
 README.md                                     |   50 +
 docs/Makefile                                 |   20 +
 docs/conf.py                                  |   61 +
 docs/index.rst                                |   50 +
 docs/make.bat                                 |   35 +
 docs/misc/known-issues.rst                    |   27 +
 docs/module/kiutils.items.rst                 |   74 +
 docs/module/kiutils.misc.rst                  |   11 +
 docs/module/kiutils.rst                       |   58 +
 docs/module/kiutils.utils.rst                 |   18 +
 docs/usage/development.rst                    |   41 +
 docs/usage/examples.rst                       |  147 +
 docs/usage/getting-started.rst                |   65 +
 docs/usage/installation.rst                   |   12 +
 items/fpitems.py                              |  861 ---
 items/zones.py                                |  657 ---
 kiutils/__init__.py                           |   10 -
 kiutils/board.py                              |  323 --
 kiutils/dru.py                                |  315 -
 kiutils/footprint.py                          | 1098 ----
 kiutils/items/brditems.py                     | 1104 ----
 kiutils/items/common.py                       | 1179 ----
 kiutils/items/dimensions.py                   |  338 --
 kiutils/items/gritems.py                      |  780 ---
 kiutils/items/schitems.py                     | 1919 ------
 kiutils/items/syitems.py                      |  572 --
 libraries.py                                  |  216 -
 misc/config.py                                |   17 -
 pyproject.toml                                |    3 +
 requirements_dev.txt                          |    5 +
 schematic.py                                  |  351 --
 setup.cfg                                     |   30 +
 setup.py                                      |   13 +
 __init__.py => src/kiutils/__init__.py        |    0
 board.py => src/kiutils/board.py              |    0
 dru.py => src/kiutils/dru.py                  |    0
 footprint.py => src/kiutils/footprint.py      |    2 +-
 {items => src/kiutils/items}/brditems.py      |    0
 {items => src/kiutils/items}/common.py        |    0
 {items => src/kiutils/items}/dimensions.py    |    0
 {kiutils => src/kiutils}/items/fpitems.py     |   27 +-
 {items => src/kiutils/items}/gritems.py       |    0
 {items => src/kiutils/items}/schitems.py      |    0
 {items => src/kiutils/items}/syitems.py       |    0
 {kiutils => src/kiutils}/items/zones.py       |    4 +-
 {kiutils => src/kiutils}/libraries.py         |    0
 {kiutils => src/kiutils}/misc/config.py       |    0
 {kiutils => src/kiutils}/schematic.py         |    0
 {kiutils => src/kiutils}/symbol.py            |    0
 {kiutils => src/kiutils}/utils/sexpr.py       |    0
 {kiutils => src/kiutils}/utils/strings.py     |    0
 {kiutils => src/kiutils}/wks.py               |    0
 symbol.py                                     |  592 --
 test.py                                       |   37 +
 tests/__init__.py                             |   17 +
 tests/reporter/README.md                      |  208 +
 tests/reporter/result.py                      |  483 ++
 tests/reporter/runner.py                      |  119 +
 tests/reporter/template/report_template.html  |  192 +
 tests/template.py                             |   15 +
 tests/test_board.py                           |  151 +
 tests/test_designrules.py                     |   51 +
 tests/test_footprint.py                       |  183 +
 tests/test_libtable.py                        |   65 +
 tests/test_misc.py                            |   35 +
 tests/test_schematic.py                       |  210 +
 tests/test_symbol.py                          |  169 +
 tests/test_worksheets.py                      |   37 +
 .../board/since_v7/test_imageWithLayerToken   |   28 +
 .../board/since_v7/test_pcbPlotParams         |   52 +
 .../board/since_v7/test_textBoxAllVariants    |  306 +
 .../testdata/board/since_v7/test_textKnockout |   50 +
 .../board/since_v7/test_textsWithRenderCaches |   85 +
 .../board/test_allFpManufacturingAttributes   |  874 +++
 .../test_boardStackup32LayerDielectricsVias   |  302 +
 tests/testdata/board/test_boardTraceArcs      |  397 ++
 .../board/test_boardWithAllPrimitives         | 1466 +++++
 .../test_boardWithAllPrimitives.expected      | 1466 +++++
 tests/testdata/board/test_createEmptyBoard    |   46 +
 tests/testdata/board/test_pcbPlotParams       |   51 +
 .../board/test_renameFootprintIdToken         |   72 +
 .../test_renameFootprintIdToken.expected      |   72 +
 .../board/test_zoneOnAllLayersWildcard        |   24 +
 .../testdata/board/test_zoneOnOuterLayersOnly |   24 +
 .../designrules/since_v7/test_severityToken   |   15 +
 .../designrules/test_allDesignRuleItems       |   52 +
 .../designrules/test_createNewDesignRules     |    1 +
 .../legacy/test_moduleNameOnlyNumbers         |    3 +
 .../test_moduleNameOnlyNumbers.expected       |    5 +
 .../since_v7/test_3dModelOpacityToken         |   10 +
 .../since_v7/test_exemptFromCourtyardToken    |    7 +
 .../since_v7/test_imageWithLayerToken         |   27 +
 .../footprint/since_v7/test_netTiePadGroups   |   18 +
 .../since_v7/test_privateLayersToken          |   27 +
 .../since_v7/test_textBoxAllVariants          |  439 ++
 .../footprint/since_v7/test_textKnockout      |   15 +
 .../since_v7/test_textsWithRenderCaches       |   61 +
 .../footprint/test_3dModelHideProperty        |    9 +
 .../testdata/footprint/test_allFootprintItems |  149 +
 .../footprint/test_allFootprintItems.expected |  149 +
 .../test_createNewFootprintTypeOther          |   13 +
 .../footprint/test_createNewFootprintTypeSMD  |   14 +
 .../footprint/test_createNewFootprintTypeTHT  |   14 +
 .../footprint/test_footprintEmptyAttributes   |   19 +
 .../test_footprintEmptyAttributes.expected    |   18 +
 .../footprint/test_footprintPadNewLines       |   97 +
 ...t_addEmptyLibraryObjectToLibTable.expected |    3 +
 .../test_addLibraryObjectToLibTable.expected  |    3 +
 .../testdata/libtable/test_createNewLibTable  |    2 +
 .../libtable/test_parseFpLibTable.expected    |    4 +
 .../libtable/test_parseSymLibTable.expected   |    4 +
 .../misc/test_quotesAndBackslashInSexpr       |   61 +
 .../schematic/since_v7/test_arcAllVariants    |  132 +
 .../schematic/since_v7/test_busAliases        |   16 +
 .../schematic/since_v7/test_circleAllVariants |   92 +
 .../schematic/since_v7/test_netclassFlags     |  166 +
 .../since_v7/test_rectangleAllVariants        |  102 +
 .../since_v7/test_schematicWithAllPrimitives  |  989 ++++
 .../schematic/since_v7/test_sheetProperties   |   40 +
 ...cialLibIdWithMultipleUnderscoresAndNumbers |  440 ++
 .../since_v7/test_strokeOptionalTokens        |   25 +
 .../since_v7/test_symbolPinOptionalTokens     |  114 +
 .../since_v7/test_textBoxAllVariants          |  327 ++
 .../schematic/test.kicad_sch.expected         |  887 +++
 .../test_addPropertyToSchematicSymbol         |  140 +
 ...test_addPropertyToSchematicSymbol.expected |  140 +
 .../test_createEmptySchematic.expected        |    8 +
 ...est_hierarchicalSchematicWithAllPrimitives |  755 +++
 ...rchicalSchematicWithAllPrimitives.expected |  755 +++
 .../testdata/schematic/test_parseStrokeTokens |   64 +
 .../test_renameSymbolIdTokenInSchematic       |   41 +
 ...st_renameSymbolIdTokenInSchematic.expected |   42 +
 .../schematic/test_schematicWithAllPrimitives |  891 +++
 .../test_schematicWithAllPrimitives.expected  |  887 +++
 .../schematic/test_setSymbolLibNameToken      |   36 +
 .../test_setSymbolLibNameToken.expected       |   36 +
 .../symbol/since_v7/test_arcAllVariants       |  162 +
 .../symbol/since_v7/test_circleAllVariants    |  138 +
 .../symbol/since_v7/test_rectangleAllVariants |  138 +
 .../symbol/since_v7/test_textBoxAllVariants   |  708 +++
 .../symbol/test_allSymbolAlternatePins        |  174 +
 .../symbol/test_allSymbolPinVariations        |  402 ++
 tests/testdata/symbol/test_bigSymbolLibrary   | 3252 +++++++++++
 .../symbol/test_createNewSymbolInEmptyLibrary |   16 +
 .../test_createNewTopLevelSymbolFromChild     |   16 +
 ..._createNewTopLevelSymbolFromChild.expected |   25 +
 tests/testdata/symbol/test_mergeLibraries     | 4760 +++++++++++++++
 .../symbol/test_mergeLibraries.expected       | 5128 +++++++++++++++++
 .../symbol/test_renameParentIdUsingIdToken    |  112 +
 .../test_renameParentIdUsingIdToken.expected  |  112 +
 .../symbol/test_symbolDemorganSyItems         |  370 ++
 .../testdata/symbol/test_symbolDemorganUnits  |  109 +
 tests/testdata/symbol/test_symbolIdParser     |   14 +
 tests/testdata/symbol/test_symbolParameters   |   52 +
 .../worksheets/test_allWorkSheetItems         | 2104 +++++++
 .../worksheets/test_createNewWorksheet        |    4 +
 tests/testfunctions.py                        |  100 +
 utils/sexpr.py                                |   43 -
 utils/strings.py                              |   36 -
 wks.py                                        |  962 ----
 163 files changed, 35190 insertions(+), 11385 deletions(-)
 create mode 100644 CHANGELOG.md
 create mode 100644 CONTRIBUTING.md
 create mode 100644 LICENSE
 create mode 100644 README.md
 create mode 100644 docs/Makefile
 create mode 100644 docs/conf.py
 create mode 100644 docs/index.rst
 create mode 100644 docs/make.bat
 create mode 100644 docs/misc/known-issues.rst
 create mode 100644 docs/module/kiutils.items.rst
 create mode 100644 docs/module/kiutils.misc.rst
 create mode 100644 docs/module/kiutils.rst
 create mode 100644 docs/module/kiutils.utils.rst
 create mode 100644 docs/usage/development.rst
 create mode 100644 docs/usage/examples.rst
 create mode 100644 docs/usage/getting-started.rst
 create mode 100644 docs/usage/installation.rst
 delete mode 100644 items/fpitems.py
 delete mode 100644 items/zones.py
 delete mode 100644 kiutils/__init__.py
 delete mode 100644 kiutils/board.py
 delete mode 100644 kiutils/dru.py
 delete mode 100644 kiutils/footprint.py
 delete mode 100644 kiutils/items/brditems.py
 delete mode 100644 kiutils/items/common.py
 delete mode 100644 kiutils/items/dimensions.py
 delete mode 100644 kiutils/items/gritems.py
 delete mode 100644 kiutils/items/schitems.py
 delete mode 100644 kiutils/items/syitems.py
 delete mode 100644 libraries.py
 delete mode 100644 misc/config.py
 create mode 100644 pyproject.toml
 create mode 100644 requirements_dev.txt
 delete mode 100644 schematic.py
 create mode 100644 setup.cfg
 create mode 100644 setup.py
 rename __init__.py => src/kiutils/__init__.py (100%)
 rename board.py => src/kiutils/board.py (100%)
 rename dru.py => src/kiutils/dru.py (100%)
 rename footprint.py => src/kiutils/footprint.py (99%)
 rename {items => src/kiutils/items}/brditems.py (100%)
 rename {items => src/kiutils/items}/common.py (100%)
 rename {items => src/kiutils/items}/dimensions.py (100%)
 rename {kiutils => src/kiutils}/items/fpitems.py (96%)
 rename {items => src/kiutils/items}/gritems.py (100%)
 rename {items => src/kiutils/items}/schitems.py (100%)
 rename {items => src/kiutils/items}/syitems.py (100%)
 rename {kiutils => src/kiutils}/items/zones.py (99%)
 rename {kiutils => src/kiutils}/libraries.py (100%)
 rename {kiutils => src/kiutils}/misc/config.py (100%)
 rename {kiutils => src/kiutils}/schematic.py (100%)
 rename {kiutils => src/kiutils}/symbol.py (100%)
 rename {kiutils => src/kiutils}/utils/sexpr.py (100%)
 rename {kiutils => src/kiutils}/utils/strings.py (100%)
 rename {kiutils => src/kiutils}/wks.py (100%)
 delete mode 100644 symbol.py
 create mode 100644 test.py
 create mode 100644 tests/__init__.py
 create mode 100644 tests/reporter/README.md
 create mode 100644 tests/reporter/result.py
 create mode 100644 tests/reporter/runner.py
 create mode 100644 tests/reporter/template/report_template.html
 create mode 100644 tests/template.py
 create mode 100644 tests/test_board.py
 create mode 100644 tests/test_designrules.py
 create mode 100644 tests/test_footprint.py
 create mode 100644 tests/test_libtable.py
 create mode 100644 tests/test_misc.py
 create mode 100644 tests/test_schematic.py
 create mode 100644 tests/test_symbol.py
 create mode 100644 tests/test_worksheets.py
 create mode 100644 tests/testdata/board/since_v7/test_imageWithLayerToken
 create mode 100644 tests/testdata/board/since_v7/test_pcbPlotParams
 create mode 100644 tests/testdata/board/since_v7/test_textBoxAllVariants
 create mode 100644 tests/testdata/board/since_v7/test_textKnockout
 create mode 100644 tests/testdata/board/since_v7/test_textsWithRenderCaches
 create mode 100644 tests/testdata/board/test_allFpManufacturingAttributes
 create mode 100644 tests/testdata/board/test_boardStackup32LayerDielectricsVias
 create mode 100644 tests/testdata/board/test_boardTraceArcs
 create mode 100644 tests/testdata/board/test_boardWithAllPrimitives
 create mode 100644 tests/testdata/board/test_boardWithAllPrimitives.expected
 create mode 100644 tests/testdata/board/test_createEmptyBoard
 create mode 100644 tests/testdata/board/test_pcbPlotParams
 create mode 100644 tests/testdata/board/test_renameFootprintIdToken
 create mode 100644 tests/testdata/board/test_renameFootprintIdToken.expected
 create mode 100644 tests/testdata/board/test_zoneOnAllLayersWildcard
 create mode 100644 tests/testdata/board/test_zoneOnOuterLayersOnly
 create mode 100644 tests/testdata/designrules/since_v7/test_severityToken
 create mode 100644 tests/testdata/designrules/test_allDesignRuleItems
 create mode 100644 tests/testdata/designrules/test_createNewDesignRules
 create mode 100644 tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers
 create mode 100644 tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected
 create mode 100644 tests/testdata/footprint/since_v7/test_3dModelOpacityToken
 create mode 100644 tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken
 create mode 100644 tests/testdata/footprint/since_v7/test_imageWithLayerToken
 create mode 100644 tests/testdata/footprint/since_v7/test_netTiePadGroups
 create mode 100644 tests/testdata/footprint/since_v7/test_privateLayersToken
 create mode 100644 tests/testdata/footprint/since_v7/test_textBoxAllVariants
 create mode 100644 tests/testdata/footprint/since_v7/test_textKnockout
 create mode 100644 tests/testdata/footprint/since_v7/test_textsWithRenderCaches
 create mode 100644 tests/testdata/footprint/test_3dModelHideProperty
 create mode 100644 tests/testdata/footprint/test_allFootprintItems
 create mode 100644 tests/testdata/footprint/test_allFootprintItems.expected
 create mode 100644 tests/testdata/footprint/test_createNewFootprintTypeOther
 create mode 100644 tests/testdata/footprint/test_createNewFootprintTypeSMD
 create mode 100644 tests/testdata/footprint/test_createNewFootprintTypeTHT
 create mode 100644 tests/testdata/footprint/test_footprintEmptyAttributes
 create mode 100644 tests/testdata/footprint/test_footprintEmptyAttributes.expected
 create mode 100644 tests/testdata/footprint/test_footprintPadNewLines
 create mode 100644 tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected
 create mode 100644 tests/testdata/libtable/test_addLibraryObjectToLibTable.expected
 create mode 100644 tests/testdata/libtable/test_createNewLibTable
 create mode 100644 tests/testdata/libtable/test_parseFpLibTable.expected
 create mode 100644 tests/testdata/libtable/test_parseSymLibTable.expected
 create mode 100644 tests/testdata/misc/test_quotesAndBackslashInSexpr
 create mode 100644 tests/testdata/schematic/since_v7/test_arcAllVariants
 create mode 100644 tests/testdata/schematic/since_v7/test_busAliases
 create mode 100644 tests/testdata/schematic/since_v7/test_circleAllVariants
 create mode 100644 tests/testdata/schematic/since_v7/test_netclassFlags
 create mode 100644 tests/testdata/schematic/since_v7/test_rectangleAllVariants
 create mode 100644 tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives
 create mode 100644 tests/testdata/schematic/since_v7/test_sheetProperties
 create mode 100644 tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers
 create mode 100644 tests/testdata/schematic/since_v7/test_strokeOptionalTokens
 create mode 100644 tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens
 create mode 100644 tests/testdata/schematic/since_v7/test_textBoxAllVariants
 create mode 100644 tests/testdata/schematic/test.kicad_sch.expected
 create mode 100644 tests/testdata/schematic/test_addPropertyToSchematicSymbol
 create mode 100644 tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected
 create mode 100644 tests/testdata/schematic/test_createEmptySchematic.expected
 create mode 100644 tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives
 create mode 100644 tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected
 create mode 100644 tests/testdata/schematic/test_parseStrokeTokens
 create mode 100644 tests/testdata/schematic/test_renameSymbolIdTokenInSchematic
 create mode 100644 tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected
 create mode 100644 tests/testdata/schematic/test_schematicWithAllPrimitives
 create mode 100644 tests/testdata/schematic/test_schematicWithAllPrimitives.expected
 create mode 100644 tests/testdata/schematic/test_setSymbolLibNameToken
 create mode 100644 tests/testdata/schematic/test_setSymbolLibNameToken.expected
 create mode 100644 tests/testdata/symbol/since_v7/test_arcAllVariants
 create mode 100644 tests/testdata/symbol/since_v7/test_circleAllVariants
 create mode 100644 tests/testdata/symbol/since_v7/test_rectangleAllVariants
 create mode 100644 tests/testdata/symbol/since_v7/test_textBoxAllVariants
 create mode 100644 tests/testdata/symbol/test_allSymbolAlternatePins
 create mode 100644 tests/testdata/symbol/test_allSymbolPinVariations
 create mode 100644 tests/testdata/symbol/test_bigSymbolLibrary
 create mode 100644 tests/testdata/symbol/test_createNewSymbolInEmptyLibrary
 create mode 100644 tests/testdata/symbol/test_createNewTopLevelSymbolFromChild
 create mode 100644 tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected
 create mode 100644 tests/testdata/symbol/test_mergeLibraries
 create mode 100644 tests/testdata/symbol/test_mergeLibraries.expected
 create mode 100644 tests/testdata/symbol/test_renameParentIdUsingIdToken
 create mode 100644 tests/testdata/symbol/test_renameParentIdUsingIdToken.expected
 create mode 100644 tests/testdata/symbol/test_symbolDemorganSyItems
 create mode 100644 tests/testdata/symbol/test_symbolDemorganUnits
 create mode 100644 tests/testdata/symbol/test_symbolIdParser
 create mode 100644 tests/testdata/symbol/test_symbolParameters
 create mode 100644 tests/testdata/worksheets/test_allWorkSheetItems
 create mode 100644 tests/testdata/worksheets/test_createNewWorksheet
 create mode 100644 tests/testfunctions.py
 delete mode 100644 utils/sexpr.py
 delete mode 100644 utils/strings.py
 delete mode 100644 wks.py

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..028e84c
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,168 @@
+# kiutils - CHANGELOG
+
+## v1.4.9 - 10.09.2024
+- Fixed: support for KiCad 8: Updated handling to accommodate renaming of `tstamp` to `uuid`.
+- Added: Net name association for GrPoly in graphic items on the board.
+
+## v1.4.8 - 03.02.2024
+
+### Non-breaking changes
+- Fixed: Missing parenthesis for gr_curve items (PR #110)
+- Fixed: Text `knockout` setting not parsed (PR #111)
+
+## v1.4.7 - 23.10.2023
+
+### Non-breaking changes
+- Fixed: No quotes for DRC rules "severity" token (PR #108)
+
+## v1.4.6 - 23.10.2023
+
+### Non-breaking changes
+- Added: Parsing of schematic sheet file properties (PR #106)
+
+## v1.4.5 - 04.10.2023
+
+### Non-breaking changes
+- Added: Parsing of footprint `net_tie_pad_groups` token (PR #105)
+
+## v1.4.4 - 17.08.2023
+
+### Non-breaking changes
+- Added: Parsing of footprint `private_layers` token (PR #103)
+- Added: Parsing of 3d-model `opacity` token (PR #98)
+- Added: Parsing of footprint attribute's `allow_missing_courtyard` token (PR #101)
+- Fixed: Legacy footprints with only digits as name are now correctly parsed (PR #91)
+
+## v1.4.3 - 15.07.2023
+
+### Non-breaking changes
+- Fixed: 3D model `hide` property not parsed (PR #97)
+
+## v1.4.2 - 09.06.2023
+
+### Non-breaking changes
+- Added: Support for `bus_alias` tokens (PR #92)
+
+## v1.4.1 - 22.04.2023
+
+### Non-breaking changes
+- Fixed: Zones on only outer layers produce wrong S-Expression for the `layer` token (PR #89)
+
+## v1.4.0 - 27.03.2023
+This release adds initial KiCad v7 support.
+
+### Breaking changes
+- Changed: Removed `SyFill` in favour of `Fill` tokens everywhere - (PR #76)
+
+### Non-breaking changes
+- Added: Parsing new sheet names - (PR #59)
+- Added: `Arc`, `Rectangle` and `Circle` tokens - (PR #76)
+- Added: `Schematic.shapes` to hold arcs, rectangles and circles - (PR #76)
+- Added: `GrTextBox`, `FpTextBox`, `SyTextBox` and `TextBox` tokens - (PR #76)
+- Added: `SchematicSymbol.dnp` token - (PR #77)
+- Added: `fields_autoplaced` token to all kinds of lables - (PR #77)
+- Added: `NetclassFlag` token - (PR #80)
+- Added: `Property.showName` token - (PR #80)
+- Added: `Rule.severity` token for design rules - (PR #84)
+- Added: `plotOnAllLayersSelection`, `dashedLineDashRatio` and `dashedLineGapRatio` tokens 
+         in `PlotSettings` - (PR #85)
+- Added: `RenderCache` token for supported text items - (PR #87)
+- Added: `ProjectInstance` tokens for schematic symbols and hierarchical sheets - (PR #88)
+- Changed: Strokes are now parsed less strictly - (PR #57)
+- Changed: Default value of `Stroke.type` from "dash" to "default" - (PR #63)
+- Changed: `Stroke.color` is now optional - (PR #63)
+- Changed: `Stroke.type` is now optional - (PR #82)
+- Changed: `Schematic.tstamp` is now optional - (PR #63)
+- Changed: `Property.id` is now optional - (PR #78)
+- Changed: `SymbolPin.nameEffects` and `SymbolPin.numberEffects` are now optional - (PR #82)
+- Changed: `PlotSettings.svgUseInch` and `PlotSettings.excludeEdgeLayer` are now optional - (PR #85)
+- Fixed: Regex parser not correctly handling backslashes in quoted strings - (PR #82)
+- Fixed: `DesignRules.from_sexpr()` not parsing version token - (PR #84)
+
+## v1.3.0 - 21.02.2023
+### Breaking changes
+- Changed: The ID token API was consolidated - (PR #54)
+  - `SchematicSymbol`: `self.libraryIdentifier` renamed to `self.libId`
+  - `Symbol`: `self.id` renamed to `self.libId`
+  - `Footprint`: `self.libraryLink` renamed to `self.libId`
+  - Setting and getting `self.libId` will update some subtokens of these classes. Check the documentation
+    for more information on this.
+- Changed: `Footprint.create_new()`'s parameter `library_link` renamed to `library_id` - (PR #54)
+- Changed: `SymbolLib.version` is now a non-optional token that defaults to the config entry
+           `KIUTILS_CREATE_NEW_VERSION_STR` - (PR #55)
+
+### Non-breaking changes
+- Added: API for lib_name token in `SchematicSymbol` called `self.libName` - (PR #54)
+- Added: Tokens `self.entryName` and `self.libraryNickname` for classes `Symbol`, `SchematicSymbol`
+         and `Footprint`. These tokens are part of the `libId` token and will be changed when setting 
+         it. - (PR #41)
+- Added Tokens `self.unitId` and `self.styleId` for `Symbol` class. These tokens are part of the 
+        `libId` token and will be changed when setting it. - (PR #41)
+- Added: All `from_file` and `to_file` methods got a new optional parameter `encoding` to change 
+         the default encoding when reading/writing files. - (PR #50)
+- Added: New `active` token in `LibTable` class - (PR #51)
+- Added: CONTRIBUTING.md - (PR #52)
+- Added: Missing `filePath` attribute in `DesignRules` class - (PR #45)
+- Fixed: Return type of `LibTable.create_new()` - (PR #45)
+- Fixed: `Position.to_sexpr()` having no parameters - (PR #45)
+- Changed: Most parts of the docu were refactored - (PR #45)
+- Removed: Unused `size` token in class `Connection()` - (PR #45)
+- Removed: Unused `stroke` token in class `Image()` - (PR #45)
+- Removed: Some tokens that were defined twice - (PR #45)
+
+## v1.2.1 - 21.11.2022
+- Fixed: Broken package config did not included every source file while building the module - (PR #38) 
+
+## v1.2.0 - 20.11.2022
+- Added: Support for Python 3.11 on all platforms
+- Added: `create_new()` API for all classes that serve files (schematic, board, etc) - (PR #33)
+- Added: Checked `self.stroke` to be None in all `FpItems` classes when generating its S-Expression - (PR #36)
+- Fixed: Default values of mutable class members are now set correctly using a dataclass field with 
+         a default_factory to ensure unique references for each new class object - (PR #35)
+- Fixed: Made VSCode automatic test discovery work - (PR #34)
+- Changed: Documentation on `Jusitfy.to_sexpr()`s return value - (PR #37)
+
+## v1.1.4 - 10.09.2022
+- Added: Support for older Python versions (v3.7 to v3.10 are now supported) - (PR #30)
+- Added: Automatic test report generation in test framework - (PR #21)
+- Added: Sphinx-compatible documentation in `docs/` folder and on 
+         [https://kiutils.readthedocs.io](https://kiutils.readthedocs.io) - (PR #29)
+- Changed: Replaced relative imports with absolute imports in the module structure - (PR #24)
+- Changed: Migrated test framework to Python's `unittest` - (PR #21)
+- Changed: `unit` token in class `kiutils.items.schitems.SchematicSymbol()` is now optional - (PR #26)
+- Changed: `tstamp` token in class `kiutils.schematic.Schematic()` is now optional - (PR #26)
+- Changed: Order of how newlines are generated in `kiutils.schematic.Schematic().to_sexpr()` - (PR #26)
+- Fixed: `angle` set to 0.0 (was `None`) when creating a new `kiutils.items.common.Property()` object (PR #27, fixes #19)
+- Fixed: Footprint attributes object (`kiutils.footprint.Attributes()`) missing when certain 
+         "Manufacturing Attributes" are set - (PR #28)
+
+## v1.1.3 - 07.07.2022
+- Fixed: Stacked dielectrics in PCB layer stack are now parsed correctly as `StackupSubLayer` item
+
+## v1.1.2 - 30.06.2022
+- Added: Support for track arcs at `kiutils.items.brditems.Arc()`
+- Fixed: Redundant line break in a footprint's pad section with a schematic symbol assigned (aka 
+         net, pinfunction or pintype token set) as well as at least the solder_paste_margin_ratio 
+         token set 
+
+## v1.1.1 - 27.06.2022
+- Added: Support for custom design rules (`.kicad_dru`)
+- Added: Support for custom worksheets (`.kicad_wks`)
+
+## v1.1.0 - 16.06.2022
+- Added: Support for Python Package Index (PyPI)
+- Changed: Source directory for development moved from `kiutils/` to `src/kiutils/`
+
+## v1.0.1 - 15.06.2022
+- Added: Dimension, DimensionStyle, DimensionFormat classes for dimensions (measurements in PCB)
+- Added: Target class for board target markers
+- Added: Support for dimensions and target markers in Board class
+- Added: Prerequisites in docu
+- Fixed: Correct parsing of footprints with empty `attr` field (see #2)
+- Fixed: Quoted strings funcion now handles integers that may be parsed from older KiCad versions 
+         correctly (see #3)
+- Fixed: Symbol pin's `alternate` field was missing and is now parsed correctly (see #4)
+- Fixed: Footprint `libraryLink` attribute was missing (see #5)
+
+## v1.0.0 - 19.03.2022
+- Initial version
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..075907b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,60 @@
+# Contributing to KiUtils
+Thanks for considering to contribute to `kiutils`. Please create an issue first if you want to add
+new functionality and propose what you are going to do beforehand. This may not be neccessary for
+simple bug fixes or enhancements. 
+
+## Testing
+Whenever you are contributing a new feature to `kiutils`, be sure to provide unittests that 
+explicitly test the functionality you implemented. Check out the `tests` folder in the repository 
+root for some examples. The following folders are of interest:
+- `tests/testdata/`: Put files your test case may need to parse here
+- `tests/test_XXXX.py`: Test cases can be found in their respective Python file
+- `tests/testfunctions.py`: Functions to aid in testing and report generation
+
+## Local setup
+An example of how to run the unittests is described here.
+
+## Fork and clone the repository
+Create a fork of `kiutils` and clone it to your computer using:
+```bash
+git clone https://github.com//kiutils
+cd kiutils
+```
+
+### Set up / enter virtual enviroment (venv module)
+You may want to create a new Python virtual environment when developing `kiutils`. This can be 
+done with Python's built-in virtual environment module:
+```bash
+python3 -m venv env
+```
+
+To enter the newly created virtual enviroment, run:
+```bash
+source env/bin/activate
+```
+
+### Install dev dependencies
+`kiutils` requires some dependencies for running tests. Install them using `pip` in your virtual 
+environment using:
+
+```bash
+pip install -r requirements_dev.txt
+```
+
+### Run tests
+In the `kiutils` root directory, running the tests is done using:
+```bash
+python test.py
+```
+
+A test report is automatically generated that shows the passing/failing tests. If a test is failing, 
+the report will show you what went wrong.
+
+### Leaving virtual environment (venv module)
+When done, leaving the virtual environment is done using:
+```bash
+deactivate
+```
+
+### Submit your changes
+Create a pull request of your forked changes to discuss and merge your implementation into `kiutils`.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. 
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    
+    Copyright (C)   
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+      Copyright (C)   
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..28b95e5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,50 @@
+# KiUtils
+
+[![PyPI version](https://img.shields.io/pypi/v/kiutils)](https://pypi.org/project/kiutils)
+[![PyPI downloads](https://img.shields.io/pypi/dm/kiutils.svg)](https://pypistats.org/packages/kiutils)
+![Python version](https://img.shields.io/pypi/pyversions/kiutils)
+[![License](https://img.shields.io/github/license/mvnmgrx/kiutils)](https://github.com/mvnmgrx/kiutils/blob/master/LICENSE)
+![Last commit](https://img.shields.io/github/last-commit/mvnmgrx/kiutils)
+[![Documentation Status](https://readthedocs.org/projects/kiutils/badge/?version=latest)](https://kiutils.readthedocs.io/en/latest/?badge=latest)
+
+Simple and SCM-friendly KiCad file parser based on Python dataclasses for KiCad 6.0
+and up. The following KiCad-related files are currently supported:
+- `.kicad_pcb` - Board layouts
+- `.kicad_sch` - Schematics
+- `.kicad_mod` - Footprints
+- `.kicad_sym` - Symbols and symbol libraries
+- `.kicad_wks` - Worksheets
+- `.kicad_dru` - Custom design rules
+- `fp-lib-table` & `sym-lib-table` - Library tables
+
+KiUtils implements a "pythonic" abstraction of the documentation found at the
+[KiCad Developer Reference](https://dev-docs.kicad.org/en/file-formats/) and is
+intended to work with an SCM like Git or SVN without breaking the layout of the
+files when the Python script ran.
+
+Parsing of the files is based on the S-Expression parser found in this library:
+[GitLab: KiCad Library utilities](https://gitlab.com/kicad/libraries/kicad-library-utils)
+
+## Prerequisites
+The following is required to use `kiutils`:
+- Python 3.7 or higher
+
+## Installation
+``kiutils`` is available on [PyPI](https://pypi.org/project/kiutils/). Use Python's `pip`
+to install it:
+```
+pip install kiutils
+```
+
+If ``kiutils`` is already installed, upgrade it to the latest version using:
+```
+pip install --no-cache-dir --upgrade kiutils
+```
+
+## Documentation
+Visit the [kiutils documentation](https://kiutils.readthedocs.io/) for more information on how to 
+install, use and develop `kiutils`, as well as examples and general module documentation.
+
+## Donate
+If you found this module helpful for your project consider donating via
+[PayPal](https://paypal.me/mrvnmgr). Thanks!
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..d4bb2cb
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..ec7248d
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,61 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import sys
+sys.path.insert(0, os.path.abspath('../src'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'kiutils'
+copyright = '2023, Marvin Mager'
+author = 'Marvin Mager'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc'
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# Sort the documented members as they appear in the source
+autodoc_member_order = 'bysource'
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# 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,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Options of RTD theme
+html_theme_options = {
+    'style_external_links': True,
+}
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..d24989b
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,50 @@
+.. kiutils documentation master file, created by
+   sphinx-quickstart on Sun Sep  4 18:35:39 2022.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to kiutils's documentation!
+===================================
+
+This is the documentation to the ``kiutils`` python module for parsing files of the KiCad EDA.
+
+- View on Github: `mvnmgrx/kiutils `_
+
+``kiutils`` is simple and SCM-friendly KiCad file parser based on Python dataclasses for KiCad 6.0
+and up. 
+
+It implements a "pythonic" abstraction of the documentation found at the
+`KiCad Developer Reference `_ and is intended to work 
+with an SCM like Git or SVN without breaking the layout of the files when the Python script ran.
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Usage
+
+   usage/installation
+   usage/getting-started
+   usage/examples
+   usage/development
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Misc
+
+   misc/known-issues
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Module documentation
+
+   module/kiutils
+   module/kiutils.items
+   module/kiutils.utils
+   module/kiutils.misc
+
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..954237b
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.https://www.sphinx-doc.org/
+	exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/misc/known-issues.rst b/docs/misc/known-issues.rst
new file mode 100644
index 0000000..7b12c7f
--- /dev/null
+++ b/docs/misc/known-issues.rst
@@ -0,0 +1,27 @@
+Known issues
+============
+
+- **Footprint:** Whitespaces in the items section do sometimes not correspond
+  correctly to those generated by KiCad. This will be picked up by an SCM as a
+  change even though no changes were initially made. This seems to be a bug in
+  KiCad itself, as it sometimes sets the whitespaces before those tokens
+  correctly and sometimes not.
+
+- **Schematic:** Sometimes KiCad inserts blank lines between wires, bus entries
+  and polylines which are not picked up by the parser. Same problem as above
+  with SCMs.
+
+- **Backwards compatibility:** KiCad <6 file formats can be parsed, but will
+  be converted to KiCad 6 style S-Expression upon saving. It was observed that
+  e.g. footprints of an older version will experience conversion errors in some
+  features that KiCad 6 now handles differently (see `fp_arc` as an example).
+  It is in the user's hands to decide on how to deal with this, but support
+  for converting correctly to KiCad 6 formats may be added in the future.
+  Please create an issue with a snippet of what you are trying to parse when
+  stumbling upon such a situation.
+
+- **Design rules:** Support for custom design rules was implemented without a
+  proper documentation. Thus it might be subject to bugs or changes. It
+  furthermore may not exactly place the items associated with a custom design
+  rule (constraints, layers, etc) in the same order as the user once put them
+  when parsing and writing back `.kicad_dru` files
\ No newline at end of file
diff --git a/docs/module/kiutils.items.rst b/docs/module/kiutils.items.rst
new file mode 100644
index 0000000..21ddf84
--- /dev/null
+++ b/docs/module/kiutils.items.rst
@@ -0,0 +1,74 @@
+kiutils.items package
+=====================
+
+Board items (`kiutils.items.brditems`)
+--------------------------------------
+
+.. automodule:: kiutils.items.brditems
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Common items (`kiutils.items.common`)
+-------------------------------------
+
+.. automodule:: kiutils.items.common
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Dimensions (`kiutils.items.dimension`)
+--------------------------------------
+
+.. automodule:: kiutils.items.dimensions
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Footprint items (`kiutils.items.fpitems`)
+-----------------------------------------
+
+.. automodule:: kiutils.items.fpitems
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Graphical items (`kiutils.items.gritems`)
+-----------------------------------------
+
+.. automodule:: kiutils.items.gritems
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Schematic items (`kiutils.items.schitems`)
+------------------------------------------
+
+.. automodule:: kiutils.items.schitems
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Symbol items (`kiutils.items.syitems`)
+--------------------------------------
+
+.. automodule:: kiutils.items.syitems
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Zone items (`kiutils.items.zones`)
+--------------------------------------
+
+.. automodule:: kiutils.items.zones
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+.. Module contents
+.. ---------------
+
+.. .. automodule:: kiutils
+..    :members:
+..    :undoc-members:
+..    :show-inheritance:
diff --git a/docs/module/kiutils.misc.rst b/docs/module/kiutils.misc.rst
new file mode 100644
index 0000000..3ed9621
--- /dev/null
+++ b/docs/module/kiutils.misc.rst
@@ -0,0 +1,11 @@
+kiutils.misc package
+=====================
+
+Configuration stuff (`kiutils.misc.config`)
+---------------------------------------------
+
+.. automodule:: kiutils.misc.config
+   :members:
+   :special-members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/module/kiutils.rst b/docs/module/kiutils.rst
new file mode 100644
index 0000000..5291463
--- /dev/null
+++ b/docs/module/kiutils.rst
@@ -0,0 +1,58 @@
+kiutils package
+===============
+
+Board files (`kiutils.board`)
+-----------------------------
+
+.. automodule:: kiutils.board
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Design Rules (`kiutils.dru`)
+----------------------------
+
+.. automodule:: kiutils.dru
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Footprints (`kiutils.footprint`)
+--------------------------------
+
+.. automodule:: kiutils.footprint
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Library tables (`kiutils.libraries`)
+------------------------------------
+
+.. automodule:: kiutils.libraries
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Schematics (`kiutils.schematic`)
+--------------------------------
+
+.. automodule:: kiutils.schematic
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Symbols and Symbol Libraries (`kiutils.symbol`)
+-----------------------------------------------
+
+.. automodule:: kiutils.symbol
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Worksheets (`kiutils.wks`)
+--------------------------
+
+.. automodule:: kiutils.wks
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/module/kiutils.utils.rst b/docs/module/kiutils.utils.rst
new file mode 100644
index 0000000..b5a1a75
--- /dev/null
+++ b/docs/module/kiutils.utils.rst
@@ -0,0 +1,18 @@
+kiutils.utils package
+=====================
+
+String manipulation (`kiutils.utils.strings`)
+---------------------------------------------
+
+.. automodule:: kiutils.utils.strings
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+S-Expr parser (`kiutils.utils.sexpr`)
+-------------------------------------
+
+.. automodule:: kiutils.utils.sexpr
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/usage/development.rst b/docs/usage/development.rst
new file mode 100644
index 0000000..3563305
--- /dev/null
+++ b/docs/usage/development.rst
@@ -0,0 +1,41 @@
+Development
+===========
+
+To start developing, clone the repository:
+
+.. code-block:: text
+
+   git clone https://github.com/mvnmgrx/kiutils.git
+   cd kiutils
+
+For generating test reports as well as the documentation, install the development requirements:
+
+.. code-block:: text
+
+  pip install -r requirements_dev.txt
+
+Tests
+-----
+
+Unittests are used to test ``kiutils``. To run the test framework and generate an HTML report, start 
+the test script:
+
+.. code-block:: text
+
+   python3 test.py
+
+When adding a feature to ``kiutils``, be sure to provide unittests that explicitly test the 
+functionality you want to implement.
+
+Generate documentation
+----------------------
+
+The documentation is generated using the ``sphinx`` module with autodoc enabled. Generate it by
+running:
+
+.. code-block:: text
+
+   cd docs
+   make html
+
+The HTML output can then be accessed via ``docs/_build/html/index.html``. 
\ No newline at end of file
diff --git a/docs/usage/examples.rst b/docs/usage/examples.rst
new file mode 100644
index 0000000..5fe2967
--- /dev/null
+++ b/docs/usage/examples.rst
@@ -0,0 +1,147 @@
+Examples
+========
+
+These examples show how the module is intended to be used.
+
+Loading and saving a board
+--------------------------
+
+.. code-block:: python
+
+   from kiutils.board import Board
+
+   board = Board().from_file("path/to/board.kicad_pcb")
+
+   # Do stuff ...
+
+   board.to_file()
+
+
+Changing title and revision in schematic
+----------------------------------------
+
+.. code-block:: python
+
+   from kiutils.schematic import Schematic
+
+   schematic = Schematic().from_file("path/to/schematic.kicad_sch")
+   schematic.titleBlock.title = "This is schematic xyz"
+   schematic.titleBlock.revision = "B"
+   schematic.to_file()
+
+Loading and adding footprint to board
+-------------------------------------
+
+Here a footprint is loaded from a `.kicad_mod` file and added to a board:
+
+.. code-block:: python
+
+   from kiutils.board import Board
+   from kiutils.footprint import Footprint
+   from kiutils.items.common import Position
+   from kiutils.items.fpitems import FpText
+
+   from os import path
+
+   # Get current working directory
+   tests_path = path.join(path.dirname(path.realpath(__file__)), 'tests')
+
+   # Load board file and footprint file
+   board = Board().from_file(path.join(tests_path, "example-project/example/example.kicad_pcb"))
+   footprint = Footprint().from_file(path.join(tests_path, "example-project/example/C_0805.kicad_mod"))
+
+   # Set new footprint's position
+   footprint.position = Position(X=127.0, Y=85.0)
+
+   # Change identifier to C105
+   for item in footprint.graphicItems:
+       if isinstance(item, FpText):
+           if item.type == 'reference':
+               item.text = "C105"
+
+   # Append footprint to board and save board
+   board.footprints.append(footprint)
+   board.to_file()
+
+Adding vias to board
+--------------------
+
+This example adds two vias on the normal axis at the end of each segment:
+
+.. code-block:: python
+
+   from cmath import sqrt
+   from kiutils.board import Board
+   from kiutils.items.brditems import Via, Segment
+   from kiutils.items.common import Position
+
+   from os import path
+
+   # Get current working directory
+   tests_path = path.join(path.dirname(path.realpath(__file__)), 'tests')
+
+   # Load board file
+   board = Board().from_file(path.join(tests_path, "example-project/example/example.kicad_pcb"))
+
+   # Iterate through segments, arcs and vias ..
+   for item in board.traceItems:
+       if isinstance(item, Segment):
+           # Calculate normal on end point of segment
+           nvec = Position(-(item.end.Y - item.start.Y), item.end.X - item.start.X)
+           nvec_inverse_len = 1/sqrt(nvec.X**2 + nvec.Y**2).real
+           unit_normal = Position(nvec_inverse_len * nvec.X, nvec_inverse_len * nvec.Y)
+
+           # Compute positions of new vias
+           next_via_1 = Position(item.end.X + (unit_normal.X * 2), item.end.Y + (unit_normal.Y * 2))
+           next_via_2 = Position(item.end.X - (unit_normal.X * 2), item.end.Y - (unit_normal.Y * 2))
+
+           # Append vias to trace items list of board
+           board.traceItems.append(Via(position=next_via_1, layers=["F.Cu", "B.Cu"], size=1.0, drill=0.6))
+           board.traceItems.append(Via(position=next_via_2, layers=["F.Cu", "B.Cu"], size=1.0, drill=0.6))
+
+   # Write changes back to board file
+   board.to_file()
+
+Adding a schematic symbol
+-------------------------
+
+This example shows how a schematic symbol might be added from a symbol library into a schematic:
+
+.. code-block:: python
+
+   from kiutils.schematic import Schematic, SymbolInstance, SchematicSymbol
+   from kiutils.symbol import SymbolLib  
+   from kiutils.items.common import Property, Position
+   
+   # Load the symbol library  
+   symbol_lib = SymbolLib().from_file('/usr/share/kicad/symbols/Device.kicad_sym')  
+   
+   # Find the symbol in the library  
+   symbol = None  
+   for s in symbol_lib.symbols:  
+      if s.entryName == 'R_Small_US':  
+         symbol = s  
+         break  
+   
+   if symbol is None:  
+      raise ValueError('Symbol not found in library')  
+
+   
+   # Create a new schematic  
+   schematic = Schematic.create_new()  
+   
+   # Add the symbol to the schematic  
+   schematic.libSymbols.append(symbol)  
+
+   schematic_symbol = SchematicSymbol()
+   schematic_symbol.libName = 'R_Small_US'
+   schematic_symbol.libId = 'Device:R_Small_US' 
+   schematic_symbol.position = Position(X=0, Y=0, angle=0)
+
+   schematic_symbol.properties.append(Property(key='Reference', value='R?', id=0))
+   schematic_symbol.properties.append(Property(key='Value', value='R_Small_US', id=1))  
+
+   schematic.schematicSymbols.append(schematic_symbol)  
+
+   # Save the schematic to a file  
+   schematic.to_file('path_to_save_schematic.kicad_sch')  
\ No newline at end of file
diff --git a/docs/usage/getting-started.rst b/docs/usage/getting-started.rst
new file mode 100644
index 0000000..31babca
--- /dev/null
+++ b/docs/usage/getting-started.rst
@@ -0,0 +1,65 @@
+Getting started
+===============
+
+The most relevant classes can be imported like this:
+
+.. code-block:: python
+
+   from kiutils.board import Board
+   from kiutils.libraries import LibTable
+   from kiutils.schematic import Schematic
+   from kiutils.footprint import Footprint
+   from kiutils.symbol import SymbolLib
+   from kiutils.wks import WorkSheet
+   from kiutils.dru import DesignRules
+
+Every class has at at least the following functions:
+
+- ``to_sexpr(..)``: Generate KiCad S-Expression that describes the object
+- ``from_sexpr(..)``: Initialize the object with data found in given S-Expression. Wrong S-Expression
+  supplied yields an exception.
+
+If the class is intended to access files (such as board files, schematics, libraries, etc.), the
+following functions are available:
+
+- ``create_new(..)``: Creates a new object with its members populated in a similar way as KiCad would do it
+- ``from_file(..)``: Creates a new object and initializes it with data found in given file
+- ``to_file(..)``: Generate KiCad S-Expression that describes the object and write it to the given file
+
+The files in the root directory are intended to be used in a Python script as they contain the main
+functionality of the module. Documentation can be found in the source files itself. Use VSCode for
+development as it shows docstring documentation by default when hovering over functions and members
+of the module.
+
+Simple examples
+---------------
+
+These examples use the ``Board()`` class as an example. The procedure is the same for all file-serving
+classes in ``kiutils``.
+
+Create a new object and dump it to a file that KiCad can use (be sure to get the file extension
+correctly! (``.kicad_pcb`` in this case)):
+
+.. code-block:: python
+
+   from kiutils.board import Board
+
+   board = Board.create_new()
+   # Do stuff ..
+   board.to_file('/my/fancy/project/title.kicad_pcb')
+
+Parse an already existing object, do some changes and reexport it:
+
+.. code-block:: python
+
+   from kiutils.board import Board
+
+   board = Board.from_file('/my/fancy/project/title.kicad_pcb')
+   # Do stuff ..
+   board.to_file()
+
+Note that the latter example omitted the path when calling ``to_file()``. The file path used when
+opening the original file will be used in this case. It is still possible to change the export
+path to somewhere different.
+
+Check the :doc:`examples` section for other stuff that can be done with ``kiutils``!
\ No newline at end of file
diff --git a/docs/usage/installation.rst b/docs/usage/installation.rst
new file mode 100644
index 0000000..418165d
--- /dev/null
+++ b/docs/usage/installation.rst
@@ -0,0 +1,12 @@
+Installation
+============
+
+The ``kiutils`` module is available on `PyPI `_. Use Python's ``pip`` to install it:
+
+.. code-block:: text
+
+   pip install kiutils
+
+The following is required to run ``kiutils``:
+
+- Python 3.7 or higher
diff --git a/items/fpitems.py b/items/fpitems.py
deleted file mode 100644
index 4432992..0000000
--- a/items/fpitems.py
+++ /dev/null
@@ -1,861 +0,0 @@
-"""Footprint graphical items define all of the drawing items that are used in the footprint
-definition. This includes text, text boxes, lines, rectangles, circles, arcs, polygons, curves
-and dimensions.
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    08.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_graphics_items
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-
-from kiutils.items.common import RenderCache, Stroke, Position, Effects
-from kiutils.utils.strings import dequote
-
-# FIXME: Several classes have a ``stroke`` member. This feature will be introduced in KiCad 7 and
-#        has yet to be tested here.
-
-@dataclass
-class FpText():
-    """The ``fp_text`` token defines a graphic line in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_text
-    """
-
-    type: str = "reference"
-    """The ``type`` attribute defines the type of text. Valid types are ``reference``, ``value``, and
-    ``user``"""
-
-    text: str = "%REF"
-    """The ``text`` attribute is a string that defines the text"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y position coordinates and optional orientation angle of
-    the text"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the text resides on"""
-
-    hide: bool = False
-    """The optional ``hide`` token, defines if the text is hidden"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is displayed"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the text object"""
-
-    renderCache: Optional[RenderCache] = None
-    """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token 
-    should be given in case the font can not be found on the current system.
-    
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpText:
-        """Convert the given S-Expresstion into a FpText object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_text ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_text
-
-        Returns:
-            - FpText: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_text':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.type = exp[1]
-        object.text = exp[2]
-        for item in exp[3:]:
-            if type(item) != type([]):
-                if item == 'hide': object.hide = True
-                continue
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        hide = ' hide' if self.hide else ''
-        unlocked = ' unlocked' if self.position.unlocked else ''
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-
-        expression =  f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"){hide}\n'
-        expression += f'{indents}  {self.effects.to_sexpr()}'
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        if self.renderCache is not None:
-            expression += self.renderCache.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class FpLine():
-    """The ``fp_line`` token defines a graphic line in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_line
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the upper left corner of the line"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the low right corner of the line"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the line resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the line. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the line. (version 7)"""
-
-    # FIXME: This is not implemented in to_sexpr() because it does not seem to be used on lines
-    #        in footprints. Further testing required ..
-    locked: bool = False
-    """The optional ``locked`` token defines if the line cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the line object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpLine:
-        """Convert the given S-Expresstion into a FpLine object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_line ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_line
-
-        Returns:
-            - FpLine: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_line':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        return f'{indents}(fp_line (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{uuid}){endline}'
-
-@dataclass
-class FpRect():
-    """The ``fp_rect`` token defines a graphic rectangle in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_rectangle
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the upper left corner of the rectangle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the low right corner of the rectangle"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the rectangle resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the rectangle. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the rectangle. (version 7)"""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the rectangle is filled. Valid fill types are solid
-    and none. If not defined, the rectangle is not filled."""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the rectangle cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the rectangle object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpRect:
-        """Convert the given S-Expresstion into a FpRect object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_rect ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_rect
-
-        Returns:
-            - FpRect: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_rect':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = ' locked' if self.locked else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        return f'{indents}(fp_rect (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}'
-
-@dataclass
-class FpTextBox():
-    """The ``fp_text_box`` token defines a rectangle containing line-wrapped text.
-    
-    Available since KiCad v7
-    
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_text_box
-    """
-
-    locked: bool = False
-    """The ``locked`` token specifies if the text box can be moved. Defaults to ``False``."""
-
-    text: str = ""
-    """The ``text`` token defines the content of the text box. Defaults to an empty string."""
-
-    start: Optional[Position] = None
-    """The optional ``start`` token defines the top-left of a cardinally oriented text box"""
-
-    end: Optional[Position] = None
-    """The optional ``end`` token defines the bottom-right of a cardinally oriented text box"""
-
-    pts: List[Position] = field(default_factory=list)
-    """The ``pts`` token defines the four corners of a non-cardianlly oriented text box. The corners
-    must be in order, but the winding can be either direction."""
-
-    angle: Optional[float] = None
-    """The optional ``angle`` token defines the rotation of the text box in degrees.
-
-    Note:
-        - If ``angle`` is not given, or is a cardinal angle (0, 90, 180 or 270), then the text box
-        MUST have ``start`` and ``end`` tokens.
-        - If ``angle`` is given and is not a cardinal angle, then the text box MUST have a ``pts``
-        token (with 4 pts).
-    """
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the text box resides on. Defaults to
-    ``F.Cu``."""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` token defines the unique identifier of the text box"""
-
-    effects: Optional[Effects] = None
-    """The optional ``effects`` token describes the style of the text in the text box"""
-
-    stroke: Optional[Stroke] = None
-    """The optional ``stroke`` token describes the style of an optional border to be drawn around 
-    the text box"""
-
-    renderCache: Optional[RenderCache] = None
-    """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token 
-    should be given in case the font can not be found on the current system."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpTextBox:
-        """Convert the given S-Expression into a FpTextBox object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_text_box ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_text_box
-
-        Returns:
-            - FpTextBox: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_text_box':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        # Extract "locked" token, if any is present
-        if exp[1] == "locked" and not isinstance(exp[2], list):
-            object.locked = True
-            object.text = exp[2]
-            start_at = 3
-        else:
-            object.text = exp[1]
-            start_at = 2
-
-        for item in exp[start_at:]:
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.pts.append(Position().from_sexpr(point))
-            if item[0] == 'angle': object.angle = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'effects': object.effects = Effects.from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item)
-            if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item)
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Raises:
-            - Exception: When a non-cardinal angle is given and no corner points were defined using
-              the ``self.pts`` token
-            - Exception: When a cardinal angle or no angle is given and either start or end token
-              is undefined
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        if self.angle is not None and self.angle not in [0.0, 90.0, 180.0, 270.0]:
-            if len(self.pts) != 4:
-                raise Exception("None-cardinal angles must have exactly four corner points defined")
-        if self.angle is None or self.angle in [0.0, 90.0, 180.0, 270.0]:
-            if self.start is None or self.end is None:
-                raise Exception("No angle or a cardinal angle needs a start and end token defined")
-
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        angle = f'(angle {self.angle}) ' if self.angle is not None else ''
-        start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else ''
-        end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else ''
-        locked = ' locked' if self.locked else ''
-
-        expression = f'{indents}(fp_text_box{locked} "{dequote(self.text)}"\n'
-        if len(self.pts) == 4:
-            expression += f'{indents}  (pts\n'
-            expression += f'{indents}    (xy {self.pts[0].X} {self.pts[0].Y})      (xy {self.pts[1].X} {self.pts[1].Y})      (xy {self.pts[2].X} {self.pts[2].Y})      (xy {self.pts[3].X} {self.pts[3].Y})\n'
-            expression += f'{indents}  )\n'
-        expression += f'{indents}  {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n'
-        if self.effects is not None:
-            expression += self.effects.to_sexpr(indent+2)
-        if self.stroke is not None:
-            expression += self.stroke.to_sexpr(indent+2)
-        if self.renderCache is not None:
-            expression += self.renderCache.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class FpCircle():
-    """The ``fp_circle `` token defines a graphic circle in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_circle
-    """
-
-    center: Position = field(default_factory=lambda: Position())
-    """The ``center`` token defines the coordinates of the center of the circle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the low right corner of the circle"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the circle resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the circle. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the circle. (version 7)"""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the circle is filled. Valid fill types are ``solid``
-    and ``none``. If not defined, the circle is not filled."""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the circle cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the circle object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpCircle:
-        """Convert the given S-Expresstion into a FpCircle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_circle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_circle
-
-        Returns:
-            - FpCircle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_circle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'center': object.center = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = ' locked' if self.locked else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        return f'{indents}(fp_circle (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}'
-
-@dataclass
-class FpArc():
-    """The ``fp_arc`` token defines a graphic arc in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_arc
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the start position of the arc radius"""
-
-    mid: Position = field(default_factory=lambda: Position())
-    """The ``mid`` token defines the coordinates of the midpoint along the arc"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the end position of the arc radius"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the arc resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the arc. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the arc. (version 7)"""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the arc cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the arc object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpArc:
-        """Convert the given S-Expresstion into a FpArc object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_arc ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_arc
-
-        Returns:
-            - FpArc: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_arc':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'mid': object.mid = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = ' locked' if self.locked else ''
-
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        return f'{indents}(fp_arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}'
-
-@dataclass
-class FpPoly():
-    """The ``fp_poly`` token defines a graphic polygon in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_polygon
-    """
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the polygon resides on"""
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` define the list of X/Y coordinates of the polygon outline"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the polygon. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the polygon. (version 7)"""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the polygon is filled. Valid fill types are solid
-    and none. If not defined, the rectangle is not filled."""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the polygon cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the polygon object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpPoly:
-        """Convert the given S-Expresstion into a FpPoly object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_poly ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_poly
-
-        Returns:
-            - FpPoly: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_poly':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(point))
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the polygon, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = ' locked' if self.locked else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        expression = f'{indents}(fp_poly (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  ) (layer "{dequote(self.layer)}"){width}{fill}{locked}{uuid}){endline}'
-        return expression
-
-@dataclass
-class FpCurve():
-    """The ``fp_curve`` token defines a graphic Cubic Bezier curve in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_curve
-    """
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` define the list of X/Y coordinates of the curve outline"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the curve resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the curve. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None   # Used for KiCad >= 7
-    """The ``stroke`` describes the line width and style of the curve. (version 7)"""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the curve cannot be edited"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the curve object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FpCurve:
-        """Convert the given S-Expresstion into a FpCurve object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fp_curve ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_curve
-
-        Returns:
-            - FpCurve: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fp_curve':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(point))
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width':
-                object.width = item[1]
-                object.stroke = None
-            if item[0] == 'stroke':
-                object.stroke = Stroke.from_sexpr(item)
-                object.width = None
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the curve, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = ' locked' if self.locked else ''
-
-        if self.width is not None:
-            width = f' (width {self.width})'
-        elif self.stroke is not None:
-            width = f' {self.stroke.to_sexpr(indent=0, newline=False)}'
-        else:
-            width = ''
-
-        expression = f'{indents}(fp_curve (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}  (xy {point.X} {point.Y})\n'
-        expression += f'{indents}) (layer "{dequote(self.layer)}"){width}{locked}{uuid}){endline}'
-        return expression
diff --git a/items/zones.py b/items/zones.py
deleted file mode 100644
index e54945f..0000000
--- a/items/zones.py
+++ /dev/null
@@ -1,657 +0,0 @@
-"""The zone token defines a zone on the board or footprint. Zones serve two purposes in
-   KiCad: filled copper zones and keep out areas.
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    11.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_graphics_items
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-
-from kiutils.items.common import Position
-from kiutils.utils.strings import dequote
-
-@dataclass
-class KeepoutSettings():
-    """The ``keepout `` token attributes define which objects should be kept out of the
-    zone. This section only applies to keep out zones.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_keep_out_settings
-    """
-
-    tracks: str = "allowed"
-    """The ``tracks`` token attribute defines whether or not tracks should be excluded
-    from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``."""
-
-    vias: str = "allowed"
-    """The ``vias`` token attribute defines whether or not vias should be excluded from
-    the keep out area. Valid attributes are ``allowed`` and ``not_allowed``."""
-
-    pads: str = "allowed"
-    """The ``pads`` token attribute defines whether or not pads should be excluded from
-    the keep out area. Valid attributes are ``allowed`` and ``not_allowed``."""
-
-    copperpour: str = "not-allowed"
-    """The ``copperpour`` token attribute defines whether or not copper pours should be
-    excluded from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``."""
-
-    footprints: str = "not-allowed"
-    """The ``footprints`` token attribute defines whether or not footprints should be
-    excluded from the keep out area. Valid attributes are ``allowed`` and ``not_allowed``."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> KeepoutSettings:
-        """Convert the given S-Expresstion into a KeepoutSettings object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(keepout ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not keepout
-
-        Returns:
-            - KeepoutSettings: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'keepout':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                continue
-
-            if item[0] == 'tracks': object.tracks = item[1]
-            if item[0] == 'vias': object.vias = item[1]
-            if item[0] == 'pads': object.pads = item[1]
-            if item[0] == 'copperpour': object.copperpour = item[1]
-            if item[0] == 'footprints': object.footprints = item[1]
-
-        return object
-
-    def to_sexpr(self, indent: int = 0, newline: bool = False) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the curve, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        # KiCad seems to add a whitespace to the pad token here
-        return f'{indents}(keepout (tracks {self.tracks}) (vias {self.vias}) (pads {self.pads} ) (copperpour {self.copperpour}) (footprints {self.footprints})){endline}'
-
-@dataclass
-class FillSettings():
-    """The ``fill`` token attributes define how the zone is to be filled.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_settings
-    """
-
-    yes: bool = False
-    """The ``yes`` token specifies if the zone should be filled. If not specified, the zone is
-    not filled and no additional attributes are required."""
-
-    mode: Optional[str] = None
-    """The optional ``mode`` token attribute defines how the zone is filled. The only valid fill
-    mode is ``hatched``. When not defined, the fill mode is solid."""
-
-    thermalGap: Optional[float] = None
-    """The optional ``thermalGap`` token attribute defines the distance from the zone to all
-    pad thermal relief connections to the zone."""
-
-    thermalBridgeWidth: Optional[float] = None
-    """The optional ``thermalBridgeWidth`` token attribute defines the spoke width for all
-    pad thermal relief connection to the zone."""
-
-    smoothingStyle: Optional[str] = None
-    """The optional ``smoothingStyle`` token attributes define the style of corner smoothing. Valid
-    smoothing styles are ``chamfer`` and ``fillet``"""
-
-    smoothingRadius: Optional[float] = None
-    """The optional ``smoothingRadius`` token attributes define the radius of corner smoothing"""
-
-    islandRemovalMode: Optional[int] = None
-    """The optional ``islandRemovalMode`` token attribute defines the island removal mode.
-    Valid island removal modes are:
-    - 0: Always remove islands.
-    - 1: Never remove islands.
-    - 2: Minimum area island to allow.
-    """
-
-    islandAreaMin: Optional[float] = None
-    """The optional ``islandAreaMin`` token attribute defines the minimum allowable zone
-      island. This only valid when the remove islands mode is set to 2."""
-
-    hatchThickness: Optional[float] = None
-    """The optional ``hatchThickness`` token attribute defines the thickness for hatched fills"""
-
-    hatchGap: Optional[float] = None
-    """The optional ``hatchGap`` token attribute defines the distance between lines for hatched
-    fills"""
-
-    hatchOrientation: Optional[float] = None
-    """The optional ``hatchOrientation`` token attribute defines the line angle for hatched fills"""
-
-    hatchSmoothingLevel: Optional[int] = None
-    """The optional ``hatchSmoothingLevel`` token attribute defines how hatch outlines are
-    smoothed. Valid hatch smoothing levels are:
-    - 0: No smoothing
-    - 1: Fillet
-    - 2: Arc minimum
-    - 3: Arc maximum
-    """
-
-    hatchSmoothingValue: Optional[float] = None
-    """The optional ``hatchSmoothingValue`` token attribute defines the ratio between the hole
-    and the chamfer/fillet size"""
-
-    hatchBorderAlgorithm: Optional[int] = None
-    """The optional ``hatchBorderAlgorithm`` token attribute defines the if the zone line
-    thickness is used when performing a hatch fill. Valid values for the hatch border
-    algorithm are:
-    - 0: Use zone minimum thickness.
-    - 1: Use hatch thickness.
-    """
-
-    hatchMinHoleArea: Optional[float] = None
-    """The optional ``hatchMinHoleArea`` token attribute defines the minimum area a hatch file hole can be"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FillSettings:
-        """Convert the given S-Expresstion into a FillSettings object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fill ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fill
-
-        Returns:
-            - FillSettings: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fill':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'yes': object.yes = True
-                else: continue
-
-            if item[0] == 'mode': object.mode = item[1]
-            if item[0] == 'thermal_gap': object.thermalGap = item[1]
-            if item[0] == 'thermal_bridge_width': object.thermalBridgeWidth = item[1]
-            if item[0] == 'smoothing': object.smoothingStyle = item[1]
-            if item[0] == 'radius': object.smoothingRadius = item[1]
-            if item[0] == 'island_removal_mode': object.islandRemovalMode = item[1]
-            if item[0] == 'island_area_min': object.islandAreaMin = item[1]
-            if item[0] == 'hatch_thickness': object.hatchThickness = item[1]
-            if item[0] == 'hatch_gap': object.hatchGap = item[1]
-            if item[0] == 'hatch_orientation': object.hatchOrientation = item[1]
-            if item[0] == 'hatch_smoothing_level': object.hatchSmoothingLevel = item[1]
-            if item[0] == 'hatch_smoothing_value': object.hatchSmoothingValue = item[1]
-            if item[0] == 'hatch_border_algorithm': object.hatchBorderAlgorithm = item[1]
-            if item[0] == 'hatch_min_hole_area': object.hatchMinHoleArea = item[1]
-
-        return object
-
-    def to_sexpr(self, indent: int = 0, newline: bool = False) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the curve, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        yes = ' yes' if self.yes else ''
-        mode = f' (mode {self.mode})' if self.mode is not None else ''
-        smoothing = f' (smoothing {self.smoothingStyle})' if self.smoothingStyle is not None else ''
-        radius = f' (radius {self.smoothingRadius})' if self.smoothingRadius is not None else ''
-        irm = f' (island_removal_mode {self.islandRemovalMode})' if self.islandRemovalMode is not None else ''
-        iam = f' (island_area_min {self.islandAreaMin})' if self.islandAreaMin is not None else ''
-        ht = f'\n{indents}  (hatch_thickness {self.hatchThickness})' if self.hatchThickness is not None else ''
-        hg = f' (hatch_gap {self.hatchGap})' if self.hatchGap is not None else ''
-        ho = f' (hatch_orientation {self.hatchOrientation})' if self.hatchOrientation is not None else ''
-        hsl = f'\n{indents}  (hatch_smoothing_level {self.hatchSmoothingLevel})' if self.hatchSmoothingLevel is not None else ''
-        hsv = f' (hatch_smoothing_value {self.hatchSmoothingValue})' if self.hatchSmoothingValue is not None else ''
-        hba = f'\n{indents}  (hatch_border_algorithm {self.hatchBorderAlgorithm})' if self.hatchBorderAlgorithm is not None else ''
-        hmha = f' (hatch_min_hole_area {self.hatchMinHoleArea})' if self.hatchMinHoleArea is not None else ''
-
-        return f'{indents}(fill{yes}{mode} (thermal_gap {self.thermalGap}) (thermal_bridge_width {self.thermalBridgeWidth}){smoothing}{radius}{irm}{iam}{ht}{hg}{ho}{hsl}{hsv}{hba}{hmha}){endline}'
-
-@dataclass
-class ZonePolygon():
-    """The ``polygon`` token defines a list of coordinates that define part of a zone"""
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` defines the list of polygon X/Y coordinates used to define the zone polygon"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> ZonePolygon:
-        """Convert the given S-Expresstion into a ZonePolygon object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(polygon ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not polygon
-
-        Returns:
-            - ZonePolygon: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'polygon':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                continue
-            if item[0] == 'pts':
-                for position in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(position))
-
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the polygon, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object. If the polygon has no coordinates, an empty 
-                   expression is returned.
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        expression =  f'{indents}(polygon\n'
-        expression += f'{indents}  (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  )\n'
-        expression += f'{indents})\n'
-        return expression
-
-@dataclass
-class FilledPolygon():
-    """The ``filled_polygon`` token defines the polygons used to fill a zone
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_polygons
-    """
-
-    layer: str = "F.Cu"
-    """The ``layer`` token attribute defines the canonical layer the zone fill resides on"""
-
-    # TODO: What is the definiton of this token?
-    island: bool = False
-    """The ``island`` token's definition has to be defined .."""
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` defines the list of polygon X/Y coordinates used to fill the zone"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FilledPolygon:
-        """Convert the given S-Expresstion into a FilledPolygon object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(filled_polygon ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not filled_polygon
-
-        Returns:
-            - FilledPolygon: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'filled_polygon':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                continue
-
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'island': object.island = True
-            if item[0] == 'pts':
-                for position in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(position))
-
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the filled polygon, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object. If the filled polygon has no coordinates, an empty 
-                   expression is returned.
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        expression =  f'{indents}(filled_polygon\n'
-        expression += f'{indents}  (layer "{dequote(self.layer)}")\n'
-        if self.island:
-            expression += f'{indents}  (island)\n'
-        expression += f'{indents}  (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  )\n'
-        expression += f'{indents})\n'
-        return expression
-
-# TODO: This is KiCad 4 stuff, has to be tested yet ..
-@dataclass
-class FillSegments():
-    """The ``fill_polygon`` token defines the segments used to fill the zone. This is only
-       used when loading boards prior to version 4 which filled zones with segments.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone_fill_segments
-    """
-
-    layer: str = "F.Cu"
-    """The ``layer`` token attribute defines the canonical layer the zone fill resides on"""
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` defines the list of polygon X/Y coordinates used to fill the zone."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> FillSegments:
-        """Convert the given S-Expresstion into a FillSegments object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fill_segments ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fill_segments
-
-        Returns:
-            - FillSegments: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fill_segments':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                continue
-
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'pts':
-                for position in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(position))
-
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the curve, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object. If the fill segments has no coordinates, an empty 
-              expression is returned.
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        expression =  f'{indents}(fill_segments\n'
-        expression += f'{indents}  (layer "{dequote(self.layer)}")\n'
-        expression += f'{indents}  (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  )\n'
-        expression += f'{indents})\n'
-        return expression
-
-@dataclass
-class Hatch():
-    """Data wrapper for Zone class hatching attribute"""
-
-    style: str = "none"
-    """The ``style`` token defines the style of the hatching. Valid hatch styles are ``none``, ``edge``
-    and ``full``"""
-
-    pitch: float = 0.0
-    """The ``pitch`` token defines the pitch of the hatch"""
-
-@dataclass
-class Zone():
-    """The ``zone`` token defines a zone on the board or footprint. Zones serve two purposes
-       in KiCad: filled copper zones and keep out areas.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_zone
-
-    """
-    locked: bool = False
-    """The ``locked`` token defines if the zone may be edited or not (Missing in KiCad
-    docu as of 11.02.2022)"""
-
-    net: int = 0
-    """The ``net`` token attribute defines by the net ordinal number which net in the nets
-    section that the zone is part of"""
-
-    netName: str = "unknown"
-    """The ``net_name`` token attribute defines the name of the net if the zone is not a keep
-    out area. The net name attribute will be an empty string if the zone is a keep out area."""
-
-    layers: List[str] = field(default_factory=list)
-    """The ``layers`` token define the canonical layer set the zone connects as a list of
-    strings. When the zone only resides on one layer, the output of ``self.to_sexpr()`` will
-    change into ``(layer "xyz")`` instead of ``(layers ..)`` automatically."""
-
-    uuid: Optional[str] = None       # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the zone object"""
-
-    name: Optional[str] = None
-    """The optional ``name`` token attribute defines the name of the zone if one has been assigned"""
-
-    hatch: Hatch = field(default_factory=lambda: Hatch())
-    """The ``hatch`` token attributes define the zone outline display hatch style and pitch"""
-
-    priority: Optional[int] = None
-    """The optional ``priority`` attribute defines the zone priority if it is not zero"""
-
-    connectPads: Optional[str] = None  # This refers to CONNECTION_TYPE in the docu
-    """The ``connectPads`` token attributes define the pad connection type and clearance. Valid
-    pad connection types are ``thru_hole_only``, ``full`` and ``no``. If the pad connection type is not
-    defined, thermal relief pad connections are used"""
-
-    clearance: float = 0.254
-    """The ``clearance`` token defines the thermal relief for pad connections. The usage of this
-    token is depending on the value of ``connectPads``."""
-
-    minThickness: float = 0.254
-    """The ``minThickness`` token attributed defines the minimum fill width allowed in the zone"""
-
-    filledAreasThickness: Optional[str] = None
-    """The optional ``filledAreasThickness`` attribute no specifies if the zone like width is
-    not used when determining the zone fill area. This is to maintain compatibility with older
-    board files that included the line thickness when performing zone fills when it is not defined."""
-
-    keepoutSettings: Optional[KeepoutSettings] = None
-    """The optional ``keepoutSettings`` section defines the keep out items if the zone
-    defines as a keep out area"""
-
-    fillSettings: Optional[FillSettings] = None
-    """The optional ``fillSettings`` section defines how the zone is to be filled"""
-
-    polygons: List[ZonePolygon] = field(default_factory=list)
-    """The ``polygon`` token defines a list of zone polygons that define the shape of the zone"""
-
-    filledPolygons: List[FilledPolygon] = field(default_factory=list)
-    """The ``filledPolygons`` token defines a list of filled polygons in the zone"""
-
-    # TODO: This is KiCad 4 only stuff, needs to be tested yet ..
-    fillSegments: Optional[FillSegments] = None
-    """The optional ``fillSegments`` section defines a list of track segments used to fill
-    the zone"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Zone:
-        """Convert the given S-Expresstion into a Zone object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(zone ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not zone
-
-        Returns:
-            - Zone: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'zone':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                else: continue
-
-            if item[0] == 'net': object.net = item[1]
-            if item[0] == 'net_name': object.netName = item[1]
-            if item[0] == 'layers' or item[0] == 'layer':
-                for layer in item[1:]:
-                    object.layers.append(layer)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'hatch':
-                object.hatch = Hatch(style=item[1], pitch=item[2])
-            if item[0] == 'priority': object.priority = item[1]
-            if item[0] == 'connect_pads':
-                if len(item) == 2:
-                    object.clearance = item[1][1]
-                else:
-                    object.connectPads = item[1]
-                    object.clearance = item[2][1]
-            if item[0] == 'min_thickness': object.minThickness = item[1]
-            if item[0] == 'filled_areas_thickness': object.filledAreasThickness = item[1]
-            if item[0] == 'keepout': object.keepoutSettings = KeepoutSettings().from_sexpr(item)
-            if item[0] == 'fill': object.fillSettings = FillSettings().from_sexpr(item)
-            if item[0] == 'polygon': object.polygons.append(ZonePolygon().from_sexpr(item))
-            if item[0] == 'filled_polygon': object.filledPolygons.append(FilledPolygon().from_sexpr(item))
-            if item[0] == 'fill_segments': object.fillSegments = FillSegments().from_sexpr(item)
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Raises:
-            - Exception: When the zone has no elements in its layer list
-
-        Returns:
-            - str: S-Expression of this object.
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        locked = f' locked' if self.locked else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        name = f' (name "{dequote(self.name)}")' if self.name is not None else ''
-        contype = f' {self.connectPads}' if self.connectPads is not None else ''
-        fat = f' (filled_areas_thickness {self.filledAreasThickness})' if self.filledAreasThickness is not None else ''
-        layers, layer_token = '', ''
-        for layer in self.layers:
-            layers += f' "{dequote(layer)}"'
-            
-        if len(self.layers) == 0:
-            raise Exception("Zone: No layers set for this zone")
-        elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu":
-            layer_token = f' (layer{layers})'
-        else:
-            layer_token = f' (layers{layers})'
-
-        expression =  f'{indents}(zone{locked} (net {self.net}) (net_name "{dequote(self.netName)}"){layer_token}{uuid}{name} (hatch {self.hatch.style} {self.hatch.pitch})\n'
-        if self.priority is not None:
-            expression += f'{indents}  (priority {self.priority})\n'
-        expression += f'{indents}  (connect_pads{contype} (clearance {self.clearance}))\n'
-        expression += f'{indents}  (min_thickness {self.minThickness}){fat}\n'
-        if self.keepoutSettings is not None:
-            expression += f'{indents}  {self.keepoutSettings.to_sexpr()}\n'
-        if self.fillSettings is not None:
-            expression += self.fillSettings.to_sexpr(indent+2, True)
-
-        for polygon in self.polygons:
-            expression += polygon.to_sexpr(indent+2)
-
-        for polygon in self.filledPolygons:
-            expression += polygon.to_sexpr(indent+2)
-
-        # TODO: This is KiKad 4 stuff...
-        if self.fillSegments is not None:
-            expression += self.fillSegments.to_sexpr()
-        expression += f'{indents}){endline}'
-        return expression
diff --git a/kiutils/__init__.py b/kiutils/__init__.py
deleted file mode 100644
index b3ebde0..0000000
--- a/kiutils/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""Init script for kiutils
-
-Authors:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-"""
-
-# Intentionally left blank ..
\ No newline at end of file
diff --git a/kiutils/board.py b/kiutils/board.py
deleted file mode 100644
index 95f0959..0000000
--- a/kiutils/board.py
+++ /dev/null
@@ -1,323 +0,0 @@
-"""Class to manage KiCad boards
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    20.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List, Dict
-from os import path
-
-from kiutils.items.common import Group, Image, Net, PageSettings, TitleBlock
-from kiutils.items.zones import Zone
-from kiutils.items.brditems import *
-from kiutils.items.gritems import *
-from kiutils.items.dimensions import Dimension
-from kiutils.utils.strings import dequote
-from kiutils.utils import sexpr
-from kiutils.footprint import Footprint
-from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR, KIUTILS_CREATE_NEW_GENERATOR_STR
-
-@dataclass
-class Board():
-    """The ``board`` token defines a KiCad layout according to the board file format used in
-    ``.kicad_pcb`` files.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/
-    """
-    version: str = ""
-    """The ``version`` token defines the board version using the YYYYMMDD date format"""
-
-    generator: str = ""
-    """The ``generator`` token defines the program used to write the file"""
-
-    general: GeneralSettings = field(default_factory=lambda: GeneralSettings())
-    """The ``general`` token defines general information about the board"""
-
-    paper: PageSettings = field(default_factory=lambda: PageSettings())
-    """The ``paper`` token defines informations about the page itself"""
-
-    titleBlock: Optional[TitleBlock] = None
-    """The ``titleBlock`` token defines author, date, revision, company and comments of the board"""
-
-    layers: List[LayerToken] = field(default_factory=list)
-    """The ``layers`` token defines all of the layers used by the board"""
-
-    setup: SetupData = field(default_factory=lambda: SetupData())
-    """The ``setup`` token is used to store the current settings used by the board"""
-
-    properties: Dict[str, str] = field(default_factory=dict)
-    """The ``properties`` token holds a list of key-value properties of the board as a dictionary"""
-
-    nets: List[Net] = field(default_factory=list)
-    """The ``nets`` token defines a list of nets used in the layout"""
-
-    footprints: List[Footprint] = field(default_factory=list)
-    """The ``footprints`` token defines a list of footprints used in the layout"""
-
-    # TODO: Type hinting for this list
-    graphicItems: List = field(default_factory=list) # as in gritems.py
-    """The ``graphicItems`` token defines a list of graphical items used in the layout. Possible
-    tokens are found in ``kiutils.items.gritems``
-    
-    The ``Image`` token is supported since KiCad v7 and must be added into this list when used."""
-
-    traceItems: List = field(default_factory=list)
-    """The ``traceItems`` token defines a list of segments, arcs and vias used in the layout"""
-
-    zones: List[Zone] = field(default_factory=list)
-    """The ``zones`` token defines a list of zones used in the layout"""
-
-    dimensions: List[Dimension] = field(default_factory=list)
-    """The ``dimensions`` token defines a list of dimensions on the PCB"""
-
-    targets: List[Target] = field(default_factory=list)
-    """The ``targets`` token defines a list of target markers on the PCB"""
-
-    groups: List[Group] = field(default_factory=list)
-    """The ``groups`` token defines a list of groups used in the layout"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the board file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Board:
-        """Convert the given S-Expresstion into a Board object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(kicad_pcb ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not kicad_pcb
-
-        Returns:
-            - Board: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'kicad_pcb':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'generator': object.generator = item[1]
-            if item[0] == 'general': object.general = GeneralSettings().from_sexpr(item)
-            if item[0] == 'paper': object.paper = PageSettings().from_sexpr(item)
-            if item[0] == 'title_block': object.titleBlock = TitleBlock().from_sexpr(item)
-            if item[0] == 'layers':
-                for layer in item[1:]:
-                    object.layers.append(LayerToken().from_sexpr(layer))
-            if item[0] == 'setup': object.setup = SetupData().from_sexpr(item)
-            if item[0] == 'property': object.properties.update({item[1]: item[2]})
-            if item[0] == 'net': object.nets.append(Net().from_sexpr(item))
-            if item[0] == 'footprint': object.footprints.append(Footprint().from_sexpr(item))
-            if item[0] == 'gr_text': object.graphicItems.append(GrText().from_sexpr(item))
-            if item[0] == 'gr_text_box': object.graphicItems.append(GrTextBox().from_sexpr(item))
-            if item[0] == 'gr_line': object.graphicItems.append(GrLine().from_sexpr(item))
-            if item[0] == 'gr_rect': object.graphicItems.append(GrRect().from_sexpr(item))
-            if item[0] == 'gr_circle': object.graphicItems.append(GrCircle().from_sexpr(item))
-            if item[0] == 'gr_arc': object.graphicItems.append(GrArc().from_sexpr(item))
-            if item[0] == 'gr_poly': object.graphicItems.append(GrPoly().from_sexpr(item))
-            if item[0] == 'gr_curve': object.graphicItems.append(GrCurve().from_sexpr(item))
-            if item[0] == 'image': object.graphicItems.append(Image().from_sexpr(item))
-            if item[0] == 'dimension': object.dimensions.append(Dimension().from_sexpr(item))
-            if item[0] == 'target': object.targets.append(Target().from_sexpr(item))
-            if item[0] == 'segment': object.traceItems.append(Segment().from_sexpr(item))
-            if item[0] == 'arc': object.traceItems.append(Arc().from_sexpr(item))
-            if item[0] == 'via': object.traceItems.append(Via().from_sexpr(item))
-            if item[0] == 'zone': object.zones.append(Zone().from_sexpr(item))
-            if item[0] == 'group': object.groups.append(Group().from_sexpr(item))
-
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Board:
-        """Load a board directly from a KiCad board file (`.kicad_pcb`) and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - Footprint: Object of the Schematic class initialized with the given KiCad schematic
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def create_new(cls) -> Board:
-        """Creates a new empty board with its attributes set as KiCad would create it
-
-        Returns:
-            - Board: Empty board
-        """
-        board = cls(
-            version = KIUTILS_CREATE_NEW_VERSION_STR,
-            generator = KIUTILS_CREATE_NEW_GENERATOR_STR
-        )
-
-        # Add all standard layers to board
-        board.layers.extend([
-            LayerToken(ordinal=0, name='F.Cu', type='signal'), 
-            LayerToken(ordinal=31, name='B.Cu', type='signal'), 
-            LayerToken(ordinal=32, name='B.Adhes', type='user', userName="B.Adhesive"),
-            LayerToken(ordinal=33, name='F.Adhes', type='user', userName="F.Adhesive"),
-            LayerToken(ordinal=34, name='B.Paste', type='user'),
-            LayerToken(ordinal=35, name='F.Paste', type='user'),
-            LayerToken(ordinal=36, name='B.SilkS', type='user', userName="B.Silkscreen"),
-            LayerToken(ordinal=37, name='F.SilkS', type='user', userName="F.Silkscreen"),
-            LayerToken(ordinal=38, name='B.Mask', type='user'),
-            LayerToken(ordinal=39, name='F.Mask', type='user'),
-            LayerToken(ordinal=40, name='Dwgs.User', type='user', userName="User.Drawings"),
-            LayerToken(ordinal=41, name='Cmts.User', type='user', userName="User.Comments"),
-            LayerToken(ordinal=42, name='Eco1.User', type='user', userName="User.Eco1"),
-            LayerToken(ordinal=43, name='Eco2.User', type='user', userName="User.Eco2"),
-            LayerToken(ordinal=44, name='Edge.Cuts', type='user'),
-            LayerToken(ordinal=45, name='Margin', type='user'),
-            LayerToken(ordinal=46, name='B.CrtYd', type='user', userName="B.Courtyard"),
-            LayerToken(ordinal=47, name='F.CrtYd', type='user', userName="F.Courtyard"),
-            LayerToken(ordinal=48, name='B.Fab', type='user'),
-            LayerToken(ordinal=49, name='F.Fab', type='user'),
-            LayerToken(ordinal=50, name='User.1', type='user'),
-            LayerToken(ordinal=51, name='User.2', type='user'),
-            LayerToken(ordinal=52, name='User.3', type='user'),
-            LayerToken(ordinal=53, name='User.4', type='user'),
-            LayerToken(ordinal=54, name='User.5', type='user'),
-            LayerToken(ordinal=55, name='User.6', type='user'),
-            LayerToken(ordinal=56, name='User.7', type='user'),
-            LayerToken(ordinal=57, name='User.8', type='user'),
-            LayerToken(ordinal=58, name='User.9', type='user')
-        ])
-
-        # Append net0 to netlist
-        board.nets.append(Net())
-
-        return board
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        addNewLine = False
-
-        expression =  f'{indents}(kicad_pcb (version {self.version}) (generator {self.generator})\n\n'
-        expression += self.general.to_sexpr(indent+2) + '\n'
-        expression += self.paper.to_sexpr(indent+2)
-        if self.titleBlock is not None:
-            expression += self.titleBlock.to_sexpr(indent+2) + '\n'
-        expression += f'{indents}  (layers\n'
-        for layer in self.layers:
-            expression += layer.to_sexpr(indent+4)
-        expression += f'{indents}  )\n\n'
-        expression += self.setup.to_sexpr(indent+2) + '\n'
-        # Properties, if any
-        if len(self.properties) > 0:
-            for key, value in self.properties.items():
-                expression += f'  (property "{dequote(key)}" "{dequote(value)}")\n'
-            expression += '\n'
-
-        # Nets
-        if len(self.nets) > 0:
-            for net in self.nets:
-                expression += net.to_sexpr(indent=indent+2, newline=True)
-            expression += '\n'
-
-        # Footprints
-        for footprint in self.footprints:
-            expression += footprint.to_sexpr(indent+2, layerInFirstLine=True) + '\n'
-
-        # Lines, Texts, Arcs and other graphical items
-        if len(self.graphicItems) > 0:
-            addNewLine = True
-            for item in self.graphicItems:
-                if isinstance(item, GrPoly):
-                    expression += item.to_sexpr(indent+2, pts_newline=True)
-                else:
-                    expression += item.to_sexpr(indent+2)
-
-        # Dimensions
-        if len(self.dimensions) > 0:
-            addNewLine = True
-            for dimension in self.dimensions:
-                expression += dimension.to_sexpr(indent+2)
-
-        # Target markers:
-        if len(self.targets) > 0:
-            addNewLine = True
-            for target in self.targets:
-                expression += target.to_sexpr(indent+2)
-
-        if addNewLine:
-            expression += '\n'
-
-        # Segments, vias and arcs
-        if len(self.traceItems) > 0:
-            for item in self.traceItems:
-                expression += item.to_sexpr(indent+2)
-            expression += '\n'
-
-        # Zones
-        for zone in self.zones:
-            expression += zone.to_sexpr(indent+2)
-
-        # Groups
-        for group in self.groups:
-            expression += group.to_sexpr(indent+2)
-
-        expression += f'{indents}){endline}'
-        return expression
diff --git a/kiutils/dru.py b/kiutils/dru.py
deleted file mode 100644
index a1b5a4a..0000000
--- a/kiutils/dru.py
+++ /dev/null
@@ -1,315 +0,0 @@
-"""Classes for custom design rules (.kicad_dru) and its contents
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    26.06.2022 - created
-
-Documentation taken from:
-    ??? Syntax help in Pcbnew
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-from os import path
-
-from kiutils.utils import sexpr
-from kiutils.utils.strings import dequote
-
-@dataclass
-class Constraint():
-    """The ``Constraint`` token defines a design rule's constraint"""
-
-    type: str = "clearance"
-    """The ``type`` token defines the type of constraint. Defaults to ``clearance``. Allowed types:
-    - ``annular_width`` - Width of an annular ring
-    - ``clearance`` - Clearance between two items
-    - ``courtyard_clearance`` - Clearance between two courtyards
-    - ``diff_pair_gap`` - Gap between differential pairs
-    - ``diff_pair_uncoupled`` - ???
-    - ``disallow`` - ??? Do not allow this rule
-    - ``edge_clearance`` - Clearance between the item and board edges
-    - ``length`` - Length of the item
-    - ``hole_clearance`` - Clearance between the item and holes
-    - ``hole_size`` - Size of the holes associated with this item
-    - ``silk_clearance`` - Clearance to silk screen
-    - ``skew`` - Difference in length between the items associated with this constraint
-    - ``track_width`` - Width of the tracks associated with this constraint
-    - ``via_count`` - Number of vias
-    - ``via_diameter`` - Diameter of vias associated with this constraint
-    """
-
-    min: Optional[str] = None
-    """The ``min`` token defines the minimum allowed in this constraint"""
-
-    opt: Optional[str] = None
-    """The ``opt`` token defines the optimum allowed in this constraint"""
-
-    max: Optional[str] = None
-    """The ``max`` token defines the maximum allowed in this constraint"""
-
-    elements: List[str] = field(default_factory=list)
-    """The ``items`` token defines a list of zero or more element types to include in this constraint.
-    The following element types are available:
-    - ``buried_via``
-    - ``micro_via``
-    - ``via``
-    - ``graphic``
-    - ``hole``
-    - ``pad``
-    - ``text``
-    - ``track``
-    - ``zone``
-    """
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Constraint:
-        """Convert the given S-Expresstion into a Constraint object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(constraint ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the list's first parameter is not the ``(constraint ..)`` token
-
-        Returns:
-            - Constraint: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'constraint':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.type = exp[1]
-        for item in exp[2:]:
-            if type(item) != type([]):
-                object.elements.append(item)
-            if item[0] == 'min': object.min = item[1]
-            if item[0] == 'opt': object.opt = item[1]
-            if item[0] == 'max': object.max = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        min = f' (min "{dequote(self.min)}")' if self.min is not None else ''
-        opt = f' (opt "{dequote(self.opt)}")' if self.opt is not None else ''
-        max = f' (max "{dequote(self.max)}")' if self.max is not None else ''
-
-        elements = ' '+' '.join(self.elements) if (len(self.elements) > 0) else ''
-
-        return f'{indents}(constraint {self.type}{min}{opt}{max}{elements}){endline}'
-
-@dataclass
-class Rule():
-    """The ``Rule`` token defines a custom design rule"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the custom design rule"""
-
-    constraints: List[Constraint] = field(default_factory=list)
-    """The ``constraints`` token defines a list of constraints for this custom design rule"""
-
-    condition: str = ""
-    """The ``condition`` token defines the conditions that apply for this rule. Check KiCad syntax
-    reference for more information. Example rule:
-    - `A.inDiffPair('*') && !AB.isCoupledDiffPair()`"""
-
-    layer: Optional[str] = None
-    """The optional ``layer`` token defines the canonical layer the rule applys to"""
-
-    severity: Optional[str] = None
-    """The optional ``severity`` token defines the severity of the design rule. Valid values are
-    ``warning``, ``error``, ``exclusion`` or ``ignore``.
-    
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Rule:
-        """Convert the given S-Expresstion into a Rule object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(rule ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the list's first parameter is not the ``(rule ..)`` token
-
-        Returns:
-            - Rule: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'rule':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.name = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'constraint': object.constraints.append(Constraint().from_sexpr(item))
-            if item[0] == 'condition': object.condition = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'severity': object.severity = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 0):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-
-        expression = f'{indents}(rule "{dequote(self.name)}"\n'
-        if self.layer is not None:
-            expression += f'{indents}  (layer "{dequote(self.layer)}")\n'
-        for item in self.constraints:
-            expression += f'{indents}{item.to_sexpr(indent+2)}'
-        expression += f'{indents}  (condition "{dequote(self.condition)}")'
-        if self.severity is not None:
-            expression += f'\n{indents}  (severity {dequote(self.severity)})'
-        expression += ')\n'
-        return expression
-
-@dataclass
-class DesignRules():
-    """The ``DesignRules`` token defines a set of custom design rules (`.kicad_dru` files)"""
-
-    version: int = 1
-    """The ``version`` token defines the version of the file for the KiCad parser. Defaults to 1."""
-
-    rules: List[Rule] = field(default_factory=list)
-    """The ``rules`` token defines a list of custom design rules"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the schematic file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> DesignRules:
-        """Convert the given S-Expresstion into a DesignRules object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(version ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the list's first parameter is not the ``(version ..)`` token
-
-        Returns:
-            - DesignRules: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if not isinstance(exp[0], list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0][0] != 'version':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'rule': object.rules.append(Rule().from_sexpr(item))
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> DesignRules:
-        """Load a custom design rules set directly from a KiCad design rules file (`.kicad_dru`) and
-        sets the ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - Footprint: Object of the DesignRules class initialized with the given KiCad file
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            # This dirty fix adds opening and closing brackets `(..)` to the read input to enable
-            # the S-Expression parser to work for the DRU-format as well.
-            data = f'({infile.read()})'
-            item = cls.from_sexpr(sexpr.parse_sexp(data))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def create_new(cls) -> DesignRules:
-        """Creates a new empty design rules set as KiCad would create it
-
-        Returns:
-            - DesignRules: Empty design rules set
-        """
-        return cls(version=1)
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set,
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=False):
-        """Generate the S-Expression representing this object
-
-        Args:
-            indent (int, optional): Number of whitespaces used to indent the output. Defaults to 0.
-            newline (bool, optional): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression = f'{indents}(version {self.version})\n'
-
-        if len(self.rules):
-            expression += f'{indents}\n'
-            for rule in self.rules:
-                expression += f'{indents}{rule.to_sexpr(indent=indent)}'
-
-        return expression + endline
\ No newline at end of file
diff --git a/kiutils/footprint.py b/kiutils/footprint.py
deleted file mode 100644
index 826c9f4..0000000
--- a/kiutils/footprint.py
+++ /dev/null
@@ -1,1098 +0,0 @@
-"""Classes to manage KiCad footprints
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    02.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-footprint/
-"""
-
-from __future__ import annotations
-
-import calendar
-import datetime
-import re
-from dataclasses import dataclass, field
-from typing import Optional, List, Dict
-from os import path
-
-from kiutils.items.zones import Zone
-from kiutils.items.common import Image, Position, Coordinate, Net, Group, Font
-from kiutils.items.fpitems import *
-from kiutils.items.gritems import *
-from kiutils.utils import sexpr
-from kiutils.utils.strings import dequote, remove_prefix
-from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR
-
-@dataclass
-class Attributes():
-    """The ``attr`` token defines the list of attributes of a footprint.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_attributes
-    """
-
-    type: Optional[str] = None
-    """The optional ``type`` token defines the type of footprint. Valid footprint types are ``smd`` and
-    ``through_hole``. May be none when no attributes are set."""
-
-    boardOnly: bool = False
-    """The optional ``boardOnly`` token indicates that the footprint is only defined in the board
-    and has no reference to any schematic symbol"""
-
-    excludeFromPosFiles: bool = False
-    """The optional ``excludeFromPosFiles`` token indicates that the footprint position information
-    should not be included when creating position files"""
-
-    excludeFromBom: bool = False
-    """The optional ``excludeFromBom`` token indicates that the footprint should be excluded when
-    creating bill of materials (BOM) files"""
-
-    allowMissingCourtyard: bool = False
-    """The optional ``allowMissingCourtyard`` token indicates if the footprint generates a 
-    "missing courtyard" DRC violation.
-    
-    Available since KiCad 7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Attributes:
-        """Convert the given S-Expresstion into a Attributes object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(attr ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not attr
-
-        Returns:
-            - Attributes: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'attr':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        if len(exp) > 1:
-            # Attributes token may be set with no other items (empty attributes)
-            # Test case for this: test_fp_empty_attr.kicad_mod
-            if exp[1] == 'through_hole' or exp[1] == 'smd':
-                object.type = exp[1]
-
-        for item in exp:
-            if item == 'board_only': object.boardOnly = True
-            if item == 'exclude_from_pos_files': object.excludeFromPosFiles = True
-            if item == 'exclude_from_bom': object.excludeFromBom = True
-            if item == 'allow_missing_courtyard': object.allowMissingCourtyard = True
-        return object
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object. Will return an empty string, if the
-        following attributes are selected:
-        - ``type``: None
-        - ``boardOnly``: False
-        - ``excludeFromBom``: False
-        - ``excludeFromPosFiles``: False
-        - ``allowMissingCourtyard``: False
-
-        KiCad won't add the ``(attr ..)`` token to a footprint when this combination is selected.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        if (self.type == None
-            and self.boardOnly == False
-            and self.excludeFromBom == False
-            and self.excludeFromPosFiles == False
-            and self.allowMissingCourtyard == False):
-            return ''
-
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        type = f' {self.type}' if self.type is not None else ''
-
-        expression = f'{indents}(attr{type}'
-        if self.boardOnly: expression += ' board_only'
-        if self.excludeFromPosFiles: expression += ' exclude_from_pos_files'
-        if self.excludeFromBom: expression += ' exclude_from_bom'
-        if self.allowMissingCourtyard: expression += ' allow_missing_courtyard'
-        expression += f'){endline}'
-        return expression
-
-@dataclass
-class Model():
-    """The ``model`` token defines the 3D model associated with a footprint.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_3d_model
-    """
-
-    path: str = ""
-    """The ``path`` attribute is the path and file name of the 3D model"""
-
-    pos: Coordinate = field(default_factory=lambda: Coordinate(0.0, 0.0, 0.0))
-    """The ``pos`` token specifies the 3D position coordinates of the model relative to the footprint"""
-
-    scale: Coordinate = field(default_factory=lambda: Coordinate(1.0, 1.0, 1.0))
-    """The ``scale`` token specifies the model scale factor for each 3D axis"""
-
-    rotate: Coordinate = field(default_factory=lambda: Coordinate(0.0, 0.0, 0.0))
-    """The ``rotate`` token specifies the model rotation for each 3D axis relative to the footprint"""
-
-    hide: bool = False
-    """The `hide` token specifies if the 3d model is visible or not"""
-    
-    opacity: Optional[float] = None
-    """The optional opacity token specifies the opacity of the 3D model on a scale between 1.0 and 0.0."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Model:
-        """Convert the given S-Expresstion into a Model object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(model ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is not 5 long
-            - Exception: When the first item of the list is not model
-
-        Returns:
-            - Model: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 5:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'model':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.path = exp[1]
-
-        if exp[2] == 'hide':
-            object.hide = True
-
-        for e in exp[2:]:
-            if e[0] == 'opacity':
-                object.opacity = e[1]
-            elif e[0] == 'offset':
-                object.pos = Coordinate.from_sexpr(e[1])
-            elif e[0] == 'scale':
-                object.scale = Coordinate.from_sexpr(e[1])
-            elif e[0] == 'rotate':
-                object.rotate = Coordinate.from_sexpr(e[1])
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        hide = " hide" if self.hide else ""
-
-        expression =  f'{indents}(model "{dequote(self.path)}"{hide}\n'
-        if self.opacity is not None:
-            expression += f'{indents}  (opacity {self.opacity})\n'
-        expression += f'{indents}  (offset {self.pos.to_sexpr()})\n'
-        expression += f'{indents}  (scale {self.scale.to_sexpr()})\n'
-        expression += f'{indents}  (rotate {self.rotate.to_sexpr()})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class DrillDefinition():
-    """The ``drill`` token defines the drill attributes for a footprint pad.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_pad_drill_definition
-    """
-
-    oval: bool = False
-    """The ``oval`` token defines if the drill is oval instead of round"""
-
-    diameter: float = 0.0
-    """The ``diameter`` attribute defines the drill diameter"""
-
-    width: Optional[float] = None
-    """The optional ``width`` attribute defines the width of the slot for oval drills"""
-
-    offset: Optional[Position] = None
-    """The optional ``offset`` token defines the drill offset coordinates from the center of the pad"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> DrillDefinition:
-        """Convert the given S-Expresstion into a DrillDefinition object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(drill ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not drill
-
-        Returns:
-            - DrillDefinition: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'drill':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        # Depending on the ``oval`` token, the fields may be shifted ..
-        if exp[1] == 'oval':
-            object.oval = True
-            object.diameter = exp[2]
-            object.width = exp[3]
-        else:
-            object.diameter = exp[1]
-            if len(exp) > 2:
-                object.width = exp[2]
-
-        # The ``offset`` token may not be given
-        for item in exp:
-            if type(item) != type([]): continue
-            if item[0] == 'offset': object.offset = Position().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 0, newline: bool = False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        oval = f' oval' if self.oval else ''
-        width = f' {self.width}' if self.oval and self.width is not None else ''
-        offset = f' (offset {self.offset.X} {self.offset.Y})' if self.offset is not None else ''
-
-        return f'{indents}(drill{oval} {self.diameter}{width}{offset}){endline}'
-
-@dataclass
-class PadOptions():
-    """The ``options`` token attributes define the settings used for custom pads. This token is
-    only used when a custom pad is defined.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_custom_pad_options
-    """
-    clearance: str = "outline"
-    """The ``clearance`` token defines the type of clearance used for a custom pad. Valid clearance
-    types are ``outline`` and ``convexhull``."""
-
-    anchor: str = "rect"
-    """The ``anchor`` token defines the anchor pad shape of a custom pad. Valid anchor pad shapes
-    are rect and circle."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> PadOptions:
-        """Convert the given S-Expresstion into a PadOptions object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(options ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not options
-
-        Returns:
-            - PadOptions: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'options':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'clearance': object.clearance = item[1]
-            if item[0] == 'anchor': object.anchor = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 0, newline: bool = False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        return f'{indents}(options (clearance {self.clearance}) (anchor {self.anchor})){endline}'
-
-@dataclass
-class Pad():
-    """The ``pad`` token defines a pad in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint_pad
-    """
-
-    number: str = "x"
-    """The ``number`` attribute is the pad number"""
-
-    type: str = "smd"
-    """The pad ``type`` can be defined as ``thru_hole``, ``smd``, ``connect``, or ``np_thru_hole``"""
-
-    shape: str = "rect"
-    """The pad ``shape`` can be defined as ``circle``, ``rect``, ``oval``, ``trapezoid``, ``roundrect``, or
-    ``custom``"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and optional orientation angle of the pad"""
-
-    locked: bool = False
-    """The optional ``locked`` token defines if the footprint pad can be edited"""
-
-    size: Position = field(default_factory=lambda: Position())         # Size uses Position class for simplicity for now
-    """The ``size`` token defines the width and height of the pad"""
-
-    drill: Optional[DrillDefinition] = None
-    """The optional pad ``drill`` token defines the pad drill requirements"""
-
-    # TODO: Test case for one-layer pad??
-    layers: List[str] = field(default_factory=list)
-    """The ``layers`` token defines the layer or layers the pad reside on"""
-
-    property: Optional[str] = None
-    """The optional ``property`` token defines any special properties for the pad. Valid properties
-    are ``pad_prop_bga``, ``pad_prop_fiducial_glob``, ``pad_prop_fiducial_loc``, ``pad_prop_testpoint``,
-    ``pad_prop_heatsink``, ``pad_prop_heatsink``, and ``pad_prop_castellated``"""
-
-    removeUnusedLayers: bool = False
-    """The optional ``removeUnusedLayers`` token specifies that the copper should be removed from
-    any layers the pad is not connected to"""
-
-    keepEndLayers: bool = False
-    """The optional ``keepEndLayers`` token specifies that the top and bottom layers should be
-    retained when removing the copper from unused layers"""
-
-    roundrectRatio: Optional[float] = None
-    """The optional ``roundrectRatio`` token defines the scaling factor of the pad to corner radius
-    for rounded rectangular and chamfered corner rectangular pads. The scaling factor is a
-    number between 0 and 1."""
-
-    chamferRatio: Optional[float] = None   # Adds a newline before
-    """The optional ``chamferRatio`` token defines the scaling factor of the pad to chamfer size.
-    The scaling factor is a number between 0 and 1."""
-
-    chamfer: List[str] = field(default_factory=list)
-    """The optional ``chamfer`` token defines a list of one or more rectangular pad corners that
-    get chamfered. Valid chamfer corner attributes are ``top_left``, ``top_right``, ``bottom_left``,
-    and ``bottom_right``."""
-
-    net: Optional[Net] = None
-    """The optional ``net`` token defines the integer number and name string of the net connection
-    for the pad."""
-
-    uuid: Optional[str] = None           # Used since KiCad 6
-    """The optional ``uuid`` token defines the unique identifier of the pad object"""
-
-    pinFunction: Optional[str] = None
-    """The optional ``pinFunction`` token attribute defines the associated schematic symbol pin name"""
-
-    pinType: Optional[str] = None
-    """The optional ``pinType`` token attribute defines the associated schematic pin electrical type"""
-
-    dieLength: Optional[float] = None      # Adds a newline before
-    """The optional ``dieLength`` token attribute defines the die length between the component pad
-    and physical chip inside the component package"""
-
-    solderMaskMargin: Optional[float] = None
-    """The optional ``solderMaskMargin`` token attribute defines the distance between the pad and
-    the solder mask for the pad. If not set, the footprint solder_mask_margin is used."""
-
-    solderPasteMargin: Optional[float] = None
-    """The optional ``solderPasteMargin`` token attribute defines the distance the solder paste
-    should be changed for the pad"""
-
-    solderPasteMarginRatio: Optional[float] = None
-    """The optional ``solderPasteMarginRatio`` token attribute defines the percentage to reduce the
-    pad outline by to generate the solder paste size"""
-
-    clearance: Optional[float] = None
-    """The optional ``clearance`` token attribute defines the clearance from all copper to the pad.
-    If not set, the footprint clearance is used."""
-
-    zoneConnect: Optional[int] = None
-    """The optional ``zoneConnect`` token attribute defines type of zone connect for the pad. If
-    not defined, the footprint zone_connection setting is used. Valid connection types are
-    integers values from 0 to 3 which defines:
-    - 0: Pad is not connect to zone
-    - 1: Pad is connected to zone using thermal relief
-    - 2: Pad is connected to zone using solid fill
-    - 3: Only through hold pad is connected to zone using thermal relief
-    """
-
-    thermalWidth: Optional[float] = None
-    """The optional ``thermalWidth`` token attribute defines the thermal relief spoke width used for
-    zone connection for the pad. This only affects a pad connected to a zone with a thermal
-    relief. If not set, the footprint thermal_width setting is used."""
-
-    thermalGap: Optional[float] = None
-    """The optional ``thermalGap`` token attribute defines the distance from the pad to the zone of
-    the thermal relief connection for the pad. This only affects a pad connected to a zone
-    with a thermal relief. If not set, the footprint thermal_gap setting is used."""
-
-    customPadOptions: Optional[PadOptions] = None
-    """The optional ``customPadOptions`` token defines the options when a custom pad is defined"""
-
-    # Documentation seems wrong about primitives here. It seems like its just a list
-    # of graphical objects, but the docu suggests, besides the list, two other params
-    # for the primitive token: width and fill
-    # These two however are note generated under the primitive token from the KiCad
-    # generator. These two params may be found in gr_poly or gr_XX only.
-    # So for now, the custom pad primitives are only a list of graphical objects
-    customPadPrimitives: List = field(default_factory=list)
-    """The optional ``customPadPrimitives`` defines the drawing objects and options used to define
-    a custom pad"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Pad:
-        """Convert the given S-Expresstion into a Pad object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(pad ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not pad
-
-        Returns:
-            - Pad: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'pad':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.number = exp[1]
-        object.type = exp[2]
-        object.shape = exp[3]
-
-        for item in exp[3:]:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'size': object.size = Position().from_sexpr(item)
-            if item[0] == 'drill': object.drill = DrillDefinition().from_sexpr(item)
-            if item[0] == 'layers':
-                for layer in item[1:]:
-                    object.layers.append(layer)
-            if item[0] == 'property': object.property = item[1]
-            if item[0] == 'remove_unused_layers': object.removeUnusedLayers = True
-            if item[0] == 'keep_end_layers': object.keepEndLayers = True
-            if item[0] == 'roundrect_rratio': object.roundrectRatio = item[1]
-            if item[0] == 'chamfer_ratio': object.chamferRatio = item[1]
-            if item[0] == 'chamfer':
-                for chamfer in item[1:]:
-                    object.chamfer.append(chamfer)
-            if item[0] == 'net': object.net = Net().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'pinfunction': object.pinFunction = item[1]
-            if item[0] == 'pintype': object.pinType = item[1]
-            if item[0] == 'die_length': object.dieLength = item[1]
-            if item[0] == 'solder_mask_margin': object.solderMaskMargin = item[1]
-            if item[0] == 'solder_paste_margin': object.solderPasteMargin = item[1]
-            if item[0] == 'solder_paste_margin_ratio': object.solderPasteMarginRatio = item[1]
-            if item[0] == 'clearance': object.clearance = item[1]
-            if item[0] == 'zone_connect': object.zoneConnect = item[1]
-            if item[0] == 'thermal_width': object.thermalWidth = item[1]
-            if item[0] == 'thermal_gap': object.thermalGap = item[1]
-            if item[0] == 'options': object.customPadOptions = PadOptions().from_sexpr(item)
-            if item[0] == 'primitives':
-                for primitive in item[1:]:
-                    if primitive[0] == 'gr_text': object.customPadPrimitives.append(GrText().from_sexpr(primitive))
-                    if primitive[0] == 'gr_text_box': object.customPadPrimitives.append(GrTextBox().from_sexpr(primitive))
-                    if primitive[0] == 'gr_line': object.customPadPrimitives.append(GrLine().from_sexpr(primitive))
-                    if primitive[0] == 'gr_rect': object.customPadPrimitives.append(GrRect().from_sexpr(primitive))
-                    if primitive[0] == 'gr_circle': object.customPadPrimitives.append(GrCircle().from_sexpr(primitive))
-                    if primitive[0] == 'gr_arc': object.customPadPrimitives.append(GrArc().from_sexpr(primitive))
-                    if primitive[0] == 'gr_poly': object.customPadPrimitives.append(GrPoly().from_sexpr(primitive))
-                    if primitive[0] == 'gr_curve': object.customPadPrimitives.append(GrCurve().from_sexpr(primitive))
-
-                    # XXX: Are dimentions even implemented here?
-                    if primitive[0] == 'dimension': raise NotImplementedError("Dimensions are not yet handled! Please report this bug along with the file being parsed.")
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        champferFound, marginFound, schematicSymbolAssociated = False, False, False
-        c, cr, smm, spm, spmr, cl, zc, tw, tg = '', '', '', '', '', '', '', '', ''
-
-        layers = ' (layers'
-        for layer in self.layers:
-            # For some reason KiCad does not escape a layer with double-quotes if it has a
-            # wildcard (*) or an ampersant (&) in it
-            if "*." in layer or "&" in layer:
-                layers += f' {layer}'
-            else:
-                layers += f' "{dequote(layer)}"'
-
-        layers += ')'
-
-        locked = ' locked' if self.locked else ''
-        drill = f' {self.drill.to_sexpr()}' if self.drill is not None else ''
-        ppty = f' (property {self.property})' if self.property is not None else ''
-        rul = ' (remove_unused_layers)' if self.removeUnusedLayers else ''
-        kel = ' (keep_end_layers)' if self.keepEndLayers else ''
-        rrr = f' (roundrect_rratio {self.roundrectRatio})' if self.roundrectRatio is not None else ''
-
-        net = f' {self.net.to_sexpr()}' if self.net is not None else ''
-        pf = f' (pinfunction "{dequote(self.pinFunction)}")' if self.pinFunction is not None else ''
-        pt = f' (pintype "{dequote(self.pinType)}")' if self.pinType is not None else ''
-
-        # Check if a schematic symbol is associated with this footprint. This is usually set, if the
-        # footprint is used in a board file.
-        if net != '' or pf != '' or pt != '':
-            schematicSymbolAssociated = True
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-
-        if len(self.chamfer) > 0:
-            champferFound = True
-            c = ' (chamfer'
-            for chamfer in self.chamfer:
-                c += f' {chamfer}'
-            c += ')'
-        if self.chamferRatio is not None:
-            champferFound = True
-            cr = f' (chamfer_ratio {self.chamferRatio})'
-
-        if self.position.angle is not None:
-            position = f'(at {self.position.X} {self.position.Y} {self.position.angle})'
-        else:
-            position = f'(at {self.position.X} {self.position.Y})'
-
-        if self.solderMaskMargin is not None:
-            marginFound = True
-            smm = f' (solder_mask_margin {self.solderMaskMargin})'
-
-        if self.solderPasteMargin is not None:
-            marginFound = True
-            spm = f' (solder_paste_margin {self.solderPasteMargin})'
-
-        if self.solderPasteMarginRatio is not None:
-            marginFound = True
-            spmr = f' (solder_paste_margin_ratio {self.solderPasteMarginRatio})'
-
-        if self.clearance is not None:
-            marginFound = True
-            cl = f' (clearance {self.clearance})'
-
-        if self.zoneConnect is not None:
-            marginFound = True
-            zc = f' (zone_connect {self.zoneConnect})'
-
-        if self.thermalWidth is not None:
-            marginFound = True
-            tw = f' (thermal_width {self.thermalWidth})'
-
-        if self.thermalGap is not None:
-            marginFound = True
-            tg = f' (thermal_gap {self.thermalGap})'
-
-        expression =  f'{indents}(pad "{dequote(str(self.number))}" {self.type} {self.shape}{locked} {position} (size {self.size.X} {self.size.Y}){drill}{ppty}{layers}{rul}{kel}{rrr}'
-        if champferFound:
-            # Only one whitespace here as all temporary strings have at least one leading whitespace
-            expression += f'\n{indents} {cr}{c}'
-
-        if self.dieLength is not None:
-            expression += f'\n{indents}  (die_length {self.dieLength})'
-
-        if marginFound or schematicSymbolAssociated:
-            # Only one whitespace here as all temporary strings have at least one leading whitespace
-            expression += f'\n{indents} {net}{pf}{pt}{smm}{spm}{spmr}{cl}{zc}{tw}{tg}'
-
-        if self.customPadOptions is not None:
-            expression += f'\n{indents}  {self.customPadOptions.to_sexpr()}'
-
-        if self.customPadPrimitives is not None:
-            if len(self.customPadPrimitives) > 0:
-                expression += f'\n{indents}  (primitives'
-                for primitive in self.customPadPrimitives:
-                    expression += f'\n{primitive.to_sexpr(newline=False,indent=indent+4)}'
-                expression += f'\n{indents}  )'
-
-        expression += f'{uuid}){endline}'
-        return expression
-
-@dataclass
-class Footprint():
-    """The ``footprint`` token defines a footprint.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_footprint
-    """
-
-    @property
-    def libId(self) -> str:
-        """The ``lib_id`` token defines the link to footprint library of the footprint.
-        This only applies to footprints defined in the board file format, in a regular footprint 
-        file this id defines the footprint's name. In ``kiutils``, the token is a combination of
-        both the ``libraryNickname`` and ``entryName`` token. Setting the ``lib_id`` token will
-        update those tokens accordingly.
-
-        Returns:
-            - Symbol id in the following format: ``:`` or ````,
-              if ``libraryNickname`` token is not set.
-        """
-        if self.libraryNickname:
-            return f'{self.libraryNickname}:{self.entryName}'
-        else:
-            return f'{self.entryName}'
-
-    @libId.setter
-    def libId(self, symbol_id: str):
-        """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname`` and
-        ``entryName`` token.
-
-        Args:
-            - symbol_id (str): The symbol id in the following format: ``:``
-              or only ````
-        """
-        # kicad5 fix: module names may not be quoted strings (only numbers) - see PR #91
-        parse_symbol_id = re.match(r"^(.+?):(.+?)$", str(symbol_id))
-        if parse_symbol_id:
-            self.libraryNickname = parse_symbol_id.group(1)
-            self.entryName = parse_symbol_id.group(2)
-        else:
-            self.libraryNickname = None
-            self.entryName = symbol_id
-
-    libraryNickname: Optional[str] = None
-    """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to
-    and is a part of the ``id`` token"""
-    
-    entryName: str = None
-    """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id`` 
-    token"""
-
-    version: Optional[str] = None
-    """The ``version`` token attribute defines the symbol library version using the YYYYMMDD date format"""
-
-    generator: Optional[str] = None
-    """The ``generator`` token attribute defines the program used to write the file"""
-
-    locked: bool = False
-    """The optional ``locked`` token defines a flag to indicate the footprint cannot be edited"""
-
-    placed: bool = False
-    """The optional ``placed`` token defines a flag to indicate that the footprint has not been placed"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the footprint is placed"""
-
-    tedit: str = remove_prefix(hex(calendar.timegm(datetime.datetime.now().utctimetuple())), '0x')
-    """The ``tedit`` token defines a the last time the footprint was edited"""
-
-    uuid: Optional[str] = None
-    """The ``uuid`` token defines the unique identifier for the footprint. This only applies
-    to footprints defined in the board file format."""
-
-    position: Optional[Position] = None
-    """The ``position`` token defines the X and Y coordinates and rotational angle of the
-    footprint. This only applies to footprints defined in the board file format."""
-
-    description: Optional[str] = None
-    """The optional ``description`` token defines a string containing the description of the footprint"""
-
-    tags: Optional[str] = None
-    """The optional ``tags`` token defines a string of search tags for the footprint"""
-
-    properties: Dict = field(default_factory=dict)
-    """The ``properties`` token defines dictionary of properties as key / value pairs where key being
-    the name of the property and value being the description of the property"""
-
-    path: Optional[str] = None
-    """The ``path`` token defines the hierarchical path of the schematic symbol linked to the footprint.
-    This only applies to footprints defined in the board file format."""
-
-    autoplaceCost90: Optional[int] = None
-    """The optional ``autoplaceCost90`` token defines the vertical cost of when using the automatic
-    footprint placement tool. Valid values are integers 1 through 10. This only applies to footprints
-    defined in the board file format."""
-
-    autoplaceCost180: Optional[int] = None
-    """The optional ``autoplaceCost180`` token defines the horizontal cost of when using the automatic
-    footprint placement tool. Valid values are integers 1 through 10. This only applies to footprints
-    defined in the board file format."""
-
-    solderMaskMargin: Optional[float] = None
-    """The optional ``solderMaskMargin`` token defines the solder mask distance from all pads in the
-    footprint. If not set, the board solder_mask_margin setting is used."""
-
-    solderPasteMargin: Optional[float] = None
-    """The optional ``solderPasteMargin`` token defines the solder paste distance from all pads in
-    the footprint. If not set, the board solder_paste_margin setting is used."""
-
-    solderPasteRatio: Optional[float] = None
-    """The optional ``solderPasteRatio`` token defines the percentage of the pad size used to define
-    the solder paste for all pads in the footprint. If not set, the board solder_paste_ratio setting
-    is used."""
-
-    clearance: Optional[float] = None
-    """The optional ``clearance`` token defines the clearance to all board copper objects for all pads
-    in the footprint. If not set, the board clearance setting is used."""
-
-    zoneConnect: Optional[int] = None
-    """The optional ``zoneConnect`` token defines how all pads are connected to filled zone. If not
-    defined, then the zone connect_pads setting is used. Valid connection types are integers values
-    from 0 to 3 which defines:
-      - 0: Pads are not connect to zone
-      - 1: Pads are connected to zone using thermal reliefs
-      - 2: Pads are connected to zone using solid fill
-      - 3: Only through hold pads are connected to zone using thermal reliefs
-    """
-
-    thermalWidth: Optional[float] = None
-    """The optional ``thermalWidth`` token defined the thermal relief spoke width used for zone connections
-    for all pads in the footprint. This only affects pads connected to zones with thermal reliefs. If
-    not set, the zone thermal_width setting is used."""
-
-    thermalGap: Optional[float] = None
-    """The optional ``thermalGap`` is the distance from the pad to the zone of thermal relief connections
-    for all pads in the footprint. If not set, the zone thermal_gap setting is used. If not set, the
-    zone thermal_gap setting is used."""
-
-    attributes: Attributes = field(default_factory=lambda: Attributes())
-    """The optional ``attributes`` section defines the attributes of the footprint"""
-
-    privateLayers: List[str] = field(default_factory=list)
-    """The optional ``privateLayers`` token defines a list of private layers assigned to the footprint.
-    Valid values are: ``User.[1-9]``, ``User.Drawings``, ``User.Comments``, ``User.Eco[1-2]``.
-    
-    Available since KiCad v7."""
-
-    netTiePadGroups: List[str] = field(default_factory=list)
-    """The optional ``netTiePadGroups`` token defines a list of net tie groups assigned to the 
-    footprint. 
-    
-    Available since KiCad v7."""
-
-    # TODO: Type hinting for this list
-    graphicItems: List = field(default_factory=list)
-    """The ``graphic`` objects section is a list of one or more graphical objects in the footprint. 
-    Possible items are defined in ``kiutils.items.fpitems``. At minimum the reference designator 
-    and value text objects are defined. All other graphical objects are optional.
-
-    The ``Image`` token is supported since KiCad v7 and must be added into this list when used."""
-
-    pads: List[Pad] = field(default_factory=list)
-    """The optional ``pads`` section is a list of pads in the footprint"""
-
-    zones: List[Zone] = field(default_factory=list)
-    """The optional ``zones`` section is a list of keep out zones in the footprint"""
-
-    groups: List[Group] = field(default_factory=list)
-    """The optional ``groups`` section is a list of grouped objects in the footprint"""
-
-    models: List[Model] = field(default_factory=list)
-    """The ``3D model`` section defines the 3D model object associated with the footprint"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the library file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Footprint:
-        """Convert the given S-Expresstion into a Footprint object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(footprint ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not footprint
-
-        Returns:
-            - Footprint: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'module' and exp[0] != 'footprint':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.libId = exp[1]
-        for item in exp[2:]:
-            if not isinstance(item, list):
-                if item == 'locked': object.locked = True
-                if item == 'placed': object.placed = True
-                continue
-
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'generator': object.generator = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'tedit': object.tedit = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'descr': object.description = item[1]
-            if item[0] == 'tags': object.tags = item[1]
-            if item[0] == 'path': object.path = item[1]
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'autoplace_cost90': object.autoplaceCost90 = item[1]
-            if item[0] == 'autoplace_cost180': object.autoplaceCost180 = item[1]
-            if item[0] == 'solder_mask_margin': object.solderMaskMargin = item[1]
-            if item[0] == 'solder_paste_margin': object.solderPasteMargin = item[1]
-            if item[0] == 'solder_paste_ratio': object.solderPasteRatio = item[1]
-            if item[0] == 'clearance': object.clearance = item[1]
-            if item[0] == 'zone_connect': object.zoneConnect = item[1]
-            if item[0] == 'thermal_width': object.thermalWidth = item[1]
-            if item[0] == 'thermal_gap': object.thermalGap = item[1]
-            if item[0] == 'attr': object.attributes = Attributes.from_sexpr(item)
-            if item[0] == 'model': object.models.append(Model.from_sexpr(item))
-            if item[0] == 'fp_text': object.graphicItems.append(FpText.from_sexpr(item))
-            if item[0] == 'fp_text_box': object.graphicItems.append(FpTextBox.from_sexpr(item))
-            if item[0] == 'fp_line': object.graphicItems.append(FpLine.from_sexpr(item))
-            if item[0] == 'fp_rect': object.graphicItems.append(FpRect.from_sexpr(item))
-            if item[0] == 'fp_circle': object.graphicItems.append(FpCircle.from_sexpr(item))
-            if item[0] == 'fp_arc': object.graphicItems.append(FpArc.from_sexpr(item))
-            if item[0] == 'fp_poly': object.graphicItems.append(FpPoly.from_sexpr(item))
-            if item[0] == 'fp_curve': object.graphicItems.append(FpCurve.from_sexpr(item))
-            if item[0] == 'image':object.graphicItems.append(Image.from_sexpr(item))
-            if item[0] == 'pad': object.pads.append(Pad.from_sexpr(item))
-            if item[0] == 'zone': object.zones.append(Zone.from_sexpr(item))
-            if item[0] == 'property': object.properties.update({ item[1]: item[2] })
-            if item[0] == 'group': object.groups.append(Group.from_sexpr(item))
-            if item[0] == 'private_layers':
-                for layer in item[1:]:
-                    object.privateLayers.append(layer)
-            if item[0] == 'net_tie_pad_groups':
-                for layer in item[1:]:
-                    object.netTiePadGroups.append(layer)
-            if item[0] == 'dimension':
-                raise NotImplementedError("Dimensions are not yet handled! Please report this bug along with the file being parsed.")
-
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Footprint:
-        """Load a footprint directly from a KiCad footprint file (`.kicad_mod`) and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - Footprint: Object of the Footprint class initialized with the given KiCad footprint
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            rawFootprint = infile.read()
-
-            fpData = sexpr.parse_sexp(rawFootprint)
-            return cls.from_sexpr(fpData)
-
-    @classmethod
-    def create_new(cls, library_id: str, value: str,
-                        type: str = 'other', reference: str = 'REF**') -> Footprint:
-        """Creates a new empty footprint with its attributes set as KiCad would create it
-
-        Args:
-            - library_link (str): Denotes the name of the library as well as the footprint. Like `Connector:Conn01x02`)
-            - value (str): The value text item (printed on the fabrication layer as ``value`` attribute)
-            - type (str): Type of footprint (``smd``, ``through_hole`` or ``other``). Defaults to 'other'.
-            - reference (str): Reference of the footprint. Defaults to `REF**`.
-        Raises:
-            - Exception: When the given type is something other than listed above
-
-        Returns:
-            - Footprint: Empty footprint
-        """
-        if type not in ['smd', 'through_hole', 'other']:
-            raise Exception("Unsupported type was given")
-
-        fp = cls(
-            version = KIUTILS_CREATE_NEW_VERSION_STR,
-            generator = 'kiutils'
-        )
-        fp.libId = library_id
-
-        # Create text items that are created when adding a new footprint to a library
-        fp.graphicItems.extend(
-            [
-                FpText(
-                    type = 'reference', text = reference, layer = 'F.SilkS',
-                    effects = Effects(font=Font(thickness=0.15)),
-                    position = Position(X=0, Y=-0.5, unlocked=True)
-                ),
-                FpText(
-                    type = 'value', text = value, layer ='F.Fab',
-                    effects  = Effects(font=Font(thickness=0.15)),
-                    position = Position(X=0, Y=1, unlocked=True)
-                ),
-                FpText(
-                    type = 'user', text = '${REFERENCE}', layer = 'F.Fab',
-                    effects = Effects(font=Font(thickness=0.15)),
-                    position = Position(X=0, Y=2.5, unlocked=True)
-                )
-            ]
-        )
-
-        # The type ``other`` does not set the attributes type token
-        if type != 'other':
-            fp.attributes.type = type
-
-        return fp
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=True, layerInFirstLine=False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-            - layerInFirstLine (bool): Prints the ``layer`` token in the first line. Defaults to False
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        locked = ' locked' if self.locked else ''
-        placed = ' placed' if self.placed else ''
-        version = f' (version {self.version})' if self.version is not None else ''
-        generator = f' (generator {self.generator})' if self.generator is not None else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-
-        expression =  f'{indents}(footprint "{dequote(self.libId)}"{locked}{placed}{version}{generator}'
-        if layerInFirstLine:
-            expression += f' (layer "{dequote(self.layer)}")\n'
-        else:
-            expression += f'\n{indents}  (layer "{dequote(self.layer)}")\n'
-        expression += f'{indents}  (tedit {self.tedit}){uuid}\n'
-
-        if self.position is not None:
-            angle = f' {self.position.angle}' if self.position.angle is not None else ''
-            expression += f'{indents}  (at {self.position.X} {self.position.Y}{angle})\n'
-        if self.description is not None:
-            expression += f'{indents}  (descr "{dequote(self.description)}")\n'
-        if self.tags is not None:
-            expression += f'{indents}  (tags "{dequote(self.tags)}")\n'
-        for item in self.properties:
-            expression += f'{indents}  (property "{dequote(item)}" "{dequote(self.properties[item])}")\n'
-        if self.path is not None:
-            expression += f'{indents}  (path "{dequote(self.path)}")\n'
-
-        # Additional parameters used in board
-        if self.autoplaceCost90 is not None:
-            expression += f'{indents}  (autoplace_cost90 {self.autoplaceCost90})\n'
-        if self.autoplaceCost180 is not None:
-            expression += f'{indents}  (autoplace_cost180 {self.autoplaceCost180})\n'
-        if self.solderMaskMargin is not None:
-            expression += f'{indents}  (solder_mask_margin {self.solderMaskMargin})\n'
-        if self.solderPasteMargin is not None:
-            expression += f'{indents}  (solder_paste_margin {self.solderPasteMargin})\n'
-        if self.solderPasteRatio is not None:
-            expression += f'{indents}  (solder_paste_ratio {self.solderPasteRatio})\n'
-        if self.clearance is not None:
-            expression += f'{indents}  (clearance {self.clearance})\n'
-        if self.zoneConnect is not None:
-            expression += f'{indents}  (zone_connect {self.zoneConnect})\n'
-        if self.thermalWidth is not None:
-            expression += f'{indents}  (thermal_width {self.thermalWidth})\n'
-        if self.thermalGap is not None:
-            expression += f'{indents}  (thermal_gap {self.thermalGap})\n'
-
-        if self.attributes is not None:
-            # Note: If the attribute object has only standard values in it, it will return an
-            #       empty string. Therefore, it should create its own newline and indentations only
-            #       when needed.
-            expression += self.attributes.to_sexpr(indent=indent+2, newline=True)
-        if self.privateLayers:
-            expression += f'{indents}  (private_layers'
-            for item in self.privateLayers:
-                expression += f' "{dequote(item)}"'
-            expression += f')\n'
-            
-        if self.netTiePadGroups:
-            expression += f'{indents}  (net_tie_pad_groups'
-            for item in self.netTiePadGroups:
-                expression += f' "{dequote(item)}"'
-            expression += f')\n'
-
-        for item in self.graphicItems:
-            expression += item.to_sexpr(indent=indent+2)
-        for item in self.pads:
-            expression += item.to_sexpr(indent=indent+2)
-        for item in self.zones:
-            expression += item.to_sexpr(indent=indent+2)
-        for item in self.models:
-            expression += item.to_sexpr(indent=indent+2)
-        for item in self.groups:
-            expression += item.to_sexpr(indent=indent+2)
-
-        expression += f'{indents}){endline}'
-        return expression
-
diff --git a/kiutils/items/brditems.py b/kiutils/items/brditems.py
deleted file mode 100644
index 546aac7..0000000
--- a/kiutils/items/brditems.py
+++ /dev/null
@@ -1,1104 +0,0 @@
-"""Classes to manage KiCad board items
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    20.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-
-from kiutils.items.common import Position
-from kiutils.utils.strings import dequote
-
-@dataclass
-class GeneralSettings():
-    """The ``general`` token define general information about the board
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_general_section
-    """
-
-    thickness: float = 1.6
-    """The ``thickness`` token attribute defines the overall board thickness"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GeneralSettings:
-        """Convert the given S-Expresstion into a GeneralSettings object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(general ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not general
-
-        Returns:
-            - GeneralSettings: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'general':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'thickness': object.thickness = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(general\n'
-        expression += f'{indents}  (thickness {self.thickness})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-
-@dataclass
-class LayerToken():
-    """Intermediate type used for the ``layers`` token in a board
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_layers_section
-    """
-
-    ordinal: int = 0
-    """The layer ``ordinal`` is an integer used to associate the layer stack ordering. This is mostly
-    to ensure correct mapping when the number of layers is increased in the future"""
-
-    name: str = "F.Cu"
-    """The ``name`` is the layer name defined for internal board use"""
-
-    type: str = "signal"
-    """The layer ``type`` defines the type of layer and can be defined as ``jumper``, ``mixed``, ``power``,
-    ``signal``, or ``user``."""
-
-    userName: Optional[str] = None
-    """The optional ``userName`` attribute defines the custom user name"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> LayerToken:
-        """Convert the given S-Expresstion into a LayerToken object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``( "" )``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the length of the list is not 3 - 4
-            - Exception: When the first item of the list is not kicad_pcb
-
-        Returns:
-            - LayerToken: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 3 or len(exp) > 4:
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.ordinal = exp[0]
-        object.name = exp[1]
-        object.type = exp[2]
-        if len(exp) == 4:
-            object.userName = exp[3]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        username = f' "{dequote(self.userName)}"' if self.userName is not None else ''
-
-        return f'{indents}({self.ordinal} "{dequote(self.name)}" {self.type}{username}){endline}'
-
-
-@dataclass
-class StackupSubLayer():
-    """The ``StackupSubLayer`` token defines a sublayer used when stacking dielectrics in a PCB"""
-
-    thickness: float = 0.1
-    """The ``thickness`` token defines the thickness of the sublayer. Defaults to 0.1"""
-
-    material: Optional[str] = None
-    """The optional ``material`` token defines a string that describes the sublayer material"""
-
-    epsilonR: Optional[float] = None
-    """The optional ``epsilonR`` token defines the dielectric constant of the sublayer material"""
-
-    lossTangent: Optional[float] = None
-    """The optional layer ``lossTangent`` token defines the dielectric loss tangent of the sublayer"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> StackupSubLayer:
-        """This class cannot be derived from an S-Expression as the format currently used in KiCad
-        board files does not match the usual convention. Assign member values manually when using
-        this object.
-
-        Raises:
-            - NotImplementedError"""
-        raise NotImplementedError("This class cannot be derived from an S-Expression!")
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object. The representation differs from the
-        normal form of an S-Expression as this uses no opening and closing parenthesis.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        mat = f' (material "{dequote(self.material)}")' if self.material is not None else ''
-        er = f' (epsilon_r {self.epsilonR})' if self.epsilonR is not None else ''
-        lt = f' (loss_tangent {self.lossTangent})' if self.lossTangent is not None else ''
-
-        return f'{indents}addsublayer (thickness {self.thickness}){mat}{er}{lt}{endline}'
-
-
-@dataclass
-class StackupLayer():
-    """The ``layer`` token defines the stack up setting of a single layer in the board stack up
-    settings.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_stack_up_settings
-    """
-
-    name: str = ""
-    """The ``name`` attribute is either one of the canonical copper or technical layer names
-    or ``dielectric ID`` if it is dielectric layer"""
-
-    # Not found in example project ...
-    #number: int = 0
-    """The ``number`` attribute defines the stack order of the layer"""
-
-    type: str = ""
-    """The ``type`` token defines a string that describes the layer"""
-
-    color: Optional[str] = None
-    """The optional ``color`` token defines a string that describes the layer color. This is
-    only used on solder mask and silkscreen layers"""
-
-    thickness: Optional[float] = None
-    """The optional ``thickness`` token defines the thickness of the layer where appropriate"""
-
-    material: Optional[str] = None
-    """The optional ``material`` token defines a string that describes the layer material
-    where appropriate"""
-
-    epsilonR: Optional[float] = None
-    """The optional ``epsilonR`` token defines the dielectric constant of the layer material"""
-
-    lossTangent: Optional[float] = None
-    """The optional layer ``lossTangent`` token defines the dielectric loss tangent of the layer"""
-
-    subLayers: List[StackupSubLayer] = field(default_factory=list)
-    """The ``sublayers`` token defines a list of zero or more sublayers that are used to create
-    stacks of dielectric layers. Does not apply to copper-type layers."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> StackupLayer:
-        """Convert the given S-Expresstion into a StackupLayer object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(layer ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not layer
-
-        Returns:
-            - StackupLayer: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'layer':
-            raise Exception("Expression does not have the correct type")
-
-        parsingSublayer = False
-        tempSublayer = StackupSubLayer()
-        object = cls()
-        object.name = exp[1]
-        for item in exp[2:]:
-            if type(item) != type([]):
-                # Start parsing the layer's sublayer if the first sublayer token was found
-                if item == 'addsublayer':
-                    if parsingSublayer:
-                        # When the ``addsublayer`` token was found a second time, the previously
-                        # parsed sublayer will be appended to the list of sublayers
-                        object.subLayers.append(tempSublayer)
-                        tempSublayer = StackupSubLayer()
-                    else:
-                        # Change state of the parser to look for StackupSubLayer tokens
-                        parsingSublayer = True
-                continue
-
-            # Parse the tokens of StackupSubLayer for the current sublayer
-            if parsingSublayer:
-                if item[0] == 'thickness': tempSublayer.thickness = item[1]
-                if item[0] == 'material': tempSublayer.material = item[1]
-                if item[0] == 'epsilon_r': tempSublayer.epsilonR = item[1]
-                if item[0] == 'loss_tangent': tempSublayer.lossTangent = item[1]
-                continue
-
-            # Parse the normal tokens of StackupLayer token
-            if item[0] == 'type': object.type = item[1]
-            if item[0] == 'thickness': object.thickness = item[1]
-            if item[0] == 'material': object.material = item[1]
-            if item[0] == 'epsilon_r': object.epsilonR = item[1]
-            if item[0] == 'loss_tangent': object.lossTangent = item[1]
-            if item[0] == 'color': object.color = item[1]
-
-        # Add the last parsed sublayer to the list, if any
-        if parsingSublayer:
-            object.subLayers.append(tempSublayer)
-
-        return object
-
-    def to_sexpr(self, indent=6, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        color = f' (color "{dequote(self.color)}")' if self.color is not None else ''
-        material = f' (material "{dequote(self.material)}")' if self.material is not None else ''
-        thickness = f' (thickness {self.thickness})' if self.thickness is not None else ''
-        epsilon_r = f' (epsilon_r {self.epsilonR})' if self.epsilonR is not None else ''
-        loss_tangent = f' (loss_tangent {self.lossTangent})' if self.lossTangent is not None else ''
-
-        expression = f'{indents}(layer "{dequote(self.name)}" (type "{self.type}"){color}{thickness}'
-        expression +=f'{material}{epsilon_r}{loss_tangent}'
-        for layer in self.subLayers:
-            expression += f'\n{layer.to_sexpr(indent+2)}'
-        expression += f'){endline}'
-        return expression
-
-@dataclass
-class Stackup():
-    """The ``stackup`` token defines the board stack up settings and is defined in the setup
-    section.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_stack_up_settings
-    """
-
-    layers: List[StackupLayer] = field(default_factory=list)
-    """The ``layers``token is a list of layer settings for each layer required to manufacture
-    a board including the dielectric material between the actual layers defined in the board
-    editor."""
-
-    copperFinish: Optional[str] = None
-    """The optional ``copperFinish`` token is a string that defines the copper finish used to
-    manufacture the board"""
-
-    dielectricContraints: Optional[str] = None
-    """The optional ``dielectricContraints`` token define if the board should meet all
-    dielectric requirements. Valid values are ``yes`` and ``no``."""
-
-    edgeConnector: Optional[str] = None
-    """The optional ``edgeConnector`` token defines if the board has an edge connector
-    (value: ``yes``) and if the edge connector is bevelled (value: ``bevelled``)"""
-
-    castellatedPads: bool = False
-    """The ``castellatedPads`` token defines if the board edges contain castellated pads"""
-
-    edgePlating: bool = False
-    """The ``edgePlating`` token defines if the board edges should be plated."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Stackup:
-        """Convert the given S-Expresstion into a Stackup object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(stackup ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not stackup
-
-        Returns:
-            - Stackup: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'stackup':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'layer': object.layers.append(StackupLayer().from_sexpr(item))
-            if item[0] == 'copper_finish': object.copperFinish = item[1]
-            if item[0] == 'dielectric_constraints': object.dielectricContraints = item[1]
-            if item[0] == 'edge_connector': object.edgeConnector = item[1]
-            if item[0] == 'castellated_pads': object.castellatedPads = True
-            if item[0] == 'edge_plating': object.edgePlating = True
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(stackup\n'
-        for layer in self.layers:
-            expression += layer.to_sexpr(indent+2)
-        if self.copperFinish is not None:         expression += f'{indents}  (copper_finish "{dequote(self.copperFinish)}")\n'
-        if self.dielectricContraints is not None: expression += f'{indents}  (dielectric_constraints {self.dielectricContraints})\n'
-        if self.edgeConnector is not None:        expression += f'{indents}  (edge_connector {self.edgeConnector})\n'
-        if self.castellatedPads:                  expression += f'{indents}  (castellated_pads yes)\n'
-        if self.edgePlating:                      expression += f'{indents}  (edge_plating yes)\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class PlotSettings():
-    """The ``pcbplotparams`` token defines the plotting and printing settings used for the last
-    plot and is defined in the set up section.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_plot_settings
-    """
-
-    layerSelection: str = ""
-    """The ``layerSelection`` token defines a hexadecimal bit set of the layers to plot"""
-
-    plotOnAllLayersSelection: Optional[str] = None
-    """The ``plotOnAllLayersSelection`` token defines a hexadecimal bit set of layers where all 
-    selected layers shall be plotted.
-    
-    Available and required since KiCad v7"""
-
-    disableApertMacros: bool = False
-    """The ``disableApertMacros`` token defines if aperture macros are to be used in gerber plots"""
-
-    useGerberExtensions: bool = False
-    """The ``useGerberExtensions`` token  defines if the Protel layer file name extensions are to
-    be used in gerber plots"""
-
-    useGerberAttributes: bool = False
-    """The ``useGerberAttributes`` token defines if the X2 extensions are used in gerber plots"""
-
-    useGerberAdvancedAttributes: bool = False
-    """The ``useGerberAdvancedAttributes`` token defines if the netlist information should be
-    included in gerber plots"""
-
-    createGerberJobFile: bool = False
-    """The ``createGerberJobFile`` token defines if a job file should be created when plotting 
-    gerber files"""
-
-    # FIXME: Where is the docu of this token?
-    dashedLineDashRatio: Optional[float] = None
-    """The ``dashedLineDashRatio`` token's documentation is still missing ..
-    
-    Available and required since KiCad v7"""
-
-    # FIXME: Where is the docu of this token?
-    dashedLineGapRatio: Optional[float] = None
-    """The ``dashedLineGapRatio`` token's documentation is still missing ..
-    
-    Available and required since KiCad v7"""
-
-    svgUseInch: Optional[bool] = None
-    """The ``svgUseInch`` token defines if inch units should be use when plotting SVG files.
-    
-    Required until KiCad v6, removed since KiCad v7"""
-
-    svgPrecision: float = 0.0
-    """The ``svgPrecision`` token defines the units precision used when plotting SVG files"""
-
-    excludeEdgeLayer: Optional[bool] = None
-    """The ``excludeEdgeLayer`` token defines if the board edge layer is plotted on all layers.
-    
-    Required until KiCad v6, removed since KiCad v7"""
-
-    plotFameRef: bool = False
-    """The ``plotFameRef`` token defines if the border and title block should be plotted"""
-
-    viasOnMask: bool = False
-    """The ``viasOnMask`` token defines if the vias are to be tented"""
-
-    mode: int = 1
-    """The ``mode`` token defines the plot mode. An attribute of 1 plots in the normal
-    mode and an attribute of 2 plots in the outline (sketch) mode."""
-
-    useAuxOrigin: bool = False
-    """The ``useAuxOrigin`` token determines if all coordinates are offset by the defined user origin"""
-
-    hpglPenNumber: int = 0
-    """The ``hpglPenNumber`` token defines the integer pen number used for HPGL plots"""
-
-    hpglPenSpeed: int = 0
-    """The ``hpglPenSpeed`` token defines the integer pen speed used for HPGL plots"""
-
-    hpglPenDiameter: float = 0.0
-    """The ``hpglPenDiameter`` token defines the floating point pen size for HPGL plots"""
-
-    dxfPolygonMode: bool = False
-    """The ``dxfPolygonMode`` token defines if the polygon mode should be used for DXF plots"""
-
-    dxfImperialUnits: bool = False
-    """The ``dxfImperialUnits`` token defines if imperial units should be used for DXF plots"""
-
-    dxfUsePcbnewFont: bool = False
-    """The ``dxfUsePcbnewFont`` token defines if the Pcbnew font (vector font) or the default
-    font should be used for DXF plots"""
-
-    psNegative: bool = False
-    """The ``psNegative`` token defines if the output should be the negative for PostScript plots"""
-
-    psA4Output: bool = False
-    """The ``psA4Output`` token defines if the A4 page size should be used for PostScript plots"""
-
-    plotReference: bool = False
-    """The ``plotReference`` token defines if hidden reference field text should be plotted"""
-
-    plotValue: bool = False
-    """The ``plotValue`` token defines if hidden value field text should be plotted"""
-
-    plotInvisibleText: bool = False
-    """The ``plotInvisibleText`` token defines if hidden text other than the reference and
-    value fields should be plotted"""
-
-    sketchPadsOnFab: bool = False
-    """The ``sketchPadsOnFab`` token defines if pads should be plotted in the outline (sketch) mode"""
-
-    subtractMaskFromSilk: bool = False
-    """The ``subtractMaskFromSilk`` token defines if the solder mask layers should be subtracted from
-    the silk screen layers for gerber plots"""
-
-    outputFormat: int = 0
-    """The ``outputFormat`` token defines the last plot type. The following values are defined:
-    - 0: gerber
-    - 1: PostScript
-    - 2: SVG
-    - 3: DXF
-    - 4: HPGL
-    - 5: PDF"""
-
-    mirror: bool = False
-    """The ``mirror`` token defines if the plot should be mirrored"""
-
-    drillShape: int = 0
-    """The ``drillShape`` token defines the type of drill marks used for drill files"""
-
-    scaleSelection: int = 1
-    """The ``scaleSelection`` is not documented yet (as of 20.02.2022)"""
-
-    outputDirectory: str = ""
-    """The ``drillShape`` token defines the path relative to the current project path
-    where the plot files will be saved"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> PlotSettings:
-        """Convert the given S-Expresstion into a PlotSettings object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(pcbplotparams ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not pcbplotparams
-
-        Returns:
-            - PlotSettings: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'pcbplotparams':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'layerselection': object.layerSelection = item[1]
-            if item[0] == 'plot_on_all_layers_selection': object.plotOnAllLayersSelection = item[1]
-            if item[0] == 'disableapertmacros': object.disableApertMacros = True if item[1] == 'true' else False
-            if item[0] == 'usegerberextensions' : object.useGerberExtensions = True if item[1] == 'true' else False
-            if item[0] == 'usegerberattributes' : object.useGerberAttributes = True if item[1] == 'true' else False
-            if item[0] == 'usegerberadvancedattributes' : object.useGerberAdvancedAttributes = True if item[1] == 'true' else False
-            if item[0] == 'creategerberjobfile' : object.createGerberJobFile = True if item[1] == 'true' else False
-            if item[0] == 'dashed_line_dash_ratio': object.dashedLineDashRatio = item[1]
-            if item[0] == 'dashed_line_gap_ratio': object.dashedLineGapRatio = item[1]
-            if item[0] == 'svguseinch' : object.svgUseInch = True if item[1] == 'true' else False
-            if item[0] == 'svgprecision' : object.svgPrecision = item[1]
-            if item[0] == 'excludeedgelayer' : object.excludeEdgeLayer = True if item[1] == 'true' else False
-            if item[0] == 'plotframeref' : object.plotFameRef = True if item[1] == 'true' else False
-            if item[0] == 'viasonmask' : object.viasOnMask = True if item[1] == 'true' else False
-            if item[0] == 'mode' : object.mode = item[1]
-            if item[0] == 'useauxorigin' : object.useAuxOrigin = True if item[1] == 'true' else False
-            if item[0] == 'hpglpennumber' : object.hpglPenNumber = item[1]
-            if item[0] == 'hpglpenspeed' : object.hpglPenSpeed = item[1]
-            if item[0] == 'hpglpendiameter' : object.hpglPenDiameter = item[1]
-            if item[0] == 'dxfpolygonmode' : object.dxfPolygonMode = True if item[1] == 'true' else False
-            if item[0] == 'dxfimperialunits' : object.dxfImperialUnits = True if item[1] == 'true' else False
-            if item[0] == 'dxfusepcbnewfont' : object.dxfUsePcbnewFont = True if item[1] == 'true' else False
-            if item[0] == 'psnegative' : object.psNegative = True if item[1] == 'true' else False
-            if item[0] == 'psa4output' : object.psA4Output = True if item[1] == 'true' else False
-            if item[0] == 'plotreference' : object.plotReference = True if item[1] == 'true' else False
-            if item[0] == 'plotvalue' : object.plotValue = True if item[1] == 'true' else False
-            if item[0] == 'plotinvisibletext' : object.plotInvisibleText = True if item[1] == 'true' else False
-            if item[0] == 'sketchpadsonfab' : object.sketchPadsOnFab = True if item[1] == 'true' else False
-            if item[0] == 'subtractmaskfromsilk' : object.subtractMaskFromSilk = True if item[1] == 'true' else False
-            if item[0] == 'outputformat' : object.outputFormat = item[1]
-            if item[0] == 'mirror' : object.mirror = True if item[1] == 'true' else False
-            if item[0] == 'drillshape' : object.drillShape = item[1]
-            if item[0] == 'scaleselection' : object.scaleSelection = item[1]
-            if item[0] == 'outputdirectory' : object.outputDirectory = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(pcbplotparams\n'
-        expression += f'{indents}  (layerselection {self.layerSelection})\n'
-        if self.plotOnAllLayersSelection is not None:
-            expression += f'{indents}  (plot_on_all_layers_selection {self.plotOnAllLayersSelection})\n'
-        expression += f'{indents}  (disableapertmacros {str(self.disableApertMacros).lower()})\n'
-        expression += f'{indents}  (usegerberextensions {str(self.useGerberExtensions).lower()})\n'
-        expression += f'{indents}  (usegerberattributes {str(self.useGerberAttributes).lower()})\n'
-        expression += f'{indents}  (usegerberadvancedattributes {str(self.useGerberAdvancedAttributes).lower()})\n'
-        expression += f'{indents}  (creategerberjobfile {str(self.createGerberJobFile).lower()})\n'
-        if self.dashedLineDashRatio is not None:
-            expression += f'{indents}  (dashed_line_dash_ratio {float(self.dashedLineDashRatio):.6f})\n'
-        if self.dashedLineGapRatio is not None:
-            expression += f'{indents}  (dashed_line_gap_ratio {float(self.dashedLineGapRatio):.6f})\n'
-        if self.svgUseInch is not None:
-            expression += f'{indents}  (svguseinch {str(self.svgUseInch).lower()})\n'
-        expression += f'{indents}  (svgprecision {self.svgPrecision})\n'
-        if self.excludeEdgeLayer is not None:
-            expression += f'{indents}  (excludeedgelayer {str(self.excludeEdgeLayer).lower()})\n'
-        expression += f'{indents}  (plotframeref {str(self.plotFameRef).lower()})\n'
-        expression += f'{indents}  (viasonmask {str(self.viasOnMask).lower()})\n'
-        expression += f'{indents}  (mode {self.mode})\n'
-        expression += f'{indents}  (useauxorigin false)\n'
-        expression += f'{indents}  (hpglpennumber {self.hpglPenNumber})\n'
-        expression += f'{indents}  (hpglpenspeed {self.hpglPenSpeed})\n'
-        expression += f'{indents}  (hpglpendiameter {float(self.hpglPenDiameter):.6f})\n'
-        expression += f'{indents}  (dxfpolygonmode {str(self.dxfPolygonMode).lower()})\n'
-        expression += f'{indents}  (dxfimperialunits {str(self.dxfImperialUnits).lower()})\n'
-        expression += f'{indents}  (dxfusepcbnewfont {str(self.dxfUsePcbnewFont).lower()})\n'
-        expression += f'{indents}  (psnegative {str(self.psNegative).lower()})\n'
-        expression += f'{indents}  (psa4output {str(self.psA4Output).lower()})\n'
-        expression += f'{indents}  (plotreference {str(self.plotReference).lower()})\n'
-        expression += f'{indents}  (plotvalue {str(self.plotValue).lower()})\n'
-        expression += f'{indents}  (plotinvisibletext {str(self.plotInvisibleText).lower()})\n'
-        expression += f'{indents}  (sketchpadsonfab {str(self.sketchPadsOnFab).lower()})\n'
-        expression += f'{indents}  (subtractmaskfromsilk {str(self.subtractMaskFromSilk).lower()})\n'
-        expression += f'{indents}  (outputformat {self.outputFormat})\n'
-        expression += f'{indents}  (mirror {str(self.mirror).lower()})\n'
-        expression += f'{indents}  (drillshape {self.drillShape})\n'
-        expression += f'{indents}  (scaleselection {self.scaleSelection})\n'
-        expression += f'{indents}  (outputdirectory "{dequote(self.outputDirectory)}")\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-
-@dataclass
-class SetupData():
-    """The setup token is used to store the current settings such as default item sizes and
-    other options used by the board
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_setup_section
-    """
-
-    stackup: Optional[Stackup] = None
-    """The optional ``stackup`` define the parameters required to manufacture the board"""
-
-    packToMaskClearance: float = 0.0
-    """The ``packToMaskClearance`` token defines the clearance between footprint pads and
-    the solder mask"""
-
-    solderMaskMinWidth: Optional[float] = None
-    """The optional ``solderMaskMinWidth`` defines the minimum solder mask width. If not
-    defined, the minimum width is zero."""
-
-    padToPasteClearance: Optional[float] = None
-    """The optional ``padToPasteClearance`` defines the clearance between footprint pads
-    and the solder paste layer. If not defined, the clearance is zero"""
-
-    padToPasteClearanceRatio: Optional[float] = None
-    """The optional ``padToPasteClearanceRatio`` is the percentage (from 0 to 100) of the
-    footprint pad to make the solder paste. If not defined, the ratio is 100% (the same
-    size as the pad)."""
-
-    auxAxisOrigin: Optional[Position] = None
-    """The optional ``auxAxisOrigin`` defines the auxiliary origin if it is set to anything
-    other than (0,0)."""
-
-    gridOrigin: Optional[Position] = None
-    """The optional ``gridOrigin`` defines the grid original if it is set to anything other
-    than (0,0)."""
-
-    plotSettings: Optional[PlotSettings] = None
-    """The optional ``plotSettings`` define how the board was last plotted."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SetupData:
-        """Convert the given S-Expresstion into a SetupData object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(setup ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not setup
-
-        Returns:
-            - SetupData: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'setup':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'stackup': object.stackup = Stackup().from_sexpr(item)
-            if item[0] == 'pcbplotparams': object.plotSettings = PlotSettings().from_sexpr(item)
-            if item[0] == 'pad_to_mask_clearance': object.packToMaskClearance = item[1]
-            if item[0] == 'solder_mask_min_width': object.solderMaskMinWidth = item[1]
-            if item[0] == 'pad_to_paste_clearance': object.padToPasteClearance = item[1]
-            if item[0] == 'pad_to_paste_clearance_ratio': object.padToPasteClearanceRatio = item[1]
-            if item[0] == 'aux_axis_origin': object.auxAxisOrigin = Position().from_sexpr(item)
-            if item[0] == 'grid_origin': object.gridOrigin = Position().from_sexpr(item)
-            if item[0] == 'pcbplotparams': object.plotSettings = PlotSettings().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(setup\n'
-        if self.stackup is not None:                  expression += self.stackup.to_sexpr(indent+2)
-        expression += f'{indents}  (pad_to_mask_clearance {self.packToMaskClearance})\n'
-        if self.solderMaskMinWidth is not None:       expression += f'{indents}  (solder_mask_min_width {self.solderMaskMinWidth})\n'
-        if self.padToPasteClearance is not None:      expression += f'{indents}  (pad_to_paste_clearance {self.padToPasteClearance})\n'
-        if self.padToPasteClearanceRatio is not None: expression += f'{indents}  (pad_to_paste_clearance_ratio {self.padToPasteClearanceRatio})\n'
-        if self.auxAxisOrigin is not None:            expression += f'{indents}  (aux_axis_origin {self.auxAxisOrigin.X} {self.auxAxisOrigin.Y})\n'
-        if self.gridOrigin is not None:               expression += f'{indents}  (grid_origin {self.gridOrigin.X} {self.gridOrigin.Y})\n'
-        if self.plotSettings is not None:             expression += self.plotSettings.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-
-@dataclass
-class Segment():
-    """The ``segment`` token defines a track segment in a KiCad board
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_segment
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the beginning of the line"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the end of the line"""
-
-    width: float = 0.1
-    """The ``width`` token defines the line width"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the track segment resides on"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the line cannot be edited"""
-
-    net: int = 0
-    """The ``net`` token defines by the net ordinal number which net in the net
-    section that the segment is part of"""
-
-    uuid: str = ""
-    """The ``uuid`` token defines the unique identifier of the line object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Segment:
-        """Convert the given S-Expresstion into a Segment object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(segment ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not segment
-
-        Returns:
-            - Segment: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'segment':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            if item[0] == 'end': object.end = Position().from_sexpr(item)
-            if item[0] == 'width': object.width = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'net': object.net = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = ' locked' if self.locked else ''
-
-        return f'{indents}(segment{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}) (width {self.width}) (layer "{dequote(self.layer)}") (net {self.net}) (uuid {self.uuid})){endline}'
-
-@dataclass
-class Via():
-    """The ``via`` token defines a track via in a KiCad board
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_via
-    """
-
-    type: Optional[str] = None
-    """The optional ``type`` attribute specifies the via type. Valid via types are ``blind`` and
-    ``micro``. If no type is defined, the via is a through hole type"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the line cannot be edited"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token define the coordinates of the center of the via"""
-
-    size: float = 0.0
-    """The ``size`` token define the diameter of the via annular ring"""
-
-    drill: float = 0.0
-    """The ``drill`` token define the drill diameter of the via"""
-
-    layers: List[str] = field(default_factory=list)
-    """The ``layers`` token define the canonical layer set the via connects as a list
-    of strings"""
-
-    removeUnusedLayers: bool = False
-    """The ``removeUnusedLayers`` token is undocumented (as of 20.02.2022)"""
-
-    keepEndLayers: bool = False
-    """The ``keepEndLayers`` token is undocumented (as of 20.02.2022)"""
-
-    free: bool = False
-    """The ``free`` token indicates that the via is free to be moved outside it's assigned net"""
-
-    net: int = 0
-    """The ``net`` token defines by net ordinal number which net in the net section that
-    the via is part of"""
-
-    uuid: Optional[str] = None
-    """The ``uuid`` token defines the unique identifier of the via"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Via:
-        """Convert the given S-Expresstion into a Via object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(via ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not via
-
-        Returns:
-            - Via: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'via':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                if item == 'micro' or item == 'blind': object.type = item
-                continue
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'size': object.size = item[1]
-            if item[0] == 'drill': object.drill = item[1]
-            if item[0] == 'layers':
-                for layer in item[1:]:
-                    object.layers.append(layer)
-            if item[0] == 'remove_unused_layers': object.removeUnusedLayers = True
-            if item[0] == 'keep_end_layers': object.keepEndLayers = True
-            if item[0] == 'free': object.free = True
-            if item[0] == 'net': object.net = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        type = f' {self.type}' if self.type is not None else ''
-        locked = f' locked' if self.locked else ''
-
-        layers = ''
-        for layer in self.layers:
-            layers += f' "{dequote(layer)}"'
-        rum = f' (remove_unused_layers)' if self.removeUnusedLayers else ''
-        kel = f' (keep_end_layers)' if self.keepEndLayers else ''
-        free = f' (free)' if self.free else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-
-        return f'{indents}(via{type}{locked} (at {self.position.X} {self.position.Y}) (size {self.size}) (drill {self.drill}) (layers{layers}){rum}{kel}{free} (net {self.net}){uuid}){endline}'
-
-@dataclass
-class Arc():
-    """The ``arc`` token defines a track arc, which will be generated when using the length-matching
-    feature on differential pairs.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-pcb/#_track_arc
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the beginning of the arc"""
-
-    mid: Position = field(default_factory=lambda: Position())
-    """The ``mid`` token defines the coordinates of the mid point of the radius of the arc"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the end of the arc"""
-
-    width: float = 0.2
-    """The ``width`` token defines the line width of the arc. Defaults to 0,2."""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defiens the canonical layer the track arc resides on. Defaults to `F.Cu`."""
-
-    locked: bool = False
-    """The ``locked`` token defines if the arc cannot be edited. Defaults to False."""
-
-    net: int = 0
-    """The ``net`` token defines the net ordinal number which net in the net section that arc is part
-    of. Defaults to 0."""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` token defines the unique identifier of the arc"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Arc:
-        """Convert the given S-Expresstion into a Arc object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(arc ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``arc``
-
-        Returns:
-            - Arc: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'arc':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            elif item[0] == 'mid': object.mid = Position().from_sexpr(item)
-            elif item[0] == 'end': object.end = Position().from_sexpr(item)
-            elif item[0] == 'width': object.width = item[1]
-            elif item[0] == 'layer': object.layer = item[1]
-            elif item[0] == 'net': object.net = item[1]
-            elif item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        locked = f' locked' if self.locked else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-
-        expression = f'{indents}(arc{locked} (start {self.start.X} {self.start.Y}) '
-        expression += f'(mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}) '
-        expression += f'(width {self.width}) (layer "{dequote(self.layer)}") '
-        expression += f'(net {self.net}){uuid}){endline}'
-        return expression
-
-
-@dataclass
-class Target():
-    """The ``target`` token defines a target marker on the PCB
-
-    Documentation:
-        Not found in KiCad docu - 15.06.2022
-    """
-
-    type: str = "plus"
-    """The ``type`` token specifies the shape of the marker. Valid types are ``plus`` and ``x``."""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token specifies the position of the target marker"""
-
-    size: float = 0
-    """The ``size`` token sets the marker's size"""
-
-    width: float = 0.1
-    """The ``width`` token sets the marker's line width"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token sets the canonical layer where the target marker resides"""
-
-    uuid: Optional[str] = None
-    """The ``uuid`` token defines the unique identifier of the target"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Target:
-        """Convert the given S-Expresstion into a Target object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(target ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not target
-
-        Returns:
-            - Target: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'target':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.type = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'size': object.size = item[1]
-            if item[0] == 'width': object.width = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        return f'{indents}(target {self.type} (at {self.position.X} {self.position.Y}) (size {self.size}) (width {self.width}) (layer "{self.layer}") (uuid {self.uuid})){endline}'
diff --git a/kiutils/items/common.py b/kiutils/items/common.py
deleted file mode 100644
index 707328e..0000000
--- a/kiutils/items/common.py
+++ /dev/null
@@ -1,1179 +0,0 @@
-"""Defines all syntax that is shared across the symbol library, footprint library,
-   schematic, board and work sheet file formats.
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    02.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_common_syntax
-"""
-
-from __future__ import annotations
-from abc import ABC, abstractmethod
-
-from dataclasses import dataclass, field
-from typing import Optional, List, Dict
-
-from kiutils.utils.strings import dequote
-
-@dataclass
-class Position():
-    """The ``position`` token defines the positional coordinates and rotation of an object.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_position_identifier
-    """
-
-    X: float = 0.0
-    """The ``X`` attribute defines the horizontal position of the object"""
-
-    Y: float = 0.0
-    """The ``Y`` attribute defines the vertical position of the object"""
-
-    angle: Optional[float] = None
-    """The optional ``angle`` attribute defines the rotational angle of the object. Not all
-    objects have rotational position definitions. Symbol text angles are stored in tenths
-    of a degree. All other angles are stored in degrees."""
-
-    # TODO: What is this? Documentation does not tell ..
-    unlocked: bool = False
-    """The ``unlocked`` token's description has to be defined yet .."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Position:
-        """Convert the given S-Expresstion into a Position object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(xxx ...)``
-
-        Raises:
-            - Exception: When the given expression is not of type ``list`` or the list is less than
-                         3 items long
-
-        Returns:
-            - Position: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 3:
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.X = exp[1]
-        object.Y = exp[2]
-        if len(exp) >= 4:
-            # More than four components means X, Y, and either angle or unlocked are present
-            if exp[3] != 'unlocked':
-                object.angle = exp[3]
-
-        for item in exp:
-            if item == 'unlocked': object.unlocked = True
-
-        return object
-
-    def to_sexpr(self) -> str:
-        """This object does not have a direct S-Expression representation."""
-        raise NotImplementedError("This object does not have a direct S-Expression representation")
-
-
-@dataclass
-class Coordinate():
-    """The ``coordinate`` token defines a three-dimentional position"""
-
-    X: float = 0.0
-    """The ``X`` token defines the position of the object on the x-axis"""
-
-    Y: float = 0.0
-    """The ``Y`` token defines the position of the object on the y-axis"""
-
-    Z: float = 0.0
-    """The ``Z`` token defines the position of the object on the z-axis"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Coordinate:
-        """Convert the given S-Expresstion into a Coordinate object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(xyz ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is not 4 items long
-            - Exception: When the first item of the list is not xyz
-
-        Returns:
-            - Coordinate: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) != 4:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'xyz':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.X = exp[1]
-        object.Y = exp[2]
-        object.Z = exp[3]
-        return object
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        return f'{indents}(xyz {self.X} {self.Y} {self.Z}){endline}'
-
-
-@dataclass
-class ColorRGBA():
-    """The ``color`` token defines a RGBA color"""
-
-    R: int = 0
-    """The ``R`` token defines the red channel of the color"""
-
-    G: int = 0
-    """The ``G`` token defines the green channel of the color"""
-
-    B: int = 0
-    """The ``B`` token defines the blue channel of the color"""
-
-    A: int = 0
-    """The ``A`` token defines the alpha channel of the color"""
-
-    precision: Optional[int] = None
-    """Wether the output of ``to_sexpr()`` should have a set number of precision after the decimal
-    point of the ``self.A`` attribute"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> ColorRGBA:
-        """Convert the given S-Expresstion into a ColorRGBA object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(color ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is not 5 items long
-            - Exception: When the first item of the list is not color
-
-        Returns:
-            - ColorRGBA: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) != 5:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'color':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.R = exp[1]
-        object.G = exp[2]
-        object.B = exp[3]
-        object.A = exp[4]
-        return object
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        if self.precision is not None:
-            alpha = f'{self.A:.{self.precision}f}'
-        else:
-            alpha = f'{self.A}'
-
-        return f'{indents}(color {self.R} {self.G} {self.B} {alpha}){endline}'
-
-@dataclass
-class Stroke():
-    """The ``stroke`` token defines how the outlines of graphical objects are drawn.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_stroke_definition
-    """
-
-    width: float = 0.0
-    """The ``width`` token attribute defines the line width of the graphic object"""
-
-    type: Optional[str] = None
-    """The optional ``type`` token attribute defines the line style of the graphic object. Valid
-    stroke line styles are:
-    - ``dash``, ``dash_dot``, ``dash_dot_dot`` (since KiCad v7), ``dot``, ``default``, ``solid``
-    """
-
-    color: Optional[ColorRGBA] = None
-    """The ``color`` token attributes define the line red, green, blue, and alpha color settings.
-    Defaults to ``None`` and was made optional since KiCad 7."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Stroke:
-        """Convert the given S-Expresstion into a Stroke object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(stroke ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is not 4 items long
-            - Exception: When the first item of the list is not stroke
-
-        Returns:
-            - Stroke: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'stroke':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                continue
-            if item[0] == 'width': object.width = item[1]
-            if item[0] == 'type':  object.type = item[1]
-            if item[0] == 'color': object.color = ColorRGBA.from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        color = f' {self.color.to_sexpr()}' if self.color is not None else ''
-        the_type = f' (type {self.type})' if self.type is not None else ''
-        return f'{indents}(stroke (width {self.width}){the_type}{color}){endline}'
-
-
-
-@dataclass
-class Font():
-    """The ``font`` token attributes define how text is shown.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects
-    """
-    face: Optional[str] = None
-    """The optional 'face' token indicates the font family. It should be a TrueType font family
-    name or "KiCad Font" for the KiCad stroke font. (Kicad version 7)"""
-
-    height: float = 1.0
-    """The 'height' token attributes define the font's height"""
-
-    width: float = 1.0
-    """The 'width' token attributes define the font's width"""
-
-    thickness: Optional[float] = None
-    """The 'thickness' token attribute defines the line thickness of the font"""
-
-    bold: bool = False
-    """The 'bold' token specifies if the font should be bold"""
-
-    italic: bool = False
-    """The 'italic' token specifies if the font should be italicized"""
-
-    lineSpacing: Optional[float] = None
-    """The 'line_spacing' token specifies the spacing between lines as a ratio of standard
-    line-spacing. (Not yet supported)"""
-
-    color: Optional[ColorRGBA] = None
-    """The optional ``color`` token specifies the color of the text element
-
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Font:
-        """Convert the given S-Expresstion into a Font object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(font ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not font
-
-        Returns:
-            - Font: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'font':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'bold': object.bold = True
-                if item == 'italic': object.italic = True
-                continue
-            if item[0] == 'face': object.face = item[1]
-            if item[0] == 'size':
-                object.height = item[1]
-                object.width = item[2]
-            if item[0] == 'thickness': object.thickness = item[1]
-            if item[0] == 'line_spacing': object.lineSpacing = item[1]
-            if item[0] == 'color': object.color = ColorRGBA.from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        face_name, thickness, bold, italic, linespacing, color = '', '', '', '', '', ''
-
-        if self.face is not None:        face_name = f'(face "{dequote(self.face)}") '
-        if self.thickness is not None:   thickness = f' (thickness {self.thickness})'
-        if self.bold == True:            bold = ' bold'
-        if self.italic == True:          italic = ' italic'
-        if self.lineSpacing is not None: linespacing = f' (line_spacing {self.lineSpacing})'
-        if self.color is not None:       color = f' {self.color.to_sexpr()}'
-
-        expression = f'{indents}(font {face_name}(size {self.height} {self.width}){color}{thickness}{bold}{italic}{linespacing}){endline}'
-        return expression
-
-@dataclass
-class Justify():
-    """The ``justify`` token defines the justification of a text object
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects
-    """
-
-    horizontally: Optional[str] = None
-    """The ``horizontally`` token sets the horizontal justification. Valid values are ``right`` or ``left``"""
-
-    vertically: Optional[str] = None
-    """The ``vertically`` token sets the vertical justification. Valid values are ``top`` or ``bottom``"""
-
-    mirror: bool = False
-    """The ``mirror`` token defines if the text is mirrored or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Justify:
-        """Convert the given S-Expresstion into a Justify object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(justify ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not justify
-
-        Returns:
-            - Justify: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'justify':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            # 'center' is the standard on vertical but not on horizontal in work sheets
-            if item == 'left' or item == 'right' or item == 'center': object.horizontally = item
-            if item == 'top' or item == 'bottom': object.vertically = item
-            if item == 'mirror': object.mirror = True
-        return object
-
-    def to_sexpr(self, indent=0, newline=False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object or an empty string (depending on given indentation
-              and newline settings) if no justification is given. This will cause the text to be
-              horizontally and vertically aligend
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        if self.horizontally is None and self.vertically is None and self.mirror == False:
-            return f'{indents}{endline}';
-
-        horizontally, vertically, mirror = '', '', ''
-
-        if self.horizontally is not None: horizontally = f' {self.horizontally}'
-        if self.vertically is not None: vertically = f' {self.vertically}'
-        if self.mirror: mirror = f' mirror'
-
-        expression = f'{indents}(justify{horizontally}{vertically}{mirror}){endline}'
-        return expression
-
-@dataclass
-class Effects():
-    """All text objects can have an optional effects section that defines how the text is displayed.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_text_effects
-    """
-
-    font: Font = field(default_factory=lambda: Font())
-    """The ``font`` token defines how the text is shown"""
-
-    justify: Justify = field(default_factory=lambda: Justify())
-    """The ``justify`` token defines the justification of the text"""
-
-    hide: bool = False
-    """The optional ``hide`` token defines if the text is hidden"""
-
-    href: Optional[str] = None
-    """The optional ``href`` token specifies a link that the text element represents.
-
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Effects:
-        """Convert the given S-Expresstion into a Effects object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(effects ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not effects
-
-        Returns:
-            - Effects: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'effects':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'hide': object.hide = True
-                else: continue
-            if item[0] == 'font': object.font = Font().from_sexpr(item)
-            if item[0] == 'justify': object.justify = Justify().from_sexpr(item)
-            if item[0] == 'href': object.href = item[1]
-        return object
-
-    def to_sexpr(self, indent=0, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        justify = f' {self.justify.to_sexpr()}' if self.justify.to_sexpr() != '' else ''
-        hide = f' hide' if self.hide else ''
-        href = f' (href "{dequote(self.href)}")' if self.href is not None else ''
-
-        expression =  f'{indents}(effects {self.font.to_sexpr()}{justify}{href}{hide}){endline}'
-        return expression
-
-
-@dataclass
-class Net():
-    """The ``net`` token defines the number and name of a net"""
-
-    number: int = 0
-    """The ``number`` token defines the integer number of the net"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the net"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Net:
-        """Convert the given S-Expresstion into a Net object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(net ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not net
-
-        Returns:
-            - Net: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'net':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.number = exp[1]
-        object.name = exp[2]
-        return object
-
-    def to_sexpr(self, indent: int = 0, newline: bool = False) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        return f'{indents}(net {self.number} "{dequote(self.name)}"){endline}'
-
-@dataclass
-class Group():
-    """The ``group`` token defines a group of items.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_group
-    """
-
-    name: str = ""
-    """The ``name`` attribute defines the name of the group"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the group may be moved or not"""
-
-    id: str = ""
-    """The ``id`` token attribute defines the unique identifier of the group"""
-
-    members: List[str] = field(default_factory=list)
-    """The ``members`` token attributes define a list of unique identifiers of the objects belonging to the group"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Group:
-        """Convert the given S-Expresstion into a Group object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(group ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not group
-
-        Returns:
-            - Group: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'group':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.name = exp[1]
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'id': object.id = item[1]
-            if item[0] == 'members':
-                for member in item[1:]:
-                    object.members.append(member)
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = f' locked' if self.locked else ''
-
-        expression =  f'{indents}(group "{dequote(self.name)}"{locked} (id {self.id})\n'
-        expression += f'{indents}  (members\n'
-        for member in self.members:
-            expression += f'{indents}    {member}\n'
-
-        expression += f'{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class PageSettings():
-    """The ``paper`` token defines the drawing page size and orientation.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_page_settings
-    """
-    paperSize: str = "A4"
-    """The ``paperSize`` token defines the size of the paper. Valid sizes are `A0`, `A1`, `A2`,
-    `A3`, `A4`, `A5`, ``A``, ``B``, ``C``, ``D`` and ``E``. When using user-defines page sizes, set
-    this to ``User``"""
-
-    width: Optional[float] = None
-    """The ``width`` token sets the width of a user-defines page size"""
-
-    height: Optional[float] = None
-    """The ``height`` token sets the height of a user-defines page size"""
-
-    portrait: bool = False
-    """The ``portrait`` token defines if the page is in portrait or landscape mode"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> PageSettings:
-        """Convert the given S-Expresstion into a PageSettings object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(paper ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not paper
-            - Exception: When the paper type is set to ``User`` and the list's length is not 4
-
-        Returns:
-            - PageSettings: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'paper':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.paperSize = exp[1]
-        if object.paperSize == "User":
-            if len(exp) < 4:
-                raise Exception("PageSettings: Expected more data for paper type 'User'")
-
-            object.width = exp[2]
-            object.height = exp[3]
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'portrait': object.portrait = True
-                continue
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Raises:
-            - Exception: When paper size is set to ``User`` and width or height is not specified
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        width, height = '', ''
-        portrait = ' portrait' if self.portrait else ''
-        if self.paperSize == 'User':
-            if self.width is None or self.height is None:
-                raise Exception("Page size set to 'User' but width or height not specified")
-            width = f' {self.width}'
-            height = f' {self.height}'
-        return f'{indents}(paper "{dequote(self.paperSize)}"{width}{height}{portrait}){endline}'
-
-@dataclass
-class TitleBlock():
-    """The ``title_block`` token defines the contents of the title block.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/#_title_block
-    """
-
-    title: Optional[str] = None
-    """The optional ``title`` token attribute is a quoted string that defines the document title"""
-
-    date: Optional[str] = None
-    """The optional ``date`` token attribute is a quoted string that defines the document date using the YYYY-MM-DD format"""
-
-    revision: Optional[str] = None
-    """The optional ``revision`` token attribute is a quoted string that defines the document revision"""
-
-    company: Optional[str] = None
-    """The optional ``company`` token attribute is a quoted string that defines the document company name"""
-
-    comments: Dict[int, str] = field(default_factory=dict)
-    """The ``comments`` token attributes define a dictionary of document comments where the key is
-    a number from 1 to 9 and the value is a comment string"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> TitleBlock:
-        """Convert the given S-Expresstion into a TitleBlock object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(title_block ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not title_block
-
-        Returns:
-            - TitleBlock: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'title_block':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'title': object.title = item[1]
-            if item[0] == 'date': object.date = item[1]
-            if item[0] == 'rev': object.revision = item[1]
-            if item[0] == 'company': object.company = item[1]
-            if item[0] == 'comment': object.comments.update({item[1]: item[2]})
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(title_block\n'
-        if self.title is not None:
-            expression += f'{indents}  (title "{dequote(self.title)}")\n'
-
-        if self.date is not None:
-            expression += f'{indents}  (date "{dequote(self.date)}")\n'
-
-        if self.revision is not None:
-            expression += f'{indents}  (rev "{dequote(self.revision)}")\n'
-
-        if self.company is not None:
-            expression += f'{indents}  (company "{dequote(self.company)}")\n'
-
-        for number, comment in self.comments.items():
-            expression += f'{indents}  (comment {number} "{dequote(comment)}")\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Property():
-    """The ``property`` token defines a symbol property when used inside a ``symbol`` definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_property
-    """
-
-    key: str = ""
-    """The ``key`` string defines the name of the property and must be unique"""
-
-    value: str = ""
-    """The ``value`` string defines the value of the property"""
-
-    id: Optional[int] = None
-    """The ``id`` token defines an integer ID for the property and must be unique.
-
-    Optional since KiCad v7, but required in older versions"""
-
-    position: Position = field(default_factory=lambda: Position(angle=0))
-    """The ``position`` defines the X and Y coordinates as well as the rotation angle of the property.
-    All three items will initially be set to zero."""
-
-    effects: Optional[Effects] = None
-    """The optional ``effects`` section defines how the text is displayed"""
-
-    showName: bool = False
-    """The ``show_name`` token defines if the property name is visibly shown. Used for netclass
-    labels.
-
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Property:
-        """Convert the given S-Expresstion into a Property object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(property ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not property
-
-        Returns:
-            - Property: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'property':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.key = exp[1]
-        object.value = exp[2]
-        for item in exp[3:]:
-            if item[0] == 'id': object.id = item[1]
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'show_name': object.showName = True
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        id = f' (id {self.id})' if self.id is not None else ''
-        sn = ' (show_name)' if self.showName else ''
-
-        expression =  f'{indents}(property "{dequote(self.key)}" "{dequote(self.value)}"{id} (at {self.position.X} {self.position.Y}{posA}){sn}'
-        if self.effects is not None:
-            expression += f'\n{self.effects.to_sexpr(indent+2)}'
-            expression += f'{indents}){endline}'
-        else:
-            expression += f'){endline}'
-        return expression
-
-@dataclass
-class RenderCachePolygon():
-    """A polygon used by the ``render_cache`` token
-
-    Used since KiCad v7
-    """
-
-    pts: List[Position] = field(default_factory=list)
-    """The ``pts`` token defines a list of points that define the outlines of the polygon"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> RenderCachePolygon:
-        """Convert the given S-Expresstion into a RenderCachePolygon object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(polygon ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not polygon
-
-        Returns:
-            - RenderCachePolygon: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'polygon':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.pts.append(Position.from_sexpr(point))
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression = f'{indents}(polygon\n'
-        expression += f'{indents}  (pts'
-
-        for i, point in enumerate(self.pts):
-            if i % 4 == 0:
-                expression += f'\n'
-            expression += f'{indents}    '
-            expression += f'(xy {point.X} {point.Y})'
-
-        # NOTE: This expects the length of the points array to be a multiple of four to get the
-        #       formatting right.
-        expression += f'\n{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class RenderCache():
-    """The ``render_cache`` token defines a cache for none-standard fonts.
-
-    Used since KiCad v7
-
-    Documentation:
-        - None found (05.03.2023), seems to be used in ''text_box'' tokens for custom fonts
-    """
-
-    text: str = ""
-    """The ``text`` token defines which text the cache represents. Defaults to an empty string."""
-
-    id: int = 0
-    """The ``id`` token is some number after the text. Defaults to 0."""
-
-    polygons: List[Position] = field(default_factory=list)
-    """The ``polygons`` token is a list of polygons that define the outline of the cached text"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> RenderCache:
-        """Convert the given S-Expresstion into a RenderCache object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(render_cache ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is smaller than 3
-            - Exception: When the first item of the list is not render_cache
-
-        Returns:
-            - RenderCache: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 3:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'render_cache':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        object.id = exp[2]
-        for item in exp:
-            if item[0] == 'polygon': object.polygons.append(RenderCachePolygon.from_sexpr(item))
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression = f'{indents}(render_cache "{dequote(self.text)}" {self.id}\n'
-        for poly in self.polygons:
-            expression += poly.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Fill():
-    """The ``fill`` token defines how schematic and symbol graphical items are filled
-
-    Documentation:
-        - https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_fill_definition
-    """
-
-    type: str = "none"
-    """The ``type`` attribute defines how the graphical item is filled. Defaults to ``None``.
-    Possible values are:
-    - ``none``: Graphic is not filled
-    - ``outline``: Graphic item filled with the line color
-    - ``background``: Graphic item filled with the theme background color"""
-
-    color: Optional[ColorRGBA] = None
-    """The optional ``color`` token defines the color of the filled item.
-
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Fill:
-        """Convert the given S-Expresstion into a Fill object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(fill ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or the list is smaller than 3
-            - Exception: When the first item of the list is not fill
-
-        Returns:
-            - Fill: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'fill':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'type': object.type = item[1]
-            if item[0] == 'color': object.color = ColorRGBA().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        color = f' {self.color.to_sexpr()}' if self.color is not None else ''
-
-        expression = f'{indents}(fill (type {self.type}){color}){endline}'
-        return expression
-
-@dataclass
-class Image():
-    """The ``image`` token defines an image embedded into the file
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_image_section
-    """
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates of the image"""
-
-    scale: Optional[float] = None
-    """The optional ``scale`` token attribute defines the scale factor (size) of the image"""
-
-    data: List[str] = field(default_factory=list)
-    """The ``data`` token attribute defines the image data in the portable network graphics
-    format (PNG) encoded with MIME type base64 as a list of strings"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    layer: Optional[str] = None
-    """The optional ``layer`` token defines the canonical layer name when the image is used inside
-    a footprint or PCB. When used inside a schematic, this token is required to be ``None``."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Image:
-        """Convert the given S-Expresstion into a Image object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(image ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not image
-
-        Returns:
-            - Image: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'image':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'scale': object.scale = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'data':
-                for b64part in item[1:]:
-                    object.data.append(b64part)
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        scale = f' (scale {self.scale})' if self.scale is not None else ''
-        layer = f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-
-        expression =  f'{indents}(image (at {self.position.X} {self.position.Y}){layer}{scale}\n'
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}  (data\n'
-        for b64part in self.data:
-            expression += f'{indents}    {b64part}\n'
-        expression += f'{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class ProjectInstance(ABC):
-    """The ``instances`` token defines a project instance and serves as an abstract base class for
-    symbol and hierarchical sheet project instances.
-    
-    Available since KiCad v7."""
-
-    name: str = ""
-    """The ``name`` token defines the name of the project instance"""
-
-    @abstractmethod
-    def from_sexpr(cls, exp: list) -> ProjectInstance:
-        raise NotImplementedError
-
-    @abstractmethod
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        raise NotImplementedError
diff --git a/kiutils/items/dimensions.py b/kiutils/items/dimensions.py
deleted file mode 100644
index 098c1e4..0000000
--- a/kiutils/items/dimensions.py
+++ /dev/null
@@ -1,338 +0,0 @@
-"""The dimensions are used to mark spots in the board file for their dimensions (units, metric,
-imperial, etc)
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    14.06.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-
-from kiutils.items.common import Position
-from kiutils.items.gritems import GrText
-from kiutils.utils.strings import dequote
-
-@dataclass
-class DimensionFormat():
-    """The ``format`` token defines the text formatting of a dimension
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension_format
-    """
-
-    prefix: Optional[str] = None
-    """The optional ``prefix`` token defines the string to add to the beginning of the dimension text"""
-
-    suffix: Optional[str] = None
-    """The optional ``suffix`` token defines the string to add to the end of the dimension text"""
-
-    units: int = 3
-    """The ``units`` token defines the dimension units used to display the dimension text. Valid units
-    are as follows:
-    - 0: Inches
-    - 1: Mils
-    - 2: Millimeters
-    - 3: Automatic"""
-
-    unitsFormat: int = 1
-    """The ``unitsFormat`` token defines how the unit's suffix is formatted. Valid units formats are
-    as follows:
-    - 0: No suffix
-    - 1: Bare suffix
-    - 2: Wrap suffix in parenthesis"""
-
-    precision: int = 4
-    """The ``precision`` token defines the number of significant digits to display"""
-
-    overrideValue: Optional[str] = None
-    """The optional ``overrideValue`` token defines the text to substitute for the actual physical
-    dimension"""
-
-    suppressZeroes: bool = False
-    """The ``suppressZeroes`` token removes all trailing zeros from the dimension text"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> DimensionFormat:
-        """Convert the given S-Expresstion into a DimensionFormat object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(format ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not format
-
-        Returns:
-            - DimensionFormat: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'format':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if type(item) != type([]):
-                if item == 'suppress_zeroes': object.suppressZeroes = True
-                continue
-            if item[0] == 'prefix': object.prefix = item[1]
-            if item[0] == 'suffix': object.suffix = item[1]
-            if item[0] == 'units': object.units = item[1]
-            if item[0] == 'units_format': object.unitsFormat = item[1]
-            if item[0] == 'precision': object.precision = item[1]
-            if item[0] == 'override_value': object.overrideValue = item[1]
-            pass
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        prefix = f' (prefix "{dequote(self.prefix)}")' if self.prefix is not None else ''
-        suffix = f' (suffix "{dequote(self.suffix)}")' if self.suffix is not None else ''
-        overwrite_val = f' (override_value "{dequote(self.overrideValue)}")' if self.overrideValue is not None else ''
-        suppress_zeroes = f' suppress_zeroes' if self.suppressZeroes else ''
-
-        expression =  f'{indents}(format{prefix}{suffix} (units {self.units}) (units_format {self.unitsFormat}) (precision {self.precision}){overwrite_val}{suppress_zeroes}){endline}'
-        return expression
-
-@dataclass
-class DimensionStyle():
-    """The ``style`` token defines the style of a dimension
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension_style
-    """
-
-    thickness: float = 0.0
-    """The ``thickness`` token defines the line thickness of the dimension"""
-
-    arrowLength: float = 0.0
-    """The ``arrowLength`` token defines the length of the dimension arrows"""
-
-    textPositionMode: int = 0
-    """The ``textPositionMode`` token defines the position mode of the dimension text. Valid position
-    modes are as follows:
-    - 0: Text is outside the dimension line
-    - 1: Text is in line with the dimension line
-    - 2: Text has been manually placed by the user"""
-
-    extensionHeight: Optional[float] = None
-    """The optional ``extensionHeight`` token defines the length of the extension lines past the
-    dimension crossbar"""
-
-    textFrame: Optional[int] = None
-    """The optional ``textFrame`` token defines the style of the frame around the dimension text. This
-    only applies to leader dimensions. Valid text frames are as follows:
-    - 0: No text frame
-    - 1: Rectangle
-    - 2: Circle
-    - 3:Rounded rectangle"""
-
-    extensionOffset: Optional[float] = None
-    """The optional ``extensionOffset`` token defines the distance from feature points to extension
-    line start"""
-
-    keepTextAligned: bool = False
-    """The ``keepTextAligned`` token indicates that the dimension text should be kept in line with the
-    dimension crossbar. When false, the dimension text is shown horizontally regardless of the
-    orientation of the dimension."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> DimensionStyle:
-        """Convert the given S-Expresstion into a DimensionStyle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(style ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not style
-
-        Returns:
-            - DimensionStyle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'style':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if type(item) != type([]):
-                if item == 'keep_text_aligned': object.keepTextAligned = True
-                continue
-            if item[0] == 'thickness': object.thickness = item[1]
-            if item[0] == 'arrow_length': object.arrowLength = item[1]
-            if item[0] == 'text_position_mode': object.textPositionMode = item[1]
-            if item[0] == 'extension_height': object.extensionHeight = item[1]
-            if item[0] == 'text_frame': object.textFrame = item[1]
-            if item[0] == 'extension_offset': object.extensionOffset = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        extension_height = f' (extension_height {self.extensionHeight})' if self.extensionHeight is not None else ''
-        text_frame = f' (text_frame {self.textFrame})' if self.textFrame is not None else ''
-        extension_offset = f' (extension_offset {self.extensionOffset})' if self.extensionOffset is not None else ''
-        keep_aligned = f' keep_text_aligned' if self.keepTextAligned else ''
-
-        expression =  f'{indents}(style (thickness {self.thickness}) (arrow_length {self.arrowLength}) (text_position_mode {self.textPositionMode}){extension_height}{text_frame}{extension_offset}{keep_aligned}){endline}'
-        return expression
-
-@dataclass
-class Dimension():
-    """The ``dimension`` token defines a dimension in the PCB
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_dimension
-    """
-
-    locked: bool = False
-    """The optional ``locked`` token specifies if the dimension can be moved"""
-
-    type: str = "aligned"
-    """The ``type`` token defines the type of dimension. Valid dimension types are ``aligned``,
-    ``leader``, ``center``, ``orthogonal`` (and ``radial`` in KiCad version 7)"""
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the polygon resides on"""
-
-    uuid: Optional[str] = None
-    """The ``uuid`` token defines the unique identifier for the footprint. This only applies
-    to footprints defined in the board file format."""
-
-    pts: List[Position] = field(default_factory=list)
-    """The ``pts`` token define the list of xy coordinates of the dimension"""
-
-    height: Optional[float] = None
-    """The optional ``height`` token defines the height of aligned dimensions"""
-
-    orientation: Optional[float] = None
-    """The optional ``orientation`` token defines the rotation angle for orthogonal dimensions"""
-
-    leaderLength: Optional[float] = None
-    """The optional ``leaderLength`` token attribute defines the distance from the marked radius to
-    the knee for radial dimensions."""
-
-    grText: Optional[GrText] = None
-    """The optional ``grText`` token define the dimension text formatting for all dimension types
-    except center dimensions"""
-
-    format: Optional[DimensionFormat] = None
-    """The optional ``format`` token define the dimension formatting for all dimension types except
-    center dimensions"""
-
-    style: DimensionStyle = field(default_factory=lambda: DimensionStyle())
-    """The ``style`` token defines the dimension style information"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Dimension:
-        """Convert the given S-Expresstion into a Dimension object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(dimension ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not dimension
-
-        Returns:
-            - Dimension: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'dimension':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'type': object.type = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'height': object.height = item[1]
-            if item[0] == 'orientation': object.orientation = item[1]
-            if item[0] == 'leader_length': object.leaderLength = item[1]
-            if item[0] == 'gr_text': object.grText = GrText().from_sexpr(item)
-            if item[0] == 'format': object.format = DimensionFormat().from_sexpr(item)
-            if item[0] == 'style': object.style = DimensionStyle().from_sexpr(item)
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.pts.append(Position().from_sexpr(point))
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Raises:
-            - Exception: When number of coordinate points of the dimension equals 0
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        points = ''
-        for point in self.pts:
-            points = f'{points} (xy {point.X} {point.Y})'
-        if len(points) == 0:
-            raise Exception("Number of points must not be zero")
-
-        expression =   f'{indents}(dimension (type {self.type}) (layer "{self.layer}") (uuid {self.uuid})\n'
-        expression +=  f'{indents}  (pts{points})\n'
-        if self.height is not None:
-            expression +=  f'{indents}  (height {self.height})\n'
-        if self.orientation is not None:
-            expression +=  f'{indents}  (orientation {self.orientation})\n'
-        if self.leaderLength is not None:
-            expression +=  f'{indents}  (leader_length {self.leaderLength})\n'
-        if self.grText is not None:
-            expression += self.grText.to_sexpr(indent+2)
-        if self.format is not None:
-            expression += self.format.to_sexpr(indent+2)
-        expression += self.style.to_sexpr(indent+2)
-        expression +=  f'{indents}){endline}'
-        return expression
\ No newline at end of file
diff --git a/kiutils/items/gritems.py b/kiutils/items/gritems.py
deleted file mode 100644
index 5e00f1f..0000000
--- a/kiutils/items/gritems.py
+++ /dev/null
@@ -1,780 +0,0 @@
-"""The graphical items are footprint and board items that are outside of the connectivity items.
-   This includes graphical items on technical, user, and copper layers. Graphical items are also
-   used to define complex pad geometries.
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    10.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphic_items
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-
-from kiutils.items.common import Effects, Position, RenderCache, Stroke
-from kiutils.utils.strings import dequote
-
-@dataclass
-class GrText():
-    """The ``gr_text`` token defines a graphical text.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_text
-    """
-
-    text: str = ""
-    """The ``text`` attribute is a string that defines the text"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y position coordinates and optional orientation angle of the text"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the text resides on"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is displayed"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the text object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    renderCache: Optional[RenderCache] = None
-    """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token 
-    should be given in case the font can not be found on the current system.
-    
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrText:
-        """Convert the given S-Expresstion into a GrText object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_text ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_text
-
-        Returns:
-            - GrText: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_text':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        locked = f' locked' if self.locked else ''
-
-        expression =  f'{indents}(gr_text{locked} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){layer}{uuid}\n'
-        expression += f'{indents}  {self.effects.to_sexpr()}'
-        if self.renderCache is not None:
-            expression += self.renderCache.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class GrTextBox():
-    """The ``gr_text_box`` token defines a graphical rectangle containing line-wrapped text.
-
-    Available since KiCad v7
-    
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_text_box
-    """
-
-    locked: bool = False
-    """The ``locked`` token specifies if the text box can be moved. Defaults to ``False``."""
-
-    text: str = ""
-    """The ``text`` token defines the content of the text box. Defaults to an empty string."""
-
-    start: Optional[Position] = None
-    """The optional ``start`` token defines the top-left of a cardinally oriented text box"""
-
-    end: Optional[Position] = None
-    """The optional ``end`` token defines the bottom-right of a cardinally oriented text box"""
-
-    pts: List[Position] = field(default_factory=list)
-    """The ``pts`` token defines the four corners of a non-cardianlly oriented text box. The corners
-    must be in order, but the winding can be either direction."""
-
-    angle: Optional[float] = None
-    """The optional ``angle`` token defines the rotation of the text box in degrees.
-
-    Note:
-        - If ``angle`` is not given, or is a cardinal angle (0, 90, 180 or 270), then the text box
-          MUST have ``start`` and ``end`` tokens.
-        - If ``angle`` is given and is not a cardinal angle, then the text box MUST have a ``pts``
-          token (with 4 pts).
-    """
-
-    layer: str = "F.Cu"
-    """The ``layer`` token defines the canonical layer the text box resides on. Defaults to
-    ``F.Cu``."""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` token defines the unique identifier of the text box"""
-
-    effects: Optional[Effects] = None
-    """The optional ``effects`` token describes the style of the text in the text box"""
-
-    stroke: Optional[Stroke] = None
-    """The optional ``stroke`` token describes the style of an optional border to be drawn around 
-    the text box"""
-
-    renderCache: Optional[RenderCache] = None
-    """If the ``effects`` token prescribe a TrueType font then the optional ``render_cache`` token 
-    should be given in case the font can not be found on the current system.
-    
-    Available since KiCad v7"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrTextBox:
-        """Convert the given S-Expression into a GrTextBox object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_text_box ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not fp_text_box
-
-        Returns:
-            - GrTextBox: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_text_box':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        # Extract "locked" token, if any is present
-        if exp[1] == "locked" and not isinstance(exp[2], list):
-            object.locked = True
-            object.text = exp[2]
-            start_at = 3
-        else:
-            object.text = exp[1]
-            start_at = 2
-
-        for item in exp[start_at:]:
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.pts.append(Position().from_sexpr(point))
-            if item[0] == 'angle': object.angle = item[1]
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'effects': object.effects = Effects.from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item)
-            if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item)
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Raises:
-            - Exception: When a non-cardinal angle is given and no corner points were defined using
-              the ``self.pts`` token
-            - Exception: When a cardinal angle or no angle is given and either start or end token
-              is undefined
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        if self.angle is not None and self.angle not in [0.0, 90.0, 180.0, 270.0]:
-            if len(self.pts) != 4:
-                raise Exception("None-cardinal angles must have exactly four corner points defined")
-        if self.angle is None or self.angle in [0.0, 90.0, 180.0, 270.0]:
-            if self.start is None or self.end is None:
-                raise Exception("No angle or a cardinal angle needs a start and end token defined")
-
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        angle = f'(angle {self.angle}) ' if self.angle is not None else ''
-        start = f'(start {self.start.X} {self.start.Y}) ' if self.start is not None else ''
-        end = f'(end {self.end.X} {self.end.Y}) ' if self.end is not None else ''
-        locked = ' locked' if self.locked else ''
-
-        expression = f'{indents}(gr_text_box{locked} "{dequote(self.text)}"\n'
-        if len(self.pts) == 4:
-            expression += f'{indents}  (pts\n'
-            expression += f'{indents}    (xy {self.pts[0].X} {self.pts[0].Y})        (xy {self.pts[1].X} {self.pts[1].Y})        (xy {self.pts[2].X} {self.pts[2].Y})        (xy {self.pts[3].X} {self.pts[3].Y})\n'
-            expression += f'{indents}  )\n'
-        expression += f'{indents}  {start}{end}{angle}(layer "{dequote(self.layer)}"){uuid}\n'
-        if self.effects is not None:
-            expression += self.effects.to_sexpr(indent+2)
-        if self.stroke is not None:
-            expression += self.stroke.to_sexpr(indent+2)
-        if self.renderCache is not None:
-            expression += self.renderCache.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class GrLine():
-    """The ``gr_line`` token defines a graphical line.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_line
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the start of the line"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the end of the line"""
-
-    angle: Optional[float] = None
-    """The optional ``angle`` token defines the rotational angle of the line"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the rectangle resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the rectangle. (prior to version 7)"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the rectangle object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrLine:
-        """Convert the given S-Expresstion into a GrLine object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_line ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_line
-
-        Returns:
-            - GrLine: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_line':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width': object.width = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = f' locked' if self.locked else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        angle = f' (angle {self.angle}' if self.angle is not None else ''
-
-        return f'{indents}(gr_line{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){angle}{layer} (width {self.width}){uuid}){endline}'
-
-@dataclass
-class GrRect():
-    """The ``gr_rect`` token defines a graphical rectangle.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_rectangle
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the upper left corner of the rectangle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the low right corner of the rectangle"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the rectangle resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the rectangle. (prior to version 7)"""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the rectangle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the rectangle object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrRect:
-        """Convert the given S-Expresstion into a GrRect object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_rect ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_rect
-
-        Returns:
-            - GrRect: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_rect':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width': object.width = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = f' locked' if self.locked else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-
-        return f'{indents}(gr_rect{locked} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){fill}{uuid}){endline}'
-
-@dataclass
-class GrCircle():
-    """The ``gr_circle `` token defines a graphical circle.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_circle
-    """
-
-    center: Position = field(default_factory=lambda: Position())
-    """The ``center`` token defines the coordinates of the center of the circle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the low right corner of the circle"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the circle resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the circle. (prior to version 7)"""
-
-    stroke: Optional[Stroke] = None
-    """The optional ``stroke`` token describes the style of the circle's boundary."""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the circle is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the circle object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrCircle:
-        """Convert the given S-Expresstion into a GrCircle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_circle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_circle
-
-        Returns:
-            - GrCircle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_circle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'center': object.center = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width': object.width = item[1]
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = f' locked' if self.locked else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        stroke = self.stroke.to_sexpr() if self.stroke is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-
-        return f'{indents}(gr_circle{locked} (center {self.center.X} {self.center.Y}) (end {self.end.X} {self.end.Y}){layer}{stroke} (width {self.width}){fill}{uuid}){endline}'
-
-@dataclass
-class GrArc():
-    """The ``gr_arc`` token defines a graphic arc.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_arc
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of the start position of the arc radius"""
-
-    mid: Position = field(default_factory=lambda: Position())
-    """The ``mid`` token defines the coordinates of the midpoint along the arc"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of the end position of the arc radius"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the arc resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the arc. (prior to version 7)"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the arc object."""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrArc:
-        """Convert the given S-Expresstion into a GrArc object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_arc ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_arc
-
-        Returns:
-            - GrArc: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_arc':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'start': object.start = Position.from_sexpr(item)
-            if item[0] == 'mid': object.mid = Position.from_sexpr(item)
-            if item[0] == 'end': object.end = Position.from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width': object.width = item[1]
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        locked = f' locked' if self.locked else ''
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-
-        return f'{indents}(gr_arc{locked} (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y}){layer} (width {self.width}){uuid}){endline}'
-
-@dataclass
-class GrPoly():
-    """The ``gr_poly`` token defines a graphic polygon in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_polygon
-    """
-
-    layer: Optional[str] = None
-    """The ``coordinates`` define the list of X/Y coordinates of the polygon outline"""
-
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``layer`` token defines the canonical layer the polygon resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the polygon. (prior to version 7)"""
-
-    fill: Optional[str] = None
-    """The optional ``fill`` toke defines how the polygon is filled. Valid fill types are solid and none. If not defined, the rectangle is not filled"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the polygon object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    net: Optional[int] = None
-    """The ``net`` token defines the net identifier associated with the polygon."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrPoly:
-        """Convert the given S-Expresstion into a GrPoly object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_poly ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_poly
-
-        Returns:
-            - GrPoly: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_poly':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(point))
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fill': object.fill = item[1]
-            if item[0] == 'width': object.width = item[1]
-            if item[0] == 'net': object.net = int(item[1])
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True, pts_newline: bool = False) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the polygon, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-            - pts_newline (bool): Adds a newline for the ``(pts ..)`` token as KiCad treats
-                                  this different in Board files than Footprint files. Defaults to 
-                                  False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        fill = f' (fill {self.fill})' if self.fill is not None else ''
-        locked = f' locked' if self.locked else ''
-        net = f' (net {self.net})' if self.net is not None else ''
-
-        if pts_newline:
-            expression =  f'{indents}(gr_poly{locked}\n'
-            expression += f'{indents}  (pts\n'
-        else:
-            expression =  f'{indents}(gr_poly{locked} (pts\n'
-
-        for point in self.coordinates:
-            expression += f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  ){layer} (width {self.width}){fill}{net}{uuid}){endline}'
-        return expression
-
-@dataclass
-class GrCurve():
-    """The ``gr_curve`` token defines a graphic Cubic Bezier curve in a footprint definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_graphical_curve
-    """
-    coordinates: List[Position] = field(default_factory=list)
-    """The ``coordinates`` define the list of X/Y coordinates of the curve outline"""
-
-    layer: Optional[str] = None
-    """The ``layer`` token defines the canonical layer the curve resides on"""
-
-    width: Optional[float] = 0.12     # Used for KiCad < 7
-    """The ``width`` token defines the line width of the curve. (prior to version 7)"""
-
-    uuid: Optional[str] = None      # Used since KiCad 6
-    """The ``uuid`` token defines the unique identifier of the curve object"""
-
-    locked: bool = False
-    """The ``locked`` token defines if the object may be moved or not"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GrCurve:
-        """Convert the given S-Expresstion into a GrCurve object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(gr_curve ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not gr_curve
-
-        Returns:
-            - GrCurve: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'gr_curve':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'locked': object.locked = True
-                continue
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.coordinates.append(Position().from_sexpr(point))
-            if item[0] == 'layer': object.layer = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'width': object.width = item[1]
-
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object. When no coordinates are set
-        in the curve, the resulting S-Expression will be left empty.
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        if len(self.coordinates) == 0:
-            return f'{indents}{endline}'
-
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-        layer =  f' (layer "{dequote(self.layer)}")' if self.layer is not None else ''
-        locked = f' locked' if self.locked else ''
-
-        expression = f'{indents}(gr_curve{locked} (pts\n'
-        for point in self.coordinates:
-            expression += f'{indents}  (xy {point.X} {point.Y})\n'
-        expression += f'{indents}){layer} (width {self.width}{uuid}){endline}'
-        return expression
diff --git a/kiutils/items/schitems.py b/kiutils/items/schitems.py
deleted file mode 100644
index 1c31cd5..0000000
--- a/kiutils/items/schitems.py
+++ /dev/null
@@ -1,1919 +0,0 @@
-"""Defines items used in KiCad schematic files
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    19.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/
-"""
-
-from __future__ import annotations
-
-import re
-from dataclasses import dataclass, field
-from typing import Optional, List, Dict
-
-from kiutils.items.common import Fill, Position, ColorRGBA, ProjectInstance, Stroke, Effects, Property
-from kiutils.utils.strings import dequote
-
-@dataclass
-class Junction():
-    """The ``junction`` token defines a junction in the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_junction_section
-    """
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates of the junction"""
-
-    diameter: float = 0
-    """The ``diameter`` token attribute defines the DIAMETER of the junction. A diameter of 0
-       is the default diameter in the system settings."""
-
-    color: ColorRGBA = field(default_factory=lambda: ColorRGBA())
-    """The ``color`` token attributes define the Red, Green, Blue, and Alpha transparency of
-       the junction. If all four attributes are 0, the default junction color is used."""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Junction:
-        """Convert the given S-Expresstion into a Junction object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(junction ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not junction
-
-        Returns:
-            - Junction: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'junction':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'color': object.color = ColorRGBA().from_sexpr(item)
-            if item[0] == 'diameter': object.color = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        uuid = f'\n{indents}  (uuid {self.uuid})\n' if self.uuid is not None else ''
-        expression =  f'{indents}(junction (at {self.position.X} {self.position.Y}) (diameter {self.diameter}) {self.color.to_sexpr()}{uuid}{indents}){endline}'
-        return expression
-
-@dataclass
-class NoConnect():
-    """The ``no_connect`` token defines a unused pin connection in the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_no_connect_section
-    """
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates of the no connect"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> NoConnect:
-        """Convert the given S-Expresstion into a NoConnect object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(no_connect ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not no_connect
-
-        Returns:
-            - NoConnect: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'no_connect':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        uuid = f' (uuid {self.uuid})' if self.uuid is not None else ''
-
-        return f'{indents}(no_connect (at {self.position.X} {self.position.Y}){uuid}){endline}'
-
-@dataclass
-class BusEntry():
-    """The ``bus_entry`` token defines a bus entry in the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_bus_entry_section
-    """
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates of the bus entry"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    size: Position = field(default_factory=lambda: Position())         # Re-using Position class here
-    """The ``size`` token attributes define the X and Y distance of the end point from
-       the position of the bus entry"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the bus entry is drawn"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> BusEntry:
-        """Convert the given S-Expresstion into a BusEntry object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(bus_entry ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not bus_entry
-
-        Returns:
-            - BusEntry: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'bus_entry':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'size': object.size = Position().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(bus_entry (at {self.position.X} {self.position.Y}) (size {self.size.X} {self.size.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class BusAlias():
-    """The ``bus_alias`` token defines a bus entry in the schematic
-
-    Documentation:
-        https://gitlab.com/kicad/services/kicad-dev-docs/-/merge_requests/53/diffs
-    """
-
-    name: str = ""
-    """The ``name`` of the bus."""
-
-    members: List[str] = field(default_factory=list)
-    """The list of ``members`` defined in the bus. Note that when you tap out a bus entry
-    from a bus using one these members a label will be created with the selected member name"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> BusAlias:
-        """Convert the given S-Expresstion into a BusAlias object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(bus_alias ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not bus_alias
-            - Exception: When the S-Expression is not exactly three items long
-            - Exception: When the ``members`` token is missing
-
-        Returns:
-            - BusAlias: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'bus_alias':
-            raise Exception("Expression does not have the correct type")
-
-        if len(exp) != 3:
-            raise Exception("Exactly three items are expected in a bus_alias S-Expression.")
-        
-        if not isinstance(exp[2], list) or exp[2][0] != 'members':
-            raise Exception("bus_alias needs to contain a list of members")
-        
-        object = cls()
-        object.name = exp[1]
-        object.members = [x for x in exp[2][1:]]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        members = [f'"{dequote(member)}"' for member in self.members]
-        expression =  f'{indents}(bus_alias "{dequote(self.name)}" (members {" ".join(members)})){endline}'
-        return expression
-
-@dataclass
-class Connection():
-    """The ``wire`` and ``bus`` tokens define wires and buses in the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_wire_and_bus_section
-    """
-
-    type: str = "wire"
-    """The ``type`` token defines wether the connection is a ``bus`` or a ``wire``"""
-
-    points: List[Position] = field(default_factory=list)
-    """The ``points`` token defines the list of X and Y coordinates of start and end points
-       of the wire or bus"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the connection is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Connection:
-        """Convert the given S-Expresstion into a Connection object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(wire ...)`` or ``(bus ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not wire or bus
-
-        Returns:
-            - Connection: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if not (exp[0] == 'wire' or exp[0] == 'bus'):
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.type = exp[0]
-        for item in exp:
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.points.append(Position().from_sexpr(point))
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        points = ''
-        for point in self.points:
-            points += f' (xy {point.X} {point.Y})'
-
-        expression =  f'{indents}({self.type} (pts{points})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class PolyLine():
-    """The ``polyline`` token defines one or more lines that may or may not represent a polygon
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_graphical_line_section
-    """
-
-    points: List[Position] = field(default_factory=list)
-    """The ``points`` token defines the list of X/Y coordinates of to draw line(s)
-       between. A minimum of two points is required."""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the graphical line is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> PolyLine:
-        """Convert the given S-Expresstion into a PolyLine object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(polyline ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not polyline
-
-        Returns:
-            - PolyLine: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'polyline':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.points.append(Position().from_sexpr(point))
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        points = ''
-        for point in self.points:
-            points += f' (xy {point.X} {point.Y})'
-
-        expression =  f'{indents}(polyline (pts{points})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Text():
-    """The ``text`` token defines graphical text in a schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_graphical_text_section
-    """
-
-    text: str = ""
-    """The ``text`` token defines the text string"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the text"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Text:
-        """Convert the given S-Expresstion into a Text object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(text ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not text
-
-        Returns:
-            - Text: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'text':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-
-        expression =  f'{indents}(text "{dequote(self.text)}"'
-
-        # Strings longer or equal than 50 chars have the position in the next line
-        if len(self.text) >= 50:
-            expression += f'\n{indents}  '
-        else:
-            expression += ' '
-        expression += f'(at {self.position.X} {self.position.Y}{posA})\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class TextBox():
-    """The ``text_box`` token defines a text box inside a schematic
-
-    Available since KiCad v7
-
-    Documentation:
-        ????
-    """
-    text: str = ""
-    """The ``text`` token defines the text string"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the text"""
-
-    size: Position = field(default_factory=lambda: Position())
-    """The ``size`` token defines the size in X and Y direction. Angle is not used."""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` token defines the look of the outline of the text box"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token defines how the text box should be filled"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> TextBox:
-        """Convert the given S-Expresstion into a TextBox object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(text_box ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not text_box
-
-        Returns:
-            - TextBox: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'text_box':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'size': object.size = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-
-        expression =  f'{indents}(text_box "{dequote(self.text)}"\n'
-        expression += f'{indents}  (at {self.position.X} {self.position.Y}{posA}) (size {self.size.X} {self.size.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class LocalLabel():
-    """The ``label`` token defines an wire or bus label name in a schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#local_label_section
-    """
-
-    text: str = ""
-    """The ``text`` token defines the text in the label"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the label"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the label is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-    with the global label have been place automatically"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> LocalLabel:
-        """Convert the given S-Expresstion into a LocalLabel object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(label ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not label
-
-        Returns:
-            - LocalLabel: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'label':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        fieldsAutoplaced = ' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-
-        expression =  f'{indents}(label "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}){fieldsAutoplaced}\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class GlobalLabel():
-    """The ``global_label`` token defines a label name that is visible across all schematics in a design
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_global_label_section
-    """
-
-    text: str = ""
-    """The ``text`` token defines the text in the label"""
-
-    shape: str = "input"
-    """The ``shape`` token defines the way the global label is drawn. Possible values are:
-       ``input``, ``output``, ``bidirectional``, ``tri_state``, ``passive``."""
-
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-       with the global label have been place automatically"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the label"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the label is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    properties: List[Property] = field(default_factory=list)
-    """	The ``properties`` token defines a list of properties of the global label. Currently, the
-    only supported property is the inter-sheet reference"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> GlobalLabel:
-        """Convert the given S-Expresstion into a GlobalLabel object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(global_label ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not global_label
-
-        Returns:
-            - GlobalLabel: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'global_label':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'property': object.properties.append(Property().from_sexpr(item))
-            if item[0] == 'shape': object.shape = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        fa = ' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-
-        expression =  f'{indents}(global_label "{dequote(self.text)}" (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fa}\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        for property in self.properties:
-            expression += property.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class HierarchicalLabel():
-    """The ``hierarchical_label`` token defines a label that are used by hierarchical sheets to
-    define connections between sheet in hierarchical designs
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_label_section
-    """
-
-    text: str = ""
-    """The ``text`` token defines the text in the label"""
-
-    shape: str = "input"
-    """The ``shape`` token defines the way the global label is drawn. Possible values are:
-    ``input``, ``output``, ``bidirectional``, ``tri_state``, ``passive``."""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the label"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the label is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-    
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-    with the global label have been place automatically"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalLabel:
-        """Convert the given S-Expresstion into a HierarchicalLabel object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(hierarchical_label ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not hierarchical_label
-
-        Returns:
-            - HierarchicalLabel: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'hierarchical_label':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'shape': object.shape = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        fieldsAutoplaced = ' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-
-        expression =  f'{indents}(hierarchical_label "{dequote(self.text)}" (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fieldsAutoplaced}\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SymbolProjectPath():
-    """The symbol project path defines the ``path`` token to the sheet instance of the instance data
-    of a symbol.
-
-    Available since KiCad v7.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section
-    """
-    
-    sheetInstancePath: str = ""
-    """The ``PATH_INSTANCE`` token defines the path to the symbol instance"""
-
-    reference: str = ""
-    """The ``reference`` token is a string that defines the reference designator for the symbol
-    instance"""
-
-    unit: int = 1
-    """The ``unit`` token is a integer that defines the symbol unit for the symbol instance. For 
-    symbols that do not define multiple units, this will always be 1."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolProjectPath:        
-        """Convert the given S-Expression into a SymbolProjectPath object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(path ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not path
-
-        Returns:
-            - SymbolProjectPath: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'path':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.sheetInstancePath = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'reference': object.reference = item[1]
-            if item[0] == 'unit': object.unit = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        expression =  f'{indents}(path "{dequote(self.sheetInstancePath)}"\n'
-        expression += f'{indents}  (reference "{dequote(self.reference)}") (unit {self.unit})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SymbolProjectInstance(ProjectInstance):
-    """The ``project`` token attribute defines the name of the project as well as a list of symbol
-    project paths (instance data). There can be instance data from other project when schematics 
-    are shared across multiple projects. The projects will have to be sorted by the ``name`` token
-    in alphabetical order.
-
-    Available since KiCad v7.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section
-    """
-
-    paths: List[SymbolProjectPath] = field(default_factory=list)
-    """The ``paths`` token defines a list of symbol project paths for this project instance"""
-    
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolProjectInstance:        
-        """Convert the given S-Expression into a SymbolProjectInstance object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(project ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not project
-
-        Returns:
-            - SymbolProjectInstance: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'project':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.name = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'path': object.paths.append(SymbolProjectPath.from_sexpr(item))
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        expression = f'{indents}(project "{dequote(self.name)}"\n'
-        for path in self.paths:
-            expression += path.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SchematicSymbol():
-    """The ``symbol`` token in the symbol section of the schematic defines an instance of a symbol
-    from the library symbol section of the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_section
-    """
-
-    @property
-    def libId(self) -> str:
-        """The ``lib_id`` token defines which symbol in the library symbol section of the schematic
-        this schematic symbol references. In ``kiutils``, the ``lib_id`` token is a combination of
-        both the ``libraryNickname`` and ``entryName`` token. Setting the ``lib_id`` token will
-        update those tokens accordingly.
-
-        Returns:
-            - Symbol id in the following format: ``:`` or ````,
-              if ``libraryNickname`` token is not set.
-        """
-        if self.libraryNickname:
-            return f'{self.libraryNickname}:{self.entryName}'
-        else:
-            return f'{self.entryName}'
-
-    @libId.setter
-    def libId(self, symbol_id: str):
-        """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname`` and
-        ``entryName`` token.
-
-        Args:
-            - symbol_id (str): The symbol id in the following format: ``:``
-              or only ````
-        """
-        parse_symbol_id = re.match(r"^(.+?):(.+?)$", symbol_id)
-        if parse_symbol_id:
-            self.libraryNickname = parse_symbol_id.group(1)
-            self.entryName = parse_symbol_id.group(2)
-        else:
-            self.libraryNickname = None
-            self.entryName = symbol_id
-
-    libraryNickname: Optional[str] = None
-    """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to
-    and is a part of the ``id`` token"""
-
-    entryName: str = None
-    """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id``
-    token"""
-
-    libName: Optional[str] = None
-    """The optional ``lib_name`` token is only set when the symbol was edited in the schematic.
-    It may be set to ``_X`` where X is a unique number that specifies which variation
-    this symbol is of its original."""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and angle of rotation of the symbol"""
-
-    unit: Optional[int] = None
-    """The optional ``unit`` token attribute defines which unit in the symbol library definition
-    that the schematic symbol represents"""
-
-    inBom: bool = False
-    """The ``in_bom`` token attribute determines whether the schematic symbol appears in any bill
-    of materials output"""
-
-    onBoard: bool = False
-    """The ``on_board`` token attribute determines if the footprint associated with the symbol is
-    exported to the board via the netlist"""
-
-    dnp: Optional[bool] = None
-    """The optional ``dnp`` token defines if a symbol is marked as do-not-populate in the schematic. 
-    
-    Available since KiCad v7"""
-
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-    with the global label have been place automatically"""
-
-    uuid: Optional[str] = ""
-    """The optional `uuid` defines the universally unique identifier"""
-
-    properties: List[Property] = field(default_factory=list)
-    """The ``properties`` section defines a list of symbol properties of the schematic symbol"""
-
-    pins: Dict[str, str] = field(default_factory=dict)
-    """The ``pins`` token defines a dictionary with pin numbers in form of strings as keys and
-    uuid's as values"""
-
-    mirror: Optional[str] = None
-    """The ``mirror`` token defines if the symbol is mirrored in the schematic. Accepted values:
-    ``x`` or ``y``. When mirroring around the x and y axis at the same time use some additional
-    rotation to get the correct orientation of the symbol."""
-
-    instances: List[SymbolProjectInstance] = field(default_factory=list)
-    """The ``instances`` token defines a list of symbol instances grouped by project. Every symbol 
-    will have a least one instance.
-    
-    Available since KiCad v7."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SchematicSymbol:
-        """Convert the given S-Expresstion into a SchematicSymbol object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(symbol ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not symbol
-
-        Returns:
-            - SchematicSymbol: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'symbol':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-            if item[0] == 'lib_id': object.libId = item[1]
-            if item[0] == 'lib_name': object.libName = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'unit': object.unit = item[1]
-            if item[0] == 'in_bom': object.inBom = True if item[1] == 'yes' else False
-            if item[0] == 'on_board': object.onBoard = True if item[1] == 'yes' else False
-            if item[0] == 'dnp': object.dnp = True if item[1] == 'yes' else False
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'property': object.properties.append(Property().from_sexpr(item))
-            if item[0] == 'pin': object.pins.update({item[1]: item[2][1]})
-            if item[0] == 'mirror': object.mirror = item[1]
-            if item[0] == 'instances':
-                for instance in item[1:]:
-                    object.instances.append(SymbolProjectInstance.from_sexpr(instance))
-        
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        fa = f' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-        inBom = 'yes' if self.inBom else 'no'
-        onBoard = 'yes' if self.onBoard else 'no'
-        mirror = f' (mirror {self.mirror})' if self.mirror is not None else ''
-        unit = f' (unit {self.unit})' if self.unit is not None else ''
-        lib_name = f' (lib_name "{dequote(self.libName)}")' if self.libName is not None else ''
-        if self.dnp is not None:
-            dnp = ' (dnp yes)' if self.dnp else ' (dnp no)'
-        else:
-            dnp = ''
-
-        expression =  f'{indents}(symbol{lib_name} (lib_id "{dequote(self.libId)}") (at {self.position.X} {self.position.Y}{posA}){mirror}{unit}\n'
-        expression += f'{indents}  (in_bom {inBom}) (on_board {onBoard}){dnp}{fa}\n'
-        if self.uuid:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        for property in self.properties:
-            expression += property.to_sexpr(indent+2)
-        for number, uuid in self.pins.items():
-            expression += f'{indents}  (pin "{dequote(number)}" (uuid {uuid}))\n'
-        if len(self.instances) != 0:
-            expression += f'{indents}  (instances\n'
-            for instance in self.instances:
-                expression += instance.to_sexpr(indent+4)
-            expression += f'{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class HierarchicalPin():
-    """The ``pin`` token in a sheet object defines an electrical connection between the sheet in a
-       schematic with the hierarchical label defined in the associated schematic file
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_pin_definition
-    """
-
-    name: str = ""
-    """	The ``name`` attribute defines the name of the sheet pin. It must have an identically named
-        hierarchical label in the associated schematic file."""
-
-    connectionType: str = "input"
-    """The electrical connect type token defines the type of electrical connect made by the
-       sheet pin"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and angle of rotation of the pin"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` section defines how the pin name text is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalPin:
-        """Convert the given S-Expresstion into a HierarchicalPin object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(pin ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not pin
-
-        Returns:
-            - HierarchicalPin: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'pin':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.name = exp[1]
-        object.connectionType = exp[2]
-        for item in exp[3:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-
-        expression =  f'{indents}(pin "{dequote(self.name)}" {self.connectionType} (at {self.position.X} {self.position.Y}{posA})\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-
-@dataclass
-class HierarchicalSheetProjectPath():
-    """The symbol project path defines the ``path`` token to the sheet instance of the instance data
-    of a symbol.
-
-    Available since KiCad v7.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section
-    """
-    
-    sheetInstancePath: str = ""
-    """The ``PATH_INSTANCE`` token defines the path to the symbol instance"""
-
-    page: str = ""
-    """The ``page`` token is a string that defines the page number of the sheet instance"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalSheetProjectPath:        
-        """Convert the given S-Expression into a HierarchicalSheetProjectPath object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(path ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not path
-
-        Returns:
-            - HierarchicalSheetProjectPath: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'path':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.sheetInstancePath = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'page': object.page = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        return f'{indents}(path "{dequote(self.sheetInstancePath)}" (page "{dequote(self.page)}")){endline}'
-
-@dataclass
-class HierarchicalSheetProjectInstance(ProjectInstance):
-    """The ``project`` token attribute defines the name of the project as well as a list of 
-    hierarchical sheet project paths (instance data). There can be instance data from other project 
-    when schematics are shared across multiple projects. The projects will have to be sorted by the 
-    ``name`` token in alphabetical order.
-
-    Available since KiCad v7.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section
-    """
-
-    paths: List[HierarchicalSheetProjectPath] = field(default_factory=list)
-    """The ``paths`` token defines a list of hierarchical sheet project paths for this project instance"""
-    
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalSheetProjectInstance:        
-        """Convert the given S-Expression into a HierarchicalSheetProjectInstance object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(project ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not project
-
-        Returns:
-            - HierarchicalSheetProjectInstance: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 2:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'project':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.name = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'path': object.paths.append(HierarchicalSheetProjectPath.from_sexpr(item))
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        expression = f'{indents}(project "{dequote(self.name)}"\n'
-        for path in self.paths:
-            expression += path.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class HierarchicalSheet():
-    """The ``sheet`` token defines a hierarchical sheet of the schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_section
-    """
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and angle of rotation of the sheet in the schematic"""
-
-    width: float = 0
-    """The ``width`` token defines the width of the sheet"""
-
-    height: float = 0
-    """The ``height`` token defines the height of the sheet"""
-
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-       with the global label have been place automatically"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the sheet outline is drawn"""
-
-    fill: ColorRGBA = field(default_factory=lambda: ColorRGBA())
-    """The fill defines the color how the sheet is filled"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    sheetName: Property = field(default_factory=lambda: Property(key="Sheet name"))
-    """The ``sheetName`` is a property that defines the name of the sheet. The property's
-       key should therefore be set to `Sheet name`"""
-
-    fileName: Property = field(default_factory=lambda: Property(key="Sheet file"))
-    """The ``fileName`` is a property that defines the file name of the sheet. The property's
-       key should therefore be set to `Sheet file`"""
-
-    properties: List[Property] = field(default_factory=list)
-    """The ``properties`` section defines a list of properties defined for the hiererchical sheet.
-       This holds all properties except that held by ``sheetName`` and ``fileName`` members."""
-
-    pins: List[HierarchicalPin] = field(default_factory=list)
-    """The ``pins`` section is a list of hierarchical pins that map a hierarchical label defined in
-       the associated schematic file"""
-    
-    instances: List[HierarchicalSheetProjectInstance] = field(default_factory=list)
-    """The ``instances`` token defines a list of hierachical sheet instances grouped by project. 
-    Every hierarchical sheet will have a least one instance.
-    
-    Available since KiCad v7."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalSheet:
-        """Convert the given S-Expresstion into a HierarchicalSheet object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(sheet ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not sheet
-
-        Returns:
-            - HierarchicalSheet: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'sheet':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'size':
-                object.width = item[1]
-                object.height = item[2]
-            if item[0] == 'fill':
-                object.fill = ColorRGBA().from_sexpr(item[1])
-                object.fill.precision = 4
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'property':
-                p = Property().from_sexpr(item)
-                if item[1] == 'Sheet name' or item[1] == 'Sheetname': object.sheetName = p
-                elif item[1] == 'Sheet file' or item[1] == 'Sheetfile': object.fileName = p
-                else: object.properties.append(p)
-            if item[0] == 'pin': object.pins.append(HierarchicalPin().from_sexpr(item))
-            if item[0] == 'instances':
-                for instance in item[1:]:
-                    object.instances.append(HierarchicalSheetProjectInstance.from_sexpr(instance))
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        fa = ' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-
-        expression =  f'{indents}(sheet (at {self.position.X} {self.position.Y}) (size {self.width} {self.height}){fa}\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += f'{indents}  (fill {self.fill.to_sexpr()})\n'
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += self.sheetName.to_sexpr(indent+2)
-        expression += self.fileName.to_sexpr(indent+2)
-        for p in self.properties:
-            expression += p.to_sexpr(indent+2)
-        for pin in self.pins:
-            expression += pin.to_sexpr(indent+2)
-        if len(self.instances) != 0:
-            expression += f'{indents}  (instances\n'
-            for instance in self.instances:
-                expression += instance.to_sexpr(indent+4)
-            expression += f'{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class HierarchicalSheetInstance():
-    """The sheet_instance token defines the per sheet information for the entire schematic. This
-       section will only exist in schematic files that are the root sheet of a project
-
-    Documentation:
-           https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_hierarchical_sheet_instance_section
-    """
-
-    instancePath: str = "/"
-    """The ``instancePath`` attribute is the path to the sheet instance"""
-
-    page: str = "1"
-    """The ``page`` token defines the page number of the schematic represented by the sheet
-       instance information. Page numbers can be any valid string."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> HierarchicalSheetInstance:
-        """Convert the given S-Expresstion into a HierarchicalSheetInstance object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(path ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not path
-
-        Returns:
-            - HierarchicalSheetInstance: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'path':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.instancePath = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'page': object.page = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        return f'{indents}(path "{dequote(self.instancePath)}" (page "{dequote(self.page)}")){endline}'
-
-@dataclass
-class SymbolInstance():
-    """The ``symbol_instance`` token defines the per symbol information for the entire schematic
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/#_symbol_instance_section
-    """
-
-    path: str = "/"
-    """The ``path`` attribute is the path to the sheet instance"""
-
-    reference: str = ""
-    """The ``reference`` token attribute is a string that defines the reference designator for
-       the symbol instance"""
-
-    unit: int = 0
-    """The unit token attribute is a integer ordinal that defines the symbol unit for the
-       symbol instance. For symbols that do not define multiple units, this will always be 1."""
-
-    value: str = ""
-    """The value token attribute is a string that defines the value field for the symbol instance"""
-
-    footprint: str = ""
-    """The ``footprint`` token attribute is a string that defines the LIBRARY_IDENTIFIER for footprint associated with the symbol instance"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolInstance:
-        """Convert the given S-Expresstion into a SymbolInstance object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(path ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not path
-
-        Returns:
-            - SymbolInstance: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'path':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.path = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'reference': object.reference = item[1]
-            if item[0] == 'unit': object.unit = item[1]
-            if item[0] == 'value': object.value = item[1]
-            if item[0] == 'footprint': object.footprint = item[1]
-        return object
-
-    def to_sexpr(self, indent=4, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(path "{dequote(self.path)}"\n'
-        expression += f'{indents}  (reference "{dequote(self.reference)}") (unit {self.unit}) (value "{dequote(self.value)}") (footprint "{dequote(self.footprint)}")\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Rectangle():
-    """The ``rectangle`` token defines a graphical rectangle in a schematic.
-
-    Available since KiCad v7
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_rectangle
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token attributes define the coordinates of the start point of the rectangle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token attributes define the coordinates of the end point of the rectangle"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the rectangle outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how rectangle arc is filled"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Rectangle:
-        """Convert the given S-Expresstion into a Rectangle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(rectangle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not rectangle
-
-        Returns:
-            - Rectangle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'rectangle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            if item[0] == 'end': object.end = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(rectangle (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Arc():
-    """The ``Arc`` token defines a graphical arc in a schematic.
-
-    Available since KiCad v7
-
-    Documentation:
-        - ???
-    """
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token attributes define the coordinates of the start point of the arc"""
-
-    mid: Position = field(default_factory=lambda: Position())
-    """The ``end`` token attributes define the coordinates of the mid point of the arc"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token attributes define the coordinates of the end point of the arc"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the arc outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how the arc is filled"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Arc:
-        """Convert the given S-Expresstion into a Arc object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(arc ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not arc
-
-        Returns:
-            - Arc: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'arc':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            if item[0] == 'mid': object.mid = Position().from_sexpr(item)
-            if item[0] == 'end': object.end = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(arc (start {self.start.X} {self.start.Y}) (mid {self.mid.X} {self.mid.Y}) (end {self.end.X} {self.end.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class Circle():
-    """The ``Circle`` token defines a graphical circle in a schematic.
-
-    Available since KiCad v7
-
-    Documentation:
-        - ???
-    """
-
-    center: Position = field(default_factory=lambda: Position())
-    """The ``center`` token attributes define the coordinates of the center point of the circle"""
-
-    radius: float = 0.0
-    """The ``radius`` token attributes define the radius of the circle"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the circle outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how the circle is filled"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Circle:
-        """Convert the given S-Expresstion into a Circle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(circle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not circle
-
-        Returns:
-            - Circle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'circle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if item[0] == 'center': object.center = Position().from_sexpr(item)
-            if item[0] == 'radius': object.radius = item[1]
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(circle (center {self.center.X} {self.center.Y}) (radius {self.radius})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
-    
-@dataclass
-class NetclassFlag():
-    """The ``netclass_flag`` token defines a netclass flag in a schematic.
-
-    Available since KiCad v7
-
-    Documentation:
-        - ???
-    """
-
-    text: str = ""
-    """The ``text`` token defines the text the netclass flag"""
-
-    length: float = 2.54
-    """The ``length`` token defines the length of the netclass flag"""
-
-    shape: str = "round"
-    """The ``shape`` token defines the shape of the netclass flag. Valid values are ``round``,
-    ``rectangle``, ``dot`` or``diamond``."""
-
-    position: Position = field(default_factory=lambda: Position)
-    """The ``position`` token defines the position and rotation of the netclass flag"""
-
-    effects: Effects = field(default_factory=lambda: Effects)
-    """The ``effects`` token defines how the text is drawn"""
-
-    properties: List[Property] = field(default_factory=list)
-    """The ``properties`` token defines a list of properties the netclass is assigned to"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier"""
-
-    fieldsAutoplaced: bool = False
-    """The ``fields_autoplaced`` is a flag that indicates that any PROPERTIES associated
-    with the netclas flag have been place automatically"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> NetclassFlag:
-        """Convert the given S-Expresstion into a Circle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(netclass_flag ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not netclass_flag
-
-        Returns:
-            - NetclassFlag: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'netclass_flag':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'length': object.length = item[1]
-            if item[0] == 'shape': object.shape = item[1]
-            if item[0] == 'at': object.position = Position.from_sexpr(item)
-            if item[0] == 'fields_autoplaced': object.fieldsAutoplaced = True
-            if item[0] == 'effects': object.effects = Effects.from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'property': object.properties.append(Property.from_sexpr(item))
-        return object
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        fa = f' (fields_autoplaced)' if self.fieldsAutoplaced else ''
-
-        expression =  f'{indents}(netclass_flag "{dequote(self.text)}" (length {self.length}) (shape {self.shape}) (at {self.position.X} {self.position.Y}{posA}){fa}\n'
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        for property in self.properties:
-            expression += property.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
\ No newline at end of file
diff --git a/kiutils/items/syitems.py b/kiutils/items/syitems.py
deleted file mode 100644
index a78cb22..0000000
--- a/kiutils/items/syitems.py
+++ /dev/null
@@ -1,572 +0,0 @@
-"""Symbol graphical items define all of the drawing items that are used in the symbol
-definition. This includes text, text boxes, lines, rectangles, circles, arcs, polygons
-and curves.
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    16.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_graphic_items
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import List, Optional
-
-from kiutils.items.common import Fill, Position, Stroke, Effects, Fill
-from kiutils.utils.strings import dequote
-
-@dataclass
-class SyArc():
-    """The ``arc`` token defines a graphical arc in a symbol definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_arc
-    """
-
-    private: bool = False
-    """The ``private`` token defines if the arc is only visible in the symbol editor. Defaults
-    to ``False``.
-
-    Available since KiCad v7"""
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token defines the coordinates of start point of the arc"""
-
-    mid: Position = field(default_factory=lambda: Position())
-    """The ``mid`` token defines the coordinates of mid point of the arc"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token defines the coordinates of end point of the arc"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the arc outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how the arc is filled"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyArc:
-        """Convert the given S-Expresstion into a SyArc object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(arc ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not arc
-
-        Returns:
-            - SyArc: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'arc':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if isinstance(item, str):
-                if item == 'private': object.private = True
-                continue
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            if item[0] == 'mid': object.mid = Position().from_sexpr(item)
-            if item[0] == 'end': object.end = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        startA = f' {self.start.angle}' if self.start.angle is not None else ''
-        midA = f' {self.mid.angle}' if self.mid.angle is not None else ''
-        endA = f' {self.end.angle}' if self.end.angle is not None else ''
-        private = ' private' if self.private else ''
-
-        expression =  f'{indents}(arc{private} (start {self.start.X} {self.start.Y}{startA}) (mid {self.mid.X} {self.mid.Y}{midA}) (end {self.end.X} {self.end.Y}{endA})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyCircle():
-    """The ``circle`` token defines a graphical circle in a symbol definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_circle
-    """
-
-    private: bool = False
-    """The ``private`` token defines if the circle is only visible in the symbol editor. Defaults
-    to ``False``.
-
-    Available since KiCad v7"""
-
-    center: Position = field(default_factory=lambda: Position())
-    """The ``center`` token defines the coordinates of center point of the circle"""
-
-    radius: float = 0.0
-    """The ``radius`` token defines the length of the radius of the circle"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the circle outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how the circle is filled"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyCircle:
-        """Convert the given S-Expresstion into a SyCircle object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(circle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not circle
-
-        Returns:
-            - SyCircle: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'circle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if isinstance(item, str):
-                if item == 'private': object.private = True
-                continue
-            if item[0] == 'center': object.center = Position().from_sexpr(item)
-            if item[0] == 'radius': object.radius = item[1]
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        private = ' private' if self.private else ''
-
-        expression =  f'{indents}(circle{private} (center {self.center.X} {self.center.Y}) (radius {self.radius})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyCurve():
-    """The ``curve`` token defines a graphical Qubic Bezier curve.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_curve
-    """
-
-    points: List[Position] = field(default_factory=list)
-    """The ``points`` token defines the four X/Y coordinates of each point of the curve"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the curve outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how curve arc is filled"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyCurve:
-        """Convert the given S-Expresstion into a SyCurve object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(curve ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not curve
-
-        Returns:
-            - SyCurve: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'curve':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.points.append(Position().from_sexpr(point))
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(curve\n'
-        expression =  f'{indents}  (pts\n'
-        for point in self.points:
-            expression =  f'{indents}    (xy {point.X} {point.Y})\n'
-        expression =  f'{indents}  )\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyPolyLine():
-    """The ``polyline`` token defines one or more graphical lines that may or may not define a polygon.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_line
-    """
-
-    points: List[Position] = field(default_factory=list)
-    """The ``points`` token defines the four X/Y coordinates of each point of the polyline"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the polyline outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how polyline arc is filled"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyPolyLine:
-        """Convert the given S-Expresstion into a SyPolyLine object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(polyline ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not polyline
-
-        Returns:
-            - SyPolyLine: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'polyline':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'pts':
-                for point in item[1:]:
-                    object.points.append(Position().from_sexpr(point))
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(polyline\n'
-        expression +=  f'{indents}  (pts\n'
-        for point in self.points:
-            expression +=  f'{indents}    (xy {point.X} {point.Y})\n'
-        expression += f'{indents}  )\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyRect():
-    """The ``rectangle`` token defines a graphical rectangle in a symbol definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_rectangle
-    """
-
-    private: bool = False
-    """The ``private`` token defines if the rectangle is only visible in the symbol editor. Defaults
-    to ``False``.
-    
-    Available since KiCad v7"""
-
-    start: Position = field(default_factory=lambda: Position())
-    """The ``start`` token attributes define the coordinates of the start point of the rectangle"""
-
-    end: Position = field(default_factory=lambda: Position())
-    """The ``end`` token attributes define the coordinates of the end point of the rectangle"""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` defines how the rectangle outline is drawn"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token attributes define how rectangle arc is filled"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyRect:
-        """Convert the given S-Expresstion into a SyRect object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(rectangle ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not rectangle
-
-        Returns:
-            - SyRect: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'rectangle':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp:
-            if isinstance(item, str):
-                if item == 'private': object.private = True
-                continue
-            if item[0] == 'start': object.start = Position().from_sexpr(item)
-            if item[0] == 'end': object.end = Position().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        private = ' private' if self.private else ''
-
-        expression =  f'{indents}(rectangle{private} (start {self.start.X} {self.start.Y}) (end {self.end.X} {self.end.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyText():
-    """The ``text`` token defines a graphical text in a symbol definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_text
-    """
-
-    text: str = ""
-    """The ``text`` attribute is a quoted string that defines the text"""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and rotation angle of the text"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is displayed"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyText:
-        """Convert the given S-Expresstion into a SyText object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(text ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not text
-
-        Returns:
-            - SyText: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'text':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent: int = 6, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 6.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-
-        expression =  f'{indents}(text "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA})\n'
-        expression += f'{indents}  {self.effects.to_sexpr()}'
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SyTextBox():
-    """The ``text_box`` token defines a text box inside a symbol
-
-    Available since KiCad v7
-
-    Documentation:
-        ????
-    """
-
-    # NOTE: This is almost the same implementation as in ``kiutils.items.schitems.TextBox`` but
-    #       used in a different context.
-
-    text: str = ""
-    """The ``text`` token defines the text string"""
-
-    private: bool = False
-    """The ``private`` token defines if the text box is only visible in the symbol editor. Defaults
-    to ``False``."""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` token defines the X and Y coordinates and rotation angle of the text"""
-
-    size: Position = field(default_factory=lambda: Position())
-    """The ``size`` token defines the size in X and Y direction. Angle is not used."""
-
-    stroke: Stroke = field(default_factory=lambda: Stroke())
-    """The ``stroke`` token defines the look of the outline of the text box"""
-
-    fill: Fill = field(default_factory=lambda: Fill())
-    """The ``fill`` token defines how the text box should be filled"""
-
-    effects: Effects = field(default_factory=lambda: Effects())
-    """The ``effects`` token defines how the text is drawn"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SyTextBox:
-        """Convert the given S-Expresstion into a SyTextBox object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(text_box ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not text_box
-
-        Returns:
-            - SyTextBox: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'text_box':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        # Extract "private" token, if any is present
-        if exp[1] == "private" and not isinstance(exp[2], list):
-            object.private = True
-            object.text = exp[2]
-            start_at = 3
-        else:
-            object.text = exp[1]
-            start_at = 2
-
-        for item in exp[start_at:]:
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'size': object.size = Position().from_sexpr(item)
-            if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
-            if item[0] == 'stroke': object.stroke = Stroke().from_sexpr(item)
-            if item[0] == 'fill': object.fill = Fill().from_sexpr(item)
-            if item[0] == 'uuid': object.uuid = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        private = ' private' if self.private else ''
-
-        expression =  f'{indents}(text_box{private} "{dequote(self.text)}"\n'
-        expression += f'{indents}  (at {self.position.X} {self.position.Y}{posA}) (size {self.size.X} {self.size.Y})\n'
-        expression += self.stroke.to_sexpr(indent+2)
-        expression += self.fill.to_sexpr(indent+2)
-        expression += self.effects.to_sexpr(indent+2)
-        if self.uuid is not None:
-            expression += f'{indents}  (uuid {self.uuid})\n'
-        expression += f'{indents}){endline}'
-        return expression
\ No newline at end of file
diff --git a/libraries.py b/libraries.py
deleted file mode 100644
index 9098613..0000000
--- a/libraries.py
+++ /dev/null
@@ -1,216 +0,0 @@
-"""Classes to manage KiCad footprint and symbol library tables
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    19.02.2022 - created
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-from os import path
-
-from kiutils.utils.strings import dequote
-from kiutils.utils import sexpr
-
-@dataclass
-class Library():
-    """The ``library`` token defines either a symbol library or a footprint library in
-    a library table file (``fp_lib_table`` or ``sym_lib_table``)"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the library as displayed in the project"""
-
-    type: str = "KiCad"
-    """The ``type`` token defines the type of the library, usually ``KiCad``"""
-
-    uri: str = ""
-    """The ``uri`` token defines the path to the library files"""
-
-    options: str = ""
-    """The ``options`` token (..) TBD"""
-
-    description: str = ""
-    """The ``description`` token (..) TBD"""
-
-    active: bool = True
-    """The ``active`` token sets if the library is loaded by KiCad"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Library:
-        """Convert the given S-Expresstion into a Library object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(lib ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not lib
-
-        Returns:
-            - Library: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'lib':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'type': object.type = item[1]
-            if item[0] == 'uri': object.uri = item[1]
-            if item[0] == 'options': object.options = item[1]
-            if item[0] == 'descr': object.description = item[1]
-            if item[0] == 'disabled': object.active = False
-        return object
-
-    def to_sexpr(self, indent=2, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression = f'{indents}(lib '
-        expression += f'(name "{dequote(self.name)}")'
-        expression += f'(type "{dequote(self.type)}")'
-        expression += f'(uri "{dequote(self.uri)}")'
-        expression += f'(options "{dequote(self.options)}")'
-        expression += f'(descr "{dequote(self.description)}")'
-
-        if not self.active:
-            expression += '(disabled)'
-
-        expression += f'){endline}'
-
-        return expression
-
-@dataclass
-class LibTable():
-    """The ``libtable`` token defines the ``fp_lib_table`` or ``sym_lib_table`` file of KiCad"""
-
-    type: str = 'sym_lib_table'
-    """The ``type`` token defines the type of the library table. Valid values are ``fp_lib_table`` or
-    ``sym_lib_table``."""
-
-    libs: List[Library] = field(default_factory=list)
-    """The ``libs`` token holds a list of librarys that this library table object holds"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the library file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> LibTable:
-        """Convert the given S-Expresstion into a LibTable object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(sym_lib_table ...)`` or ``(fp_lib_table ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not lib
-
-        Returns:
-            - LibTable: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if not (exp[0] == 'fp_lib_table' or exp[0] == 'sym_lib_table'):
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.type = exp[0]
-        for item in exp:
-            if item[0] == 'lib': object.libs.append(Library().from_sexpr(item))
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> LibTable:
-        """Load a library table directly from a KiCad library table file and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - LibTable: Object of the LibTable class initialized with the given KiCad library table
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def create_new(cls, type: str = 'sym_lib_table') -> LibTable:
-        """Creates a new empty library table with its attributes set as KiCad would create it
-
-        Args:
-            - type (str): ``fp_lib_table`` or ``sym_lib_table``. Defaults to the latter.
-
-        Returns:
-            - Library: Empty library table of given type
-        """
-        return cls(type=type)
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression = f'{indents}({self.type}\n'
-        for lib in self.libs:
-            expression += lib.to_sexpr()
-        expression += f'{indents}){endline}'
-        return expression
\ No newline at end of file
diff --git a/misc/config.py b/misc/config.py
deleted file mode 100644
index eb24416..0000000
--- a/misc/config.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""Configuration variables
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    19.09.2022 - created
-"""
-
-KIUTILS_CREATE_NEW_VERSION_STR = '20211014'
-"""Version string used in ``create_new()`` class functions"""
-
-KIUTILS_CREATE_NEW_GENERATOR_STR = 'kiutils'
-"""Generator string used in ``create_new()`` class functions"""
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..fa7093a
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools>=42"]
+build-backend = "setuptools.build_meta"
\ No newline at end of file
diff --git a/requirements_dev.txt b/requirements_dev.txt
new file mode 100644
index 0000000..f619bd4
--- /dev/null
+++ b/requirements_dev.txt
@@ -0,0 +1,5 @@
+jinja2
+setuptools
+sphinx
+sphinx-rtd-theme
+build
\ No newline at end of file
diff --git a/schematic.py b/schematic.py
deleted file mode 100644
index a3396ff..0000000
--- a/schematic.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""Class to manage KiCad schematics
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    19.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List, Union
-from os import path
-
-from kiutils.items.common import Image, PageSettings, TitleBlock
-from kiutils.items.schitems import *
-from kiutils.symbol import Symbol
-from kiutils.utils import sexpr
-from kiutils.misc.config import KIUTILS_CREATE_NEW_GENERATOR_STR, KIUTILS_CREATE_NEW_VERSION_STR
-
-@dataclass
-class Schematic():
-    """The ``schematic`` token represents a KiCad schematic as defined by the schematic file format
-
-    Documenatation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-schematic/
-    """
-
-    version: str = KIUTILS_CREATE_NEW_VERSION_STR
-    """The ``version`` token attribute defines the schematic version using the YYYYMMDD date format"""
-
-    generator: str = KIUTILS_CREATE_NEW_GENERATOR_STR
-    """The ``generator`` token attribute defines the program used to write the file"""
-
-    uuid: Optional[str] = None
-    """The optional ``uuid`` defines the universally unique identifier. Defaults to ``None.``"""
-
-    paper: PageSettings = field(default_factory=lambda: PageSettings())
-    """The ``paper`` token defines the drawing page size and orientation"""
-
-    titleBlock: Optional[TitleBlock] = None
-    """The ``titleBlock`` token defines author, date, revision, company and comments of the schematic"""
-
-    libSymbols: List[Symbol] = field(default_factory=list)
-    """The ``libSymbols`` token defines a list of symbols that are used in the schematic"""
-
-    schematicSymbols: List[SchematicSymbol] = field(default_factory=list)
-    """The ``schematicSymbols`` token defines a list of instances of symbols used in the schematic"""
-
-    junctions: List[Junction] = field(default_factory=list)
-    """The ``junctions`` token defines a list of junctions used in the schematic"""
-
-    noConnects: List[NoConnect] = field(default_factory=list)
-    """The ``noConnect`` token defines a list of no_connect markers used in the schematic"""
-
-    busEntries: List[BusEntry] = field(default_factory=list)
-    """The ``busEntries`` token defines a list of bus_entry used in the schematic"""
-
-    busAliases: List[BusAlias] = field(default_factory=list)
-    """The ``busAliases`` token defines a list of bus_alias used in the schematic"""
-
-    graphicalItems: List[Union[Connection, PolyLine]] = field(default_factory=list)
-    """The ``graphicalItems`` token defines a list of ``bus``, ``wire`` or ``polyline`` elements 
-    used in the schematic"""
-
-    shapes: List[Union[Arc, Circle, Rectangle]] = field(default_factory=list)
-    """The ``shapes`` token defines a list of graphical shapes (``Arc``, ``Rectangle`` or 
-    ``Circle``) used in the schematic.
-    
-    Available since KiCad v7"""
-
-    images: List[Image] = field(default_factory=list)
-    """The ``images`` token defines a list of images used in the schematic"""
-
-    texts: List[Text] = field(default_factory=list)
-    """The ``text`` token defines a list of texts used in the schematic"""
-
-    textBoxes: List[TextBox] = field(default_factory=list)
-    """The ``text_box`` token defines a list of text boxes used in the schematic"""
-
-    labels: List[LocalLabel] = field(default_factory=list)
-    """The ``labels`` token defines a list of local labels used in the schematic"""
-
-    globalLabels: List[GlobalLabel] = field(default_factory=list)
-    """The ``globalLabels`` token defines a list of global labels used in the schematic"""
-
-    hierarchicalLabels: List[HierarchicalLabel] = field(default_factory=list)
-    """The ``herarchicalLabels`` token defines a list of hierarchical labels used in the schematic"""
-
-    netclassFlags: List[NetclassFlag] = field(default_factory=list)
-    """The ``netclassFlags`` token defines a list of netclass flags used in the schematic.
-    
-    Available since KiCad v7"""
-
-    sheets: List[HierarchicalSheet] = field(default_factory=list)
-    """The ``sheets`` token defines a list of hierarchical sheets used in the schematic"""
-
-    sheetInstances: List[HierarchicalSheetInstance] = field(default_factory=list)
-    """The ``sheetInstances`` token defines a list of instances of hierarchical sheets used in
-    the schematic"""
-
-    symbolInstances: List[SymbolInstance] = field(default_factory=list)
-    """The ``symbolInstances`` token defines a list of instances of symbols from ``libSymbols`` token
-    used in the schematic"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the schematic file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Schematic:
-        """Convert the given S-Expresstion into a Schematic object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(kicad_sch ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not kicad_sch
-
-        Returns:
-            - Schematic: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'kicad_sch':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'generator': object.generator = item[1]
-            if item[0] == 'uuid': object.uuid = item[1]
-            if item[0] == 'paper': object.paper = PageSettings().from_sexpr(item)
-            if item[0] == 'title_block': object.titleBlock = TitleBlock().from_sexpr(item)
-            if item[0] == 'lib_symbols':
-                for symbol in item[1:]:
-                    object.libSymbols.append(Symbol().from_sexpr(symbol))
-            if item[0] == 'junction': object.junctions.append(Junction().from_sexpr(item))
-            if item[0] == 'no_connect': object.noConnects.append(NoConnect().from_sexpr(item))
-            if item[0] == 'bus_entry': object.busEntries.append(BusEntry().from_sexpr(item))
-            if item[0] == 'bus_alias': object.busAliases.append(BusAlias().from_sexpr(item))
-            if item[0] == 'wire': object.graphicalItems.append(Connection().from_sexpr(item))
-            if item[0] == 'bus': object.graphicalItems.append(Connection().from_sexpr(item))
-            if item[0] == 'polyline': object.graphicalItems.append(PolyLine().from_sexpr(item))
-            if item[0] == 'arc': object.shapes.append(Arc.from_sexpr(item))
-            if item[0] == 'circle': object.shapes.append(Circle.from_sexpr(item))
-            if item[0] == 'rectangle': object.shapes.append(Rectangle.from_sexpr(item))
-            if item[0] == 'image': object.images.append(Image().from_sexpr(item))
-            if item[0] == 'text': object.texts.append(Text().from_sexpr(item))
-            if item[0] == 'text_box': object.textBoxes.append(TextBox().from_sexpr(item))
-            if item[0] == 'label': object.labels.append(LocalLabel().from_sexpr(item))
-            if item[0] == 'global_label': object.globalLabels.append(GlobalLabel().from_sexpr(item))
-            if item[0] == 'hierarchical_label': object.hierarchicalLabels.append(HierarchicalLabel().from_sexpr(item))
-            if item[0] == 'netclass_flag': object.netclassFlags.append(NetclassFlag.from_sexpr(item))
-            if item[0] == 'symbol': object.schematicSymbols.append(SchematicSymbol().from_sexpr(item))
-            if item[0] == 'sheet': object.sheets.append(HierarchicalSheet().from_sexpr(item))
-            if item[0] == 'sheet_instances':
-                for instance in item[1:]:
-                    object.sheetInstances.append(HierarchicalSheetInstance().from_sexpr(instance))
-            if item[0] == 'symbol_instances':
-                for instance in item[1:]:
-                    object.symbolInstances.append(SymbolInstance().from_sexpr(instance))
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> Schematic:
-        """Load a schematic directly from a KiCad schematic file (`.kicad_sch`) and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - Schematic: Object of the Schematic class initialized with the given KiCad schematic
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def create_new(cls) -> Schematic:
-        """Creates a new empty schematic page with its attributes set as KiCad would create it
-
-        Returns:
-            - Schematic: Empty schematic
-        """
-        schematic = cls(
-            version = KIUTILS_CREATE_NEW_VERSION_STR,
-            generator = KIUTILS_CREATE_NEW_GENERATOR_STR
-        )
-        schematic.sheetInstances.append(HierarchicalSheetInstance(instancePath='/', page='1'))
-        return schematic
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(kicad_sch (version {self.version}) (generator {self.generator})\n'
-        if self.uuid is not None:
-            expression += f'\n{indents}  (uuid {self.uuid})\n\n'
-        expression += f'{self.paper.to_sexpr(indent+2)}'
-        if self.titleBlock is not None:
-            expression += f'\n{self.titleBlock.to_sexpr(indent+2)}'
-
-        if self.libSymbols:
-            expression += f'\n{indents}  (lib_symbols'
-            for item in self.libSymbols:
-                expression += '\n'
-                expression += item.to_sexpr(indent+4)
-            expression += f'{indents}  )\n'
-        else:
-            expression += f'{indents}  (lib_symbols)\n'
-
-        if self.junctions:
-            expression += '\n'
-            for item in self.junctions:
-                expression += item.to_sexpr(indent+2)
-
-        if self.noConnects:
-            expression += '\n'
-            for item in self.noConnects:
-                expression += item.to_sexpr(indent+2)
-
-        if self.busEntries:
-            expression += '\n'
-            for item in self.busEntries:
-                expression += item.to_sexpr(indent+2)
-
-        if self.busAliases:
-            expression += '\n'
-            for item in self.busAliases:
-                expression += item.to_sexpr(indent+2)
-
-        if self.graphicalItems:
-            expression += '\n'
-            for item in self.graphicalItems:
-                expression += item.to_sexpr(indent+2)
-
-        if self.shapes:
-            expression += '\n'
-            for item in self.shapes:
-                expression += item.to_sexpr(indent+2)
-
-        if self.images:
-            expression += '\n'
-            for item in self.images:
-                expression += item.to_sexpr(indent+2)
-
-        if self.textBoxes:
-            expression += '\n'
-            for item in self.textBoxes:
-                expression += item.to_sexpr(indent+2)
-
-        if self.texts:
-            expression += '\n'
-            for item in self.texts:
-                expression += item.to_sexpr(indent+2)
-
-        if self.labels:
-            expression += '\n'
-            for item in self.labels:
-                expression += item.to_sexpr(indent+2)
-
-        if self.globalLabels:
-            expression += '\n'
-            for item in self.globalLabels:
-                expression += item.to_sexpr(indent+2)
-
-        if self.hierarchicalLabels:
-            expression += '\n'
-            for item in self.hierarchicalLabels:
-                expression += item.to_sexpr(indent+2)
-
-        if self.netclassFlags:
-            expression += '\n'
-            for item in self.netclassFlags:
-                expression += item.to_sexpr(indent+2)
-
-        if self.schematicSymbols:
-            for item in self.schematicSymbols:
-                expression += '\n'
-                expression += item.to_sexpr(indent+2)
-
-        if self.sheets:
-            for item in self.sheets:
-                expression += '\n'
-                expression += item.to_sexpr(indent+2)
-
-        if self.sheetInstances:
-            expression += '\n'
-            expression += '  (sheet_instances\n'
-            for item in self.sheetInstances:
-                expression += item.to_sexpr(indent+4)
-            expression += '  )\n'
-
-        if self.symbolInstances:
-            expression += '\n'
-            expression += '  (symbol_instances\n'
-            for item in self.symbolInstances:
-                expression += item.to_sexpr(indent+4)
-            expression += '  )\n'
-
-        expression += f'{indents}){endline}'
-        return expression
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..4cefcc4
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,30 @@
+[metadata]
+name = kiutils
+version = 1.4.8
+author = Marvin Mager
+author_email = 99667992+mvnmgrx@users.noreply.github.com
+description = Simple and SCM-friendly KiCad file parser for KiCad 6.0 and up
+long_description = file: README.md
+long_description_content_type = text/markdown
+url = https://github.com/mvnmgrx/kiutils
+project_urls =
+    Bug Tracker = https://github.com/mvnmgrx/kiutils/issues
+classifiers =
+    Programming Language :: Python :: 3.7
+    Programming Language :: Python :: 3.8
+    Programming Language :: Python :: 3.9
+    Programming Language :: Python :: 3.10
+    Programming Language :: Python :: 3.11
+    License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+    Operating System :: OS Independent
+    Development Status :: 5 - Production/Stable
+    Natural Language :: English
+    Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
+
+[options]
+package_dir =
+    = src
+python_requires = >=3.7
+
+[options.packages.find]
+where = src
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..c017ce1
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,13 @@
+"""Setup script for kiutils
+
+Authors:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+
+from setuptools import setup
+
+if __name__ == '__main__':
+    setup()
diff --git a/__init__.py b/src/kiutils/__init__.py
similarity index 100%
rename from __init__.py
rename to src/kiutils/__init__.py
diff --git a/board.py b/src/kiutils/board.py
similarity index 100%
rename from board.py
rename to src/kiutils/board.py
diff --git a/dru.py b/src/kiutils/dru.py
similarity index 100%
rename from dru.py
rename to src/kiutils/dru.py
diff --git a/footprint.py b/src/kiutils/footprint.py
similarity index 99%
rename from footprint.py
rename to src/kiutils/footprint.py
index 826c9f4..d35eeff 100644
--- a/footprint.py
+++ b/src/kiutils/footprint.py
@@ -415,7 +415,7 @@ class Pad():
     """The optional ``net`` token defines the integer number and name string of the net connection
     for the pad."""
 
-    uuid: Optional[str] = None           # Used since KiCad 6
+    uuid: Optional[str] = None           # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The optional ``uuid`` token defines the unique identifier of the pad object"""
 
     pinFunction: Optional[str] = None
diff --git a/items/brditems.py b/src/kiutils/items/brditems.py
similarity index 100%
rename from items/brditems.py
rename to src/kiutils/items/brditems.py
diff --git a/items/common.py b/src/kiutils/items/common.py
similarity index 100%
rename from items/common.py
rename to src/kiutils/items/common.py
diff --git a/items/dimensions.py b/src/kiutils/items/dimensions.py
similarity index 100%
rename from items/dimensions.py
rename to src/kiutils/items/dimensions.py
diff --git a/kiutils/items/fpitems.py b/src/kiutils/items/fpitems.py
similarity index 96%
rename from kiutils/items/fpitems.py
rename to src/kiutils/items/fpitems.py
index 4432992..e092b07 100644
--- a/kiutils/items/fpitems.py
+++ b/src/kiutils/items/fpitems.py
@@ -48,13 +48,17 @@ class FpText():
     layer: str = "F.Cu"
     """The ``layer`` token defines the canonical layer the text resides on"""
 
+    knockout: bool = False
+    """The ``knockout`` token defines if the text is inverted (means transparent text and colored
+    background insted of colored text and transparent background)"""
+
     hide: bool = False
     """The optional ``hide`` token, defines if the text is hidden"""
 
     effects: Effects = field(default_factory=lambda: Effects())
     """The ``effects`` token defines how the text is displayed"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the text object"""
 
     renderCache: Optional[RenderCache] = None
@@ -91,7 +95,11 @@ def from_sexpr(cls, exp: list) -> FpText:
                 if item == 'hide': object.hide = True
                 continue
             if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'layer': object.layer = item[1]
+            if item[0] == 'layer': 
+                object.layer = item[1]
+                if(len(item) > 2):
+                    if(item[2] == "knockout"):
+                        object.knockout = True
             if item[0] == 'effects': object.effects = Effects().from_sexpr(item)
             if item[0] == 'uuid': object.uuid = item[1]
             if item[0] == 'render_cache': object.renderCache = RenderCache.from_sexpr(item)
@@ -113,8 +121,9 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
         hide = ' hide' if self.hide else ''
         unlocked = ' unlocked' if self.position.unlocked else ''
         posA = f' {self.position.angle}' if self.position.angle is not None else ''
+        ko = ' knockout' if self.knockout else ''
 
-        expression =  f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"){hide}\n'
+        expression =  f'{indents}(fp_text {self.type} "{dequote(self.text)}" (at {self.position.X} {self.position.Y}{posA}{unlocked}) (layer "{dequote(self.layer)}"{ko}){hide}\n'
         expression += f'{indents}  {self.effects.to_sexpr()}'
         if self.uuid is not None:
             expression += f'{indents}  (uuid {self.uuid})\n'
@@ -151,7 +160,7 @@ class FpLine():
     locked: bool = False
     """The optional ``locked`` token defines if the line cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the line object"""
 
     @classmethod
@@ -245,7 +254,7 @@ class FpRect():
     locked: bool = False
     """The optional ``locked`` token defines if the rectangle cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the rectangle object"""
 
     @classmethod
@@ -491,7 +500,7 @@ class FpCircle():
     locked: bool = False
     """The optional ``locked`` token defines if the circle cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the circle object"""
 
     @classmethod
@@ -589,7 +598,7 @@ class FpArc():
     locked: bool = False
     """The optional ``locked`` token defines if the arc cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the arc object"""
 
     @classmethod
@@ -684,7 +693,7 @@ class FpPoly():
     locked: bool = False
     """The optional ``locked`` token defines if the polygon cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the polygon object"""
 
     @classmethod
@@ -785,7 +794,7 @@ class FpCurve():
     locked: bool = False
     """The optional ``locked`` token defines if the curve cannot be edited"""
 
-    uuid: Optional[str] = None      # Used since KiCad 6
+    uuid: Optional[str] = None      # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the curve object"""
 
     @classmethod
diff --git a/items/gritems.py b/src/kiutils/items/gritems.py
similarity index 100%
rename from items/gritems.py
rename to src/kiutils/items/gritems.py
diff --git a/items/schitems.py b/src/kiutils/items/schitems.py
similarity index 100%
rename from items/schitems.py
rename to src/kiutils/items/schitems.py
diff --git a/items/syitems.py b/src/kiutils/items/syitems.py
similarity index 100%
rename from items/syitems.py
rename to src/kiutils/items/syitems.py
diff --git a/kiutils/items/zones.py b/src/kiutils/items/zones.py
similarity index 99%
rename from kiutils/items/zones.py
rename to src/kiutils/items/zones.py
index e54945f..ef99b59 100644
--- a/kiutils/items/zones.py
+++ b/src/kiutils/items/zones.py
@@ -503,7 +503,7 @@ class Zone():
     strings. When the zone only resides on one layer, the output of ``self.to_sexpr()`` will
     change into ``(layer "xyz")`` instead of ``(layers ..)`` automatically."""
 
-    uuid: Optional[str] = None       # Used since KiCad 6
+    uuid: Optional[str] = None       # Used since KiCad 6 and renamed to uuid for kicad 8 
     """The ``uuid`` token defines the unique identifier of the zone object"""
 
     name: Optional[str] = None
@@ -629,7 +629,7 @@ def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
             
         if len(self.layers) == 0:
             raise Exception("Zone: No layers set for this zone")
-        elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu":
+        elif len(self.layers) == 1 and self.layers[0] != "F&B.Cu" and self.layers[0] != "*.Cu":
             layer_token = f' (layer{layers})'
         else:
             layer_token = f' (layers{layers})'
diff --git a/kiutils/libraries.py b/src/kiutils/libraries.py
similarity index 100%
rename from kiutils/libraries.py
rename to src/kiutils/libraries.py
diff --git a/kiutils/misc/config.py b/src/kiutils/misc/config.py
similarity index 100%
rename from kiutils/misc/config.py
rename to src/kiutils/misc/config.py
diff --git a/kiutils/schematic.py b/src/kiutils/schematic.py
similarity index 100%
rename from kiutils/schematic.py
rename to src/kiutils/schematic.py
diff --git a/kiutils/symbol.py b/src/kiutils/symbol.py
similarity index 100%
rename from kiutils/symbol.py
rename to src/kiutils/symbol.py
diff --git a/kiutils/utils/sexpr.py b/src/kiutils/utils/sexpr.py
similarity index 100%
rename from kiutils/utils/sexpr.py
rename to src/kiutils/utils/sexpr.py
diff --git a/kiutils/utils/strings.py b/src/kiutils/utils/strings.py
similarity index 100%
rename from kiutils/utils/strings.py
rename to src/kiutils/utils/strings.py
diff --git a/kiutils/wks.py b/src/kiutils/wks.py
similarity index 100%
rename from kiutils/wks.py
rename to src/kiutils/wks.py
diff --git a/symbol.py b/symbol.py
deleted file mode 100644
index 022a229..0000000
--- a/symbol.py
+++ /dev/null
@@ -1,592 +0,0 @@
-"""
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    14.02.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbols
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-from os import path
-import re
-
-from kiutils.items.common import Effects, Position, Property, Font
-from kiutils.items.syitems import *
-from kiutils.utils import sexpr
-from kiutils.utils.strings import dequote
-from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR
-
-@dataclass
-class SymbolAlternativePin():
-    pinName: str = ""
-    """The ``pinName`` token defines the name of the alternative pin function"""
-
-    electricalType: str = "input"
-    """The ``electricalType`` defines the pin electrical connection. See symbol documentation for
-    valid pin electrical connection types and descriptions."""
-
-    graphicalStyle: str = "line"
-    """The ``graphicalStyle`` defines the graphical style used to draw the pin. See symbol
-    documentation for valid pin graphical styles and descriptions."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolAlternativePin:
-        """Convert the given S-Expresstion into a SymbolAlternativePin object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(alternate ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not alternate
-
-        Returns:
-            - SymbolAlternativePin: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'alternate':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.pinName = exp[1]
-        object.electricalType = exp[2]
-        object.graphicalStyle = exp[3]
-        return object
-
-    def to_sexpr(self, indent: int = 8, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 8.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        return f'{indents}(alternate "{dequote(self.pinName)}" {self.electricalType} {self.graphicalStyle}){endline}'
-
-@dataclass
-class SymbolPin():
-    """The ``pin`` token defines a pin in a symbol definition.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbol_pin
-    """
-
-    electricalType: str = "input"
-    """The ``electricalType`` defines the pin electrical connection. See documentation below for
-    valid pin electrical connection types and descriptions."""
-
-    graphicalStyle: str = "line"
-    """The ``graphicalStyle`` defines the graphical style used to draw the pin. See documentation
-    below for valid pin graphical styles and descriptions."""
-
-    position: Position = field(default_factory=lambda: Position())
-    """The ``position`` defines the X and Y coordinates and rotation angle of the connection point
-    of the pin relative to the symbol origin position"""
-
-    length: float = 0.254
-    """The ``length`` token attribute defines the LENGTH of the pin"""
-
-    name: str = ""
-    """The ``name`` token defines a string containing the name of the pin"""
-
-    nameEffects: Optional[Effects] = None
-    """The optional ``nameEffects`` token define how the pin's name is displayed. This token is
-    mandatory for KiCad v6 and was made optional since KiCad v7."""
-
-    number: str = "0"
-    """The ``number`` token defines a string containing the NUMBER of the pin"""
-
-    numberEffects: Optional[Effects] = None
-    """The optional ``numberEffects`` token define how the pin's number is displayed. This token is
-    mandatory for KiCad v6 and was made optional since KiCad v7."""
-
-    hide: bool = False      # Missing in documentation
-    """The 'hide' token defines if the pin should be hidden"""
-
-    alternatePins: List[SymbolAlternativePin] = field(default_factory=list)
-    """The 'alternate' token defines one or more alternative definitions for the symbol pin"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolPin:
-        """Convert the given S-Expresstion into a SymbolPin object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(pin ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not pin
-
-        Returns:
-            - SymbolPin: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'pin':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.electricalType = exp[1]
-        object.graphicalStyle = exp[2]
-        for item in exp[3:]:
-            if type(item) != type([]):
-                if item == 'hide': object.hide = True
-                else: continue
-            if item[0] == 'at': object.position = Position().from_sexpr(item)
-            if item[0] == 'length': object.length = item[1]
-            if item[0] == 'name':
-                object.name = item[1]
-                if len(item) > 2:
-                    object.nameEffects = Effects().from_sexpr(item[2])
-            if item[0] == 'number':
-                object.number = item[1]
-                if len(item) > 2:
-                    object.numberEffects = Effects().from_sexpr(item[2])
-            if item[0] == 'alternate': object.alternatePins.append(SymbolAlternativePin().from_sexpr(item))
-        return object
-
-    def to_sexpr(self, indent: int = 4, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 4.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        newLineAdded = False
-
-        hide = ' hide' if self.hide else ''
-        posA = f' {self.position.angle}' if self.position.angle is not None else ''
-        nameEffects = f' {self.nameEffects.to_sexpr(newline=False)}' if self.nameEffects is not None else ''
-        numberEffects = f' {self.numberEffects.to_sexpr(newline=False)}' if self.numberEffects is not None else ''
-
-        expression =  f'{indents}(pin {self.electricalType} {self.graphicalStyle} (at {self.position.X} {self.position.Y}{posA}) (length {self.length}){hide}'
-        
-        # Since KiCad v7 nightly: Missing name and number effects print both other tokens into 
-        # the same line.
-        # Constrained in: schematic/since_v7/test_symbolPinOptionalTokens
-        if self.nameEffects is None and self.numberEffects is None:
-            expression += f' (name "{dequote(self.name)}") (number "{dequote(self.number)}")'
-        else:
-            expression += f'\n{indents}  (name "{dequote(self.name)}"{nameEffects})\n'
-            expression += f'{indents}  (number "{dequote(self.number)}"{numberEffects})\n'
-            newLineAdded = True
-
-        # Alternative pins always generate a line break
-        if self.alternatePins:
-            if not newLineAdded:
-                expression += '\n' 
-            newLineAdded = True
-            for alternativePin in self.alternatePins:
-                expression += alternativePin.to_sexpr(indent+2)
-
-        if newLineAdded:
-            expression += f'{indents}){endline}'
-        else:
-            expression += f'){endline}'
-        return expression
-
-@dataclass
-class Symbol():
-    """The ``symbol`` token defines a symbol or sub-unit of a parent symbol. There can be zero or more
-    ``symbol`` tokens in a symbol library file.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-intro/index.html#_symbols
-    """
-
-    """Each symbol must have """
-    @property
-    def libId(self) -> str:
-        """The ``lib_id`` token defines a unique "LIBRARY_ID" for each top level symbol in the
-        library or a unique "UNIT_ID" for each unit embedded in a parent symbol. Library identifiers
-        are only valid it top level symbols and unit identifiers are on valid as unit symbols inside
-        a parent symbol. 
-        
-        The following conventions apply:
-            - "LIBRARY_ID" (top-level symbol): ``[:]`` (the library 
-              nickname part is optional here)
-            - "UNIT_ID" (child symbol): ``__``
-
-        In ``kiutils``, the ``lib_id`` token is a combination of ``libraryNickname``, ``entryName``,
-        ``unitId`` and ``styleId`` tokens. Setting the ``lib_id`` token will update all those tokens
-        accordingly.
-
-        Returns:
-            - If the ``libraryNickname`` is set: ``:``
-            - If the ``libraryNickname`` is ``None``: ```` or ``__``,
-              depending if these tokens are set.
-        """
-        if (self.unitId is not None and self.styleId is not None):
-            unit_style_ids = f"_{self.unitId}_{self.styleId}"
-        else:
-            unit_style_ids = ""
-
-        if self.libraryNickname:
-            return f'{self.libraryNickname}:{self.entryName}'
-        else:
-            return f'{self.entryName}{unit_style_ids}'
-
-    @libId.setter
-    def libId(self, symbol_id: str):
-        """Sets the ``lib_id`` token and parses its contents into the ``libraryNickname``,
-        ``entryName``, ``unitId`` and ``styleId`` token. 
-
-        See self.libId property description for more information.
-        
-        Args:
-            - symbol_id (str): The symbol id in the following format: ``:``,
-              ``__`` or only ````, depending on if the symbol
-              is a top-level symbol or a child symbol
-
-        Raises:
-            - Exception: If the given ID is neither a top-level nor a child symbol
-        """
-        # Try to parse the given ID
-        parse_symbol_id = re.match(r"^(.+?):(.+?)$", symbol_id)
-        if parse_symbol_id:
-            # The symbol is a top-level symbol with a library nickname
-            self.libraryNickname = parse_symbol_id.group(1)
-            self.entryName = parse_symbol_id.group(2)
-            self.unitId = None
-            self.styleId = None
-        else:
-            parse_symbol_id = re.match(r"^(.+?)_(\d+?)_(\d+?)$", symbol_id)
-            if parse_symbol_id:
-                # The symbol is a child symbol
-                self.libraryNickname = None
-                self.entryName = parse_symbol_id.group(1)
-                self.unitId = int(parse_symbol_id.group(2))
-                self.styleId = int(parse_symbol_id.group(3))
-            else:
-                # The symbol is a top-level symbol without a library nickname
-                self.libraryNickname = None
-                self.entryName = symbol_id
-                self.unitId = None
-                self.styleId = None
-
-        # Update units id to match parent id
-        for unit in self.units:
-            unit.entryName = self.entryName
-
-    libraryNickname: Optional[str] = None
-    """The optional ``libraryNickname`` token defines which symbol library this symbol belongs to
-    and is a part of the ``id`` token"""
-    
-    entryName: str = None
-    """The ``entryName`` token defines the actual name of the symbol and is a part of the ``id`` 
-    token"""
-
-    unitId: Optional[int] = None
-    """The ``unitId`` token identifies which unit the symbol represents and is a part of 
-    the ``id`` token"""
-
-    styleId: Optional[int] = None
-    """The ``styleId`` token indicates which body style the unit represents and is a part of the 
-    ``id`` token"""
-
-    extends: Optional[str] = None
-    """The optional ``extends`` token attribute defines the "LIBRARY_ID" of another symbol inside the
-    current library from which to derive a new symbol. Extended symbols currently can only have
-    different symbol properties than their parent symbol."""
-
-    hidePinNumbers: bool = False
-    """The ``pin_numbers`` token defines the visibility setting of the symbol pin numbers for
-    the entire symbol. If set to False, the all of the pin numbers in the symbol are visible."""
-
-    pinNames: bool = False
-    """The optional ``pinNames`` token defines the attributes for all of the pin names of the symbol.
-    If the ``pinNames`` token is not defined, all symbol pins are shown with the default offset."""
-
-    pinNamesHide: bool = False
-    """The optional ``pinNamesOffset`` token defines the pin name of all pins should be hidden"""
-
-    pinNamesOffset: Optional[float] = None
-    """The optional ``pinNamesOffset`` token defines the pin name offset for all pin names of the
-    symbol. If not defined, the pin name offset is 0.508mm (0.020")"""
-
-    inBom: Optional[bool] = None
-    """The optional ``inBom`` token, defines if a symbol is to be include in the bill of material
-    output. If undefined, the token will not be generated in `self.to_sexpr()`."""
-
-    onBoard: Optional[bool] = None
-    """The ``onBoard`` token, defines if a symbol is to be exported from the schematic to the printed
-    circuit board. If undefined, the token will not be generated in `self.to_sexpr()`."""
-
-    # TODO: Describe this token
-    isPower: bool = False           # Missing in documentation, added when "Als Spannungssymbol" is checked
-    """The ``isPower`` token's documentation was not done yet .."""
-
-    properties: List[Property] = field(default_factory=list)
-    """The ``properties`` is a list of properties that define the symbol. The following properties are
-    mandatory when defining a parent symbol: "Reference", "Value", "Footprint", and "Datasheet".
-    All other properties are optional. Unit symbols cannot have any properties."""
-
-    graphicItems: List = field(default_factory=list)
-    """The ``graphicItems`` section is list of graphical arcs, circles, curves, lines, polygons, 
-    rectangles, text and text boxes that define the symbol drawing. Possible items are defined in 
-    ``kiutils.items.syitems``. This section can be empty if the symbol has no graphical items."""
-
-    pins: List[SymbolPin] = field(default_factory=list)
-    """The ``pins`` section is a list of pins that are used by the symbol. This section can be empty if
-    the symbol does not have any pins."""
-
-    units: List[Symbol] = field(default_factory=list)
-    """The ``units`` can be one or more child symbol tokens embedded in a parent symbol"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Symbol:
-        """Convert the given S-Expression into a Symbol object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(symbol ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not symbol
-
-        Returns:
-            - Symbol: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'symbol':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.libId = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'extends': object.extends = item[1]
-            if item[0] == 'pin_numbers':
-                if item[1] == 'hide':
-                    object.hidePinNumbers = True
-            if item[0] == 'pin_names':
-                object.pinNames = True
-                for property in item[1:]:
-                    if type(property) == type([]):
-                        if property[0] == 'offset': object.pinNamesOffset = property[1]
-                    else:
-                        if property == 'hide': object.pinNamesHide = True
-            if item[0] == 'in_bom': object.inBom = True if item[1] == 'yes' else False
-            if item[0] == 'on_board': object.onBoard = True if item[1] == 'yes' else False
-            if item[0] == 'power': object.isPower = True
-
-            if item[0] == 'symbol': object.units.append(Symbol().from_sexpr(item))
-            if item[0] == 'property': object.properties.append(Property().from_sexpr(item))
-
-            if item[0] == 'pin': object.pins.append(SymbolPin().from_sexpr(item))
-            if item[0] == 'arc': object.graphicItems.append(SyArc().from_sexpr(item))
-            if item[0] == 'circle': object.graphicItems.append(SyCircle().from_sexpr(item))
-            if item[0] == 'curve': object.graphicItems.append(SyCurve().from_sexpr(item))
-            if item[0] == 'polyline': object.graphicItems.append(SyPolyLine().from_sexpr(item))
-            if item[0] == 'rectangle': object.graphicItems.append(SyRect().from_sexpr(item))
-            if item[0] == 'text': object.graphicItems.append(SyText().from_sexpr(item))
-            if item[0] == 'text_box': object.graphicItems.append(SyTextBox().from_sexpr(item))
-
-        return object
-
-    @classmethod
-    def create_new(cls, id: str, reference: str, value: str,
-                        footprint: str = "", datasheet: str = "") -> Symbol:
-        """Creates a new empty symbol as KiCad would create it
-
-        Args:
-            - id (str): ID token of the symbol
-            - reference (str): Reference designator
-            - value (str): Value of the ``value`` property
-            - footprint (str): Value of the ``footprint`` property. Defaults to "" (empty string).
-            - datasheet (str): Value of the ``datasheet`` property. Defaults to "" (empty string).
-
-        Returns:
-            - Symbol: New symbol initialized with default values
-        """
-        symbol = cls()
-        symbol.inBom = True
-        symbol.onBoard = True
-        symbol.libId = id
-        symbol.properties.extend(
-            [
-                Property(key = "Reference", value = reference, id = 0,
-                         effects = Effects(font=Font(width=1.27, height=1.27))),
-                Property(key = "Value", value = value, id = 1,
-                         effects = Effects(font=Font(width=1.27, height=1.27))),
-                Property(key = "Footprint", value = footprint, id = 2,
-                         effects = Effects(font=Font(width=1.27, height=1.27), hide=True)),
-                Property(key = "Datasheet", value = datasheet, id = 3,
-                         effects = Effects(font=Font(width=1.27, height=1.27), hide=True))
-            ]
-        )
-        return symbol
-
-    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        obtext, ibtext = '', ''
-
-        if self.inBom is not None:
-            ibtext = 'yes' if self.inBom else 'no'
-        inbom = f' (in_bom {ibtext})' if self.inBom is not None else ''
-        if self.onBoard is not None:
-            obtext = 'yes' if self.onBoard else 'no'
-        onboard = f' (on_board {obtext})' if self.onBoard is not None else ''
-        power = f' (power)' if self.isPower else ''
-        pnhide = f' hide' if self.pinNamesHide else ''
-        pnoffset = f' (offset {self.pinNamesOffset})' if self.pinNamesOffset is not None else ''
-        pinnames = f' (pin_names{pnoffset}{pnhide})' if self.pinNames else ''
-        pinnumbers = f' (pin_numbers hide)' if self.hidePinNumbers else ''
-        extends = f' (extends "{dequote(self.extends)}")' if self.extends is not None else ''
-
-        expression =  f'{indents}(symbol "{dequote(self.libId)}"{extends}{power}{pinnumbers}{pinnames}{inbom}{onboard}\n'
-        for item in self.properties:
-            expression += item.to_sexpr(indent+2)
-        for item in self.graphicItems:
-            expression += item.to_sexpr(indent+2)
-        for item in self.pins:
-            expression += item.to_sexpr(indent+2)
-        for item in self.units:
-            expression += item.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-        return expression
-
-@dataclass
-class SymbolLib():
-    """A symbol library defines the common format of ``.kicad_sym`` files. A symbol library may contain
-    zero or more symbols.
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-symbol-lib/
-    """
-    version: str = KIUTILS_CREATE_NEW_VERSION_STR
-    """The ``version`` token attribute defines the symbol library version using the YYYYMMDD date format"""
-
-    generator: Optional[str] = None
-    """The ``generator`` token attribute defines the program used to write the file"""
-
-    symbols: List[Symbol] = field(default_factory=list)
-    """The ``symbols`` token defines a list of zero or more symbols that are part of the symbol library"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the library file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> SymbolLib:
-        """Load a symbol library directly from a KiCad footprint file (`.kicad_sym`) and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - SymbolLib: Object of the SymbolLib class initialized with the given KiCad symbol library
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> SymbolLib:
-        """Convert the given S-Expresstion into a SymbolLib object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(kicad_symbol_lib ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not kicad_symbol_lib
-
-        Returns:
-            - SymbolLib: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'kicad_symbol_lib':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-
-        for item in exp[1:]:
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'generator': object.generator = item[1]
-            if item[0] == 'symbol': object.symbols.append(Symbol().from_sexpr(item))
-        return object
-
-    def to_file(self, filepath = None, encoding: Optional[str] = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set,
-                                        the attribute ``self.filePath`` will be used instead.
-            - encoding (str, optional): Encoding of the output file. Defaults to None (platform
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w', encoding=encoding) as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent: int = 0, newline: bool = True) -> str:
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(kicad_symbol_lib (version {self.version}) (generator {self.generator})\n'
-        for item in self.symbols:
-            expression += f'{indents}{item.to_sexpr(indent+2)}'
-        expression += f'{indents}){endline}'
-        return expression
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..7daeb33
--- /dev/null
+++ b/test.py
@@ -0,0 +1,37 @@
+"""Some simple tests for the classes that read and write to files
+
+Author:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+import unittest
+
+import os
+import sys
+
+PROJECT_PATH = os.getcwd()
+SOURCE_PATH = os.path.join(
+    PROJECT_PATH, "src"
+)
+sys.path.append(SOURCE_PATH)
+
+from tests.test_board import *
+from tests.test_designrules import *
+from tests.test_footprint import *
+from tests.test_libtable import *
+from tests.test_schematic import *
+from tests.test_symbol import *
+from tests.test_worksheets import *
+from tests.test_misc import *
+from tests.reporter.runner import HTMLTestRunner
+
+if __name__ == "__main__":
+    unittest.main(testRunner=HTMLTestRunner(
+        combine_reports = True,
+        verbosity = 3,
+        report_title = 'KiUtils Unittest Report',
+        report_name = 'KiUtils_Testreport',
+        open_in_browser = True
+    ))
\ No newline at end of file
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..bc4689a
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,17 @@
+"""Initialization of kiutils tests
+
+Author:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+
+import os
+import sys
+
+PROJECT_PATH = os.getcwd()
+SOURCE_PATH = os.path.join(
+    PROJECT_PATH, "src"
+)
+sys.path.append(SOURCE_PATH)
diff --git a/tests/reporter/README.md b/tests/reporter/README.md
new file mode 100644
index 0000000..5a59f2e
--- /dev/null
+++ b/tests/reporter/README.md
@@ -0,0 +1,208 @@
+# KiUtils HTML Reporter
+
+This is a custom version of [oldani/HtmlTestRunner](https://github.com/oldani/HtmlTestRunner). It was modified
+to fit `kiutils`'s testing framework. Credits go to the original author.
+
+Original author: Ordanis Sanchez - @oldani
+Release when forked: v1.2.1 - September 2019
+
+# HtmlTestRunner
+
+
+[![Pypi link](https://img.shields.io/pypi/v/html-testRunner.svg)](https://pypi.python.org/pypi/html-testRunner)
+[![Travis job](https://img.shields.io/travis/oldani/HtmlTestRunner.svg)](https://travis-ci.org/oldani/HtmlTestRunner)
+
+HtmlTest runner is a unittest test runner that saves results in a human-readable HTML format.
+
+This Package was inspired by ``unittest-xml-reporting`` and
+``HtmlTestRunner by tungwaiyip`` and began by combining the methodology of the former with the functionality of the latter.
+
+## Table of Content
+
+- [Intallation](#installation)
+- [Usage](#usage)
+- [Console Output](#console-output)
+- [Test Results](#test-result)
+- [Todo](#todo)
+- [Contributing](#contributing)
+- [Credits](#credits)
+
+## Installation
+
+
+To install HtmlTestRunner, run this command in your terminal:
+
+```batch
+$ pip install html-testRunner
+```
+
+This is the preferred method to install HtmlTestRunner, as it will always install the most recent stable release.
+If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide
+you through the process.
+
+
+## Usage:
+
+### With unittest.main()
+
+```python
+
+import HtmlTestRunner
+import unittest
+
+
+class TestStringMethods(unittest.TestCase):
+    """ Example test for HtmlRunner. """
+
+    def test_upper(self):
+        self.assertEqual('foo'.upper(), 'FOO')
+
+    def test_isupper(self):
+        self.assertTrue('FOO'.isupper())
+        self.assertFalse('Foo'.isupper())
+
+    def test_split(self):
+        s = 'hello world'
+        self.assertEqual(s.split(), ['hello', 'world'])
+        # check that s.split fails when the separator is not a string
+        with self.assertRaises(TypeError):
+            s.split(2)
+
+    def test_error(self):
+        """ This test should be marked as error one. """
+        raise ValueError
+
+    def test_fail(self):
+        """ This test should fail. """
+        self.assertEqual(1, 2)
+
+    @unittest.skip("This is a skipped test.")
+    def test_skip(self):
+        """ This test should be skipped. """
+        pass
+
+if __name__ == '__main__':
+    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner())
+```
+
+Just import `HtmlTestRunner` from package, then pass it to `unittest.main` with the `testRunner` keyword.
+Tests will be saved under a reports/ directory by default (the `output` kwarg controls this.).
+
+### With Test Suites
+`HtmlTestRunner` can also be used with `test suites`; just create a runner instance and call the run method with your suite.
+Here an example:
+
+```python
+from unittest import TestLoader, TestSuite
+from HtmlTestRunner import HTMLTestRunner
+import ExampleTest
+import Example2Test
+
+example_tests = TestLoader().loadTestsFromTestCase(ExampleTest)
+example2_tests = TestLoader().loadTestsFromTestCase(Example2Test)
+
+suite = TestSuite([example_tests, example2_tests])
+
+runner = HTMLTestRunner(output='example_suite')
+
+runner.run(suite)
+```
+
+### Combining Reports into a Single Report
+
+By default, separate reports will be produced for each `TestCase`.
+The `combine_reports` boolean kwarg can be used to tell `HTMLTestRunner` to instead produce a single report:
+ ```python
+import HtmlTestRunner
+h = HtmlTestRunner.HTMLTestRunner(combine_reports=True).run(suite)
+ ```
+
+### Setting a filename
+By default the name of the HTML file(s) produced will be created by joining the names of each test case together.
+The `report_name` kwarg can be used to specify a custom filename.
+For example, the following will produce a report file called "MyReport.html":
+
+```python
+import HtmlTestRunner
+h = HtmlTestRunner.HTMLTestRunner(combine_reports=True, report_name="MyReport", add_timestamp=False).run(suite)
+```
+
+## Console output:
+
+![Console output](docs/console_output.png)
+
+This is an example of the console output expected when using `HTMLTestRunner`.
+
+
+## Test Result:
+
+![Test Results](docs/test_results.gif)
+
+This is a sample of the results from the template that came by default with the runner.
+
+## Custom Templates:
+
+If you want to use your own template you can pass the absolute path when instantiating the `HTMLTestRunner` class using the `template` kwarg:
+ ```python
+import HtmlTestRunner
+h = HtmlTestRunner.HTMLTestRunner(template='path/to/template')
+ ```
+Your template must use `jinja2` syntax, since this is the engine we use.
+
+
+When using any template, the following variables will be available by default for use by `jinja2`:
+
+- `title`: This is the report title - by default this is "Unittests Results" but can be changed using the `report_title` kwarg
+- `headers`: This is a dict with 2 items:
+    - `start_time`: A `datetime` object representing when the test was run
+    - `status`: A dict of of the same form as the sub-dicts described below for `summaries` but for all tests combined
+- `all_results`: A dict - keys are the names of each test case and values are lists containing test result objects (see the source code or the template for what information these provide)
+- `summaries`: A dict - keys are the names of each test case and values are dicts containing:
+    - `total`: The total number of tests
+    - `success`: The number of passed tests
+    - `failure`: The number of failed tests
+    - `error`: The number of errored tests
+    - `skip`: The number of skipped tests
+    - `duration`: A string showing how long all these tests took to run in either seconds or milliseconds
+    
+Furthermore, you can provide any number of further variables to access from the template using the `template_args` kwarg.
+For example, if you wanted to have the name of the logged in user available to insert into reports that could be achieved as follows:
+```python
+import getpass
+import HtmlTestRunner
+
+template_args = {
+    "user": getpass.getuser()
+}
+h = HtmlTestRunner.HTMLTestRunner(template='path/to/template', template_args=template_args)
+```
+
+Now the user name can be accessed from a template using `jinja2` syntax: `{{ user }}`.
+
+
+Click [here](docs/example_template.html) for a template example, this is the default one shipped with the package.
+
+
+
+## TODO
+
+- [ ] Add Test
+- [ ] Improve documentation
+- [x] Add custom templates
+- [ ] Add xml results
+- [ ] Add support for Python2.7
+- [x] Add support for one report when running test suites.
+
+## Contributing
+
+Contributions are welcome, and they are greatly appreciated! Every
+little bit helps, and credit will always be given.
+
+For more info please click [here](./CONTRIBUTING.md)
+
+## Credits
+
+This package was created with Cookiecutter and the `audreyr/cookiecutter-pypackage` project template.
+
+- [Cookiecutter](https://github.com/audreyr/cookiecutter)
+- [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage)
diff --git a/tests/reporter/result.py b/tests/reporter/result.py
new file mode 100644
index 0000000..6ebd53d
--- /dev/null
+++ b/tests/reporter/result.py
@@ -0,0 +1,483 @@
+from __future__ import print_function
+
+import os
+import platform
+import sys
+import time
+import copy
+import difflib
+import traceback
+from unittest import TestResult, TextTestResult
+from unittest.result import failfast
+
+from jinja2 import Template
+
+
+DEFAULT_TEMPLATE = os.path.join(os.path.dirname(__file__), "template", "report_template.html")
+
+
+def load_template(template):
+    """ Try to read a file from a given path, if file
+        does not exist, load default one. """
+    file = None
+    try:
+        if template:
+            with open(template, "r") as f:
+                file = f.read()
+    except Exception as err:
+        print("Error: Your Template wasn't loaded", err,
+              "Loading Default Template", sep="\n")
+    finally:
+        if not file:
+            with open(DEFAULT_TEMPLATE, "r") as f:
+                file = f.read()
+        return file
+
+
+def render_html(template, **kwargs):
+    template_file = load_template(template)
+    if template_file:
+        template = Template(template_file)
+        return template.render(**kwargs)
+
+
+def testcase_name(test_method):
+    testcase = type(test_method)
+
+    module = testcase.__module__ + "."
+    if module == "__main__.":
+        module = ""
+    result = module + testcase.__name__
+    return result
+
+
+def strip_module_names(testcase_names):
+    """Examine all given test case names and strip them the minimal
+    names needed to distinguish each. This prevents cases where test
+    cases housed in different files but with the same names cause clashes."""
+    result = copy.copy(testcase_names)
+    for i, testcase in enumerate(testcase_names):
+        classname = testcase.split(".")[-1]
+        duplicate_found = False
+        testcase_names_ = copy.copy(testcase_names)
+        del testcase_names_[i]
+        for testcase_ in testcase_names_:
+            classname_ = testcase_.split(".")[-1]
+            if classname_ == classname:
+                duplicate_found = True
+        if not duplicate_found:
+            result[i] = classname
+    return result
+
+
+class _TestInfo(object):
+    """" Keeps information about the execution of a test method. """
+
+    (SUCCESS, FAILURE, ERROR, SKIP) = range(4)
+
+    def __init__(self, test_result, test_method, outcome=SUCCESS,
+                 err=None, subTest=None):
+        self.test_result = test_result
+        self.outcome = outcome
+        self.elapsed_time = 0
+        self.err = err
+        self.stdout = test_result._stdout_data
+        self.stderr = test_result._stderr_data
+
+        self.is_subtest = subTest is not None
+
+        self.test_description = self.test_result.getDescription(test_method)
+        self.test_exception_info = (
+            '' if outcome in (self.SUCCESS, self.SKIP)
+            else self.test_result._exc_info_to_string(
+                self.err, test_method))
+
+        self.test_name = testcase_name(test_method)
+        if not self.is_subtest:
+            self.test_id = test_method.id()
+        else:
+            self.test_id = subTest.id()
+
+        # KiUtils stuff starts here ..
+
+        self.kiutils_expected_output = 'No expected output specified ..'
+        self.kiutils_produced_output = 'No produced output specified ..'
+        self.kiutils_description = 'No test description provided ..'
+
+        if hasattr(test_method, 'testData'):
+            if test_method.testData.ownDescription is not None:
+                self.kiutils_description = test_method.testData.ownDescription
+            elif hasattr(test_method, '_testMethodDoc'):
+                self.kiutils_description = test_method._testMethodDoc
+            else:
+                # No further description provided
+                pass
+
+            if test_method.testData.expectedOutput is not None:
+                self.kiutils_expected_output = test_method.testData.expectedOutput
+
+            if test_method.testData.producedOutput is not None:
+                self.kiutils_produced_output = test_method.testData.producedOutput
+
+            if self.kiutils_expected_output is not None and self.kiutils_produced_output is not None:
+                self.diff = difflib.HtmlDiff().make_file(
+                    self.kiutils_expected_output.split("\n"),
+                    self.kiutils_produced_output.split("\n"),
+                )
+
+        pass
+        # .. KiUtils stuff ends here
+
+    def id(self):
+        return self.test_id
+
+    def test_finished(self):
+        self.elapsed_time = self.test_result.stop_time - self.test_result.start_time
+
+    def get_description(self):
+        return self.test_description
+
+    def get_error_info(self):
+        return self.test_exception_info
+
+
+class _SubTestInfos(object):
+    # TODO: make better: inherit _TestInfo?
+    (SUCCESS, FAILURE, ERROR, SKIP) = range(4)
+
+    def __init__(self, test_id, subtests):
+        self.subtests = subtests
+        self.test_id = test_id
+        self.outcome = self.check_outcome()
+
+    def check_outcome(self):
+        outcome = _TestInfo.SUCCESS
+        for subtest in self.subtests:
+            if subtest.outcome != _TestInfo.SUCCESS:
+                outcome = _TestInfo.FAILURE
+                break
+        return outcome
+
+
+class HtmlTestResult(TextTestResult):
+    """ A test result class that express test results in Html. """
+
+    start_time = None
+    stop_time = None
+    default_prefix = "TestResults_"
+
+    def __init__(self, stream, descriptions, verbosity):
+        TextTestResult.__init__(self, stream, descriptions, verbosity)
+        self.buffer = True
+        self._stdout_data = None
+        self._stderr_data = None
+        self.successes = []
+        self.subtests = {}
+        self.callback = None
+        self.infoclass = _TestInfo
+        self.report_files = []
+
+    def _prepare_callback(self, test_info, target_list, verbose_str,
+                          short_str):
+        """ Appends a 'info class' to the given target list and sets a
+            callback method to be called by stopTest method."""
+        target_list.append(test_info)
+
+        def callback():
+            """ Print test method outcome to the stream and elapsed time too."""
+            test_info.test_finished()
+
+            if self.showAll:
+                self.stream.writeln(
+                    "{} ({:3f})s".format(verbose_str, test_info.elapsed_time))
+            elif self.dots:
+                self.stream.write(short_str)
+
+        self.callback = callback
+
+    def getDescription(self, test):
+        """ Return the test description if not have test name. """
+        return str(test)
+
+    def startTest(self, test):
+        """ Called before execute each method. """
+        self.start_time = time.time()
+        TestResult.startTest(self, test)
+
+        if self.showAll:
+            self.stream.write(" " + self.getDescription(test))
+            self.stream.write(" ... ")
+
+    def _save_output_data(self):
+        try:
+            self._stdout_data = sys.stdout.getvalue()
+            self._stderr_data = sys.stderr.getvalue()
+        except AttributeError:
+            pass
+
+    def stopTest(self, test):
+        """ Called after excute each test method. """
+        self._save_output_data()
+        TextTestResult.stopTest(self, test)
+        self.stop_time = time.time()
+
+        if self.callback and callable(self.callback):
+            self.callback()
+            self.callback = None
+
+    def addSuccess(self, test):
+        """ Called when a test executes successfully. """
+        self._save_output_data()
+        self._prepare_callback(self.infoclass(self, test), self.successes, "OK", ".")
+
+    @failfast
+    def addFailure(self, test, err):
+        """ Called when a test method fails. """
+        self._save_output_data()
+        testinfo = self.infoclass(self, test, self.infoclass.FAILURE, err)
+        self._prepare_callback(testinfo, self.failures, "FAIL", "F")
+
+    @failfast
+    def addError(self, test, err):
+        """" Called when a test method raises an error. """
+        self._save_output_data()
+        testinfo = self.infoclass(self, test, self.infoclass.ERROR, err)
+        self._prepare_callback(testinfo, self.errors, 'ERROR', 'E')
+
+    def addSubTest(self, testcase, test, err):
+        """ Called when a subTest completes. """
+        self._save_output_data()
+        # TODO: should ERROR cases be considered here too?
+        if err is None:
+            testinfo = self.infoclass(self, testcase, self.infoclass.SUCCESS, err, subTest=test)
+            self._prepare_callback(testinfo, self.successes, "OK", ".")
+        else:
+            testinfo = self.infoclass(self, testcase, self.infoclass.FAILURE, err, subTest=test)
+            self._prepare_callback(testinfo, self.failures, "FAIL", "F")
+
+        test_id_components = str(testcase).rstrip(')').split(' (')
+        test_id = test_id_components[1] + '.' + test_id_components[0]
+        if test_id not in self.subtests:
+            self.subtests[test_id] = []
+        self.subtests[test_id].append(testinfo)
+
+    def addSkip(self, test, reason):
+        """" Called when a test method was skipped. """
+        self._save_output_data()
+        testinfo = self.infoclass(self, test, self.infoclass.SKIP, reason)
+        self._prepare_callback(testinfo, self.skipped, "SKIP", "S")
+
+    def printErrorList(self, flavour, errors):
+        """
+        Writes information about the FAIL or ERROR to the stream.
+        """
+        for test_info in errors:
+            self.stream.writeln(self.separator1)
+            self.stream.writeln(
+                '{} [{:3f}s]: {}'.format(flavour, test_info.elapsed_time,
+                                         test_info.test_id)
+            )
+            self.stream.writeln(self.separator2)
+            self.stream.writeln('%s' % test_info.get_error_info())
+
+    def _get_info_by_testcase(self):
+        """ Organize test results by TestCase module. """
+
+        tests_by_testcase = {}
+
+        subtest_names = set(self.subtests.keys())
+        for test_name, subtests in self.subtests.items():
+            subtest_info = _SubTestInfos(test_name, subtests)
+            testcase_name = ".".join(test_name.split(".")[:-1])
+            if testcase_name not in tests_by_testcase:
+                tests_by_testcase[testcase_name] = []
+            tests_by_testcase[testcase_name].append(subtest_info)
+
+        for tests in (self.successes, self.failures, self.errors, self.skipped):
+            for test_info in tests:
+                # subtests will be contained by _SubTestInfos objects but there is also the
+                # case where all subtests pass and the method is added as a success as well
+                # which must be filtered out
+                if test_info.is_subtest or test_info.test_id in subtest_names:
+                    continue
+                if isinstance(test_info, tuple):  # TODO: does this ever occur?
+                    test_info = test_info[0]
+                testcase_name = ".".join(test_info.test_id.split(".")[:-1])
+                if testcase_name not in tests_by_testcase:
+                    tests_by_testcase[testcase_name] = []
+                tests_by_testcase[testcase_name].append(test_info)
+
+        # unittest tests in alphabetical order based on test name so re-assert this
+        for testcase in tests_by_testcase.values():
+            testcase.sort(key=lambda x: x.test_id)
+
+        return tests_by_testcase
+
+    @staticmethod
+    def _format_duration(elapsed_time):
+        """Format the elapsed time in seconds, or milliseconds if the duration is less than 1 second."""
+        if elapsed_time > 1:
+            duration = '{:2.2f} s'.format(elapsed_time)
+        else:
+            duration = '{:d} ms'.format(int(elapsed_time * 1000))
+        return duration
+
+    def get_results_summary(self, tests):
+        """Create a summary of the outcomes of all given tests."""
+
+        failures = errors = skips = successes = 0
+        for test in tests:
+            outcome = test.outcome
+            if outcome == test.ERROR:
+                errors += 1
+            elif outcome == test.FAILURE:
+                failures += 1
+            elif outcome == test.SKIP:
+                skips += 1
+            elif outcome == test.SUCCESS:
+                successes += 1
+
+        elapsed_time = 0
+        for testinfo in tests:
+            if not isinstance(testinfo, _SubTestInfos):
+                elapsed_time += testinfo.elapsed_time
+            else:
+                for subtest in testinfo.subtests:
+                    elapsed_time += subtest.elapsed_time
+
+        results_summary = {
+            "total": len(tests),
+            "error": errors,
+            "failure": failures,
+            "skip": skips,
+            "success": successes,
+            "duration": self._format_duration(elapsed_time)
+        }
+
+        return results_summary
+
+    def _get_header_info(self, tests, start_time):
+        results_summary = self.get_results_summary(tests)
+
+        header_info = {
+            "start_time": start_time,
+            "status": results_summary,
+            "python_version": f"{sys.version} on {platform.system()}"
+        }
+        return header_info
+
+    def _get_report_summaries(self, all_results, testRunner):
+        """ Generate headers and summaries for all given test cases."""
+        summaries = {}
+        for test_case_class_name, test_case_tests in all_results.items():
+            summaries[test_case_class_name] = self.get_results_summary(test_case_tests)
+
+        return summaries
+
+    def generate_reports(self, testRunner):
+        """ Generate report(s) for all given test cases that have been run. """
+        status_tags = ('success', 'danger', 'warning', 'info')
+        all_results = self._get_info_by_testcase()
+        summaries = self._get_report_summaries(all_results, testRunner)
+
+        if not testRunner.combine_reports:
+            for test_case_class_name, test_case_tests in all_results.items():
+                header_info = self._get_header_info(test_case_tests, testRunner.start_time)
+                html_file = render_html(
+                    testRunner.template,
+                    title=testRunner.report_title,
+                    header_info=header_info,
+                    all_results={test_case_class_name: test_case_tests},
+                    status_tags=status_tags,
+                    summaries=summaries,
+                    **testRunner.template_args
+                )
+                # append test case name if multiple reports to be generated
+                if testRunner.report_name is None:
+                    report_name_body = self.default_prefix + test_case_class_name
+                else:
+                    report_name_body = "{}_{}".format(testRunner.report_name, test_case_class_name)
+                self.generate_file(testRunner, report_name_body, html_file)
+
+        else:
+            header_info = self._get_header_info(
+                [item for sublist in all_results.values() for item in sublist],
+                testRunner.start_time
+            )
+            html_file = render_html(
+                testRunner.template,
+                title=testRunner.report_title,
+                header_info=header_info,
+                all_results=all_results,
+                status_tags=status_tags,
+                summaries=summaries,
+                **testRunner.template_args
+            )
+            # if available, use user report name
+            if testRunner.report_name is not None:
+                report_name_body = testRunner.report_name
+            else:
+                report_name_body = self.default_prefix + "_".join(strip_module_names(list(all_results.keys())))
+            self.generate_file(testRunner, report_name_body, html_file)
+
+    def generate_file(self, testRunner, report_name, report):
+        """ Generate the report file in the given path. """
+        dir_to = testRunner.output
+        if not os.path.exists(dir_to):
+            os.makedirs(dir_to)
+
+        if testRunner.timestamp:
+            report_name += "_" + testRunner.timestamp
+        report_name += ".html"
+
+        path_file = os.path.abspath(os.path.join(dir_to, report_name))
+        self.stream.writeln(os.path.relpath(path_file))
+        self.report_files.append(path_file)
+        with open(path_file, 'w') as report_file:
+            report_file.write(report)
+
+    def _exc_info_to_string(self, err, test):
+        """ Converts a sys.exc_info()-style tuple of values into a string."""
+        # if six.PY3:
+        #     # It works fine in python 3
+        #     try:
+        #         return super(_HTMLTestResult, self)._exc_info_to_string(
+        #             err, test)
+        #     except AttributeError:
+        #         # We keep going using the legacy python <= 2 way
+        #         pass
+
+        # This comes directly from python2 unittest
+        exctype, value, tb = err
+        # Skip test runner traceback levels
+        # while tb and self._is_relevant_tb_level(tb):
+        #     tb = tb.tb_next
+
+        if exctype is test.failureException:
+            # Skip assert*() traceback levels
+            # length = self._count_relevant_tb_levels(tb)
+            msg_lines = traceback.format_exception(exctype, value, tb)
+        else:
+            msg_lines = traceback.format_exception(exctype, value, tb)
+
+        if self.buffer:
+            # Only try to get sys.stderr as it might not be
+            # StringIO yet, e.g. when test fails during __call__
+            try:
+                error = sys.stderr.getvalue()
+            except AttributeError:
+                error = None
+            if error:
+                if not error.endswith('\n'):
+                    error += '\n'
+                msg_lines.append(error)
+        # This is the extra magic to make sure all lines are str
+        encoding = getattr(sys.stdout, 'encoding', 'utf-8')
+        lines = []
+        for line in msg_lines:
+            if not isinstance(line, str):
+                # utf8 shouldn't be hard-coded, but not sure f
+                line = line.encode(encoding)
+            lines.append(line)
+
+        return ''.join(lines)
diff --git a/tests/reporter/runner.py b/tests/reporter/runner.py
new file mode 100644
index 0000000..89a3f8f
--- /dev/null
+++ b/tests/reporter/runner.py
@@ -0,0 +1,119 @@
+import sys
+import time
+from datetime import datetime
+
+from unittest import TextTestRunner
+from .result import HtmlTestResult
+
+UTF8 = "UTF-8"
+
+
+class HTMLTestRunner(TextTestRunner):
+    """" A test runner class that output the results. """
+
+    time_format = "%Y-%m-%d_%H-%M-%S"
+
+    def __init__(self, output="./reports/", verbosity=2, stream=sys.stderr,
+                 descriptions=True, failfast=False, buffer=False,
+                 report_title=None, report_name=None, template=None, resultclass=None,
+                 add_timestamp=True, open_in_browser=False,
+                 combine_reports=False, template_args=None):
+        self.verbosity = verbosity
+        self.output = output
+        self.encoding = UTF8
+
+        TextTestRunner.__init__(self, stream, descriptions, verbosity,
+                                failfast=failfast, buffer=buffer)
+
+        if add_timestamp:
+            self.timestamp = time.strftime(self.time_format)
+        else:
+            self.timestamp = ""
+
+        if resultclass is None:
+            self.resultclass = HtmlTestResult
+        else:
+            self.resultclass = resultclass
+
+        if template_args is not None and not isinstance(template_args, dict):
+            raise ValueError("template_args must be a dict-like.")
+        self.template_args = template_args or {}
+
+        self.report_title = report_title or "Unittest Results"
+        self.report_name = report_name
+        self.template = template
+
+        self.open_in_browser = open_in_browser
+        self.combine_reports = combine_reports
+
+        self.start_time = 0
+        self.time_taken = 0
+
+    def _make_result(self):
+        """ Create a TestResult object which will be used to store
+        information about the executed tests. """
+        return self.resultclass(self.stream, self.descriptions, self.verbosity)
+
+    def run(self, test):
+        """ Runs the given testcase or testsuite. """
+        try:
+
+            result = self._make_result()
+            result.failfast = self.failfast
+            if hasattr(test, 'properties'):
+                # junit testsuite properties
+                result.properties = test.properties
+
+            self.stream.writeln()
+            self.stream.writeln("Running tests... ")
+            self.stream.writeln(result.separator2)
+
+            self.start_time = datetime.now()
+            test(result)
+            stop_time = datetime.now()
+            self.time_taken = stop_time - self.start_time
+
+            result.printErrors()
+            self.stream.writeln(result.separator2)
+            run = result.testsRun
+            self.stream.writeln("Ran {} test{} in {}".format(run,
+                                run != 1 and "s" or "", str(self.time_taken)[:7]))
+            self.stream.writeln()
+
+            expectedFails = len(result.expectedFailures)
+            unexpectedSuccesses = len(result.unexpectedSuccesses)
+            skipped = len(result.skipped)
+
+            infos = []
+            if not result.wasSuccessful():
+                self.stream.writeln("FAILED")
+                failed, errors = map(len, (result.failures, result.errors))
+                if failed:
+                    infos.append("Failures={0}".format(failed))
+                if errors:
+                    infos.append("Errors={0}".format(errors))
+            else:
+                self.stream.writeln("OK")
+
+            if skipped:
+                infos.append("Skipped={}".format(skipped))
+            if expectedFails:
+                infos.append("Expected Failures={}".format(expectedFails))
+            if unexpectedSuccesses:
+                infos.append("Unexpected Successes={}".format(unexpectedSuccesses))
+
+            if infos:
+                self.stream.writeln(" ({})".format(", ".join(infos)))
+            else:
+                self.stream.writeln("\n")
+
+            self.stream.writeln()
+            self.stream.writeln('Generating HTML reports... ')
+            result.generate_reports(self)
+            if self.open_in_browser:
+                import webbrowser
+                for report in result.report_files:
+                    webbrowser.open_new_tab('file://' + report)
+        finally:
+            pass
+        return result
diff --git a/tests/reporter/template/report_template.html b/tests/reporter/template/report_template.html
new file mode 100644
index 0000000..f1b8f89
--- /dev/null
+++ b/tests/reporter/template/report_template.html
@@ -0,0 +1,192 @@
+
+
+
+    {{ title }}
+    
+    
+    
+    
+
+
+    
+
+
+

{{ title }}

+
+

Python Version {{ header_info.python_version }}

+

Start Time: {{ header_info.start_time.strftime("%Y-%m-%d %H:%M:%S") }}

+

Duration: {{ header_info.status.duration }}

+

Summary: Total: {{ header_info.status.total }}, Pass: {{ header_info.status.success }}{% if header_info.status.failure %}, Fail: {{ header_info.status.failure }}{% endif %}{% if header_info.status.error %}, Error: {{ header_info.status.error }}{% endif %}{% if header_info.status.skip %}, Skip: {{ header_info.status.skip }}{% endif %}

+
+
+
+ {%- for test_case_name, tests_results in all_results.items() %} + {%- if tests_results %} +
+
+ + + + + + + + + + {%- for test_case in tests_results %} + {%- if not test_case.subtests is defined %} + + + + + + {%- if not (test_case.stdout or test_case.err or test_case.err) %} + + + + {%- endif %} + {%- if (test_case.stdout or test_case.err or test_case.err) and test_case.outcome != test_case.SKIP %} + + + + {%- endif %} + {%- if (test_case.stdout or test_case.err or test_case.err) and test_case.outcome == test_case.SKIP %} + + + + {%- endif %} + {%- else %} + + + + + + {%- if test_case.subtests %} + + + + {%- endif %} + {%- endif %} + {%- endfor %} + + + + +
{{ test_case_name }}Status
{{ test_case.test_id.split(".")[-1] }} + + {%- if test_case.outcome == test_case.SUCCESS -%} + Pass + {%- elif test_case.outcome == test_case.SKIP -%} + Skip + {%- elif test_case.outcome == test_case.FAILURE -%} + Fail + {%- else -%} + Error + {%- endif -%} + + + {%- if (test_case.stdout or test_case.err) %} + + {%- endif %} + {%- if not (test_case.stdout or test_case.err or test_case.err) %} + + {%- endif %} +
+

{{ test_case.kiutils_description }}

+
+

{{ test_case.kiutils_description }}

+ {%- if test_case.stdout %}

{{ test_case.stdout }}

{% endif %} + {%- if test_case.err %}

{{ test_case.err[0].__name__ }}: {{ test_case.err[1] }}

{% endif %} + {%- if test_case.err %}

{{ test_case.test_exception_info }}

{% endif %} +
Expected (left) vs produced (right):
+
{{ test_case.diff|safe }}
+
+ {%- if test_case.stdout %}

{{ test_case.stdout }}

{% endif %} + {%- if test_case.err %}

{{ test_case.err }}

{% endif %} +
{{ test_case.test_id.split(".")[-1] }} + + {%- if test_case.outcome == test_case.SUCCESS -%} + Pass + {%- else -%} + Fail + {%- endif -%} + + + {%- if test_case.subtests %} + + {%- endif %} +
+ + + + {%- for subtest in test_case.subtests %} + + + + + + {%- if subtest.err or subtest.err %} + + + + {%- endif %} + {% endfor %} + +
{{ subtest.test_id.split(".")[-1] }} + + {%- if subtest.outcome == subtest.SUCCESS -%} + Pass + {%- else -%} + Fail + {%- endif -%} + + + {%- if subtest.err %} + + {%- endif %} +
+ {%- if subtest.err %}

{{ subtest.err[0].__name__ }}: {{ subtest.err[1] }}

{% endif %} + {%- if subtest.err %}

{{ subtest.test_exception_info }}

{% endif %} +
+
+ Total: {{ summaries[test_case_name].total }}, Pass: {{ summaries[test_case_name].success }}{% if summaries[test_case_name].failure %}, Fail: {{ summaries[test_case_name].failure }}{% endif %}{% if summaries[test_case_name].error %}, Error: {{ summaries[test_case_name].error }}{% endif %}{% if summaries[test_case_name].skip %}, Skip: {{ summaries[test_case_name].skip }}{% endif %} -- Duration: {{ summaries[test_case_name].duration }} +
+
+
+ {%- endif %} + {%- endfor %} +
+ + + + None: +# prepare_test(self) +# return super().setUp() diff --git a/tests/test_board.py b/tests/test_board.py new file mode 100644 index 0000000..94dfb63 --- /dev/null +++ b/tests/test_board.py @@ -0,0 +1,151 @@ +"""Unittests of board related classes + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path +from kiutils.footprint import Attributes + +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.board import Board + +BOARD_BASE = path.join(TEST_BASE, 'board') + +class Tests_Board(unittest.TestCase): + """Test cases for Boards""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_boardTraceArcs(self): + """Tests the parser's handling of traces with arcs""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardTraceArcs') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_boardStackup32LayerDielectricsVias(self): + """Tests the parsing of a board with 32 layers, all different dielectric layers and all + available via combinations""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardStackup32LayerDielectricsVias') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_boardWithAllPrimitives(self): + """Tests the parsing of a board containting all primitives (traces, texts, forms, dimensions, + markers, polygons, etc)""" + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_boardWithAllPrimitives') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_allFpManufacturingAttributes(self): + """Tests the parsing of a board with footprints that feature all combinations of + manufacturing attributes. Tests all possible combinations of the following: +
    +
  • Board Only: True / False
  • +
  • Exclude from BOM: True / False
  • +
  • excludeFromPosFiles: True / False
  • +
  • Type: SMD, THT, Other
  • +
+ + Furthermore tests if the Attributes() object of a footprint is correctly created even + when the parsed footprint has no (attr ...) token in its S-Expression.""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_allFpManufacturingAttributes') + board = Board().from_file(self.testData.pathToTestFile) + + # Test parsing + self.assertTrue(to_file_and_compare(board, self.testData)) + + # Test that attributes object is created, even when an empty attribute list is present in + # parsed footprint + attr = Attributes(boardOnly=False, excludeFromBom=False, excludeFromPosFiles=False, type=None) + self.assertEqual(attr, board.footprints[11].attributes, + msg="Parsing of footprint without `attr` field does not yield expected Attributes() object") + + def test_createEmptyBoard(self): + """Tests the behavior when creating an empty board""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_createEmptyBoard') + board = Board().create_new() + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_footprintPadNewLines(self): + """Renames the libId token (setting and unsetting) of footprints on a board""" + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_renameFootprintIdToken') + board = Board().from_file(self.testData.pathToTestFile) + board.footprints[0].libId = "I_was_renamed:BUS_PCIexpress_x1" + board.footprints[1].libId = "I_was_added:BUS_PCIexpress_x1" + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_pcbPlotParams(self): + """Tests the parsing of board plot params""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_pcbPlotParams') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_zoneOnOuterLayersOnly(self): + """Tests the parsing of a zone that is only on the outer board layers (F.Cu and B.Cu). + Regression test for bug in PR #89.""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_zoneOnOuterLayersOnly') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_zoneOnAllLayersWildcard(self): + """Tests the parsing of a zone that is present on all copper layers in this form: "*.Cu" + Regression test for bug in PR #114.""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'test_zoneOnAllLayersWildcard') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + +class Tests_Board_Since_V7(unittest.TestCase): + """Test cases for Boards since KiCad 7""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_textBoxAllVariants(self): + """Tests all variants of the ``text_box`` token for text boxes in PCBs""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textBoxAllVariants') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_imageWithLayerToken(self): + """Tests the new ``layer`` token for images in PCBs""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_imageWithLayerToken') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_pcbPlotParams(self): + """Tests the parsing of board plot params since KiCad v7""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_pcbPlotParams') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_textsWithRenderCaches(self): + """Tests text elements with the ``render_cache`` token""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textsWithRenderCaches') + board = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(board, self.testData)) + + def test_testKnockout(self): + """Tests the ``knockout`` token of a graphical text""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(BOARD_BASE, 'since_v7', 'test_textKnockout') + footprint = Board().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) diff --git a/tests/test_designrules.py b/tests/test_designrules.py new file mode 100644 index 0000000..27a7bdf --- /dev/null +++ b/tests/test_designrules.py @@ -0,0 +1,51 @@ +"""Unittests of design-rules related classes + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path + +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.dru import DesignRules + +DESIGNRULE_BASE = path.join(TEST_BASE, 'designrules') + +class Tests_DesignRules(unittest.TestCase): + """Test cases for Design Rules""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_allDesignRuleItems(self): + """Tests the parsing of all available design rule items""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'test_allDesignRuleItems') + dru = DesignRules.from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(dru, self.testData)) + + def test_createNewDesignRules(self): + """Tests the ``create_new()`` function to create a new set of design rules""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'test_createNewDesignRules') + dru = DesignRules.create_new() + self.assertTrue(to_file_and_compare(dru, self.testData)) + +class Tests_DesignRules_Since_V7(unittest.TestCase): + """Test cases for Design Rules since KiCad v7""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_severityToken(self): + """Tests the parsing the new severity token""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(DESIGNRULE_BASE, 'since_v7', 'test_severityToken') + dru = DesignRules.from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(dru, self.testData)) diff --git a/tests/test_footprint.py b/tests/test_footprint.py new file mode 100644 index 0000000..56244fc --- /dev/null +++ b/tests/test_footprint.py @@ -0,0 +1,183 @@ +"""Unittests of footprint related classes + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path + +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.footprint import Footprint + +FOOTPRINT_BASE = path.join(TEST_BASE, 'footprint') + +class Tests_Footprint_Legacy(unittest.TestCase): + """Test cases for Footprints from legacy KiCad versions (<= 5)""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_moduleNameOnlyNumbers(self): + """Constraints the behavior of legacy footprint names that are only numbers. As they are not + quoted strings, our parser does parse them as numbers. The behavior was changed in PR #91 + to convert numbers back to strings when exporting to S-Expression""" + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'legacy', 'test_moduleNameOnlyNumbers') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + +class Tests_Footprint(unittest.TestCase): + """Test cases for Footprints""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_allFootprintItems(self): + """Tests the parsing of all available footprint items""" + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_allFootprintItems') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_footprintPadNewLines(self): + """Tests the ability of the parser to create the correct new-line breaks when using + exotic footprint pad combinations""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_footprintPadNewLines') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_footprintEmptyAttributes(self): + """Tests the correct parsing of a footprint with empty ``Attributes`` field + +

Note: Some earlier versions of KiCad seemed to include the ``(attr ..)`` token in footprints even + when no attributes are set (or when using standard attributes). This test includes an empty + attribute token in the footprint and expects it to be gone after parsing.

+ """ + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_footprintEmptyAttributes') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_createNewFootprintTypeSMD(self): + """Tests the ``create_new()`` function to create a new footprint with the type ``smd``""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeSMD') + + # Create footprint with correct type + footprint = Footprint().create_new( + type = 'smd', + library_id = 'empty-footprint-smd', + value = 'empty-footprint-smd' + ) + + # Set timestamps to be the same as in the expected test output + footprint.tedit = '6328915F' + + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_createNewFootprintTypeTHT(self): + """Tests the ``create_new()`` function to create a new footprint with the type ``through_hole``""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeTHT') + + # Create footprint with correct type + footprint = Footprint().create_new( + type = 'through_hole', + library_id = 'empty-footprint-through_hole', + value = 'empty-footprint-through_hole' + ) + + # Set timestamps to be the same as in the expected test output + footprint.tedit = '63289145' + + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_createNewFootprintTypeOther(self): + """Tests the ``create_new()`` function to create a new footprint with the type ``other``""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_createNewFootprintTypeOther') + + # Create footprint with correct type + footprint = Footprint().create_new( + type = 'other', + library_id = 'empty-footprint-other', + value = 'empty-footprint-other' + ) + # Set timestamps to be the same as in the expected test output + footprint.tedit = '6328916A' + + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_3dModelHideProperty(self): + """Tests the 3d model hide property (see issue #96)""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'test_3dModelHideProperty') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + +class Tests_Footprint_Since_V7(unittest.TestCase): + """Test cases for Footprints since KiCad 7""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_textBoxAllVariants(self): + """Tests all variants of the ``text_box`` token for text boxes in footprints""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textBoxAllVariants') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_imageWithLayerToken(self): + """Tests the new ``layer`` token for images in footprints""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_imageWithLayerToken') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_textsWithRenderCaches(self): + """Tests text elements with the ``render_cache`` token""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textsWithRenderCaches') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_exemptFromCourtyardToken(self): + """Tests the ``allow_missing_courtyard`` token""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_exemptFromCourtyardToken') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_3dModelOpacityToken(self): + """Tests the ``opacity`` token of a 3d-model""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_3dModelOpacityToken') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_privateLayersToken(self): + """Tests the ``private_layers`` token of a footprint""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_privateLayersToken') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_netTiePadGroups(self): + """Tests the ``net_tie_pad_groups`` token of a footprint""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_netTiePadGroups') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) + + def test_testKnockout(self): + """Tests the ``knockout`` token of a footprint text""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(FOOTPRINT_BASE, 'since_v7', 'test_textKnockout') + footprint = Footprint().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(footprint, self.testData)) diff --git a/tests/test_libtable.py b/tests/test_libtable.py new file mode 100644 index 0000000..b21df39 --- /dev/null +++ b/tests/test_libtable.py @@ -0,0 +1,65 @@ +"""Unittests of library table related classes + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path + +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.libraries import LibTable, Library + +LIBTABLE_BASE = path.join(TEST_BASE, 'libtable') + +class Tests_LibTable(unittest.TestCase): + """Test cases for library tables""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_parseFpLibTable(self): + """Tests the correct parsing of an example `fp-lib-table`""" + self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_parseFpLibTable') + libtable = LibTable().from_file(f'{self.testData.pathToTestFile}.expected') + self.assertTrue(to_file_and_compare(libtable, self.testData)) + + def test_parseSymLibTable(self): + """Tests the correct parsing of an example `sym-lib-table`""" + self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_parseSymLibTable') + libtable = LibTable().from_file(f'{self.testData.pathToTestFile}.expected') + self.assertTrue(to_file_and_compare(libtable, self.testData)) + + def test_addLibraryObjectToLibTable(self): + """Tests adding a library object to a library table""" + self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_addLibraryObjectToLibTable') + libtable = LibTable(type='fp_lib_table') + libtable.libs.append(Library( + name = 'object1', + type = "KiCad", + uri = '${KIPRJMOD}/my/library.pretty', + options = 'Some options with "quoted strings"', + description = 'Some description with "quoted strings"', + active = False + )) + self.assertTrue(to_file_and_compare(libtable, self.testData)) + + def test_addEmptyLibraryObjectToLibTable(self): + """Tests adding an empty library object to a library table""" + self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_addEmptyLibraryObjectToLibTable') + libtable = LibTable(type='fp_lib_table') + libtable.libs.append(Library()) + self.assertTrue(to_file_and_compare(libtable, self.testData)) + + def test_createNewLibTable(self): + """Tests the ``create_new()`` function to create a new library table""" + self.testData.compareToTestFile = True + self.testData.pathToTestFile = path.join(LIBTABLE_BASE, 'test_createNewLibTable') + libtable = LibTable.create_new() + self.assertTrue(to_file_and_compare(libtable, self.testData)) + + # TODO: Tests with invalid type token \ No newline at end of file diff --git a/tests/test_misc.py b/tests/test_misc.py new file mode 100644 index 0000000..21904a4 --- /dev/null +++ b/tests/test_misc.py @@ -0,0 +1,35 @@ +"""Unittests for misc stuff + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path +from kiutils.schematic import Schematic + +from tests.testfunctions import to_file_and_compare, prepare_test, TEST_BASE + +MISC_BASE = path.join(TEST_BASE, 'misc') + +class Tests_Misc(unittest.TestCase): + """Misc test cases""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_quotesAndBackslashInSexpr(self): + """Tests the correct parsing of all variants of quoted strings as well as of backslashes + in said strings. + + Related issues: + - [Pull request 73](https://github.com/mvnmgrx/kiutils/pull/73) + """ + self.testData.pathToTestFile = path.join(MISC_BASE, 'test_quotesAndBackslashInSexpr') + self.testData.compareToTestFile = True + libtable = Schematic().from_file(self.testData.pathToTestFile) + self.assertTrue(to_file_and_compare(libtable, self.testData)) diff --git a/tests/test_schematic.py b/tests/test_schematic.py new file mode 100644 index 0000000..24cdea6 --- /dev/null +++ b/tests/test_schematic.py @@ -0,0 +1,210 @@ +"""Unittests of schematic related classes + +Authors: + (C) Marvin Mager - @mvnmgrx - 2022 + +License identifier: + GPL-3.0 +""" + +import unittest +from os import path +from kiutils.items.schitems import HierarchicalSheetInstance + +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.schematic import Schematic +from kiutils.items.common import Property + +SCHEMATIC_BASE = path.join(TEST_BASE, 'schematic') + +class Tests_Schematic(unittest.TestCase): + """Test cases for Schematics""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_addPropertyToSchematicSymbol(self): + """Adds a new property to an already existing symbol in the schematic and verifies the + correct initial values for the Property() class.""" + self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_addPropertyToSchematicSymbol') + schematic = Schematic().from_file(self.testData.pathToTestFile) + schematic.schematicSymbols[0].properties.append( + Property(key='Property3', value='I was added from "outside" of KiCad', id=6) + ) + self.assertTrue(to_file_and_compare(schematic, self.testData)) + + def test_createEmptySchematic(self): + """Tests that an empty schematic generates S-Expression as expected from KiCad + + Note: This test currently disregards an empty ``(symbol_instances)`` token as it seems that this + only exists when empty KiCad schematics are created. This is what should be expected for + empty schematics: + +

+        (kicad_sch (version 20211123) (generator kicad-python-tools)
+            (paper "A4")
+            (lib_symbols)
+            (symbol_instances)
+        )
+        """
+        schematic = Schematic.create_new()
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_createEmptySchematic')
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_schematicWithAllPrimitives(self):
+        """Tests the parsing of a schematic with all primitives (lines, traces, busses, connections,
+        images, etc)"""
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_schematicWithAllPrimitives')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_hierarchicalSchematicWithAllPrimitives(self):
+        """Tests the parsing of a hierarchical schematic with all primitives (lines, traces, busses,
+        connections, images, etc)"""
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_hierarchicalSchematicWithAllPrimitives')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_renameSymbolIdTokenInSchematic(self):
+        """Tests if renaming (setting and unsetting) schematic symbols as well as normal symbols 
+        using their ID token works as expected. Checks that the ``Value`` property does not change."""
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_renameSymbolIdTokenInSchematic')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        schematic.libSymbols[0].libId = "RenamedSwitch:SW_Coded_New"        # Setting library nickname
+        schematic.libSymbols[1].libId = "Unset_Lib_Id"                      # Unsetting library nickname
+        schematic.schematicSymbols[0].libId = "SwitchRenamed:SW_Coded_2"    # Setting library nickname
+        schematic.schematicSymbols[1].libId = "Unset_Lib_Id"                # Unsetting library nickname
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_setSymbolLibNameToken(self):
+        """Tests if setting and unsetting the lib_name token generates the correct S-Expression"""
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_setSymbolLibNameToken')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        schematic.schematicSymbols[0].libName = f"{schematic.schematicSymbols[0].entryName}_1"
+        schematic.schematicSymbols[1].libName = None
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_parseStrokeTokens(self):
+        """Tests the correct parsing of the Stroke token (with and without the color token)
+         
+        See:
+            https://github.com/mvnmgrx/kiutils/pull/57
+        """
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'test_parseStrokeTokens')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+class Tests_Schematic_Since_V7(unittest.TestCase):
+    """Schematic related test cases since KiCad 7"""
+
+    def setUp(self) -> None:
+        prepare_test(self)
+        return super().setUp()
+
+    def test_textBoxAllVariants(self):
+        """Tests all variants of the ``text_box`` token for text boxes in schematics"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_textBoxAllVariants')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_rectangleAllVariants(self):
+        """Tests all variants of the ``rectangle`` token for rectangles in schematics"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_rectangleAllVariants')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_circleAllVariants(self):
+        """Tests all variants of the ``circle`` token for circles in schematics"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_circleAllVariants')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_arcAllVariants(self):
+        """Tests all variants of the ``arc`` token for arcs in schematics"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_arcAllVariants')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_schematicWithAllPrimitives(self):
+        """Tests the parsing of a schematic with all primitives (lines, traces, busses, connections,
+        images, etc) for KiCad 7"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_schematicWithAllPrimitives')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_netclassFlags(self):
+        """Tests the parsing netclass flags for KiCad 7"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_netclassFlags')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_symbolPinOptionalTokens(self):
+        """Tests the parsing of the optional name and number effects on symbol pins since KiCad v7.
+        Came up in PR #73."""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_symbolPinOptionalTokens')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_strokeOptionalTokens(self):
+        """Tests the parsing of the optional tokens on strokes since KiCad v7.
+        Came up in PR #73."""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_strokeOptionalTokens')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_busAliases(self):
+        """Tests the parsing of bus aliases since KiCad v7.
+        Came up in PR #92."""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_busAliases')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_sheetProperties(self):
+        """Tests the parsing of sheet file properties since KiCad v7.
+        Came up in PR #106."""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_sheetProperties')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
+
+    def test_specialLibIdWithMultipleUnderscoresAndNumbers(self):
+        """Tests special library IDs with multiple underscores and numbers. Came up in PR #112"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SCHEMATIC_BASE, 'since_v7', 'test_specialLibIdWithMultipleUnderscoresAndNumbers')
+        schematic = Schematic().from_file(self.testData.pathToTestFile)
+        self.assertTrue(schematic.libSymbols[0].entryName == "Filter_EMI_LLL_162534")
+        self.assertTrue(schematic.libSymbols[0].libraryNickname == "Device")
+        self.assertTrue(schematic.libSymbols[0].libId == "Device:Filter_EMI_LLL_162534")
+        self.assertTrue(schematic.libSymbols[0].units[0].entryName == "Filter_EMI_LLL_162534")
+        self.assertTrue(schematic.libSymbols[0].units[0].unitId == 0)
+        self.assertTrue(schematic.libSymbols[0].units[0].styleId == 1)
+        self.assertTrue(schematic.libSymbols[0].units[0].libId == "Filter_EMI_LLL_162534_0_1")
+        self.assertTrue(schematic.libSymbols[0].units[1].entryName == "Filter_EMI_LLL_162534")
+        self.assertTrue(schematic.libSymbols[0].units[1].unitId == 1)
+        self.assertTrue(schematic.libSymbols[0].units[1].styleId == 1)
+        self.assertTrue(schematic.libSymbols[0].units[1].libId == "Filter_EMI_LLL_162534_1_1")
+        
+        self.assertTrue(schematic.libSymbols[1].entryName == "Filter_EMI_LLL_162534_1")
+        self.assertTrue(schematic.libSymbols[1].libraryNickname is None)
+        self.assertTrue(schematic.libSymbols[1].libId == "Filter_EMI_LLL_162534_1")
+        self.assertTrue(schematic.libSymbols[1].units[0].entryName == "Filter_EMI_LLL_162534_1")
+        self.assertTrue(schematic.libSymbols[1].units[0].unitId == 0)
+        self.assertTrue(schematic.libSymbols[1].units[0].styleId == 1)
+        self.assertTrue(schematic.libSymbols[1].units[0].libId == "Filter_EMI_LLL_162534_1_0_1")
+        self.assertTrue(schematic.libSymbols[1].units[1].entryName == "Filter_EMI_LLL_162534_1")
+        self.assertTrue(schematic.libSymbols[1].units[1].unitId == 1)
+        self.assertTrue(schematic.libSymbols[1].units[1].styleId == 1)
+        self.assertTrue(schematic.libSymbols[1].units[1].libId == "Filter_EMI_LLL_162534_1_1_1")
+
+        self.assertTrue(to_file_and_compare(schematic, self.testData))
diff --git a/tests/test_symbol.py b/tests/test_symbol.py
new file mode 100644
index 0000000..44b0a66
--- /dev/null
+++ b/tests/test_symbol.py
@@ -0,0 +1,169 @@
+"""Unittests of library symbol related classes
+
+Authors:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+
+import unittest
+from os import path
+
+from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE
+from kiutils.symbol import SymbolLib, Symbol
+from kiutils.misc.config import KIUTILS_CREATE_NEW_VERSION_STR
+from kiutils.utils.sexpr import parse_sexp
+
+SYMBOL_BASE = path.join(TEST_BASE, 'symbol')
+
+class Tests_Symbol(unittest.TestCase):
+    """Test cases for Symbols"""
+
+    def setUp(self) -> None:
+        prepare_test(self)
+        return super().setUp()
+
+    def test_allSymbolPinVariations(self):
+        """Tests the parsing of all pin types of a symbol in a symbol library"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_allSymbolPinVariations')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_allSymbolAlternatePins(self):
+        """Tests the parsing of all alternate pin definitions of a symbol in a symbol library"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_allSymbolAlternatePins')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_symbolParameters(self):
+        """Tests the parsing of a symbol's parameters in a symbol library"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolParameters')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_symbolDemorganUnits(self):
+        """Tests the parsing of a symbol's de-morgan unit represenations in a symbol library"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolDemorganUnits')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_symbolDemorganSyItems(self):
+        """Tests the parsing of a symbol' in a symbol library that has all SyItems in different
+        de-morgan variations in it"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolDemorganSyItems')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_bigSymbolLibrary(self):
+        """Tests the parsing of a big symbol library with many symbols of different kinds in it"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_bigSymbolLibrary')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_createNewSymbolInEmptyLibrary(self):
+        """Tests the ``create_new()`` function to create an empty symbol that is added to a
+        symbol library"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_createNewSymbolInEmptyLibrary')
+
+        # Create an empty symbol library
+        symbolLib = SymbolLib(
+            version = KIUTILS_CREATE_NEW_VERSION_STR,
+            generator = 'kiutils'
+        )
+
+        # Add a symbol to it via create_new()
+        symbol = Symbol().create_new(
+            id = 'testsymbol',
+            reference = 'U',
+            value = 'testvalue'
+        )
+        symbolLib.symbols.append(symbol)
+
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_renameParentIdUsingIdToken(self):
+        """Rename symbol inside library using the id token setter and verify all units are renamed
+        correctly as well as the ``Value`` property stayed the same."""
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_renameParentIdUsingIdToken')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        symbolLib.symbols[0].libId = 'ExampleLibrary:AD2023'    # Setting library nickname
+        symbolLib.symbols[1].libId = 'AD2023'                   # Unsetting library nickname
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_createNewTopLevelSymbolFromChild(self):
+        """Take a child symbol, rename its library id and make a new top-level symbol out of it.
+        Tests if resetting both ``unitId`` and ``styleId`` works."""
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_createNewTopLevelSymbolFromChild')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+
+        # Copy the symbol
+        childSymbol = Symbol.from_sexpr(parse_sexp(symbolLib.symbols[0].units[0].to_sexpr()))
+
+        # Rename it and save it as a new top-level symbol to the library
+        childSymbol.libId = "SomeNewName:AD2023"
+        symbolLib.symbols.append(childSymbol)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_mergeLibraries(self):
+        """Merge the symbols of two symbol libraries together"""
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_mergeLibraries')
+        symbolLib1 = SymbolLib().from_file(self.testData.pathToTestFile)
+        symbolLib2 = SymbolLib().from_file(path.join(SYMBOL_BASE, 'test_symbolDemorganSyItems'))
+        for symbol in symbolLib2.symbols:
+            symbolLib1.symbols.insert(0, symbol)
+        self.assertTrue(to_file_and_compare(symbolLib1, self.testData))
+
+    def test_symbolIdParser(self):
+        """Tests edge cases of parsing the symbol ID token and checks if the ID was split into
+        its parts correctly
+
+        Related issues:
+            - [Pull request 73](https://github.com/mvnmgrx/kiutils/pull/73)
+        """
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'test_symbolIdParser')
+        self.testData.compareToTestFile = True
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+class Tests_Symbol_Since_V7(unittest.TestCase):
+    """Test cases for Symbols since KiCad 7"""
+
+    def setUp(self) -> None:
+        prepare_test(self)
+        return super().setUp()
+
+    def test_textBoxAllVariants(self):
+        """Tests all variants of the ``text_box`` token for text boxes in symbols"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_textBoxAllVariants')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_rectangleAllVariants(self):
+        """Tests all variants of the ``rectangle`` token for rectangles in symbols"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_rectangleAllVariants')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_circleAllVariants(self):
+        """Tests all variants of the ``circle`` token for circles in symbols"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_circleAllVariants')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
+
+    def test_arcAllVariants(self):
+        """Tests all variants of the ``arc`` token for arcs in symbols"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(SYMBOL_BASE, 'since_v7', 'test_arcAllVariants')
+        symbolLib = SymbolLib().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(symbolLib, self.testData))
\ No newline at end of file
diff --git a/tests/test_worksheets.py b/tests/test_worksheets.py
new file mode 100644
index 0000000..4eadfbe
--- /dev/null
+++ b/tests/test_worksheets.py
@@ -0,0 +1,37 @@
+"""Unittests of worksheet related classes
+
+Authors:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+
+import unittest
+from os import path
+
+from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE
+from kiutils.wks import WorkSheet
+
+WORKSHEET_BASE = path.join(TEST_BASE, 'worksheets')
+
+class Tests_WorkSheets(unittest.TestCase):
+    """Test cases for Worksheets"""
+
+    def setUp(self) -> None:
+        prepare_test(self)
+        return super().setUp()
+
+    def test_allWorkSheetItems(self):
+        """Tests the parsing of all available worksheet items"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(WORKSHEET_BASE, 'test_allWorkSheetItems')
+        wks = WorkSheet().from_file(self.testData.pathToTestFile)
+        self.assertTrue(to_file_and_compare(wks, self.testData))
+
+    def test_createNewWorksheet(self):
+        """Tests the ``create_new()`` function to create a new empty worksheet"""
+        self.testData.compareToTestFile = True
+        self.testData.pathToTestFile = path.join(WORKSHEET_BASE, 'test_createNewWorksheet')
+        wks = WorkSheet.create_new()
+        self.assertTrue(to_file_and_compare(wks, self.testData))
diff --git a/tests/testdata/board/since_v7/test_imageWithLayerToken b/tests/testdata/board/since_v7/test_imageWithLayerToken
new file mode 100644
index 0000000..05fa6f9
--- /dev/null
+++ b/tests/testdata/board/since_v7/test_imageWithLayerToken
@@ -0,0 +1,28 @@
+(kicad_pcb (version 20221018) (generator kiutils)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (image (at 203.2 99.06) (layer "F.Cu") (scale 7.875)
+    (data
+      iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAA3NCSVQICAjb4U/gAAAACXBIWXMA
+      AA50AAAOdAFrJLPWAAAA9ElEQVRIiWP88OEDA20AE43MHbJGs+CX1pp4hUiDruXroIkMzQAZmkYT
+      iEZMIMHDWmEvaS3P8/33v1NPvvYfffH002+sKhnx50a0FCLBw7o+WoWfg5kYR5Dm6go7SX4O5kuX
+      Li1atIiRkTEuLk5XV5c6Rlsr8DAwMCxevBji14kTJ8Kl5syZg6aYXtFIMO+dePTFWZkvLi5u0aJF
+      DAwM8fHxOjromRAOUKKRoNGKguzLw5X42GkQjfff/wxYcqfcTsJanvf777+nnnydcOwlJPFhliEk
+      p+sXX34XbntMjMqhmdFHjaaf0QRKPkrA0AyQUaPRAACmk1AZ+UHU4QAAAABJRU5ErkJggg==
+    )
+  )
+
+)
diff --git a/tests/testdata/board/since_v7/test_pcbPlotParams b/tests/testdata/board/since_v7/test_pcbPlotParams
new file mode 100644
index 0000000..fa053a5
--- /dev/null
+++ b/tests/testdata/board/since_v7/test_pcbPlotParams
@@ -0,0 +1,52 @@
+(kicad_pcb (version 20211014) (generator kiutils)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+    (pcbplotparams
+      (layerselection 0x7ffffff_ffffffff)
+      (plot_on_all_layers_selection 0x7ffff00_00000000)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes false)
+      (usegerberadvancedattributes false)
+      (creategerberjobfile false)
+      (dashed_line_dash_ratio 12.000000)
+      (dashed_line_gap_ratio 3.000000)
+      (svgprecision 4)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 15.000000)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference false)
+      (plotvalue false)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 1)
+      (mirror false)
+      (drillshape 0)
+      (scaleselection 1)
+      (outputdirectory "")
+    )
+  )
+
+  (net 0 "")
+
+)
diff --git a/tests/testdata/board/since_v7/test_textBoxAllVariants b/tests/testdata/board/since_v7/test_textBoxAllVariants
new file mode 100644
index 0000000..ff31cc5
--- /dev/null
+++ b/tests/testdata/board/since_v7/test_textBoxAllVariants
@@ -0,0 +1,306 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (gr_text "Orientation" (at 86.36 25.4) (layer "F.Cu") (uuid 2aef365d-026c-4e7b-8a1a-69e289eb35f3)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+  (gr_text "Alignment" (at 50.8 25.4) (layer "F.Cu") (uuid 35bc1f07-99ef-4b1e-8c5b-e35d7575308c)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+  (gr_text "Reverse" (at 68.58 25.4) (layer "F.Cu") (uuid a35cd807-1b9d-4d28-85af-0710e5504aa3)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+  (gr_text "Different Font" (at 104.14 25.4) (layer "F.Cu") (uuid abe4ed03-98ee-40a1-82aa-1a59f442b08b)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+  (gr_text "Style" (at 33.02 25.4) (layer "F.Cu") (uuid b4ff3bb7-20b9-457f-bcb7-b8bac0425071)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 139.7) (end 83.82 147.32) (layer "F.Cu") (uuid 193f87d0-d2db-4b7a-a5d8-dcd57b541ed3)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify right top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 88.9) (end 83.82 96.52) (layer "F.Cu") (uuid 1f0995e7-62e9-48c8-89ae-7285298cab3a)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify left top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 48.26) (end 83.82 55.88) (layer "F.Cu") (uuid 3d243660-c71c-4ff1-b30f-0c0b4bb46e90)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify right top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 129.54) (end 83.82 137.16) (layer "F.Cu") (uuid 3fb87bbd-6f08-4d18-b592-eb728ce7438e)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 78.74) (end 66.04 86.36) (layer "F.Cu") (uuid 3ffe0af5-c0af-4bed-81f1-503911a91b39)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify right top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 129.54) (end 48.26 137.16) (layer "F.Cu") (uuid 4a32eeb2-a229-45dc-89cc-dcd231d8a98a)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 27.94) (end 83.82 35.56) (layer "F.Cu") (uuid 582c3c7b-aed3-47c2-ba88-2bdb10313198)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 119.38) (end 48.26 127) (layer "F.Cu") (uuid 5ca60f61-1883-469d-b156-c888bc8e6956)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 68.58) (end 66.04 76.2) (layer "F.Cu") (uuid 5d55e141-d872-4686-843a-76c36b28ff34)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 93.98 55.88) (end 86.36 71.12) (angle 270) (layer "F.Cu") (uuid 66faf55a-c406-4fa7-9e95-a943b14a8bf7)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 109.22) (end 48.26 116.84) (layer "F.Cu") (uuid 7664a9ab-212d-4cef-8cfa-594460637df2)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 109.22) (end 66.04 116.84) (layer "F.Cu") (uuid 7910f706-c83c-46e7-807c-b87b9c7df732)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify right top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "t a"
+    (start 104.14 27.94) (end 119.38 35.56) (layer "F.Cu") (uuid 795acc99-4d66-42ec-8d37-7620a2c4d719)
+    (effects (font (face "Wingdings 3") (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+    (render_cache "t a" 0
+      (polygon
+        (pts
+          (xy 107.041029 30.765662)          (xy 105.480683 29.866605)          (xy 107.041029 28.966814)
+        )
+      )
+      (polygon
+        (pts
+          (xy 111.119762 29.854515)          (xy 110.45591 30.522763)          (xy 110.341605 30.522763)          (xy 110.341605 30.171053)
+          (xy 109.464528 30.171053)          (xy 109.464528 30.030369)          (xy 109.691308 30.030369)          (xy 110.565087 30.030369)
+          (xy 110.565087 30.234068)          (xy 110.942808 29.854515)          (xy 110.565087 29.482288)          (xy 110.565087 29.67866)
+          (xy 109.691308 29.67866)          (xy 109.691308 30.030369)          (xy 109.464528 30.030369)          (xy 109.464528 29.537976)
+          (xy 110.341605 29.537976)          (xy 110.341605 29.186266)          (xy 110.45591 29.186266)
+        )
+      )
+    )
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 38.1) (end 48.26 45.72) (layer "F.Cu") (uuid 80cd9b80-e60d-4ebd-8b61-3c201d55df04)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 99.06) (end 66.04 106.68) (layer "F.Cu") (uuid 80d92b28-b963-45a4-b801-24e56e81a486)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 68.58) (end 83.82 76.2) (layer "F.Cu") (uuid 81f627fd-31bd-4b66-b287-bfc09f2e7e65)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 86.36 27.94) (end 101.6 35.56) (layer "F.Cu") (uuid 8accd321-35f2-4514-b2bc-32bd8f65efe8)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type default))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 27.94) (end 66.04 35.56) (layer "F.Cu") (uuid 8f2e742e-8eee-4481-9b06-7c27dcdb1a42)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 58.42) (end 48.26 66.04) (layer "F.Cu") (uuid 90bd1535-0935-4917-a126-4196081d3708)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type dot))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 139.7) (end 48.26 147.32) (layer "F.Cu") (uuid 91f4e82a-0a31-45b8-ad06-ca18176c8b98)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 109.22) (end 83.82 116.84) (layer "F.Cu") (uuid 93075751-e035-4c96-8632-5b3e2e1dee4c)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify right top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 99.06) (end 83.82 106.68) (layer "F.Cu") (uuid a122364f-f796-4619-9be3-3521a1abeec3)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 78.74) (end 48.26 86.36) (layer "F.Cu") (uuid a7dbac5e-89dd-4a6e-92b6-1e7caa07bbe4)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type dash_dot_dot))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 58.42) (end 66.04 66.04) (layer "F.Cu") (uuid abb18c0b-6a69-4b09-b109-d1cc975183e9)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 88.9) (end 66.04 96.52) (layer "F.Cu") (uuid b587c4ee-c3b8-4c0e-b9ff-6d108e44f32b)
+    (effects (font (size 1.5 1.5) (thickness 0.1875) italic) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 48.26) (end 66.04 55.88) (layer "F.Cu") (uuid ba17cdd0-413b-4f8e-bf25-f93c9c31a802)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify right top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 86.36 53.34) (end 93.98 38.1) (angle 90) (layer "F.Cu") (uuid c3cbd0ce-efda-44e2-a403-1f29af44b6cc)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 139.7) (end 66.04 147.32) (layer "F.Cu") (uuid cb552089-d909-429f-bcb1-d9b62dcacba4)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify right top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 129.54) (end 66.04 137.16) (layer "F.Cu") (uuid cf5dcae0-7470-4bae-a46d-9585baecf050)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 99.06) (end 48.26 106.68) (layer "F.Cu") (uuid d19923cb-4cbb-41a4-9c93-91bb337005c0)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 119.38) (end 83.82 127) (layer "F.Cu") (uuid d3081fb8-e9ce-4cff-9fd7-55bbf5277535)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify left top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 119.38) (end 66.04 127) (layer "F.Cu") (uuid d43aed92-134c-4594-96cc-b735400649c2)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold italic) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 48.26) (end 48.26 55.88) (layer "F.Cu") (uuid d8ecd2e8-1fcd-489d-9819-66343345a3c2)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type dash))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 88.9) (end 48.26 96.52) (layer "F.Cu") (uuid d9291bf2-f5e1-4b11-b99c-f3c4e9b4f428)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 38.1) (end 83.82 45.72) (layer "F.Cu") (uuid e0a1cfbc-4cc7-49b3-a338-162718dc87c8)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 58.42) (end 83.82 66.04) (layer "F.Cu") (uuid f3ee4a80-2fca-44b4-919e-bbc320830802)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 27.94) (end 48.26 35.56) (layer "F.Cu") (uuid f62827ea-f8c0-47ab-8e13-bc2b8799c401)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type default))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 50.8 38.1) (end 66.04 45.72) (layer "F.Cu") (uuid f86952c7-6db0-4205-8dfc-a8f471d6a422)
+    (effects (font (size 1.5 1.5) (thickness 0.1875)) (justify top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 68.58 78.74) (end 83.82 86.36) (layer "F.Cu") (uuid fa155af2-98aa-464c-93b5-39570ca49eeb)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify right top mirror))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 33.02 68.58) (end 48.26 76.2) (layer "F.Cu") (uuid fd977cba-949e-42a0-acd0-8e7fc1187a55)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type dash_dot))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (start 101.6 81.28) (end 86.36 73.66) (angle 180) (layer "F.Cu") (uuid ff558bd7-572b-4244-ab6d-97c7985392b7)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (pts
+      (xy 92.511663 121.665927)        (xy 90.127602 106.613557)        (xy 97.653787 105.421526)        (xy 100.037849 120.473896)
+    )
+    (angle 99) (layer "F.Cu") (uuid 0b14faf9-1fe4-4381-9d65-e19c9f02ebea)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (pts
+      (xy 86.36 96.211846)        (xy 97.136307 85.435539)        (xy 102.524461 90.823692)        (xy 91.748154 101.6)
+    )
+    (angle 45) (layer "F.Cu") (uuid 4cf1f31d-933d-47cd-b835-ed5f92690f10)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box "Test {dblquote}test{dblquote} \\\\test\\\\"
+    (pts
+      (xy 103.958042 132.837259)        (xy 92.283525 142.633342)        (xy 87.385483 136.796083)        (xy 99.06 127)
+    )
+    (angle 220) (layer "F.Cu") (uuid ff6ce36a-56bd-46bc-96fb-31ce64a2b523)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+  (gr_text_box locked "locked"
+    (start 33.02 149.86) (end 48.26 157.48) (layer "F.Cu") (uuid 1604e3c4-6dfe-4116-bf50-703b6b6d6d75)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+  )
+
+)
diff --git a/tests/testdata/board/since_v7/test_textKnockout b/tests/testdata/board/since_v7/test_textKnockout
new file mode 100644
index 0000000..81904ef
--- /dev/null
+++ b/tests/testdata/board/since_v7/test_textKnockout
@@ -0,0 +1,50 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (gr_text "test" (at 168.42 92.81) (layer "F.Cu" knockout) (uuid 37d6611e-bb8c-49f5-bc61-44562605f28f)
+    (effects (font (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+  )
+
+)
diff --git a/tests/testdata/board/since_v7/test_textsWithRenderCaches b/tests/testdata/board/since_v7/test_textsWithRenderCaches
new file mode 100644
index 0000000..2e33251
--- /dev/null
+++ b/tests/testdata/board/since_v7/test_textsWithRenderCaches
@@ -0,0 +1,85 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (gr_text "cached stuff\n\n" (at 137.16 93.98) (layer "F.Cu") (uuid 25874870-6d4f-4bc3-8a66-95a041f89adb)
+    (effects (font (face "Bell MT") (size 1.5 1.5) (thickness 0.3) bold) (justify left bottom))
+    (render_cache "cached stuff\n\n" 0
+      (polygon
+        (pts
+          (xy 140.623846 91.204918)          (xy 140.618478 91.205)          (xy 140.602633 91.205)          (xy 140.58679 91.205)
+          (xy 140.571994 91.205)          (xy 140.555749 91.205)          (xy 140.538056 91.205)          (xy 140.522857 91.205)
+          (xy 140.506991 91.205)          (xy 140.49168 91.205)          (xy 140.476924 91.205)          (xy 140.459948 91.205)
+          (xy 140.443771 91.205)          (xy 140.4309 91.205)          (xy 140.41575 91.205)          (xy 140.400799 91.205)
+          (xy 140.386048 91.205)          (xy 140.366691 91.205)          (xy 140.347689 91.205)          (xy 140.329041 91.205)
+          (xy 140.310749 91.205)          (xy 140.292812 91.205)          (xy 140.279591 91.205)          (xy 140.263187 91.205)
+          (xy 140.247508 91.205)          (xy 140.230335 91.205)          (xy 140.214882 91.205)          (xy 140.198392 91.205)
+          (xy 140.188 91.205)          (xy 140.172158 91.202746)          (xy 140.160335 91.193076)          (xy 140.157958 91.181919)
+        )
+      )
+      (polygon
+        (pts
+          (xy 142.953316 89.798302)          (xy 142.97018 89.798176)          (xy 142.97933 89.798161)          (xy 143.251538 89.798161)
+        )
+      )
+      (polygon
+        (pts
+          (xy 144.705109 90.747322)          (xy 144.717093 90.761103)          (xy 144.726177 90.773056)          (xy 144.734816 90.785833)
+          (xy 144.743007 90.799434)          (xy 144.750478 90.813539)          (xy 144.756952 90.827827)          (xy 144.76243 90.842299)
+          (xy 144.766912 90.856953)          (xy 144.770399 90.871791)          (xy 144.772889 90.886812)          (xy 144.774383 90.902016)
+        )
+      )
+      (polygon
+        (pts
+          (xy 145.254478 90.074243)          (xy 145.261175 90.060128)          (xy 145.268431 90.046533)          (xy 145.270572 90.043258)
+          (xy 145.282908 90.034128)          (xy 145.29292 90.032634)          (xy 145.307265 90.036488)          (xy 145.316915 90.048051)
+          (xy 145.321175 90.062374)          (xy 145.322566 90.078362)          (xy 145.322595 90.08136)
+        )
+      )
+    )
+  )
+  (gr_text_box "cached stuff"
+    (start 134.62 93.98) (end 149.86 101.6) (layer "F.Cu") (uuid b8512651-2382-43ae-b65a-eb7f3bf81913)
+    (effects (font (face "Baskerville Old Face") (size 1.5 1.5) (thickness 0.3) bold) (justify left top))
+    (stroke (width 0.2) (type solid))
+    (render_cache "cached stuff" 0
+      (polygon
+        (pts
+          (xy 136.498814 96.634875)          (xy 136.512674 96.627047)          (xy 136.525961 96.618015)          (xy 136.538674 96.607779)
+          (xy 136.550815 96.596338)          (xy 136.55859 96.588042)          (xy 136.568481 96.575409)          (xy 136.578461 96.559949)
+          (xy 136.586509 96.545547)          (xy 136.594615 96.529335)          (xy 136.600732 96.515989)          (xy 136.606881 96.501626)
+          (xy 136.613063 96.486245)          (xy 136.619276 96.469847)
+        )
+      )
+      (polygon
+        (pts
+          (xy 137.4812 96.599439)          (xy 137.494971 96.605788)          (xy 137.510853 96.609113)          (xy 137.521395 96.609658)
+          (xy 137.536632 96.60902)          (xy 137.552422 96.606509)          (xy 137.566092 96.601598)          (xy 137.578611 96.593112)
+          (xy 137.589836 96.583244)          (xy 137.601124 96.572054)          (xy 137.611887 96.560565)          (xy 137.645593 96.580715)
+          (xy 137.63985 96.595577)          (xy 137.633337 96.60948)          (xy 137.626054 96.622424)          (xy 137.613686 96.640043)
+          (xy 137.599585 96.655505)          (xy 137.583753 96.668809)          (xy 137.566187 96.679955)          (xy 137.54689 96.688944)
+          (xy 138.967801 96.634937)          (xy 138.967801 96.68)          (xy 138.490062 96.68)          (xy 138.490062 96.63457)
+        )
+      )
+      (polygon
+        (pts
+          (xy 140.057137 95.789378)          (xy 140.076786 95.789002)
+        )
+      )
+    )
+  )
+
+)
diff --git a/tests/testdata/board/test_allFpManufacturingAttributes b/tests/testdata/board/test_allFpManufacturingAttributes
new file mode 100644
index 0000000..e3d4ecd
--- /dev/null
+++ b/tests/testdata/board/test_allFpManufacturingAttributes
@@ -0,0 +1,874 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+    (pcbplotparams
+      (layerselection 0x00010fc_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes true)
+      (usegerberadvancedattributes true)
+      (creategerberjobfile true)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer true)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 15.000000)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 1)
+      (mirror false)
+      (drillshape 1)
+      (scaleselection 1)
+      (outputdirectory "")
+    )
+  )
+
+  (net 0 "")
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 0eb1464b-f2bf-4f14-9186-d2f038802259)
+    (at 130.5 90)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 0978854b-7f2d-4e70-81ad-b8366855ab91))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 36570266-ac30-48fb-a957-d39c502c9460))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 520ddf64-73f0-4767-8391-a2c8400d2889))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 61a51970-fbbc-4b1e-a7ae-feb21648f6ac))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 6f6fc535-e6ac-4715-a245-11d18639fbe6))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7807c7b7-7ef2-4f78-b820-a3d80a6a5558))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid ab5fd570-a8ed-41be-bdc9-9bca7f01f72f))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid b2b23386-d0d5-4278-8953-0c9c0e5e73f7))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid cdbebb5e-a816-472c-9169-2f89317f1f2a))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid df8ca82e-d7eb-4065-8722-73c6f9311432))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 91696539-77c4-4a75-8e58-8ed056557991))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 48ced388-1009-47c0-9121-927d687fa0e0))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 743d8da9-eb43-4371-8313-505007abb989))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 973b69bd-3173-4927-bd5c-d73e14d856a7))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid f220da3f-d9e9-4b5a-81e2-bb395123fe5f))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 0fa684b1-37bd-4ad2-bdc2-d75e04b6861a)
+    (at 90.5 75.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 0673bd15-bb27-42a3-b8dd-ff34de638161)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid d618158f-4184-4754-aa33-65a98e706342)
+    )
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 2798cc00-37db-458a-b5f8-bea65ae99be7))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 2926e945-d9e3-4a4e-9b51-aad244dc04f4))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 334446cd-af18-48a8-bb73-a88f4d220620))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 92adc2a7-705f-4e7b-90a7-1c91d9f5977d))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 978f5906-8b9c-49a6-9b77-25cbc28e396e))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 9c1b71cf-44fe-4b7f-bf7f-4966704258c9))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a54a2d51-4b66-4d14-b33d-1444b55de06d))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid bff35e53-0373-44e5-a0ce-05175bbecd57))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid e085e529-431d-4fe9-aed9-287036ceabd6))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f7eedf75-4d8e-4db5-a979-879f661d7288))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 432045b0-7589-468b-8659-999ac30c51fa))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 17c7b03d-e4b9-4587-b2ce-0ee7a9d30575))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 2009ab3a-f4bf-4c63-a0fe-9d170c762787))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 4d290f63-844a-4f7b-8aec-c610c29b1e2f))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid fdd0a3ff-3d05-4dc5-8f2c-3aa967326c19))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 3f8f771a-1298-4ccc-b64b-d7ab6925ef3c)
+    (at 90.5 120)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd board_only exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 381ea437-8589-413a-8d00-c27a465a3773)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid e12ec3e8-0d5b-47b1-abb9-9b31a4bb451e)
+    )
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 168a0226-3f44-46ec-a72a-15290137bd66))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 18406746-0f9d-4d88-9ef2-8423e08576f0))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 20ac7a70-5cb9-4418-b061-8e4ee8d36b79))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 54562a16-6662-4d1b-9b50-45ed0ae36481))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 6f581e98-caac-4a3a-b0ed-76aab462e56a))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 73b08644-febb-4c1e-9b8f-826cf4cd7348))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a1bbbcb7-3394-4d47-a7e2-c5aca5915b62))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d0823f78-79d3-470b-87e6-694e750395bc))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid dfdaa22a-0489-48da-8a56-737e4c4366e1))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f47ba0cc-ecae-4aef-a30d-acee22ce59db))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid ccefc75b-fd16-4e82-963f-281710a98051))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 2b7fcec9-f103-4c1e-8056-817283941746))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 318b1c02-8f98-40e0-8672-6e5f766110ad))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid ae0ad2a8-816d-4ed9-8122-ce73b249d5bc))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid cd008119-17d3-4098-90f3-4ace8a150683))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 4162ea85-08df-4ac2-99e0-fc35a4bc249d)
+    (at 90.5 60.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 956f8a88-9acc-4e52-9280-d386fdb26e68)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 37c732a1-cf44-4113-843f-85a5910958ec)
+    )
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 33193802-955d-4a94-98cf-a3ed27526865))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 570b0686-0fc3-46c1-be51-39569bba54ce))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7966563c-e279-4a7c-bf41-af45d42c4a74))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7cc91655-208f-4c40-986f-00fd054b4b29))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a5129eb7-d259-4824-8f60-442feba02c79))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c61a2d85-d3d7-4faf-9bef-d07618588ca0))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid ce824579-a256-4757-8547-32bf1db63637))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid e0795232-a4f5-40af-bd8a-4a69f1a39aa6))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e567c545-204a-4e4a-bfa9-ae48e2366f9a))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f66b82ab-c203-4cb4-84ea-abcb2cd50a9c))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 49956dd5-35c0-4b9f-8b2a-6f2b8918bd8c))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 21491966-3c4c-414a-8ddc-0c7176ddff87))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 363809f4-b895-434e-8ee8-f8b8fb35d4fe))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 791a5e22-eefd-4c9f-8145-64da9c193893))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 7d6a83ee-b39d-480d-9568-6e909628ec27))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 4197fd6e-d0dc-4cad-a61b-00b708d61f8e)
+    (at 170.5 90)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4159a1b3-645b-4fcf-a72d-9242b2067a63)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid d7b44d07-2cb6-4c10-bad9-adf2185ee6fd)
+    )
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 06691abe-4a61-4d84-ab64-63ace23bf8b5))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 1b73c962-e471-4ec3-ab97-9114c97a5609))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 24e41c56-597e-4023-adfa-f1d5bfd2a519))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 3e6949fd-a9d6-4530-9145-d07c13ad2635))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 5632ff9d-82e3-45b5-a86b-5a4683beef51))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 5c080aa7-74cc-491d-a4fa-a35e9d41b2a9))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid be78c320-66c9-47db-84c6-e07682b2c3ee))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e41ebddf-cb62-48cb-abb2-1cc22a5eecdd))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid e5ef96dd-e14b-40bb-acac-746f5d3aee37))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid fb7d0d2c-09e5-46e0-8091-1901472a84d1))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 79094860-9de1-4089-9ad1-fb708c7e674c))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 0e39e32b-7468-4f6e-a6f0-b54d61a16933))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 40b12084-e9ea-4a47-a64f-d44ca516c9e8))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 564c737a-c22b-400c-8665-990100e2bad2))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid c83a95be-f351-410b-916d-b5948688be99))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 4f600c3b-938e-4f15-a3d5-2f7b84b7a114)
+    (at 130.5 75.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 565082b3-06ce-46fa-857c-fecdf53c89f1)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 7db41bda-359c-420f-bdf5-221e6a8efd3d)
+    )
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 34f20938-82be-4faa-a3bd-ea4ff60955a6))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 49b6beb3-5d64-4af2-830b-e99a8a5ac007))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 4b8ea754-7305-433d-91ba-90a4340e15a7))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 78e707fb-3e9a-4f67-9527-ee34cdefd91a))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7fd7cb09-496d-4f85-a95b-f531a0ea6ec8))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 99187cb6-681b-4886-9fc6-864207b7616f))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b5c8a737-214c-4638-bb5c-b013b02f97ab))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b67db6fb-e010-4837-9b46-419c0d446aba))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid bb857b3f-cfd2-48ea-8ae4-988435afb17f))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e60f5c1d-c97e-4327-8023-b78c1d20bdfb))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid e93f1ff9-82cc-426b-b31b-274f08cc4327))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 0739a502-7fa1-4e85-8cae-604fd21c9156))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 7de04273-7eda-4419-ad6c-938bfee9f2d2))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid baa2bb27-3ff4-481e-b331-7cfee71362fe))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid dc463df2-2692-4a08-9d95-1a693251e4f0))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 57ebeabe-b600-4237-a37f-55fc1fe8a51e)
+    (at 170.5 60.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid f42c2843-70f0-463a-bc38-eee11dd73b5f)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid c435621a-1e7b-4aea-a701-d5d27a54bd0d)
+    )
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 0ece2b87-02c1-4250-9204-efdee0b5a9d0))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 311a70eb-5859-4da6-8fe4-344b06368e0f))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 3fcf515a-b2e5-4769-a263-706606d34687))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 4362e6ac-6290-4071-922f-911c69fdd561))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 437daa66-7365-482e-804c-8098c6a0905c))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 70791199-43db-4ae1-bf3d-59e94aad8d59))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 971c1271-0f6f-46b9-8494-7107930ab4af))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid cd74d053-e62a-45a3-9f24-631862f85655))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid cdb2878b-f702-4635-9e4c-1cc8cfe5a84c))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e26f0b22-8514-418f-977b-cb0a9761b0f5))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 1aa01b33-85ec-45ea-bfaa-b88738576f2f))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 0afc6592-c2db-4caa-a22b-f13f9e7e1c40))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 4d759aa0-1145-43ae-a507-a45f6fc89e2a))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 62b6b2b3-6ade-4e95-8062-936451a2172f))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 9c8b409b-0d1b-49e5-8fed-acd83e0e8b3e))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 6504cfdc-6446-4592-b544-df5485f34a07)
+    (at 90.5 150)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd board_only exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 3f6533ba-c4f9-46fc-b56b-e4570f6ba8d8)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid f6662114-e94f-4466-8b01-5f4d76363a86)
+    )
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 2f1df4d4-ea41-4805-990c-fc64e9beb3f8))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 3d38eca7-b037-4400-970c-46db57e3c3cb))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 8ae8bcca-6404-4249-9a1b-d6efa82cff52))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 8c497335-9f19-4d8f-81b9-d3f6e5560190))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 93b580d1-c2df-48c4-9d06-465ca9d3eebc))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 95e16380-a797-4ef6-bc92-67bfd44afe75))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid ac5a5c45-797a-4bbe-bfd5-5ce5a8aa3463))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ba80136a-34d0-4a97-a9c9-c43ab3f7be6e))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid d0d2152d-05bb-45b9-922c-65dc46f5a5df))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d628bd18-95ed-41eb-b4b4-f043ded47592))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 1a657991-5c9c-41a4-9f2e-22f0c7450b3a))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 0e0a4b84-f32d-4d0d-bb01-e1a33da32acb))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 4445e598-1c38-4291-936b-eafc95d0cf78))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 6d4529c3-e736-41f4-9e85-842fded7472a))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid fe9073de-b4ae-429c-945b-a199d6313a17))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 684df057-312b-4a12-b960-3d0e61cf3ada)
+    (at 130.5 135.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole board_only exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1c55eaff-dfb6-4adc-bdb2-1121eb73358d)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid b2561a4b-5655-4b54-95c4-147a5b85fc10)
+    )
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 3491c78b-620e-46ca-a1c1-053b49774cc7))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 4a151dd5-28d8-42af-b70d-d52cf427540e))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 4ed19592-a5c4-4f6f-8e35-67fef4315ee4))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 4f4277d9-4ff1-4fe4-9af0-84cedee4b2b6))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 5baacfaf-4f9b-484a-b0ad-900c2c96f940))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 92563de1-61c4-4e3f-8603-96474790934f))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b5a26653-4e77-4514-a8f1-63ca7c4f9ab9))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d789eb5c-7750-4e88-bd51-088f1d8d4899))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid db3e62ed-d2c4-4262-9844-874282d066c8))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid dcbc5a2e-2561-4663-8736-09acc9fe0209))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 97816a30-8562-4b40-bfd6-82faaadf14b2))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 06d56cea-efec-4ee2-a30e-da196d83ccb4))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 7b66c522-eb2b-4ac5-8fa6-badbd9e03844))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 7c938fcf-5266-4f01-b9d8-797ff7c61f4c))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid dc4bf440-2891-440b-98cc-4ec7ceadee72))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 69403dd4-fea9-4899-966c-fff003244a4c)
+    (at 130.5 120)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole board_only exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 0504c604-5989-41d4-98b3-73baf39661a4)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 737d10d1-31d2-4ac3-8e9f-c01d3ad411b5)
+    )
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 20a40fd4-4825-456a-b45d-96e8fe1622a5))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 572f678c-7489-4a0c-81c3-6f024e0707be))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 5d4ed9ca-985c-4d79-b913-0fd671b604bc))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 6fb81dc6-41d5-4f97-ab8d-08492b739776))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a4a90bd3-5586-4453-acbb-4d2c22443f49))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a82cec30-45c1-49b3-b9e6-e30cc49eb759))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid b5e1d796-f3d8-4363-a6bf-5bf078e880e8))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b89e3fe5-d3a3-4087-a7a3-319b60fcc6e9))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid dc538eb4-034b-4b8a-a5e5-4a3e1e9a8cd3))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid edbc17dd-aa76-4d77-81ec-11ed42efea05))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 0368658f-3125-4888-be8d-2d00cf819e46))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 21443f6e-c9cb-43b6-9145-0fe007529b00))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 36915340-9dd2-4d10-bb2e-946e32cc121b))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 82f0532d-1a6d-464b-ad29-fc3e8108d6a8))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid d3ea5011-250b-4076-bf21-0457c1dc2816))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 7a550720-ee66-4d31-b0f9-0a57a3b133ea)
+    (at 90.5 90)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid ca6052ba-b6c7-4761-b3cb-c749f8cbf361)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 606cc23c-679a-4fa3-b3b1-c023026298b1)
+    )
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 02ca9350-9e0f-471f-a345-bee2587bb572))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 07e820f6-5352-4622-89c6-9dc8d877ae52))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 13d0922b-6304-4dca-bf30-664d82859d66))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 85c4eb9a-1efe-40fd-86af-36f89108b5f9))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 959ed360-eb0a-4a79-8f34-5faaf7fec5ad))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b67591ef-79c1-406a-9cdd-2d6de62566a6))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid bf1a0735-8349-4149-9917-9c06c3ec36d7))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c8d1a84b-8d98-4130-891c-9d4b5bdb0535))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d1c3595d-d061-4c53-823c-19aa0d9a8865))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid d28736e8-ee75-491e-b9af-2d7eb8b3297e))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 08895aac-0eaf-4885-9893-39d7cbab257b))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 251bbd6b-00ad-4956-8621-28b4b522b62b))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 8699357b-081e-4490-9c44-11d25a40de14))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid d0164702-426e-4c87-abe5-fbfeda4c6ede))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid eccdf86f-23ac-4077-b13e-27dc356e9a70))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid 87b0d27d-8c92-47f5-b6cf-66578b6858e7)
+    (at 170.5 45.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid b9937346-f6e7-4a0d-8b88-940809bc0c5f)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid d205f026-5c37-4a8f-96d0-c67ab0976f34)
+    )
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 5b1cf420-b469-4a8f-a998-9abdfd8b7687))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 60e61964-6ea7-468c-b4d5-c464c2964fb4))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 8b8cbcc8-2fab-4017-82d7-9e2b0dd87d55))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ae9a2cfc-2e02-4731-9394-e388bba596f8))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b4bb129a-27c6-47af-a65b-1d062a176af1))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b555eee7-8149-4892-8ba4-057aabcbbee2))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c40d36bb-2efa-4bc3-859b-223faaa66f3e))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid c97ec1e3-38c3-4514-9704-1b06a25c7c8d))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f686f314-e4c1-4c2d-a83a-58da96d3edf9))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid fae1c1af-89ba-4c18-88bc-46f514e9bd6f))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid de673e63-5f43-4989-8aea-860e28e93f50))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 4ab287b0-f7e5-4d54-ac56-3885f4c05418))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 5f6e226e-a567-408b-beb0-c8a8e2ec508f))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid f37be837-3bee-4441-b239-c214f98ba58a))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid ff667a13-f89b-40a5-99a3-00684de2da09))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid ac132512-c893-4cc0-8b4f-a1bad93547b0)
+    (at 170.5 150)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr board_only exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid ba54b977-6e85-4849-863a-8aba90c0983f)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 7b0b2e9d-7b62-4d86-ba92-8de66c2be81f)
+    )
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 4ed59335-4075-4e12-a596-bab87aafc796))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 56b75d3c-fa69-4f57-9aa5-64cfbf200c32))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7614d1b3-3ead-4914-90b1-e5e05187dd06))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 7ab2c56a-308f-45dd-b534-f28d44e59352))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 8d258870-19f3-4d71-9a3d-1390358a4e5a))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid afd59d07-bfd6-4bc9-8176-e0ddec1872a1))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ddb83956-0781-4967-adf3-cb27a82b32ef))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid f254f8e4-0eca-46a4-a3de-477f70bd6ec4))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f2d404b6-1993-4de0-b78d-3ca9612287c7))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid f80a85fd-e6d4-41d6-ba9f-12f575651e85))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 389820b3-dc0f-41a8-9487-f37594ec848d))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 4cb674e3-7fd0-4bdf-83d4-7b2424e2e5c0))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 58518ef0-9375-45b7-b518-1100f14f6963))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 75fcab2b-759b-4221-b3ed-5bcbea1afb05))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 94865570-11cc-4b49-8ee4-db024780b3ae))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid b16ab301-4abd-43a9-8923-4ae36109ad1e)
+    (at 170.5 75.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4035093c-8c14-4085-bfea-fcb41c163f69)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 71c1b4b1-fe29-4ef4-89f5-de4386e105a9)
+    )
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 26584013-aa69-4f6e-9469-cf96829118fe))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 42921c6f-25e8-4512-9139-83b5b81397a7))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 5841a60a-7434-4694-9b2f-60c2321b8bd0))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 8fecaef3-3ec3-48db-b92b-42aba82b3c34))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 94f92a53-a887-4e67-921d-9685969e3c14))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 9d1d67aa-bd89-4416-8ff1-ea3aed8edbd3))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a07f1e79-1d7d-4a07-b840-3da61e06e5e0))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d9209bac-cc1b-4bd5-9b0c-8896b0dbce47))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid d9c7258e-64f4-44a0-b9ed-474106f56c42))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ff3f0dce-48a8-4a4e-9a85-b6808253807b))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 14b6a088-e29e-4f65-bb62-fd783c1ab88e))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 1d3dd843-278a-491c-aee7-c4ca56549357))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 6b4ae552-c3dc-4d02-ab1a-556e15ae247d))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 8157d0c3-4115-4fef-882d-18ff9f3b1e49))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid a3c07522-2d1f-4d1c-a6e5-18097136531a))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid bf7f7976-c492-4b38-9696-c24926909542)
+    (at 130.5 150)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole board_only exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 53d63574-d294-4160-8943-1f901b80728f)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 9d221b3b-0bfe-4439-a426-0f2594b9c7bf)
+    )
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 0a1ac2c6-8da8-4410-b772-69afa2855077))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 119a2ba9-03f2-48af-8f1a-4a96cb25a3bf))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 251435cb-df17-46ab-aac4-3d24ccac8db0))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 3450ae82-42ae-493f-904b-d8b1a09c107a))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 741e6598-04b9-4005-a079-9081c23103ab))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 742f6656-c86d-41c0-937e-ef6ded3bd482))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c355ca51-32bc-4d88-a250-07d5621dd709))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid dff62e1d-c592-4963-80cb-25d776cdc1f4))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e68fac9b-3de3-4acb-9bb0-3dee3685df22))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid f252e204-5b1e-4386-b15b-42d6a51ae097))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 7efaeda2-e767-44b9-adb2-3a0c3f4d2f1d))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 9004cee7-358e-4c08-9d64-a05f28a4e7b6))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid b2ecb88a-4c09-46d5-b24a-de38dbb48f75))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid d8ebdeb0-2bbd-4a1b-a259-f95c97f44cbe))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid dacfc6b2-f197-4446-86ee-d141533404be))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid cc888f43-ca19-462c-adfd-2e20cb8dfede)
+    (at 90.5 105.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd board_only)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 7d512d14-3ca4-4934-b506-eb07d268c7dc)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 3d927ca0-f4ad-42ab-b902-dfef8d84eebb)
+    )
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 1fbda89d-82ba-4f0a-b113-988f269883dc))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 27b5a6bb-bf08-4e16-abae-290afd548f36))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 2fa17bd4-23af-495d-84c8-95f8b6beb5a8))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 3fc3a397-ec3a-4314-aa6a-44925ef4cbbe))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 4736f749-4a0e-4a05-b1aa-d51f1c3fc23d))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 76d9276c-0bff-44cf-81b5-cc0de1c97f12))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 782b86fa-ef9f-4c16-a991-b44a80f0f0c3))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 90dda447-2750-402e-9a9e-df264b0c0bc9))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 961e37cd-505c-40aa-baef-0a680d665d8f))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ddcf9a83-0126-4df6-88fa-3363d508d3a6))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid e03d7bc9-2bd0-42b5-96ba-4ca164fb4c50))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 74796a55-82bc-4f74-9e9c-c7cb232069e3))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid b6fc4182-53d3-44c8-80e1-53918daa9139))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid cf672f56-2d68-4c6c-a783-23e23c937b72))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid e721274f-b458-4ab5-8d4d-44bffaffa7c9))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid d24fa136-4598-4aef-8742-bfb5c4659871)
+    (at 130.5 45.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 325006ce-4c23-4f07-9871-dc0cd047f7fd)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 96930a67-6215-4f2b-a9cc-16f78c9fd164)
+    )
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 20d6997e-64c7-454b-9573-baf26e1ad11b))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 240fde71-00e0-458d-bf75-b4d973cb180b))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 4b1dbc88-c8c5-476c-80ac-830e56684be9))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 511ddebd-9f54-463b-bc54-5ebdd708d33d))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 764ce9a2-c363-448f-a68c-a7dbf5cd80c1))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 9a7ade3c-a81d-4038-a57c-b220b9c3cd90))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid adfaccc9-bb80-495a-9038-d58935037d76))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c60ba6ae-e013-424d-bb59-f3de27f735b1))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d2d83bcc-f2f8-4838-be35-0f2248bff3b6))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid f587f477-194d-41ae-8a6d-91fbd85f9d3f))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid c7a7077f-9289-4bb4-8f3b-a449cb499057))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 2415334a-b998-4d19-a8b5-e60e8af2aff4))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 345a9ac1-be31-400b-9c5d-4af388112d4b))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 835ada2e-dc88-46f5-b472-12f6a1e8c9f4))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 9421d8ab-ec24-4783-b746-a12fbd00100e))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid d39f803e-b408-4148-9dc1-1268cfb6cee1)
+    (at 170.5 105.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr board_only)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 88ec470b-1595-4040-bc2a-91476c84ca2e)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid a5e5a32b-d259-4833-9676-56ada82e83c2)
+    )
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 05fda319-28dc-4877-8331-02cb10501361))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 1330eb77-c16f-4a58-a897-f5af49736826))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 15f86f86-6612-462a-a1d2-f730a8788a9a))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 163cdeae-7841-4f2c-b738-e36b081d5e19))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 28f5d24e-b605-4fad-9e07-a157526f5710))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 7759bcaf-350b-4897-a675-aaf4fb3e75fe))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b4450c83-6da6-4393-a892-92bf8cbec8aa))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid cba11463-444d-4fb1-9f76-b3065c51a98b))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid d6c6796b-c630-4de8-9473-cbbc978a0a21))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid e5abcaa8-c89a-49d4-9e47-28a25f37d322))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid e51830a2-6dc5-4f13-834b-b490ff3a07e5))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 4b9a4b22-a241-4855-9d5c-4ff2f9005b1b))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid c3c15276-82a5-4b64-990f-7f503a97141e))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid e4f6c439-e664-4982-a00a-ae1d4844df2b))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid fd27925d-9b2e-4663-bdb7-e46b9715b801))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid d5f3c190-b3be-48f3-b8a6-e41bba2e269e)
+    (at 170.5 120)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr board_only exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 5c16107e-b60f-4f98-bbed-8abfeb5d4011)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4e72994f-410e-42ab-a8f9-f801527ca6d0)
+    )
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 22abab2e-9885-4da7-9852-348f356dd096))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 58a22765-7f2e-4f66-9ea8-f56fcca75dda))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 7da919a6-904e-41c7-b0f6-91d865a93890))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 99a76074-fcd3-4150-83c8-79f76bdad1c5))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b748f219-0f44-41d7-bcf2-9a96e7f8b594))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid b9e0ba15-f372-4a9e-a627-d594778258ac))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid cc016ca4-b9a4-4d80-91ba-91d6e0df5bcc))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d28c26df-aeff-4f6a-a1dc-f734efaf55cb))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid dcff1695-539e-442e-afee-9485378ce13a))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid dea160a0-c7eb-439d-aa99-b60757115fc7))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid eb5c3818-51cd-4092-a6a2-1d306912382e))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 83fee08f-7316-4ff9-a4fd-e9a9372f4d8f))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 9256f7aa-4f1a-4001-bdef-7fbb32e451e0))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 94e689a1-e70f-45cb-8a5b-dc77827f725b))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid be0c7a50-2d41-4fd6-8c28-37a4cf00d900))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid d605dd99-2afa-4862-ad86-bb1825478583)
+    (at 130.5 105.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole board_only)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 23f1f71f-cee3-412e-8e0b-8dacdc450a11)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 57e128ae-5e07-4818-9f5a-1cee0e65c680)
+    )
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 106f01f3-bf47-4150-bb7b-1a3318a6eb3d))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 10ddf54c-6d59-4755-8fb8-43466141a83a))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 26769327-3160-41f1-82e7-11d5d542abde))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 31446a24-8ce7-4dca-ab0b-d907a8be5e8d))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 537c2196-fe60-48a5-847c-84653e479b38))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 5cab06cf-94fa-4c5d-abc1-110cb0208f01))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7eebb937-5634-42da-bd7e-2e0260369d0e))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 9a17b82f-671a-43cc-889d-8f643334e78c))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid a5e505c0-c0af-4f61-a9d4-cf031c548012))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid ed265626-f6f5-4029-beb9-f6ad275e86b5))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 9ade8aaa-dfca-436d-be8a-be74784ef565))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid a64a7c06-7057-47f9-be64-f537af3193b4))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid bc2b91cd-dad2-489e-a5a6-c25b0772eb90))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid c884feb5-afbc-4baf-9f12-868c0ed27bc9))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid d633a4de-1388-46e7-ac55-24bd558a0816))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid e0aaa7e5-905d-4c84-ab35-31fe60dcdd68)
+    (at 170.5 135.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr board_only exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 2e4a6d1a-b585-4ad5-95d8-aff8c32bcfec)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid e0441cbd-426e-47d4-952b-8c03883e1f7a)
+    )
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 006bc43b-d3a8-4a38-a8dc-5a24da3f9b4d))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 0157ed9d-375b-4b39-a7c1-9cb08dcf67bf))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 11b49d13-b047-4242-be65-9a9b1c80ec58))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 430b98dc-0155-464c-95fc-2bf720cc2dd3))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 434de308-3c0f-471e-b2ea-4b1db61e07dc))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 496eb987-d081-4e1e-a63a-28ee1d48f2f8))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 6c55033c-55b9-4835-9ab8-f334f8a3ffed))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 776fdb81-16bd-40fc-866b-5d7c4f5af091))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 96e87ac2-5565-47ab-ae62-263f85b93211))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid f0d59009-bdb6-4150-8249-d2a9c5928391))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 42dd1fad-d6e1-4a22-bcd7-61c29a70aea6))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 2a891096-042c-4004-b161-8bd2c0b59fd7))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 771145ed-2e00-4172-ac95-37a36c6a35ce))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid a27ad806-2f49-493b-a712-5cefb34fea4e))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid b81cd904-69d1-4c8b-81f2-302fdf1cfeb0))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid e6383cf2-63bd-44ca-86d7-73cab8c5a669)
+    (at 90.5 45.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 920d067c-09ea-4120-b810-77cbd11822fb)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 2629f374-664b-4a6a-877f-847eba3a2928)
+    )
+    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
+      (effects (font (size 0.5 0.5) (thickness 0.1)))
+      (uuid e096fb6c-9c86-457b-8f2e-4be4f1ee308e)
+    )
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 058fedcc-704d-4293-8197-34a17ef8dc07))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 3bd1d24a-0ba6-444e-896e-ab4ac7dd5127))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 4e26d1df-a557-446c-8724-16a2959e6714))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 5417d93e-ea72-4615-a825-50b48895bd92))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 99e5628a-8c61-4f9d-aa6e-5b585271b505))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 9f289b4a-cc82-473b-9973-1ab4c36355f8))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a1f64cc6-dc73-41aa-a86c-99d2c0c7e9e8))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c27162ce-dec2-4696-8422-f740d31716cf))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid c7050574-27e1-4a80-9dab-24805663409e))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid c9af433b-c759-435f-b23f-8e61bde22221))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 46c31fef-8b6d-4892-b7d6-1b9818ed82f5))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 11ccd497-2713-4d03-8a7a-1dbd53fbc1f7))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 328b655f-3682-4d72-b986-09747092cdfb))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 7dd46673-4551-4937-beee-2ea3f888f7bc))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid d46f6682-7aa3-41f8-8dfe-bfed3b1f9948))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid e9e920f6-baec-4cdb-8085-ad6ca5c3b307)
+    (at 130.5 60.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr through_hole exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid bade9875-e59b-4d52-b529-c48d7c265fc4)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 3b398e0a-4c10-4dcc-aa1f-5dcd51a576d9)
+    )
+    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
+      (effects (font (size 0.5 0.5) (thickness 0.1)))
+      (uuid a32fe8ab-5810-40f6-8eab-48332c0ee5a0)
+    )
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 17540f0f-267d-4f0f-8f00-5539a89bd637))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 36d7002b-bf2e-428b-a91a-b4ed755cac59))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 66734891-cd33-4205-a68e-7aa74d4b75f8))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 8a2de683-0cbb-47f9-b48d-61ac1c60565d))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 8f0e1ea6-d278-4117-9e02-aaadcc59362e))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 92587ea2-e589-4cd0-a110-fdbbe9573c25))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid a5d527e3-93e5-4f7c-9403-79aabfbdc470))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid b3eebb03-af8c-48e8-a7d9-5ec3741206fa))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid c587e41e-e411-44d4-a360-b7b652a17e87))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid ec7a7d72-678f-4bfb-a06b-17a4d013c413))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 99f4f4aa-2f14-4bf9-b8a7-da1480e9e168))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 286a9e39-c26f-49c3-809f-c04839a4ac04))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 5696a53f-2631-4279-8564-21adeaab997c))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 706bece9-b980-4420-a866-a63a48a63c89))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid f57b03a6-125b-453a-8f2a-24b446ebba66))
+  )
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid eece7241-cf79-4005-a419-afcb7ea2f1aa)
+    (at 90.5 135.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr smd board_only exclude_from_pos_files)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 8b664cd6-f39e-4636-850d-30ba11a608d8)
+    )
+    (fp_text value "Test_Footprint" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid eba6f904-5352-4ca5-9d68-7095d5553d23)
+    )
+    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
+      (effects (font (size 0.5 0.5) (thickness 0.1)))
+      (uuid 6995beeb-7854-4705-ae35-78174cb5e8c5)
+    )
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 03590f33-763d-44e7-bd58-7b869bb7ef20))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 20cc5dd3-f607-44c7-ac7e-e7aebd9790dd))
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 26aff78d-1dc4-4822-8817-49ee707b8453))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 3a013e8f-5b12-499b-8d2d-0ad49966db1a))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 58b75830-9e39-45c9-8547-367ebee8a907))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 66f97120-6c7e-441a-9997-acbf3e610e6e))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7b32ef33-8c7b-417f-9260-1a8773398f8f))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 97208e50-b896-4df8-8da4-ea2fc6b46da5))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid d92cfbfa-da4b-4f63-8ad6-7bb6977d4f44))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid e6a27cb0-d090-4b8c-9a7b-e787b9ea11b6))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 07b7ccce-8895-49f2-b220-e85ac43040b1))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 65d50500-96c3-4685-9691-5f83fde7ff57))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 7850e091-0fbf-4f7c-a328-cd019df441e0))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 8fac398c-22c9-4741-a001-aab7ea92da04))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid bcd9d733-3cca-4780-8540-cda4d5f83456))
+  )
+
+  (gr_text "+ / + / +" (at 75 150) (layer "F.Cu") (uuid 03b7ea59-04ff-4bfc-a26f-17e4b04b9d62)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "+ / + / -" (at 75 135) (layer "F.Cu") (uuid 0bc45e0a-f3b4-457e-8294-593a75a7697d)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "- / - / +" (at 75 60) (layer "F.Cu") (uuid 19cf3f75-846d-40c4-99e9-986cfa896c10)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "- / - / -" (at 75 45) (layer "F.Cu") (uuid 3cd62bef-586b-4354-a0d8-b45f0b86f8d4)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "Footprint Type\nOther" (at 180 30) (layer "F.Cu") (uuid 5e01567b-a9f5-4f86-b76a-2572d29d2d44)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "Tests all manufacturing attribute\ncombinations possible" (at 45 25) (layer "F.Cu") (uuid 6bde0840-e503-4c9f-a8c0-10fd7be12888)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "+ / - / +" (at 75 120) (layer "F.Cu") (uuid 6ee20d1c-a46d-41e5-9769-e0e93e111749)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "- / + / -" (at 75 75) (layer "F.Cu") (uuid 7d7dfbee-e276-47ab-a29b-12b4be9b22c4)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "+ / - / -" (at 75 105) (layer "F.Cu") (uuid 80e098c7-ff0f-40d9-839f-9ee0ada137c7)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "Footprint Type\nSMD" (at 100 30) (layer "F.Cu") (uuid aff48226-032f-4dae-a36a-f783c883d29a)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "Footprint Type\nTHT" (at 140 30) (layer "F.Cu") (uuid b576af53-9779-4b42-bea4-4d91783d8c4b)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "- / + / +" (at 75 90) (layer "F.Cu") (uuid db3f768b-4ec7-4178-b70b-b4b036c84502)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (gr_text "Attributes" (at 75 37.5) (layer "F.Cu") (uuid e0ff723e-9da4-419a-9b7c-537137a1c661)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+
+)
diff --git a/tests/testdata/board/test_boardStackup32LayerDielectricsVias b/tests/testdata/board/test_boardStackup32LayerDielectricsVias
new file mode 100644
index 0000000..d2822a4
--- /dev/null
+++ b/tests/testdata/board/test_boardStackup32LayerDielectricsVias
@@ -0,0 +1,302 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 1.584757)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (1 "In1.Cu" signal)
+    (2 "In2.Cu" signal)
+    (3 "In3.Cu" signal)
+    (4 "In4.Cu" signal)
+    (5 "In5.Cu" signal)
+    (6 "In6.Cu" signal)
+    (7 "In7.Cu" signal)
+    (8 "In8.Cu" signal)
+    (9 "In9.Cu" signal)
+    (10 "In10.Cu" signal)
+    (11 "In11.Cu" signal)
+    (12 "In12.Cu" signal)
+    (13 "In13.Cu" signal)
+    (14 "In14.Cu" signal)
+    (15 "In15.Cu" signal)
+    (16 "In16.Cu" signal)
+    (17 "In17.Cu" signal)
+    (18 "In18.Cu" signal)
+    (19 "In19.Cu" signal)
+    (20 "In20.Cu" signal)
+    (21 "In21.Cu" signal)
+    (22 "In22.Cu" signal)
+    (23 "In23.Cu" signal)
+    (24 "In24.Cu" signal)
+    (25 "In25.Cu" signal)
+    (26 "In26.Cu" signal)
+    (27 "In27.Cu" signal)
+    (28 "In28.Cu" signal)
+    (29 "In29.Cu" signal)
+    (30 "In30.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (stackup
+      (layer "F.SilkS" (type "Top Silk Screen"))
+      (layer "F.Paste" (type "Top Solder Paste"))
+      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
+      (layer "F.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 1" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
+        addsublayer (thickness 0.014347)
+        addsublayer (thickness 0.014347) (material "Ceramic") (epsilon_r 1) (loss_tangent 0)
+        addsublayer (thickness 0.014347) (material "Teflon") (epsilon_r 2.1) (loss_tangent 0.0002)
+        addsublayer (thickness 0.014347) (material "PTFE") (epsilon_r 2.1) (loss_tangent 0.0002)
+        addsublayer (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
+        addsublayer (thickness 0.014347) (material "FR408-HR") (epsilon_r 3.69) (loss_tangent 0.0091)
+        addsublayer (thickness 0.014347) (material "Polyimide") (epsilon_r 3.2) (loss_tangent 0.004)
+        addsublayer (thickness 0.014347) (material "Kapton") (epsilon_r 3.2) (loss_tangent 0.004)
+        addsublayer (thickness 0.014347) (material "Polyolefin") (epsilon_r 1) (loss_tangent 0)
+        addsublayer (thickness 0.014347) (material "Al") (epsilon_r 8.7) (loss_tangent 0.001))
+      (layer "In1.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 2" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In2.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 3" (type "core") (thickness 0.014347) (material "FR408-HR") (epsilon_r 3.69) (loss_tangent 0.0091))
+      (layer "In3.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 4" (type "core") (thickness 0.014347) (material "Polyimide") (epsilon_r 3.2) (loss_tangent 0.004))
+      (layer "In4.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 5" (type "core") (thickness 0.014347) (material "Kapton") (epsilon_r 3.2) (loss_tangent 0.004))
+      (layer "In5.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 6" (type "prepreg") (thickness 0.014347) (material "Polyolefin") (epsilon_r 1) (loss_tangent 0))
+      (layer "In6.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 7" (type "core") (thickness 0.014347) (material "Al") (epsilon_r 8.7) (loss_tangent 0.001))
+      (layer "In7.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 8" (type "prepreg") (thickness 0.014347) (material "PTFE") (epsilon_r 2.1) (loss_tangent 0.0002))
+      (layer "In8.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 9" (type "core") (thickness 0.014347) (material "Teflon") (epsilon_r 2.1) (loss_tangent 0.0002))
+      (layer "In9.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 10" (type "prepreg") (thickness 0.014347) (material "Ceramic") (epsilon_r 1) (loss_tangent 0))
+      (layer "In10.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 11" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In11.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 12" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In12.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 13" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In13.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 14" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In14.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 15" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
+        addsublayer (thickness 0.014347))
+      (layer "In15.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 16" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In16.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 17" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In17.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 18" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
+        addsublayer (thickness 0.014347)
+        addsublayer (thickness 0.014347)
+        addsublayer (thickness 0.014347))
+      (layer "In18.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 19" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)
+        addsublayer (thickness 0.014347))
+      (layer "In19.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 20" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In20.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 21" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In21.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 22" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In22.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 23" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In23.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 24" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In24.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 25" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In25.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 26" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In26.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 27" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In27.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 28" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In28.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 29" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In29.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 30" (type "prepreg") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In30.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 31" (type "core") (thickness 0.014347) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "B.Cu" (type "copper") (thickness 0.035))
+      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
+      (layer "B.Paste" (type "Bottom Solder Paste"))
+      (layer "B.SilkS" (type "Bottom Silk Screen"))
+      (copper_finish "None")
+      (dielectric_constraints yes)
+    )
+    (pad_to_mask_clearance 0)
+    (pcbplotparams
+      (layerselection 0x00010fc_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes true)
+      (usegerberadvancedattributes true)
+      (creategerberjobfile true)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer true)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 15.000000)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 1)
+      (mirror false)
+      (drillshape 1)
+      (scaleselection 1)
+      (outputdirectory "")
+    )
+  )
+
+  (net 0 "")
+
+  (gr_rect (start 114.7 121) (end 190.65 45.05) (layer "Edge.Cuts") (width 0.1) (fill none) (uuid 2f680110-9ea0-4f48-b5a6-990648d3cde2))
+  (gr_text "Test: 32layer with vias, all stackup options" (at 152.95 118.75) (layer "Cmts.User") (uuid 234e1024-0b7f-410c-90bb-bae43af1eb25)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+
+  (segment (start 144.7 59.75) (end 137.3 59.75) (width 0.25) (layer "F.Cu") (net 0) (uuid 5eac54c5-305d-41d6-8b17-f9ef74142fc5))
+  (segment (start 145.15 60.2) (end 144.7 59.75) (width 0.25) (layer "F.Cu") (net 0) (uuid 685bf253-7e51-40ec-8d43-57d69d12e5e2))
+  (via (at 153.5 64.65) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 1e3639f5-e7e3-4694-9294-3921c4c3d8d8))
+  (via (at 156.2 55.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 220ae943-0254-4741-8fa8-609b50152f00))
+  (via (at 164 58.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 2ba79d5f-5977-4383-8973-1b3369469cc2))
+  (via (at 145.15 60.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 2eae7d9d-0d7d-4755-80a4-ff458c263895))
+  (via (at 168.5 62.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 31fa6d01-f08a-43ea-8ee1-231130e6a24b))
+  (via (at 149.3 62.7) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 450796ed-160e-4912-8510-5adfc8f1a2f5))
+  (via (at 153.9 59.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 4a1889be-7ec6-405b-ae5a-773fc21e97e9))
+  (via (at 151.6 54.35) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 57720542-bdde-4812-ae04-f6c39f4da1e5))
+  (via (at 154.55 57.7) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 5b939979-83f4-492c-9866-1d110eaa3f6d))
+  (via (at 162.95 67.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 5c4ef3fb-31b1-4cc2-b877-62be82f2b495))
+  (via (at 165.1 63.65) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 5e906fab-cbda-4297-8a09-9e12dae7620b))
+  (via (at 156 65.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 6483a61d-b10a-47a8-8abb-aca573d14ee8))
+  (via (at 152.05 56.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 724c973a-b963-461f-871b-611c05be41a1))
+  (via (at 169.85 65.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 79e2f0c8-67c7-4822-912a-bfefb7447fda))
+  (via (at 158.15 58.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 836aa7f5-ce01-4f10-a876-590770e0c112))
+  (via (at 168.3 67.95) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 854c27b1-9f79-4add-b6f5-27fba8034c5b))
+  (via (at 148.45 55.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 88b32a43-2aa8-4784-ba7a-1ffdefcc0b42))
+  (via (at 147.65 61.1) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 8ebf6100-3981-45dc-a269-6504480f2134))
+  (via (at 148.15 57.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 90d375ea-7f4d-4536-858b-4b9304172f6b))
+  (via (at 162.1 60.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 925aa975-acb4-40c2-9c04-99557189f722))
+  (via (at 159.05 63.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 993ff105-4d18-4c9e-91c5-e8c562468585))
+  (via (at 166.5 60.25) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid 9fa95695-028d-49e5-b6f4-7e3b558d3e99))
+  (via (at 165.65 66.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid a12ccdb6-3679-4846-a6aa-1c003e3aea6b))
+  (via (at 151.15 63.5) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid aed52a1c-d78d-4328-9a5b-0dae9cca9894))
+  (via (at 160.85 68.6) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid b2d2c42f-0606-483f-b2ca-07b067e11e4c))
+  (via (at 155.8 62.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid cca20c0e-4dd8-43e2-8d36-77b8f7eb2b62))
+  (via (at 151.9 59.45) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid d610351c-a190-40a1-99e0-2223063accfd))
+  (via (at 160.25 56.4) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid f2432da9-7fb9-4817-b2fc-dc1f41d2c4ed))
+  (via (at 161.85 64.9) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid f525c2ca-e7ba-4514-91bc-134c7eeb6847))
+  (via (at 158.65 67.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0) (uuid f7a08f47-28a3-4664-b73f-efd412909c91))
+  (segment (start 146.75 60.2) (end 147.65 61.1) (width 0.25) (layer "In1.Cu") (net 0) (uuid 03180fc3-312d-4869-989b-36a0aa8fbbab))
+  (segment (start 145.15 60.2) (end 146.75 60.2) (width 0.25) (layer "In1.Cu") (net 0) (uuid 2da0c218-f525-488e-ae52-b37371a9c8c4))
+  (segment (start 147.65 61.1) (end 147.7 61.1) (width 0.25) (layer "In2.Cu") (net 0) (uuid 6911136d-fdd3-47b3-b66b-8d24bb74a91c))
+  (segment (start 147.7 61.1) (end 149.3 62.7) (width 0.25) (layer "In2.Cu") (net 0) (uuid b1bbf5fc-248f-4f6e-a178-1cd932e30d02))
+  (segment (start 149.3 62.7) (end 150.35 62.7) (width 0.25) (layer "In3.Cu") (net 0) (uuid 731de235-0a1b-4129-aca9-586f376a2413))
+  (segment (start 150.35 62.7) (end 151.15 63.5) (width 0.25) (layer "In3.Cu") (net 0) (uuid f241e0ee-d3d0-4acb-927b-10754037fbc9))
+  (segment (start 153.35 64.45) (end 153.5 64.6) (width 0.25) (layer "In4.Cu") (net 0) (uuid 274414ab-1890-467f-a7af-4d612100a2a6))
+  (segment (start 153.5 64.6) (end 153.5 64.65) (width 0.25) (layer "In4.Cu") (net 0) (uuid 5732fe89-5269-4719-98b5-f2ef3f341659))
+  (segment (start 152.4 63.5) (end 153.35 64.45) (width 0.25) (layer "In4.Cu") (net 0) (uuid 5740f5f1-37d4-456c-875e-9ebb35ecd00c))
+  (segment (start 151.15 63.5) (end 152.4 63.5) (width 0.25) (layer "In4.Cu") (net 0) (uuid ff9989c6-7a02-4da9-9a30-c5fc15f960c5))
+  (segment (start 154.7 64.65) (end 156 65.95) (width 0.25) (layer "In6.Cu") (net 0) (uuid 87b77cd9-8a80-463a-8114-083d84bc0705))
+  (segment (start 153.5 64.65) (end 154.7 64.65) (width 0.25) (layer "In6.Cu") (net 0) (uuid e2b3c6db-26a0-4a0f-91e3-f3850153add5))
+  (segment (start 157.55 65.95) (end 158.65 67.05) (width 0.25) (layer "In7.Cu") (net 0) (uuid 4f4ed3ff-b7e3-455c-be2d-f1d3c4be2168))
+  (segment (start 156 65.95) (end 157.55 65.95) (width 0.25) (layer "In7.Cu") (net 0) (uuid d375f196-6f2b-4a02-b59f-0abcafe1e5a7))
+  (segment (start 158.65 67.05) (end 160.2 68.6) (width 0.25) (layer "In8.Cu") (net 0) (uuid 3df43fbc-36ba-406a-97a8-4326d8392fc2))
+  (segment (start 160.2 68.6) (end 160.85 68.6) (width 0.25) (layer "In8.Cu") (net 0) (uuid 5cca554f-4493-4aeb-a530-f254ededae9e))
+  (segment (start 161.4 68.6) (end 162.95 67.05) (width 0.25) (layer "In9.Cu") (net 0) (uuid 136f24ab-7b8a-4b96-87e9-b51854289072))
+  (segment (start 160.85 68.6) (end 161.4 68.6) (width 0.25) (layer "In9.Cu") (net 0) (uuid faa455ea-93b0-4a12-9af2-c32e7eee6d37))
+  (segment (start 162.95 66) (end 161.85 64.9) (width 0.25) (layer "In10.Cu") (net 0) (uuid 63f4f2c3-230e-4140-b561-60dc7b883135))
+  (segment (start 162.95 67.05) (end 162.95 66) (width 0.25) (layer "In10.Cu") (net 0) (uuid db661329-9c51-496c-9e62-370ebf0236be))
+  (segment (start 161.85 64.9) (end 160.15 63.2) (width 0.25) (layer "In11.Cu") (net 0) (uuid 86819d76-65c8-4796-96b4-d5a97cd6067b))
+  (segment (start 160.15 63.2) (end 159.05 63.2) (width 0.25) (layer "In11.Cu") (net 0) (uuid f79600f0-8aca-4c42-bd73-ad5321120380))
+  (segment (start 159.05 63.2) (end 158 62.15) (width 0.25) (layer "In12.Cu") (net 0) (uuid 4defc198-fb73-4f9a-8a9d-cd22f4be094e))
+  (segment (start 158 62.15) (end 155.8 62.15) (width 0.25) (layer "In12.Cu") (net 0) (uuid b83aa53f-6f3f-48bf-b41f-2e5458df2888))
+  (segment (start 155.8 61.85) (end 153.9 59.95) (width 0.25) (layer "In13.Cu") (net 0) (uuid cd5690a3-890c-4d22-9010-3d73ae7c1982))
+  (segment (start 155.8 62.15) (end 155.8 61.85) (width 0.25) (layer "In13.Cu") (net 0) (uuid ff164f5f-b65f-4b7d-ba28-85fe41257652))
+  (segment (start 153.9 58.35) (end 154.5 57.75) (width 0.25) (layer "In14.Cu") (net 0) (uuid 4175c327-a7fe-4d84-ba69-9ba6e02c58fb))
+  (segment (start 154.5 57.75) (end 154.55 57.7) (width 0.25) (layer "In14.Cu") (net 0) (uuid a4c2edd2-4235-4d48-bf1f-9b46ae9e7214))
+  (segment (start 153.9 59.95) (end 153.9 58.35) (width 0.25) (layer "In14.Cu") (net 0) (uuid f25081e3-594c-4e20-a3a0-8c78739d4347))
+  (segment (start 154.55 57.7) (end 157.6 57.7) (width 0.25) (layer "In15.Cu") (net 0) (uuid 067e1f81-db05-4864-9809-2651e108d482))
+  (segment (start 157.6 57.7) (end 158.15 58.25) (width 0.25) (layer "In15.Cu") (net 0) (uuid 6f4bf812-138c-435a-8325-99bdfcb7fb2e))
+  (segment (start 160.25 58.25) (end 161.25 59.25) (width 0.25) (layer "In16.Cu") (net 0) (uuid 18db2e23-c07f-425e-8626-59b05d187cdb))
+  (segment (start 161.25 59.25) (end 162.05 60.05) (width 0.25) (layer "In16.Cu") (net 0) (uuid 6b483d33-c0bf-448c-b303-85c0149143f3))
+  (segment (start 158.15 58.25) (end 160.25 58.25) (width 0.25) (layer "In16.Cu") (net 0) (uuid c1b00961-3b9d-43ec-8cf1-783520d22caf))
+  (segment (start 162.05 60.05) (end 162.1 60.05) (width 0.25) (layer "In16.Cu") (net 0) (uuid f4b00c54-9ad1-49cc-a893-af751b7bbde3))
+  (segment (start 162.6 60.05) (end 164.6 62.05) (width 0.25) (layer "In17.Cu") (net 0) (uuid 06d2d69f-d8bf-4375-b5cb-db5a5577fb80))
+  (segment (start 164.6 62.05) (end 165.1 62.55) (width 0.25) (layer "In17.Cu") (net 0) (uuid 2a66e9ef-e8ab-4c4d-87c1-6f2381e86cbc))
+  (segment (start 162.1 60.05) (end 162.6 60.05) (width 0.25) (layer "In17.Cu") (net 0) (uuid 5f88dafe-e614-4523-9531-1af57eb8ba33))
+  (segment (start 165.1 62.55) (end 165.1 63.65) (width 0.25) (layer "In17.Cu") (net 0) (uuid 72cfee45-fa9b-45ce-b9fa-cc4411a7e95d))
+  (segment (start 165.1 63.65) (end 165.65 64.2) (width 0.25) (layer "In18.Cu") (net 0) (uuid 103a284d-ee0f-4a43-aeda-897caf2e8367))
+  (segment (start 165.65 64.2) (end 165.65 66.75) (width 0.25) (layer "In18.Cu") (net 0) (uuid bc663e7e-08a9-4a6b-8220-6d0f3194a366))
+  (segment (start 166.85 67.95) (end 168.3 67.95) (width 0.25) (layer "In19.Cu") (net 0) (uuid 2f28b0db-d4f5-43f6-9931-bc649cfd4f51))
+  (segment (start 165.65 66.75) (end 166.85 67.95) (width 0.25) (layer "In19.Cu") (net 0) (uuid 6ff25e28-6290-4c29-a474-b6a86c1058fa))
+  (segment (start 169.85 66.4) (end 169.85 65.75) (width 0.25) (layer "In20.Cu") (net 0) (uuid 65ed6649-7f77-42ba-8364-96e8d5d3ec59))
+  (segment (start 168.3 67.95) (end 169.85 66.4) (width 0.25) (layer "In20.Cu") (net 0) (uuid e5c3f5b3-a5f3-46be-9b89-679fc8febc4b))
+  (segment (start 169.85 64.15) (end 168.5 62.8) (width 0.25) (layer "In21.Cu") (net 0) (uuid 6f351650-f7b7-4858-94c3-8f05440b4c8e))
+  (segment (start 169.85 65.75) (end 169.85 64.15) (width 0.25) (layer "In21.Cu") (net 0) (uuid adc472b6-4ccf-4707-a522-ea736bab0160))
+  (segment (start 168.5 62.8) (end 166.5 60.8) (width 0.25) (layer "In22.Cu") (net 0) (uuid c8f58c2d-07ec-4355-92b4-a1615dc2f910))
+  (segment (start 166.5 60.8) (end 166.5 60.25) (width 0.25) (layer "In22.Cu") (net 0) (uuid f94a9243-578c-48e9-80e5-08059b48ed8f))
+  (segment (start 166.05 60.25) (end 164 58.2) (width 0.25) (layer "In23.Cu") (net 0) (uuid 2c44890e-4662-4746-a19e-78e2193fd9f2))
+  (segment (start 166.5 60.25) (end 166.05 60.25) (width 0.25) (layer "In23.Cu") (net 0) (uuid 74e4453c-acbd-445e-81b1-19ce1f70bca9))
+  (segment (start 164 58.2) (end 162.2 56.4) (width 0.25) (layer "In24.Cu") (net 0) (uuid 0c926f8b-4916-443b-b8d5-b5866414d198))
+  (segment (start 162.2 56.4) (end 160.25 56.4) (width 0.25) (layer "In24.Cu") (net 0) (uuid f6dfbb3b-b43f-42d3-96ef-f25f5dec1e4e))
+  (segment (start 159.6 55.75) (end 156.2 55.75) (width 0.25) (layer "In25.Cu") (net 0) (uuid bb715cff-2ca3-46b1-abaa-1d9fa4c43041))
+  (segment (start 160.25 56.4) (end 159.6 55.75) (width 0.25) (layer "In25.Cu") (net 0) (uuid ee1ec701-2df3-4881-b756-1b8be0691e2c))
+  (segment (start 156.2 55.75) (end 152.55 55.75) (width 0.25) (layer "In26.Cu") (net 0) (uuid 7121bed1-5309-4e64-a00e-2832628aef31))
+  (segment (start 152.55 55.75) (end 152.05 56.25) (width 0.25) (layer "In26.Cu") (net 0) (uuid 94b2fe74-b15f-4aa7-83b4-ef7298874c10))
+  (segment (start 152.05 59.3) (end 151.9 59.45) (width 0.25) (layer "In27.Cu") (net 0) (uuid 065d0979-edbd-499d-acf7-48acd2b15b4e))
+  (segment (start 152.05 56.25) (end 152.05 59.3) (width 0.25) (layer "In27.Cu") (net 0) (uuid a3fb90e3-ac89-447a-8b70-fc5712ec8136))
+  (segment (start 149.8 59.45) (end 148.15 57.8) (width 0.25) (layer "In28.Cu") (net 0) (uuid 067a4748-f609-4499-b85b-6eef639d260e))
+  (segment (start 151.9 59.45) (end 149.8 59.45) (width 0.25) (layer "In28.Cu") (net 0) (uuid a8c4cc10-c733-4c4d-841f-01c8a6a861e8))
+  (segment (start 148.15 57.8) (end 148.15 55.45) (width 0.25) (layer "In29.Cu") (net 0) (uuid a22ef832-33fc-4544-9dac-b6ed3c7ca675))
+  (segment (start 148.15 55.45) (end 148.45 55.15) (width 0.25) (layer "In29.Cu") (net 0) (uuid e7b1a473-dadf-489b-a0f8-58c84c047f98))
+  (segment (start 150.8 55.15) (end 151.6 54.35) (width 0.25) (layer "In30.Cu") (net 0) (uuid c9b3d24b-4abb-43e2-ae80-4d577887d84a))
+  (segment (start 148.45 55.15) (end 150.8 55.15) (width 0.25) (layer "In30.Cu") (net 0) (uuid d30d9ed3-c9de-4a8d-a687-0b172219a5f4))
+  (segment (start 153.2 52.75) (end 154.4 52.75) (width 0.25) (layer "B.Cu") (net 0) (uuid 2c186cbf-9cac-4388-adb2-6d310baf89db))
+  (segment (start 151.6 54.35) (end 153.2 52.75) (width 0.25) (layer "B.Cu") (net 0) (uuid 728c79e9-5768-4bc5-81e1-e9810ba43862))
+
+)
diff --git a/tests/testdata/board/test_boardTraceArcs b/tests/testdata/board/test_boardTraceArcs
new file mode 100644
index 0000000..4275a6d
--- /dev/null
+++ b/tests/testdata/board/test_boardTraceArcs
@@ -0,0 +1,397 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+    (pcbplotparams
+      (layerselection 0x00010fc_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes true)
+      (usegerberadvancedattributes true)
+      (creategerberjobfile true)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer true)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 15.000000)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 1)
+      (mirror false)
+      (drillshape 1)
+      (scaleselection 1)
+      (outputdirectory "")
+    )
+  )
+
+  (net 0 "")
+  (net 1 "TEST_N")
+  (net 2 "TEST_P")
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid a6a16e4a-47c2-4244-ba11-78b40782f3f4)
+    (at 73.5 110.75)
+    (descr "PCIexpress Bus Edge Connector x1 http://www.ritrontek.com/uploadfile/2016/1026/20161026105231124.pdf#page=70")
+    (tags "PCIe")
+    (attr exclude_from_pos_files exclude_from_bom)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+    (fp_text user "PCB Thickness 1.57 mm" (at 5 2.8 180) (layer "Cmts.User")
+      (effects (font (size 0.5 0.5) (thickness 0.1)))
+      (uuid 5886e575-b80c-446f-a435-0b4c9526c94e)
+    )
+    (fp_text user "${REFERENCE}" (at 16 -3.5) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid e8ae8aa2-6c83-4751-87be-af18c04f637b)
+    )
+    (fp_line (start 10.55 -4) (end 10.55 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 0978854b-7f2d-4e70-81ad-b8366855ab91))
+    (fp_line (start 19.65 2.95) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 36570266-ac30-48fb-a957-d39c502c9460))
+    (fp_line (start 12.45 -4) (end 12.45 2.95) (layer "Edge.Cuts") (width 0.1) (uuid 520ddf64-73f0-4767-8391-a2c8400d2889))
+    (fp_line (start -0.15 3.45) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 61a51970-fbbc-4b1e-a7ae-feb21648f6ac))
+    (fp_line (start 12.95 3.45) (end 19.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 6f6fc535-e6ac-4715-a245-11d18639fbe6))
+    (fp_line (start 12.45 2.95) (end 12.95 3.45) (layer "Edge.Cuts") (width 0.1) (uuid 7807c7b7-7ef2-4f78-b820-a3d80a6a5558))
+    (fp_line (start 19.65 -4.95) (end 19.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid ab5fd570-a8ed-41be-bdc9-9bca7f01f72f))
+    (fp_line (start -0.65 -4.95) (end -0.65 2.95) (layer "Edge.Cuts") (width 0.1) (uuid b2b23386-d0d5-4278-8953-0c9c0e5e73f7))
+    (fp_line (start -0.65 2.95) (end -0.15 3.45) (layer "Edge.Cuts") (width 0.1) (uuid cdbebb5e-a816-472c-9169-2f89317f1f2a))
+    (fp_line (start 10.55 2.95) (end 10.05 3.45) (layer "Edge.Cuts") (width 0.1) (uuid df8ca82e-d7eb-4065-8722-73c6f9311432))
+    (fp_arc (start 10.55 -4) (mid 11.5 -4.95) (end 12.45 -4) (layer "Edge.Cuts") (width 0.1) (uuid 91696539-77c4-4a75-8e58-8ed056557991))
+    (fp_line (start 20.15 3.95) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 48ced388-1009-47c0-9121-927d687fa0e0))
+    (fp_line (start -1.15 -5.45) (end -1.15 3.95) (layer "F.CrtYd") (width 0.05) (uuid 743d8da9-eb43-4371-8313-505007abb989))
+    (fp_line (start -1.15 -5.45) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid 973b69bd-3173-4927-bd5c-d73e14d856a7))
+    (fp_line (start 20.15 3.95) (end 20.15 -5.45) (layer "F.CrtYd") (width 0.05) (uuid f220da3f-d9e9-4b5a-81e2-bb395123fe5f))
+    (pad "A1" connect rect locked (at 0 -0.55) (size 0.7 3.2) (layers "B.Cu" "B.Mask") (uuid de88ea3f-d699-4a70-9d06-d3f653a880a1))
+    (pad "A2" connect rect locked (at 1 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid e408af70-9a3d-4b30-a91f-1a69c4a24a80))
+    (pad "A3" connect rect locked (at 2 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid c5d90d50-8815-42b3-bdfe-855c387da089))
+    (pad "A4" connect rect locked (at 3 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 63622b85-ffc5-43a3-94fb-f01b29a8acd4))
+    (pad "A5" connect rect locked (at 4 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 66bacf32-932b-40ed-a996-33703e38cc32))
+    (pad "A6" connect rect locked (at 5 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 0963774c-b376-4594-a90e-ed8e9692b9ea))
+    (pad "A7" connect rect locked (at 6 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid aa662617-353d-45f8-8bab-007a7f6b3467))
+    (pad "A8" connect rect locked (at 7 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid de853116-f19f-4819-861d-91762ab22b12))
+    (pad "A9" connect rect locked (at 8 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid c7c0e390-c203-4145-83d2-d45b2a38bf27))
+    (pad "A10" connect rect locked (at 9 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 482345a1-5db6-4976-998d-99689809f8b9))
+    (pad "A11" connect rect locked (at 10 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 708ae4a5-cc3f-4ad0-be7f-b39e38a69ee8))
+    (pad "A12" connect rect locked (at 13 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 82e0154d-bac7-4cee-a21e-0b2c2ee07d0b))
+    (pad "A13" connect rect locked (at 14 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 76fc4407-90fd-4aaf-98db-fa3f5f5824d3))
+    (pad "A14" connect rect locked (at 15 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid cfa6ece6-c4c2-463e-8243-39f87684a7cc))
+    (pad "A15" connect rect locked (at 16 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid 2b94326e-f7bf-4dbf-8a23-87f97d0455b1))
+    (pad "A16" connect rect locked (at 17 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid e73ce984-61c1-440b-8d6a-e6928e7cdf0d))
+    (pad "A17" connect rect locked (at 18 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid c1819ec4-16c4-4ca2-a3c6-660ab0af6d34))
+    (pad "A18" connect rect locked (at 19 0) (size 0.7 4.3) (layers "B.Cu" "B.Mask") (uuid bd8ee00d-ca1d-429c-904e-a26bd6cdb80f))
+    (pad "B1" connect rect locked (at 0 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 19a4e55b-bef5-4b8e-a8cb-f21d84bcf738))
+    (pad "B2" connect rect locked (at 1 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 1dd7e11e-43e2-490d-b80a-72ae7a1e8bc8))
+    (pad "B3" connect rect locked (at 2 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid c43cbf1b-8636-4086-a009-2ead27837232))
+    (pad "B4" connect rect locked (at 3 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid eafafa71-871e-4e08-a0ad-415cc5927655))
+    (pad "B5" connect rect locked (at 4 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 5012e427-2605-4ef6-8acf-e8763ef0a984))
+    (pad "B6" connect rect locked (at 5 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 7f280c56-2afd-45c5-b3ee-e6225c105eda))
+    (pad "B7" connect rect locked (at 6 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid c1344181-1d9e-48c4-b279-ab0e274e51f6))
+    (pad "B8" connect rect locked (at 7 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid c358d6d3-3fc1-4255-889b-dd8456b5bf5d))
+    (pad "B9" connect rect locked (at 8 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid b0901133-9ac8-4fae-b1c3-23a5c59648f4))
+    (pad "B10" connect rect locked (at 9 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 76f0ae03-8a81-4e03-82cc-697b8a2d3dc9))
+    (pad "B11" connect rect locked (at 10 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 4a6f7f58-ffa1-4ce0-84a4-a43028bdaf25))
+    (pad "B12" connect rect locked (at 13 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 9608f371-5068-4dfe-bc11-cbcdf54d5e25))
+    (pad "B13" connect rect locked (at 14 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid d9ecd9ae-ef0a-439f-b17a-557e46b82925))
+    (pad "B14" connect rect locked (at 15 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask")
+      (net 1 "TEST_N") (uuid 50b3c388-70c2-40f0-bcab-91360d921fbd))
+    (pad "B15" connect rect locked (at 16 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask")
+      (net 2 "TEST_P") (uuid 56d30706-3bc3-4351-80e6-e342c04c34e6))
+    (pad "B16" connect rect locked (at 17 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 6ff6dbdb-8494-4d96-9edf-cb4316c92b89))
+    (pad "B17" connect rect locked (at 18 -0.55) (size 0.7 3.2) (layers "F.Cu" "F.Mask") (uuid a3299ab5-3dc3-46bd-84ec-03bef122851b))
+    (pad "B18" connect rect locked (at 19 0) (size 0.7 4.3) (layers "F.Cu" "F.Mask") (uuid 1c359650-9720-4ff5-b7eb-b9ba37db5887))
+  )
+
+  (segment (start 79.575 85.25) (end 79.575 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid 1f70f301-365b-4bf3-883c-59357e017501))
+  (segment (start 77.625 85.847553) (end 77.625 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 3134b71b-94df-4d19-a697-2cd2ff759022))
+  (segment (start 81.525 85.847553) (end 81.525 85.575) (width 0.25) (layer "F.Cu") (net 0) (uuid 5d09d6c7-c8e2-47a4-9a31-bc7069da0fda))
+  (segment (start 78.925 85.847553) (end 78.925 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 66f6c454-1819-42e3-98dd-fb819b52f248))
+  (segment (start 80.225 85.847553) (end 80.225 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 72e72cc1-10bf-4bad-8b18-04e994c8c31d))
+  (segment (start 81.85 85.25) (end 86.5 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 74773e57-ce2a-4420-b5af-ba52c5ad2f54))
+  (segment (start 77.625 85.25) (end 77.625 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid 7b1c3ce2-19ed-4193-a707-747b919e6b12))
+  (segment (start 76.975 84.925) (end 76.975 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid 8849523f-7a7f-4ff3-9ba1-4622e67251c7))
+  (segment (start 76.975 84.652447) (end 76.975 84.925) (width 0.25) (layer "F.Cu") (net 0) (uuid 89bab1ec-7b06-4cde-aad6-c05ecfe09008))
+  (segment (start 90.85 89.6) (end 93.15 89.6) (width 0.25) (layer "F.Cu") (net 0) (uuid 8f4e3db5-05f0-4080-87ad-27c79291edcf))
+  (segment (start 97.5 85.25) (end 99.8 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 99f32141-9573-4c1d-adc2-894e0513462c))
+  (segment (start 80.875 85.25) (end 80.875 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid 9d3545bb-4848-4d9f-a3e2-b087c5a7b710))
+  (segment (start 66.5 85.25) (end 76 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid aa402c32-bc32-4c87-8324-7695fad8e379))
+  (segment (start 99.8 85.25) (end 154.25 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid ac9969d1-3a18-4e1a-92dd-1c23de623e5e))
+  (segment (start 78.275 84.652447) (end 78.275 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid d45298b6-27af-4d03-bace-df63014b28a0))
+  (segment (start 78.275 85.25) (end 78.275 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid e0578357-4dd3-4a10-b08b-9f0eb05be146))
+  (segment (start 80.875 84.652447) (end 80.875 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid e0c87e08-6f21-440c-ae07-39c8087e28b9))
+  (segment (start 79.575 84.652447) (end 79.575 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid e25b0f05-f1d8-4137-9ec4-3f98aeb0c3ca))
+  (segment (start 80.225 85.25) (end 80.225 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid f1878df8-3f7d-4948-9a45-bfaee4115961))
+  (segment (start 76.325 84.925) (end 76.325 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid f1dbc5df-b393-4115-8517-40dcc9e91ecf))
+  (segment (start 78.925 85.25) (end 78.925 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid f651eb1d-6032-4461-a4c6-b3851a4abb2c))
+  (arc (start 78.6 86.172553) (mid 78.82981 86.077363) (end 78.925 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid 052e1588-3d10-4882-8522-7ef5c69d2fb5))
+  (arc (start 79.25 84.327447) (mid 79.47981 84.422637) (end 79.575 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid 10f4b14f-a3f2-45ee-990e-884505edc545))
+  (arc (start 77.3 86.172553) (mid 77.52981 86.077363) (end 77.625 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid 1a4b5e66-99ad-408b-8389-f20db8ca9b26))
+  (arc (start 77.625 84.652447) (mid 77.72019 84.422637) (end 77.95 84.327447) (width 0.25) (layer "F.Cu") (net 0) (uuid 27105bf6-d25e-43b2-9995-951213911b71))
+  (arc (start 93.15 89.6) (mid 94.687957 88.962957) (end 95.325 87.425) (width 0.25) (layer "F.Cu") (net 0) (uuid 28f56bd3-9283-48fb-83c0-7e3c278ab060))
+  (arc (start 88.675 87.425) (mid 89.312043 88.962957) (end 90.85 89.6) (width 0.25) (layer "F.Cu") (net 0) (uuid 2c8e825d-6b3d-41c0-a78b-d002906b71c4))
+  (arc (start 76.325 84.652447) (mid 76.42019 84.422637) (end 76.65 84.327447) (width 0.25) (layer "F.Cu") (net 0) (uuid 3e36ab66-1e68-4565-b340-48ef54c5f43a))
+  (arc (start 80.55 84.327447) (mid 80.77981 84.422637) (end 80.875 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid 3f8abd62-9048-4be2-be46-7f58d9159afa))
+  (arc (start 80.225 84.652447) (mid 80.32019 84.422637) (end 80.55 84.327447) (width 0.25) (layer "F.Cu") (net 0) (uuid 49327086-73d2-4050-9183-c50425fa3341))
+  (arc (start 81.525 85.575) (mid 81.62019 85.34519) (end 81.85 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 4b67d223-90b5-4fe0-89a1-84d28e97e760))
+  (arc (start 76.975 85.847553) (mid 77.07019 86.077363) (end 77.3 86.172553) (width 0.25) (layer "F.Cu") (net 0) (uuid 53345ba3-3905-4973-8b65-ea17a19768d3))
+  (arc (start 95.325 87.425) (mid 95.962043 85.887043) (end 97.5 85.25) (width 0.25) (layer "F.Cu") (net 0) (uuid 5d3109c3-af88-4052-91c9-ebca37e2bef0))
+  (arc (start 86.5 85.25) (mid 88.037957 85.887043) (end 88.675 87.425) (width 0.25) (layer "F.Cu") (net 0) (uuid 6c347053-8fc9-4fd0-999a-80cd1d05ea04))
+  (arc (start 80.875 85.847553) (mid 80.97019 86.077363) (end 81.2 86.172553) (width 0.25) (layer "F.Cu") (net 0) (uuid 6db4b0e2-2878-4810-a65f-f8f880c4cb95))
+  (arc (start 77.95 84.327447) (mid 78.17981 84.422637) (end 78.275 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid 83453e05-b539-45a3-8b31-e4019df6a03b))
+  (arc (start 78.925 84.652447) (mid 79.02019 84.422637) (end 79.25 84.327447) (width 0.25) (layer "F.Cu") (net 0) (uuid 9d0a4cb0-b9ef-4f0e-8fc8-06d04a746603))
+  (arc (start 81.2 86.172553) (mid 81.42981 86.077363) (end 81.525 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid bdccf0ff-3344-434a-a650-8e5899794311))
+  (arc (start 79.575 85.847553) (mid 79.67019 86.077363) (end 79.9 86.172553) (width 0.25) (layer "F.Cu") (net 0) (uuid bfcd0536-6978-4c54-8935-7ecc7b6a0b86))
+  (arc (start 76.65 84.327447) (mid 76.87981 84.422637) (end 76.975 84.652447) (width 0.25) (layer "F.Cu") (net 0) (uuid d9a67ef6-2743-4b61-9ba1-307cb1b078b1))
+  (arc (start 79.9 86.172553) (mid 80.12981 86.077363) (end 80.225 85.847553) (width 0.25) (layer "F.Cu") (net 0) (uuid e0f21f4e-b518-4935-9749-606087d4a884))
+  (arc (start 76 85.25) (mid 76.22981 85.15481) (end 76.325 84.925) (width 0.25) (layer "F.Cu") (net 0) (uuid f4686051-11de-4ef5-ae3f-499b723a2637))
+  (arc (start 78.275 85.847553) (mid 78.37019 86.077363) (end 78.6 86.172553) (width 0.25) (layer "F.Cu") (net 0) (uuid fd17b531-df9d-42e3-8f77-6b00b931f015))
+  (segment (start 71.675 98.55) (end 71.675 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid 039aa012-f1fa-43f7-ae22-9712ce6700f1))
+  (segment (start 86.1568 97.975) (end 88.775 100.5932) (width 0.2) (layer "F.Cu") (net 1) (uuid 2da591a3-6e1f-401e-b546-57e02f378ea9))
+  (segment (start 72.075 96.95) (end 72.075 97.525) (width 0.2) (layer "F.Cu") (net 1) (uuid 35db8d54-eaa9-4183-b556-a8cb68d057d1))
+  (segment (start 88.775 107.249999) (end 88.5 107.524999) (width 0.2) (layer "F.Cu") (net 1) (uuid 4f5c21a3-4c79-48b4-ab90-c65789597287))
+  (segment (start 70.375 96.95) (end 70.375 97.525) (width 0.2) (layer "F.Cu") (net 1) (uuid 5f945720-da45-4930-a5ed-b66aa71c5314))
+  (segment (start 73.375 98.55) (end 73.375 98.175) (width 0.2) (layer "F.Cu") (net 1) (uuid 7d6d6475-6516-4a66-a923-a295358a0cb5))
+  (segment (start 66.975 98.175) (end 66.975 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid 7e4179eb-ba11-40f3-b081-d1c757b70262))
+  (segment (start 71.675 97.975) (end 71.675 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid 8a6e7823-3391-4e54-96e2-3184c60c4d52))
+  (segment (start 69.975 97.975) (end 69.975 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid 8c99c5d3-7ae5-4206-97ab-5d6b29a4fec4))
+  (segment (start 68.275 98.175) (end 68.275 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid 906bfecb-f12b-4023-b80a-3fe48766fac3))
+  (segment (start 88.775 100.5932) (end 88.775 107.249999) (width 0.2) (layer "F.Cu") (net 1) (uuid a0300586-99e5-4491-8eb2-41e7d745bf10))
+  (segment (start 70.375 97.525) (end 70.375 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid b07d43c0-4d18-408b-9d9e-0ce113f0ef7f))
+  (segment (start 69.975 98.55) (end 69.975 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid b32da7db-26e4-4806-82f7-ed6613bffe02))
+  (segment (start 68.675 96.95) (end 68.675 97.525) (width 0.2) (layer "F.Cu") (net 1) (uuid baf567e9-6da6-4636-91dd-b9fa515ca620))
+  (segment (start 68.275 98.55) (end 68.275 98.175) (width 0.2) (layer "F.Cu") (net 1) (uuid c026dea3-3d96-4512-94b8-79a9373e38ac))
+  (segment (start 63.5 97.975) (end 66.775 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid dbdf2d02-16f4-455d-9ecf-e9ca499a5cb6))
+  (segment (start 73.575 97.975) (end 74.250366 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid e54d383b-e580-4fbf-a456-ae5e1bc7264d))
+  (segment (start 72.075 97.525) (end 72.075 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid ea013a3f-712a-4034-aa66-dccc401f3edc))
+  (segment (start 88.5 107.524999) (end 88.5 110.75) (width 0.2) (layer "F.Cu") (net 1) (uuid f15b7890-7890-4f03-b09f-f68ac18a7833))
+  (segment (start 68.675 97.525) (end 68.675 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid f3762dae-846e-4946-a834-2ea4d6f8a8fb))
+  (segment (start 74.250366 97.975) (end 86.1568 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid fa9c0566-7ecb-4410-afc3-4a0d94e75136))
+  (arc (start 71.875 96.75) (mid 72.016421 96.808579) (end 72.075 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid 08e3c2a3-9d19-4492-9a15-6f3eb748a9dd))
+  (arc (start 66.775 97.975) (mid 66.916421 98.033579) (end 66.975 98.175) (width 0.2) (layer "F.Cu") (net 1) (uuid 193ab06f-2dc8-4ef9-b68e-8a6fdb811a8c))
+  (arc (start 71.675 96.95) (mid 71.733579 96.808579) (end 71.875 96.75) (width 0.2) (layer "F.Cu") (net 1) (uuid 1cf300a2-4cfc-4a49-b119-55be9ca6e530))
+  (arc (start 69.325 99.2) (mid 69.784619 99.009619) (end 69.975 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid 2f9261a4-6d77-4f48-9946-887df68c5623))
+  (arc (start 72.075 98.55) (mid 72.265381 99.009619) (end 72.725 99.2) (width 0.2) (layer "F.Cu") (net 1) (uuid 38d8900c-0189-4d8a-8850-cc4c7d182607))
+  (arc (start 70.175 96.75) (mid 70.316421 96.808579) (end 70.375 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid 443c2a07-e2da-4dee-95b1-1da39022b7ed))
+  (arc (start 67.625 99.2) (mid 68.084619 99.009619) (end 68.275 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid 49d6181e-da6a-4ba4-8d73-06cb84808826))
+  (arc (start 71.025 99.2) (mid 71.484619 99.009619) (end 71.675 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid 4fd04d76-bcdf-4e8c-9ee9-52f4b923099d))
+  (arc (start 72.725 99.2) (mid 73.184619 99.009619) (end 73.375 98.55) (width 0.2) (layer "F.Cu") (net 1) (uuid 5d3f5ed0-e6d7-43ca-a26c-f5c2b5c27710))
+  (arc (start 73.375 98.175) (mid 73.433579 98.033579) (end 73.575 97.975) (width 0.2) (layer "F.Cu") (net 1) (uuid 75df9d90-1b85-489e-9b08-365c60ea6910))
+  (arc (start 68.275 96.95) (mid 68.333579 96.808579) (end 68.475 96.75) (width 0.2) (layer "F.Cu") (net 1) (uuid 88b4c3b5-cdba-451d-bfa9-6540b576b863))
+  (arc (start 66.975 98.55) (mid 67.165381 99.009619) (end 67.625 99.2) (width 0.2) (layer "F.Cu") (net 1) (uuid 91968e3e-0a82-4f3d-ae95-acdd7a443f61))
+  (arc (start 68.675 98.55) (mid 68.865381 99.009619) (end 69.325 99.2) (width 0.2) (layer "F.Cu") (net 1) (uuid afe1fad1-80ab-4362-b624-3fd8630ed17e))
+  (arc (start 68.475 96.75) (mid 68.616421 96.808579) (end 68.675 96.95) (width 0.2) (layer "F.Cu") (net 1) (uuid e4699690-a3e3-4276-a309-fb7c9e011a61))
+  (arc (start 69.975 96.95) (mid 70.033579 96.808579) (end 70.175 96.75) (width 0.2) (layer "F.Cu") (net 1) (uuid e944669e-51b4-498b-8735-89631f6245f7))
+  (arc (start 70.375 98.55) (mid 70.565381 99.009619) (end 71.025 99.2) (width 0.2) (layer "F.Cu") (net 1) (uuid f172e016-140e-4bc0-8a5a-df92d434e6ea))
+  (segment (start 69.125 97.525) (end 69.125 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid 01fc260c-f31b-4832-be9d-3335baefaf2f))
+  (segment (start 86.873528 97.66642) (end 87.191727 97.348222) (width 0.2) (layer "F.Cu") (net 2) (uuid 04444529-526d-4f2a-801e-dfe5c849cb62))
+  (segment (start 67.825 98.55) (end 67.825 98.175) (width 0.2) (layer "F.Cu") (net 2) (uuid 058f2974-a8da-4750-b8d4-e6c07c627654))
+  (segment (start 69.125 96.95) (end 69.125 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 05f1a672-320e-4a5d-b6c5-95c030b2f091))
+  (segment (start 88.429163 99.222053) (end 88.429162 99.222054) (width 0.2) (layer "F.Cu") (net 2) (uuid 067bbb6e-f07e-473c-b0c7-2674420bcd03))
+  (segment locked (start 81.05 96.8) (end 81.05 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 0a51a454-56f1-4dee-be3d-931fa35c032d))
+  (segment locked (start 81.6 97.25) (end 81.6 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 10ffd6b8-5b30-427b-858f-b0033a6792d4))
+  (segment (start 89.5 102.0318) (end 89.95 102.0318) (width 0.2) (layer "F.Cu") (net 2) (uuid 12bd2cc9-8270-4199-8899-5875333b66f1))
+  (segment (start 87.262435 98.444235) (end 87.262437 98.444237) (width 0.2) (layer "F.Cu") (net 2) (uuid 13c6dcdb-11f1-4796-b5ce-53297f88bc7a))
+  (segment (start 89.95 103.6818) (end 89.5 103.6818) (width 0.2) (layer "F.Cu") (net 2) (uuid 140def30-b7f8-4c15-b41a-1c4ec4f7ee21))
+  (segment (start 69.525 97.975) (end 69.525 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid 17335c66-5b48-47c8-9759-58939a5d451a))
+  (segment locked (start 83.25 96.8) (end 83.25 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 1bfc93fe-1c12-4335-b667-796f42ec48c0))
+  (segment (start 89.225 105.0568) (end 89.225 105.1068) (width 0.2) (layer "F.Cu") (net 2) (uuid 236d6a3c-a18f-4fc7-8b86-877d5dcc595d))
+  (segment (start 73.575 97.525) (end 74.250366 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 25e69933-f67e-4342-bb6f-a94359a68e3d))
+  (segment locked (start 84.35 96.8) (end 84.35 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 278c3bc5-9b5a-4ceb-9ca4-7526c588549f))
+  (segment (start 87.580634 97.737131) (end 87.580635 97.73713) (width 0.2) (layer "F.Cu") (net 2) (uuid 27dd17a6-8c6a-4f6d-8137-2a5cda6ea892))
+  (segment (start 89.136269 99.292764) (end 88.818069 99.610961) (width 0.2) (layer "F.Cu") (net 2) (uuid 289f3222-691c-4792-b29a-953f304e5ce8))
+  (segment (start 89.225 100.4068) (end 89.225 100.6568) (width 0.2) (layer "F.Cu") (net 2) (uuid 29e6c587-f9bb-49bc-bdd5-79643f36cb42))
+  (segment (start 88.429162 99.222054) (end 88.747361 98.903856) (width 0.2) (layer "F.Cu") (net 2) (uuid 2a62f7e4-4a12-4b4e-aa31-70e6403fc30c))
+  (segment (start 69.525 98.55) (end 69.525 97.975) (width 0.2) (layer "F.Cu") (net 2) (uuid 2c305703-3966-433f-a6f8-a6ae00035ee4))
+  (segment locked (start 77.75 96.8) (end 77.75 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 2fbb84e9-e012-44ee-81cc-8ff8088c2cb3))
+  (segment locked (start 82.7 97.25) (end 82.7 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 304f25fe-e38d-4377-b8f1-26289354f05c))
+  (segment locked (start 77.2 97.25) (end 77.2 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 32ffc3d7-adad-4f8b-a8fd-80686b74dbe9))
+  (segment (start 88.358453 98.12604) (end 88.358452 98.126039) (width 0.2) (layer "F.Cu") (net 2) (uuid 33b2fad1-ba9a-43f3-8f55-743fade69647))
+  (segment locked (start 74.250366 97.525) (end 74.725 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 3403c3ad-e3de-407c-8567-62d5134ef526))
+  (segment locked (start 84.9 97.25) (end 84.9 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 358414db-7f31-4504-a43d-29c53be1cc33))
+  (segment locked (start 85.45 96.8) (end 85.45 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 3858089b-206d-43ca-8c24-189c8db5c5f7))
+  (segment locked (start 79.4 97.25) (end 79.4 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 3dc108df-82d3-4ed6-b48d-0d3e1f490f7b))
+  (segment (start 67.825 98.175) (end 67.825 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid 3f87240f-2364-4bde-8631-ccd90d42850e))
+  (segment (start 89.95 101.4818) (end 89.5 101.4818) (width 0.2) (layer "F.Cu") (net 2) (uuid 454fe726-8b63-4777-b61a-b44d84b3794d))
+  (segment (start 89.136268 99.292765) (end 89.136269 99.292764) (width 0.2) (layer "F.Cu") (net 2) (uuid 49fec00e-0920-4074-aaa4-3fe85dfeaac2))
+  (segment (start 89.95 104.7818) (end 89.5 104.7818) (width 0.2) (layer "F.Cu") (net 2) (uuid 4ba2b419-0f87-4491-aada-797b96e1dd3a))
+  (segment (start 88.040252 99.222052) (end 88.040254 99.222054) (width 0.2) (layer "F.Cu") (net 2) (uuid 4db32d37-3877-478b-adc0-ed728e01783b))
+  (segment (start 88.040253 99.222053) (end 88.040252 99.222052) (width 0.2) (layer "F.Cu") (net 2) (uuid 4e9738af-e8ba-4ced-b663-f99130b6faa1))
+  (segment (start 87.651346 98.444236) (end 87.651345 98.444237) (width 0.2) (layer "F.Cu") (net 2) (uuid 583bc4cd-f57f-4a91-894c-99b8b57b3090))
+  (segment (start 85.775 97.525) (end 86.3432 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 5a27b605-4732-4c97-9bdf-61c5b4d95352))
+  (segment locked (start 78.3 97.25) (end 78.3 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 5edf4000-7676-4e5a-b87b-ac599a169ad5))
+  (segment (start 70.825 96.95) (end 70.825 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 61c70c63-99e1-4960-ad0c-4e5b49c331a4))
+  (segment (start 86.873529 97.666419) (end 86.873528 97.66642) (width 0.2) (layer "F.Cu") (net 2) (uuid 61f72c36-94a2-4137-9a14-90e0a29c3a8d))
+  (segment (start 63.5 97.525) (end 66.775 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 6dcf5309-f59d-4d1b-a15e-9165aead77fa))
+  (segment locked (start 78.85 96.8) (end 78.85 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 748bdd2d-da0a-4240-ba60-0bf881d2ec56))
+  (segment locked (start 76.65 96.8) (end 76.65 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 74ad519a-50ef-46d2-9b21-9f4d66417d83))
+  (segment (start 89.225 107.249999) (end 89.5 107.524999) (width 0.2) (layer "F.Cu") (net 2) (uuid 76037792-5928-4a66-ba22-2dc11c197fb8))
+  (segment (start 89.5 107.524999) (end 89.5 110.75) (width 0.2) (layer "F.Cu") (net 2) (uuid 769b8a2a-d29e-4838-af3e-7930e6380ae0))
+  (segment (start 86.3432 97.525) (end 86.48462 97.66642) (width 0.2) (layer "F.Cu") (net 2) (uuid 7cae3ceb-8a10-4ac4-b7de-33ea3e12d529))
+  (segment (start 87.262436 98.444236) (end 87.262435 98.444235) (width 0.2) (layer "F.Cu") (net 2) (uuid 7d0d42fc-7dba-45cc-8a77-275fc87797c8))
+  (segment (start 72.525 96.95) (end 72.525 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 7d4ff933-cd0c-468c-a149-65f0100f466e))
+  (segment locked (start 80.5 97.25) (end 80.5 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 801da923-9d7d-4f2f-bb46-6dae73790587))
+  (segment (start 88.818069 99.999869) (end 89.225 100.4068) (width 0.2) (layer "F.Cu") (net 2) (uuid 8b915f44-d92b-4376-8a4d-f445b50a784a))
+  (segment (start 89.225 105.1068) (end 89.225 107.249999) (width 0.2) (layer "F.Cu") (net 2) (uuid 91c01983-6be9-41dd-87a5-1e3538da6df3))
+  (segment (start 88.81807 99.99987) (end 88.818069 99.999869) (width 0.2) (layer "F.Cu") (net 2) (uuid 9496b38f-3119-4623-b62d-5288a4bb5152))
+  (segment (start 89.13627 98.903857) (end 89.136269 98.903856) (width 0.2) (layer "F.Cu") (net 2) (uuid 9791bbdf-86d5-485a-baa5-8068046e3b36))
+  (segment (start 70.825 97.525) (end 70.825 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid 9cbc95c6-541a-457c-99c9-f0940b8421b1))
+  (segment (start 88.358451 98.514948) (end 88.358452 98.514947) (width 0.2) (layer "F.Cu") (net 2) (uuid a9e9547e-c064-4790-9898-9b0831b6ea29))
+  (segment (start 89.95 102.5818) (end 89.5 102.5818) (width 0.2) (layer "F.Cu") (net 2) (uuid ac285269-cb11-4151-b6d2-066785156349))
+  (segment (start 72.525 97.525) (end 72.525 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid ac6d4abb-5313-4db1-b383-9e6fd4658dd3))
+  (segment (start 89.5 104.2318) (end 89.95 104.2318) (width 0.2) (layer "F.Cu") (net 2) (uuid b04075d2-3602-43e6-92be-9dd21513a200))
+  (segment locked (start 83.8 97.25) (end 83.8 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid b2246d15-cb0e-4e3f-84fb-c1a652084bc6))
+  (segment (start 88.358452 98.514947) (end 88.040252 98.833144) (width 0.2) (layer "F.Cu") (net 2) (uuid b6331aeb-9bb0-41ea-8fc6-68dcb3fafafe))
+  (segment (start 89.5 103.1318) (end 89.95 103.1318) (width 0.2) (layer "F.Cu") (net 2) (uuid cb428b0a-31d9-482e-aaeb-be1bd1808598))
+  (segment locked (start 76.1 97.25) (end 76.1 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid cc30120b-5491-407f-8078-f17c31fa62c1))
+  (segment (start 87.580636 97.348223) (end 87.580635 97.348222) (width 0.2) (layer "F.Cu") (net 2) (uuid d55e5429-799a-404c-8b68-a67cd2b42ddd))
+  (segment locked (start 82.15 96.8) (end 82.15 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid d629d4f5-d630-4f01-a953-ae79e19db036))
+  (segment (start 72.925 98.55) (end 72.925 98.175) (width 0.2) (layer "F.Cu") (net 2) (uuid d666b0ef-26af-43b4-8d0f-47aa0fc43171))
+  (segment (start 89.5 100.9318) (end 89.95 100.9318) (width 0.2) (layer "F.Cu") (net 2) (uuid d6693521-5fd1-41ec-a68f-c2778ffc076f))
+  (segment locked (start 79.95 96.8) (end 79.95 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid d6bd327a-d697-404f-a5b7-0c1f2f1bf9b6))
+  (segment locked (start 75.55 96.8) (end 75.55 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid d9ce81c5-6965-488c-be98-3d147c2bd0bd))
+  (segment (start 67.425 98.175) (end 67.425 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid dda16b84-a36a-48a3-bdb6-768971b8cb87))
+  (segment locked (start 85.725 97.525) (end 85.775 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid e714b783-f99e-4c38-8985-6f6207dd2c48))
+  (segment (start 87.580635 97.73713) (end 87.262435 98.055327) (width 0.2) (layer "F.Cu") (net 2) (uuid e9b48fa5-cde0-4e05-a40c-dfeb25f5dacb))
+  (segment (start 87.651345 98.444237) (end 87.969544 98.126039) (width 0.2) (layer "F.Cu") (net 2) (uuid edb35209-55c3-49a8-9aaf-369715e21308))
+  (segment (start 71.225 98.55) (end 71.225 97.975) (width 0.2) (layer "F.Cu") (net 2) (uuid ef5e1760-0b06-48c8-86e8-68381890707d))
+  (segment (start 71.225 97.975) (end 71.225 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid f8ed3297-3ff6-42b0-bd35-4246303ceee2))
+  (segment locked (start 75 97.25) (end 75 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid f9be2e45-56e0-4e20-a353-ef4b2b80874c))
+  (arc locked (start 78.85 97.25) (mid 78.930546 97.444454) (end 79.125 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 044d96d4-3f69-4cf6-af5a-c45410369a4e))
+  (arc (start 71.025 98.75) (mid 71.166421 98.691421) (end 71.225 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid 065aad83-c790-4a2d-b9ad-1a3c7c55741f))
+  (arc locked (start 78.575 96.525) (mid 78.769454 96.605546) (end 78.85 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 07e8d0c7-23d7-413b-9dea-d0b0910724a8))
+  (arc (start 71.225 96.95) (mid 71.415381 96.490381) (end 71.875 96.3) (width 0.2) (layer "F.Cu") (net 2) (uuid 087ed1f2-9335-4867-8f5c-4ab273dfff17))
+  (arc locked (start 82.15 97.25) (mid 82.230546 97.444454) (end 82.425 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 0bb6ad0b-76dd-4100-af88-32e8793c64cc))
+  (arc (start 89.95 103.1318) (mid 90.144454 103.212346) (end 90.225 103.4068) (width 0.2) (layer "F.Cu") (net 2) (uuid 0c4deb65-0fc2-4582-bf94-bf317032277f))
+  (arc (start 88.818069 99.610961) (mid 88.737524 99.805416) (end 88.81807 99.99987) (width 0.2) (layer "F.Cu") (net 2) (uuid 0ea29eea-ed68-49b2-9e22-6c18bf8d49ad))
+  (arc (start 88.040252 98.833144) (mid 87.959707 99.027599) (end 88.040253 99.222053) (width 0.2) (layer "F.Cu") (net 2) (uuid 10e198cd-38a3-4361-8b70-40c2b7939490))
+  (arc (start 72.725 98.75) (mid 72.866421 98.691421) (end 72.925 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid 1202702f-b32a-436f-8374-861ee1f53c02))
+  (arc locked (start 75.825 97.525) (mid 76.019454 97.444454) (end 76.1 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 19e88170-88b9-4731-ba08-a947a7eccd42))
+  (arc locked (start 77.2 96.8) (mid 77.280546 96.605546) (end 77.475 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 1a14eec8-b2e1-4cba-9a61-9d9dd04e902e))
+  (arc (start 72.525 98.55) (mid 72.583579 98.691421) (end 72.725 98.75) (width 0.2) (layer "F.Cu") (net 2) (uuid 1c2b0fb8-9679-4148-81f5-d0736d96945b))
+  (arc locked (start 83.8 96.8) (mid 83.880546 96.605546) (end 84.075 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 2093cca6-1bfd-4d8c-9891-b8c54bb1814b))
+  (arc (start 88.747361 98.903856) (mid 88.941816 98.823311) (end 89.13627 98.903857) (width 0.2) (layer "F.Cu") (net 2) (uuid 230bbd84-3245-4a3e-b569-4ac5f0310fa4))
+  (arc (start 67.625 98.75) (mid 67.766421 98.691421) (end 67.825 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid 2651d18a-2251-4cd5-b8f4-590b15231fe3))
+  (arc (start 70.175 96.3) (mid 70.634619 96.490381) (end 70.825 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid 3428f28d-793b-429a-a9b4-e0f4b6d446c9))
+  (arc (start 86.48462 97.66642) (mid 86.679075 97.746965) (end 86.873529 97.666419) (width 0.2) (layer "F.Cu") (net 2) (uuid 35fd67e8-578b-4a94-bf70-4756131c7443))
+  (arc locked (start 80.775 96.525) (mid 80.969454 96.605546) (end 81.05 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 3787190a-13d1-457f-8c25-0bd5791eeaa0))
+  (arc locked (start 81.6 96.8) (mid 81.680546 96.605546) (end 81.875 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 3f568a9c-0a20-410e-bbc4-184c52230511))
+  (arc locked (start 79.125 97.525) (mid 79.319454 97.444454) (end 79.4 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 4168e5cc-e1cd-48db-a8c0-0f082fcd3be5))
+  (arc (start 89.5 102.5818) (mid 89.305546 102.662346) (end 89.225 102.8568) (width 0.2) (layer "F.Cu") (net 2) (uuid 4c2c821a-c29d-4338-ad3f-2c17b86a54dc))
+  (arc locked (start 82.975 96.525) (mid 83.169454 96.605546) (end 83.25 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 51e7aed3-1eff-4dc5-848a-49a40d3d545b))
+  (arc locked (start 82.7 96.8) (mid 82.780546 96.605546) (end 82.975 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 525d1009-7a9b-4765-8f6a-6032ff85bd3b))
+  (arc (start 87.262437 98.444237) (mid 87.456892 98.524782) (end 87.651346 98.444236) (width 0.2) (layer "F.Cu") (net 2) (uuid 5a2b9db2-a98d-4fef-935c-07884fe935cb))
+  (arc (start 68.475 96.3) (mid 68.934619 96.490381) (end 69.125 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid 5cee08cf-3747-4086-b183-0c61f61933a6))
+  (arc locked (start 75.55 97.25) (mid 75.630546 97.444454) (end 75.825 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 5d8eae69-5916-4c67-bf03-1013c55599d6))
+  (arc locked (start 74.725 97.525) (mid 74.919454 97.444454) (end 75 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 5e72a3e7-490a-43c3-a227-73e139161515))
+  (arc (start 89.225 103.9568) (mid 89.305546 104.151254) (end 89.5 104.2318) (width 0.2) (layer "F.Cu") (net 2) (uuid 600975ea-a700-4310-9060-721a117699ef))
+  (arc locked (start 85.175 96.525) (mid 85.369454 96.605546) (end 85.45 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid 64d0b53a-8d38-4f33-98a7-2bf7415a2828))
+  (arc (start 70.825 98.55) (mid 70.883579 98.691421) (end 71.025 98.75) (width 0.2) (layer "F.Cu") (net 2) (uuid 67623a6e-679f-4db5-9778-ff4b2144034b))
+  (arc (start 89.136269 98.903856) (mid 89.216814 99.098311) (end 89.136268 99.292765) (width 0.2) (layer "F.Cu") (net 2) (uuid 67f1aadd-abbf-42af-b69d-c0bc8ff3c54d))
+  (arc (start 87.191727 97.348222) (mid 87.386182 97.267677) (end 87.580636 97.348223) (width 0.2) (layer "F.Cu") (net 2) (uuid 6eca8f04-982c-4e7d-be01-74c84433ede0))
+  (arc (start 89.5 103.6818) (mid 89.305546 103.762346) (end 89.225 103.9568) (width 0.2) (layer "F.Cu") (net 2) (uuid 6ff37887-4994-46f8-820b-36c5ae472f8d))
+  (arc (start 66.775 97.525) (mid 67.234619 97.715381) (end 67.425 98.175) (width 0.2) (layer "F.Cu") (net 2) (uuid 6ffd5611-99ed-4f7d-80b5-fd74ac95b246))
+  (arc (start 89.95 104.2318) (mid 90.144454 104.312346) (end 90.225 104.5068) (width 0.2) (layer "F.Cu") (net 2) (uuid 74a830ac-db02-4ee0-b658-8b525b51103a))
+  (arc (start 89.95 102.0318) (mid 90.144454 102.112346) (end 90.225 102.3068) (width 0.2) (layer "F.Cu") (net 2) (uuid 76239d3a-6947-4841-a7e3-1476cd80a018))
+  (arc (start 71.875 96.3) (mid 72.334619 96.490381) (end 72.525 96.95) (width 0.2) (layer "F.Cu") (net 2) (uuid 77fa6575-e37e-4e4f-a8bd-859802ea4376))
+  (arc locked (start 76.65 97.25) (mid 76.730546 97.444454) (end 76.925 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 780f867b-32a9-4333-8408-14d0a954cfb2))
+  (arc (start 87.580635 97.348222) (mid 87.66118 97.542677) (end 87.580634 97.737131) (width 0.2) (layer "F.Cu") (net 2) (uuid 7b24c536-470a-4e2d-ac6c-16770002d80b))
+  (arc (start 89.225 101.7568) (mid 89.305546 101.951254) (end 89.5 102.0318) (width 0.2) (layer "F.Cu") (net 2) (uuid 7d6de20c-c688-4223-ab79-e63840887579))
+  (arc locked (start 75 96.8) (mid 75.080546 96.605546) (end 75.275 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 838daf59-e2cb-4307-89db-62da916b85ba))
+  (arc (start 67.825 96.95) (mid 68.015381 96.490381) (end 68.475 96.3) (width 0.2) (layer "F.Cu") (net 2) (uuid 85474f84-989d-4fc9-be26-de58f9f54ba7))
+  (arc (start 89.225 102.8568) (mid 89.305546 103.051254) (end 89.5 103.1318) (width 0.2) (layer "F.Cu") (net 2) (uuid 86fc755e-723f-4202-bd7f-8f17acf8da93))
+  (arc locked (start 78.3 96.8) (mid 78.380546 96.605546) (end 78.575 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 88107d2c-0171-463a-9c46-4413953e1e43))
+  (arc locked (start 80.225 97.525) (mid 80.419454 97.444454) (end 80.5 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid 89965ab8-14d9-452b-bde8-069f652c966e))
+  (arc (start 72.925 98.175) (mid 73.115381 97.715381) (end 73.575 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 8b083406-8cf2-405e-843e-769aa4f51fff))
+  (arc (start 90.225 101.2068) (mid 90.144454 101.401254) (end 89.95 101.4818) (width 0.2) (layer "F.Cu") (net 2) (uuid 96bb9d8a-b6de-4c1a-a2b4-15c5e7df8321))
+  (arc (start 90.225 104.5068) (mid 90.144454 104.701254) (end 89.95 104.7818) (width 0.2) (layer "F.Cu") (net 2) (uuid 991668f8-5dbe-4c03-89ac-c3e876a4f30c))
+  (arc (start 87.262435 98.055327) (mid 87.18189 98.249782) (end 87.262436 98.444236) (width 0.2) (layer "F.Cu") (net 2) (uuid 99c270ac-dd12-496c-b9d1-dbd5feb281a2))
+  (arc locked (start 77.75 97.25) (mid 77.830546 97.444454) (end 78.025 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 9f1cbe50-f185-4335-bc70-80f48db5223f))
+  (arc locked (start 80.5 96.8) (mid 80.580546 96.605546) (end 80.775 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid 9ffacd58-8cd1-442c-8087-0df19e25bc84))
+  (arc locked (start 83.25 97.25) (mid 83.330546 97.444454) (end 83.525 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid a0ac6d6b-6f13-43b4-8d29-23fd49bf127b))
+  (arc locked (start 84.625 97.525) (mid 84.819454 97.444454) (end 84.9 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid a23da91c-f91b-4391-aa54-6f76878bcde2))
+  (arc (start 90.225 102.3068) (mid 90.144454 102.501254) (end 89.95 102.5818) (width 0.2) (layer "F.Cu") (net 2) (uuid a2453869-af65-49c8-8d90-5836ebc9ca12))
+  (arc (start 89.5 104.7818) (mid 89.305546 104.862346) (end 89.225 105.0568) (width 0.2) (layer "F.Cu") (net 2) (uuid abcaac62-8f19-45e5-b7f1-8c8276abc3c0))
+  (arc locked (start 76.925 97.525) (mid 77.119454 97.444454) (end 77.2 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid abd9d4f4-111b-4640-8118-e9bde5642673))
+  (arc locked (start 76.1 96.8) (mid 76.180546 96.605546) (end 76.375 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid acf7da60-c7aa-4992-8db3-a6ff91160570))
+  (arc locked (start 84.9 96.8) (mid 84.980546 96.605546) (end 85.175 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid ae310006-c987-441d-873f-e532b3dbe5b8))
+  (arc locked (start 81.875 96.525) (mid 82.069454 96.605546) (end 82.15 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid af6bb242-9ab2-487c-a2ad-325b40b7fe92))
+  (arc locked (start 84.35 97.25) (mid 84.430546 97.444454) (end 84.625 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid b03e4849-8256-41e0-845f-780dcce71f55))
+  (arc locked (start 84.075 96.525) (mid 84.269454 96.605546) (end 84.35 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid b042bb16-5644-44a0-a638-35b4a7278716))
+  (arc (start 89.5 101.4818) (mid 89.305546 101.562346) (end 89.225 101.7568) (width 0.2) (layer "F.Cu") (net 2) (uuid b056c1fe-ef6b-452d-9a46-bdea7738eb5f))
+  (arc locked (start 79.675 96.525) (mid 79.869454 96.605546) (end 79.95 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid bce645a0-10e2-43ad-b783-1d325e305eed))
+  (arc (start 69.525 96.95) (mid 69.715381 96.490381) (end 70.175 96.3) (width 0.2) (layer "F.Cu") (net 2) (uuid c4277be2-8ea1-4763-9c5f-287ddbd9f87e))
+  (arc (start 67.425 98.55) (mid 67.483579 98.691421) (end 67.625 98.75) (width 0.2) (layer "F.Cu") (net 2) (uuid c45a4901-91c0-406c-88bb-4e05006694e5))
+  (arc (start 89.95 100.9318) (mid 90.144454 101.012346) (end 90.225 101.2068) (width 0.2) (layer "F.Cu") (net 2) (uuid ca0f9c33-78f8-41d7-980d-db7b0aa19e57))
+  (arc (start 87.969544 98.126039) (mid 88.163999 98.045494) (end 88.358453 98.12604) (width 0.2) (layer "F.Cu") (net 2) (uuid d0daa854-2ed4-4c44-8695-6f21be6c244a))
+  (arc locked (start 79.95 97.25) (mid 80.030546 97.444454) (end 80.225 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid d38ab5d8-aa5d-4f99-b915-e105e57bde2a))
+  (arc locked (start 78.025 97.525) (mid 78.219454 97.444454) (end 78.3 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid d7031db2-63d6-44c4-a59f-8fb5abead861))
+  (arc locked (start 81.325 97.525) (mid 81.519454 97.444454) (end 81.6 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid d7c36500-c4a6-49eb-b664-9c96c12d21f8))
+  (arc locked (start 82.425 97.525) (mid 82.619454 97.444454) (end 82.7 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid dc439fb8-3e2b-4f0c-81cc-3fd64a263585))
+  (arc (start 90.225 103.4068) (mid 90.144454 103.601254) (end 89.95 103.6818) (width 0.2) (layer "F.Cu") (net 2) (uuid e08db445-55c7-4a8f-92ed-e70699e18669))
+  (arc (start 89.225 100.6568) (mid 89.305546 100.851254) (end 89.5 100.9318) (width 0.2) (layer "F.Cu") (net 2) (uuid e1885d11-e8fd-45e1-9237-1f5c33816018))
+  (arc locked (start 77.475 96.525) (mid 77.669454 96.605546) (end 77.75 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid e3345484-d946-4858-94fb-5e27e75e5fdf))
+  (arc locked (start 76.375 96.525) (mid 76.569454 96.605546) (end 76.65 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid e3cf67c8-3e14-4db8-aebe-01c72e800a36))
+  (arc (start 88.040254 99.222054) (mid 88.234709 99.302599) (end 88.429163 99.222053) (width 0.2) (layer "F.Cu") (net 2) (uuid e3d64774-9e78-40c1-9325-685f973ec399))
+  (arc locked (start 79.4 96.8) (mid 79.480546 96.605546) (end 79.675 96.525) (width 0.2) (layer "F.Cu") (net 2) (uuid e66b1e5e-fe3a-4361-b33f-d3f859555733))
+  (arc locked (start 83.525 97.525) (mid 83.719454 97.444454) (end 83.8 97.25) (width 0.2) (layer "F.Cu") (net 2) (uuid e9455298-081b-4082-ac68-a76b7eb46d07))
+  (arc (start 88.358452 98.126039) (mid 88.438997 98.320494) (end 88.358451 98.514948) (width 0.2) (layer "F.Cu") (net 2) (uuid eb8dd993-5e26-48ef-89bd-e1ed9bb825f8))
+  (arc locked (start 81.05 97.25) (mid 81.130546 97.444454) (end 81.325 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid eb951edb-217b-4551-9040-f08ae4929ab8))
+  (arc (start 69.125 98.55) (mid 69.183579 98.691421) (end 69.325 98.75) (width 0.2) (layer "F.Cu") (net 2) (uuid ed080efd-8428-41db-b4e3-4c7e44c1e281))
+  (arc locked (start 85.45 97.25) (mid 85.530546 97.444454) (end 85.725 97.525) (width 0.2) (layer "F.Cu") (net 2) (uuid eeb4521d-f88d-46bd-8556-75a4a756a9ee))
+  (arc (start 69.325 98.75) (mid 69.466421 98.691421) (end 69.525 98.55) (width 0.2) (layer "F.Cu") (net 2) (uuid fc70381a-63cd-4b0f-8fff-e19b4b679692))
+  (arc locked (start 75.275 96.525) (mid 75.469454 96.605546) (end 75.55 96.8) (width 0.2) (layer "F.Cu") (net 2) (uuid ff0b35ee-2c79-4359-a1c7-5c7232881f80))
+
+)
diff --git a/tests/testdata/board/test_boardWithAllPrimitives b/tests/testdata/board/test_boardWithAllPrimitives
new file mode 100644
index 0000000..4bf4344
--- /dev/null
+++ b/tests/testdata/board/test_boardWithAllPrimitives
@@ -0,0 +1,1466 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 19.11)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (1 "In1.Cu" signal)
+    (2 "In2.Cu" signal)
+    (3 "In3.Cu" signal)
+    (4 "In4.Cu" signal)
+    (5 "In5.Cu" signal)
+    (6 "In6.Cu" signal)
+    (7 "In7.Cu" signal)
+    (8 "In8.Cu" signal)
+    (9 "In9.Cu" signal)
+    (10 "In10.Cu" signal)
+    (11 "In11.Cu" signal)
+    (12 "In12.Cu" signal)
+    (13 "In13.Cu" signal)
+    (14 "In14.Cu" signal)
+    (15 "In15.Cu" signal)
+    (16 "In16.Cu" signal)
+    (17 "In17.Cu" signal)
+    (18 "In18.Cu" signal)
+    (19 "In19.Cu" signal)
+    (20 "In20.Cu" signal)
+    (21 "In21.Cu" signal)
+    (22 "In22.Cu" signal)
+    (23 "In23.Cu" signal)
+    (24 "In24.Cu" signal)
+    (25 "In25.Cu" signal)
+    (26 "In26.Cu" signal)
+    (27 "In27.Cu" signal)
+    (28 "In28.Cu" signal)
+    (29 "In29.Cu" signal)
+    (30 "In30.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (stackup
+      (layer "F.SilkS" (type "Top Silk Screen") (color "Yellow"))
+      (layer "F.Paste" (type "Top Solder Paste"))
+      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
+      (layer "F.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.021))
+      (layer "In1.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 2" (type "prepreg") (thickness 1.51) (material "FR4") (epsilon_r 4.52) (loss_tangent 0.02))
+      (layer "In2.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 3" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.024))
+      (layer "In3.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 4" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In4.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 5" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In5.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 6" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In6.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 7" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In7.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 8" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In8.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 9" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In9.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 10" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In10.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 11" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In11.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 12" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In12.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 13" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In13.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 14" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In14.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 15" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In15.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 16" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In16.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 17" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In17.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 18" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In18.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 19" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In19.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 20" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In20.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 21" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In21.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 22" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In22.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 23" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In23.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 24" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In24.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 25" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In25.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 26" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In26.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 27" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In27.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 28" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In28.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 29" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In29.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 30" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In30.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 31" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "B.Cu" (type "copper") (thickness 0.035))
+      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
+      (layer "B.Paste" (type "Bottom Solder Paste"))
+      (layer "B.SilkS" (type "Bottom Silk Screen") (color "Green"))
+      (copper_finish "HAL lead-free")
+      (dielectric_constraints no)
+      (edge_connector bevelled)
+      (castellated_pads yes)
+      (edge_plating yes)
+    )
+    (pad_to_mask_clearance 1)
+    (solder_mask_min_width 1)
+    (pad_to_paste_clearance -1)
+    (pad_to_paste_clearance_ratio -0.01)
+    (aux_axis_origin 177.65 97.75)
+    (grid_origin 182.8 82.55)
+    (pcbplotparams
+      (layerselection 0x00010fc_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes true)
+      (usegerberadvancedattributes true)
+      (creategerberjobfile true)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer true)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 12.344291)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 0)
+      (mirror false)
+      (drillshape 0)
+      (scaleselection 1)
+      (outputdirectory "D:/home/Desktop/Temp/")
+    )
+  )
+
+  (property "123456" "45641523")
+  (property "test" "test test")
+  (property "xdfa" "xdfadsf ")
+
+  (net 0 "")
+  (net 1 "/NET1")
+  (net 2 "unconnected-(SW101-Pad2)")
+  (net 3 "unconnected-(SW101-Pad3)")
+  (net 4 "/HIER_LABEL")
+
+  (footprint "test" (layer "F.Cu")
+    (tedit 621D235F) (uuid 3cfcbcc7-4f45-46ab-82a8-c414c7972161)
+    (at 104.78 48.237399)
+    (attr smd)
+    (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
+    )
+    (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid c58960d9-4cac-4036-ad2e-1aef26946dae)
+    )
+    (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu")
+      (effects (font (size 1.5 1.5) (thickness 0.3)))
+      (uuid 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
+    )
+    (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid ec9e24d8-d1c5-40e2-9812-dc315d05f470)
+    )
+    (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
+    )
+    (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 53c85970-3e21-4fae-a84f-721cfc0513b5)
+    )
+    (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
+    )
+    (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (uuid 003c2200-0632-4808-a662-8ddd5d30c768))
+    (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (uuid 6ff874d0-4ac5-414c-83a7-573eda4c7703))
+    (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (uuid be0953c0-632d-4dd2-85e9-4d41239f22d2))
+    (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (uuid 7f3eb118-a20c-4239-b800-c9211c66847d))
+    (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (uuid 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
+    (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (uuid fc0a4225-db46-4d48-8163-d522602d57cd))
+    (fp_poly (pts
+        (xy 8.4 14.95)
+        (xy 1.15 14.95)
+        (xy 1.15 6.7)
+        (xy 1.9 6.7)
+        (xy 8.4 0.2)
+      ) (layer "F.SilkS") (width 0.12) (fill solid) (uuid f6ee98b5-4773-4eeb-a825-33c1705abace))
+    (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (uuid 127679a9-3981-4934-815e-896a4e3ff56e))
+    (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (uuid 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
+    (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
+    (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 0520f61d-4522-4301-a3fa-8ed0bf060f69))
+    (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 0f560957-a8c5-442f-b20c-c2d88613742c))
+    (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
+    (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
+    (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
+    (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
+    (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
+    (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
+    (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
+    (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
+    (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid c43663ee-9a0d-4f27-a292-89ba89964065))
+    (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid c67ad10d-2f75-4ec6-a139-47058f7f06b2))
+    (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
+      (die_length 1) (uuid 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
+    (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
+      (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
+      (options (clearance convexhull) (anchor circle))
+      (primitives
+        (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
+        (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
+        (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
+        (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
+        (gr_poly (pts
+            (xy 12.8 4.2)
+            (xy 8.2 8.8)
+            (xy 3.8 4.4)
+            (xy 8.4 -0.2)
+          ) (width 0.2) (fill yes))
+    (gr_arc (start 6.4 0.2) (mid 6.594453 -0.786584) (end 7.148728 -1.625594) (width 0.2))
+            (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
+            (gr_poly (pts
+            (xy -0.6 2.8)
+            (xy -1.8 4)
+            (xy -6.4 4)
+            (xy -6.4 1)
+            (xy -0.6 1)
+          ) (width 0.2) (fill yes))
+            (gr_poly (pts
+            (xy 0.870847 -0.746121)
+            (xy 0.983248 -0.691178)
+            (xy 1.071791 -0.602789)
+            (xy 1.12693 -0.490484)
+            (xy 1.143 -0.381)
+            (xy 1.143 0.381)
+            (xy 1.127121 0.489847)
+            (xy 1.072178 0.602248)
+            (xy 0.983789 0.690791)
+            (xy 0.871484 0.74593)
+            (xy 0.762 0.762)
+            (xy -0.762 0.762)
+            (xy -0.870847 0.746121)
+            (xy -0.983248 0.691178)
+            (xy -1.071791 0.602789)
+            (xy -1.12693 0.490484)
+            (xy -1.143 0.381)
+            (xy -1.143 -0.381)
+            (xy -1.127121 -0.489847)
+            (xy -1.072178 -0.602248)
+            (xy -0.983789 -0.690791)
+            (xy -0.871484 -0.74593)
+            (xy -0.762 -0.762)
+            (xy 0.762 -0.762)
+          ) (width 0) (fill yes))
+      ) (uuid d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
+    (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
+      (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
+      (die_length 15) (uuid e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
+    (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (uuid 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
+    (zone (net 0) (net_name "") (layer "F.Cu") (uuid 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
+      (connect_pads (clearance 0))
+      (min_thickness 0.254)
+      (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
+      (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+      (polygon
+        (pts
+          (xy 154.38 59.237399)
+          (xy 141.58 60.437399)
+          (xy 141.58 46.437399)
+        )
+      )
+    )
+    (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
+      (members
+        7f3eb118-a20c-4239-b800-c9211c66847d
+        f6ee98b5-4773-4eeb-a825-33c1705abace
+      )
+    )
+  )
+
+  (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (layer "F.Cu")
+    (tedit 5B784ED0) (uuid 907b59ac-a3f3-4819-aae3-2f3689254127)
+    (at 103.5875 101.8875)
+    (descr "Generic Phoenix Contact connector footprint for: MCV_1,5/4-G-3.5; number of pins: 04; pin pitch: 3.50mm; Vertical || order number: 1843622 8A 160V")
+    (tags "phoenix_contact connector MCV_01x04_G_3.5mm")
+    (property "Sheetfile" "test.kicad_sch")
+    (property "Sheetname" "")
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6")
+    (attr through_hole)
+    (fp_text reference "SW101" (at 5.25 -5.45) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid cc90c745-434f-4e54-89c7-cbf24870aeb9)
+    )
+    (fp_text value "SW_Coded" (at 5.25 4.2) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 7e47f703-9790-4c34-9d14-1de39c308f06)
+    )
+    (fp_text user "${REFERENCE}" (at 5.25 -3.55) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 122cd6ff-87b3-455d-9734-dd35dee6c1d9)
+    )
+    (fp_line (start 5.75 -2.4) (end 5.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 02426097-2343-483f-9184-b1021f11f671))
+    (fp_line (start 6.25 -2.05) (end 6.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 0757ecdd-1a4f-4f75-825e-ff54cc68895a))
+    (fp_line (start 12 -3.4) (end 11.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 1257fa4c-2f92-4e07-b43d-826125b0853c))
+    (fp_line (start -1.5 -2.05) (end -0.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 14ae6814-97a1-417e-bec2-8de437fc055e))
+    (fp_line (start 4.25 -2.05) (end 5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 1e0832ec-61bb-4753-a703-f800e50c87e9))
+    (fp_line (start 9 -2.05) (end 9.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 1fa150d9-4de3-4b9f-8fca-6651616614be))
+    (fp_line (start -0.75 2.25) (end -1.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 207c68d8-2bd6-401c-bbd5-e50fcc95bf20))
+    (fp_line (start 5.5 -3.4) (end 8.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 20dc8b19-954b-4369-b580-dab885da8ae2))
+    (fp_line (start 12 2.25) (end 11.25 2.25) (layer "F.SilkS") (width 0.12) (uuid 229202cd-20dc-4eab-ac2e-7f028bc91419))
+    (fp_line (start 1.5 -2.05) (end 1.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 22b553ec-39b6-4275-9347-df53a7c0db1d))
+    (fp_line (start 2 -3.4) (end 5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 24a65fad-0331-474b-b5bf-d945e8eff4b2))
+    (fp_line (start 7.75 -2.05) (end 8.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 258fcb41-7033-4835-9fdf-423793cb23b3))
+    (fp_line (start 4.75 -2.4) (end 4.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 2afa4af3-c77f-43e1-bb65-33635d9d9bde))
+    (fp_line (start 2.25 -2.4) (end 2 -3.4) (layer "F.SilkS") (width 0.12) (uuid 302baa85-ea14-4bc3-9ee0-750ac99c372c))
+    (fp_line (start 2.75 -2.05) (end 2.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 30ebadca-c9f5-4eef-93a6-e46a7f5dcb8a))
+    (fp_line (start 0.75 -2.05) (end 1.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 3311faf7-cebf-4b03-887f-81682eb2d766))
+    (fp_line (start 2.75 2.25) (end 2 2.25) (layer "F.SilkS") (width 0.12) (uuid 37f83d32-45f1-46b2-96b2-a40681275916))
+    (fp_line (start 8.5 -3.4) (end 8.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 3e7ae60c-e895-4a5a-a7e3-6a535a3a8283))
+    (fp_line (start -1.5 2.25) (end -1.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 4713b701-0d77-40e8-8184-3a11f9df2324))
+    (fp_line (start 2 2.25) (end 2 -2.05) (layer "F.SilkS") (width 0.12) (uuid 48eaa494-0ad3-4e7e-a203-8b82c0c90232))
+    (fp_line (start 0.75 -2.4) (end 0.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 49b3f8e5-beb0-46c0-af33-92b06a5bdff5))
+    (fp_line (start 1.5 2.25) (end 0.75 2.25) (layer "F.SilkS") (width 0.12) (uuid 4b9cce0d-afc3-48b9-a22f-0ea23c5574b8))
+    (fp_line (start -2.56 3.11) (end 13.06 3.11) (layer "F.SilkS") (width 0.12) (uuid 5166ee21-16cc-47d4-a438-2c0e2aa8959c))
+    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.SilkS") (width 0.12) (uuid 5c458ff7-d3f7-4417-a611-6f2981d0e9cc))
+    (fp_line (start 1.5 -3.4) (end 1.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 67dca7e5-24d8-4654-9579-d6404307654b))
+    (fp_line (start 5.5 -2.05) (end 6.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid 68310a47-af11-4665-bffb-5d4b7b98d48d))
+    (fp_line (start 8.5 -2.05) (end 8.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 6b1d8153-1929-422b-bfbd-285ab66db86b))
+    (fp_line (start -0.75 -2.4) (end -1.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 6d8a3226-b0be-4ce6-99a7-7bc208219506))
+    (fp_line (start 5.5 2.25) (end 5.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 702c939c-cd20-4967-a0a8-e2ffe549a816))
+    (fp_line (start -2.56 -4.36) (end -2.56 3.11) (layer "F.SilkS") (width 0.12) (uuid 76c255ae-be6f-425d-a22f-ead2d9b08f5a))
+    (fp_line (start 6.25 -2.4) (end 5.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 77db9235-89b0-4b41-9039-5e76b93e13e4))
+    (fp_line (start 11.75 -2.4) (end 11.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 7b4da999-f9e4-4c1d-bc75-0b3a3ebad32a))
+    (fp_line (start 9.25 -2.4) (end 9 -3.4) (layer "F.SilkS") (width 0.12) (uuid 7e67823e-2810-490d-bd9b-8b337d7a4ad5))
+    (fp_line (start 7.75 -2.4) (end 7.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 830d86b3-78eb-4c6c-a352-bf19ba50bd18))
+    (fp_line (start 13.06 3.11) (end 13.06 -4.36) (layer "F.SilkS") (width 0.12) (uuid 83aeead6-c04f-4f61-9dc1-08cad4116066))
+    (fp_line (start -1.5 -3.4) (end 1.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 8bf37a13-e175-4246-a4f0-4ab526c58c2e))
+    (fp_line (start 9 2.25) (end 9 -2.05) (layer "F.SilkS") (width 0.12) (uuid 8c64c50b-8acd-44f2-8c5f-ba9201a3c7bd))
+    (fp_line (start 5 2.25) (end 4.25 2.25) (layer "F.SilkS") (width 0.12) (uuid 8c8154c7-2b7b-44e1-8694-dfe76312b3d9))
+    (fp_line (start 1.25 -2.4) (end 0.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 9e477ee6-ad97-4cd4-b02b-4729979c40e2))
+    (fp_line (start 11.25 -2.05) (end 12 -2.05) (layer "F.SilkS") (width 0.12) (uuid a23e3eb7-dcb3-4b09-a1b0-ba2cb214f0a5))
+    (fp_line (start 8.25 -2.4) (end 7.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid a2abc84b-8987-4a83-b329-dceb6c04fe7c))
+    (fp_line (start -0.75 -2.05) (end -0.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid a7e7a44c-68d8-4576-a798-ee1db6824dc3))
+    (fp_line (start 5 -2.05) (end 5 2.25) (layer "F.SilkS") (width 0.12) (uuid abb284d1-6005-460a-b044-acdfa77fc3f5))
+    (fp_line (start 4.25 -2.4) (end 4.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid ae1dcbf9-6071-40f9-ab17-78192e75b9a1))
+    (fp_line (start -1.25 -2.4) (end -1.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid ae923668-2cb7-47ea-99c5-b6a079045296))
+    (fp_line (start 12 -2.05) (end 12 2.25) (layer "F.SilkS") (width 0.12) (uuid b3a5f2e6-3207-4af3-89e3-6d0fa469246e))
+    (fp_line (start 2 -2.05) (end 2.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid b401eca2-204c-47b0-a6cc-cbd09a8de2ad))
+    (fp_line (start 11.25 -2.4) (end 11.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid b589a08d-5a8e-4bb2-90d4-ef5270d09c90))
+    (fp_line (start 2.75 -2.4) (end 2.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid c47a7547-e6f0-4cd8-b807-5ca888e9c3ce))
+    (fp_line (start 9.75 -2.4) (end 9.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid cc96e2af-7657-4ad3-b12e-a025de438a67))
+    (fp_line (start 5 -3.4) (end 4.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid cd82725d-cd4e-4b86-b196-accebbf4a913))
+    (fp_line (start 9.75 -2.05) (end 9.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid d7fda904-08f2-46d0-8e07-896b262d7e46))
+    (fp_line (start 6.25 2.25) (end 5.5 2.25) (layer "F.SilkS") (width 0.12) (uuid e2bf3c5a-b014-4f85-8305-86de33fb2476))
+    (fp_line (start 9 -3.4) (end 12 -3.4) (layer "F.SilkS") (width 0.12) (uuid e9f6f543-7ec8-488b-9aca-e6a196514d16))
+    (fp_line (start 13.06 -4.36) (end -2.56 -4.36) (layer "F.SilkS") (width 0.12) (uuid eb2337fd-ed0c-4c82-a320-4407e6ace0bd))
+    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.SilkS") (width 0.12) (uuid ed095ff3-b1af-4001-bf59-d68ad7ef3289))
+    (fp_line (start 9.75 2.25) (end 9 2.25) (layer "F.SilkS") (width 0.12) (uuid fa37a123-2087-449f-b3d4-b734192c4b4e))
+    (fp_line (start 8.5 2.25) (end 7.75 2.25) (layer "F.SilkS") (width 0.12) (uuid fec34bd8-21b5-4daa-be59-cc1bb53df336))
+    (fp_arc (start 6.25 2.25) (mid 6.999807 2.09191) (end 7.749647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 194e61d5-d73f-45e1-86ab-95585456b360))
+    (fp_arc (start 2.75 2.25) (mid 3.499807 2.09191) (end 4.249647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 262f677a-322e-4b8f-8c30-977fdf9e837a))
+    (fp_arc (start 9.75 2.25) (mid 10.499807 2.09191) (end 11.249647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 485f2f0b-adc4-4fd0-914c-e6cdebf32b20))
+    (fp_arc (start -0.75 2.25) (mid -0.000193 2.09191) (end 0.749647 2.249844) (layer "F.SilkS") (width 0.12) (uuid d07c9852-1fa4-40ca-9b3a-45379faf2beb))
+    (fp_line (start -2.95 -4.75) (end -2.95 3.5) (layer "F.CrtYd") (width 0.05) (uuid 15a65612-f6a1-48be-8425-8f5afb06c4fd))
+    (fp_line (start 13.45 -4.75) (end -2.95 -4.75) (layer "F.CrtYd") (width 0.05) (uuid 9f2913ee-f300-41d4-9b7a-339ae5970c4d))
+    (fp_line (start -2.95 3.5) (end 13.45 3.5) (layer "F.CrtYd") (width 0.05) (uuid c464ac67-d07b-4878-905a-ea6f8d27cd1e))
+    (fp_line (start 13.45 3.5) (end 13.45 -4.75) (layer "F.CrtYd") (width 0.05) (uuid f4a6f22f-2296-4e86-8dc7-ba0df5bfb77c))
+    (fp_line (start -2.45 -4.25) (end -2.45 3) (layer "F.Fab") (width 0.1) (uuid 534d87c1-bf1e-4965-ad11-3e2aa081e8e8))
+    (fp_line (start 12.95 -4.25) (end -2.45 -4.25) (layer "F.Fab") (width 0.1) (uuid 549455c3-ab6e-454e-94b0-5ca9e521ae0b))
+    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.Fab") (width 0.1) (uuid 6b74ce51-0851-44d9-ba35-f631aa075f73))
+    (fp_line (start 12.95 3) (end 12.95 -4.25) (layer "F.Fab") (width 0.1) (uuid c6821f6d-ae1c-499e-ad7d-74e9a034a4b5))
+    (fp_line (start -2.45 3) (end 12.95 3) (layer "F.Fab") (width 0.1) (uuid c7bd964e-6063-4802-85ea-2a5dd3fba324))
+    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.Fab") (width 0.1) (uuid d0bf1a00-cfe8-4773-a4cd-b6dcc139ab1d))
+    (pad "1" thru_hole roundrect locked (at 0 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask) (roundrect_rratio 0.1388888889)
+      (net 1 "/NET1") (pinfunction "CM") (pintype "passive") (uuid 11af36ff-3959-41d6-86f2-35df83d416be))
+    (pad "2" thru_hole oval locked (at 3.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 2 "unconnected-(SW101-Pad2)") (pinfunction "D0") (pintype "passive+no_connect") (uuid 95367dce-7348-4e46-8b79-617f0b078986))
+    (pad "3" thru_hole oval locked (at 7 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 3 "unconnected-(SW101-Pad3)") (pinfunction "D1") (pintype "passive+no_connect") (uuid 11e65687-dee5-42e2-a938-d539a0761571))
+    (pad "4" thru_hole oval locked (at 10.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 4 "/HIER_LABEL") (pinfunction "D2") (pintype "passive") (uuid 9eacd685-19fc-4714-9d5a-cb390df54aea))
+    (model "${KICAD6_3DMODEL_DIR}/Connector_Phoenix_MC.3dshapes/PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical.wrl"
+      (offset (xyz 0 0 0))
+      (scale (xyz 1 1 1))
+      (rotate (xyz 0 0 0))
+    )
+  )
+
+  (footprint "Button_Switch_THT:KSA_Tactile_SPST" (layer "F.Cu")
+    (tedit 5A02FE31) (uuid ed271cf0-3644-46cb-8a42-a46a5167bf3a)
+    (at 89.525 96.075)
+    (descr "KSA http://www.ckswitches.com/media/1457/ksa_ksl.pdf")
+    (tags "SWITCH SMD KSA SW")
+    (attr through_hole)
+    (fp_text reference "REF**" (at 2.54 -2) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid a12511d6-4c71-4b67-a69e-bd467835661b)
+    )
+    (fp_text value "KSA_Tactile_SPST" (at 2.54 10) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 53f096c1-b7f7-4874-85c3-924e94be286f)
+    )
+    (fp_text user "${REFERENCE}" (at 2.54 4) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 6b964f6c-f00c-401e-8610-6bad4637fe5c)
+    )
+    (fp_line (start 6.35 8.89) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (uuid 1b5dc09e-ca2b-4554-ac89-aae722507997))
+    (fp_line (start -1.27 -1.27) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (uuid 3214ed34-563c-460f-89e6-d8867c1cc4d2))
+    (fp_line (start -1.27 -1.27) (end -1.27 8.89) (layer "F.SilkS") (width 0.12) (uuid 3de0b227-472e-4982-9629-f04af83c07a9))
+    (fp_line (start -1.27 8.89) (end 6.35 8.89) (layer "F.SilkS") (width 0.12) (uuid 88343d9a-29c0-4487-b63e-ec337e903e90))
+    (fp_circle (center 2.54 3.81) (end 0.54 3.81) (layer "F.SilkS") (width 0.12) (fill none) (uuid 9cf6862a-c0fd-40f3-a4fa-9e9556bb2763))
+    (fp_line (start 6.49 8.75) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (uuid 1c5ec7dc-5f51-4802-a669-cad436b66b04))
+    (fp_line (start -1.41 -1.14) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (uuid 924f5213-afbb-4698-8672-719373011a99))
+    (fp_line (start -1.41 -1.14) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (uuid 9859c259-3292-45a3-af2d-b6599b20ac97))
+    (fp_line (start 6.49 8.75) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (uuid c08fbfd3-8364-4a63-b1e9-c40a8e38215b))
+    (fp_line (start -1.16 7.91) (end 6.24 7.91) (layer "F.Fab") (width 0.1) (uuid 3e56d9ee-e4f1-41fc-9d6a-2d6e6e8ad807))
+    (fp_line (start -1.16 7.91) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (uuid 572d3c99-e59e-4806-82c8-859558b9b13b))
+    (fp_line (start 6.24 -0.29) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (uuid 5c709334-45d7-4554-9230-9b41117caa33))
+    (fp_line (start 6.24 7.91) (end 6.24 -0.29) (layer "F.Fab") (width 0.1) (uuid e930be25-e735-4d31-9a6c-7edf2422df64))
+    (pad "1" thru_hole circle locked (at 0 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid a651f5b0-a0e4-4740-98e6-9187d16156f9))
+    (pad "2" thru_hole circle locked (at 5.08 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 8ca2c50b-bf3a-438b-a227-f2ee9e498fd9))
+    (pad "3" thru_hole circle locked (at 5.08 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid c1291491-bcea-4574-b726-596afcbff93e))
+    (pad "4" thru_hole circle locked (at 2.54 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 676ccbc4-b247-4ed4-9cf8-54a2b7e7576a))
+    (pad "5" thru_hole circle locked (at 0 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 91f2b286-8ad5-4def-9631-08c498eb7cb7))
+    (model "${KICAD6_3DMODEL_DIR}/Button_Switch_THT.3dshapes/KSA_Tactile_SPST.wrl"
+      (offset (xyz 0 0 0))
+      (scale (xyz 1 1 1))
+      (rotate (xyz 0 0 0))
+    )
+  )
+
+  (gr_rect locked (start 147.025 116.75) (end 157.925 105.85) (layer "F.Cu") (width 0.2) (fill none) (uuid 18f33c15-2d89-4304-9c8f-98c3582bdb83))
+  (gr_poly locked
+    (pts
+      (xy 188.4 119.05)
+      (xy 182.7 119.05)
+      (xy 182.7 110.8)
+      (xy 188.4 105.1)
+    ) (layer "F.Cu") (width 0.2) (fill solid) (uuid 4255abab-787c-46e3-9144-7ad5270c0729))
+  (gr_circle locked (center 168.8 112.075) (end 174.025 106.85) (layer "F.Cu") (width 0.2) (fill none) (uuid 84c6ade4-472b-49ab-bf5d-7989d8cac908))
+  (gr_arc (start 103.852782 112.425) (mid 108.738891 110.401107) (end 113.625 112.425) (layer "F.Cu") (width 0.2) (uuid b1ddb058-f7b2-429c-9489-f4e2242ad7e5))
+  (gr_text "buried via" (at 156.875 98.25) (layer "Eco1.User") (uuid 49dcd1b7-f635-4f5a-8a01-f8c834a847dc)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "seg. locked" (at 143.9 92.95) (layer "Eco1.User") (uuid 65f11e1d-190b-4074-a639-471d7ae0fbd9)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify left))
+  )
+  (gr_text "via" (at 156.8 95.85) (layer "Eco1.User") (uuid aaedf2ea-4032-4703-9274-9907b7dc3e85)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "micro via" (at 156.975 100.075) (layer "Eco1.User") (uuid cea17333-7d14-4b4f-a096-7d6db0e55544)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "segment" (at 152.3 90.25) (layer "Eco1.User") (uuid e8055a1b-b857-489c-a9c9-cfccd187e14d)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 00c745e6-aece-4592-bb45-863e0c3493e6)
+    (pts (xy 195.53876 71.610323) (xy 222.33876 63.010323))
+    (height -2.473234)
+    (gr_text "28,1460 mm" (at 207.831685 63.860365 17.79120311) (layer "Dwgs.User") (uuid 00c745e6-aece-4592-bb45-863e0c3493e6)
+      (effects (font (size 1 1) (thickness 0.15) italic))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
+    (pts (xy 193.33876 65.060323) (xy 220.13876 56.460323))
+    (height -2.267462)
+    (gr_text "28,1460 mm" (at 205.694558 57.506296 17.79120311) (layer "Dwgs.User") (uuid 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
+      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 5841a60a-7434-4694-9b2f-60c2321b8bd0)
+    (pts (xy 199.6 87.1) (xy 226.4 78.5))
+    (height -11.090722)
+    (gr_text "28,1460 mm" (at 209.259859 71.144674 17.79120311) (layer "Dwgs.User") (uuid 5841a60a-7434-4694-9b2f-60c2321b8bd0)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
+    (pts (xy 194.38876 68.410323) (xy 221.18876 59.810323))
+    (height -2.69421)
+    (gr_text "28,1460 mm" (at 206.614166 60.449957 17.79120311) (layer "Dwgs.User") (uuid 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
+      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
+    (pts (xy 217.835151 147.360714) (xy 198.185151 127.360714))
+    (height -11.684997)
+    (gr_text "pre\"fix\"hello i \"am overwritten\" mmsuf\"fix\"" (at 200.495319 144.744037 -45.50575037) (layer "Dwgs.User") (uuid bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) (override_value "hello i \"am overwritten\"") suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid d13f6c50-ce8f-484d-9604-839a4d68748d)
+    (pts (xy 231.035151 118.060714) (xy 211.385151 98.060714))
+    (height -11.684997)
+    (gr_text "28,0379 mm" (at 213.695319 115.444037 -45.50575037) (layer "Dwgs.User") (uuid d13f6c50-ce8f-484d-9604-839a4d68748d)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4) suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid de180ffc-3a6e-4a65-ab2c-90a4360b215c)
+    (pts (xy 228.685151 136.360714) (xy 209.035151 116.360714))
+    (height -11.684997)
+    (gr_text "pre\"fix\"28,0379 mmsuf\"fix\"" (at 211.345319 133.744037 -45.50575037) (layer "Dwgs.User") (uuid de180ffc-3a6e-4a65-ab2c-90a4360b215c)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid ff870511-3a90-49f1-9990-5aec7ad35822)
+    (pts (xy 235.75 99.75) (xy 216.1 79.75))
+    (height -11.684997)
+    (gr_text "28,0379 mm" (at 218.410168 97.133323 -45.50575037) (layer "Dwgs.User") (uuid ff870511-3a90-49f1-9990-5aec7ad35822)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
+    (pts (xy 236.05 90.15) (xy 242.9 84.25))
+    (gr_text "hello i am a test" (at 249.1 90.45) (layer "Dwgs.User") (uuid 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
+    (pts (xy 235.015611 93.021751) (xy 226 92.35))
+    (gr_text "hello i am a test \"quoted\"" (at 226 83.581876 135) (layer "Dwgs.User") (uuid 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\""))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
+    (pts (xy 251.15 120.15) (xy 258 114.25))
+    (gr_text "hello i am a test" (at 264.2 120.45) (layer "Dwgs.User") (uuid 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 2) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 8006915c-347c-427e-8da6-50ddf24e6b51)
+    (pts (xy 247.65 130.55) (xy 254.5 124.65))
+    (gr_text "hello i am a test" (at 260.7 130.85) (layer "Dwgs.User") (uuid 8006915c-347c-427e-8da6-50ddf24e6b51)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 1) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 84c59850-a617-4b8e-9935-4a3c13fa674f)
+    (pts (xy 239.9 93.1) (xy 245.8 99.949999))
+    (gr_text "hello i am a test \"quoted\" cursive" (at 239.6 106.149999 270) (layer "Dwgs.User") (uuid 84c59850-a617-4b8e-9935-4a3c13fa674f)
+      (effects (font (size 1 1) (thickness 0.15) italic))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
+    (pts (xy 174.65 117.55) (xy 180.55 124.399999))
+    (gr_text "hello i am a test \"quoted\" mirrored" (at 174.35 130.599999 270) (layer "Dwgs.User") (uuid a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
+      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" mirrored"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
+    (pts (xy 138.35 115.8) (xy 131.500001 121.7))
+    (gr_text "hello i am a test \"quoted\" cursive mirrored" (at 125.300001 115.5 180) (layer "Dwgs.User") (uuid b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
+      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive mirrored"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type center) (layer "Dwgs.User") (uuid 61c5e7b9-ec75-459b-8f55-aa6dcdc47663)
+    (pts (xy 236.2 90.2) (xy 243.2 90.2))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type center) (layer "Dwgs.User") (uuid cc6d04c1-5e89-4a69-8589-2307dd2129a4)
+    (pts (xy 261.6 91.35) (xy 272 80.95))
+    (style (thickness 0.5) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 01eecbde-a293-4e72-9ab7-4a5a43218203)
+    (pts (xy 253.85 51.5) (xy 279.85 52.35))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 264.1 50.4) (layer "Dwgs.User") (uuid 01eecbde-a293-4e72-9ab7-4a5a43218203)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 2) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 030f7528-01d8-4f5d-b375-396511a3f702)
+    (pts (xy 226.4 78) (xy 252.4 78.85))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "26,0000 mm" (at 239.4 68.45) (layer "Dwgs.User") (uuid 030f7528-01d8-4f5d-b375-396511a3f702)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 03748331-c066-4d57-aa54-2f8ca06e3f46)
+    (pts (xy 253.55 76.05) (xy 279.55 76.9))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.0 mm" (at 266.55 73.75) (layer "Dwgs.User") (uuid 03748331-c066-4d57-aa54-2f8ca06e3f46)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 1))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
+    (pts (xy 253.5 48.95) (xy 279.5 49.8))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.5 46.65) (layer "Dwgs.User") (uuid 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
+      (effects (font (size 1 1) (thickness 0.15)) (justify left))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
+    (pts (xy 253.55 61.25) (xy 279.55 62.1))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26" (at 266.55 58.95) (layer "Dwgs.User") (uuid 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 0) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 30508594-c6b7-4560-96ac-05f6655ba783)
+    (pts (xy 253.55 45.95) (xy 279.55 46.8))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 43.65) (layer "Dwgs.User") (uuid 30508594-c6b7-4560-96ac-05f6655ba783)
+      (effects (font (size 1 1) (thickness 0.15)) (justify right))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 3f6d185e-f550-440a-899d-361dc95bf216)
+    (pts (xy 253.55 68.75) (xy 279.55 69.6))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.0000 mm" (at 266.55 66.45) (layer "Dwgs.User") (uuid 3f6d185e-f550-440a-899d-361dc95bf216)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 60bfe360-791c-4b4d-8701-dc29f0022c68)
+    (pts (xy 253.55 58) (xy 279.55 58.85))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 (mm)" (at 266.55 55.7) (layer "Dwgs.User") (uuid 60bfe360-791c-4b4d-8701-dc29f0022c68)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 2) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 617f513f-16c9-4ee5-8499-a80fee4befb0)
+    (pts (xy 226.6 49.6) (xy 252.6 50.45))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "1.0236 in" (at 239.6 40.05) (layer "Dwgs.User") (uuid 617f513f-16c9-4ee5-8499-a80fee4befb0)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 8e806abb-0abf-436e-9eb2-accf0328e785)
+    (pts (xy 253.55 54.55) (xy 279.55 55.4))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 53.4) (layer "Dwgs.User") (uuid 8e806abb-0abf-436e-9eb2-accf0328e785)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 1) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 96e02d72-1a83-4ed2-a755-b81e76c5893f)
+    (pts (xy 253.55 71.25) (xy 279.55 72.1))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.000 mm" (at 266.55 68.95) (layer "Dwgs.User") (uuid 96e02d72-1a83-4ed2-a755-b81e76c5893f)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 3))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
+    (pts (xy 253.55 73.65) (xy 279.55 74.5))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.00 mm" (at 266.55 71.35) (layer "Dwgs.User") (uuid 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 2))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid a53fb125-0a87-4020-929f-425458b00a06)
+    (pts (xy 226.45 58.95) (xy 252.45 59.8))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "1023.6220 mils" (at 239.45 49.4) (layer "Dwgs.User") (uuid a53fb125-0a87-4020-929f-425458b00a06)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 1) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid e5614058-70e1-453c-9f71-7593e14c6cda)
+    (pts (xy 253.55 66.2) (xy 279.55 67.05))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.00000 mm" (at 266.55 63.9) (layer "Dwgs.User") (uuid e5614058-70e1-453c-9f71-7593e14c6cda)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 5))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
+    (pts (xy 226.4 68.15) (xy 252.4 69))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "26.0000 mm" (at 239.4 58.6) (layer "Dwgs.User") (uuid e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
+    (pts (xy 253.55 78.35) (xy 279.55 79.2))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 76.05) (layer "Dwgs.User") (uuid ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (target plus (at 185.8 93.35) (size 5) (width 0.1) (layer "Edge.Cuts") (uuid 3bf82ecb-0898-4a14-bef0-d88c4f838b87))
+  (target x (at 187.95 98.8) (size 4) (width 1) (layer "Edge.Cuts") (uuid 47941cd1-b5c0-40bd-bc68-af434db15455))
+
+  (segment (start 124.6875 110.7875) (end 125.9625 109.5125) (width 0.25) (layer "F.Cu") (net 0) (uuid 504cb9e4-5572-4208-bc9d-30a7efff8b9a))
+  (segment (start 159.025 90.4) (end 165.575 90.4) (width 0.25) (layer "F.Cu") (net 0) (uuid 50bf00c7-c69d-47e9-8d7f-002d8001f5dd))
+  (segment (start 125.9625 109.5125) (end 125.9625 102.4125) (width 0.25) (layer "F.Cu") (net 0) (uuid a6187c22-3622-4a1a-a49a-b21e96986f96))
+  (segment locked (start 159.175 92.975) (end 165.725 92.975) (width 0.25) (layer "F.Cu") (net 0) (uuid c5a64cb0-571c-4101-abb8-a1e8072455d4))
+  (segment (start 119.9625 110.7875) (end 124.6875 110.7875) (width 0.25) (layer "F.Cu") (net 0) (uuid e1df8cea-32a4-457d-86df-d8e326022a52))
+  (segment (start 125.9625 102.4125) (end 119.6875 96.1375) (width 0.25) (layer "F.Cu") (net 0) (uuid fda94f0a-876e-4bf0-ad10-35819851e3e9))
+  (via (at 132.5125 111.2125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 061b0977-703d-47fc-ba64-d6fb3f8737c3))
+  (via blind (at 172 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 0b395f32-97e7-46c6-81cd-8e3bc4675bce))
+  (via micro (at 169.3 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 395a31c4-0d27-409b-a4a6-ae65750e20db))
+  (via locked (at 163.125 95.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 3b1a1b76-9d29-4248-9ac9-c210fdba845b))
+  (via (at 159.925 95.775) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 3e210438-9173-4d97-83d2-94157dc53997))
+  (via micro (at 160.1 100) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 4c281a99-3a6b-44dc-8cbd-1a650e634550))
+  (via micro (at 163.3 100.025) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 502d494e-96a1-40b8-8acf-8ae38ec1c400))
+  (via (at 171.925 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 7589d575-3c60-4338-8ad2-67381d8dbc00))
+  (via blind (at 163.2 98.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 77fe0dab-427e-435f-9eed-6fa58fe5cee1))
+  (via blind (at 166.275 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 79a898f8-ad5e-4dbc-aa10-5d83271b9b43))
+  (via blind (at 169.2 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 8c872ef3-cd1d-4b0d-96d3-51a74e92ff52))
+  (via blind (at 160 98.175) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 954cb567-fc2b-4b8d-918a-46eb7b1f43e2))
+  (via micro (at 172.1 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid afce51bc-694a-4ac0-b46f-9657eb6057d8))
+  (via blind locked (at 128.4375 106.0125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid b2cac11a-5f3b-43d7-88e5-8d0241ac6453))
+  (via locked (at 174.6 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid ba1f567b-429c-4539-9500-750f9f41e977))
+  (via blind (at 174.675 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid c02cbdff-6228-4696-9621-0c9f24504b5a))
+  (via locked (at 169.125 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid c5dbc2f4-347d-4e8b-9dc5-05ae6c8ee4e9))
+  (via micro (at 166.375 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid ed159ec6-8461-40d0-99dc-879cac3b491e))
+  (via (at 166.2 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid f5a28a1a-7f56-478a-aad0-76861dd7b0e0))
+  (via micro (at 174.775 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid f90de4aa-337a-492e-a29b-d742cf541973))
+  (via micro (at 127.5625 98.8875) (size 0.8) (drill 0.4) (layers "In1.Cu" "B.Cu") (free) (net 0) (uuid 557d128f-cf69-4c70-9959-d139ac95c63c))
+  (segment (start 129.6375 99.8625) (end 129.6375 107.5125) (width 0.25) (layer "F.Cu") (net 4) (uuid 58588507-da7d-4bcc-b9cd-bfc861c19ac1))
+  (segment (start 114.0875 101.8875) (end 114.0875 95.7625) (width 0.25) (layer "F.Cu") (net 4) (uuid 6586c7bc-7012-4335-b0bd-43918f23a8fd))
+  (segment (start 116.2875 93.5625) (end 123.3375 93.5625) (width 0.25) (layer "F.Cu") (net 4) (uuid 71ae16fb-a509-4131-a92e-a0b0b25743ff))
+  (segment (start 114.0875 95.7625) (end 116.2875 93.5625) (width 0.25) (layer "F.Cu") (net 4) (uuid 93bf1c04-96c6-49e8-9a85-ee6cc4606fcb))
+  (segment (start 123.3375 93.5625) (end 129.6375 99.8625) (width 0.25) (layer "F.Cu") (net 4) (uuid f07599c7-599f-45fe-bd1e-15999cff5f04))
+
+  (zone locked (net 4) (net_name "/HIER_LABEL") (layers "F.Cu" "In18.Cu" "In21.Cu") (uuid 001057ce-186a-458c-93e5-a6d8479d28a0) (name "test") (hatch full 0.508)
+    (priority 2)
+    (connect_pads (clearance 0.508))
+    (min_thickness 0.254) (filled_areas_thickness no)
+    (fill yes (mode hatch) (thermal_gap 0.508) (thermal_bridge_width 0.508) (smoothing chamfer) (island_removal_mode 2) (island_area_min 1)
+      (hatch_thickness 1.016) (hatch_gap 1.524) (hatch_orientation 0)
+      (hatch_smoothing_level 1) (hatch_smoothing_value 0.1)
+      (hatch_border_algorithm hatch_thickness) (hatch_min_hole_area 0.3))
+    (polygon
+      (pts
+        (xy 170.375 133)
+        (xy 155.55 133)
+        (xy 155.55 130)
+        (xy 146.425 130)
+        (xy 156.9 119.525)
+      )
+    )
+    (filled_polygon
+      (layer "F.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 156.94919 131.3858)
+        (xy 157.07858 131.51519)
+        (xy 158.3458 131.51519)
+        (xy 158.47519 131.3858)
+        (xy 159.48919 131.3858)
+        (xy 159.61858 131.51519)
+        (xy 160.8858 131.51519)
+        (xy 161.01519 131.3858)
+        (xy 162.02919 131.3858)
+        (xy 162.15858 131.51519)
+        (xy 163.4258 131.51519)
+        (xy 163.55519 131.3858)
+        (xy 164.56919 131.3858)
+        (xy 164.69858 131.51519)
+        (xy 165.9658 131.51519)
+        (xy 166.09519 131.3858)
+        (xy 166.09519 130.33522)
+        (xy 165.74916 129.98919)
+        (xy 164.69858 129.98919)
+        (xy 164.56919 130.11858)
+        (xy 164.56919 131.3858)
+        (xy 163.55519 131.3858)
+        (xy 163.55519 130.11858)
+        (xy 163.4258 129.98919)
+        (xy 162.15858 129.98919)
+        (xy 162.02919 130.11858)
+        (xy 162.02919 131.3858)
+        (xy 161.01519 131.3858)
+        (xy 161.01519 130.11858)
+        (xy 160.8858 129.98919)
+        (xy 159.61858 129.98919)
+        (xy 159.48919 130.11858)
+        (xy 159.48919 131.3858)
+        (xy 158.47519 131.3858)
+        (xy 158.47519 130.11858)
+        (xy 158.3458 129.98919)
+        (xy 157.07858 129.98919)
+        (xy 156.94919 130.11858)
+        (xy 156.94919 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 151.67719 130)
+        (xy 151.609069 129.979998)
+        (xy 151.588095 129.963095)
+        (xy 150.43518 128.81018)
+        (xy 151.86919 128.81018)
+        (xy 151.91701 128.858)
+        (xy 153.38299 128.858)
+        (xy 153.39519 128.8458)
+        (xy 154.40919 128.8458)
+        (xy 154.42139 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.863166 128.917824)
+        (xy 155.93519 128.8458)
+        (xy 156.94919 128.8458)
+        (xy 157.07858 128.97519)
+        (xy 158.3458 128.97519)
+        (xy 158.47519 128.8458)
+        (xy 159.48919 128.8458)
+        (xy 159.61858 128.97519)
+        (xy 160.8858 128.97519)
+        (xy 161.01519 128.8458)
+        (xy 162.02919 128.8458)
+        (xy 162.15858 128.97519)
+        (xy 163.4258 128.97519)
+        (xy 163.55519 128.8458)
+        (xy 163.55519 127.79522)
+        (xy 163.20916 127.44919)
+        (xy 162.15858 127.44919)
+        (xy 162.02919 127.57858)
+        (xy 162.02919 128.8458)
+        (xy 161.01519 128.8458)
+        (xy 161.01519 127.57858)
+        (xy 160.8858 127.44919)
+        (xy 159.61858 127.44919)
+        (xy 159.48919 127.57858)
+        (xy 159.48919 128.8458)
+        (xy 158.47519 128.8458)
+        (xy 158.47519 127.57858)
+        (xy 158.3458 127.44919)
+        (xy 157.07858 127.44919)
+        (xy 156.94919 127.57858)
+        (xy 156.94919 128.8458)
+        (xy 155.93519 128.8458)
+        (xy 155.93519 127.57858)
+        (xy 155.8058 127.44919)
+        (xy 154.53858 127.44919)
+        (xy 154.40919 127.57858)
+        (xy 154.40919 128.8458)
+        (xy 153.39519 128.8458)
+        (xy 153.39519 127.57858)
+        (xy 153.2658 127.44919)
+        (xy 151.99858 127.44919)
+        (xy 151.86919 127.57858)
+        (xy 151.86919 128.81018)
+        (xy 150.43518 128.81018)
+        (xy 149.114095 127.489095)
+        (xy 149.080069 127.426783)
+        (xy 149.085134 127.355968)
+        (xy 149.114095 127.310905)
+        (xy 150.1192 126.3058)
+        (xy 151.86919 126.3058)
+        (xy 151.99858 126.43519)
+        (xy 153.2658 126.43519)
+        (xy 153.39519 126.3058)
+        (xy 154.40919 126.3058)
+        (xy 154.53858 126.43519)
+        (xy 155.8058 126.43519)
+        (xy 155.93519 126.3058)
+        (xy 156.94919 126.3058)
+        (xy 157.07858 126.43519)
+        (xy 158.3458 126.43519)
+        (xy 158.47519 126.3058)
+        (xy 159.48919 126.3058)
+        (xy 159.61858 126.43519)
+        (xy 160.8858 126.43519)
+        (xy 161.01519 126.3058)
+        (xy 161.01519 125.25522)
+        (xy 160.66916 124.90919)
+        (xy 159.61858 124.90919)
+        (xy 159.48919 125.03858)
+        (xy 159.48919 126.3058)
+        (xy 158.47519 126.3058)
+        (xy 158.47519 125.03858)
+        (xy 158.3458 124.90919)
+        (xy 157.07858 124.90919)
+        (xy 156.94919 125.03858)
+        (xy 156.94919 126.3058)
+        (xy 155.93519 126.3058)
+        (xy 155.93519 125.03858)
+        (xy 155.8058 124.90919)
+        (xy 154.53858 124.90919)
+        (xy 154.40919 125.03858)
+        (xy 154.40919 126.3058)
+        (xy 153.39519 126.3058)
+        (xy 153.39519 125.03858)
+        (xy 153.2658 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.86919 126.17084)
+        (xy 151.86919 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.40919 123.7658)
+        (xy 154.53858 123.89519)
+        (xy 155.8058 123.89519)
+        (xy 155.93519 123.7658)
+        (xy 156.94919 123.7658)
+        (xy 157.07858 123.89519)
+        (xy 158.3458 123.89519)
+        (xy 158.47519 123.7658)
+        (xy 158.47519 122.71522)
+        (xy 158.12916 122.36919)
+        (xy 157.07858 122.36919)
+        (xy 156.94919 122.49858)
+        (xy 156.94919 123.7658)
+        (xy 155.93519 123.7658)
+        (xy 155.93519 122.49858)
+        (xy 155.8058 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.40919 123.63084)
+        (xy 154.40919 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+    (filled_polygon
+      (layer "In18.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 157.01519 131.3858)
+        (xy 157.14458 131.51519)
+        (xy 158.4118 131.51519)
+        (xy 158.54119 131.3858)
+        (xy 159.55519 131.3858)
+        (xy 159.68458 131.51519)
+        (xy 160.9518 131.51519)
+        (xy 161.08119 131.3858)
+        (xy 162.09519 131.3858)
+        (xy 162.22458 131.51519)
+        (xy 163.4918 131.51519)
+        (xy 163.62119 131.3858)
+        (xy 164.63519 131.3858)
+        (xy 164.76458 131.51519)
+        (xy 166.0318 131.51519)
+        (xy 166.16119 131.3858)
+        (xy 166.16119 130.40122)
+        (xy 165.74916 129.98919)
+        (xy 164.76458 129.98919)
+        (xy 164.63519 130.11858)
+        (xy 164.63519 131.3858)
+        (xy 163.62119 131.3858)
+        (xy 163.62119 130.11858)
+        (xy 163.4918 129.98919)
+        (xy 162.22458 129.98919)
+        (xy 162.09519 130.11858)
+        (xy 162.09519 131.3858)
+        (xy 161.08119 131.3858)
+        (xy 161.08119 130.11858)
+        (xy 160.9518 129.98919)
+        (xy 159.68458 129.98919)
+        (xy 159.55519 130.11858)
+        (xy 159.55519 131.3858)
+        (xy 158.54119 131.3858)
+        (xy 158.54119 130.11858)
+        (xy 158.4118 129.98919)
+        (xy 157.14458 129.98919)
+        (xy 157.01519 130.11858)
+        (xy 157.01519 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 146.72919 130)
+        (xy 146.661069 129.979998)
+        (xy 146.614576 129.926342)
+        (xy 146.604472 129.856068)
+        (xy 146.633966 129.791488)
+        (xy 146.640095 129.784905)
+        (xy 147.5792 128.8458)
+        (xy 149.39519 128.8458)
+        (xy 149.40739 128.858)
+        (xy 150.90899 128.858)
+        (xy 150.92119 128.8458)
+        (xy 151.93519 128.8458)
+        (xy 151.94739 128.858)
+        (xy 153.44899 128.858)
+        (xy 153.46119 128.8458)
+        (xy 154.47519 128.8458)
+        (xy 154.48739 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.918216 128.928774)
+        (xy 156.00119 128.8458)
+        (xy 157.01519 128.8458)
+        (xy 157.14458 128.97519)
+        (xy 158.4118 128.97519)
+        (xy 158.54119 128.8458)
+        (xy 159.55519 128.8458)
+        (xy 159.68458 128.97519)
+        (xy 160.9518 128.97519)
+        (xy 161.08119 128.8458)
+        (xy 162.09519 128.8458)
+        (xy 162.22458 128.97519)
+        (xy 163.4918 128.97519)
+        (xy 163.62119 128.8458)
+        (xy 163.62119 127.86122)
+        (xy 163.20916 127.44919)
+        (xy 162.22458 127.44919)
+        (xy 162.09519 127.57858)
+        (xy 162.09519 128.8458)
+        (xy 161.08119 128.8458)
+        (xy 161.08119 127.57858)
+        (xy 160.9518 127.44919)
+        (xy 159.68458 127.44919)
+        (xy 159.55519 127.57858)
+        (xy 159.55519 128.8458)
+        (xy 158.54119 128.8458)
+        (xy 158.54119 127.57858)
+        (xy 158.4118 127.44919)
+        (xy 157.14458 127.44919)
+        (xy 157.01519 127.57858)
+        (xy 157.01519 128.8458)
+        (xy 156.00119 128.8458)
+        (xy 156.00119 127.57858)
+        (xy 155.8718 127.44919)
+        (xy 154.60458 127.44919)
+        (xy 154.47519 127.57858)
+        (xy 154.47519 128.8458)
+        (xy 153.46119 128.8458)
+        (xy 153.46119 127.57858)
+        (xy 153.3318 127.44919)
+        (xy 152.06458 127.44919)
+        (xy 151.93519 127.57858)
+        (xy 151.93519 128.8458)
+        (xy 150.92119 128.8458)
+        (xy 150.92119 127.57858)
+        (xy 150.7918 127.44919)
+        (xy 150.59084 127.44919)
+        (xy 149.39519 128.64484)
+        (xy 149.39519 128.8458)
+        (xy 147.5792 128.8458)
+        (xy 150.1192 126.3058)
+        (xy 151.93519 126.3058)
+        (xy 152.06458 126.43519)
+        (xy 153.3318 126.43519)
+        (xy 153.46119 126.3058)
+        (xy 154.47519 126.3058)
+        (xy 154.60458 126.43519)
+        (xy 155.8718 126.43519)
+        (xy 156.00119 126.3058)
+        (xy 157.01519 126.3058)
+        (xy 157.14458 126.43519)
+        (xy 158.4118 126.43519)
+        (xy 158.54119 126.3058)
+        (xy 159.55519 126.3058)
+        (xy 159.68458 126.43519)
+        (xy 160.9518 126.43519)
+        (xy 161.08119 126.3058)
+        (xy 161.08119 125.32122)
+        (xy 160.66916 124.90919)
+        (xy 159.68458 124.90919)
+        (xy 159.55519 125.03858)
+        (xy 159.55519 126.3058)
+        (xy 158.54119 126.3058)
+        (xy 158.54119 125.03858)
+        (xy 158.4118 124.90919)
+        (xy 157.14458 124.90919)
+        (xy 157.01519 125.03858)
+        (xy 157.01519 126.3058)
+        (xy 156.00119 126.3058)
+        (xy 156.00119 125.03858)
+        (xy 155.8718 124.90919)
+        (xy 154.60458 124.90919)
+        (xy 154.47519 125.03858)
+        (xy 154.47519 126.3058)
+        (xy 153.46119 126.3058)
+        (xy 153.46119 125.03858)
+        (xy 153.3318 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.93519 126.10484)
+        (xy 151.93519 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.47519 123.7658)
+        (xy 154.60458 123.89519)
+        (xy 155.8718 123.89519)
+        (xy 156.00119 123.7658)
+        (xy 157.01519 123.7658)
+        (xy 157.14458 123.89519)
+        (xy 158.4118 123.89519)
+        (xy 158.54119 123.7658)
+        (xy 158.54119 122.78122)
+        (xy 158.12916 122.36919)
+        (xy 157.14458 122.36919)
+        (xy 157.01519 122.49858)
+        (xy 157.01519 123.7658)
+        (xy 156.00119 123.7658)
+        (xy 156.00119 122.49858)
+        (xy 155.8718 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.47519 123.56484)
+        (xy 154.47519 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+    (filled_polygon
+      (layer "In21.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 157.01519 131.3858)
+        (xy 157.14458 131.51519)
+        (xy 158.4118 131.51519)
+        (xy 158.54119 131.3858)
+        (xy 159.55519 131.3858)
+        (xy 159.68458 131.51519)
+        (xy 160.9518 131.51519)
+        (xy 161.08119 131.3858)
+        (xy 162.09519 131.3858)
+        (xy 162.22458 131.51519)
+        (xy 163.4918 131.51519)
+        (xy 163.62119 131.3858)
+        (xy 164.63519 131.3858)
+        (xy 164.76458 131.51519)
+        (xy 166.0318 131.51519)
+        (xy 166.16119 131.3858)
+        (xy 166.16119 130.40122)
+        (xy 165.74916 129.98919)
+        (xy 164.76458 129.98919)
+        (xy 164.63519 130.11858)
+        (xy 164.63519 131.3858)
+        (xy 163.62119 131.3858)
+        (xy 163.62119 130.11858)
+        (xy 163.4918 129.98919)
+        (xy 162.22458 129.98919)
+        (xy 162.09519 130.11858)
+        (xy 162.09519 131.3858)
+        (xy 161.08119 131.3858)
+        (xy 161.08119 130.11858)
+        (xy 160.9518 129.98919)
+        (xy 159.68458 129.98919)
+        (xy 159.55519 130.11858)
+        (xy 159.55519 131.3858)
+        (xy 158.54119 131.3858)
+        (xy 158.54119 130.11858)
+        (xy 158.4118 129.98919)
+        (xy 157.14458 129.98919)
+        (xy 157.01519 130.11858)
+        (xy 157.01519 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 146.72919 130)
+        (xy 146.661069 129.979998)
+        (xy 146.614576 129.926342)
+        (xy 146.604472 129.856068)
+        (xy 146.633966 129.791488)
+        (xy 146.640095 129.784905)
+        (xy 147.5792 128.8458)
+        (xy 149.39519 128.8458)
+        (xy 149.40739 128.858)
+        (xy 150.90899 128.858)
+        (xy 150.92119 128.8458)
+        (xy 151.93519 128.8458)
+        (xy 151.94739 128.858)
+        (xy 153.44899 128.858)
+        (xy 153.46119 128.8458)
+        (xy 154.47519 128.8458)
+        (xy 154.48739 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.918216 128.928774)
+        (xy 156.00119 128.8458)
+        (xy 157.01519 128.8458)
+        (xy 157.14458 128.97519)
+        (xy 158.4118 128.97519)
+        (xy 158.54119 128.8458)
+        (xy 159.55519 128.8458)
+        (xy 159.68458 128.97519)
+        (xy 160.9518 128.97519)
+        (xy 161.08119 128.8458)
+        (xy 162.09519 128.8458)
+        (xy 162.22458 128.97519)
+        (xy 163.4918 128.97519)
+        (xy 163.62119 128.8458)
+        (xy 163.62119 127.86122)
+        (xy 163.20916 127.44919)
+        (xy 162.22458 127.44919)
+        (xy 162.09519 127.57858)
+        (xy 162.09519 128.8458)
+        (xy 161.08119 128.8458)
+        (xy 161.08119 127.57858)
+        (xy 160.9518 127.44919)
+        (xy 159.68458 127.44919)
+        (xy 159.55519 127.57858)
+        (xy 159.55519 128.8458)
+        (xy 158.54119 128.8458)
+        (xy 158.54119 127.57858)
+        (xy 158.4118 127.44919)
+        (xy 157.14458 127.44919)
+        (xy 157.01519 127.57858)
+        (xy 157.01519 128.8458)
+        (xy 156.00119 128.8458)
+        (xy 156.00119 127.57858)
+        (xy 155.8718 127.44919)
+        (xy 154.60458 127.44919)
+        (xy 154.47519 127.57858)
+        (xy 154.47519 128.8458)
+        (xy 153.46119 128.8458)
+        (xy 153.46119 127.57858)
+        (xy 153.3318 127.44919)
+        (xy 152.06458 127.44919)
+        (xy 151.93519 127.57858)
+        (xy 151.93519 128.8458)
+        (xy 150.92119 128.8458)
+        (xy 150.92119 127.57858)
+        (xy 150.7918 127.44919)
+        (xy 150.59084 127.44919)
+        (xy 149.39519 128.64484)
+        (xy 149.39519 128.8458)
+        (xy 147.5792 128.8458)
+        (xy 150.1192 126.3058)
+        (xy 151.93519 126.3058)
+        (xy 152.06458 126.43519)
+        (xy 153.3318 126.43519)
+        (xy 153.46119 126.3058)
+        (xy 154.47519 126.3058)
+        (xy 154.60458 126.43519)
+        (xy 155.8718 126.43519)
+        (xy 156.00119 126.3058)
+        (xy 157.01519 126.3058)
+        (xy 157.14458 126.43519)
+        (xy 158.4118 126.43519)
+        (xy 158.54119 126.3058)
+        (xy 159.55519 126.3058)
+        (xy 159.68458 126.43519)
+        (xy 160.9518 126.43519)
+        (xy 161.08119 126.3058)
+        (xy 161.08119 125.32122)
+        (xy 160.66916 124.90919)
+        (xy 159.68458 124.90919)
+        (xy 159.55519 125.03858)
+        (xy 159.55519 126.3058)
+        (xy 158.54119 126.3058)
+        (xy 158.54119 125.03858)
+        (xy 158.4118 124.90919)
+        (xy 157.14458 124.90919)
+        (xy 157.01519 125.03858)
+        (xy 157.01519 126.3058)
+        (xy 156.00119 126.3058)
+        (xy 156.00119 125.03858)
+        (xy 155.8718 124.90919)
+        (xy 154.60458 124.90919)
+        (xy 154.47519 125.03858)
+        (xy 154.47519 126.3058)
+        (xy 153.46119 126.3058)
+        (xy 153.46119 125.03858)
+        (xy 153.3318 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.93519 126.10484)
+        (xy 151.93519 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.47519 123.7658)
+        (xy 154.60458 123.89519)
+        (xy 155.8718 123.89519)
+        (xy 156.00119 123.7658)
+        (xy 157.01519 123.7658)
+        (xy 157.14458 123.89519)
+        (xy 158.4118 123.89519)
+        (xy 158.54119 123.7658)
+        (xy 158.54119 122.78122)
+        (xy 158.12916 122.36919)
+        (xy 157.14458 122.36919)
+        (xy 157.01519 122.49858)
+        (xy 157.01519 123.7658)
+        (xy 156.00119 123.7658)
+        (xy 156.00119 122.49858)
+        (xy 155.8718 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.47519 123.56484)
+        (xy 154.47519 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+  )
+  (zone locked (net 0) (net_name "") (layer "F.Cu") (uuid 2e82f573-84c7-4545-ae28-f9e6f082319e) (name "asdf") (hatch full 0.508)
+    (connect_pads (clearance 0))
+    (min_thickness 0.254)
+    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour not_allowed) (footprints not_allowed))
+    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+    (polygon
+      (pts
+        (xy 154.05 132.425)
+        (xy 141.925 132.425)
+        (xy 141.925 128.325)
+        (xy 128.25 128.325)
+        (xy 139.1 117.475)
+      )
+    )
+  )
+  (group "Testgroup, locked" locked (id e0de2bab-8c83-4a7c-aa08-f6e63338fc80)
+    (members
+      18f33c15-2d89-4304-9c8f-98c3582bdb83
+      4255abab-787c-46e3-9144-7ad5270c0729
+      84c6ade4-472b-49ab-bf5d-7989d8cac908
+    )
+  )
+)
diff --git a/tests/testdata/board/test_boardWithAllPrimitives.expected b/tests/testdata/board/test_boardWithAllPrimitives.expected
new file mode 100644
index 0000000..890c838
--- /dev/null
+++ b/tests/testdata/board/test_boardWithAllPrimitives.expected
@@ -0,0 +1,1466 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 19.11)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (1 "In1.Cu" signal)
+    (2 "In2.Cu" signal)
+    (3 "In3.Cu" signal)
+    (4 "In4.Cu" signal)
+    (5 "In5.Cu" signal)
+    (6 "In6.Cu" signal)
+    (7 "In7.Cu" signal)
+    (8 "In8.Cu" signal)
+    (9 "In9.Cu" signal)
+    (10 "In10.Cu" signal)
+    (11 "In11.Cu" signal)
+    (12 "In12.Cu" signal)
+    (13 "In13.Cu" signal)
+    (14 "In14.Cu" signal)
+    (15 "In15.Cu" signal)
+    (16 "In16.Cu" signal)
+    (17 "In17.Cu" signal)
+    (18 "In18.Cu" signal)
+    (19 "In19.Cu" signal)
+    (20 "In20.Cu" signal)
+    (21 "In21.Cu" signal)
+    (22 "In22.Cu" signal)
+    (23 "In23.Cu" signal)
+    (24 "In24.Cu" signal)
+    (25 "In25.Cu" signal)
+    (26 "In26.Cu" signal)
+    (27 "In27.Cu" signal)
+    (28 "In28.Cu" signal)
+    (29 "In29.Cu" signal)
+    (30 "In30.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (stackup
+      (layer "F.SilkS" (type "Top Silk Screen") (color "Yellow"))
+      (layer "F.Paste" (type "Top Solder Paste"))
+      (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01))
+      (layer "F.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.021))
+      (layer "In1.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 2" (type "prepreg") (thickness 1.51) (material "FR4") (epsilon_r 4.52) (loss_tangent 0.02))
+      (layer "In2.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 3" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.024))
+      (layer "In3.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 4" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In4.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 5" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In5.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 6" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In6.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 7" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In7.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 8" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In8.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 9" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In9.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 10" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In10.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 11" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In11.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 12" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In12.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 13" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In13.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 14" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In14.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 15" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In15.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 16" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In16.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 17" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In17.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 18" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In18.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 19" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In19.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 20" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In20.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 21" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In21.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 22" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In22.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 23" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In23.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 24" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In24.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 25" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In25.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 26" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In26.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 27" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In27.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 28" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In28.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 29" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In29.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 30" (type "prepreg") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "In30.Cu" (type "copper") (thickness 0.035))
+      (layer "dielectric 31" (type "core") (thickness 0.48) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))
+      (layer "B.Cu" (type "copper") (thickness 0.035))
+      (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01))
+      (layer "B.Paste" (type "Bottom Solder Paste"))
+      (layer "B.SilkS" (type "Bottom Silk Screen") (color "Green"))
+      (copper_finish "HAL lead-free")
+      (dielectric_constraints no)
+      (edge_connector bevelled)
+      (castellated_pads yes)
+      (edge_plating yes)
+    )
+    (pad_to_mask_clearance 1)
+    (solder_mask_min_width 1)
+    (pad_to_paste_clearance -1)
+    (pad_to_paste_clearance_ratio -0.01)
+    (aux_axis_origin 177.65 97.75)
+    (grid_origin 182.8 82.55)
+    (pcbplotparams
+      (layerselection 0x00010fc_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes true)
+      (usegerberadvancedattributes true)
+      (creategerberjobfile true)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer true)
+      (plotframeref false)
+      (viasonmask false)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 12.344291)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext false)
+      (sketchpadsonfab false)
+      (subtractmaskfromsilk false)
+      (outputformat 0)
+      (mirror false)
+      (drillshape 0)
+      (scaleselection 1)
+      (outputdirectory "D:/home/Desktop/Temp/")
+    )
+  )
+
+  (property "123456" "45641523")
+  (property "test" "test test")
+  (property "xdfa" "xdfadsf ")
+
+  (net 0 "")
+  (net 1 "/NET1")
+  (net 2 "unconnected-(SW101-Pad2)")
+  (net 3 "unconnected-(SW101-Pad3)")
+  (net 4 "/HIER_LABEL")
+
+  (footprint "test" (layer "F.Cu")
+    (tedit 621D235F) (uuid 3cfcbcc7-4f45-46ab-82a8-c414c7972161)
+    (at 104.78 48.237399)
+    (attr smd)
+    (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
+    )
+    (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid c58960d9-4cac-4036-ad2e-1aef26946dae)
+    )
+    (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu")
+      (effects (font (size 1.5 1.5) (thickness 0.3)))
+      (uuid 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
+    )
+    (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid ec9e24d8-d1c5-40e2-9812-dc315d05f470)
+    )
+    (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
+    )
+    (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 53c85970-3e21-4fae-a84f-721cfc0513b5)
+    )
+    (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
+    )
+    (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (uuid 003c2200-0632-4808-a662-8ddd5d30c768))
+    (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (uuid 6ff874d0-4ac5-414c-83a7-573eda4c7703))
+    (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (uuid be0953c0-632d-4dd2-85e9-4d41239f22d2))
+    (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (uuid 7f3eb118-a20c-4239-b800-c9211c66847d))
+    (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (uuid 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
+    (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (uuid fc0a4225-db46-4d48-8163-d522602d57cd))
+    (fp_poly (pts
+        (xy 8.4 14.95)
+        (xy 1.15 14.95)
+        (xy 1.15 6.7)
+        (xy 1.9 6.7)
+        (xy 8.4 0.2)
+      ) (layer "F.SilkS") (width 0.12) (fill solid) (uuid f6ee98b5-4773-4eeb-a825-33c1705abace))
+    (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (uuid 127679a9-3981-4934-815e-896a4e3ff56e))
+    (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (uuid 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
+    (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
+    (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 0520f61d-4522-4301-a3fa-8ed0bf060f69))
+    (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 0f560957-a8c5-442f-b20c-c2d88613742c))
+    (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
+    (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
+    (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
+    (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
+    (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
+    (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
+    (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
+    (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
+    (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+      (die_length 21) (uuid c43663ee-9a0d-4f27-a292-89ba89964065))
+    (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
+      (die_length 21) (uuid c67ad10d-2f75-4ec6-a139-47058f7f06b2))
+    (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
+      (die_length 1) (uuid 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
+    (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
+      (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
+      (options (clearance convexhull) (anchor circle))
+      (primitives
+        (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
+        (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
+        (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
+        (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
+        (gr_poly (pts
+            (xy 12.8 4.2)
+            (xy 8.2 8.8)
+            (xy 3.8 4.4)
+            (xy 8.4 -0.2)
+          ) (width 0.2) (fill yes))
+        (gr_arc (start 6.4 0.2) (mid 6.594453 -0.786584) (end 7.148728 -1.625594) (width 0.2))
+        (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
+        (gr_poly (pts
+            (xy -0.6 2.8)
+            (xy -1.8 4)
+            (xy -6.4 4)
+            (xy -6.4 1)
+            (xy -0.6 1)
+          ) (width 0.2) (fill yes))
+        (gr_poly (pts
+            (xy 0.870847 -0.746121)
+            (xy 0.983248 -0.691178)
+            (xy 1.071791 -0.602789)
+            (xy 1.12693 -0.490484)
+            (xy 1.143 -0.381)
+            (xy 1.143 0.381)
+            (xy 1.127121 0.489847)
+            (xy 1.072178 0.602248)
+            (xy 0.983789 0.690791)
+            (xy 0.871484 0.74593)
+            (xy 0.762 0.762)
+            (xy -0.762 0.762)
+            (xy -0.870847 0.746121)
+            (xy -0.983248 0.691178)
+            (xy -1.071791 0.602789)
+            (xy -1.12693 0.490484)
+            (xy -1.143 0.381)
+            (xy -1.143 -0.381)
+            (xy -1.127121 -0.489847)
+            (xy -1.072178 -0.602248)
+            (xy -0.983789 -0.690791)
+            (xy -0.871484 -0.74593)
+            (xy -0.762 -0.762)
+            (xy 0.762 -0.762)
+          ) (width 0) (fill yes))
+      ) (uuid d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
+    (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
+      (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
+      (die_length 15) (uuid e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
+    (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (uuid 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
+    (zone (net 0) (net_name "") (layer "F.Cu") (uuid 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
+      (connect_pads (clearance 0))
+      (min_thickness 0.254)
+      (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
+      (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+      (polygon
+        (pts
+          (xy 154.38 59.237399)
+          (xy 141.58 60.437399)
+          (xy 141.58 46.437399)
+        )
+      )
+    )
+    (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
+      (members
+        7f3eb118-a20c-4239-b800-c9211c66847d
+        f6ee98b5-4773-4eeb-a825-33c1705abace
+      )
+    )
+  )
+
+  (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (layer "F.Cu")
+    (tedit 5B784ED0) (uuid 907b59ac-a3f3-4819-aae3-2f3689254127)
+    (at 103.5875 101.8875)
+    (descr "Generic Phoenix Contact connector footprint for: MCV_1,5/4-G-3.5; number of pins: 04; pin pitch: 3.50mm; Vertical || order number: 1843622 8A 160V")
+    (tags "phoenix_contact connector MCV_01x04_G_3.5mm")
+    (property "Sheetfile" "test.kicad_sch")
+    (property "Sheetname" "")
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6")
+    (attr through_hole)
+    (fp_text reference "SW101" (at 5.25 -5.45) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid cc90c745-434f-4e54-89c7-cbf24870aeb9)
+    )
+    (fp_text value "SW_Coded" (at 5.25 4.2) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 7e47f703-9790-4c34-9d14-1de39c308f06)
+    )
+    (fp_text user "${REFERENCE}" (at 5.25 -3.55) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 122cd6ff-87b3-455d-9734-dd35dee6c1d9)
+    )
+    (fp_line (start 5.75 -2.4) (end 5.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 02426097-2343-483f-9184-b1021f11f671))
+    (fp_line (start 6.25 -2.05) (end 6.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 0757ecdd-1a4f-4f75-825e-ff54cc68895a))
+    (fp_line (start 12 -3.4) (end 11.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 1257fa4c-2f92-4e07-b43d-826125b0853c))
+    (fp_line (start -1.5 -2.05) (end -0.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 14ae6814-97a1-417e-bec2-8de437fc055e))
+    (fp_line (start 4.25 -2.05) (end 5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 1e0832ec-61bb-4753-a703-f800e50c87e9))
+    (fp_line (start 9 -2.05) (end 9.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 1fa150d9-4de3-4b9f-8fca-6651616614be))
+    (fp_line (start -0.75 2.25) (end -1.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 207c68d8-2bd6-401c-bbd5-e50fcc95bf20))
+    (fp_line (start 5.5 -3.4) (end 8.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 20dc8b19-954b-4369-b580-dab885da8ae2))
+    (fp_line (start 12 2.25) (end 11.25 2.25) (layer "F.SilkS") (width 0.12) (uuid 229202cd-20dc-4eab-ac2e-7f028bc91419))
+    (fp_line (start 1.5 -2.05) (end 1.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 22b553ec-39b6-4275-9347-df53a7c0db1d))
+    (fp_line (start 2 -3.4) (end 5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 24a65fad-0331-474b-b5bf-d945e8eff4b2))
+    (fp_line (start 7.75 -2.05) (end 8.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 258fcb41-7033-4835-9fdf-423793cb23b3))
+    (fp_line (start 4.75 -2.4) (end 4.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 2afa4af3-c77f-43e1-bb65-33635d9d9bde))
+    (fp_line (start 2.25 -2.4) (end 2 -3.4) (layer "F.SilkS") (width 0.12) (uuid 302baa85-ea14-4bc3-9ee0-750ac99c372c))
+    (fp_line (start 2.75 -2.05) (end 2.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 30ebadca-c9f5-4eef-93a6-e46a7f5dcb8a))
+    (fp_line (start 0.75 -2.05) (end 1.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 3311faf7-cebf-4b03-887f-81682eb2d766))
+    (fp_line (start 2.75 2.25) (end 2 2.25) (layer "F.SilkS") (width 0.12) (uuid 37f83d32-45f1-46b2-96b2-a40681275916))
+    (fp_line (start 8.5 -3.4) (end 8.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 3e7ae60c-e895-4a5a-a7e3-6a535a3a8283))
+    (fp_line (start -1.5 2.25) (end -1.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 4713b701-0d77-40e8-8184-3a11f9df2324))
+    (fp_line (start 2 2.25) (end 2 -2.05) (layer "F.SilkS") (width 0.12) (uuid 48eaa494-0ad3-4e7e-a203-8b82c0c90232))
+    (fp_line (start 0.75 -2.4) (end 0.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 49b3f8e5-beb0-46c0-af33-92b06a5bdff5))
+    (fp_line (start 1.5 2.25) (end 0.75 2.25) (layer "F.SilkS") (width 0.12) (uuid 4b9cce0d-afc3-48b9-a22f-0ea23c5574b8))
+    (fp_line (start -2.56 3.11) (end 13.06 3.11) (layer "F.SilkS") (width 0.12) (uuid 5166ee21-16cc-47d4-a438-2c0e2aa8959c))
+    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.SilkS") (width 0.12) (uuid 5c458ff7-d3f7-4417-a611-6f2981d0e9cc))
+    (fp_line (start 1.5 -3.4) (end 1.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 67dca7e5-24d8-4654-9579-d6404307654b))
+    (fp_line (start 5.5 -2.05) (end 6.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid 68310a47-af11-4665-bffb-5d4b7b98d48d))
+    (fp_line (start 8.5 -2.05) (end 8.5 2.25) (layer "F.SilkS") (width 0.12) (uuid 6b1d8153-1929-422b-bfbd-285ab66db86b))
+    (fp_line (start -0.75 -2.4) (end -1.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 6d8a3226-b0be-4ce6-99a7-7bc208219506))
+    (fp_line (start 5.5 2.25) (end 5.5 -2.05) (layer "F.SilkS") (width 0.12) (uuid 702c939c-cd20-4967-a0a8-e2ffe549a816))
+    (fp_line (start -2.56 -4.36) (end -2.56 3.11) (layer "F.SilkS") (width 0.12) (uuid 76c255ae-be6f-425d-a22f-ead2d9b08f5a))
+    (fp_line (start 6.25 -2.4) (end 5.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 77db9235-89b0-4b41-9039-5e76b93e13e4))
+    (fp_line (start 11.75 -2.4) (end 11.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid 7b4da999-f9e4-4c1d-bc75-0b3a3ebad32a))
+    (fp_line (start 9.25 -2.4) (end 9 -3.4) (layer "F.SilkS") (width 0.12) (uuid 7e67823e-2810-490d-bd9b-8b337d7a4ad5))
+    (fp_line (start 7.75 -2.4) (end 7.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid 830d86b3-78eb-4c6c-a352-bf19ba50bd18))
+    (fp_line (start 13.06 3.11) (end 13.06 -4.36) (layer "F.SilkS") (width 0.12) (uuid 83aeead6-c04f-4f61-9dc1-08cad4116066))
+    (fp_line (start -1.5 -3.4) (end 1.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid 8bf37a13-e175-4246-a4f0-4ab526c58c2e))
+    (fp_line (start 9 2.25) (end 9 -2.05) (layer "F.SilkS") (width 0.12) (uuid 8c64c50b-8acd-44f2-8c5f-ba9201a3c7bd))
+    (fp_line (start 5 2.25) (end 4.25 2.25) (layer "F.SilkS") (width 0.12) (uuid 8c8154c7-2b7b-44e1-8694-dfe76312b3d9))
+    (fp_line (start 1.25 -2.4) (end 0.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid 9e477ee6-ad97-4cd4-b02b-4729979c40e2))
+    (fp_line (start 11.25 -2.05) (end 12 -2.05) (layer "F.SilkS") (width 0.12) (uuid a23e3eb7-dcb3-4b09-a1b0-ba2cb214f0a5))
+    (fp_line (start 8.25 -2.4) (end 7.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid a2abc84b-8987-4a83-b329-dceb6c04fe7c))
+    (fp_line (start -0.75 -2.05) (end -0.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid a7e7a44c-68d8-4576-a798-ee1db6824dc3))
+    (fp_line (start 5 -2.05) (end 5 2.25) (layer "F.SilkS") (width 0.12) (uuid abb284d1-6005-460a-b044-acdfa77fc3f5))
+    (fp_line (start 4.25 -2.4) (end 4.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid ae1dcbf9-6071-40f9-ab17-78192e75b9a1))
+    (fp_line (start -1.25 -2.4) (end -1.5 -3.4) (layer "F.SilkS") (width 0.12) (uuid ae923668-2cb7-47ea-99c5-b6a079045296))
+    (fp_line (start 12 -2.05) (end 12 2.25) (layer "F.SilkS") (width 0.12) (uuid b3a5f2e6-3207-4af3-89e3-6d0fa469246e))
+    (fp_line (start 2 -2.05) (end 2.75 -2.05) (layer "F.SilkS") (width 0.12) (uuid b401eca2-204c-47b0-a6cc-cbd09a8de2ad))
+    (fp_line (start 11.25 -2.4) (end 11.25 -2.05) (layer "F.SilkS") (width 0.12) (uuid b589a08d-5a8e-4bb2-90d4-ef5270d09c90))
+    (fp_line (start 2.75 -2.4) (end 2.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid c47a7547-e6f0-4cd8-b807-5ca888e9c3ce))
+    (fp_line (start 9.75 -2.4) (end 9.25 -2.4) (layer "F.SilkS") (width 0.12) (uuid cc96e2af-7657-4ad3-b12e-a025de438a67))
+    (fp_line (start 5 -3.4) (end 4.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid cd82725d-cd4e-4b86-b196-accebbf4a913))
+    (fp_line (start 9.75 -2.05) (end 9.75 -2.4) (layer "F.SilkS") (width 0.12) (uuid d7fda904-08f2-46d0-8e07-896b262d7e46))
+    (fp_line (start 6.25 2.25) (end 5.5 2.25) (layer "F.SilkS") (width 0.12) (uuid e2bf3c5a-b014-4f85-8305-86de33fb2476))
+    (fp_line (start 9 -3.4) (end 12 -3.4) (layer "F.SilkS") (width 0.12) (uuid e9f6f543-7ec8-488b-9aca-e6a196514d16))
+    (fp_line (start 13.06 -4.36) (end -2.56 -4.36) (layer "F.SilkS") (width 0.12) (uuid eb2337fd-ed0c-4c82-a320-4407e6ace0bd))
+    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.SilkS") (width 0.12) (uuid ed095ff3-b1af-4001-bf59-d68ad7ef3289))
+    (fp_line (start 9.75 2.25) (end 9 2.25) (layer "F.SilkS") (width 0.12) (uuid fa37a123-2087-449f-b3d4-b734192c4b4e))
+    (fp_line (start 8.5 2.25) (end 7.75 2.25) (layer "F.SilkS") (width 0.12) (uuid fec34bd8-21b5-4daa-be59-cc1bb53df336))
+    (fp_arc (start 6.25 2.25) (mid 6.999807 2.09191) (end 7.749647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 194e61d5-d73f-45e1-86ab-95585456b360))
+    (fp_arc (start 2.75 2.25) (mid 3.499807 2.09191) (end 4.249647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 262f677a-322e-4b8f-8c30-977fdf9e837a))
+    (fp_arc (start 9.75 2.25) (mid 10.499807 2.09191) (end 11.249647 2.249844) (layer "F.SilkS") (width 0.12) (uuid 485f2f0b-adc4-4fd0-914c-e6cdebf32b20))
+    (fp_arc (start -0.75 2.25) (mid -0.000193 2.09191) (end 0.749647 2.249844) (layer "F.SilkS") (width 0.12) (uuid d07c9852-1fa4-40ca-9b3a-45379faf2beb))
+    (fp_line (start -2.95 -4.75) (end -2.95 3.5) (layer "F.CrtYd") (width 0.05) (uuid 15a65612-f6a1-48be-8425-8f5afb06c4fd))
+    (fp_line (start 13.45 -4.75) (end -2.95 -4.75) (layer "F.CrtYd") (width 0.05) (uuid 9f2913ee-f300-41d4-9b7a-339ae5970c4d))
+    (fp_line (start -2.95 3.5) (end 13.45 3.5) (layer "F.CrtYd") (width 0.05) (uuid c464ac67-d07b-4878-905a-ea6f8d27cd1e))
+    (fp_line (start 13.45 3.5) (end 13.45 -4.75) (layer "F.CrtYd") (width 0.05) (uuid f4a6f22f-2296-4e86-8dc7-ba0df5bfb77c))
+    (fp_line (start -2.45 -4.25) (end -2.45 3) (layer "F.Fab") (width 0.1) (uuid 534d87c1-bf1e-4965-ad11-3e2aa081e8e8))
+    (fp_line (start 12.95 -4.25) (end -2.45 -4.25) (layer "F.Fab") (width 0.1) (uuid 549455c3-ab6e-454e-94b0-5ca9e521ae0b))
+    (fp_line (start -2.95 -4.75) (end -0.95 -4.75) (layer "F.Fab") (width 0.1) (uuid 6b74ce51-0851-44d9-ba35-f631aa075f73))
+    (fp_line (start 12.95 3) (end 12.95 -4.25) (layer "F.Fab") (width 0.1) (uuid c6821f6d-ae1c-499e-ad7d-74e9a034a4b5))
+    (fp_line (start -2.45 3) (end 12.95 3) (layer "F.Fab") (width 0.1) (uuid c7bd964e-6063-4802-85ea-2a5dd3fba324))
+    (fp_line (start -2.95 -3.5) (end -2.95 -4.75) (layer "F.Fab") (width 0.1) (uuid d0bf1a00-cfe8-4773-a4cd-b6dcc139ab1d))
+    (pad "1" thru_hole roundrect locked (at 0 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask) (roundrect_rratio 0.1388888889)
+      (net 1 "/NET1") (pinfunction "CM") (pintype "passive") (uuid 11af36ff-3959-41d6-86f2-35df83d416be))
+    (pad "2" thru_hole oval locked (at 3.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 2 "unconnected-(SW101-Pad2)") (pinfunction "D0") (pintype "passive+no_connect") (uuid 95367dce-7348-4e46-8b79-617f0b078986))
+    (pad "3" thru_hole oval locked (at 7 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 3 "unconnected-(SW101-Pad3)") (pinfunction "D1") (pintype "passive+no_connect") (uuid 11e65687-dee5-42e2-a938-d539a0761571))
+    (pad "4" thru_hole oval locked (at 10.5 0) (size 1.8 3.6) (drill 1.2) (layers *.Cu *.Mask)
+      (net 4 "/HIER_LABEL") (pinfunction "D2") (pintype "passive") (uuid 9eacd685-19fc-4714-9d5a-cb390df54aea))
+    (model "${KICAD6_3DMODEL_DIR}/Connector_Phoenix_MC.3dshapes/PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical.wrl"
+      (offset (xyz 0 0 0))
+      (scale (xyz 1 1 1))
+      (rotate (xyz 0 0 0))
+    )
+  )
+
+  (footprint "Button_Switch_THT:KSA_Tactile_SPST" (layer "F.Cu")
+    (tedit 5A02FE31) (uuid ed271cf0-3644-46cb-8a42-a46a5167bf3a)
+    (at 89.525 96.075)
+    (descr "KSA http://www.ckswitches.com/media/1457/ksa_ksl.pdf")
+    (tags "SWITCH SMD KSA SW")
+    (attr through_hole)
+    (fp_text reference "REF**" (at 2.54 -2) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid a12511d6-4c71-4b67-a69e-bd467835661b)
+    )
+    (fp_text value "KSA_Tactile_SPST" (at 2.54 10) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 53f096c1-b7f7-4874-85c3-924e94be286f)
+    )
+    (fp_text user "${REFERENCE}" (at 2.54 4) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 6b964f6c-f00c-401e-8610-6bad4637fe5c)
+    )
+    (fp_line (start 6.35 8.89) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (uuid 1b5dc09e-ca2b-4554-ac89-aae722507997))
+    (fp_line (start -1.27 -1.27) (end 6.35 -1.27) (layer "F.SilkS") (width 0.12) (uuid 3214ed34-563c-460f-89e6-d8867c1cc4d2))
+    (fp_line (start -1.27 -1.27) (end -1.27 8.89) (layer "F.SilkS") (width 0.12) (uuid 3de0b227-472e-4982-9629-f04af83c07a9))
+    (fp_line (start -1.27 8.89) (end 6.35 8.89) (layer "F.SilkS") (width 0.12) (uuid 88343d9a-29c0-4487-b63e-ec337e903e90))
+    (fp_circle (center 2.54 3.81) (end 0.54 3.81) (layer "F.SilkS") (width 0.12) (fill none) (uuid 9cf6862a-c0fd-40f3-a4fa-9e9556bb2763))
+    (fp_line (start 6.49 8.75) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (uuid 1c5ec7dc-5f51-4802-a669-cad436b66b04))
+    (fp_line (start -1.41 -1.14) (end -1.41 8.75) (layer "F.CrtYd") (width 0.05) (uuid 924f5213-afbb-4698-8672-719373011a99))
+    (fp_line (start -1.41 -1.14) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (uuid 9859c259-3292-45a3-af2d-b6599b20ac97))
+    (fp_line (start 6.49 8.75) (end 6.49 -1.14) (layer "F.CrtYd") (width 0.05) (uuid c08fbfd3-8364-4a63-b1e9-c40a8e38215b))
+    (fp_line (start -1.16 7.91) (end 6.24 7.91) (layer "F.Fab") (width 0.1) (uuid 3e56d9ee-e4f1-41fc-9d6a-2d6e6e8ad807))
+    (fp_line (start -1.16 7.91) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (uuid 572d3c99-e59e-4806-82c8-859558b9b13b))
+    (fp_line (start 6.24 -0.29) (end -1.16 -0.29) (layer "F.Fab") (width 0.1) (uuid 5c709334-45d7-4554-9230-9b41117caa33))
+    (fp_line (start 6.24 7.91) (end 6.24 -0.29) (layer "F.Fab") (width 0.1) (uuid e930be25-e735-4d31-9a6c-7edf2422df64))
+    (pad "1" thru_hole circle locked (at 0 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid a651f5b0-a0e4-4740-98e6-9187d16156f9))
+    (pad "2" thru_hole circle locked (at 5.08 0) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 8ca2c50b-bf3a-438b-a227-f2ee9e498fd9))
+    (pad "3" thru_hole circle locked (at 5.08 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid c1291491-bcea-4574-b726-596afcbff93e))
+    (pad "4" thru_hole circle locked (at 2.54 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 676ccbc4-b247-4ed4-9cf8-54a2b7e7576a))
+    (pad "5" thru_hole circle locked (at 0 7.62) (size 1.778 1.778) (drill 1.143) (layers *.Cu *.Mask) (uuid 91f2b286-8ad5-4def-9631-08c498eb7cb7))
+    (model "${KICAD6_3DMODEL_DIR}/Button_Switch_THT.3dshapes/KSA_Tactile_SPST.wrl"
+      (offset (xyz 0 0 0))
+      (scale (xyz 1 1 1))
+      (rotate (xyz 0 0 0))
+    )
+  )
+
+  (gr_rect locked (start 147.025 116.75) (end 157.925 105.85) (layer "F.Cu") (width 0.2) (fill none) (uuid 18f33c15-2d89-4304-9c8f-98c3582bdb83))
+  (gr_poly locked
+    (pts
+      (xy 188.4 119.05)
+      (xy 182.7 119.05)
+      (xy 182.7 110.8)
+      (xy 188.4 105.1)
+    ) (layer "F.Cu") (width 0.2) (fill solid) (uuid 4255abab-787c-46e3-9144-7ad5270c0729))
+  (gr_circle locked (center 168.8 112.075) (end 174.025 106.85) (layer "F.Cu") (width 0.2) (fill none) (uuid 84c6ade4-472b-49ab-bf5d-7989d8cac908))
+  (gr_arc (start 103.852782 112.425) (mid 108.738891 110.401107) (end 113.625 112.425) (layer "F.Cu") (width 0.2) (uuid b1ddb058-f7b2-429c-9489-f4e2242ad7e5))
+  (gr_text "buried via" (at 156.875 98.25) (layer "Eco1.User") (uuid 49dcd1b7-f635-4f5a-8a01-f8c834a847dc)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "seg. locked" (at 143.9 92.95) (layer "Eco1.User") (uuid 65f11e1d-190b-4074-a639-471d7ae0fbd9)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify left))
+  )
+  (gr_text "via" (at 156.8 95.85) (layer "Eco1.User") (uuid aaedf2ea-4032-4703-9274-9907b7dc3e85)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "micro via" (at 156.975 100.075) (layer "Eco1.User") (uuid cea17333-7d14-4b4f-a096-7d6db0e55544)
+    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify right))
+  )
+  (gr_text "segment" (at 152.3 90.25) (layer "Eco1.User") (uuid e8055a1b-b857-489c-a9c9-cfccd187e14d)
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 00c745e6-aece-4592-bb45-863e0c3493e6)
+    (pts (xy 195.53876 71.610323) (xy 222.33876 63.010323))
+    (height -2.473234)
+    (gr_text "28,1460 mm" (at 207.831685 63.860365 17.79120311) (layer "Dwgs.User") (uuid 00c745e6-aece-4592-bb45-863e0c3493e6)
+      (effects (font (size 1 1) (thickness 0.15) italic))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
+    (pts (xy 193.33876 65.060323) (xy 220.13876 56.460323))
+    (height -2.267462)
+    (gr_text "28,1460 mm" (at 205.694558 57.506296 17.79120311) (layer "Dwgs.User") (uuid 15e78e6a-8c84-4259-bcfc-c1d391a2ae95)
+      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 5841a60a-7434-4694-9b2f-60c2321b8bd0)
+    (pts (xy 199.6 87.1) (xy 226.4 78.5))
+    (height -11.090722)
+    (gr_text "28,1460 mm" (at 209.259859 71.144674 17.79120311) (layer "Dwgs.User") (uuid 5841a60a-7434-4694-9b2f-60c2321b8bd0)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
+    (pts (xy 194.38876 68.410323) (xy 221.18876 59.810323))
+    (height -2.69421)
+    (gr_text "28,1460 mm" (at 206.614166 60.449957 17.79120311) (layer "Dwgs.User") (uuid 6e5e3d92-cdf9-42e6-94a9-9762d1429ab6)
+      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
+    (pts (xy 217.835151 147.360714) (xy 198.185151 127.360714))
+    (height -11.684997)
+    (gr_text "pre\"fix\"hello i \"am overwritten\" mmsuf\"fix\"" (at 200.495319 144.744037 -45.50575037) (layer "Dwgs.User") (uuid bd7d6807-1b05-4872-96e4-4ffd2cb2dd65)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) (override_value "hello i \"am overwritten\"") suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid d13f6c50-ce8f-484d-9604-839a4d68748d)
+    (pts (xy 231.035151 118.060714) (xy 211.385151 98.060714))
+    (height -11.684997)
+    (gr_text "28,0379 mm" (at 213.695319 115.444037 -45.50575037) (layer "Dwgs.User") (uuid d13f6c50-ce8f-484d-9604-839a4d68748d)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4) suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid de180ffc-3a6e-4a65-ab2c-90a4360b215c)
+    (pts (xy 228.685151 136.360714) (xy 209.035151 116.360714))
+    (height -11.684997)
+    (gr_text "pre\"fix\"28,0379 mmsuf\"fix\"" (at 211.345319 133.744037 -45.50575037) (layer "Dwgs.User") (uuid de180ffc-3a6e-4a65-ab2c-90a4360b215c)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (prefix "pre\"fix\"") (suffix "suf\"fix\"") (units 3) (units_format 1) (precision 4) suppress_zeroes)
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type aligned) (layer "Dwgs.User") (uuid ff870511-3a90-49f1-9990-5aec7ad35822)
+    (pts (xy 235.75 99.75) (xy 216.1 79.75))
+    (height -11.684997)
+    (gr_text "28,0379 mm" (at 218.410168 97.133323 -45.50575037) (layer "Dwgs.User") (uuid ff870511-3a90-49f1-9990-5aec7ad35822)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
+    (pts (xy 236.05 90.15) (xy 242.9 84.25))
+    (gr_text "hello i am a test" (at 249.1 90.45) (layer "Dwgs.User") (uuid 0a3cbae7-b160-4bf5-bc29-b843867e2bbd)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
+    (pts (xy 235.015611 93.021751) (xy 226 92.35))
+    (gr_text "hello i am a test \"quoted\"" (at 226 83.581876 135) (layer "Dwgs.User") (uuid 4d68bfd0-600e-4f1c-a4c7-76529ae0afbb)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\""))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
+    (pts (xy 251.15 120.15) (xy 258 114.25))
+    (gr_text "hello i am a test" (at 264.2 120.45) (layer "Dwgs.User") (uuid 5fc24e76-d837-4507-9ff7-9b9aca4829a7)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 2) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 8006915c-347c-427e-8da6-50ddf24e6b51)
+    (pts (xy 247.65 130.55) (xy 254.5 124.65))
+    (gr_text "hello i am a test" (at 260.7 130.85) (layer "Dwgs.User") (uuid 8006915c-347c-427e-8da6-50ddf24e6b51)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 1) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid 84c59850-a617-4b8e-9935-4a3c13fa674f)
+    (pts (xy 239.9 93.1) (xy 245.8 99.949999))
+    (gr_text "hello i am a test \"quoted\" cursive" (at 239.6 106.149999 270) (layer "Dwgs.User") (uuid 84c59850-a617-4b8e-9935-4a3c13fa674f)
+      (effects (font (size 1 1) (thickness 0.15) italic))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
+    (pts (xy 174.65 117.55) (xy 180.55 124.399999))
+    (gr_text "hello i am a test \"quoted\" mirrored" (at 174.35 130.599999 270) (layer "Dwgs.User") (uuid a7e4ce5c-98fb-48d0-9ff3-cdec8a457bcf)
+      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" mirrored"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type leader) (layer "Dwgs.User") (uuid b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
+    (pts (xy 138.35 115.8) (xy 131.500001 121.7))
+    (gr_text "hello i am a test \"quoted\" cursive mirrored" (at 125.300001 115.5 180) (layer "Dwgs.User") (uuid b1e517d4-8f6a-4c9e-aba5-0ea1b3399e42)
+      (effects (font (size 1 1) (thickness 0.15) italic) (justify mirror))
+    )
+    (format (units 0) (units_format 0) (precision 4) (override_value "hello i am a test \"quoted\" cursive mirrored"))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (text_frame 0) (extension_offset 0.5))
+  )
+  (dimension (type center) (layer "Dwgs.User") (uuid 61c5e7b9-ec75-459b-8f55-aa6dcdc47663)
+    (pts (xy 236.2 90.2) (xy 243.2 90.2))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type center) (layer "Dwgs.User") (uuid cc6d04c1-5e89-4a69-8589-2307dd2129a4)
+    (pts (xy 261.6 91.35) (xy 272 80.95))
+    (style (thickness 0.5) (arrow_length 1.27) (text_position_mode 0) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 01eecbde-a293-4e72-9ab7-4a5a43218203)
+    (pts (xy 253.85 51.5) (xy 279.85 52.35))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 264.1 50.4) (layer "Dwgs.User") (uuid 01eecbde-a293-4e72-9ab7-4a5a43218203)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 2) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 030f7528-01d8-4f5d-b375-396511a3f702)
+    (pts (xy 226.4 78) (xy 252.4 78.85))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "26,0000 mm" (at 239.4 68.45) (layer "Dwgs.User") (uuid 030f7528-01d8-4f5d-b375-396511a3f702)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 3) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 03748331-c066-4d57-aa54-2f8ca06e3f46)
+    (pts (xy 253.55 76.05) (xy 279.55 76.9))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.0 mm" (at 266.55 73.75) (layer "Dwgs.User") (uuid 03748331-c066-4d57-aa54-2f8ca06e3f46)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 1))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
+    (pts (xy 253.5 48.95) (xy 279.5 49.8))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.5 46.65) (layer "Dwgs.User") (uuid 09f8cc0e-b295-403e-a0b2-33a6d8fc93df)
+      (effects (font (size 1 1) (thickness 0.15)) (justify left))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
+    (pts (xy 253.55 61.25) (xy 279.55 62.1))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26" (at 266.55 58.95) (layer "Dwgs.User") (uuid 2542f828-4ee5-4a35-bfbb-b3fe79a017f3)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 0) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 30508594-c6b7-4560-96ac-05f6655ba783)
+    (pts (xy 253.55 45.95) (xy 279.55 46.8))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 43.65) (layer "Dwgs.User") (uuid 30508594-c6b7-4560-96ac-05f6655ba783)
+      (effects (font (size 1 1) (thickness 0.15)) (justify right))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 3f6d185e-f550-440a-899d-361dc95bf216)
+    (pts (xy 253.55 68.75) (xy 279.55 69.6))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.0000 mm" (at 266.55 66.45) (layer "Dwgs.User") (uuid 3f6d185e-f550-440a-899d-361dc95bf216)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 60bfe360-791c-4b4d-8701-dc29f0022c68)
+    (pts (xy 253.55 58) (xy 279.55 58.85))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 (mm)" (at 266.55 55.7) (layer "Dwgs.User") (uuid 60bfe360-791c-4b4d-8701-dc29f0022c68)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 2) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 617f513f-16c9-4ee5-8499-a80fee4befb0)
+    (pts (xy 226.6 49.6) (xy 252.6 50.45))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "1.0236 in" (at 239.6 40.05) (layer "Dwgs.User") (uuid 617f513f-16c9-4ee5-8499-a80fee4befb0)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 0) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 8e806abb-0abf-436e-9eb2-accf0328e785)
+    (pts (xy 253.55 54.55) (xy 279.55 55.4))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 53.4) (layer "Dwgs.User") (uuid 8e806abb-0abf-436e-9eb2-accf0328e785)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 1) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 96e02d72-1a83-4ed2-a755-b81e76c5893f)
+    (pts (xy 253.55 71.25) (xy 279.55 72.1))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.000 mm" (at 266.55 68.95) (layer "Dwgs.User") (uuid 96e02d72-1a83-4ed2-a755-b81e76c5893f)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 3))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
+    (pts (xy 253.55 73.65) (xy 279.55 74.5))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.00 mm" (at 266.55 71.35) (layer "Dwgs.User") (uuid 97b931f7-d2ab-4d72-ad9e-c2bdcb62d138)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 2))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid a53fb125-0a87-4020-929f-425458b00a06)
+    (pts (xy 226.45 58.95) (xy 252.45 59.8))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "1023.6220 mils" (at 239.45 49.4) (layer "Dwgs.User") (uuid a53fb125-0a87-4020-929f-425458b00a06)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 1) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid e5614058-70e1-453c-9f71-7593e14c6cda)
+    (pts (xy 253.55 66.2) (xy 279.55 67.05))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26.00000 mm" (at 266.55 63.9) (layer "Dwgs.User") (uuid e5614058-70e1-453c-9f71-7593e14c6cda)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 5))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
+    (pts (xy 226.4 68.15) (xy 252.4 69))
+    (height -8.4)
+    (orientation 0)
+    (gr_text "26.0000 mm" (at 239.4 58.6) (layer "Dwgs.User") (uuid e861b3fe-3b7e-4ee3-9922-e51b361b22b9)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 4))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (dimension (type orthogonal) (layer "Dwgs.User") (uuid ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
+    (pts (xy 253.55 78.35) (xy 279.55 79.2))
+    (height -1.15)
+    (orientation 0)
+    (gr_text "26 mm" (at 266.55 76.05) (layer "Dwgs.User") (uuid ebfa3bc5-489a-4b1a-8067-da3c91cb3045)
+      (effects (font (size 1 1) (thickness 0.15)))
+    )
+    (format (units 2) (units_format 1) (precision 0))
+    (style (thickness 0.15) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned)
+  )
+  (target plus (at 185.8 93.35) (size 5) (width 0.1) (layer "Edge.Cuts") (uuid 3bf82ecb-0898-4a14-bef0-d88c4f838b87))
+  (target x (at 187.95 98.8) (size 4) (width 1) (layer "Edge.Cuts") (uuid 47941cd1-b5c0-40bd-bc68-af434db15455))
+
+  (segment (start 124.6875 110.7875) (end 125.9625 109.5125) (width 0.25) (layer "F.Cu") (net 0) (uuid 504cb9e4-5572-4208-bc9d-30a7efff8b9a))
+  (segment (start 159.025 90.4) (end 165.575 90.4) (width 0.25) (layer "F.Cu") (net 0) (uuid 50bf00c7-c69d-47e9-8d7f-002d8001f5dd))
+  (segment (start 125.9625 109.5125) (end 125.9625 102.4125) (width 0.25) (layer "F.Cu") (net 0) (uuid a6187c22-3622-4a1a-a49a-b21e96986f96))
+  (segment locked (start 159.175 92.975) (end 165.725 92.975) (width 0.25) (layer "F.Cu") (net 0) (uuid c5a64cb0-571c-4101-abb8-a1e8072455d4))
+  (segment (start 119.9625 110.7875) (end 124.6875 110.7875) (width 0.25) (layer "F.Cu") (net 0) (uuid e1df8cea-32a4-457d-86df-d8e326022a52))
+  (segment (start 125.9625 102.4125) (end 119.6875 96.1375) (width 0.25) (layer "F.Cu") (net 0) (uuid fda94f0a-876e-4bf0-ad10-35819851e3e9))
+  (via (at 132.5125 111.2125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 061b0977-703d-47fc-ba64-d6fb3f8737c3))
+  (via blind (at 172 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 0b395f32-97e7-46c6-81cd-8e3bc4675bce))
+  (via micro (at 169.3 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 395a31c4-0d27-409b-a4a6-ae65750e20db))
+  (via locked (at 163.125 95.8) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 3b1a1b76-9d29-4248-9ac9-c210fdba845b))
+  (via (at 159.925 95.775) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 3e210438-9173-4d97-83d2-94157dc53997))
+  (via micro (at 160.1 100) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 4c281a99-3a6b-44dc-8cbd-1a650e634550))
+  (via micro (at 163.3 100.025) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 502d494e-96a1-40b8-8acf-8ae38ec1c400))
+  (via (at 171.925 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 7589d575-3c60-4338-8ad2-67381d8dbc00))
+  (via blind (at 163.2 98.2) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 77fe0dab-427e-435f-9eed-6fa58fe5cee1))
+  (via blind (at 166.275 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 79a898f8-ad5e-4dbc-aa10-5d83271b9b43))
+  (via blind (at 169.2 98.225) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid 8c872ef3-cd1d-4b0d-96d3-51a74e92ff52))
+  (via blind (at 160 98.175) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (free) (net 0) (uuid 954cb567-fc2b-4b8d-918a-46eb7b1f43e2))
+  (via micro (at 172.1 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid afce51bc-694a-4ac0-b46f-9657eb6057d8))
+  (via blind locked (at 128.4375 106.0125) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid b2cac11a-5f3b-43d7-88e5-8d0241ac6453))
+  (via locked (at 174.6 95.75) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid ba1f567b-429c-4539-9500-750f9f41e977))
+  (via blind (at 174.675 98.15) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid c02cbdff-6228-4696-9621-0c9f24504b5a))
+  (via locked (at 169.125 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid c5dbc2f4-347d-4e8b-9dc5-05ae6c8ee4e9))
+  (via micro (at 166.375 100.05) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid ed159ec6-8461-40d0-99dc-879cac3b491e))
+  (via (at 166.2 95.825) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid f5a28a1a-7f56-478a-aad0-76861dd7b0e0))
+  (via micro (at 174.775 99.975) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (remove_unused_layers) (keep_end_layers) (free) (net 0) (uuid f90de4aa-337a-492e-a29b-d742cf541973))
+  (via micro (at 127.5625 98.8875) (size 0.8) (drill 0.4) (layers "In1.Cu" "B.Cu") (free) (net 0) (uuid 557d128f-cf69-4c70-9959-d139ac95c63c))
+  (segment (start 129.6375 99.8625) (end 129.6375 107.5125) (width 0.25) (layer "F.Cu") (net 4) (uuid 58588507-da7d-4bcc-b9cd-bfc861c19ac1))
+  (segment (start 114.0875 101.8875) (end 114.0875 95.7625) (width 0.25) (layer "F.Cu") (net 4) (uuid 6586c7bc-7012-4335-b0bd-43918f23a8fd))
+  (segment (start 116.2875 93.5625) (end 123.3375 93.5625) (width 0.25) (layer "F.Cu") (net 4) (uuid 71ae16fb-a509-4131-a92e-a0b0b25743ff))
+  (segment (start 114.0875 95.7625) (end 116.2875 93.5625) (width 0.25) (layer "F.Cu") (net 4) (uuid 93bf1c04-96c6-49e8-9a85-ee6cc4606fcb))
+  (segment (start 123.3375 93.5625) (end 129.6375 99.8625) (width 0.25) (layer "F.Cu") (net 4) (uuid f07599c7-599f-45fe-bd1e-15999cff5f04))
+
+  (zone locked (net 4) (net_name "/HIER_LABEL") (layers "F.Cu" "In18.Cu" "In21.Cu") (uuid 001057ce-186a-458c-93e5-a6d8479d28a0) (name "test") (hatch full 0.508)
+    (priority 2)
+    (connect_pads (clearance 0.508))
+    (min_thickness 0.254) (filled_areas_thickness no)
+    (fill yes (mode hatch) (thermal_gap 0.508) (thermal_bridge_width 0.508) (smoothing chamfer) (island_removal_mode 2) (island_area_min 1)
+      (hatch_thickness 1.016) (hatch_gap 1.524) (hatch_orientation 0)
+      (hatch_smoothing_level 1) (hatch_smoothing_value 0.1)
+      (hatch_border_algorithm hatch_thickness) (hatch_min_hole_area 0.3))
+    (polygon
+      (pts
+        (xy 170.375 133)
+        (xy 155.55 133)
+        (xy 155.55 130)
+        (xy 146.425 130)
+        (xy 156.9 119.525)
+      )
+    )
+    (filled_polygon
+      (layer "F.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 156.94919 131.3858)
+        (xy 157.07858 131.51519)
+        (xy 158.3458 131.51519)
+        (xy 158.47519 131.3858)
+        (xy 159.48919 131.3858)
+        (xy 159.61858 131.51519)
+        (xy 160.8858 131.51519)
+        (xy 161.01519 131.3858)
+        (xy 162.02919 131.3858)
+        (xy 162.15858 131.51519)
+        (xy 163.4258 131.51519)
+        (xy 163.55519 131.3858)
+        (xy 164.56919 131.3858)
+        (xy 164.69858 131.51519)
+        (xy 165.9658 131.51519)
+        (xy 166.09519 131.3858)
+        (xy 166.09519 130.33522)
+        (xy 165.74916 129.98919)
+        (xy 164.69858 129.98919)
+        (xy 164.56919 130.11858)
+        (xy 164.56919 131.3858)
+        (xy 163.55519 131.3858)
+        (xy 163.55519 130.11858)
+        (xy 163.4258 129.98919)
+        (xy 162.15858 129.98919)
+        (xy 162.02919 130.11858)
+        (xy 162.02919 131.3858)
+        (xy 161.01519 131.3858)
+        (xy 161.01519 130.11858)
+        (xy 160.8858 129.98919)
+        (xy 159.61858 129.98919)
+        (xy 159.48919 130.11858)
+        (xy 159.48919 131.3858)
+        (xy 158.47519 131.3858)
+        (xy 158.47519 130.11858)
+        (xy 158.3458 129.98919)
+        (xy 157.07858 129.98919)
+        (xy 156.94919 130.11858)
+        (xy 156.94919 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 151.67719 130)
+        (xy 151.609069 129.979998)
+        (xy 151.588095 129.963095)
+        (xy 150.43518 128.81018)
+        (xy 151.86919 128.81018)
+        (xy 151.91701 128.858)
+        (xy 153.38299 128.858)
+        (xy 153.39519 128.8458)
+        (xy 154.40919 128.8458)
+        (xy 154.42139 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.863166 128.917824)
+        (xy 155.93519 128.8458)
+        (xy 156.94919 128.8458)
+        (xy 157.07858 128.97519)
+        (xy 158.3458 128.97519)
+        (xy 158.47519 128.8458)
+        (xy 159.48919 128.8458)
+        (xy 159.61858 128.97519)
+        (xy 160.8858 128.97519)
+        (xy 161.01519 128.8458)
+        (xy 162.02919 128.8458)
+        (xy 162.15858 128.97519)
+        (xy 163.4258 128.97519)
+        (xy 163.55519 128.8458)
+        (xy 163.55519 127.79522)
+        (xy 163.20916 127.44919)
+        (xy 162.15858 127.44919)
+        (xy 162.02919 127.57858)
+        (xy 162.02919 128.8458)
+        (xy 161.01519 128.8458)
+        (xy 161.01519 127.57858)
+        (xy 160.8858 127.44919)
+        (xy 159.61858 127.44919)
+        (xy 159.48919 127.57858)
+        (xy 159.48919 128.8458)
+        (xy 158.47519 128.8458)
+        (xy 158.47519 127.57858)
+        (xy 158.3458 127.44919)
+        (xy 157.07858 127.44919)
+        (xy 156.94919 127.57858)
+        (xy 156.94919 128.8458)
+        (xy 155.93519 128.8458)
+        (xy 155.93519 127.57858)
+        (xy 155.8058 127.44919)
+        (xy 154.53858 127.44919)
+        (xy 154.40919 127.57858)
+        (xy 154.40919 128.8458)
+        (xy 153.39519 128.8458)
+        (xy 153.39519 127.57858)
+        (xy 153.2658 127.44919)
+        (xy 151.99858 127.44919)
+        (xy 151.86919 127.57858)
+        (xy 151.86919 128.81018)
+        (xy 150.43518 128.81018)
+        (xy 149.114095 127.489095)
+        (xy 149.080069 127.426783)
+        (xy 149.085134 127.355968)
+        (xy 149.114095 127.310905)
+        (xy 150.1192 126.3058)
+        (xy 151.86919 126.3058)
+        (xy 151.99858 126.43519)
+        (xy 153.2658 126.43519)
+        (xy 153.39519 126.3058)
+        (xy 154.40919 126.3058)
+        (xy 154.53858 126.43519)
+        (xy 155.8058 126.43519)
+        (xy 155.93519 126.3058)
+        (xy 156.94919 126.3058)
+        (xy 157.07858 126.43519)
+        (xy 158.3458 126.43519)
+        (xy 158.47519 126.3058)
+        (xy 159.48919 126.3058)
+        (xy 159.61858 126.43519)
+        (xy 160.8858 126.43519)
+        (xy 161.01519 126.3058)
+        (xy 161.01519 125.25522)
+        (xy 160.66916 124.90919)
+        (xy 159.61858 124.90919)
+        (xy 159.48919 125.03858)
+        (xy 159.48919 126.3058)
+        (xy 158.47519 126.3058)
+        (xy 158.47519 125.03858)
+        (xy 158.3458 124.90919)
+        (xy 157.07858 124.90919)
+        (xy 156.94919 125.03858)
+        (xy 156.94919 126.3058)
+        (xy 155.93519 126.3058)
+        (xy 155.93519 125.03858)
+        (xy 155.8058 124.90919)
+        (xy 154.53858 124.90919)
+        (xy 154.40919 125.03858)
+        (xy 154.40919 126.3058)
+        (xy 153.39519 126.3058)
+        (xy 153.39519 125.03858)
+        (xy 153.2658 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.86919 126.17084)
+        (xy 151.86919 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.40919 123.7658)
+        (xy 154.53858 123.89519)
+        (xy 155.8058 123.89519)
+        (xy 155.93519 123.7658)
+        (xy 156.94919 123.7658)
+        (xy 157.07858 123.89519)
+        (xy 158.3458 123.89519)
+        (xy 158.47519 123.7658)
+        (xy 158.47519 122.71522)
+        (xy 158.12916 122.36919)
+        (xy 157.07858 122.36919)
+        (xy 156.94919 122.49858)
+        (xy 156.94919 123.7658)
+        (xy 155.93519 123.7658)
+        (xy 155.93519 122.49858)
+        (xy 155.8058 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.40919 123.63084)
+        (xy 154.40919 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+    (filled_polygon
+      (layer "In18.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 157.01519 131.3858)
+        (xy 157.14458 131.51519)
+        (xy 158.4118 131.51519)
+        (xy 158.54119 131.3858)
+        (xy 159.55519 131.3858)
+        (xy 159.68458 131.51519)
+        (xy 160.9518 131.51519)
+        (xy 161.08119 131.3858)
+        (xy 162.09519 131.3858)
+        (xy 162.22458 131.51519)
+        (xy 163.4918 131.51519)
+        (xy 163.62119 131.3858)
+        (xy 164.63519 131.3858)
+        (xy 164.76458 131.51519)
+        (xy 166.0318 131.51519)
+        (xy 166.16119 131.3858)
+        (xy 166.16119 130.40122)
+        (xy 165.74916 129.98919)
+        (xy 164.76458 129.98919)
+        (xy 164.63519 130.11858)
+        (xy 164.63519 131.3858)
+        (xy 163.62119 131.3858)
+        (xy 163.62119 130.11858)
+        (xy 163.4918 129.98919)
+        (xy 162.22458 129.98919)
+        (xy 162.09519 130.11858)
+        (xy 162.09519 131.3858)
+        (xy 161.08119 131.3858)
+        (xy 161.08119 130.11858)
+        (xy 160.9518 129.98919)
+        (xy 159.68458 129.98919)
+        (xy 159.55519 130.11858)
+        (xy 159.55519 131.3858)
+        (xy 158.54119 131.3858)
+        (xy 158.54119 130.11858)
+        (xy 158.4118 129.98919)
+        (xy 157.14458 129.98919)
+        (xy 157.01519 130.11858)
+        (xy 157.01519 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 146.72919 130)
+        (xy 146.661069 129.979998)
+        (xy 146.614576 129.926342)
+        (xy 146.604472 129.856068)
+        (xy 146.633966 129.791488)
+        (xy 146.640095 129.784905)
+        (xy 147.5792 128.8458)
+        (xy 149.39519 128.8458)
+        (xy 149.40739 128.858)
+        (xy 150.90899 128.858)
+        (xy 150.92119 128.8458)
+        (xy 151.93519 128.8458)
+        (xy 151.94739 128.858)
+        (xy 153.44899 128.858)
+        (xy 153.46119 128.8458)
+        (xy 154.47519 128.8458)
+        (xy 154.48739 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.918216 128.928774)
+        (xy 156.00119 128.8458)
+        (xy 157.01519 128.8458)
+        (xy 157.14458 128.97519)
+        (xy 158.4118 128.97519)
+        (xy 158.54119 128.8458)
+        (xy 159.55519 128.8458)
+        (xy 159.68458 128.97519)
+        (xy 160.9518 128.97519)
+        (xy 161.08119 128.8458)
+        (xy 162.09519 128.8458)
+        (xy 162.22458 128.97519)
+        (xy 163.4918 128.97519)
+        (xy 163.62119 128.8458)
+        (xy 163.62119 127.86122)
+        (xy 163.20916 127.44919)
+        (xy 162.22458 127.44919)
+        (xy 162.09519 127.57858)
+        (xy 162.09519 128.8458)
+        (xy 161.08119 128.8458)
+        (xy 161.08119 127.57858)
+        (xy 160.9518 127.44919)
+        (xy 159.68458 127.44919)
+        (xy 159.55519 127.57858)
+        (xy 159.55519 128.8458)
+        (xy 158.54119 128.8458)
+        (xy 158.54119 127.57858)
+        (xy 158.4118 127.44919)
+        (xy 157.14458 127.44919)
+        (xy 157.01519 127.57858)
+        (xy 157.01519 128.8458)
+        (xy 156.00119 128.8458)
+        (xy 156.00119 127.57858)
+        (xy 155.8718 127.44919)
+        (xy 154.60458 127.44919)
+        (xy 154.47519 127.57858)
+        (xy 154.47519 128.8458)
+        (xy 153.46119 128.8458)
+        (xy 153.46119 127.57858)
+        (xy 153.3318 127.44919)
+        (xy 152.06458 127.44919)
+        (xy 151.93519 127.57858)
+        (xy 151.93519 128.8458)
+        (xy 150.92119 128.8458)
+        (xy 150.92119 127.57858)
+        (xy 150.7918 127.44919)
+        (xy 150.59084 127.44919)
+        (xy 149.39519 128.64484)
+        (xy 149.39519 128.8458)
+        (xy 147.5792 128.8458)
+        (xy 150.1192 126.3058)
+        (xy 151.93519 126.3058)
+        (xy 152.06458 126.43519)
+        (xy 153.3318 126.43519)
+        (xy 153.46119 126.3058)
+        (xy 154.47519 126.3058)
+        (xy 154.60458 126.43519)
+        (xy 155.8718 126.43519)
+        (xy 156.00119 126.3058)
+        (xy 157.01519 126.3058)
+        (xy 157.14458 126.43519)
+        (xy 158.4118 126.43519)
+        (xy 158.54119 126.3058)
+        (xy 159.55519 126.3058)
+        (xy 159.68458 126.43519)
+        (xy 160.9518 126.43519)
+        (xy 161.08119 126.3058)
+        (xy 161.08119 125.32122)
+        (xy 160.66916 124.90919)
+        (xy 159.68458 124.90919)
+        (xy 159.55519 125.03858)
+        (xy 159.55519 126.3058)
+        (xy 158.54119 126.3058)
+        (xy 158.54119 125.03858)
+        (xy 158.4118 124.90919)
+        (xy 157.14458 124.90919)
+        (xy 157.01519 125.03858)
+        (xy 157.01519 126.3058)
+        (xy 156.00119 126.3058)
+        (xy 156.00119 125.03858)
+        (xy 155.8718 124.90919)
+        (xy 154.60458 124.90919)
+        (xy 154.47519 125.03858)
+        (xy 154.47519 126.3058)
+        (xy 153.46119 126.3058)
+        (xy 153.46119 125.03858)
+        (xy 153.3318 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.93519 126.10484)
+        (xy 151.93519 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.47519 123.7658)
+        (xy 154.60458 123.89519)
+        (xy 155.8718 123.89519)
+        (xy 156.00119 123.7658)
+        (xy 157.01519 123.7658)
+        (xy 157.14458 123.89519)
+        (xy 158.4118 123.89519)
+        (xy 158.54119 123.7658)
+        (xy 158.54119 122.78122)
+        (xy 158.12916 122.36919)
+        (xy 157.14458 122.36919)
+        (xy 157.01519 122.49858)
+        (xy 157.01519 123.7658)
+        (xy 156.00119 123.7658)
+        (xy 156.00119 122.49858)
+        (xy 155.8718 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.47519 123.56484)
+        (xy 154.47519 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+    (filled_polygon
+      (layer "In21.Cu")
+      (island)
+      (pts
+        (xy 156.944032 119.585134)
+        (xy 156.989095 119.614095)
+        (xy 170.159905 132.784905)
+        (xy 170.193931 132.847217)
+        (xy 170.188866 132.918032)
+        (xy 170.146319 132.974868)
+        (xy 170.079799 132.999679)
+        (xy 170.07081 133)
+        (xy 155.676 133)
+        (xy 155.607879 132.979998)
+        (xy 155.561386 132.926342)
+        (xy 155.55 132.874)
+        (xy 155.55 131.3858)
+        (xy 157.01519 131.3858)
+        (xy 157.14458 131.51519)
+        (xy 158.4118 131.51519)
+        (xy 158.54119 131.3858)
+        (xy 159.55519 131.3858)
+        (xy 159.68458 131.51519)
+        (xy 160.9518 131.51519)
+        (xy 161.08119 131.3858)
+        (xy 162.09519 131.3858)
+        (xy 162.22458 131.51519)
+        (xy 163.4918 131.51519)
+        (xy 163.62119 131.3858)
+        (xy 164.63519 131.3858)
+        (xy 164.76458 131.51519)
+        (xy 166.0318 131.51519)
+        (xy 166.16119 131.3858)
+        (xy 166.16119 130.40122)
+        (xy 165.74916 129.98919)
+        (xy 164.76458 129.98919)
+        (xy 164.63519 130.11858)
+        (xy 164.63519 131.3858)
+        (xy 163.62119 131.3858)
+        (xy 163.62119 130.11858)
+        (xy 163.4918 129.98919)
+        (xy 162.22458 129.98919)
+        (xy 162.09519 130.11858)
+        (xy 162.09519 131.3858)
+        (xy 161.08119 131.3858)
+        (xy 161.08119 130.11858)
+        (xy 160.9518 129.98919)
+        (xy 159.68458 129.98919)
+        (xy 159.55519 130.11858)
+        (xy 159.55519 131.3858)
+        (xy 158.54119 131.3858)
+        (xy 158.54119 130.11858)
+        (xy 158.4118 129.98919)
+        (xy 157.14458 129.98919)
+        (xy 157.01519 130.11858)
+        (xy 157.01519 131.3858)
+        (xy 155.55 131.3858)
+        (xy 155.55 130)
+        (xy 146.72919 130)
+        (xy 146.661069 129.979998)
+        (xy 146.614576 129.926342)
+        (xy 146.604472 129.856068)
+        (xy 146.633966 129.791488)
+        (xy 146.640095 129.784905)
+        (xy 147.5792 128.8458)
+        (xy 149.39519 128.8458)
+        (xy 149.40739 128.858)
+        (xy 150.90899 128.858)
+        (xy 150.92119 128.8458)
+        (xy 151.93519 128.8458)
+        (xy 151.94739 128.858)
+        (xy 153.44899 128.858)
+        (xy 153.46119 128.8458)
+        (xy 154.47519 128.8458)
+        (xy 154.48739 128.858)
+        (xy 155.55 128.858)
+        (xy 155.574581 128.860421)
+        (xy 155.918216 128.928774)
+        (xy 156.00119 128.8458)
+        (xy 157.01519 128.8458)
+        (xy 157.14458 128.97519)
+        (xy 158.4118 128.97519)
+        (xy 158.54119 128.8458)
+        (xy 159.55519 128.8458)
+        (xy 159.68458 128.97519)
+        (xy 160.9518 128.97519)
+        (xy 161.08119 128.8458)
+        (xy 162.09519 128.8458)
+        (xy 162.22458 128.97519)
+        (xy 163.4918 128.97519)
+        (xy 163.62119 128.8458)
+        (xy 163.62119 127.86122)
+        (xy 163.20916 127.44919)
+        (xy 162.22458 127.44919)
+        (xy 162.09519 127.57858)
+        (xy 162.09519 128.8458)
+        (xy 161.08119 128.8458)
+        (xy 161.08119 127.57858)
+        (xy 160.9518 127.44919)
+        (xy 159.68458 127.44919)
+        (xy 159.55519 127.57858)
+        (xy 159.55519 128.8458)
+        (xy 158.54119 128.8458)
+        (xy 158.54119 127.57858)
+        (xy 158.4118 127.44919)
+        (xy 157.14458 127.44919)
+        (xy 157.01519 127.57858)
+        (xy 157.01519 128.8458)
+        (xy 156.00119 128.8458)
+        (xy 156.00119 127.57858)
+        (xy 155.8718 127.44919)
+        (xy 154.60458 127.44919)
+        (xy 154.47519 127.57858)
+        (xy 154.47519 128.8458)
+        (xy 153.46119 128.8458)
+        (xy 153.46119 127.57858)
+        (xy 153.3318 127.44919)
+        (xy 152.06458 127.44919)
+        (xy 151.93519 127.57858)
+        (xy 151.93519 128.8458)
+        (xy 150.92119 128.8458)
+        (xy 150.92119 127.57858)
+        (xy 150.7918 127.44919)
+        (xy 150.59084 127.44919)
+        (xy 149.39519 128.64484)
+        (xy 149.39519 128.8458)
+        (xy 147.5792 128.8458)
+        (xy 150.1192 126.3058)
+        (xy 151.93519 126.3058)
+        (xy 152.06458 126.43519)
+        (xy 153.3318 126.43519)
+        (xy 153.46119 126.3058)
+        (xy 154.47519 126.3058)
+        (xy 154.60458 126.43519)
+        (xy 155.8718 126.43519)
+        (xy 156.00119 126.3058)
+        (xy 157.01519 126.3058)
+        (xy 157.14458 126.43519)
+        (xy 158.4118 126.43519)
+        (xy 158.54119 126.3058)
+        (xy 159.55519 126.3058)
+        (xy 159.68458 126.43519)
+        (xy 160.9518 126.43519)
+        (xy 161.08119 126.3058)
+        (xy 161.08119 125.32122)
+        (xy 160.66916 124.90919)
+        (xy 159.68458 124.90919)
+        (xy 159.55519 125.03858)
+        (xy 159.55519 126.3058)
+        (xy 158.54119 126.3058)
+        (xy 158.54119 125.03858)
+        (xy 158.4118 124.90919)
+        (xy 157.14458 124.90919)
+        (xy 157.01519 125.03858)
+        (xy 157.01519 126.3058)
+        (xy 156.00119 126.3058)
+        (xy 156.00119 125.03858)
+        (xy 155.8718 124.90919)
+        (xy 154.60458 124.90919)
+        (xy 154.47519 125.03858)
+        (xy 154.47519 126.3058)
+        (xy 153.46119 126.3058)
+        (xy 153.46119 125.03858)
+        (xy 153.3318 124.90919)
+        (xy 153.13084 124.90919)
+        (xy 151.93519 126.10484)
+        (xy 151.93519 126.3058)
+        (xy 150.1192 126.3058)
+        (xy 152.6592 123.7658)
+        (xy 154.47519 123.7658)
+        (xy 154.60458 123.89519)
+        (xy 155.8718 123.89519)
+        (xy 156.00119 123.7658)
+        (xy 157.01519 123.7658)
+        (xy 157.14458 123.89519)
+        (xy 158.4118 123.89519)
+        (xy 158.54119 123.7658)
+        (xy 158.54119 122.78122)
+        (xy 158.12916 122.36919)
+        (xy 157.14458 122.36919)
+        (xy 157.01519 122.49858)
+        (xy 157.01519 123.7658)
+        (xy 156.00119 123.7658)
+        (xy 156.00119 122.49858)
+        (xy 155.8718 122.36919)
+        (xy 155.67084 122.36919)
+        (xy 154.47519 123.56484)
+        (xy 154.47519 123.7658)
+        (xy 152.6592 123.7658)
+        (xy 156.810905 119.614095)
+        (xy 156.873217 119.580069)
+      )
+    )
+  )
+  (zone locked (net 0) (net_name "") (layer "F.Cu") (uuid 2e82f573-84c7-4545-ae28-f9e6f082319e) (name "asdf") (hatch full 0.508)
+    (connect_pads (clearance 0))
+    (min_thickness 0.254)
+    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour not_allowed) (footprints not_allowed))
+    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+    (polygon
+      (pts
+        (xy 154.05 132.425)
+        (xy 141.925 132.425)
+        (xy 141.925 128.325)
+        (xy 128.25 128.325)
+        (xy 139.1 117.475)
+      )
+    )
+  )
+  (group "Testgroup, locked" locked (id e0de2bab-8c83-4a7c-aa08-f6e63338fc80)
+    (members
+      18f33c15-2d89-4304-9c8f-98c3582bdb83
+      4255abab-787c-46e3-9144-7ad5270c0729
+      84c6ade4-472b-49ab-bf5d-7989d8cac908
+    )
+  )
+)
diff --git a/tests/testdata/board/test_createEmptyBoard b/tests/testdata/board/test_createEmptyBoard
new file mode 100644
index 0000000..ae65896
--- /dev/null
+++ b/tests/testdata/board/test_createEmptyBoard
@@ -0,0 +1,46 @@
+(kicad_pcb (version 20211014) (generator kiutils)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0.0)
+  )
+
+  (net 0 "")
+
+)
diff --git a/tests/testdata/board/test_pcbPlotParams b/tests/testdata/board/test_pcbPlotParams
new file mode 100644
index 0000000..85e26ea
--- /dev/null
+++ b/tests/testdata/board/test_pcbPlotParams
@@ -0,0 +1,51 @@
+(kicad_pcb (version 20211014) (generator kiutils)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+    (pcbplotparams
+      (layerselection 0x00010ff_ffffffff)
+      (disableapertmacros false)
+      (usegerberextensions false)
+      (usegerberattributes false)
+      (usegerberadvancedattributes false)
+      (creategerberjobfile false)
+      (svguseinch false)
+      (svgprecision 6)
+      (excludeedgelayer false)
+      (plotframeref true)
+      (viasonmask true)
+      (mode 1)
+      (useauxorigin false)
+      (hpglpennumber 1)
+      (hpglpenspeed 20)
+      (hpglpendiameter 15.000000)
+      (dxfpolygonmode true)
+      (dxfimperialunits true)
+      (dxfusepcbnewfont true)
+      (psnegative false)
+      (psa4output false)
+      (plotreference true)
+      (plotvalue true)
+      (plotinvisibletext true)
+      (sketchpadsonfab true)
+      (subtractmaskfromsilk false)
+      (outputformat 1)
+      (mirror false)
+      (drillshape 0)
+      (scaleselection 1)
+      (outputdirectory "")
+    )
+  )
+
+  (net 0 "")
+
+)
diff --git a/tests/testdata/board/test_renameFootprintIdToken b/tests/testdata/board/test_renameFootprintIdToken
new file mode 100644
index 0000000..1da8080
--- /dev/null
+++ b/tests/testdata/board/test_renameFootprintIdToken
@@ -0,0 +1,72 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (footprint "Connector_PCBEdge:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid a6a16e4a-47c2-4244-ba11-78b40782f3f4)
+    (at 73.5 110.75)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+  )
+
+  (footprint "BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid a6a16e4a-47c2-4244-ba11-78b40782f3f4)
+    (at 73.5 110.75)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+  )
+
+)
diff --git a/tests/testdata/board/test_renameFootprintIdToken.expected b/tests/testdata/board/test_renameFootprintIdToken.expected
new file mode 100644
index 0000000..ba9c724
--- /dev/null
+++ b/tests/testdata/board/test_renameFootprintIdToken.expected
@@ -0,0 +1,72 @@
+(kicad_pcb (version 20211014) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+    (32 "B.Adhes" user "B.Adhesive")
+    (33 "F.Adhes" user "F.Adhesive")
+    (34 "B.Paste" user)
+    (35 "F.Paste" user)
+    (36 "B.SilkS" user "B.Silkscreen")
+    (37 "F.SilkS" user "F.Silkscreen")
+    (38 "B.Mask" user)
+    (39 "F.Mask" user)
+    (40 "Dwgs.User" user "User.Drawings")
+    (41 "Cmts.User" user "User.Comments")
+    (42 "Eco1.User" user "User.Eco1")
+    (43 "Eco2.User" user "User.Eco2")
+    (44 "Edge.Cuts" user)
+    (45 "Margin" user)
+    (46 "B.CrtYd" user "B.Courtyard")
+    (47 "F.CrtYd" user "F.Courtyard")
+    (48 "B.Fab" user)
+    (49 "F.Fab" user)
+    (50 "User.1" user)
+    (51 "User.2" user)
+    (52 "User.3" user)
+    (53 "User.4" user)
+    (54 "User.5" user)
+    (55 "User.6" user)
+    (56 "User.7" user)
+    (57 "User.8" user)
+    (58 "User.9" user)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (footprint "I_was_renamed:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid a6a16e4a-47c2-4244-ba11-78b40782f3f4)
+    (at 73.5 110.75)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+  )
+
+  (footprint "I_was_added:BUS_PCIexpress_x1" (layer "F.Cu")
+    (tedit 62BC9CDF) (uuid a6a16e4a-47c2-4244-ba11-78b40782f3f4)
+    (at 73.5 110.75)
+    (fp_text reference "REF**" (at 5 -3.5) (layer "F.SilkS")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 1fe1971a-7016-45bb-8345-401820ae3862)
+    )
+    (fp_text value "BUS_PCIexpress_x1" (at 10.33 -8.01) (layer "F.Fab")
+      (effects (font (size 1 1) (thickness 0.15)))
+      (uuid 4eab55a2-5545-47a3-b9b3-c4c469a39d25)
+    )
+  )
+
+)
diff --git a/tests/testdata/board/test_zoneOnAllLayersWildcard b/tests/testdata/board/test_zoneOnAllLayersWildcard
new file mode 100644
index 0000000..b162924
--- /dev/null
+++ b/tests/testdata/board/test_zoneOnAllLayersWildcard
@@ -0,0 +1,24 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (zone (net 0) (net_name "") (layers "*.Cu") (uuid 3562b45e-4bdd-495d-8608-16ebe61c5885) (hatch edge 0.5)
+    (connect_pads (clearance 0.5))
+    (min_thickness 0.25) (filled_areas_thickness no)
+    (fill yes (thermal_gap 0.5) (thermal_bridge_width 0.5) (island_removal_mode 1) (island_area_min 10))
+  )
+)
diff --git a/tests/testdata/board/test_zoneOnOuterLayersOnly b/tests/testdata/board/test_zoneOnOuterLayersOnly
new file mode 100644
index 0000000..016f6b0
--- /dev/null
+++ b/tests/testdata/board/test_zoneOnOuterLayersOnly
@@ -0,0 +1,24 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+
+  (general
+    (thickness 1.6)
+  )
+
+  (paper "A4")
+  (layers
+    (0 "F.Cu" signal)
+    (31 "B.Cu" signal)
+  )
+
+  (setup
+    (pad_to_mask_clearance 0)
+  )
+
+  (net 0 "")
+
+  (zone (net 0) (net_name "") (layers "F&B.Cu") (uuid 3562b45e-4bdd-495d-8608-16ebe61c5885) (hatch edge 0.5)
+    (connect_pads (clearance 0.5))
+    (min_thickness 0.25) (filled_areas_thickness no)
+    (fill yes (thermal_gap 0.5) (thermal_bridge_width 0.5) (island_removal_mode 1) (island_area_min 10))
+  )
+)
diff --git a/tests/testdata/designrules/since_v7/test_severityToken b/tests/testdata/designrules/since_v7/test_severityToken
new file mode 100644
index 0000000..0ac96b3
--- /dev/null
+++ b/tests/testdata/designrules/since_v7/test_severityToken
@@ -0,0 +1,15 @@
+(version 1)
+
+(rule "HV"
+  (constraint clearance (min "1.5mm"))
+  (condition "A.NetClass == 'HV'")
+  (severity ignore))
+(rule "HV"
+  (layer "outer")
+  (constraint clearance (min "1.5mm"))
+  (condition "A.NetClass == 'HV'")
+  (severity error))
+(rule "HV_HV"
+  (constraint clearance (min "1.5mm + 2.0mm"))
+  (condition "A.NetClass == 'HV' && B.NetClass == 'HV'")
+  (severity warning))
diff --git a/tests/testdata/designrules/test_allDesignRuleItems b/tests/testdata/designrules/test_allDesignRuleItems
new file mode 100644
index 0000000..8afc948
--- /dev/null
+++ b/tests/testdata/designrules/test_allDesignRuleItems
@@ -0,0 +1,52 @@
+(version 1)
+
+(rule "HV"
+  (constraint clearance (min "1.5mm"))
+  (condition "A.NetClass == 'HV'"))
+(rule "HV"
+  (layer "outer")
+  (constraint clearance (min "1.5mm"))
+  (condition "A.NetClass == 'HV'"))
+(rule "HV_HV"
+  (constraint clearance (min "1.5mm + 2.0mm"))
+  (condition "A.NetClass == 'HV' && B.NetClass == 'HV'"))
+(rule "HV_unshielded"
+  (constraint clearance (min "2mm"))
+  (condition "A.NetClass == 'HV' && !A.insideArea('Shield*')"))
+(rule "copper keepout"
+  (constraint disallow track via zone)
+  (condition "A.insideArea('zone3')"))
+(rule "BGA neckdown"
+  (constraint track_width (min "0.2mm") (opt "0.25mm"))
+  (constraint clearance (min "0.05mm") (opt "0.08mm"))
+  (condition "A.insideCourtyard('U3')"))
+(rule "silk_over_via"
+  (constraint silk_clearance (min "0.2mm"))
+  (condition "A.Type == '*Text' && B.Type == 'Via'"))
+(rule "Distance between Vias of Different Nets"
+  (constraint hole_to_hole (min "0.254mm"))
+  (condition "A.Type =='Via' && B.Type =='Via' && A.Net != B.Net"))
+(rule "Clearance between Pads of Different Nets"
+  (constraint clearance (min "3.0mm"))
+  (condition "A.Type =='Pad' && B.Type =='Pad' && A.Net != B.Net"))
+(rule "Via Hole to Track Clearance"
+  (constraint hole_clearance (min "0.254mm"))
+  (condition "A.Type =='Via' && B.Type =='Track'"))
+(rule "Pad to Track Clearance"
+  (constraint clearance (min "0.2mm"))
+  (condition "A.Type =='Pad' && B.Type =='Track'"))
+(rule "clearance-to-1mm-cutout"
+  (constraint clearance (min "0.8mm"))
+  (condition "A.Layer=='Edge.Cuts' && A.Thickness == 1.0mm"))
+(rule "Max Drill Hole Size Mechanical"
+  (constraint hole_size (max "6.3mm"))
+  (condition "A.Pad_Type == 'NPTH, mechanical'"))
+(rule "Max Drill Hole Size PTH"
+  (constraint hole_size (max "6.35mm"))
+  (condition "A.Pad_Type == 'Through-hole'"))
+(rule "dp clock gap"
+  (constraint diff_pair_gap (opt "0.8mm"))
+  (condition "A.inDiffPair('CLK') && AB.isCoupledDiffPair()"))
+(rule "dp clearance"
+  (constraint clearance (min "1.5mm"))
+  (condition "A.inDiffPair('*') && !AB.isCoupledDiffPair()"))
diff --git a/tests/testdata/designrules/test_createNewDesignRules b/tests/testdata/designrules/test_createNewDesignRules
new file mode 100644
index 0000000..575162e
--- /dev/null
+++ b/tests/testdata/designrules/test_createNewDesignRules
@@ -0,0 +1 @@
+(version 1)
diff --git a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers
new file mode 100644
index 0000000..0684ed6
--- /dev/null
+++ b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers
@@ -0,0 +1,3 @@
+(module 0402 (layer F.Cu) (tedit 5E68CD62)
+  (attr smd)
+)
\ No newline at end of file
diff --git a/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected
new file mode 100644
index 0000000..2aeba2b
--- /dev/null
+++ b/tests/testdata/footprint/legacy/test_moduleNameOnlyNumbers.expected
@@ -0,0 +1,5 @@
+(footprint "402"
+  (layer "F.Cu")
+  (tedit 5E68CD62)
+  (attr smd)
+)
diff --git a/tests/testdata/footprint/since_v7/test_3dModelOpacityToken b/tests/testdata/footprint/since_v7/test_3dModelOpacityToken
new file mode 100644
index 0000000..a6c55ec
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_3dModelOpacityToken
@@ -0,0 +1,10 @@
+(footprint "test"
+  (layer "F.Cu")
+  (tedit 64b312a4)
+  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
+    (opacity 0.54)
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken b/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken
new file mode 100644
index 0000000..2eb2a70
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_exemptFromCourtyardToken
@@ -0,0 +1,7 @@
+(footprint "BatteryClip_Keystone_54_D16-19mm" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 64dbffd5)
+  (descr "some description")
+  (tags "some tags")
+  (attr through_hole board_only exclude_from_pos_files exclude_from_bom allow_missing_courtyard)
+)
diff --git a/tests/testdata/footprint/since_v7/test_imageWithLayerToken b/tests/testdata/footprint/since_v7/test_imageWithLayerToken
new file mode 100644
index 0000000..41c9c54
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_imageWithLayerToken
@@ -0,0 +1,27 @@
+(footprint "image_test" (version 20221018) (generator kiutils)
+  (layer "F.Cu")
+  (tedit 640a506b)
+  (attr smd)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)))
+    (uuid 8fee236d-a937-47a4-b037-5b1ec0ea729a)
+  )
+  (fp_text value "image_test" (at 0 1 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid aeb0c71a-d788-467d-a13c-49ed75f3dbdb)
+  )
+  (image (at 5.08 -7.62) (layer "F.SilkS") (scale 7.875)
+    (data
+      iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAA3NCSVQICAjb4U/gAAAACXBIWXMA
+      AA50AAAOdAFrJLPWAAAA9ElEQVRIiWP88OEDA20AE43MHbJGs+CX1pp4hUiDruXroIkMzQAZmkYT
+      iEZMIMHDWmEvaS3P8/33v1NPvvYfffH002+sKhnx50a0FCLBw7o+WoWfg5kYR5Dm6go7SX4O5kuX
+      Li1atIiRkTEuLk5XV5c6Rlsr8DAwMCxevBji14kTJ8Kl5syZg6aYXtFIMO+dePTFWZkvLi5u0aJF
+      DAwM8fHxOjromRAOUKKRoNGKguzLw5X42GkQjfff/wxYcqfcTsJanvf777+nnnydcOwlJPFhliEk
+      p+sXX34XbntMjMqhmdFHjaaf0QRKPkrA0AyQUaPRAACmk1AZ+UHU4QAAAABJRU5ErkJggg==
+    )
+  )
+  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid a5217a7a-3aed-4722-8474-750c47ad16eb)
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_netTiePadGroups b/tests/testdata/footprint/since_v7/test_netTiePadGroups
new file mode 100644
index 0000000..795f062
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_netTiePadGroups
@@ -0,0 +1,18 @@
+(footprint "test" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 651dbffc)
+  (attr smd)
+  (net_tie_pad_groups "Test" "Test {dblquote}Test{dblquote}" "°!{dblquote}§$%&/()=?²²³{[[]}]\}\\" "###'''+++**~~~" ",,,;;;...::---__" "äöü")
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)))
+    (uuid 59323fba-83c2-4ee2-ab11-b887cdf7a9c1)
+  )
+  (fp_text value "test" (at 0 1 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 828258c2-6d00-4e3a-b5c5-8beb8f262be5)
+  )
+  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 3210958f-d220-4c0f-bb30-50169792bb2a)
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_privateLayersToken b/tests/testdata/footprint/since_v7/test_privateLayersToken
new file mode 100644
index 0000000..59ed971
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_privateLayersToken
@@ -0,0 +1,27 @@
+(footprint "JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 64de8dfa)
+  (descr "JST EH series connector, B2B-EH-A (http://www.jst-mfg.com/product/pdf/eng/eEH.pdf), generated with kicad-footprint-generator")
+  (tags "connector JST EH vertical")
+  (attr through_hole)
+  (private_layers "User.1" "User.2" "User.3" "User.4" "User.5" "User.6" "User.7" "User.8" "User.9")
+  (fp_text reference "REF**" (at 1.25 -2.8) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid f638d0bf-d856-439a-9a7a-de96b7095635)
+  )
+  (fp_text value "JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical" (at 1.25 3.4) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid e9466767-d800-41ed-923d-b2c6bd7625e6)
+  )
+  (fp_text user "${REFERENCE}" (at 1.25 1.5) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid a538f7fb-153f-40d4-b79d-371fd4e198af)
+  )
+  (pad "1" thru_hole roundrect (at 0 0) (size 1.7 2) (drill 1) (layers "F.Cu" "B.Cu") (roundrect_rratio 0.147059) (uuid b9960672-3af1-4d13-99fc-2f62dd24a4bc))
+  (pad "2" thru_hole oval (at 2.5 0) (size 1.7 2) (drill 1) (layers "F.Cu" "B.Cu") (uuid 94cccd64-f718-491b-83c2-3fc50ed44c7e))
+  (model "${KICAD6_3DMODEL_DIR}/Connector_JST.3dshapes/JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical.wrl"
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_textBoxAllVariants b/tests/testdata/footprint/since_v7/test_textBoxAllVariants
new file mode 100644
index 0000000..4296cb5
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_textBoxAllVariants
@@ -0,0 +1,439 @@
+(footprint "test" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 6404ec1a)
+  (attr smd)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS") hide
+    (effects (font (size 1 1) (thickness 0.1)))
+    (uuid 04078fb9-e314-429a-815b-4c1c86725037)
+  )
+  (fp_text value "fdsafsad" (at 0 1 unlocked) (layer "F.Fab") hide
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid ca15cc33-7395-4013-af8d-afa553f77a01)
+  )
+  (fp_text user "Misc" (at 83.82 2.54 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
+    (uuid 1dab3b23-458d-42ae-a96f-af7098325988)
+  )
+  (fp_text user "Orientation" (at 58.42 2.54 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
+    (uuid 2a90a8ae-4bfe-4e41-806e-a8f5556a4533)
+  )
+  (fp_text user "Style" (at 7.62 2.54 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
+    (uuid 93fbf946-e879-4b7c-addf-b508290404f1)
+  )
+  (fp_text user "Alignmeht" (at 33.02 2.54 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)) (justify left bottom))
+    (uuid eba2a418-b7cf-4e37-8641-780fd732dff7)
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 83.82 10.16) (end 106.68 12.7) (layer "F.Paste") (uuid d2c1b9e8-7717-4509-b816-10978d73269f)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 81.28) (end 55.88 83.82) (layer "F.SilkS") (uuid 075ac5dc-d8fe-4385-8466-6ca73fbf873e)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify left top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 15.24) (end 55.88 17.78) (layer "F.SilkS") (uuid 0cc7f2dd-d40b-4228-afd5-0e40ccebb1c6)
+    (effects (font (size 1 1) (thickness 0.1)) (justify right top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 45.72) (end 55.88 48.26) (layer "F.SilkS") (uuid 19aa2dfe-8e81-4696-91b2-6293a03112d3)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify right top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 35.56) (end 55.88 38.1) (layer "F.SilkS") (uuid 1dbd5b15-621a-45e0-9e0a-84a64137d125)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 60.96 35.56) (end 58.42 58.42) (angle 270) (layer "F.SilkS") (uuid 1dbedb60-3a16-4543-b5e1-33aafa8fba46)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 106.68) (end 55.88 109.22) (layer "F.SilkS") (uuid 1ddb9369-023f-46d4-a270-b5633a5ac338)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify right top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 86.36) (end 55.88 88.9) (layer "F.SilkS") (uuid 22238a34-72ee-400b-80d3-5e54ad3de17a)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 50.8) (end 55.88 53.34) (layer "F.SilkS") (uuid 22657e6e-100d-4d3a-a3c3-fb8a57a6ab75)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 25.4) (end 55.88 27.94) (layer "F.SilkS") (uuid 2de82614-e4ad-4a86-94c1-b42fc39caa09)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 5.08) (end 30.48 7.62) (layer "F.SilkS") (uuid 32346b54-f7bb-4b3a-b599-1f99940ebdf8)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type default))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 30.48) (end 55.88 33.02) (layer "F.SilkS") (uuid 38b19ef6-3b2e-47b2-999a-a277e1b79652)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify right top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 25.4) (end 30.48 27.94) (layer "F.SilkS") (uuid 38c362a6-d4c5-46ae-94b6-412e71e42ef1)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type dash_dot))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 40.64) (end 30.48 43.18) (layer "F.SilkS") (uuid 47f050b6-ff37-423d-bb39-bc5a6708c285)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 35.56) (end 30.48 38.1) (layer "F.SilkS") (uuid 61b0f568-9b3b-4275-917a-0596fc54880f)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 96.52) (end 55.88 99.06) (layer "F.SilkS") (uuid 722bb73b-d9b5-4896-ab08-b94c5e51b720)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify left top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 60.96) (end 55.88 63.5) (layer "F.SilkS") (uuid 84d117bc-8774-4a68-8f27-a907c3e275ff)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify right top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 55.88) (end 30.48 58.42) (layer "F.SilkS") (uuid 8b7f237a-9227-408a-a4c8-1840905efb42)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 20.32) (end 55.88 22.86) (layer "F.SilkS") (uuid 8d20babe-adfe-43ea-8b8a-471fa69e8eba)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 116.84) (end 55.88 119.38) (layer "F.SilkS") (uuid 8e8ecceb-51eb-4c0a-8dca-62e6b38f8546)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 45.72) (end 30.48 48.26) (layer "F.SilkS") (uuid 956964a4-3080-4393-97fd-7de631bc9c75)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 15.24) (end 30.48 17.78) (layer "F.SilkS") (uuid 9ceff9b9-909e-49a5-ba55-d3f1c7a0edd7)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type dash))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 111.76) (end 55.88 114.3) (layer "F.SilkS") (uuid a1462a23-eef0-4434-8353-111d6567f099)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify left top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 58.42 5.08) (end 81.28 7.62) (layer "F.SilkS") (uuid a7aa41e6-8fea-4b7d-9884-f47b5102bea0)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type default))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 20.32) (end 30.48 22.86) (layer "F.SilkS") (uuid a91ccabb-ae9f-4982-93aa-6771fd8111eb)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type dot))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 5.08) (end 55.88 7.62) (layer "F.SilkS") (uuid b5d16d8e-c631-48b2-b456-20705dcd25e7)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 81.28 63.5) (end 58.42 60.96) (angle 180) (layer "F.SilkS") (uuid b61515a3-1c99-4a61-b6ab-f03cce68809f)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 10.16) (end 30.48 12.7) (layer "F.SilkS") (uuid bcea8bf2-0c5c-4b3e-bfeb-3141b7e0e6d3)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 71.12) (end 55.88 73.66) (layer "F.SilkS") (uuid bd31944d-5cd0-491b-bb40-3c38ca05c99d)
+    (effects (font (size 1 1) (thickness 0.1)) (justify top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 40.64) (end 55.88 43.18) (layer "F.SilkS") (uuid c04984b2-2670-4380-a9ac-6c69e7772c59)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 60.96) (end 30.48 63.5) (layer "F.SilkS") (uuid c20d5ee9-7396-4dff-945c-a8f762d9db3b)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 121.92) (end 55.88 124.46) (layer "F.SilkS") (uuid c29911b4-ee3a-42f0-b5e3-330c73e204a4)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify right top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 30.48) (end 30.48 33.02) (layer "F.SilkS") (uuid c5ba9f23-cb66-440f-9e8a-7bc0f7d576cf)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type dash_dot_dot))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 55.88) (end 55.88 58.42) (layer "F.SilkS") (uuid c6ec68b1-9e6b-4b2c-8c39-1131651342fe)
+    (effects (font (size 1 1) (thickness 0.2) bold italic) (justify top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 58.42 33.02) (end 60.96 10.16) (angle 90) (layer "F.SilkS") (uuid cd6299be-521a-47a8-b5e1-ed68be3bea8b)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 66.04) (end 55.88 68.58) (layer "F.SilkS") (uuid d78808b1-0a48-4221-a74a-1edf7b504e07)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 7.62 50.8) (end 30.48 53.34) (layer "F.SilkS") (uuid e5503340-1733-4e02-8d62-7b238f53651f)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 101.6) (end 55.88 104.14) (layer "F.SilkS") (uuid e55d9467-e61f-4c22-b2a7-2d89e7a31fec)
+    (effects (font (size 1 1) (thickness 0.1) italic) (justify top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 10.16) (end 55.88 12.7) (layer "F.SilkS") (uuid e7e12072-0086-4935-a831-ea9643c7ee8d)
+    (effects (font (size 1 1) (thickness 0.1)) (justify top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 91.44) (end 55.88 93.98) (layer "F.SilkS") (uuid f4022187-7c2b-4191-beb9-8a6e1add5cdd)
+    (effects (font (size 1 1) (thickness 0.2) bold) (justify right top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "t a"
+    (start 83.82 5.08) (end 106.68 7.62) (layer "F.SilkS") (uuid f47d60bc-33ea-4fbd-a273-1843ab00f907)
+    (effects (font (face "Wingdings") (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+    (render_cache "t a" 0
+      (polygon
+        (pts
+          (xy 84.738946 6.364403)          (xy 85.14561 5.785792)          (xy 85.552274 6.364403)          (xy 85.14561 6.942526)
+        )
+      )
+      (polygon
+        (pts
+          (xy 88.236416 6.223771)          (xy 88.24928 6.224662)          (xy 88.261908 6.226145)          (xy 88.2743 6.228222)
+          (xy 88.286455 6.230893)          (xy 88.298373 6.234157)          (xy 88.310055 6.238014)          (xy 88.3215 6.242465)
+          (xy 88.332708 6.247509)          (xy 88.34368 6.253146)          (xy 88.354415 6.259377)          (xy 88.364914 6.266202)
+          (xy 88.375176 6.27362)          (xy 88.385201 6.281631)          (xy 88.39499 6.290236)          (xy 88.404542 6.299434)
+          (xy 88.413711 6.309051)          (xy 88.422288 6.318913)          (xy 88.430274 6.329018)          (xy 88.437668 6.339368)
+          (xy 88.44447 6.349962)          (xy 88.450681 6.3608)          (xy 88.456301 6.371883)          (xy 88.461329 6.38321)
+          (xy 88.465765 6.394781)          (xy 88.46961 6.406596)          (xy 88.472864 6.418655)          (xy 88.475525 6.430959)
+          (xy 88.477596 6.443507)          (xy 88.479075 6.456299)          (xy 88.479962 6.469336)          (xy 88.480258 6.482616)
+          (xy 88.480055 6.493231)          (xy 88.479449 6.503733)          (xy 88.478437 6.514123)          (xy 88.477021 6.524401)
+          (xy 88.475201 6.534567)          (xy 88.472976 6.544621)          (xy 88.470347 6.554562)          (xy 88.467313 6.564392)
+          (xy 88.463874 6.574109)          (xy 88.460031 6.583715)          (xy 88.455784 6.593208)          (xy 88.451132 6.602589)
+          (xy 88.446075 6.611858)          (xy 88.440614 6.621015)          (xy 88.434748 6.63006)          (xy 88.428478 6.638993)
+          (xy 88.421804 6.647814)          (xy 88.414724 6.656522)          (xy 88.407241 6.665119)          (xy 88.399352 6.673603)
+          (xy 88.391059 6.681975)          (xy 88.382362 6.690235)          (xy 88.37326 6.698383)          (xy 88.363754 6.706419)
+          (xy 88.353843 6.714343)          (xy 88.343528 6.722155)          (xy 88.332808 6.729854)          (xy 88.321683 6.737442)
+          (xy 88.310154 6.744917)          (xy 88.29822 6.752281)          (xy 88.285882 6.759532)          (xy 88.27314 6.766671)
+          (xy 88.260092 6.773643)          (xy 88.246838 6.780394)          (xy 88.233378 6.786924)          (xy 88.219712 6.793232)
+          (xy 88.205839 6.799319)          (xy 88.191761 6.805185)          (xy 88.177477 6.810829)          (xy 88.162986 6.816252)
+          (xy 88.14829 6.821454)          (xy 88.133387 6.826434)          (xy 88.118278 6.831193)          (xy 88.102964 6.83573)
+          (xy 88.087443 6.840047)          (xy 88.071716 6.844142)          (xy 88.055783 6.848015)          (xy 88.039644 6.851667)
+          (xy 88.023298 6.855098)          (xy 88.006747 6.858308)          (xy 87.98999 6.861296)          (xy 87.973026 6.864063)
+          (xy 87.955857 6.866608)          (xy 87.938481 6.868932)          (xy 87.9209 6.871035)          (xy 87.903112 6.872916)
+          (xy 87.885118 6.874577)          (xy 87.866918 6.876015)          (xy 87.848512 6.877233)          (xy 87.8299 6.878229)
+          (xy 87.811082 6.879003)          (xy 87.792058 6.879557)          (xy 87.772827 6.879889)          (xy 87.753391 6.88)
+          (xy 87.736493 6.87986)          (xy 87.719537 6.879441)          (xy 87.702521 6.878744)          (xy 87.685446 6.877767)
+          (xy 87.668311 6.876511)          (xy 87.651118 6.874976)          (xy 87.633866 6.873162)          (xy 87.616554 6.871069)
+          (xy 87.599183 6.868697)          (xy 87.581753 6.866046)          (xy 87.564264 6.863116)          (xy 87.546716 6.859907)
+          (xy 87.529108 6.856418)          (xy 87.511442 6.852651)          (xy 87.493716 6.848605)          (xy 87.475931 6.844279)
+          (xy 87.458087 6.839674)          (xy 87.440184 6.834791)          (xy 87.422222 6.829628)          (xy 87.4042 6.824186)
+          (xy 87.386119 6.818465)          (xy 87.36798 6.812465)          (xy 87.349781 6.806186)          (xy 87.331523 6.799628)
+          (xy 87.313205 6.792791)          (xy 87.294829 6.785675)          (xy 87.276393 6.77828)          (xy 87.257899 6.770605)
+          (xy 87.239345 6.762652)          (xy 87.220732 6.75442)          (xy 87.20206 6.745908)          (xy 87.183328 6.737117)
+          (xy 87.183328 6.631849)          (xy 87.203274 6.640384)          (xy 87.223178 6.648648)          (xy 87.24304 6.656641)
+          (xy 87.26286 6.664364)          (xy 87.282638 6.671815)          (xy 87.302374 6.678995)          (xy 87.322068 6.685905)
+          (xy 87.34172 6.692543)          (xy 87.36133 6.698911)          (xy 87.380898 6.705007)          (xy 87.400424 6.710833)
+          (xy 87.419908 6.716387)          (xy 87.43935 6.721671)          (xy 87.45875 6.726684)          (xy 87.478108 6.731425)
+          (xy 87.497424 6.735896)          (xy 87.516699 6.740096)          (xy 87.535931 6.744025)          (xy 87.555121 6.747683)
+          (xy 87.574269 6.75107)          (xy 87.593376 6.754186)          (xy 87.61244 6.757031)          (xy 87.631462 6.759605)
+          (xy 87.650443 6.761908)          (xy 87.669381 6.76394)          (xy 87.688277 6.765701)          (xy 87.707132 6.767192)
+          (xy 87.725944 6.768411)          (xy 87.744715 6.769359)          (xy 87.763443 6.770037)          (xy 87.78213 6.770443)
+          (xy 87.800774 6.770579)          (xy 87.812885 6.770531)          (xy 87.824854 6.77039)          (xy 87.836681 6.770154)
+          (xy 87.848367 6.769823)          (xy 87.859911 6.769398)          (xy 87.871314 6.768879)          (xy 87.882574 6.768265)
+          (xy 87.893693 6.767556)          (xy 87.904671 6.766753)          (xy 87.915506 6.765856)          (xy 87.9262 6.764864)
+          (xy 87.936752 6.763778)          (xy 87.947163 6.762597)          (xy 87.957432 6.761322)          (xy 87.967559 6.759953)
+          (xy 87.977545 6.758489)          (xy 87.987389 6.75693)          (xy 87.997091 6.755277)          (xy 88.01607 6.751688)
+          (xy 88.034483 6.747721)          (xy 88.052329 6.743376)          (xy 88.069608 6.738653)          (xy 88.086321 6.733553)
+          (xy 88.102466 6.728075)          (xy 88.118046 6.722219)          (xy 88.108518 6.717164)          (xy 88.099292 6.711953)
+          (xy 88.090368 6.706585)          (xy 88.081745 6.701061)          (xy 88.073424 6.695381)          (xy 88.065404 6.689544)
+          (xy 88.057685 6.68355)          (xy 88.046673 6.674266)          (xy 88.036339 6.664631)          (xy 88.026683 6.654643)
+          (xy 88.017706 6.644303)          (xy 88.009407 6.633611)          (xy 88.001786 6.622568)          (xy 87.994846 6.611119)
+          (xy 87.988588 6.599306)          (xy 87.983013 6.587128)          (xy 87.978121 6.574585)          (xy 87.973912 6.561677)
+          (xy 87.970385 6.548405)          (xy 87.96754 6.534767)          (xy 87.965379 6.520764)          (xy 87.963899 6.506396)
+          (xy 87.963293 6.496615)          (xy 87.962989 6.486672)          (xy 87.962957 6.482372)          (xy 88.030851 6.482372)
+          (xy 88.031072 6.492238)          (xy 88.032234 6.506712)          (xy 88.034392 6.520795)          (xy 88.037547 6.534487)
+          (xy 88.041697 6.547788)          (xy 88.046843 6.560699)          (xy 88.052985 6.573219)          (xy 88.060124 6.585348)
+          (xy 88.068258 6.597087)          (xy 88.077389 6.608435)          (xy 88.084029 6.615783)          (xy 88.087515 6.619392)
+          (xy 88.094686 6.626343)          (xy 88.102032 6.632845)          (xy 88.113381 6.641757)          (xy 88.125125 6.64966)
+          (xy 88.137263 6.656555)          (xy 88.149797 6.66244)          (xy 88.162726 6.667317)          (xy 88.176049 6.671184)
+          (xy 88.189768 6.674043)          (xy 88.203882 6.675893)          (xy 88.21839 6.676733)          (xy 88.223314 6.676789)
+          (xy 88.233082 6.676571)          (xy 88.247383 6.675424)          (xy 88.261263 6.673294)          (xy 88.274723 6.67018)
+          (xy 88.287762 6.666084)          (xy 88.30038 6.661004)          (xy 88.312577 6.654941)          (xy 88.324354 6.647895)
+          (xy 88.33571 6.639866)          (xy 88.346645 6.630853)          (xy 88.357159 6.620858)          (xy 88.36698 6.61015)
+          (xy 88.375835 6.598999)          (xy 88.383724 6.587406)          (xy 88.390647 6.575371)          (xy 88.396604 6.562894)
+          (xy 88.401595 6.549975)          (xy 88.40562 6.536613)          (xy 88.408679 6.52281)          (xy 88.410772 6.508564)
+          (xy 88.411631 6.498821)          (xy 88.41206 6.488881)          (xy 88.412114 6.483838)          (xy 88.411897 6.473645)
+          (xy 88.411248 6.463646)          (xy 88.410165 6.453839)          (xy 88.407728 6.43949)          (xy 88.404317 6.425574)
+          (xy 88.399932 6.412092)          (xy 88.394571 6.399044)          (xy 88.388237 6.38643)          (xy 88.380927 6.374249)
+          (xy 88.372643 6.362502)          (xy 88.363385 6.351188)          (xy 88.356671 6.343886)          (xy 88.349678 6.336877)
+          (xy 88.338843 6.32721)          (xy 88.327591 6.318562)          (xy 88.315922 6.31093)          (xy 88.303837 6.304316)
+          (xy 88.291336 6.29872)          (xy 88.278418 6.294141)          (xy 88.265083 6.29058)          (xy 88.251333 6.288036)
+          (xy 88.237165 6.28651)          (xy 88.222581 6.286001)          (xy 88.212692 6.286225)          (xy 88.198207 6.287402)
+          (xy 88.184144 6.289588)          (xy 88.170501 6.292783)          (xy 88.157279 6.296987)          (xy 88.144478 6.3022)
+          (xy 88.132097 6.308422)          (xy 88.120137 6.315652)          (xy 88.108598 6.323892)          (xy 88.09748 6.33314)
+          (xy 88.090302 6.339867)          (xy 88.086782 6.343398)          (xy 88.08001 6.350667)          (xy 88.073674 6.358125)
+          (xy 88.064989 6.369666)          (xy 88.057287 6.381632)          (xy 88.050569 6.394024)          (xy 88.044834 6.40684)
+          (xy 88.040082 6.420081)          (xy 88.036313 6.433748)          (xy 88.033527 6.447839)          (xy 88.031725 6.462356)
+          (xy 88.031069 6.472269)          (xy 88.030851 6.482372)          (xy 87.962957 6.482372)          (xy 87.962951 6.481639)
+          (xy 87.96325 6.468507)          (xy 87.964146 6.455608)          (xy 87.965639 6.442945)          (xy 87.967729 6.430516)
+          (xy 87.970417 6.418322)          (xy 87.973702 6.406363)          (xy 87.977584 6.394638)          (xy 87.982063 6.383148)
+          (xy 87.98714 6.371893)          (xy 87.992814 6.360873)          (xy 87.999085 6.350087)          (xy 88.005953 6.339536)
+          (xy 88.013419 6.329219)          (xy 88.021482 6.319138)          (xy 88.030142 6.309291)          (xy 88.039399 6.299678)
+          (xy 88.049105 6.290451)          (xy 88.059049 6.281818)          (xy 88.069232 6.273781)          (xy 88.079654 6.266339)
+          (xy 88.090313 6.259493)          (xy 88.101212 6.253242)          (xy 88.112349 6.247586)          (xy 88.123724 6.242526)
+          (xy 88.135338 6.238061)          (xy 88.147191 6.234191)          (xy 88.159282 6.230917)          (xy 88.171611 6.228237)
+          (xy 88.184179 6.226154)          (xy 88.196986 6.224665)          (xy 88.210031 6.223772)          (xy 88.223314 6.223475)
+        )
+      )
+      (polygon
+        (pts
+          (xy 87.927137 5.864089)          (xy 87.944135 5.864509)          (xy 87.96119 5.865209)          (xy 87.9783 5.866189)
+          (xy 87.995468 5.86745)          (xy 88.012691 5.86899)          (xy 88.029971 5.87081)          (xy 88.047307 5.87291)
+          (xy 88.064699 5.87529)          (xy 88.082148 5.87795)          (xy 88.099652 5.880891)          (xy 88.117214 5.884111)
+          (xy 88.134831 5.887611)          (xy 88.152505 5.891391)          (xy 88.170235 5.895452)          (xy 88.188021 5.899792)
+          (xy 88.205864 5.904412)          (xy 88.223763 5.909313)          (xy 88.241718 5.914493)          (xy 88.259729 5.919953)
+          (xy 88.277797 5.925694)          (xy 88.295921 5.931714)          (xy 88.314101 5.938015)          (xy 88.332338 5.944595)
+          (xy 88.350631 5.951456)          (xy 88.36898 5.958596)          (xy 88.387386 5.966017)          (xy 88.405848 5.973717)
+          (xy 88.424366 5.981698)          (xy 88.44294 5.989959)          (xy 88.461571 5.998499)          (xy 88.480258 6.00732)
+          (xy 88.480258 6.112344)          (xy 88.460312 6.103794)          (xy 88.440407 6.095515)          (xy 88.420544 6.087508)
+          (xy 88.400722 6.079772)          (xy 88.380942 6.072308)          (xy 88.361204 6.065115)          (xy 88.341507 6.058193)
+          (xy 88.321851 6.051543)          (xy 88.302237 6.045164)          (xy 88.282664 6.039057)          (xy 88.263133 6.033221)
+          (xy 88.243644 6.027657)          (xy 88.224196 6.022364)          (xy 88.204789 6.017342)          (xy 88.185424 6.012592)
+          (xy 88.1661 6.008114)          (xy 88.146818 6.003906)          (xy 88.127578 5.999971)          (xy 88.108379 5.996306)
+          (xy 88.089221 5.992913)          (xy 88.070105 5.989792)          (xy 88.05103 5.986942)          (xy 88.031997 5.984363)
+          (xy 88.013006 5.982056)          (xy 87.994056 5.98002)          (xy 87.975147 5.978256)          (xy 87.95628 5.976763)
+          (xy 87.937455 5.975542)          (xy 87.918671 5.974592)          (xy 87.899928 5.973913)          (xy 87.881227 5.973506)
+          (xy 87.862568 5.97337)          (xy 87.850441 5.973418)          (xy 87.838456 5.973562)          (xy 87.826612 5.973802)
+          (xy 87.81491 5.974137)          (xy 87.803348 5.974569)          (xy 87.791928 5.975096)          (xy 87.780649 5.975719)
+          (xy 87.769511 5.976438)          (xy 87.758514 5.977253)          (xy 87.747659 5.978164)          (xy 87.736945 5.979171)
+          (xy 87.726372 5.980274)          (xy 87.71594 5.981472)          (xy 87.705649 5.982767)          (xy 87.6955 5.984157)
+          (xy 87.685491 5.985643)          (xy 87.675624 5.987225)          (xy 87.665899 5.988903)          (xy 87.646871 5.992547)
+          (xy 87.628407 5.996574)          (xy 87.610509 6.000985)          (xy 87.593175 6.005779)          (xy 87.576407 6.010957)
+          (xy 87.560203 6.016518)          (xy 87.544563 6.022463)          (xy 87.554179 6.027431)          (xy 87.563488 6.032565)
+          (xy 87.57249 6.037864)          (xy 87.581185 6.04333)          (xy 87.589572 6.048962)          (xy 87.597652 6.05476)
+          (xy 87.605425 6.060724)          (xy 87.616508 6.069981)          (xy 87.6269 6.079612)          (xy 87.636601 6.089616)
+          (xy 87.64561 6.099994)          (xy 87.653929 6.110745)          (xy 87.661556 6.12187)          (xy 87.668496 6.133316)
+          (xy 87.674753 6.145122)          (xy 87.680328 6.15729)          (xy 87.685221 6.169818)          (xy 87.68943 6.182706)
+          (xy 87.692957 6.195955)          (xy 87.695801 6.209565)          (xy 87.697963 6.223536)          (xy 87.699442 6.237867)
+          (xy 87.700049 6.247621)          (xy 87.700352 6.257536)          (xy 87.70039 6.262554)          (xy 87.700091 6.275686)
+          (xy 87.699192 6.288585)          (xy 87.697694 6.301248)          (xy 87.695597 6.313677)          (xy 87.692901 6.325871)
+          (xy 87.689605 6.33783)          (xy 87.685711 6.349555)          (xy 87.681217 6.361045)          (xy 87.676124 6.3723)
+          (xy 87.670432 6.38332)          (xy 87.664141 6.394106)          (xy 87.657251 6.404657)          (xy 87.649761 6.414974)
+          (xy 87.641673 6.425055)          (xy 87.632985 6.434902)          (xy 87.623698 6.444515)          (xy 87.614022 6.453713)
+          (xy 87.604105 6.462318)          (xy 87.593948 6.470329)          (xy 87.583551 6.477747)          (xy 87.572913 6.484571)
+          (xy 87.562034 6.490802)          (xy 87.550916 6.49644)          (xy 87.539556 6.501484)          (xy 87.527957 6.505935)
+          (xy 87.516117 6.509792)          (xy 87.504036 6.513056)          (xy 87.491715 6.515727)          (xy 87.479154 6.517804)
+          (xy 87.466352 6.519287)          (xy 87.45331 6.520177)          (xy 87.440027 6.520474)          (xy 87.426868 6.520177)
+          (xy 87.413951 6.519287)          (xy 87.401276 6.517804)          (xy 87.388843 6.515727)          (xy 87.376653 6.513056)
+          (xy 87.364705 6.509792)          (xy 87.353 6.505935)          (xy 87.341536 6.501484)          (xy 87.330316 6.49644)
+          (xy 87.319337 6.490802)          (xy 87.308601 6.484571)          (xy 87.298107 6.477747)          (xy 87.287856 6.470329)
+          (xy 87.277846 6.462318)          (xy 87.268079 6.453713)          (xy 87.258555 6.444515)          (xy 87.249445 6.434898)
+          (xy 87.240924 6.42504)          (xy 87.23299 6.414939)          (xy 87.225643 6.404596)          (xy 87.218885 6.394011)
+          (xy 87.212714 6.383183)          (xy 87.20713 6.372113)          (xy 87.202135 6.3608)          (xy 87.197727 6.349245)
+          (xy 87.193907 6.337448)          (xy 87.190675 6.325409)          (xy 87.18803 6.313127)          (xy 87.185973 6.300603)
+          (xy 87.184504 6.287837)          (xy 87.183622 6.274828)          (xy 87.183328 6.261577)          (xy 87.183356 6.260111)
+          (xy 87.251228 6.260111)          (xy 87.251443 6.270304)          (xy 87.25209 6.280307)          (xy 87.253168 6.290119)
+          (xy 87.255594 6.304478)          (xy 87.25899 6.318409)          (xy 87.263356 6.33191)          (xy 87.268693 6.344982)
+          (xy 87.275 6.357624)          (xy 87.282277 6.369837)          (xy 87.290525 6.381621)          (xy 87.299742 6.392975)
+          (xy 87.306427 6.400307)          (xy 87.313449 6.407287)          (xy 87.324325 6.416912)          (xy 87.335614 6.425525)
+          (xy 87.347314 6.433124)          (xy 87.359427 6.43971)          (xy 87.371952 6.445283)          (xy 87.38489 6.449842)
+          (xy 87.398239 6.453388)          (xy 87.412001 6.455921)          (xy 87.426174 6.457441)          (xy 87.44076 6.457948)
+          (xy 87.45065 6.457723)          (xy 87.465134 6.456541)          (xy 87.479198 6.454345)          (xy 87.492841 6.451137)
+          (xy 87.506063 6.446915)          (xy 87.518864 6.44168)          (xy 87.531244 6.435432)          (xy 87.543204 6.42817)
+          (xy 87.554743 6.419896)          (xy 87.565862 6.410608)          (xy 87.57304 6.403853)          (xy 87.576559 6.400307)
+          (xy 87.583332 6.392981)          (xy 87.589668 6.385476)          (xy 87.598353 6.373883)          (xy 87.606054 6.361886)
+          (xy 87.612773 6.349485)          (xy 87.618508 6.336681)          (xy 87.62326 6.323474)          (xy 87.627029 6.309862)
+          (xy 87.629814 6.295847)          (xy 87.631617 6.281429)          (xy 87.632272 6.271592)          (xy 87.632491 6.261577)
+          (xy 87.632268 6.251624)          (xy 87.631598 6.241854)          (xy 87.629756 6.227543)          (xy 87.626909 6.213644)
+          (xy 87.623058 6.200157)          (xy 87.618203 6.187083)          (xy 87.612342 6.17442)          (xy 87.605477 6.16217)
+          (xy 87.597607 6.150332)          (xy 87.588733 6.138906)          (xy 87.582259 6.131517)          (xy 87.575338 6.124312)
+          (xy 87.568139 6.117391)          (xy 87.560767 6.110917)          (xy 87.549389 6.102043)          (xy 87.537623 6.094173)
+          (xy 87.525472 6.087308)          (xy 87.512934 6.081448)          (xy 87.50001 6.076592)          (xy 87.486699 6.072741)
+          (xy 87.473002 6.069894)          (xy 87.458918 6.068052)          (xy 87.444448 6.067215)          (xy 87.439539 6.067159)
+          (xy 87.429742 6.067378)          (xy 87.415406 6.068525)          (xy 87.401498 6.070655)          (xy 87.38802 6.073768)
+          (xy 87.374971 6.077865)          (xy 87.362352 6.082945)          (xy 87.350161 6.089008)          (xy 87.3384 6.096054)
+          (xy 87.327069 6.104083)          (xy 87.316167 6.113095)          (xy 87.305694 6.123091)          (xy 87.29596 6.133799)
+          (xy 87.287184 6.14495)          (xy 87.279365 6.156542)          (xy 87.272504 6.168577)          (xy 87.266599 6.181054)
+          (xy 87.261653 6.193974)          (xy 87.257664 6.207335)          (xy 87.254632 6.221139)          (xy 87.252557 6.235385)
+          (xy 87.251706 6.245128)          (xy 87.251281 6.255068)          (xy 87.251228 6.260111)          (xy 87.183356 6.260111)
+          (xy 87.18353 6.250932)          (xy 87.184137 6.240402)          (xy 87.185149 6.229985)          (xy 87.186564 6.219681)
+          (xy 87.188385 6.209491)          (xy 87.19061 6.199415)          (xy 87.193239 6.189452)          (xy 87.196273 6.179603)
+          (xy 87.199712 6.169867)          (xy 87.203555 6.160244)          (xy 87.207802 6.150736)          (xy 87.212454 6.14134)
+          (xy 87.217511 6.132059)          (xy 87.222972 6.122891)          (xy 87.228837 6.113836)          (xy 87.235108 6.104895)
+          (xy 87.241782 6.096067)          (xy 87.248862 6.087353)          (xy 87.256345 6.078753)          (xy 87.264234 6.070266)
+          (xy 87.272526 6.061892)          (xy 87.281224 6.053632)          (xy 87.290326 6.045486)          (xy 87.299832 6.037453)
+          (xy 87.309743 6.029534)          (xy 87.320058 6.021728)          (xy 87.330778 6.014036)          (xy 87.341903 6.006457)
+          (xy 87.353432 5.998992)          (xy 87.365365 5.991641)          (xy 87.377704 5.984402)          (xy 87.390446 5.977278)
+          (xy 87.403494 5.970306)          (xy 87.416748 5.963555)          (xy 87.430208 5.957025)          (xy 87.443874 5.950717)
+          (xy 87.457746 5.94463)          (xy 87.471825 5.938764)          (xy 87.486109 5.93312)          (xy 87.5006 5.927697)
+          (xy 87.515296 5.922495)          (xy 87.530199 5.917515)          (xy 87.545308 5.912756)          (xy 87.560622 5.908218)
+          (xy 87.576143 5.903902)          (xy 87.59187 5.899807)          (xy 87.607803 5.895934)          (xy 87.623942 5.892281)
+          (xy 87.640287 5.888851)          (xy 87.656839 5.885641)          (xy 87.673596 5.882653)          (xy 87.69056 5.879886)
+          (xy 87.707729 5.877341)          (xy 87.725105 5.875017)          (xy 87.742686 5.872914)          (xy 87.760474 5.871032)
+          (xy 87.778468 5.869372)          (xy 87.796668 5.867933)          (xy 87.815074 5.866716)          (xy 87.833686 5.86572)
+          (xy 87.852504 5.864945)          (xy 87.871528 5.864392)          (xy 87.890759 5.86406)          (xy 87.910195 5.863949)
+        )
+      )
+    )
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (start 33.02 76.2) (end 55.88 78.74) (layer "F.SilkS") (uuid fe318c2f-59b7-4360-ab2c-33e18a3dbd5c)
+    (effects (font (size 1 1) (thickness 0.1)) (justify right top mirror))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (pts
+      (xy 81.6335 93.955281)      (xy 58.995972 97.136778)      (xy 58.642472 94.621498)      (xy 81.28 91.44)
+    )
+    (angle 188) (layer "F.SilkS") (uuid 51b2d208-7c09-4cd1-9949-746d68c5bd7f)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box "test {dblquote}test{dblquote} \\\\test\\\\ \\\\\\\\\\\\\\"
+    (pts
+      (xy 60.433949 83.293949)      (xy 76.59841 67.129488)      (xy 78.394461 68.925539)      (xy 62.23 85.09)
+    )
+    (angle 45) (layer "F.SilkS") (uuid de4ab058-9f00-491e-af02-d7f3141c07c1)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+  (fp_text_box locked "locked"
+    (start 7.62 66.04) (end 30.48 68.58) (layer "F.SilkS") (uuid 05c2c330-50fb-44ff-8350-688ca4c39be3)
+    (effects (font (size 1 1) (thickness 0.1)) (justify left top))
+    (stroke (width 0.1) (type solid))
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_textKnockout b/tests/testdata/footprint/since_v7/test_textKnockout
new file mode 100644
index 0000000..6c346e7
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_textKnockout
@@ -0,0 +1,15 @@
+(footprint "CP_Elec_3x5.4" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 65bd7f8d)
+  (descr "SMD capacitor, aluminum electrolytic, Nichicon, 3.0x5.4mm")
+  (tags "capacitor electrolytic")
+  (attr smd)
+  (fp_text reference "REF**" (at 0 -2.7) (layer "F.SilkS" knockout)
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 44d2ce4a-f555-443e-872b-4f08845b4e47)
+  )
+  (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
+    (effects (font (size 0.6 0.6) (thickness 0.09)))
+    (uuid b78f3199-5a9c-4fe8-bce1-484a2ec30068)
+  )
+)
diff --git a/tests/testdata/footprint/since_v7/test_textsWithRenderCaches b/tests/testdata/footprint/since_v7/test_textsWithRenderCaches
new file mode 100644
index 0000000..7212846
--- /dev/null
+++ b/tests/testdata/footprint/since_v7/test_textsWithRenderCaches
@@ -0,0 +1,61 @@
+(footprint "a footprint" (version 20221018) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 641e2f5a)
+  (attr smd)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.1)))
+    (uuid 39612553-f75d-48ef-a666-bc78242caa79)
+  )
+  (fp_text user "kiutils" (at 0 7.62 unlocked) (layer "F.SilkS")
+    (effects (font (face "Castellar") (size 1 1) (thickness 0.1)) (justify left bottom))
+    (uuid ae264a1b-4ca8-442a-b9d6-22029292138f)
+    (render_cache "kiutils" 0
+      (polygon
+        (pts
+          (xy 0.352077 7.397931)          (xy 0.353925 7.410487)          (xy 0.354396 7.413363)          (xy 0.531716 7.45)
+          (xy 0.017096 7.45)          (xy 0.173168 7.41605)          (xy 0.174699 7.405317)          (xy 0.176179 7.394185)
+          (xy 0.182805 7.332537)          (xy 0.183975 7.319009)          (xy 0.185095 7.305082)          (xy 0.186162 7.290756)
+          (xy 0.19837 7.023551)          (xy 0.198491 7.011627)          (xy 0.198557 6.999944)          (xy 0.198569 6.992288)
+          (xy 0.17957 6.49273)          (xy 0.178541 6.486217)          (xy 0.154864 6.480844)          (xy 0.216399 6.480844)
+          (xy 0.154864 6.480844)          (xy 0.017096 6.449581)          (xy 0.533182 6.449581)
+        )
+      )
+      (polygon
+        (pts
+          (xy 1.312601 6.480844)          (xy 1.371667 6.480844)          (xy 1.371667 7.418736)          (xy 1.419783 7.418736)
+          (xy 1.419783 6.480844)          (xy 1.371667 6.480844)          (xy 1.312601 6.480844)          (xy 1.162107 6.449581)
+          (xy 1.681612 6.449581)
+        )
+      )
+      (polygon
+        (pts
+          (xy 1.930006 7.137613)          (xy 1.930006 6.465212)          (xy 1.881891 6.465212)          (xy 1.757473 6.465212)
+          (xy 1.701884 6.45642)          (xy 1.701884 6.449581)          (xy 2.202581 6.449581)
+        )
+      )
+    )
+  )
+  (fp_text_box "Nice\n"
+    (start 0 10.16) (end 10.16 7.62) (layer "F.SilkS") (uuid a32718d7-06ea-404e-852f-6d57a686862d)
+    (effects (font (face "Cascadia Mono") (size 2 2)))
+    (stroke (width 0.1) (type solid))
+    (render_cache "Nice" 0
+      (polygon
+        (pts
+          (xy 2.900377 10.05)          (xy 2.296121 8.57575)          (xy 2.169603 8.57575)          (xy 2.169603 8.111688)
+          (xy 2.350831 8.111688)          (xy 2.955576 9.585938)          (xy 3.023964 9.585938)          (xy 3.023964 10.05)
+        )
+      )
+      (polygon
+        (pts
+          (xy 4.479163 10.05)          (xy 4.479163 9.807711)          (xy 4.95446 9.807711)          (xy 4.95446 10.05)
+        )
+      )
+      (polygon
+        (pts
+          (xy 3.743015 8.822923)          (xy 3.743015 8.580635)          (xy 4.507007 8.580635)          (xy 4.507007 8.822923)
+        )
+      )
+    )
+  )
+)
diff --git a/tests/testdata/footprint/test_3dModelHideProperty b/tests/testdata/footprint/test_3dModelHideProperty
new file mode 100644
index 0000000..54b5136
--- /dev/null
+++ b/tests/testdata/footprint/test_3dModelHideProperty
@@ -0,0 +1,9 @@
+(footprint "test"
+  (layer "F.Cu")
+  (tedit 64b312a4)
+  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl" hide
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/footprint/test_allFootprintItems b/tests/testdata/footprint/test_allFootprintItems
new file mode 100644
index 0000000..0221ece
--- /dev/null
+++ b/tests/testdata/footprint/test_allFootprintItems
@@ -0,0 +1,149 @@
+(footprint "test" (version 20211014) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 621D235F)
+  (attr smd)
+  (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
+  )
+  (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid c58960d9-4cac-4036-ad2e-1aef26946dae)
+  )
+  (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu") hide
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+    (uuid 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
+  )
+  (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid ec9e24d8-d1c5-40e2-9812-dc315d05f470)
+  )
+  (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
+  )
+  (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 53c85970-3e21-4fae-a84f-721cfc0513b5)
+  )
+  (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
+  )
+  (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (uuid 003c2200-0632-4808-a662-8ddd5d30c768))
+  (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (uuid 6ff874d0-4ac5-414c-83a7-573eda4c7703))
+  (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (uuid be0953c0-632d-4dd2-85e9-4d41239f22d2))
+  (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (uuid 7f3eb118-a20c-4239-b800-c9211c66847d))
+  (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (uuid 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
+  (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (uuid fc0a4225-db46-4d48-8163-d522602d57cd))
+  (fp_poly (pts
+      (xy 8.4 14.95)
+      (xy 1.15 14.95)
+      (xy 1.15 6.7)
+      (xy 1.9 6.7)
+      (xy 8.4 0.2)
+    ) (layer "F.SilkS") (width 0.12) (fill solid) (uuid f6ee98b5-4773-4eeb-a825-33c1705abace))
+  (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (uuid 127679a9-3981-4934-815e-896a4e3ff56e))
+  (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (uuid 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
+  (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
+  (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 0520f61d-4522-4301-a3fa-8ed0bf060f69))
+  (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 0f560957-a8c5-442f-b20c-c2d88613742c))
+  (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
+  (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
+  (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
+  (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
+  (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
+  (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
+  (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
+  (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
+  (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid c43663ee-9a0d-4f27-a292-89ba89964065))
+  (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid c67ad10d-2f75-4ec6-a139-47058f7f06b2))
+  (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
+    (die_length 1) (uuid 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
+  (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
+    (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
+    (options (clearance convexhull) (anchor circle))
+    (primitives
+      (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
+      (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
+      (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
+      (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
+      (gr_poly (pts
+          (xy 12.8 4.2)
+          (xy 8.2 8.8)
+          (xy 3.8 4.4)
+          (xy 8.4 -0.2)
+        ) (width 0.2) (fill yes))
+  (gr_arc (start 6.4 0.2) (mid 6.596181 -0.790785) (end 7.155119 -1.632052) (width 0.2))
+          (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
+          (gr_poly (pts
+          (xy -0.6 2.8)
+          (xy -1.8 4)
+          (xy -6.4 4)
+          (xy -6.4 1)
+          (xy -0.6 1)
+        ) (width 0.2) (fill yes))
+          (gr_poly (pts
+          (xy 0.870847 -0.746121)
+          (xy 0.983248 -0.691178)
+          (xy 1.071791 -0.602789)
+          (xy 1.12693 -0.490484)
+          (xy 1.143 -0.381)
+          (xy 1.143 0.381)
+          (xy 1.127121 0.489847)
+          (xy 1.072178 0.602248)
+          (xy 0.983789 0.690791)
+          (xy 0.871484 0.74593)
+          (xy 0.762 0.762)
+          (xy -0.762 0.762)
+          (xy -0.870847 0.746121)
+          (xy -0.983248 0.691178)
+          (xy -1.071791 0.602789)
+          (xy -1.12693 0.490484)
+          (xy -1.143 0.381)
+          (xy -1.143 -0.381)
+          (xy -1.127121 -0.489847)
+          (xy -1.072178 -0.602248)
+          (xy -0.983789 -0.690791)
+          (xy -0.871484 -0.74593)
+          (xy -0.762 -0.762)
+          (xy 0.762 -0.762)
+        ) (width 0) (fill yes))
+    ) (uuid d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
+  (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
+    (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
+    (die_length 15) (uuid e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
+  (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (uuid 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
+  (zone (net 0) (net_name "") (layer "F.Cu") (uuid 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
+    (connect_pads (clearance 0))
+    (min_thickness 0.254)
+    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
+    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+    (polygon
+      (pts
+        (xy 49.6 11)
+        (xy 36.8 12.2)
+        (xy 36.8 -1.8)
+      )
+    )
+  )
+  (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
+    (members
+      7f3eb118-a20c-4239-b800-c9211c66847d
+      f6ee98b5-4773-4eeb-a825-33c1705abace
+    )
+  )
+)
diff --git a/tests/testdata/footprint/test_allFootprintItems.expected b/tests/testdata/footprint/test_allFootprintItems.expected
new file mode 100644
index 0000000..f8e5b66
--- /dev/null
+++ b/tests/testdata/footprint/test_allFootprintItems.expected
@@ -0,0 +1,149 @@
+(footprint "test" (version 20211014) (generator pcbnew)
+  (layer "F.Cu")
+  (tedit 621D235F)
+  (attr smd)
+  (fp_text reference "REF**" (at 2.2 -0.6 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 4c9fdea7-ba0c-45cc-8f66-240980c37d5c)
+  )
+  (fp_text value "test" (at 7.4 6.8 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid c58960d9-4cac-4036-ad2e-1aef26946dae)
+  )
+  (fp_text user "testtext hidden \"quoted \"" (at 30 0.2 unlocked) (layer "F.Cu") hide
+    (effects (font (size 1.5 1.5) (thickness 0.3)))
+    (uuid 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)
+  )
+  (fp_text user "tefdafdsafdsa" (at 4.8 -5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid ec9e24d8-d1c5-40e2-9812-dc315d05f470)
+  )
+  (fp_text user "testTEST" (at 27.6 -6 unlocked) (layer "Dwgs.User")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 4a21e717-d46d-4d9e-8b98-af4ecb02d3ec)
+  )
+  (fp_text user "test with \"quoted\" string" (at 30.2 -11.2 unlocked) (layer "Dwgs.User")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 53c85970-3e21-4fae-a84f-721cfc0513b5)
+  )
+  (fp_text user "${REFERENCE}" (at 7.4 8.3 unlocked) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+    (uuid 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd)
+  )
+  (fp_line (start 8.6 -15.8) (end 37.6 -15.8) (layer "F.Cu") (width 0.2) (uuid 003c2200-0632-4808-a662-8ddd5d30c768))
+  (fp_line (start 1.4 -8.95) (end 12.8 -8.95) (layer "F.SilkS") (width 0.12) (uuid 6ff874d0-4ac5-414c-83a7-573eda4c7703))
+  (fp_line (start -7.85 0.3) (end 1.4 -8.95) (layer "F.SilkS") (width 0.12) (uuid be0953c0-632d-4dd2-85e9-4d41239f22d2))
+  (fp_rect (start 10.35 23.2) (end 20.55 13) (layer "F.SilkS") (width 0.12) (fill none) (uuid 7f3eb118-a20c-4239-b800-c9211c66847d))
+  (fp_arc (start 24.333985 1.466015) (mid 18.858626 28.992503) (end -4.477203 13.4) (layer "F.SilkS") (width 0.12) (uuid 9ff4672a-e1a4-4a1e-887d-1b9a3429d278))
+  (fp_circle (center 16.6 -2.2) (end 20 -5.6) (layer "F.SilkS") (width 0.12) (fill none) (uuid fc0a4225-db46-4d48-8163-d522602d57cd))
+  (fp_poly (pts
+      (xy 8.4 14.95)
+      (xy 1.15 14.95)
+      (xy 1.15 6.7)
+      (xy 1.9 6.7)
+      (xy 8.4 0.2)
+    ) (layer "F.SilkS") (width 0.12) (fill solid) (uuid f6ee98b5-4773-4eeb-a825-33c1705abace))
+  (pad "" smd roundrect (at 31.2 6.4) (size 2.286 1.524) (layers "F.Paste") (roundrect_rratio 0.25) (uuid 127679a9-3981-4934-815e-896a4e3ff56e))
+  (pad "" np_thru_hole roundrect (at 26.6 1.4 90) (size 2.286 1.524) (drill 1) (layers F&B.Cu *.Mask) (roundrect_rratio 0.25) (uuid 9ccf03e8-755a-4cd9-96fc-30e1d08fa253))
+  (pad "1" smd roundrect (at 24 -24) (size 2.286 1.524) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 03c7f780-fc1b-487a-b30d-567d6c09fdc8))
+  (pad "1" smd roundrect (at 27 -24) (size 2.286 1.524) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 0520f61d-4522-4301-a3fa-8ed0bf060f69))
+  (pad "1" smd circle (at 27 -22) (size 2.286 2.286) (property pad_prop_heatsink) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 0f560957-a8c5-442f-b20c-c2d88613742c))
+  (pad "1" smd circle (at 24 -22) (size 2.286 2.286) (property pad_prop_testpoint) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 17ed3508-fa2e-4593-a799-bfd39a6cc14d))
+  (pad "1" smd circle (at 12 -22) (size 2.286 2.286) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 2a6075ae-c7fa-41db-86b8-3f996740bdc2))
+  (pad "1" smd roundrect (at 21 -24) (size 2.286 1.524) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 503dbd88-3e6b-48cc-a2ea-a6e28b52a1f7))
+  (pad "1" smd circle (at 21 -22) (size 2.286 2.286) (property pad_prop_fiducial_glob) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 5f6afe3e-3cb2-473a-819c-dc94ae52a6be))
+  (pad "1" smd roundrect (at 18 -24) (size 2.286 1.524) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 7f52d787-caa3-4a92-b1b2-19d554dc29a4))
+  (pad "1" smd roundrect (at 23 -8) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid 842e430f-0c35-45f3-a0b5-95ae7b7ae388))
+  (pad "1" smd circle (at 18 -22) (size 2.286 2.286) (property pad_prop_fiducial_loc) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid 98970bf0-1168-4b4e-a1c9-3b0c8d7eaacf))
+  (pad "1" smd roundrect (at 15 -24) (size 2.286 1.524) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid b7199d9b-bebb-4100-9ad3-c2bd31e21d65))
+  (pad "1" smd roundrect (at 12 -24) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (die_length 21) (uuid c43663ee-9a0d-4f27-a292-89ba89964065))
+  (pad "1" smd circle (at 15 -22) (size 2.286 2.286) (property pad_prop_bga) (layers "F.Cu" "F.Paste" "F.Mask")
+    (die_length 21) (uuid c67ad10d-2f75-4ec6-a139-47058f7f06b2))
+  (pad "2" thru_hole oval (at 22 4.8 90) (size 2.286 1.524) (drill oval 1.5 1 (offset 0.2 0.1)) (property pad_prop_castellated) (layers *.Cu *.Mask) (remove_unused_layers) (keep_end_layers)
+    (die_length 1) (uuid 1a2f72d1-0b36-4610-afc4-4ad1660d5d3b))
+  (pad "3" connect custom (at 35 19.8) (size 1.524 1.524) (layers "F.Cu" "F.Mask")
+    (solder_paste_margin -1) (solder_paste_margin_ratio -0.12) (clearance 1) (zone_connect 1) (thermal_width 1) (thermal_gap 1)
+    (options (clearance convexhull) (anchor circle))
+    (primitives
+      (gr_circle (center 1.2 -2.2) (end 6.008326 -2.2) (width 0.2) (fill yes))
+      (gr_rect (start -1.8 3.8) (end 2.8 -0.8) (width 0.2))
+      (gr_line (start 2.2 0.4) (end 6.6 0.4) (width 0.2))
+      (gr_circle (center 1.8 0.4) (end 6.891169 0.4) (width 0.2))
+      (gr_poly (pts
+          (xy 12.8 4.2)
+          (xy 8.2 8.8)
+          (xy 3.8 4.4)
+          (xy 8.4 -0.2)
+        ) (width 0.2) (fill yes))
+      (gr_arc (start 6.4 0.2) (mid 6.596181 -0.790785) (end 7.155119 -1.632052) (width 0.2))
+      (gr_line (start -1.6 0) (end -4.6 -3) (width 0.2))
+      (gr_poly (pts
+          (xy -0.6 2.8)
+          (xy -1.8 4)
+          (xy -6.4 4)
+          (xy -6.4 1)
+          (xy -0.6 1)
+        ) (width 0.2) (fill yes))
+      (gr_poly (pts
+          (xy 0.870847 -0.746121)
+          (xy 0.983248 -0.691178)
+          (xy 1.071791 -0.602789)
+          (xy 1.12693 -0.490484)
+          (xy 1.143 -0.381)
+          (xy 1.143 0.381)
+          (xy 1.127121 0.489847)
+          (xy 1.072178 0.602248)
+          (xy 0.983789 0.690791)
+          (xy 0.871484 0.74593)
+          (xy 0.762 0.762)
+          (xy -0.762 0.762)
+          (xy -0.870847 0.746121)
+          (xy -0.983248 0.691178)
+          (xy -1.071791 0.602789)
+          (xy -1.12693 0.490484)
+          (xy -1.143 0.381)
+          (xy -1.143 -0.381)
+          (xy -1.127121 -0.489847)
+          (xy -1.072178 -0.602248)
+          (xy -0.983789 -0.690791)
+          (xy -0.871484 -0.74593)
+          (xy -0.762 -0.762)
+          (xy 0.762 -0.762)
+        ) (width 0) (fill yes))
+    ) (uuid d1262c4d-2245-4c4f-8f35-7bb32cd9e21e))
+  (pad "4" smd roundrect (at 32 -6.6 90) (size 2.286 1.524) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0)
+    (chamfer_ratio 0.2) (chamfer top_left top_right bottom_left bottom_right)
+    (die_length 15) (uuid e4c6fdbb-fdc7-4ad4-a516-240d84cdc120))
+  (pad "5" thru_hole roundrect (at 30 -24) (size 2.286 1.524) (drill 1) (property pad_prop_castellated) (layers *.Cu *.Mask) (roundrect_rratio 0.25) (uuid 0fafc6b9-fd35-4a55-9270-7a8e7ce3cb13))
+  (zone (net 0) (net_name "") (layer "F.Cu") (uuid 7fe205fe-6e0e-4d47-97e6-ac4d30e9624d) (name "test") (hatch none 0.508)
+    (connect_pads (clearance 0))
+    (min_thickness 0.254)
+    (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed ) (copperpour allowed) (footprints allowed))
+    (fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
+    (polygon
+      (pts
+        (xy 49.6 11)
+        (xy 36.8 12.2)
+        (xy 36.8 -1.8)
+      )
+    )
+  )
+  (group "This is a test group with \"quoted\" strings" (id c8f2f7cd-7488-4cda-98bb-dc95119afdb7)
+    (members
+      7f3eb118-a20c-4239-b800-c9211c66847d
+      f6ee98b5-4773-4eeb-a825-33c1705abace
+    )
+  )
+)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeOther b/tests/testdata/footprint/test_createNewFootprintTypeOther
new file mode 100644
index 0000000..e45fc46
--- /dev/null
+++ b/tests/testdata/footprint/test_createNewFootprintTypeOther
@@ -0,0 +1,13 @@
+(footprint "empty-footprint-other" (version 20211014) (generator kiutils)
+  (layer "F.Cu")
+  (tedit 6328916A)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text value "empty-footprint-other" (at 0 1 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeSMD b/tests/testdata/footprint/test_createNewFootprintTypeSMD
new file mode 100644
index 0000000..d5c7da8
--- /dev/null
+++ b/tests/testdata/footprint/test_createNewFootprintTypeSMD
@@ -0,0 +1,14 @@
+(footprint "empty-footprint-smd" (version 20211014) (generator kiutils)
+  (layer "F.Cu")
+  (tedit 6328915F)
+  (attr smd)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text value "empty-footprint-smd" (at 0 1 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+)
diff --git a/tests/testdata/footprint/test_createNewFootprintTypeTHT b/tests/testdata/footprint/test_createNewFootprintTypeTHT
new file mode 100644
index 0000000..5552cb7
--- /dev/null
+++ b/tests/testdata/footprint/test_createNewFootprintTypeTHT
@@ -0,0 +1,14 @@
+(footprint "empty-footprint-through_hole" (version 20211014) (generator kiutils)
+  (layer "F.Cu")
+  (tedit 63289145)
+  (attr through_hole)
+  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text value "empty-footprint-through_hole" (at 0 1 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+  (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab")
+    (effects (font (size 1.0 1.0) (thickness 0.15)))
+  )
+)
diff --git a/tests/testdata/footprint/test_footprintEmptyAttributes b/tests/testdata/footprint/test_footprintEmptyAttributes
new file mode 100644
index 0000000..6352be1
--- /dev/null
+++ b/tests/testdata/footprint/test_footprintEmptyAttributes
@@ -0,0 +1,19 @@
+(footprint "Battery_CR1225"
+  (layer "F.Cu")
+  (tedit 5B93F51B)
+  (descr "CR1225 battery")
+  (tags "battery CR1225 coin cell")
+  (attr)
+  (fp_text reference "REF**" (at 0 -1) (layer "F.SilkS") hide
+    (effects (font (size 1 1) (thickness 0.15)))
+  )
+  (fp_text value "Battery_CR1225" (at 0 0.5) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+  )
+  (fp_circle (center 0 0) (end 6.25 0) (layer "F.Fab") (width 0.1))
+  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/footprint/test_footprintEmptyAttributes.expected b/tests/testdata/footprint/test_footprintEmptyAttributes.expected
new file mode 100644
index 0000000..61c050f
--- /dev/null
+++ b/tests/testdata/footprint/test_footprintEmptyAttributes.expected
@@ -0,0 +1,18 @@
+(footprint "Battery_CR1225"
+  (layer "F.Cu")
+  (tedit 5B93F51B)
+  (descr "CR1225 battery")
+  (tags "battery CR1225 coin cell")
+  (fp_text reference "REF**" (at 0 -1) (layer "F.SilkS") hide
+    (effects (font (size 1 1) (thickness 0.15)))
+  )
+  (fp_text value "Battery_CR1225" (at 0 0.5) (layer "F.Fab")
+    (effects (font (size 1 1) (thickness 0.15)))
+  )
+  (fp_circle (center 0 0) (end 6.25 0) (layer "F.Fab") (width 0.1))
+  (model "${KICAD6_3DMODEL_DIR}/Battery.3dshapes/Battery_CR1225.wrl"
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/footprint/test_footprintPadNewLines b/tests/testdata/footprint/test_footprintPadNewLines
new file mode 100644
index 0000000..162dd94
--- /dev/null
+++ b/tests/testdata/footprint/test_footprintPadNewLines
@@ -0,0 +1,97 @@
+(footprint "hSOC_DFN_QFN:QFN-20_EP_4x4_Pitch0.5mm"
+  (layer "F.Cu")
+  (tedit 62B45F33) (uuid 1cdb27c8-e9b7-413d-a6e6-8ef8360142f4)
+  (at 179.5 112.02 90)
+  (property "Hersteller" "Texas Instruments")
+  (path "/734873a3-b8ea-4cad-829d-8172e8b13cae/5e792133-030d-439a-b4b8-8e56d81fd968")
+  (attr smd)
+  (fp_text reference "IC503" (at 0 -3.5 90) (layer "F.SilkS") hide
+    (effects (font (size 0.75 0.6) (thickness 0.12)))
+    (uuid 2780c17a-23cc-4d6f-be7e-01bb3e085eb8)
+  )
+  (fp_text value "TPS386000" (at 0 3.5 90) (layer "F.Fab") hide
+    (effects (font (size 0.75 0.6) (thickness 0.12)))
+    (uuid aa57c053-4d35-4346-a3d7-4a863d13e85d)
+  )
+  (fp_text user "${REFERENCE}" (at 4.72 -0.85 unlocked) (layer "F.Fab")
+    (effects (font (size 0.75 0.6) (thickness 0.12)))
+    (uuid 02a37157-7ae3-4605-983d-fe3e3c753836)
+  )
+  (fp_line (start -1.5 2.15) (end -2.15 2.15) (layer "F.SilkS") (width 0.12) (uuid 4c6c330c-cc6b-4d8d-abd2-3c1da6527c9c))
+  (fp_line (start 2.15 2.15) (end 2.15 1.5) (layer "F.SilkS") (width 0.12) (uuid 7e026e92-de50-4cc6-90ab-760ef28ab9f4))
+  (fp_line (start 1.5 -2.15) (end 2.15 -2.15) (layer "F.SilkS") (width 0.12) (uuid 81b0d9d3-c407-4a3b-8d34-e3e1776be096))
+  (fp_line (start -2.15 2.15) (end -2.15 1.5) (layer "F.SilkS") (width 0.12) (uuid c6b0c515-b1d7-4924-8d81-21bd17dd19bf))
+  (fp_line (start 2.15 -2.15) (end 2.15 -1.5) (layer "F.SilkS") (width 0.12) (uuid cdecef17-5c1f-4a1b-ae1b-8cb458520405))
+  (fp_line (start 1.5 2.15) (end 2.15 2.15) (layer "F.SilkS") (width 0.12) (uuid e5695963-1995-40f2-a447-1a0682028cef))
+  (fp_circle (center -2.25 -2.25) (end -2.25 -2.15) (layer "F.SilkS") (width 0.2) (fill none) (uuid 402b0611-75e2-4922-87d8-1fc09aa060e9))
+  (fp_line (start 2.5 2.5) (end -2.5 2.5) (layer "F.CrtYd") (width 0.05) (uuid 12f325c5-b623-4cff-b8a0-015d34e040dd))
+  (fp_line (start 2.5 -2.5) (end 2.5 2.5) (layer "F.CrtYd") (width 0.05) (uuid 3a9cc810-76e7-454b-8c0e-7e87c4bc2be9))
+  (fp_line (start -2.5 -2.5) (end 2.5 -2.5) (layer "F.CrtYd") (width 0.05) (uuid 85e0f304-8795-4d48-a2db-186f7193f03b))
+  (fp_line (start -2.5 2.5) (end -2.5 -2.5) (layer "F.CrtYd") (width 0.05) (uuid aa931d1e-996d-4e9c-81e8-51f27dfe7349))
+  (fp_line (start 2 2) (end 2 -2) (layer "F.Fab") (width 0.12) (uuid 0e07c34a-af7b-4a69-96e5-048192852585))
+  (fp_line (start -2 -1) (end -2 2) (layer "F.Fab") (width 0.12) (uuid 41d7c7cb-e379-47e8-8fce-d65178cef7b7))
+  (fp_line (start -2 2) (end 2 2) (layer "F.Fab") (width 0.12) (uuid 5334bde5-08dc-4e10-b149-3f61f513611e))
+  (fp_line (start 2 -2) (end -1 -2) (layer "F.Fab") (width 0.12) (uuid c0b6e338-5160-4e09-a222-1ba04797ad2d))
+  (fp_poly (pts
+      (xy -2 -1)
+      (xy -2 -2)
+      (xy -1 -2)
+    ) (layer "F.Fab") (width 0.12) (fill solid) (uuid 08af2f41-e64a-465c-8644-5d4990d4c603))
+  (pad "1" smd roundrect (at -1.9 -1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 109 "/FPGA System/~{SV_MR}") (pinfunction "~{MR}") (pintype "input") (uuid 48f7e780-702d-4e86-bd97-a9b42f164b68))
+  (pad "2" smd roundrect (at -1.9 -0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 508 "unconnected-(IC503-Pad2)") (pinfunction "CT4") (pintype "passive+no_connect") (uuid c2ce275a-6e6e-4177-9ad1-b577b29e6538))
+  (pad "3" smd roundrect (at -1.9 0 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 131 "/FPGA System/SV_CT3") (pinfunction "CT3") (pintype "passive") (uuid 2628d390-7145-4f38-9907-6302f37a7a59))
+  (pad "4" smd roundrect (at -1.9 0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 133 "/FPGA System/SV_CT2") (pinfunction "CT2") (pintype "passive") (uuid 9dd16ffd-6e3f-45f7-9c64-78e09a9df256))
+  (pad "5" smd roundrect (at -1.9 1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 134 "/FPGA System/SV_CT1") (pinfunction "CT1") (pintype "passive") (uuid aa4de06a-4af6-4151-b3a9-7b59240efd38))
+  (pad "6" smd roundrect (at -1 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 1 "GND") (pinfunction "SENSE4H") (pintype "passive") (uuid b41fe68d-681f-4666-bc7c-41900a5b075d))
+  (pad "7" smd roundrect (at -0.5 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 1 "GND") (pinfunction "SENSE4L") (pintype "passive") (uuid c5e74868-a1ed-4e70-90cb-81414aa15b1d))
+  (pad "8" smd roundrect (at 0 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 106 "/FPGA System/SV_SENSE3") (pinfunction "SENSE3") (pintype "passive") (uuid e663486f-625f-4ea0-9b01-655c199f19a0))
+  (pad "9" smd roundrect (at 0.5 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 107 "/FPGA System/SV_SENSE2") (pinfunction "SENSE2") (pintype "passive") (uuid 3c5722ad-5f46-4ba5-b8a0-e88aada335f3))
+  (pad "10" smd roundrect (at 1 1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 108 "/FPGA System/SV_SENSE1") (pinfunction "SENSE1") (pintype "passive") (uuid e7207ed6-3f23-4ca0-ac46-eda1b2a0f97d))
+  (pad "11" smd roundrect (at 1.9 1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 509 "unconnected-(IC503-Pad11)") (pinfunction "NC") (pintype "no_connect") (uuid 13f736b7-ba74-478a-80d1-43514a0ffaef))
+  (pad "12" smd roundrect (at 1.9 0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 1 "GND") (pinfunction "GND") (pintype "power_in") (uuid cd8c90d6-073d-47ab-944a-b04517abadcf))
+  (pad "13" smd roundrect (at 1.9 0 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 510 "unconnected-(IC503-Pad13)") (pinfunction "VREF") (pintype "power_in+no_connect") (uuid ea4cf986-f7f5-42af-b371-4604d1a85402))
+  (pad "14" smd roundrect (at 1.9 -0.5 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 10 "+3V3") (pinfunction "VDD") (pintype "power_in") (uuid e9df98de-f561-4f41-88e1-d806ba3aeee8))
+  (pad "15" smd roundrect (at 1.9 -1 180) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET1}") (pintype "open_collector") (uuid ff9eae3c-1036-460c-8cf8-102ddc01be13))
+  (pad "16" smd roundrect (at 1 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET2}") (pintype "open_collector") (uuid e0e93dc1-fd0b-46c3-87e5-3c3527e296bf))
+  (pad "17" smd roundrect (at 0.5 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 279 "/FPGA System/~{SV_RST}") (pinfunction "~{RESET3}") (pintype "open_collector") (uuid 27d3145d-fe13-499a-a7f5-b5f720e42fc2))
+  (pad "18" smd roundrect (at 0 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 511 "unconnected-(IC503-Pad18)") (pinfunction "~{RESET4}") (pintype "open_collector+no_connect") (uuid c296457d-ee5b-4878-8ac9-4dfa25752d0b))
+  (pad "19" smd roundrect (at -0.5 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 512 "unconnected-(IC503-Pad19)") (pinfunction "~{WDO}") (pintype "open_collector+no_connect") (uuid 421fca03-6322-43b9-9cd9-c4997ec6a38f))
+  (pad "20" smd roundrect (at -1 -1.9 90) (size 0.25 1) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25)
+    (net 280 "/FPGA System/SV_WDI") (pinfunction "WDI") (pintype "input") (uuid 9eb656d2-148d-4e86-a5da-e1697ce150e6))
+  (pad "21" thru_hole circle (at 0.8 -0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (uuid 1a4095c5-2a67-4704-8748-b9d0d44454eb))
+  (pad "21" thru_hole circle (at 0.8 0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (uuid 1f162824-4818-4d22-86ef-f9972403692b))
+  (pad "21" thru_hole circle (at 0 0 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (uuid 604fe231-a5fb-4924-800d-f92df3406afd))
+  (pad "21" thru_hole circle (at -0.8 0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (uuid 9f4fad38-be4f-4d87-9302-8387474f9268))
+  (pad "21" thru_hole circle (at -0.8 -0.8 90) (size 0.5375 0.5375) (drill 0.2) (layers *.Cu *.Mask)
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (uuid c2df6d65-2a91-48e3-9326-b921c414dfd0))
+  (pad "21" smd rect (at 0 0 90) (size 2.15 2.15) (layers "F.Cu" "F.Paste" "F.Mask")
+    (net 1 "GND") (pinfunction "EPAD") (pintype "power_in") (solder_paste_margin_ratio -0.1) (uuid fad97280-7d2a-4a8f-8388-0c1f39d99017))
+  (model "${KIPRJMOD}/hil-kicad-libraries/3dmodels/Package_DFN_QFN.3dshapes/QFN-20-1EP_4x4mm_P0.5mm_EP2.5x2.5mm.wrl"
+    (offset (xyz 0 0 0))
+    (scale (xyz 1 1 1))
+    (rotate (xyz 0 0 0))
+  )
+)
diff --git a/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected b/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected
new file mode 100644
index 0000000..2e18c26
--- /dev/null
+++ b/tests/testdata/libtable/test_addEmptyLibraryObjectToLibTable.expected
@@ -0,0 +1,3 @@
+(fp_lib_table
+  (lib (name "")(type "KiCad")(uri "")(options "")(descr ""))
+)
diff --git a/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected b/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected
new file mode 100644
index 0000000..5e2e569
--- /dev/null
+++ b/tests/testdata/libtable/test_addLibraryObjectToLibTable.expected
@@ -0,0 +1,3 @@
+(fp_lib_table
+  (lib (name "object1")(type "KiCad")(uri "${KIPRJMOD}/my/library.pretty")(options "Some options with \"quoted strings\"")(descr "Some description with \"quoted strings\"")(disabled))
+)
diff --git a/tests/testdata/libtable/test_createNewLibTable b/tests/testdata/libtable/test_createNewLibTable
new file mode 100644
index 0000000..9c00ee7
--- /dev/null
+++ b/tests/testdata/libtable/test_createNewLibTable
@@ -0,0 +1,2 @@
+(sym_lib_table
+)
diff --git a/tests/testdata/libtable/test_parseFpLibTable.expected b/tests/testdata/libtable/test_parseFpLibTable.expected
new file mode 100644
index 0000000..dce3003
--- /dev/null
+++ b/tests/testdata/libtable/test_parseFpLibTable.expected
@@ -0,0 +1,4 @@
+(fp_lib_table
+  (lib (name "vn-mcu-own-footprints")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-ownlibs/vn-mcu-own-footprints.pretty")(options "")(descr ""))
+  (lib (name "vn-mcu-footprints")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-librarys/vn-mcu-footprints.pretty")(options "")(descr "")(disabled))
+)
diff --git a/tests/testdata/libtable/test_parseSymLibTable.expected b/tests/testdata/libtable/test_parseSymLibTable.expected
new file mode 100644
index 0000000..30d435a
--- /dev/null
+++ b/tests/testdata/libtable/test_parseSymLibTable.expected
@@ -0,0 +1,4 @@
+(sym_lib_table
+  (lib (name "vn-mcu-own")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-ownlibs/vn-mcu-own.kicad_sym")(options "")(descr "")(disabled))
+  (lib (name "vn-mcu-symbols")(type "KiCad")(uri "${KIPRJMOD}/vn-mcu-librarys/vn-mcu-symbols.kicad_sym")(options "")(descr ""))
+)
diff --git a/tests/testdata/misc/test_quotesAndBackslashInSexpr b/tests/testdata/misc/test_quotesAndBackslashInSexpr
new file mode 100644
index 0000000..8b13731
--- /dev/null
+++ b/tests/testdata/misc/test_quotesAndBackslashInSexpr
@@ -0,0 +1,61 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "A4 \"quote\" \\")
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "SomeLayer")
+    (comment 2 "Some \"quoted\" Layer")
+    (comment 3 "Some Layer\\\")
+    (comment 4 "Some \"quoted\" Layer\\\")
+    (comment 5 "\\\\\\\\\\\\\\"\\\\\\\\\\\"")
+    (comment 6 "|\\")
+    (comment 7 "!\"§$%&/()=?`´+*~#'-_.:,;<>|")
+  )
+
+  (lib_symbols
+    (symbol "TEST"
+      (property "Normal string without quotes" "abc" (id 0) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Normal string \"with\" quotes" " " (id 1) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Normal string with \\backslashes\\" "\\" (id 2) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Normal string with \\backslashes\\ and \"quotes\" "\"" (id 3) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "|\\" "\\"\"" (id 4) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "\\\\\\\\\\\\\\"\\\\\\\\\\\"" "" (id 5) (at 0 9.525 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+
+    (symbol "TEST with \"quoted\" strings "
+    )
+
+    (symbol "TEST with \\backslashes\\"
+    )
+
+    (symbol "TEST with \"quoted\" strings and \\backslashes\\"
+    )
+
+    (symbol "|\\"
+    )
+
+    (symbol "\\\\\\\\\\"\\\\\"\\\\"\"\\\"
+    )
+
+    (symbol "!\"§$%&/()=?`´+*~#'-_.:,;<>|"
+    )
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_arcAllVariants b/tests/testdata/schematic/since_v7/test_arcAllVariants
new file mode 100644
index 0000000..6cb0993
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_arcAllVariants
@@ -0,0 +1,132 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid 721ffcf0-2683-45a5-82ff-f53d532e9160)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (arc (start 83.818 63.498) (mid 89.7702 49.1302) (end 104.138 43.178)
+    (stroke (width 1) (type solid) (color 255 7 109 1))
+    (fill (type none))
+    (uuid 03fb5ce1-8772-494c-8da7-c1f482601fa8)
+  )
+  (arc (start 119.378 101.598) (mid 125.3302 87.2302) (end 139.698 81.278)
+    (stroke (width 1) (type dot) (color 255 206 31 1))
+    (fill (type color) (color 27 255 171 1))
+    (uuid 0c9a4cd8-68d9-4296-bdfe-c16e3d49f0cb)
+  )
+  (arc (start 91.438 138.428) (mid 97.3902 124.0602) (end 111.758 118.108)
+    (stroke (width 1) (type dash_dot_dot) (color 255 158 28 1))
+    (fill (type none))
+    (uuid 0f1a04d7-c6d5-436f-be2a-e41d33c1bcab)
+  )
+  (arc (start 86.358 81.278) (mid 92.3102 66.9102) (end 106.678 60.958)
+    (stroke (width 1) (type dash) (color 124 16 255 1))
+    (fill (type none))
+    (uuid 12ea35b3-90af-43b5-bdbc-4591893ea5a1)
+  )
+  (arc (start 46.988 121.918) (mid 52.9402 107.5502) (end 67.308 101.598)
+    (stroke (width 0) (type dash_dot))
+    (fill (type none))
+    (uuid 2668cdeb-1f6d-450d-9aa0-ef9d1bd01954)
+  )
+  (arc (start 151.13 44.45) (mid 157.0822 30.0822) (end 171.45 24.13)
+    (stroke (width -0.0001) (type default) (color 255 76 168 1))
+    (fill (type color) (color 255 31 2 1))
+    (uuid 2e0ba40c-7440-403b-b1c8-680ce0c206a7)
+  )
+  (arc (start 152.398 120.648) (mid 158.3502 106.2802) (end 172.718 100.328)
+    (stroke (width -0.0001) (type dash_dot) (color 36 193 255 1))
+    (fill (type color) (color 255 255 36 1))
+    (uuid 402f8784-f8c7-40b2-9a3f-3dbb34008527)
+  )
+  (arc (start 118.108 121.918) (mid 124.0602 107.5502) (end 138.428 101.598)
+    (stroke (width 1) (type dash_dot) (color 36 193 255 1))
+    (fill (type color) (color 255 255 36 1))
+    (uuid 50e9bfc6-5b90-4059-89d9-a2aa9afb9535)
+  )
+  (arc (start 116.838 64.768) (mid 122.7902 50.4002) (end 137.158 44.448)
+    (stroke (width 1) (type solid) (color 255 7 109 1))
+    (fill (type color) (color 255 213 39 1))
+    (uuid 5f868c05-1d62-4f22-8a82-ad3e993d2404)
+  )
+  (arc (start 53.338 139.698) (mid 59.2902 125.3302) (end 73.658 119.378)
+    (stroke (width 0) (type dash_dot_dot))
+    (fill (type none))
+    (uuid 6adf748d-6ed9-415f-b6ba-27660de76b00)
+  )
+  (arc (start 85.088 120.648) (mid 91.0402 106.2802) (end 105.408 100.328)
+    (stroke (width 1) (type dash_dot) (color 36 193 255 1))
+    (fill (type none))
+    (uuid 71994075-b49b-4d47-95a4-88b2807b3767)
+  )
+  (arc (start 86.358 100.328) (mid 92.3102 85.9602) (end 106.678 80.008)
+    (stroke (width 1) (type dot) (color 255 206 31 1))
+    (fill (type none))
+    (uuid 749f101b-47c1-4c13-857e-a5dc34acf924)
+  )
+  (arc (start 45.718 64.768) (mid 51.6702 50.4002) (end 66.038 44.448)
+    (stroke (width 0) (type solid))
+    (fill (type none))
+    (uuid 7c9ffc2a-6cba-4fa7-8dd7-a30382ea14a2)
+  )
+  (arc (start 83.82 44.45) (mid 89.7722 30.0822) (end 104.14 24.13)
+    (stroke (width 1) (type default) (color 255 76 168 1))
+    (fill (type none))
+    (uuid 7ca3d834-6614-4786-b638-40db9ee056a6)
+  )
+  (arc (start 116.84 45.72) (mid 122.7922 31.3522) (end 137.16 25.4)
+    (stroke (width 1) (type default) (color 255 76 168 1))
+    (fill (type color) (color 255 31 2 1))
+    (uuid 85e5312f-320f-43d9-906a-275ab3297bd9)
+  )
+  (arc (start 119.378 82.548) (mid 125.3302 68.1802) (end 139.698 62.228)
+    (stroke (width 1) (type dash) (color 124 16 255 1))
+    (fill (type color) (color 38 78 255 1))
+    (uuid 8957af50-7906-4079-be4c-cb6035c19fd8)
+  )
+  (arc (start 153.668 81.278) (mid 159.6202 66.9102) (end 173.988 60.958)
+    (stroke (width -0.0001) (type dash) (color 124 16 255 1))
+    (fill (type color) (color 38 78 255 1))
+    (uuid 8d631f00-f7bd-4202-af5f-ab8f8fb88d0e)
+  )
+  (arc (start 48.258 101.598) (mid 54.2102 87.2302) (end 68.578 81.278)
+    (stroke (width 0) (type dot))
+    (fill (type none))
+    (uuid 9ffbd003-f6cf-4406-9a4a-7a44c8b2f998)
+  )
+  (arc (start 48.258 82.548) (mid 54.2102 68.1802) (end 68.578 62.228)
+    (stroke (width 0) (type dash))
+    (fill (type none))
+    (uuid ae39850f-f4b3-4bf1-a3ae-7e7b207fbb0c)
+  )
+  (arc (start 158.748 138.428) (mid 164.7002 124.0602) (end 179.068 118.108)
+    (stroke (width -0.0001) (type dash_dot_dot) (color 255 158 28 1))
+    (fill (type color) (color 35 255 55 1))
+    (uuid c22fb512-4064-4088-9906-161da3143f8f)
+  )
+  (arc (start 153.668 100.328) (mid 159.6202 85.9602) (end 173.988 80.008)
+    (stroke (width -0.0001) (type dot) (color 255 206 31 1))
+    (fill (type color) (color 27 255 171 1))
+    (uuid d4c2cc1f-f64b-4c32-abe5-4052a195fbb8)
+  )
+  (arc (start 151.128 63.498) (mid 157.0802 49.1302) (end 171.448 43.178)
+    (stroke (width -0.0001) (type solid) (color 255 7 109 1))
+    (fill (type color) (color 255 213 39 1))
+    (uuid d606a7e8-4902-4a4b-ab3c-eb64a68e4bf7)
+  )
+  (arc (start 124.458 139.698) (mid 130.4102 125.3302) (end 144.778 119.378)
+    (stroke (width 1) (type dash_dot_dot) (color 255 158 28 1))
+    (fill (type color) (color 35 255 55 1))
+    (uuid d948e413-5ab1-42be-a7fb-a998552f7fb5)
+  )
+  (arc (start 45.72 45.72) (mid 51.6722 31.3522) (end 66.04 25.4)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid f110e2d5-8caf-4210-a8b3-4a6ae67cb535)
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_busAliases b/tests/testdata/schematic/since_v7/test_busAliases
new file mode 100644
index 0000000..f898331
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_busAliases
@@ -0,0 +1,16 @@
+(kicad_sch (version 20230121) (generator kiutils)
+
+  (uuid 80899fed-1b75-4222-a6b3-1ed87b4e7bbb)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (bus_alias "" (members ))
+  (bus_alias "test (not empty)" (members "" "m0" "m2" "\"test\"" "!\"§$%&/()=?"))
+  (bus_alias "test (empty)" (members ))
+  (bus_alias "test (empty, \"quoted\")" (members ))
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_circleAllVariants b/tests/testdata/schematic/since_v7/test_circleAllVariants
new file mode 100644
index 0000000..19b2844
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_circleAllVariants
@@ -0,0 +1,92 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid 3a563ed9-b266-4375-be29-6a2d9f906b82)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (circle (center 179.07 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type dash_dot))
+    (fill (type none))
+    (uuid 10f67b74-259d-4569-bc67-523ab4b3ccf2)
+  )
+  (circle (center 80.01 40.64) (radius 14.3684)
+    (stroke (width 2) (type default))
+    (fill (type none))
+    (uuid 16d91da5-0b12-42b6-970d-ddf7b42947b3)
+  )
+  (circle (center 48.26 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type default))
+    (fill (type none))
+    (uuid 37b15c16-7542-40d6-9191-d24af787f4d6)
+  )
+  (circle (center 212.09 71.12) (radius 14.3684)
+    (stroke (width 0) (type dash_dot_dot))
+    (fill (type none))
+    (uuid 50d5af19-333f-4ad1-9ed9-ee5990ec10f6)
+  )
+  (circle (center 179.07 71.12) (radius 14.3684)
+    (stroke (width 0) (type dash_dot))
+    (fill (type none))
+    (uuid 55dd3320-e7af-4681-88c1-98593c6bf7a8)
+  )
+  (circle (center 212.09 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type dash_dot_dot))
+    (fill (type none))
+    (uuid 72af28c4-e958-4729-8288-3b7dcada1350)
+  )
+  (circle (center 80.01 71.12) (radius 14.3684)
+    (stroke (width 0) (type solid))
+    (fill (type none))
+    (uuid 74290032-e2ac-45a1-8bc5-76ed6df208f6)
+  )
+  (circle (center 48.26 71.12) (radius 14.3684)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 7d2aae1d-18e7-4ef4-b103-4005799a43f6)
+  )
+  (circle (center 146.05 40.64) (radius 14.3684)
+    (stroke (width 2) (type default) (color 137 255 16 1))
+    (fill (type color) (color 255 243 25 1))
+    (uuid 93f9ae38-0ce9-4446-be2a-4fc255f84a35)
+  )
+  (circle (center 113.03 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type dash))
+    (fill (type none))
+    (uuid ab42f3f3-f33c-4c8c-b063-87ab7e46e89d)
+  )
+  (circle (center 146.05 71.12) (radius 14.3684)
+    (stroke (width 0) (type dot))
+    (fill (type none))
+    (uuid bfe7e384-1bb9-41fd-a66a-a2976f83a4a1)
+  )
+  (circle (center 113.03 71.12) (radius 14.3684)
+    (stroke (width 0) (type dash))
+    (fill (type none))
+    (uuid c2090aec-b2f7-4752-a921-ba0c7f208468)
+  )
+  (circle (center 80.01 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type solid))
+    (fill (type none))
+    (uuid dcce03fa-6dda-4ef8-a70b-6b47ba8e01ef)
+  )
+  (circle (center 48.26 40.64) (radius 14.3684)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid e8b79b64-55ca-4565-a730-cd2ac6385df8)
+  )
+  (circle (center 146.05 101.6) (radius 14.3684)
+    (stroke (width -0.0001) (type dot))
+    (fill (type none))
+    (uuid e8de0d20-c231-4ffb-9760-739c86b6f332)
+  )
+  (circle (center 113.03 40.64) (radius 14.3684)
+    (stroke (width 2) (type default) (color 137 255 16 1))
+    (fill (type none))
+    (uuid f2e3adbf-e95f-4add-a3c7-8897f192f908)
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_netclassFlags b/tests/testdata/schematic/since_v7/test_netclassFlags
new file mode 100644
index 0000000..8b208b7
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_netclassFlags
@@ -0,0 +1,166 @@
+(kicad_sch (version 20230121) (generator kiutils)
+
+  (uuid 16318c8c-4df8-43cf-928b-35195771e827)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (wire (pts (xy 78.74 78.74) (xy 125.73 78.74))
+    (stroke (width 0) (type default))
+    (uuid 03dbf5d2-7288-42e6-aa7c-ddfd4c37b275)
+  )
+
+  (netclass_flag "" (length 2.54) (shape round) (at 167.64 104.14 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 08080298-2bdd-4ee6-8da5-5662f27e6762)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 101.6 0)
+      (effects (font (size 1.27 1.27) italic) (justify bottom))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape rectangle) (at 87.63 138.43 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 1b6cd7b9-8149-4c44-99e4-514ecd25616c)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 135.89 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 76.2 109.22 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 30c40ad8-fcc1-4072-b63a-e313b1a7440d)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 106.68 0)
+      (effects (font (size 1.27 1.27) italic) (justify right))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 167.64 109.22 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 357d8a58-696a-4651-b40d-2b163cb48226)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 106.68 0)
+      (effects (font (size 1.27 1.27) italic) (justify right bottom))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 146.05 137.16 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 37e2df8e-282c-425c-b356-52b15b0ee755)
+    (property "Netclass" "test1" (at 146.7485 134.62 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+    (property "Netclass" "test2" (at 146.7485 136.0805 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+    (property "Netclass" "test3" (at 146.7485 137.541 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+    (property "Netclass" "test4" (at 146.7485 139.0015 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+    (property "Netclass" "test5" (at 146.7485 140.462 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape rectangle) (at 87.63 142.24 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27) (color 255 105 97 1)) (justify left bottom))
+    (uuid 43631342-fcf4-43e8-87e6-f93f66ca188f)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 139.7 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape dot) (at 87.63 127 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 4ea51e98-11f8-471f-9684-25eb32460c81)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.3285 124.46 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape diamond) (at 87.63 134.62 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 4ef43825-a2c4-40af-9996-f1eb2acd9039)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.8365 132.08 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 87.63 130.81 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 651b7cd6-0fe3-4279-b571-ae923f97d2af)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 88.3285 128.27 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 160.02 135.89 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 70b4b5a7-a7ae-4e81-ac2d-3eccd7f1aec1)
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 76.2 104.14 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 839eb452-c124-4716-bdbc-249248b4631d)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 101.6 0)
+      (effects (font (size 1.27 1.27) italic))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 123.19 104.14 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ba07de68-3086-4253-bac0-76e491ff5078)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 101.6 0)
+      (effects (font (size 1.27 1.27) italic) (justify top))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 78.74 78.74 90) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bf81418c-1c27-4f48-ba57-679395f33ad4)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.2 78.0415 90) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 88.9 78.74 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right bottom))
+    (uuid c21f558d-d2db-4218-8490-3e001be8ffa9)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 89.5985 81.28 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 167.64 99.06 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d291308b-6fa3-4eee-b3c5-a92f1ccce99e)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 168.3385 96.52 0)
+      (effects (font (size 1.27 1.27) italic) (justify left bottom))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 76.2 99.06 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d851db7c-14b1-4058-8431-38c79581307a)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 76.8985 96.52 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 123.19 99.06 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid dcf17a5a-7997-408e-9cb0-4a4de2c5a8f4)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 96.52 0)
+      (effects (font (size 1.27 1.27) italic) (justify left top))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 86.36 78.74 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid e00118d5-06cb-4e6e-99be-3b70b43de4af)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 87.0585 76.2 0) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 123.19 109.22 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid e839d16d-7efa-4757-9df6-d9ed53d5894c)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 123.8885 106.68 0)
+      (effects (font (size 1.27 1.27) italic) (justify right top))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 125.73 78.74 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right bottom))
+    (uuid f33895c1-c956-42e1-bc32-1baebd3b8a0f)
+    (property "Netclass" "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\\\" (at 128.27 78.0415 90) (show_name)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_rectangleAllVariants b/tests/testdata/schematic/since_v7/test_rectangleAllVariants
new file mode 100644
index 0000000..8b7b9ac
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_rectangleAllVariants
@@ -0,0 +1,102 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid c1ef0f5b-928d-41cb-9d70-a66e71feb54d)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (rectangle (start 106.68 102.87) (end 116.84 105.41)
+    (stroke (width 1) (type solid) (color 255 111 208 1))
+    (fill (type color) (color 255 67 133 1))
+    (uuid 0ffe7370-0f86-4ed2-aa0e-042a77ff4fcf)
+  )
+  (rectangle (start 83.82 102.87) (end 93.98 105.41)
+    (stroke (width 0) (type solid))
+    (fill (type none))
+    (uuid 13a9b608-1006-421c-9430-d341c2b42faa)
+  )
+  (rectangle (start 83.82 114.3) (end 93.98 116.84)
+    (stroke (width 0) (type dash_dot))
+    (fill (type none))
+    (uuid 291cd07e-badd-4979-a935-058778bb6e1d)
+  )
+  (rectangle (start 106.68 99.06) (end 116.84 101.6)
+    (stroke (width 1) (type default) (color 255 29 62 1))
+    (fill (type color) (color 255 118 101 1))
+    (uuid 404354a5-74f0-48f5-b3a0-24a2d17be6f0)
+  )
+  (rectangle (start 95.25 99.06) (end 105.41 101.6)
+    (stroke (width 1) (type default) (color 255 29 62 1))
+    (fill (type none))
+    (uuid 44c5959b-f42f-4832-8b3f-adcf58fc97c9)
+  )
+  (rectangle (start 83.82 118.11) (end 93.98 120.65)
+    (stroke (width 0) (type dash_dot_dot))
+    (fill (type none))
+    (uuid 51eb8703-ef52-47c0-be23-954d88654c6b)
+  )
+  (rectangle (start 83.82 99.06) (end 93.98 101.6)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 6298cf3e-1361-4a1b-b18b-ac9885df9591)
+  )
+  (rectangle (start 95.25 114.3) (end 105.41 116.84)
+    (stroke (width 1) (type dash_dot) (color 255 205 48 1))
+    (fill (type none))
+    (uuid 6439e013-5a17-4d2d-82f7-2dba64d7e222)
+  )
+  (rectangle (start 83.82 110.49) (end 93.98 113.03)
+    (stroke (width 0) (type dot))
+    (fill (type none))
+    (uuid 68eaaa0e-2900-4b9a-9504-3af60a7152be)
+  )
+  (rectangle (start 106.68 106.68) (end 116.84 109.22)
+    (stroke (width 1) (type dash) (color 255 98 72 1))
+    (fill (type color) (color 255 123 41 1))
+    (uuid 75ef5c11-7b2e-4099-acf2-bc1360321847)
+  )
+  (rectangle (start 106.68 110.49) (end 116.84 113.03)
+    (stroke (width 1) (type dot) (color 93 255 89 1))
+    (fill (type color) (color 255 141 44 1))
+    (uuid 7bad4420-7874-436e-bb91-cd6fc113f242)
+  )
+  (rectangle (start 95.25 102.87) (end 105.41 105.41)
+    (stroke (width 1) (type solid) (color 255 111 208 1))
+    (fill (type none))
+    (uuid 80d6c30c-f860-457c-9285-26b392dc18e8)
+  )
+  (rectangle (start 106.68 118.11) (end 116.84 120.65)
+    (stroke (width 1) (type dash_dot_dot) (color 73 152 255 1))
+    (fill (type color) (color 255 149 16 1))
+    (uuid 8b4bf7a5-c1a6-4371-a51b-e294e137a8f5)
+  )
+  (rectangle (start 95.25 118.11) (end 105.41 120.65)
+    (stroke (width 1) (type dash_dot_dot) (color 73 152 255 1))
+    (fill (type none))
+    (uuid 93a3b606-675e-4fad-87be-a0b3f696df94)
+  )
+  (rectangle (start 95.25 106.68) (end 105.41 109.22)
+    (stroke (width 1) (type dash) (color 255 98 72 1))
+    (fill (type none))
+    (uuid b8ed7a4c-f137-44aa-97fb-74029e8e69ec)
+  )
+  (rectangle (start 95.25 110.49) (end 105.41 113.03)
+    (stroke (width 1) (type dot) (color 93 255 89 1))
+    (fill (type none))
+    (uuid c36f51bb-5c1f-49cb-bd3b-492664be8406)
+  )
+  (rectangle (start 106.68 114.3) (end 116.84 116.84)
+    (stroke (width 1) (type dash_dot) (color 255 205 48 1))
+    (fill (type color) (color 77 255 11 1))
+    (uuid c461a677-d9f1-47ce-a580-5e692886001d)
+  )
+  (rectangle (start 83.82 106.68) (end 93.98 109.22)
+    (stroke (width 0) (type dash))
+    (fill (type none))
+    (uuid e84a05a3-8c6c-45ff-9878-0aaf464c6c7c)
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives b/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives
new file mode 100644
index 0000000..30ee696
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_schematicWithAllPrimitives
@@ -0,0 +1,989 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "Comment 1")
+    (comment 2 "Comment 2")
+    (comment 3 "Comment 3")
+    (comment 4 "Comment 4")
+    (comment 5 "Comment 5")
+    (comment 6 "Comment 6")
+    (comment 7 "Comment 7")
+    (comment 8 "Comment 8")
+    (comment 9 "Comment 9")
+  )
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
+    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
+  )
+  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
+    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
+  )
+
+  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
+  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
+
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
+  )
+
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default))
+    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
+  )
+  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
+    (stroke (width 0) (type default))
+    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
+  )
+  (polyline (pts (xy 171.45 38.1) (xy 171.45 44.45))
+    (stroke (width 0) (type default))
+    (uuid 239609dc-93b9-4af6-a2d0-4d49e97cfc69)
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default))
+    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
+  )
+  (polyline (pts (xy 170.18 44.45) (xy 171.45 44.45))
+    (stroke (width 0) (type default))
+    (uuid 332c931b-a5c1-454a-ba33-bf257b7236ce)
+  )
+  (polyline (pts (xy 160.02 49.53) (xy 160.02 38.1))
+    (stroke (width 0) (type default))
+    (uuid 3e737101-0002-472c-9928-434173405cb3)
+  )
+  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
+    (stroke (width 0) (type default))
+    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
+  )
+  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
+    (stroke (width 0) (type default))
+    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
+    (stroke (width 0) (type default))
+    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
+  )
+  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
+  )
+  (polyline (pts (xy 160.02 38.1) (xy 171.45 38.1))
+    (stroke (width 0) (type default))
+    (uuid 6bca95ca-caa6-4733-b53b-b13a5b3aff78)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
+    (stroke (width 0) (type default))
+    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
+  )
+  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
+    (stroke (width 0) (type default))
+    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
+  )
+  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
+    (stroke (width 0) (type default))
+    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
+  )
+  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
+    (stroke (width 0) (type default))
+    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
+  )
+  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
+  )
+  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
+    (stroke (width 0) (type default))
+    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
+  )
+  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
+    (stroke (width 0) (type default))
+    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
+  )
+  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
+    (stroke (width 0) (type default))
+    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
+  )
+  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
+  )
+  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
+    (stroke (width 0) (type default))
+    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
+  )
+  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
+    (stroke (width 0) (type default))
+    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
+  )
+  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
+    (stroke (width 0) (type default))
+    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
+  )
+  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
+    (stroke (width 0) (type default))
+    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
+  )
+  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
+    (stroke (width 0) (type default))
+    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
+  )
+  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
+    (stroke (width 0) (type default))
+    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
+  )
+  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
+  )
+  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
+    (stroke (width 0) (type default))
+    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
+  )
+
+  (rectangle (start 128.27 38.1) (end 137.16 46.99)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 3e8e15a8-b6d2-4745-84db-536941a85922)
+  )
+  (circle (center 147.32 43.18) (radius 6.8392)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 7d41d819-a280-411d-be7a-c4adc58c378c)
+  )
+  (arc (start 114.3 49.53) (mid 116.7537 41.0789) (end 124.46 36.83)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid aba1e979-3b38-465e-a0c0-135206233135)
+  )
+  (rectangle (start 256.54 154.94) (end 297.18 182.88)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid cb1226ce-a04e-4b33-b357-328997e70057)
+  )
+
+  (image (at 267.97 113.665)
+    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
+    (data
+      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
+    )
+  )
+  (image (at 293.37 124.46) (scale 2.546)
+    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
+    (data
+      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
+    )
+  )
+
+  (text_box "s"
+    (at 100.33 39.37 0) (size 11.43 8.89)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid a10cb9ba-5cf6-4f20-9b2d-be925c7e3715)
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.17 225.2494 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 71.12 228.6 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 69.215 208.915 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
+  )
+  (text "test text" (at 238.76 125.73 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 71.805 234.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 69.215 215.9 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
+  )
+  (text "some mirrored stuff" (at 100.33 139.065 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
+  )
+  (text "test text" (at 217.17 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 574c189f-038f-4bc8-9345-58278240344b)
+  )
+  (text "test text" (at 165.735 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 71.805 241.1244 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.805 244.2994 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 71.17 237.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
+  )
+  (text "test text with \"quotes\"" (at 132.08 167.64 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 69.215 219.075 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
+  )
+  (text "test text" (at 261.62 172.72 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 68.58 212.09 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
+  )
+
+  (label "BUS1" (at 201.93 132.08 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
+  )
+  (label "NET1" (at 190.5 125.095 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
+  )
+
+  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 159.1793 138.5094 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
+  )
+
+  (netclass_flag "" (length 2.54) (shape round) (at 165.1 119.38 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 4c4cb004-9824-418b-b69d-0d1b89afb674)
+    (property "Netclass" "test1" (at 165.7985 116.84 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+  (netclass_flag "" (length 2.54) (shape round) (at 181.61 119.38 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid a7e7d6a1-f06f-4646-92ff-7afffc1e21b5)
+    (property "Netclass" "test2" (at 182.3085 116.84 0)
+      (effects (font (size 1.27 1.27) italic) (justify left))
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
+    (property "Reference" "SW102" (at 120.65 147.9549 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (at 120.65 150.4949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
+    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
+    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
+    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
+    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
+          (reference "SW102") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
+    (property "Reference" "SW103" (at 103.505 163.1949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
+    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
+    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
+    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
+    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
+          (reference "SW103") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
+    (property "Reference" "SW104" (at 121.285 178.4349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (at 121.285 180.9749 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
+    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
+    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
+    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
+    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
+          (reference "SW104") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
+    (property "Reference" "SW101" (at 148.59 113.03 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "SW_Coded" (at 148.59 115.57 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
+    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
+    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
+    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
+    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55"
+          (reference "SW101") (unit 1)
+        )
+      )
+    )
+  )
+
+  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
+    (fill (color 4 0 255 1.0000))
+    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
+    (property "Sheetname" "hier_test" (at 203.835 159.9434 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
+    )
+    (property "Sheetfile" "hier_test.kicad_sch" (at 203.835 170.7646 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 162.56 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
+    )
+    (pin "OUTPUT" output (at 203.835 165.1 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
+    )
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55" (page "2"))
+      )
+    )
+  )
+
+  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid))
+    (fill (color 0 0 0 0.0000))
+    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
+    (property "Sheetname" "hier_test1" (at 203.835 178.3584 0)
+      (effects (font (size 1.27 1.27)) (justify left bottom))
+    )
+    (property "Sheetfile" "hier_test.kicad_sch" (at 203.835 189.1796 0)
+      (effects (font (size 1.27 1.27)) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 180.975 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
+    )
+    (pin "OUTPUT" output (at 203.835 183.515 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
+    )
+    (instances
+      (project "allPrimitives"
+        (path "/e63e39d7-6ac0-4ffd-8aa3-1841a4541b55" (page "3"))
+      )
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
+  )
+
+  (symbol_instances
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
+      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
+      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
+      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
+      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_sheetProperties b/tests/testdata/schematic/since_v7/test_sheetProperties
new file mode 100644
index 0000000..de6945f
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_sheetProperties
@@ -0,0 +1,40 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid b6528edb-33c3-487d-9ca3-4d67bb7a5a12)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (sheet (at 31.75 34.29) (size 43.815 15.24)
+    (stroke (width 0.1524) (type solid))
+    (fill (color 0 0 0 0.0000))
+    (uuid 34ae3b7c-6af7-425f-8025-a9ad084df767)
+    (property "Sheetname" "Untitled Sheet" (at 31.75 33.5784 0)
+      (effects (font (size 1.27 1.27)) (justify left bottom))
+    )
+    (property "Sheetfile" "untitled.kicad_sch" (at 31.75 50.1146 0)
+      (effects (font (size 1.27 1.27)) (justify left top))
+    )
+    (property "test" "test1" (at 31.75 34.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "test \"123\"" "!\"§$%&/()=?`²³{[]}\\}\\_:;-.,+#*'~" (at 31.75 34.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "field" "a \"field\"" (at 31.75 34.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "p" "some properties" (at 41.91 29.21 0) (show_name)
+      (effects (font (size 1.27 1.27) bold italic))
+    )
+    (instances
+      (project "test-sheet-properties"
+        (path "/b6528edb-33c3-487d-9ca3-4d67bb7a5a12" (page "2"))
+      )
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers b/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers
new file mode 100644
index 0000000..0eacc33
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_specialLibIdWithMultipleUnderscoresAndNumbers
@@ -0,0 +1,440 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid 2c11fdc0-748a-43c8-a15c-daadb9c68def)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Device:Filter_EMI_LLL_162534" (pin_names hide) (in_bom yes) (on_board yes)
+      (property "Reference" "FL1" (at 0.1385 8.89 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Filter_EMI_LLL_162534" (at 0.1385 6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "three phase common mode choke" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "EMI 3-inductor filter" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "L* L_CommonMode*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Filter_EMI_LLL_162534_0_1"
+        (circle (center -2.54 -1.27) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (circle (center -2.54 1.27) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (circle (center -2.54 3.81) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (arc (start -1.27 -2.54) (mid -1.905 -1.9077) (end -2.54 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start -1.27 0) (mid -1.905 0.6323) (end -2.54 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start -1.27 2.54) (mid -1.905 3.1723) (end -2.54 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 -2.54) (mid -0.635 -1.9077) (end -1.27 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 0) (mid -0.635 0.6323) (end -1.27 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -3.175)
+            (xy 2.921 -3.175)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -0.635)
+            (xy 2.921 -0.635)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 1.905)
+            (xy 2.921 1.905)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -2.413)
+            (xy -2.54 -3.175)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 0.127)
+            (xy -2.54 -0.635)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.762 -1.651)
+            (xy -0.254 -2.159)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.762 0.889)
+            (xy -0.254 0.381)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.921 -0.635)
+            (xy 1.27 -1.397)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.921 1.905)
+            (xy 1.27 1.143)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 2.54) (mid -0.635 3.1723) (end -1.27 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 -2.54) (mid 0.635 -1.9077) (end 0 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 0) (mid 0.635 0.6323) (end 0 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 2.54) (mid 0.635 3.1723) (end 0 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 -2.54) (mid 1.905 -1.9077) (end 1.27 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 0) (mid 1.905 0.6323) (end 1.27 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 2.54) (mid 1.905 3.1723) (end 1.27 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "Filter_EMI_LLL_162534_1_1"
+        (pin passive line (at -5.08 2.54 0) (length 2.54)
+          (name "1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 2.54)
+          (name "2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 2.54)
+          (name "3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 -2.54 180) (length 2.54)
+          (name "4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 0 180) (length 2.54)
+          (name "5" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 2.54 180) (length 2.54)
+          (name "6" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+
+    (symbol "Filter_EMI_LLL_162534_1" (pin_names hide) (in_bom yes) (on_board yes)
+      (property "Reference" "FL2" (at 0.1385 8.89 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Filter_EMI_LLL_162534" (at 0.1385 6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "three phase common mode choke" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "EMI 3-inductor filter" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "L* L_CommonMode*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Filter_EMI_LLL_162534_1_0_1"
+        (circle (center -2.54 -1.27) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (circle (center -2.54 1.27) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (circle (center -2.54 3.81) (radius 0.254)
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (arc (start -1.27 -2.54) (mid -1.905 -1.9077) (end -2.54 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start -1.27 0) (mid -1.905 0.6323) (end -2.54 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start -1.27 2.54) (mid -1.905 3.1723) (end -2.54 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 -2.54) (mid -0.635 -1.9077) (end -1.27 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 0) (mid -0.635 0.6323) (end -1.27 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -3.175)
+            (xy 2.921 -3.175)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -0.635)
+            (xy 2.921 -0.635)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 1.905)
+            (xy 2.921 1.905)
+          )
+          (stroke (width 0.3) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -2.413)
+            (xy -2.54 -3.175)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 0.127)
+            (xy -2.54 -0.635)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.762 -1.651)
+            (xy -0.254 -2.159)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.762 0.889)
+            (xy -0.254 0.381)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.921 -0.635)
+            (xy 1.27 -1.397)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.921 1.905)
+            (xy 1.27 1.143)
+          )
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (arc (start 0 2.54) (mid -0.635 3.1723) (end -1.27 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 -2.54) (mid 0.635 -1.9077) (end 0 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 0) (mid 0.635 0.6323) (end 0 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 1.27 2.54) (mid 0.635 3.1723) (end 0 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 -2.54) (mid 1.905 -1.9077) (end 1.27 -2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 0) (mid 1.905 0.6323) (end 1.27 0)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (arc (start 2.54 2.54) (mid 1.905 3.1723) (end 1.27 2.54)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "Filter_EMI_LLL_162534_1_1_1"
+        (pin passive line (at -5.08 2.54 0) (length 2.54)
+          (name "1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 2.54)
+          (name "2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 2.54)
+          (name "3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 -2.54 180) (length 2.54)
+          (name "4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 0 180) (length 2.54)
+          (name "5" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 2.54 180) (length 2.54)
+          (name "6" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (symbol (lib_name "Filter_EMI_LLL_162534_1") (lib_id "Device:Filter_EMI_LLL_162534") (at 92.71 58.42 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 173b7621-b942-4c04-84fb-fe2ac546960b)
+    (property "Reference" "FL2" (at 92.8485 49.53 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Filter_EMI_LLL_162534" (at 92.8485 52.07 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 92.71 58.42 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 92.71 58.42 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "6" (uuid 900bcac1-ad5c-462c-a40b-81b09345b70d))
+    (pin "3" (uuid f1dc681a-dcc0-41b4-bba1-82b21b9cebe2))
+    (pin "2" (uuid 63f32756-0c93-436f-b71a-42ba5a3d5429))
+    (pin "1" (uuid 06fb94d6-8a99-4e62-b402-85814127f392))
+    (pin "4" (uuid 201852e3-1074-48fc-8b10-5dacf59c90e5))
+    (pin "5" (uuid 4e4fed00-9125-422e-b652-e539980e8a25))
+    (instances
+      (project "issue_example"
+        (path "/2c11fdc0-748a-43c8-a15c-daadb9c68def"
+          (reference "FL2") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:Filter_EMI_LLL_162534") (at 92.71 78.74 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 37b7130a-acea-4052-8e4f-f14bd0a3b674)
+    (property "Reference" "FL1" (at 92.8485 69.85 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Filter_EMI_LLL_162534" (at 92.8485 72.39 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 92.71 78.74 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 92.71 78.74 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "6" (uuid 86fc03ec-8c78-4477-8390-6c67cb702da9))
+    (pin "3" (uuid cf2ed14c-2ba2-4dbc-b896-72d0cfc5432e))
+    (pin "2" (uuid 82eb7ba2-3dde-4d1e-a814-0e5de3eb8462))
+    (pin "1" (uuid ec399bda-871a-400f-8d80-01ce0920db8f))
+    (pin "4" (uuid 1494bc46-e963-4aaf-94f2-9aa7cdebc6a6))
+    (pin "5" (uuid dfad23bc-f169-48eb-a030-0d393e6f35db))
+    (instances
+      (project "issue_example"
+        (path "/2c11fdc0-748a-43c8-a15c-daadb9c68def"
+          (reference "FL1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_strokeOptionalTokens b/tests/testdata/schematic/since_v7/test_strokeOptionalTokens
new file mode 100644
index 0000000..e5b7c6b
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_strokeOptionalTokens
@@ -0,0 +1,25 @@
+(kicad_sch (version 20200506) (generator kiutils)
+  (paper "A3")
+
+  (title_block
+    (title "test")
+  )
+
+  (lib_symbols
+    (symbol "some_symbol"
+      (symbol "child0"
+        (rectangle (start 5.08 2.54) (end 50.8 -132.08)
+          (stroke (width 0.3048))
+          (fill (type background))
+        )
+      )
+    )
+  )
+
+  (wire (pts (xy 66.04 158.75) (xy 66.04 153.67))
+    (stroke (width 0) (type solid) (color 0 0 0 0))
+  )
+  (wire (pts (xy 66.04 158.75) (xy 66.04 153.67))
+    (stroke (width 0))
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens b/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens
new file mode 100644
index 0000000..d6ba2ec
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_symbolPinOptionalTokens
@@ -0,0 +1,114 @@
+(kicad_sch (version 20200506) (generator kiutils)
+  (paper "A3")
+
+  (title_block
+    (title "Self-Balancing Car Controller")
+    (date "2020-04-06")
+    (rev "2.0")
+    (company "Simon Lu")
+  )
+
+  (lib_symbols
+    (symbol "Both name and number effects missing"
+      (symbol "child0"
+        (pin bidirectional line (at 1.27 11.43 270) (length 2.54) (name "X-G") (number "1"))
+        (pin bidirectional line (at 11.43 -5.08 180) (length 2.54) (name "Y-G") (number "1"))
+      )
+    )
+
+    (symbol "Only number effects present"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1")
+          (number "1" (effects (font (size 0.762 0.762))))
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2")
+          (number "2" (effects (font (size 0.762 0.762))))
+        )
+      )
+    )
+
+    (symbol "Only name effects present"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1" (effects (font (size 0.762 0.762))))
+          (number "1")
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2" (effects (font (size 0.762 0.762))))
+          (number "2")
+        )
+      )
+    )
+
+    (symbol "Both name and number effects present"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1")
+          (number "1" (effects (font (size 0.762 0.762))))
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2")
+          (number "2" (effects (font (size 0.762 0.762))))
+        )
+      )
+    )
+
+    (symbol "Both name and number effects missing as well as alternative pins"
+      (symbol "child0"
+        (pin bidirectional line (at 1.27 11.43 270) (length 2.54) (name "X-G") (number "1")
+          (alternate "Alternate1" open_emitter line)
+        )
+        (pin bidirectional line (at 11.43 -5.08 180) (length 2.54) (name "Y-G") (number "1")
+          (alternate "Alternate1" open_emitter line)
+        )
+      )
+    )
+
+    (symbol "Only number effects present as well as alternative pins"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1")
+          (number "1" (effects (font (size 0.762 0.762))))
+          (alternate "Alternate1" open_emitter line)
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2")
+          (number "2" (effects (font (size 0.762 0.762))))
+          (alternate "Alternate1" open_emitter line)
+        )
+      )
+    )
+
+    (symbol "Only name effects present as well as alternative pins"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1" (effects (font (size 0.762 0.762))))
+          (number "1")
+          (alternate "Alternate1" open_emitter line)
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2" (effects (font (size 0.762 0.762))))
+          (number "2")
+          (alternate "Alternate1" open_emitter line)
+        )
+      )
+    )
+
+    (symbol "Both name and number effects present as well as alternative pins"
+      (symbol "child0"
+        (pin passive line (at -2.54 0 0) (length 1.27)
+          (name "1")
+          (number "1" (effects (font (size 0.762 0.762))))
+          (alternate "Alternate1" open_emitter line)
+        )
+        (pin passive line (at 0 -2.54 90) (length 0.635)
+          (name "2")
+          (number "2" (effects (font (size 0.762 0.762))))
+          (alternate "Alternate1" open_emitter line)
+        )
+      )
+    )
+  )
+)
diff --git a/tests/testdata/schematic/since_v7/test_textBoxAllVariants b/tests/testdata/schematic/since_v7/test_textBoxAllVariants
new file mode 100644
index 0000000..e21efee
--- /dev/null
+++ b/tests/testdata/schematic/since_v7/test_textBoxAllVariants
@@ -0,0 +1,327 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid d0829a30-06bc-4626-976d-ea8fabf3d638)
+
+  (paper "A4")
+  (lib_symbols)
+
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 38.1 0) (size 13.97 6.35)
+    (stroke (width 0) (type dash))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 0e8409e1-6bff-4eb6-ac6a-7cd112dc6abc)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 118.11 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type dash_dot_dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 0ee907e0-a025-4420-8ad4-56be91f3522e)
+  )
+  (text_box "^{over}text_{under}~{neg}"
+    (at 86.36 29.21 0) (size 15.24 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (face "Arial") (size 1.27 1.27)) (justify left top))
+    (uuid 1a85edf6-51ff-410b-b9a7-929d2519bf08)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 55.88 0) (size 13.97 6.35)
+    (stroke (width 0) (type dash_dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 33291841-b782-425f-8c0e-182fc434c868)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 171.45 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right bottom))
+    (uuid 354ad53d-f503-408f-ae65-c3bed2613c14)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 100.33 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 35f2e71d-5c6a-4182-b178-b6f61bcc7b75)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 73.66 0) (size 13.97 6.35)
+    (stroke (width 2) (type default))
+    (fill (type color) (color 255 105 172 1))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 3d91613a-86ff-4556-a3e6-c00a81cc0d2d)
+  )
+  (text_box "Some file"
+    (at 69.85 20.32 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top) (href "#1"))
+    (uuid 4271f45f-18b3-4758-98f5-b6aca2791ba1)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 100.33 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 4d5ed058-008e-4d05-91d9-23c76602962e)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 91.44 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right bottom))
+    (uuid 58bfff9d-3c76-4abd-879d-22fe1fe7b100)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 73.66 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 5b3dcf5f-2326-49c4-b8fe-421980459d50)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 29.21 0) (size 13.97 6.35)
+    (stroke (width 0) (type solid))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 655b02c0-3e2d-466c-b9b6-ce50481c7cb4)
+  )
+  (text_box "github.com"
+    (at 69.85 29.21 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top) (href "http://github.com"))
+    (uuid 69787d36-da65-4eb5-9b51-9ce33ae6c496)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 55.88 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type color) (color 255 147 111 1))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 69ed9e62-51b4-4b9b-88ac-97b44dc93c30)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 91.44 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type dash))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 6ec77603-a8b2-4cc4-bf6e-9b5a37d58fdd)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 127 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 74b07c7a-629f-4ea6-89b4-967fd1640153)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 118.11 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right top))
+    (uuid 755fa6d1-4a29-453c-be48-c2094a422604)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 46.99 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 76282932-cde2-4674-a6d5-0989a82c66bd)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 82.55 0) (size 13.97 6.35)
+    (stroke (width 2) (type default) (color 131 56 255 1))
+    (fill (type color) (color 255 102 191 1))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 768f3206-7c31-40d2-a9ae-58df8cbd2ace)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 29.21 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27) (color 119 255 140 1)) (justify left top))
+    (uuid 7bd38f99-27a1-4862-9a9a-7625dc37c5c4)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 20.32 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 880d8269-927b-4191-b840-6eae342d756b)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 38.1 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right top))
+    (uuid 903c514a-e89c-4e8b-ae8c-e8a16f21e300)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 20.32 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 92154ef1-7c38-48f4-80fe-4203c638e8e2)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 55.88 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)))
+    (uuid 999819f1-4fbe-4fa9-9d97-128d0593a4ef)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 153.67 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 99e23c30-b8e4-42d9-b91a-1e9e0bb99f5f)
+  )
+  (text_box "^{over}text_{under}~{neg}"
+    (at 86.36 20.32 0) (size 19.05 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 9e6a0375-707e-4c8b-9c1c-c8dd224c21a6)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 20.32 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid 9f5373ca-2843-4410-903d-ec32a2f1acba)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 109.22 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify top))
+    (uuid a1213e58-bbf7-49ef-87be-e0997e1fc770)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 135.89 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)))
+    (uuid a75d10b5-dee5-4f38-bd2a-0515517cb105)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 82.55 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify bottom))
+    (uuid b151105c-4a84-4b88-b727-f00103d618cb)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 162.56 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify bottom))
+    (uuid bb4ca54c-517d-4dec-84f2-775302dc469c)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 46.99 0) (size 13.97 6.35)
+    (stroke (width 0) (type dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid bbc1a432-ea64-46c5-be45-d29cb3b7b3d1)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 64.77 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type color) (color 255 102 198 1))
+    (effects (font (size 1.27 1.27) (color 119 255 140 1)) (justify left top))
+    (uuid bc788b03-cc06-40f5-bae4-abadba5fc61f)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 82.55 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type solid))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid bd0f6b30-45d0-457c-9f39-eee9af304e61)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 38.1 0) (size 13.97 6.35)
+    (stroke (width 2) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid bd245717-a3ab-4c1a-8eae-4a80a2e59a62)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 64.77 0) (size 13.97 6.35)
+    (stroke (width 0) (type dash_dot_dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid c0690a84-08e0-4beb-9b46-e287c06e3523)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 64.77 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c086bd04-a465-45b8-a636-a494d9ae22b3)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 73.66 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d954ca3a-1ea4-46b9-bbdb-a71e60746326)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 29.21 0) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify top))
+    (uuid e1cc4c11-f718-4378-9a0c-e1fa3f2b59d0)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 19.05 109.22 0) (size 13.97 6.35)
+    (stroke (width -0.0001) (type dash_dot))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid e4db0f62-5446-419e-807a-4c38e4d077fc)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 36.83 144.78 90) (size 13.97 6.35)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid eb475ae2-cd89-4417-8dc1-2a025e45bfb4)
+  )
+  (text_box "Test \"test\" \\\\test\\\\"
+    (at 53.34 46.99 0) (size 13.97 6.35)
+    (stroke (width 2) (type default) (color 131 56 255 1))
+    (fill (type none))
+    (effects (font (size 1.27 1.27)) (justify left top))
+    (uuid f0912024-d068-4f99-b14f-8be690c2f8ce)
+  )
+
+  (text "Hyperlinks" (at 69.85 19.05 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 0fd0de2c-5e2f-444f-bf95-eea3714c134e)
+  )
+  (text "Misc" (at 86.36 19.05 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 1f3432ca-65b2-4665-a4ca-f4e50f4a32a6)
+  )
+  (text "Style" (at 20.32 19.05 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 2801bf9e-313c-48ce-9b17-9c0cf8ce3fcf)
+  )
+  (text "Text style" (at 53.34 19.05 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 3f507998-5b20-44ce-86fc-7b7e8636533c)
+  )
+  (text "Alignment" (at 38.1 19.05 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 736f09e5-8e11-4495-a56f-e77e7a6b258d)
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/test.kicad_sch.expected b/tests/testdata/schematic/test.kicad_sch.expected
new file mode 100644
index 0000000..a279a8b
--- /dev/null
+++ b/tests/testdata/schematic/test.kicad_sch.expected
@@ -0,0 +1,887 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "Comment 1")
+    (comment 2 "Comment 2")
+    (comment 3 "Comment 3")
+    (comment 4 "Comment 4")
+    (comment 5 "Comment 5")
+    (comment 6 "Comment 6")
+    (comment 7 "Comment 7")
+    (comment 8 "Comment 8")
+    (comment 9 "Comment 9")
+  )
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
+    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
+  )
+  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
+    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
+  )
+
+  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
+  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
+
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
+  )
+
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
+  )
+  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
+  )
+  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
+  )
+  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
+  )
+  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
+  )
+  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
+  )
+  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
+  )
+  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
+  )
+  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
+  )
+  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
+  )
+  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
+  )
+  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
+  )
+  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
+  )
+  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
+  )
+  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
+  )
+  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
+  )
+  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
+  )
+  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
+  )
+  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
+  )
+  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
+  )
+  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
+  )
+
+  (image (at 267.97 113.665)
+    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
+    (data
+      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
+    )
+  )
+  (image (at 293.37 124.46) (scale 2.546)
+    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
+    (data
+      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
+    )
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.17 225.2494 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 71.12 228.6 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 69.215 208.915 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
+  )
+  (text "test text" (at 238.76 125.73 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 71.805 234.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 69.215 215.9 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
+  )
+  (text "some mirrored stuff" (at 100.33 139.065 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
+  )
+  (text "test text" (at 217.17 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 574c189f-038f-4bc8-9345-58278240344b)
+  )
+  (text "test text" (at 165.735 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 71.805 241.1244 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.805 244.2994 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 71.17 237.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
+  )
+  (text "test text with \"quotes\"" (at 132.08 167.64 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 69.215 219.075 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
+  )
+  (text "test text" (at 261.62 172.72 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 68.58 212.09 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
+  )
+
+  (label "BUS1" (at 201.93 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
+  )
+  (label "NET1" (at 190.5 125.095 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
+  )
+
+  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
+    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
+    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
+    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
+    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
+    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
+    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
+    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
+    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
+    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
+    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
+    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
+    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
+    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
+    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
+    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
+    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
+    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
+    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
+    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
+    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
+    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
+    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
+  )
+
+  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
+    (fill (color 4 0 255 1.0000))
+    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
+    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 162.56 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
+    )
+    (pin "OUTPUT" output (at 203.835 165.1 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
+    )
+  )
+
+  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
+    (fill (color 0 0 0 0.0000))
+    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
+    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
+      (effects (font (size 1.27 1.27)) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
+      (effects (font (size 1.27 1.27)) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 180.975 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
+    )
+    (pin "OUTPUT" output (at 203.835 183.515 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
+  )
+
+  (symbol_instances
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
+      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
+      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
+      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
+      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_addPropertyToSchematicSymbol b/tests/testdata/schematic/test_addPropertyToSchematicSymbol
new file mode 100644
index 0000000..71519e1
--- /dev/null
+++ b/tests/testdata/schematic/test_addPropertyToSchematicSymbol
@@ -0,0 +1,140 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Diode:1.5KExxCA" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "D" (id 0) (at 0 2.54 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "1.5KExxCA" (id 1) (at 0 -2.54 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 0 -5.08 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "diode TVS voltage suppressor" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "D?DO?201AE*" (id 6) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "1.5KExxCA_0_1"
+        (polyline
+          (pts
+            (xy 1.27 0)
+            (xy -1.27 0)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -1.27)
+            (xy 0 0)
+            (xy -2.54 1.27)
+            (xy -2.54 -1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.508 1.27)
+            (xy 0 1.27)
+            (xy 0 -1.27)
+            (xy -0.508 -1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.54 1.27)
+            (xy 2.54 -1.27)
+            (xy 0 0)
+            (xy 2.54 1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+      )
+      (symbol "1.5KExxCA_1_1"
+        (pin passive line (at -3.81 0 0) (length 2.54)
+          (name "A1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 3.81 0 180) (length 2.54)
+          (name "A2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+
+  (wire (pts (xy 139.065 91.44) (xy 134.62 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 62009989-8103-49af-b226-a7bac174e878)
+  )
+  (wire (pts (xy 120.65 103.505) (xy 139.065 103.505))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 62b3c9b2-7111-4fb4-8944-c22c00c06d9d)
+  )
+  (wire (pts (xy 139.065 103.505) (xy 139.065 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 6d34db10-7ee4-4cde-a4af-6e0f89095ed8)
+  )
+  (wire (pts (xy 120.65 91.44) (xy 120.65 103.505))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid e452492d-035a-4361-8fab-fa3eca341746)
+  )
+  (wire (pts (xy 127 91.44) (xy 120.65 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid ff1f874f-92dd-4417-98ba-01533012ca7a)
+  )
+
+  (label "NET" (at 126.365 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 82f2e0d6-2fda-41d6-9b1f-1d94d4f9cb34)
+  )
+
+  (symbol (lib_id "Diode:1.5KExxCA") (at 130.81 91.44 0) (unit 1)
+    (in_bom yes) (on_board yes)
+    (uuid d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c)
+    (property "Reference" "D?" (id 0) (at 130.81 85.09 0))
+    (property "Value" "1.5KExxCA" (id 1) (at 130.81 87.63 0))
+    (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 130.81 96.52 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Property1" "This is a property" (id 4) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Property2" "This is another property featuring \"quoted\" strings" (id 5) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 28f921ab-5f55-47f8-b726-02e567145cd5))
+    (pin "2" (uuid e89e5b16-554a-4d97-8f95-fc89c9b40d74))
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+
+  (symbol_instances
+    (path "/d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c"
+      (reference "D?") (unit 1) (value "1.5KExxCA") (footprint "Diode_THT:D_DO-201AE_P15.24mm_Horizontal")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected b/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected
new file mode 100644
index 0000000..90e163e
--- /dev/null
+++ b/tests/testdata/schematic/test_addPropertyToSchematicSymbol.expected
@@ -0,0 +1,140 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Diode:1.5KExxCA" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "D" (id 0) (at 0 2.54 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "1.5KExxCA" (id 1) (at 0 -2.54 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 0 -5.08 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "diode TVS voltage suppressor" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "1500W bidirectional TRANSZORB® Transient Voltage Suppressor, DO-201AE" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "D?DO?201AE*" (id 6) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "1.5KExxCA_0_1"
+        (polyline
+          (pts
+            (xy 1.27 0)
+            (xy -1.27 0)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.54 -1.27)
+            (xy 0 0)
+            (xy -2.54 1.27)
+            (xy -2.54 -1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0.508 1.27)
+            (xy 0 1.27)
+            (xy 0 -1.27)
+            (xy -0.508 -1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.54 1.27)
+            (xy 2.54 -1.27)
+            (xy 0 0)
+            (xy 2.54 1.27)
+          )
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+      )
+      (symbol "1.5KExxCA_1_1"
+        (pin passive line (at -3.81 0 0) (length 2.54)
+          (name "A1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 3.81 0 180) (length 2.54)
+          (name "A2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (wire (pts (xy 139.065 91.44) (xy 134.62 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 62009989-8103-49af-b226-a7bac174e878)
+  )
+  (wire (pts (xy 120.65 103.505) (xy 139.065 103.505))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 62b3c9b2-7111-4fb4-8944-c22c00c06d9d)
+  )
+  (wire (pts (xy 139.065 103.505) (xy 139.065 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 6d34db10-7ee4-4cde-a4af-6e0f89095ed8)
+  )
+  (wire (pts (xy 120.65 91.44) (xy 120.65 103.505))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid e452492d-035a-4361-8fab-fa3eca341746)
+  )
+  (wire (pts (xy 127 91.44) (xy 120.65 91.44))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid ff1f874f-92dd-4417-98ba-01533012ca7a)
+  )
+
+  (label "NET" (at 126.365 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 82f2e0d6-2fda-41d6-9b1f-1d94d4f9cb34)
+  )
+
+  (symbol (lib_id "Diode:1.5KExxCA") (at 130.81 91.44 0) (unit 1)
+    (in_bom yes) (on_board yes)
+    (uuid d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c)
+    (property "Reference" "D?" (id 0) (at 130.81 85.09 0))
+    (property "Value" "1.5KExxCA" (id 1) (at 130.81 87.63 0))
+    (property "Footprint" "Diode_THT:D_DO-201AE_P15.24mm_Horizontal" (id 2) (at 130.81 96.52 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.vishay.com/docs/88301/15ke.pdf" (id 3) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Property1" "This is a property" (id 4) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Property2" "This is another property featuring \"quoted\" strings" (id 5) (at 130.81 91.44 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Property3" "I was added from \"outside\" of KiCad" (id 6) (at 0.0 0.0 0))
+    (pin "1" (uuid 28f921ab-5f55-47f8-b726-02e567145cd5))
+    (pin "2" (uuid e89e5b16-554a-4d97-8f95-fc89c9b40d74))
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+
+  (symbol_instances
+    (path "/d27bd75e-eeb9-4d8b-bfdb-bddce4b94b6c"
+      (reference "D?") (unit 1) (value "1.5KExxCA") (footprint "Diode_THT:D_DO-201AE_P15.24mm_Horizontal")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_createEmptySchematic.expected b/tests/testdata/schematic/test_createEmptySchematic.expected
new file mode 100644
index 0000000..46de15d
--- /dev/null
+++ b/tests/testdata/schematic/test_createEmptySchematic.expected
@@ -0,0 +1,8 @@
+(kicad_sch (version 20211014) (generator kiutils)
+  (paper "A4")
+  (lib_symbols)
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives
new file mode 100644
index 0000000..82cf29d
--- /dev/null
+++ b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives
@@ -0,0 +1,755 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid 6e843ea7-4071-4f6c-927e-0a85e27d67ff)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 81.915 82.55) (diameter 0) (color 0 0 0 0)
+    (uuid 5bceda0d-fb78-44a3-a29a-ea07e0a5929e)
+  )
+
+  (no_connect (at 52.705 83.185) (uuid 3dfda617-5f32-441f-b084-963be5408bae))
+  (no_connect (at 52.705 80.645) (uuid 477819ad-79ff-4d5d-89c1-732b044f2082))
+
+  (bus_entry (at 91.44 82.55) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 18831711-c623-41d8-9212-3655becaa56d)
+  )
+
+  (wire (pts (xy 63.5 88.265) (xy 63.5 95.885))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0e7574b9-8d09-4ea5-a886-d2ce80444647)
+  )
+  (wire (pts (xy 66.04 111.125) (xy 66.04 85.725))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 2ed3dc6d-8e4d-4865-868d-a1da880817db)
+  )
+  (wire (pts (xy 68.58 111.125) (xy 66.04 111.125))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 31cb89f7-66e2-4cbe-926c-7b7b9c36f9c7)
+  )
+  (wire (pts (xy 97.79 114.3) (xy 127 114.3))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid 359d4095-7e08-4e54-945e-63f380a9ecd6)
+  )
+  (polyline (pts (xy 133.985 100.33) (xy 133.985 93.345))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 6db7da7f-af3b-4506-ae16-7d3c30043925)
+  )
+  (wire (pts (xy 81.915 82.55) (xy 81.915 92.075))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 77eb5e67-b395-4b8f-b355-c9978aa1a254)
+  )
+  (polyline (pts (xy 107.95 93.345) (xy 133.985 93.345))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 880e21ec-04c1-4f84-b0b1-e2a1deb77409)
+  )
+  (wire (pts (xy 81.915 82.55) (xy 91.44 82.55))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 897e013f-e31e-417f-b355-ca9b9f9dad45)
+  )
+  (wire (pts (xy 97.79 111.76) (xy 127 111.76))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid 8a43a549-7c53-4159-9079-e3706117cb9f)
+  )
+  (polyline (pts (xy 93.98 100.33) (xy 133.985 100.33))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 993d4deb-f3bd-4daf-a633-6a6f3f8cbf09)
+  )
+  (wire (pts (xy 97.79 116.84) (xy 127 116.84))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid b26f05c6-45b4-4835-b8be-d2c660fd83ad)
+  )
+  (wire (pts (xy 81.915 76.835) (xy 81.915 82.55))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bd5238e4-3d13-4f80-8c81-e607942cb6c2)
+  )
+  (wire (pts (xy 66.04 85.725) (xy 52.705 85.725))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d45e4606-e8b1-4c12-9fd9-0c03f8aa8d64)
+  )
+  (wire (pts (xy 97.79 119.38) (xy 127 119.38))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid d4f7fae7-033b-42f6-b7ba-d553a4e26289)
+  )
+  (wire (pts (xy 52.705 76.835) (xy 81.915 76.835))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d5006b7f-8c6e-4019-8600-ede16e238028)
+  )
+  (bus (pts (xy 93.98 85.09) (xy 93.98 93.98))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d72f4dfe-cd6b-4029-88de-1ebbe52a7481)
+  )
+  (wire (pts (xy 81.915 92.075) (xy 75.565 92.075))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid e2c964f0-ce92-433d-9cb2-b6bc8e78ff43)
+  )
+  (wire (pts (xy 52.705 88.265) (xy 63.5 88.265))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f8094f9e-1288-42f7-aa5f-0008dd97eebf)
+  )
+  (wire (pts (xy 63.5 95.885) (xy 59.69 95.885))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f8164270-f2b4-4d38-b6cd-1ebcbb4cc15d)
+  )
+
+  (image (at 112.395 58.42)
+    (uuid 49d344ac-ce14-464c-a802-3dfe8261b773)
+    (data
+      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
+    )
+  )
+  (image (at 24.765 127.635) (scale 2.546)
+    (uuid 7b2f6028-5234-4df8-8d41-bf003f728f58)
+    (data
+      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
+    )
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 159.385 94.615 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 150b4643-ceae-41af-ad53-ecad8e9e3b00)
+  )
+  (text "test text" (at 109.22 89.535 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 17da00c8-511b-4e36-8725-4aab64bd1eb5)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 159.435 91.2644 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 3eb9ee9f-ea5b-46ea-bb6a-e2bdf664f98c)
+  )
+  (text "test text with \"quotes\"" (at 222.935 58.8794 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 50675082-562c-4536-9f6d-9686c9013db3)
+  )
+  (text "some mirrored stuff" (at 191.185 30.3044 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 560675e5-8bcf-4b40-956e-938b62b29e5a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 162.66 132.3638 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 6914c59d-3754-4af1-9c34-a108c9a97289)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 161.975 119.8394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96305798-f70e-497f-8e67-db5f376dd81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 160.07 110.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 994ec885-6884-4cc7-adb2-8624a30a017c)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 160.07 100.1544 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b9443135-c28c-470a-b131-f04eed8cf352)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 160.07 107.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ba8d3aee-36c0-4b07-805a-43ef0e25285a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 162.025 116.4888 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bb0370f1-34b3-4b8e-9761-843455def526)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 162.66 125.3788 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bb34cb8b-8eb4-468f-8bfa-2fbe3446fa35)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 159.435 103.3294 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d8afd384-ce86-4dde-b0cb-3b4bdcf89a36)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 162.66 135.5388 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid df457be3-eca7-4c79-820a-3339d1aff598)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 162.025 128.5538 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid e17d7b76-0c3e-40c5-b0b8-2b2f1e7e7b80)
+  )
+
+  (label "BUS1" (at 93.98 89.535 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 59419ac3-6c2c-49bf-bb7f-cf754b00d367)
+  )
+  (label "NET1" (at 82.55 82.55 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d9321ffd-0666-43a7-8284-7d646d5051df)
+  )
+
+  (global_label "PORT1" (shape input) (at 59.69 95.885 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 9538ac08-5497-4cfe-969a-d84b5b1efad5)
+    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 51.2293 95.9644 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "INPUT" (shape input) (at 68.58 111.125 0)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid a27475de-e9bb-4b6d-8ca3-640675f4791e)
+  )
+  (hierarchical_label "OUTPUT" (shape output) (at 75.565 92.075 180)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c8905471-f39e-4cac-90f8-2265c893933d)
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 203.885 71.5794 0) (mirror y)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 0cd888ec-79f0-49c1-bee4-7f19c90f9704)
+    (property "Reference" "SW203" (id 0) (at 212.14 69.6743 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 212.14 72.2143 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 70.9444 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 204.52 70.9444 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid a61e07f7-4d38-42f6-9a2c-64b53a5403df))
+    (pin "2" (uuid 4b515f84-8477-4976-881d-2a3c6a2d5c42))
+    (pin "3" (uuid 0c65036a-a2a3-41ee-ae0e-0b5af6f3a0fd))
+    (pin "4" (uuid 023c54ea-f210-49cd-b4e0-e8f28a89b5a6))
+    (pin "5" (uuid 7cb3f40b-ba22-4774-bae6-daad7b2f7e90))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 203.885 39.8294 180)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 32c7dd17-7fb4-40dd-af25-9c33f4bdc487)
+    (property "Reference" "SW201" (id 0) (at 211.505 39.1943 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 211.505 41.7343 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 40.4644 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 204.52 40.4644 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 9ed5f09d-f428-462b-978c-7a9dd8637c06))
+    (pin "2" (uuid 39e21440-6d5d-43f9-994d-f84527e450a7))
+    (pin "3" (uuid bc35d20a-3a1b-48e8-a2f8-83c0dfacde63))
+    (pin "4" (uuid eda6507e-e276-4ffa-92fd-6ed8e881e32b))
+    (pin "5" (uuid 2ca5eb5b-161b-4bdd-9321-319f7ccae350))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 40.005 83.185 0)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid bdef23b1-6007-45e3-b7f6-a3982b9ea650)
+    (property "Reference" "SW204" (id 0) (at 40.64 70.485 0))
+    (property "Value" "SW_Coded" (id 1) (at 40.64 73.025 0))
+    (property "Footprint" "" (id 2) (at 39.37 82.55 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 39.37 82.55 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ba130c3b-b370-4055-b47f-c1b337773748))
+    (pin "2" (uuid 0072ba71-a7b0-4ea9-a9eb-7ed9defd9bb1))
+    (pin "3" (uuid d5ba225e-3b99-4a05-92ff-d20366c7b769))
+    (pin "4" (uuid 39383f40-80c3-422f-a3e5-c1a7d6da66ec))
+    (pin "5" (uuid 6e4cc567-d5ce-4e86-b7ac-aa9aaa1840a2))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 202.615 55.0694 0) (mirror x)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid e7ef55bd-b405-45b8-9c2e-c2b3259d390d)
+    (property "Reference" "SW202" (id 0) (at 194.36 54.4343 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 194.36 56.9743 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 201.98 55.7044 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 201.98 55.7044 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 62f6c29e-6f92-40a3-b7ed-8a33e7b489d2))
+    (pin "2" (uuid 837505cc-04f5-48c3-b210-0520292d70d0))
+    (pin "3" (uuid bb7c7038-8fd8-4519-9f07-3d6e261570db))
+    (pin "4" (uuid d87f1eb8-2b6f-4c3d-b2e5-fa1e62b7f193))
+    (pin "5" (uuid 6dc5c987-e66b-420e-8b13-a723c76a94b2))
+  )
+)
diff --git a/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected
new file mode 100644
index 0000000..82cf29d
--- /dev/null
+++ b/tests/testdata/schematic/test_hierarchicalSchematicWithAllPrimitives.expected
@@ -0,0 +1,755 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid 6e843ea7-4071-4f6c-927e-0a85e27d67ff)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 81.915 82.55) (diameter 0) (color 0 0 0 0)
+    (uuid 5bceda0d-fb78-44a3-a29a-ea07e0a5929e)
+  )
+
+  (no_connect (at 52.705 83.185) (uuid 3dfda617-5f32-441f-b084-963be5408bae))
+  (no_connect (at 52.705 80.645) (uuid 477819ad-79ff-4d5d-89c1-732b044f2082))
+
+  (bus_entry (at 91.44 82.55) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 18831711-c623-41d8-9212-3655becaa56d)
+  )
+
+  (wire (pts (xy 63.5 88.265) (xy 63.5 95.885))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0e7574b9-8d09-4ea5-a886-d2ce80444647)
+  )
+  (wire (pts (xy 66.04 111.125) (xy 66.04 85.725))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 2ed3dc6d-8e4d-4865-868d-a1da880817db)
+  )
+  (wire (pts (xy 68.58 111.125) (xy 66.04 111.125))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 31cb89f7-66e2-4cbe-926c-7b7b9c36f9c7)
+  )
+  (wire (pts (xy 97.79 114.3) (xy 127 114.3))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid 359d4095-7e08-4e54-945e-63f380a9ecd6)
+  )
+  (polyline (pts (xy 133.985 100.33) (xy 133.985 93.345))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 6db7da7f-af3b-4506-ae16-7d3c30043925)
+  )
+  (wire (pts (xy 81.915 82.55) (xy 81.915 92.075))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 77eb5e67-b395-4b8f-b355-c9978aa1a254)
+  )
+  (polyline (pts (xy 107.95 93.345) (xy 133.985 93.345))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 880e21ec-04c1-4f84-b0b1-e2a1deb77409)
+  )
+  (wire (pts (xy 81.915 82.55) (xy 91.44 82.55))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 897e013f-e31e-417f-b355-ca9b9f9dad45)
+  )
+  (wire (pts (xy 97.79 111.76) (xy 127 111.76))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid 8a43a549-7c53-4159-9079-e3706117cb9f)
+  )
+  (polyline (pts (xy 93.98 100.33) (xy 133.985 100.33))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 993d4deb-f3bd-4daf-a633-6a6f3f8cbf09)
+  )
+  (wire (pts (xy 97.79 116.84) (xy 127 116.84))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid b26f05c6-45b4-4835-b8be-d2c660fd83ad)
+  )
+  (wire (pts (xy 81.915 76.835) (xy 81.915 82.55))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bd5238e4-3d13-4f80-8c81-e607942cb6c2)
+  )
+  (wire (pts (xy 66.04 85.725) (xy 52.705 85.725))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d45e4606-e8b1-4c12-9fd9-0c03f8aa8d64)
+  )
+  (wire (pts (xy 97.79 119.38) (xy 127 119.38))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid d4f7fae7-033b-42f6-b7ba-d553a4e26289)
+  )
+  (wire (pts (xy 52.705 76.835) (xy 81.915 76.835))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d5006b7f-8c6e-4019-8600-ede16e238028)
+  )
+  (bus (pts (xy 93.98 85.09) (xy 93.98 93.98))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d72f4dfe-cd6b-4029-88de-1ebbe52a7481)
+  )
+  (wire (pts (xy 81.915 92.075) (xy 75.565 92.075))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid e2c964f0-ce92-433d-9cb2-b6bc8e78ff43)
+  )
+  (wire (pts (xy 52.705 88.265) (xy 63.5 88.265))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f8094f9e-1288-42f7-aa5f-0008dd97eebf)
+  )
+  (wire (pts (xy 63.5 95.885) (xy 59.69 95.885))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f8164270-f2b4-4d38-b6cd-1ebcbb4cc15d)
+  )
+
+  (image (at 112.395 58.42)
+    (uuid 49d344ac-ce14-464c-a802-3dfe8261b773)
+    (data
+      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
+    )
+  )
+  (image (at 24.765 127.635) (scale 2.546)
+    (uuid 7b2f6028-5234-4df8-8d41-bf003f728f58)
+    (data
+      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
+    )
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 159.385 94.615 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 150b4643-ceae-41af-ad53-ecad8e9e3b00)
+  )
+  (text "test text" (at 109.22 89.535 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 17da00c8-511b-4e36-8725-4aab64bd1eb5)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 159.435 91.2644 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 3eb9ee9f-ea5b-46ea-bb6a-e2bdf664f98c)
+  )
+  (text "test text with \"quotes\"" (at 222.935 58.8794 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 50675082-562c-4536-9f6d-9686c9013db3)
+  )
+  (text "some mirrored stuff" (at 191.185 30.3044 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 560675e5-8bcf-4b40-956e-938b62b29e5a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 162.66 132.3638 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 6914c59d-3754-4af1-9c34-a108c9a97289)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 161.975 119.8394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96305798-f70e-497f-8e67-db5f376dd81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 160.07 110.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 994ec885-6884-4cc7-adb2-8624a30a017c)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 160.07 100.1544 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b9443135-c28c-470a-b131-f04eed8cf352)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 160.07 107.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ba8d3aee-36c0-4b07-805a-43ef0e25285a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 162.025 116.4888 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bb0370f1-34b3-4b8e-9761-843455def526)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 162.66 125.3788 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bb34cb8b-8eb4-468f-8bfa-2fbe3446fa35)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 159.435 103.3294 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d8afd384-ce86-4dde-b0cb-3b4bdcf89a36)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 162.66 135.5388 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid df457be3-eca7-4c79-820a-3339d1aff598)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 162.025 128.5538 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid e17d7b76-0c3e-40c5-b0b8-2b2f1e7e7b80)
+  )
+
+  (label "BUS1" (at 93.98 89.535 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 59419ac3-6c2c-49bf-bb7f-cf754b00d367)
+  )
+  (label "NET1" (at 82.55 82.55 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid d9321ffd-0666-43a7-8284-7d646d5051df)
+  )
+
+  (global_label "PORT1" (shape input) (at 59.69 95.885 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 9538ac08-5497-4cfe-969a-d84b5b1efad5)
+    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 51.2293 95.9644 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "INPUT" (shape input) (at 68.58 111.125 0)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid a27475de-e9bb-4b6d-8ca3-640675f4791e)
+  )
+  (hierarchical_label "OUTPUT" (shape output) (at 75.565 92.075 180)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c8905471-f39e-4cac-90f8-2265c893933d)
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 203.885 71.5794 0) (mirror y)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 0cd888ec-79f0-49c1-bee4-7f19c90f9704)
+    (property "Reference" "SW203" (id 0) (at 212.14 69.6743 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 212.14 72.2143 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 70.9444 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 204.52 70.9444 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid a61e07f7-4d38-42f6-9a2c-64b53a5403df))
+    (pin "2" (uuid 4b515f84-8477-4976-881d-2a3c6a2d5c42))
+    (pin "3" (uuid 0c65036a-a2a3-41ee-ae0e-0b5af6f3a0fd))
+    (pin "4" (uuid 023c54ea-f210-49cd-b4e0-e8f28a89b5a6))
+    (pin "5" (uuid 7cb3f40b-ba22-4774-bae6-daad7b2f7e90))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 203.885 39.8294 180)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 32c7dd17-7fb4-40dd-af25-9c33f4bdc487)
+    (property "Reference" "SW201" (id 0) (at 211.505 39.1943 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 211.505 41.7343 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 204.52 40.4644 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 204.52 40.4644 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 9ed5f09d-f428-462b-978c-7a9dd8637c06))
+    (pin "2" (uuid 39e21440-6d5d-43f9-994d-f84527e450a7))
+    (pin "3" (uuid bc35d20a-3a1b-48e8-a2f8-83c0dfacde63))
+    (pin "4" (uuid eda6507e-e276-4ffa-92fd-6ed8e881e32b))
+    (pin "5" (uuid 2ca5eb5b-161b-4bdd-9321-319f7ccae350))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 40.005 83.185 0)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid bdef23b1-6007-45e3-b7f6-a3982b9ea650)
+    (property "Reference" "SW204" (id 0) (at 40.64 70.485 0))
+    (property "Value" "SW_Coded" (id 1) (at 40.64 73.025 0))
+    (property "Footprint" "" (id 2) (at 39.37 82.55 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 39.37 82.55 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ba130c3b-b370-4055-b47f-c1b337773748))
+    (pin "2" (uuid 0072ba71-a7b0-4ea9-a9eb-7ed9defd9bb1))
+    (pin "3" (uuid d5ba225e-3b99-4a05-92ff-d20366c7b769))
+    (pin "4" (uuid 39383f40-80c3-422f-a3e5-c1a7d6da66ec))
+    (pin "5" (uuid 6e4cc567-d5ce-4e86-b7ac-aa9aaa1840a2))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 202.615 55.0694 0) (mirror x)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid e7ef55bd-b405-45b8-9c2e-c2b3259d390d)
+    (property "Reference" "SW202" (id 0) (at 194.36 54.4343 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 194.36 56.9743 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 201.98 55.7044 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 201.98 55.7044 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 62f6c29e-6f92-40a3-b7ed-8a33e7b489d2))
+    (pin "2" (uuid 837505cc-04f5-48c3-b210-0520292d70d0))
+    (pin "3" (uuid bb7c7038-8fd8-4519-9f07-3d6e261570db))
+    (pin "4" (uuid d87f1eb8-2b6f-4c3d-b2e5-fa1e62b7f193))
+    (pin "5" (uuid 6dc5c987-e66b-420e-8b13-a723c76a94b2))
+  )
+)
diff --git a/tests/testdata/schematic/test_parseStrokeTokens b/tests/testdata/schematic/test_parseStrokeTokens
new file mode 100644
index 0000000..3793d3a
--- /dev/null
+++ b/tests/testdata/schematic/test_parseStrokeTokens
@@ -0,0 +1,64 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "Comment 1")
+    (comment 2 "Comment 2")
+    (comment 3 "Comment 3")
+    (comment 4 "Comment 4")
+    (comment 5 "Comment 5")
+    (comment 6 "Comment 6")
+    (comment 7 "Comment 7")
+    (comment 8 "Comment 8")
+    (comment 9 "Comment 9")
+  )
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+    )
+  )
+
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+  )
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+  )
+
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 132 50 37 0))
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+  )
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default))
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default))
+  )
+)
diff --git a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic
new file mode 100644
index 0000000..921c41a
--- /dev/null
+++ b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic
@@ -0,0 +1,41 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded"
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (symbol "SW_Coded_0_1"
+      )
+      (symbol "SW_Coded_1_1"
+      )
+    )
+    (symbol "SomeLibNickName:Unset_Lib_Id"
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (symbol "SW_Coded_New_0_1"
+      )
+      (symbol "SW_Coded_New_1_1"
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0)
+    (in_bom no) (on_board no)
+    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+  )
+
+  (symbol (lib_id "Switch:Some_Component") (at 111.76 163.83 0)
+    (in_bom no) (on_board no)
+    (property "Value" "Some_Component" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected
new file mode 100644
index 0000000..cb17373
--- /dev/null
+++ b/tests/testdata/schematic/test_renameSymbolIdTokenInSchematic.expected
@@ -0,0 +1,42 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (lib_symbols
+    (symbol "RenamedSwitch:SW_Coded_New"
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (symbol "SW_Coded_New_0_1"
+      )
+      (symbol "SW_Coded_New_1_1"
+      )
+    )
+
+    (symbol "Unset_Lib_Id"
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (symbol "Unset_Lib_Id_0_1"
+      )
+      (symbol "Unset_Lib_Id_1_1"
+      )
+    )
+  )
+
+  (symbol (lib_id "SwitchRenamed:SW_Coded_2") (at 111.76 163.83 0)
+    (in_bom no) (on_board no)
+    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+  )
+
+  (symbol (lib_id "Unset_Lib_Id") (at 111.76 163.83 0)
+    (in_bom no) (on_board no)
+    (property "Value" "Some_Component" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_schematicWithAllPrimitives b/tests/testdata/schematic/test_schematicWithAllPrimitives
new file mode 100644
index 0000000..12e1f50
--- /dev/null
+++ b/tests/testdata/schematic/test_schematicWithAllPrimitives
@@ -0,0 +1,891 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "Comment 1")
+    (comment 2 "Comment 2")
+    (comment 3 "Comment 3")
+    (comment 4 "Comment 4")
+    (comment 5 "Comment 5")
+    (comment 6 "Comment 6")
+    (comment 7 "Comment 7")
+    (comment 8 "Comment 8")
+    (comment 9 "Comment 9")
+  )
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
+    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
+  )
+  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
+    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
+  )
+
+  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
+  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
+
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
+  )
+
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
+  )
+  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
+  )
+
+  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
+  )
+  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
+  )
+
+  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
+  )
+  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
+  )
+  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
+  )
+
+  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
+  )
+  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
+  )
+  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
+  )
+  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
+  )
+  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
+  )
+  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
+  )
+  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
+  )
+  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
+  )
+  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
+  )
+  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
+  )
+  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
+  )
+
+  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
+  )
+  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
+  )
+  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
+  )
+  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
+  )
+
+  (image (at 267.97 113.665)
+    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
+    (data
+      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
+    )
+  )
+  (image (at 293.37 124.46) (scale 2.546)
+    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
+    (data
+      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
+    )
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.17 225.2494 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 71.12 228.6 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 69.215 208.915 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
+  )
+  (text "test text" (at 238.76 125.73 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 71.805 234.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 69.215 215.9 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
+  )
+  (text "some mirrored stuff" (at 100.33 139.065 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
+  )
+  (text "test text" (at 217.17 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 574c189f-038f-4bc8-9345-58278240344b)
+  )
+  (text "test text" (at 165.735 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 71.805 241.1244 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.805 244.2994 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 71.17 237.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
+  )
+  (text "test text with \"quotes\"" (at 132.08 167.64 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 69.215 219.075 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
+  )
+  (text "test text" (at 261.62 172.72 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 68.58 212.09 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
+  )
+
+  (label "BUS1" (at 201.93 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
+  )
+  (label "NET1" (at 190.5 125.095 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
+  )
+
+  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
+    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
+    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
+    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
+    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
+    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
+    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
+    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
+    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
+    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
+    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
+    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
+    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
+    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
+    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
+    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
+    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
+    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
+    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
+    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
+    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
+    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
+    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
+  )
+
+  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
+    (fill (color 4 0 255 1.0000))
+    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
+    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 162.56 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
+    )
+    (pin "OUTPUT" output (at 203.835 165.1 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
+    )
+  )
+
+  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
+    (fill (color 0 0 0 0.0000))
+    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
+    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
+      (effects (font (size 1.27 1.27)) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
+      (effects (font (size 1.27 1.27)) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 180.975 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
+    )
+    (pin "OUTPUT" output (at 203.835 183.515 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
+  )
+
+  (symbol_instances
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
+      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
+      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
+      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
+      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_schematicWithAllPrimitives.expected b/tests/testdata/schematic/test_schematicWithAllPrimitives.expected
new file mode 100644
index 0000000..a279a8b
--- /dev/null
+++ b/tests/testdata/schematic/test_schematicWithAllPrimitives.expected
@@ -0,0 +1,887 @@
+(kicad_sch (version 20211123) (generator eeschema)
+
+  (uuid e63e39d7-6ac0-4ffd-8aa3-1841a4541b55)
+
+  (paper "User" 431.8 279.4)
+
+  (title_block
+    (title "The title")
+    (date "19.02.2022")
+    (rev "A")
+    (company "The company")
+    (comment 1 "Comment 1")
+    (comment 2 "Comment 2")
+    (comment 3 "Comment 3")
+    (comment 4 "Comment 4")
+    (comment 5 "Comment 5")
+    (comment 6 "Comment 6")
+    (comment 7 "Comment 7")
+    (comment 8 "Comment 8")
+    (comment 9 "Comment 9")
+  )
+
+  (lib_symbols
+    (symbol "Switch:SW_Coded" (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (id 0) (at -6.35 8.89 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Coded" (id 1) (at -6.35 -7.62 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (id 2) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (id 3) (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "rotary hex" (id 4) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Rotary switch, 4-bit encoding" (id 5) (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Coded_0_1"
+        (circle (center -0.635 0.635) (radius 3.81)
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -0.889 -1.905)
+            (xy -0.889 2.667)
+            (xy -1.397 2.159)
+            (xy -1.905 2.159)
+            (xy -0.635 3.429)
+            (xy 0.635 2.159)
+            (xy 0.127 2.159)
+            (xy -0.381 2.667)
+            (xy -0.381 -1.905)
+            (xy -0.889 -1.905)
+            (xy -0.889 -1.905)
+          )
+          (stroke (width 0) (type default) (color 0 0 0 0))
+          (fill (type none))
+        )
+        (rectangle (start 7.62 7.62) (end -6.35 -6.35)
+          (stroke (width 0.254) (type default) (color 0 0 0 0))
+          (fill (type background))
+        )
+      )
+      (symbol "SW_Coded_1_1"
+        (pin passive line (at 12.7 6.35 180) (length 5.08)
+          (name "CM" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 2.54 180) (length 5.08)
+          (name "D0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 5.08)
+          (name "D1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 5.08)
+          (name "D2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 5.08)
+          (name "D3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 189.865 125.095) (diameter 0) (color 0 0 0 0)
+    (uuid 66ba2ffc-e4d0-421e-a9e6-d05e859adf2c)
+  )
+  (junction (at 189.865 134.62) (diameter 0) (color 0 0 0 0)
+    (uuid 9a2ad128-294b-4982-ae0a-ee0ecb418820)
+  )
+
+  (no_connect (at 160.655 123.19) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae5))
+  (no_connect (at 160.655 125.73) (uuid 684a8d97-44b4-4090-9326-90c0b2cd5ae6))
+
+  (bus_entry (at 199.39 125.095) (size 2.54 2.54)
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid fec217ae-5eb1-4bec-83ed-e026a1ffe3bd)
+  )
+
+  (wire (pts (xy 189.865 162.56) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0612ca5c-0b91-4c2c-ac42-e845e89d6b72)
+  )
+  (wire (pts (xy 176.53 153.67) (xy 173.99 153.67))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 0eb177c9-4d11-4f81-803d-2f603a00217f)
+  )
+  (polyline (pts (xy 201.93 142.875) (xy 241.935 142.875))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 2a7d0547-396b-4e9b-863b-84ed8ad3b98a)
+  )
+  (wire (pts (xy 197.485 165.1) (xy 197.485 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 440558fc-36f7-46fa-bf5b-8d3a0399c376)
+  )
+  (bus (pts (xy 201.93 127.635) (xy 201.93 136.525))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 4e73b1e0-8c48-45fb-afc7-763ccd627187)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 189.865 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 54dcff01-f34c-4c58-8129-7d2109650b34)
+  )
+  (wire (pts (xy 217.805 101.6) (xy 247.015 101.6))
+    (stroke (width 3) (type dash_dot) (color 218 255 115 1))
+    (uuid 5dcd33f7-cbe3-4ec5-a538-594bb50879d3)
+  )
+  (wire (pts (xy 189.865 125.095) (xy 199.39 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7ba397ae-0d1a-4732-8972-9612adee451c)
+  )
+  (polyline (pts (xy 241.935 142.875) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7c276a66-03e7-4a19-a44f-91f5718e7937)
+  )
+  (wire (pts (xy 173.99 153.67) (xy 173.99 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 7e67d687-712f-4da1-a019-b78dc49455ab)
+  )
+  (wire (pts (xy 160.655 130.81) (xy 171.45 130.81))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid 9b7cc5d9-bd72-4263-982e-50634a65cf58)
+  )
+  (wire (pts (xy 217.805 93.98) (xy 247.015 93.98))
+    (stroke (width 0) (type solid) (color 237 53 69 1))
+    (uuid a07b64f1-9877-492e-94e3-4a1d70510e1e)
+  )
+  (wire (pts (xy 203.835 165.1) (xy 197.485 165.1))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid a65f01f9-8c86-45cd-8171-923a705fe908)
+  )
+  (wire (pts (xy 173.99 128.27) (xy 160.655 128.27))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid abac28e1-3785-44fb-b9d2-ba33b7bb7dd5)
+  )
+  (wire (pts (xy 160.655 119.38) (xy 189.865 119.38))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid b31702c5-548d-4cd7-a92d-2f3586af42f0)
+  )
+  (wire (pts (xy 217.805 96.52) (xy 247.015 96.52))
+    (stroke (width 1) (type dash) (color 119 68 255 1))
+    (uuid b7fbb749-9f17-4f5c-99f8-b204f1b3ed04)
+  )
+  (wire (pts (xy 189.865 134.62) (xy 183.515 134.62))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bb37c238-4550-43f6-9920-88f99649ab85)
+  )
+  (wire (pts (xy 203.835 162.56) (xy 189.865 162.56))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid bc91161a-f8f9-4abb-b24e-b2ee651150f3)
+  )
+  (wire (pts (xy 171.45 138.43) (xy 167.64 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid be76b0aa-ff8d-42bb-a430-fcd7f8ce8487)
+  )
+  (polyline (pts (xy 215.9 135.89) (xy 241.935 135.89))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid c28b04cd-aa36-410d-9d03-992d699deb3c)
+  )
+  (wire (pts (xy 171.45 130.81) (xy 171.45 138.43))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid d2bcf087-2c9f-4f71-aaa6-350ecd7ad092)
+  )
+  (wire (pts (xy 189.865 119.38) (xy 189.865 125.095))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid da213742-0c81-46bf-86be-49e94e409b2a)
+  )
+  (wire (pts (xy 217.805 99.06) (xy 247.015 99.06))
+    (stroke (width 2) (type dot) (color 54 255 245 1))
+    (uuid eb53a404-7d9a-4ace-96d9-3e25adce99ca)
+  )
+  (wire (pts (xy 197.485 180.975) (xy 203.835 180.975))
+    (stroke (width 0) (type default) (color 0 0 0 0))
+    (uuid f991106f-300c-4eba-bf18-6b949b87c711)
+  )
+
+  (image (at 267.97 113.665)
+    (uuid 70f197f2-ecb3-44c5-b219-d454dd0891c0)
+    (data
+      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
+    )
+  )
+  (image (at 293.37 124.46) (scale 2.546)
+    (uuid d655bb0a-cbf9-4908-ad60-7024ff468fbd)
+    (data
+      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
+    )
+  )
+
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.17 225.2494 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 051c7b3c-397e-4665-9de8-f4bb13e00333)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A"
+    (at 71.12 228.6 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 08006d6d-bcb2-4e56-8ebe-2829a508bee8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 69.215 208.915 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 0d42c544-8fc4-49a1-ba36-db36a4e06893)
+  )
+  (text "test text" (at 238.76 125.73 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 15779bc9-8d4c-4a0b-aa96-13d054c8769a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AA"
+    (at 71.805 234.1394 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 25c0b8b8-579b-4bf3-865f-c96d2a41a08a)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA A" (at 68.53 203.3756 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 339bb673-aaba-4abc-ac26-50c5d8fee344)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 69.215 215.9 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 544942af-4bc8-48f9-ade9-436e47b2d059)
+  )
+  (text "some mirrored stuff" (at 100.33 139.065 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 5623a6b7-c294-44a9-906f-69fe8cabbd3d)
+  )
+  (text "test text" (at 217.17 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 574c189f-038f-4bc8-9345-58278240344b)
+  )
+  (text "test text" (at 165.735 103.505 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 77185ab9-d8d0-4284-8d6e-7c198c05a0eb)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAA"
+    (at 71.805 241.1244 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9121e190-980d-443a-bf56-8f4a18a36507)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 71.805 244.2994 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 96d3d073-afd9-43cf-8eb0-59aa3f753a08)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 71.17 237.3144 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 9e9faaac-a0b3-4b5b-bd84-8bac6663a81d)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA" (at 68.58 200.025 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid a43a6522-b5d0-4455-99b0-3b15fbb41548)
+  )
+  (text "test text with \"quotes\"" (at 132.08 167.64 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid b16ab6df-5dae-4cd5-a4d2-6f60284ce2e8)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA"
+    (at 69.215 219.075 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ca9da192-0188-4c54-9e10-c6c011fb93da)
+  )
+  (text "test text" (at 261.62 172.72 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid cdd142dc-90d4-488c-96a2-8843fcee67b1)
+  )
+  (text "AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAA"
+    (at 68.58 212.09 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ec032d6b-3ddd-43f7-b361-7f7ff86210f6)
+  )
+
+  (label "BUS1" (at 201.93 132.08 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid c698abea-a780-4c15-939b-1bd03b379ab9)
+  )
+  (label "NET1" (at 190.5 125.095 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid f51498f8-77d6-4282-a7ea-4e61a8d0e7fe)
+  )
+
+  (global_label "PORT1" (shape input) (at 167.64 138.43 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7d1c6c5d-a6b7-457d-b898-da4c6ff1ee3b)
+    (property "Intersheet References" "${INTERSHEET_REFS}" (id 0) (at 159.1793 138.5094 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (hierarchical_label "HIER_LABEL" (shape input) (at 176.53 153.67 0)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid b21385ac-3875-4c03-ba80-b03d7cbff95a)
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 148.59 180) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid 57b4fff3-c0ff-45b7-a521-d1ed483af2d2)
+    (property "Reference" "SW102" (id 0) (at 120.65 147.9549 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 120.65 150.4949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 149.225 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 101a6607-1ac1-499c-92ad-7ef1a65e3cfb))
+    (pin "2" (uuid 4244bbb5-ef85-4264-a4dd-5bd24fde589b))
+    (pin "3" (uuid 49ff9f5a-6505-4854-844d-95f25f0499a4))
+    (pin "4" (uuid 8f44e620-8200-441c-a780-50d5d303cb43))
+    (pin "5" (uuid 1afbc736-f8a6-4af8-9a81-e1b188c36168))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 111.76 163.83 0) (mirror x) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid bcc40fb8-020a-4739-8e85-82c40b31a03a)
+    (property "Reference" "SW103" (id 0) (at 103.505 163.1949 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 103.505 165.7349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 111.125 164.465 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d025ced-6ac4-4b51-9abd-c7c1dda9f9b8))
+    (pin "2" (uuid 4b9a1e55-d75d-425c-9459-6ce1d0c58dbe))
+    (pin "3" (uuid 115c8e86-c44c-49a7-bc69-7044c5ce83c9))
+    (pin "4" (uuid fa41102b-8163-4b6e-a5da-850b9aac1839))
+    (pin "5" (uuid eee7b72b-b900-4fb7-9e9e-ffec25e17b7d))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 113.03 180.34 0) (mirror y) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid c78772b8-d0a1-4672-9c0e-41aa34b84b72)
+    (property "Reference" "SW104" (id 0) (at 121.285 178.4349 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SW_Coded" (id 1) (at 121.285 180.9749 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 113.665 179.705 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d1bada52-a9e9-4a38-8119-ad83eb790d5d))
+    (pin "2" (uuid 0a13916f-d137-4daa-bd1b-f90fe53ebdda))
+    (pin "3" (uuid 4f7e05c0-2ffc-4bcf-a8f9-cf139eb9a79b))
+    (pin "4" (uuid 1f834229-509b-436e-bb36-3bd0f28f89a5))
+    (pin "5" (uuid 547a84d7-9a8d-4566-81a3-593b6f366520))
+  )
+
+  (symbol (lib_id "Switch:SW_Coded") (at 147.955 125.73 0) (unit 1)
+    (in_bom yes) (on_board yes) (fields_autoplaced)
+    (uuid deee5d66-03d0-49d4-8b0a-7e83ff3bfec6)
+    (property "Reference" "SW101" (id 0) (at 148.59 113.03 0))
+    (property "Value" "SW_Coded" (id 1) (at 148.59 115.57 0))
+    (property "Footprint" "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical" (id 2) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (id 3) (at 147.32 125.095 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6d1860a3-107e-4663-8919-17e3714526b4))
+    (pin "2" (uuid e4cfcdc3-a72b-4bc9-9839-3b7ced13c35a))
+    (pin "3" (uuid c0698711-7639-4ecc-9f00-9384a0a9eac0))
+    (pin "4" (uuid ba75fa67-d482-4fa0-bc97-ea94568324e4))
+    (pin "5" (uuid 38ca63f7-9e89-479b-92e4-69f642c0bbff))
+  )
+
+  (sheet (at 203.835 160.655) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 255 0 20 1))
+    (fill (color 4 0 255 1.0000))
+    (uuid 1c6c5933-26d7-4512-a29b-9c52f031d214)
+    (property "Sheet name" "hier_test" (id 0) (at 203.835 159.9434 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 170.7646 0)
+      (effects (font (size 1.27 1.27) bold italic) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 162.56 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 4da049b5-0fa5-44fa-b878-51d971df9bc4)
+    )
+    (pin "OUTPUT" output (at 203.835 165.1 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 8dca85fd-bf19-493d-bf79-c3cb71e51e95)
+    )
+  )
+
+  (sheet (at 203.835 179.07) (size 39.37 9.525) (fields_autoplaced)
+    (stroke (width 0.1524) (type solid) (color 0 0 0 0))
+    (fill (color 0 0 0 0.0000))
+    (uuid 8255b9dc-345e-458f-90d5-cae15b0fc867)
+    (property "Sheet name" "hier_test1" (id 0) (at 203.835 178.3584 0)
+      (effects (font (size 1.27 1.27)) (justify left bottom))
+    )
+    (property "Sheet file" "hier_test.kicad_sch" (id 1) (at 203.835 189.1796 0)
+      (effects (font (size 1.27 1.27)) (justify left top))
+    )
+    (pin "INPUT" input (at 203.835 180.975 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid 815dea72-faf0-4368-a69a-b02c82f82624)
+    )
+    (pin "OUTPUT" output (at 203.835 183.515 180)
+      (effects (font (size 1.27 1.27)) (justify left))
+      (uuid b57e9c2e-2314-4f55-a5c8-81efeebad9f1)
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214" (page "2"))
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867" (page "3"))
+  )
+
+  (symbol_instances
+    (path "/deee5d66-03d0-49d4-8b0a-7e83ff3bfec6"
+      (reference "SW101") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/57b4fff3-c0ff-45b7-a521-d1ed483af2d2"
+      (reference "SW102") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/bcc40fb8-020a-4739-8e85-82c40b31a03a"
+      (reference "SW103") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/c78772b8-d0a1-4672-9c0e-41aa34b84b72"
+      (reference "SW104") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW201") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW202") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW203") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/1c6c5933-26d7-4512-a29b-9c52f031d214/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW204") (unit 1) (value "SW_Coded") (footprint "")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/32c7dd17-7fb4-40dd-af25-9c33f4bdc487"
+      (reference "SW301") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/e7ef55bd-b405-45b8-9c2e-c2b3259d390d"
+      (reference "SW302") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/0cd888ec-79f0-49c1-bee4-7f19c90f9704"
+      (reference "SW303") (unit 1) (value "SW_Coded") (footprint "Connector_Phoenix_MC:PhoenixContact_MCV_1,5_4-G-3.5_1x04_P3.50mm_Vertical")
+    )
+    (path "/8255b9dc-345e-458f-90d5-cae15b0fc867/bdef23b1-6007-45e3-b7f6-a3982b9ea650"
+      (reference "SW304") (unit 1) (value "SW_Coded") (footprint "")
+    )
+  )
+)
diff --git a/tests/testdata/schematic/test_setSymbolLibNameToken b/tests/testdata/schematic/test_setSymbolLibNameToken
new file mode 100644
index 0000000..9a20963
--- /dev/null
+++ b/tests/testdata/schematic/test_setSymbolLibNameToken
@@ -0,0 +1,36 @@
+(kicad_sch (version 20211014) (generator kiutils)
+  (paper "A4")
+  (lib_symbols)
+
+  (symbol (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
+    (in_bom no) (on_board yes) (fields_autoplaced)
+    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
+    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
+    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
+    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
+  )
+
+  (symbol (lib_name "AVR-JTAG-10_1") (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
+    (in_bom no) (on_board yes) (fields_autoplaced)
+    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
+    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
+    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
+    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
+  )
+  
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/schematic/test_setSymbolLibNameToken.expected b/tests/testdata/schematic/test_setSymbolLibNameToken.expected
new file mode 100644
index 0000000..fa7495e
--- /dev/null
+++ b/tests/testdata/schematic/test_setSymbolLibNameToken.expected
@@ -0,0 +1,36 @@
+(kicad_sch (version 20211014) (generator kiutils)
+  (paper "A4")
+  (lib_symbols)
+
+  (symbol (lib_name "AVR-JTAG-10_1") (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
+    (in_bom no) (on_board yes) (fields_autoplaced)
+    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
+    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
+    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
+    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
+  )
+
+  (symbol (lib_id "symbols:AVR-JTAG-10") (at 92.71 127 0) (unit 1)
+    (in_bom no) (on_board yes) (fields_autoplaced)
+    (uuid 5527a2f2-4e47-44ad-aee4-e8fe938891bd)
+    (property "Reference" "X?" (id 0) (at 92.71 113.03 0))
+    (property "Value" "AVR-JTAG-10" (id 1) (at 92.71 116.84 0))
+    (property "Footprint" "footprints:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (id 2) (at 92.71 140.335 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (id 3) (at 92.075 137.795 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "9" (uuid 8ee4bd36-d492-4ac0-be3e-4aebbd54e661))
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/tests/testdata/symbol/since_v7/test_arcAllVariants b/tests/testdata/symbol/since_v7/test_arcAllVariants
new file mode 100644
index 0000000..ac742f3
--- /dev/null
+++ b/tests/testdata/symbol/since_v7/test_arcAllVariants
@@ -0,0 +1,162 @@
+(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
+  (symbol "arc" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "arc_0_1"
+      (arc (start 1.27 -22.86) (mid 3.9641 -21.7441) (end 5.08 -19.05)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type none))
+      )
+      (arc (start 1.27 -19.05) (mid 3.9641 -17.9341) (end 5.08 -15.24)
+        (stroke (width 0) (type dash_dot))
+        (fill (type none))
+      )
+      (arc (start 1.27 -15.24) (mid 3.9641 -14.1241) (end 5.08 -11.43)
+        (stroke (width 0) (type dot))
+        (fill (type none))
+      )
+      (arc (start 1.27 -11.43) (mid 3.9641 -10.3141) (end 5.08 -7.62)
+        (stroke (width 0) (type dash))
+        (fill (type none))
+      )
+      (arc (start 1.27 -7.62) (mid 3.9641 -6.5041) (end 5.08 -3.81)
+        (stroke (width 0) (type solid))
+        (fill (type none))
+      )
+      (arc (start 1.27 -3.81) (mid 3.9641 -2.6941) (end 5.08 0)
+        (stroke (width 0) (type default))
+        (fill (type none))
+      )
+      (arc (start 6.35 -22.86) (mid 9.0441 -21.7441) (end 10.16 -19.05)
+        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
+        (fill (type none))
+      )
+      (arc (start 6.35 -19.05) (mid 9.0441 -17.9341) (end 10.16 -15.24)
+        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
+        (fill (type none))
+      )
+      (arc (start 6.35 -15.24) (mid 9.0441 -14.1241) (end 10.16 -11.43)
+        (stroke (width 1) (type dot) (color 172 32 255 1))
+        (fill (type none))
+      )
+      (arc (start 6.35 -11.43) (mid 9.0441 -10.3141) (end 10.16 -7.62)
+        (stroke (width 1) (type dash) (color 255 44 112 1))
+        (fill (type none))
+      )
+      (arc (start 6.35 -7.62) (mid 9.0441 -6.5041) (end 10.16 -3.81)
+        (stroke (width 1) (type solid) (color 255 128 19 1))
+        (fill (type none))
+      )
+      (arc (start 6.35 -3.81) (mid 9.0441 -2.6941) (end 10.16 0)
+        (stroke (width 1) (type default) (color 255 197 66 1))
+        (fill (type none))
+      )
+      (arc (start 11.43 -22.86) (mid 14.1241 -21.7441) (end 15.24 -19.05)
+        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
+        (fill (type outline))
+      )
+      (arc (start 11.43 -19.05) (mid 14.1241 -17.9341) (end 15.24 -15.24)
+        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
+        (fill (type outline))
+      )
+      (arc (start 11.43 -15.24) (mid 14.1241 -14.1241) (end 15.24 -11.43)
+        (stroke (width 1) (type dot) (color 172 32 255 1))
+        (fill (type outline))
+      )
+      (arc (start 11.43 -11.43) (mid 14.1241 -10.3141) (end 15.24 -7.62)
+        (stroke (width 1) (type dash) (color 255 44 112 1))
+        (fill (type outline))
+      )
+      (arc (start 11.43 -7.62) (mid 14.1241 -6.5041) (end 15.24 -3.81)
+        (stroke (width 1) (type solid) (color 255 128 19 1))
+        (fill (type outline))
+      )
+      (arc (start 11.43 -3.81) (mid 14.1241 -2.6941) (end 15.24 0)
+        (stroke (width 1) (type default) (color 255 197 66 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -22.86) (mid 19.2041 -21.7441) (end 20.32 -19.05)
+        (stroke (width -0.0001) (type dash_dot_dot) (color 45 64 255 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -19.05) (mid 19.2041 -17.9341) (end 20.32 -15.24)
+        (stroke (width -0.0001) (type dash_dot) (color 255 175 34 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -15.24) (mid 19.2041 -14.1241) (end 20.32 -11.43)
+        (stroke (width -0.0001) (type dot) (color 172 32 255 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -11.43) (mid 19.2041 -10.3141) (end 20.32 -7.62)
+        (stroke (width -0.0001) (type dash) (color 255 44 112 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -7.62) (mid 19.2041 -6.5041) (end 20.32 -3.81)
+        (stroke (width -0.0001) (type solid) (color 255 128 19 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -22.86) (mid 24.2841 -21.7441) (end 25.4 -19.05)
+        (stroke (width -0.0001) (type dash_dot_dot) (color 45 64 255 1))
+        (fill (type outline))
+      )
+      (arc (start 16.51 -3.81) (mid 19.2041 -2.6941) (end 20.32 0)
+        (stroke (width -0.0001) (type default) (color 255 197 66 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -19.05) (mid 24.2841 -17.9341) (end 25.4 -15.24)
+        (stroke (width -0.0001) (type dash_dot) (color 255 175 34 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -15.24) (mid 24.2841 -14.1241) (end 25.4 -11.43)
+        (stroke (width -0.0001) (type dot) (color 172 32 255 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -11.43) (mid 24.2841 -10.3141) (end 25.4 -7.62)
+        (stroke (width -0.0001) (type dash) (color 255 44 112 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -7.62) (mid 24.2841 -6.5041) (end 25.4 -3.81)
+        (stroke (width -0.0001) (type solid) (color 255 128 19 1))
+        (fill (type outline))
+      )
+      (arc private (start 21.59 -3.81) (mid 24.2841 -2.6941) (end 25.4 0)
+        (stroke (width -0.0001) (type default) (color 255 197 66 1))
+        (fill (type outline))
+      )
+      (arc (start 26.67 -22.86) (mid 29.3641 -21.7441) (end 30.48 -19.05)
+        (stroke (width 1) (type dash_dot_dot) (color 45 64 255 1))
+        (fill (type background))
+      )
+      (arc (start 26.67 -19.05) (mid 29.3641 -17.9341) (end 30.48 -15.24)
+        (stroke (width 1) (type dash_dot) (color 255 175 34 1))
+        (fill (type background))
+      )
+      (arc (start 26.67 -15.24) (mid 29.3641 -14.1241) (end 30.48 -11.43)
+        (stroke (width 1) (type dot) (color 172 32 255 1))
+        (fill (type background))
+      )
+      (arc (start 26.67 -11.43) (mid 29.3641 -10.3141) (end 30.48 -7.62)
+        (stroke (width 1) (type dash) (color 255 44 112 1))
+        (fill (type background))
+      )
+      (arc (start 26.67 -7.62) (mid 29.3641 -6.5041) (end 30.48 -3.81)
+        (stroke (width 1) (type solid) (color 255 128 19 1))
+        (fill (type background))
+      )
+      (arc (start 26.67 -3.81) (mid 29.3641 -2.6941) (end 30.48 0)
+        (stroke (width 1) (type default) (color 255 197 66 1))
+        (fill (type background))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/since_v7/test_circleAllVariants b/tests/testdata/symbol/since_v7/test_circleAllVariants
new file mode 100644
index 0000000..e26cc49
--- /dev/null
+++ b/tests/testdata/symbol/since_v7/test_circleAllVariants
@@ -0,0 +1,138 @@
+(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
+  (symbol "circle" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "circle_0_1"
+      (circle (center 0 -21.59) (radius 1.27)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type none))
+      )
+      (circle (center 0 -17.78) (radius 1.27)
+        (stroke (width 0) (type dash_dot))
+        (fill (type none))
+      )
+      (circle (center 0 -13.97) (radius 1.27)
+        (stroke (width 0) (type dot))
+        (fill (type none))
+      )
+      (circle (center 0 -10.16) (radius 1.27)
+        (stroke (width 0) (type dash))
+        (fill (type none))
+      )
+      (circle (center 0 -6.35) (radius 1.27)
+        (stroke (width 0) (type solid))
+        (fill (type none))
+      )
+      (circle (center 0 -2.54) (radius 1.27)
+        (stroke (width 0) (type default))
+        (fill (type none))
+      )
+      (circle (center 3.81 -21.59) (radius 1.27)
+        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -21.59) (radius 1.27)
+        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
+        (fill (type none))
+      )
+      (circle (center 3.81 -17.78) (radius 1.27)
+        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -17.78) (radius 1.27)
+        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
+        (fill (type none))
+      )
+      (circle (center 3.81 -13.97) (radius 1.27)
+        (stroke (width 1) (type dot) (color 255 64 66 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -13.97) (radius 1.27)
+        (stroke (width 1) (type dot) (color 255 64 66 1))
+        (fill (type none))
+      )
+      (circle (center 3.81 -10.16) (radius 1.27)
+        (stroke (width 1) (type dash) (color 94 255 73 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -10.16) (radius 1.27)
+        (stroke (width 1) (type dash) (color 94 255 73 1))
+        (fill (type none))
+      )
+      (circle (center 3.81 -6.35) (radius 1.27)
+        (stroke (width 1) (type solid) (color 255 242 67 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -6.35) (radius 1.27)
+        (stroke (width 1) (type solid) (color 255 242 67 1))
+        (fill (type none))
+      )
+      (circle (center 3.81 -2.54) (radius 1.27)
+        (stroke (width 1) (type default) (color 189 255 31 1))
+        (fill (type none))
+      )
+      (circle private (center 15.24 -2.54) (radius 1.27)
+        (stroke (width 1) (type default) (color 189 255 31 1))
+        (fill (type none))
+      )
+      (circle (center 7.62 -21.59) (radius 1.27)
+        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
+        (fill (type outline))
+      )
+      (circle (center 7.62 -17.78) (radius 1.27)
+        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
+        (fill (type outline))
+      )
+      (circle (center 7.62 -13.97) (radius 1.27)
+        (stroke (width 1) (type dot) (color 255 64 66 1))
+        (fill (type outline))
+      )
+      (circle (center 7.62 -10.16) (radius 1.27)
+        (stroke (width 1) (type dash) (color 94 255 73 1))
+        (fill (type outline))
+      )
+      (circle (center 7.62 -6.35) (radius 1.27)
+        (stroke (width 1) (type solid) (color 255 242 67 1))
+        (fill (type outline))
+      )
+      (circle (center 7.62 -2.54) (radius 1.27)
+        (stroke (width 1) (type default) (color 189 255 31 1))
+        (fill (type outline))
+      )
+      (circle (center 11.43 -21.59) (radius 1.27)
+        (stroke (width 1) (type dash_dot_dot) (color 121 112 255 1))
+        (fill (type background))
+      )
+      (circle (center 11.43 -17.78) (radius 1.27)
+        (stroke (width 1) (type dash_dot) (color 255 174 21 1))
+        (fill (type background))
+      )
+      (circle (center 11.43 -13.97) (radius 1.27)
+        (stroke (width 1) (type dot) (color 255 64 66 1))
+        (fill (type background))
+      )
+      (circle (center 11.43 -10.16) (radius 1.27)
+        (stroke (width 1) (type dash) (color 94 255 73 1))
+        (fill (type background))
+      )
+      (circle (center 11.43 -6.35) (radius 1.27)
+        (stroke (width 1) (type solid) (color 255 242 67 1))
+        (fill (type background))
+      )
+      (circle (center 11.43 -2.54) (radius 1.27)
+        (stroke (width 1) (type default) (color 189 255 31 1))
+        (fill (type background))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/since_v7/test_rectangleAllVariants b/tests/testdata/symbol/since_v7/test_rectangleAllVariants
new file mode 100644
index 0000000..faad494
--- /dev/null
+++ b/tests/testdata/symbol/since_v7/test_rectangleAllVariants
@@ -0,0 +1,138 @@
+(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
+  (symbol "rect" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "rect_0_1"
+      (rectangle (start 0 -20.32) (end 8.89 -22.86)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type none))
+      )
+      (rectangle (start 0 -16.51) (end 8.89 -19.05)
+        (stroke (width 0) (type dash_dot))
+        (fill (type none))
+      )
+      (rectangle (start 0 -12.7) (end 8.89 -15.24)
+        (stroke (width 0) (type dot))
+        (fill (type none))
+      )
+      (rectangle (start 0 -8.89) (end 8.89 -11.43)
+        (stroke (width 0) (type dash))
+        (fill (type none))
+      )
+      (rectangle (start 0 -5.08) (end 8.89 -7.62)
+        (stroke (width 0) (type solid))
+        (fill (type none))
+      )
+      (rectangle (start 0 -1.27) (end 8.89 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -20.32) (end 19.05 -22.86)
+        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -16.51) (end 19.05 -19.05)
+        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -12.7) (end 19.05 -15.24)
+        (stroke (width 1) (type dot) (color 255 156 20 1))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -8.89) (end 19.05 -11.43)
+        (stroke (width 1) (type dash) (color 182 21 255 1))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -5.08) (end 19.05 -7.62)
+        (stroke (width 1) (type solid) (color 255 19 235 1))
+        (fill (type none))
+      )
+      (rectangle (start 10.16 -1.27) (end 19.05 -3.81)
+        (stroke (width 1) (type default) (color 255 36 19 1))
+        (fill (type none))
+      )
+      (rectangle (start 20.32 -20.32) (end 29.21 -22.86)
+        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -20.32) (end 49.53 -22.86)
+        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
+        (fill (type outline))
+      )
+      (rectangle (start 20.32 -16.51) (end 29.21 -19.05)
+        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -16.51) (end 49.53 -19.05)
+        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
+        (fill (type outline))
+      )
+      (rectangle (start 20.32 -12.7) (end 29.21 -15.24)
+        (stroke (width 1) (type dot) (color 255 156 20 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -12.7) (end 49.53 -15.24)
+        (stroke (width 1) (type dot) (color 255 156 20 1))
+        (fill (type outline))
+      )
+      (rectangle (start 20.32 -8.89) (end 29.21 -11.43)
+        (stroke (width 1) (type dash) (color 182 21 255 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -8.89) (end 49.53 -11.43)
+        (stroke (width 1) (type dash) (color 182 21 255 1))
+        (fill (type outline))
+      )
+      (rectangle (start 20.32 -5.08) (end 29.21 -7.62)
+        (stroke (width 1) (type solid) (color 255 19 235 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -5.08) (end 49.53 -7.62)
+        (stroke (width 1) (type solid) (color 255 19 235 1))
+        (fill (type outline))
+      )
+      (rectangle (start 20.32 -1.27) (end 29.21 -3.81)
+        (stroke (width 1) (type default) (color 255 36 19 1))
+        (fill (type outline))
+      )
+      (rectangle private (start 40.64 -1.27) (end 49.53 -3.81)
+        (stroke (width 1) (type default) (color 255 36 19 1))
+        (fill (type outline))
+      )
+      (rectangle (start 30.48 -20.32) (end 39.37 -22.86)
+        (stroke (width 1) (type dash_dot_dot) (color 48 253 255 1))
+        (fill (type background))
+      )
+      (rectangle (start 30.48 -16.51) (end 39.37 -19.05)
+        (stroke (width 1) (type dash_dot) (color 53 73 255 1))
+        (fill (type background))
+      )
+      (rectangle (start 30.48 -12.7) (end 39.37 -15.24)
+        (stroke (width 1) (type dot) (color 255 156 20 1))
+        (fill (type background))
+      )
+      (rectangle (start 30.48 -8.89) (end 39.37 -11.43)
+        (stroke (width 1) (type dash) (color 182 21 255 1))
+        (fill (type background))
+      )
+      (rectangle (start 30.48 -5.08) (end 39.37 -7.62)
+        (stroke (width 1) (type solid) (color 255 19 235 1))
+        (fill (type background))
+      )
+      (rectangle (start 30.48 -1.27) (end 39.37 -3.81)
+        (stroke (width 1) (type default) (color 255 36 19 1))
+        (fill (type background))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/since_v7/test_textBoxAllVariants b/tests/testdata/symbol/since_v7/test_textBoxAllVariants
new file mode 100644
index 0000000..79cbc5e
--- /dev/null
+++ b/tests/testdata/symbol/since_v7/test_textBoxAllVariants
@@ -0,0 +1,708 @@
+(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
+  (symbol "test" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "test_0_0"
+      (text "Alignment, all combinations" (at 53.34 -1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "Misc" (at 195.58 -1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "Options" (at 165.1 -1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "Style" (at 11.43 -1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text_box "^{high}test_{low}~{over}"
+        (at 191.77 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -185.42 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type color) (color 255 62 122 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -179.07 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot))
+        (fill (type color) (color 255 50 110 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -172.72 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dot))
+        (fill (type color) (color 255 61 78 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -166.37 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash))
+        (fill (type color) (color 255 69 98 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -160.02 0) (size 27.94 -3.81)
+        (stroke (width 0) (type solid))
+        (fill (type color) (color 255 38 36 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -153.67 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type color) (color 255 83 78 1))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -147.32 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 67 133 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -140.97 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 51 140 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -134.62 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 43 114 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -128.27 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 66 118 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -121.92 0) (size 27.94 -3.81)
+        (stroke (width 0) (type solid))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 47 80 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -115.57 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (color 255 54 81 1)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -110.49 0) (size 27.94 -3.81)
+        (stroke (width 2) (type dash_dot_dot) (color 255 43 221 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -104.14 0) (size 27.94 -3.81)
+        (stroke (width 2) (type dash_dot) (color 255 59 237 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -97.79 0) (size 27.94 -3.81)
+        (stroke (width 2) (type dot) (color 255 39 208 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -91.44 0) (size 27.94 -3.81)
+        (stroke (width 2) (type dash) (color 255 43 228 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -85.09 0) (size 27.94 -3.81)
+        (stroke (width 2) (type solid) (color 255 71 237 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -78.74 0) (size 27.94 -3.81)
+        (stroke (width 2) (type default) (color 241 129 255 1))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -73.66 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type dash_dot_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -67.31 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type dash_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -60.96 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -54.61 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type dash))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -48.26 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type solid))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -41.91 0) (size 27.94 -3.81)
+        (stroke (width -0.0001) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash_dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dot))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -48.26 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type dash))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type solid))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -41.91 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 191.77 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (face "Wingdings") (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -99.06 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -80.01 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -60.96 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -48.26 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -105.41 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -86.36 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -67.31 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -54.61 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -111.76 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -92.71 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 39.37 -73.66 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -41.91 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -99.06 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -80.01 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -60.96 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -48.26 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -105.41 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -86.36 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -67.31 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -54.61 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -111.76 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -92.71 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 100.33 -73.66 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) italic) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -41.91 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -99.06 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -80.01 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -60.96 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -48.26 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -105.41 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -86.36 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -67.31 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -54.61 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -111.76 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -92.71 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 69.85 -73.66 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -41.91 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -22.86 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -99.06 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -80.01 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -60.96 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -48.26 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -105.41 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -86.36 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -67.31 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -54.61 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -111.76 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right bottom))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -92.71 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 130.81 -73.66 90) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27) (thickness 0.254) bold italic) (justify right top))
+      )
+    )
+    (symbol "test_0_1"
+      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -35.56 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 8.89 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -10.16 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+    )
+    (symbol "test_1_0"
+      (text_box private "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -41.91 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -16.51 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+    )
+    (symbol "test_1_1"
+      (text_box private "private"
+        (at 161.29 -29.21 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (text_box "test \"test\" \\\\test\\\\ \\\\\\\\\\\\\\"
+        (at 161.29 -3.81 0) (size 27.94 -3.81)
+        (stroke (width 0) (type default))
+        (fill (type none))
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_allSymbolAlternatePins b/tests/testdata/symbol/test_allSymbolAlternatePins
new file mode 100644
index 0000000..f9fc7a4
--- /dev/null
+++ b/tests/testdata/symbol/test_allSymbolAlternatePins
@@ -0,0 +1,174 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "Test_Alternate" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Test_Alternate" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "Test_Alternate_1_1"
+      (pin input line (at 0 -5.08 0) (length 2.54)
+        (name "Pin1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" input line)
+        (alternate "Alternate2" input inverted)
+        (alternate "Alternate3" input clock)
+        (alternate "Alternate4" input inverted_clock)
+        (alternate "Alternate5" input input_low)
+        (alternate "Alternate6" input clock_low)
+        (alternate "Alternate7" input output_low)
+        (alternate "Alternate8" input edge_clock_high)
+        (alternate "Alternate9" input non_logic)
+      )
+      (pin open_collector line (at 0 -22.225 0) (length 2.54)
+        (name "Pin10" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" open_collector line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin open_emitter line (at 0 -24.13 0) (length 2.54)
+        (name "Pin11" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" open_emitter line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin no_connect line (at 0 -26.035 0) (length 2.54)
+        (name "Pin12" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" no_connect line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin output line (at 0 -6.985 0) (length 2.54)
+        (name "Pin2" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" output line)
+        (alternate "Alternate2" output inverted)
+        (alternate "Alternate3" output clock)
+        (alternate "Alternate4" output inverted_clock)
+        (alternate "Alternate5" output input_low)
+        (alternate "Alternate6" output clock_low)
+        (alternate "Alternate7" output output_low)
+        (alternate "Alternate8" output edge_clock_high)
+        (alternate "Alternate9" output non_logic)
+      )
+      (pin bidirectional line (at 0 -8.89 0) (length 2.54)
+        (name "Pin3" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" bidirectional line)
+        (alternate "Alternate2" bidirectional inverted)
+        (alternate "Alternate3" bidirectional clock)
+        (alternate "Alternate4" bidirectional inverted_clock)
+        (alternate "Alternate5" bidirectional input_low)
+        (alternate "Alternate6" bidirectional clock_low)
+        (alternate "Alternate7" bidirectional output_low)
+        (alternate "Alternate8" bidirectional edge_clock_high)
+        (alternate "Alternate9" bidirectional non_logic)
+      )
+      (pin tri_state line (at 0 -10.795 0) (length 2.54)
+        (name "Pin4" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" tri_state line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin passive line (at 0 -12.7 0) (length 2.54)
+        (name "Pin5\"quoted\"" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" passive line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3\"quoted\"" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin free line (at 0 -14.605 0) (length 2.54)
+        (name "Pin6" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" free line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin unspecified line (at 0 -16.51 0) (length 2.54)
+        (name "Pin7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" unspecified line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin power_in line (at 0 -18.415 0) (length 2.54)
+        (name "Pin8" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" power_in line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+      (pin power_out line (at 0 -20.32 0) (length 2.54)
+        (name "Pin9" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+        (alternate "Alternate1" power_out line)
+        (alternate "Alternate2" tri_state inverted)
+        (alternate "Alternate3" tri_state clock)
+        (alternate "Alternate4" tri_state inverted_clock)
+        (alternate "Alternate5" tri_state input_low)
+        (alternate "Alternate6" tri_state clock_low)
+        (alternate "Alternate7" tri_state output_low)
+        (alternate "Alternate8" tri_state edge_clock_high)
+        (alternate "Alternate9" tri_state non_logic)
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_allSymbolPinVariations b/tests/testdata/symbol/test_allSymbolPinVariations
new file mode 100644
index 0000000..36d380f
--- /dev/null
+++ b/tests/testdata/symbol/test_allSymbolPinVariations
@@ -0,0 +1,402 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "test" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 3.175 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "test" (id 1) (at 0 1.27 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "test_1_1"
+      (pin no_connect line (at -6.35 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at -6.35 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector line (at -6.35 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at -6.35 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -6.35 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified line (at -6.35 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free line (at -6.35 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -6.35 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at -6.35 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -6.35 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -6.35 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -6.35 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect inverted (at 33.655 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter inverted (at 33.655 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector inverted (at 33.655 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out inverted (at 33.655 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in inverted (at 33.655 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified inverted (at 33.655 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free inverted (at 33.655 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive inverted (at 33.655 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state inverted (at 33.655 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional inverted (at 33.655 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output inverted (at 33.655 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at 33.655 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect inverted (at 74.295 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter inverted (at 74.295 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector inverted (at 74.295 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out inverted (at 74.295 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in inverted (at 74.295 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified inverted (at 74.295 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free inverted (at 74.295 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive inverted (at 74.295 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state inverted (at 74.295 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional inverted (at 74.295 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output inverted (at 74.295 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 74.295 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect clock (at 116.84 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter clock (at 116.84 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector clock (at 116.84 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out clock (at 116.84 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in clock (at 116.84 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified clock (at 116.84 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free clock (at 116.84 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive clock (at 116.84 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state clock (at 116.84 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional clock (at 116.84 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output clock (at 116.84 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 116.84 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect clock (at 158.75 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter clock (at 158.75 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector clock (at 158.75 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out clock (at 158.75 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in clock (at 158.75 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified clock (at 158.75 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free clock (at 158.75 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive clock (at 158.75 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state clock (at 158.75 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional clock (at 158.75 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output clock (at 158.75 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input input_low (at 158.75 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect input_low (at 201.295 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter input_low (at 201.295 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector input_low (at 201.295 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out input_low (at 201.295 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in input_low (at 201.295 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified input_low (at 201.295 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free input_low (at 201.295 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive input_low (at 201.295 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state input_low (at 201.295 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional input_low (at 201.295 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output input_low (at 201.295 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input output_low (at 201.295 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect output_low (at 246.38 -30.48 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter output_low (at 246.38 -27.94 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector output_low (at 246.38 -25.4 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out output_low (at 246.38 -22.86 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in output_low (at 246.38 -20.32 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified output_low (at 246.38 -17.78 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free output_low (at 246.38 -15.24 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive output_low (at 246.38 -12.7 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state output_low (at 246.38 -10.16 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional output_low (at 246.38 -7.62 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output output_low (at 246.38 -5.08 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input edge_clock_high (at 246.38 -2.54 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect edge_clock_high (at 289.56 -29.845 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter edge_clock_high (at 289.56 -27.305 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector edge_clock_high (at 289.56 -24.765 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out edge_clock_high (at 289.56 -22.225 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in edge_clock_high (at 289.56 -19.685 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin unspecified edge_clock_high (at 289.56 -17.145 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin free edge_clock_high (at 289.56 -14.605 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive edge_clock_high (at 289.56 -12.065 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state edge_clock_high (at 289.56 -9.525 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional edge_clock_high (at 289.56 -6.985 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output edge_clock_high (at 289.56 -4.445 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input non_logic (at 289.56 -1.905 180) (length 2.54)
+        (name "testpin_\"quoted\"_string" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_bigSymbolLibrary b/tests/testdata/symbol/test_bigSymbolLibrary
new file mode 100644
index 0000000..c9550d4
--- /dev/null
+++ b/tests/testdata/symbol/test_bigSymbolLibrary
@@ -0,0 +1,3252 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Reference" "U" (id 0) (at 0 9.525 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -12.7 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -14.605 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_locked" "" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD1853_0_0"
+      (text "NormalStuff" (at 0 19.05 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at 13.335 13.97 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_0"
+      (pin input line (at 10.795 24.13 0) (length 2.54)
+        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_1"
+      (text "Unit A, Normal" (at -1.27 0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_2"
+      (text "Unit A, DeMorgan" (at 0.635 -0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 17.145 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_0"
+      (pin input line (at 13.335 22.86 0) (length 2.54)
+        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_1"
+      (text "Unit B, Normal" (at 0 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -15.24 13.335 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_2"
+      (text "Unit B, DeMorgan" (at -1.905 0 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 18.415 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_0"
+      (pin input line (at 15.24 21.59 0) (length 2.54)
+        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_1"
+      (text "Unit C, Normal" (at 0 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.145 17.78 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 18.415 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "8284" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -3.81 19.05 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "8284" (id 1) (at 2.54 19.05 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-18_W7.62mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "http://www.cpu-galaxy.at/cpu/ram%20rom%20eprom/other_intel_chips/other_intel-Dateien/D8284A_Datasheet.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Clock Generator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Clock Generator and Driver for i8086/88 Microcontrollers, PDIP-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "8284_0_0"
+      (rectangle (start -7.62 -17.78) (end 7.62 17.78)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "8284_1_1"
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "CSYNC" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "RESET" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 15.24 0) (length 2.54)
+        (name "~{RES}" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "OSC" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "F/~{C}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -15.24 0) (length 2.54)
+        (name "EFI" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{ASYNC}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -15.24 180) (length 2.54)
+        (name "X2" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 -10.16 180) (length 2.54)
+        (name "X1" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 2.54)
+        (name "PCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{AEN1}" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "RDY1" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 10.16 180) (length 2.54)
+        (name "READY" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 7.62 0) (length 2.54)
+        (name "RDY2" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 2.54)
+        (name "~{AEN2}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 15.24 180) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "82C54" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "82C54" (id 1) (at 2.54 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://download.intel.com/design/archives/periphrl/docs/23124406.pdf" (id 3) (at -11.43 22.86 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CHMOS Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "82C54_0_1"
+      (rectangle (start -7.62 -22.86) (end 7.62 22.86)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "82C54_1_1"
+      (pin bidirectional line (at -10.16 0 0) (length 2.54)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 10.16 180) (length 2.54)
+        (name "OUT0" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 12.7 180) (length 2.54)
+        (name "G0" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 0 180) (length 2.54)
+        (name "G1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 2.54 180) (length 2.54)
+        (name "CLK1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 -12.7 180) (length 2.54)
+        (name "G2" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -15.24 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 -10.16 180) (length 2.54)
+        (name "CLK2" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -12.7 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -17.78 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "~{RD}" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 25.4 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 5.08 0) (length 2.54)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 10.16 0) (length 2.54)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 12.7 0) (length 2.54)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 15.24 0) (length 2.54)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 17.78 0) (length 2.54)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 15.24 180) (length 2.54)
+        (name "CLK0" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "8253" (extends "82C54")
+    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "8253" (id 1) (at 2.54 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.cpcwiki.eu/imgs/e/e3/8253.pdf" (id 3) (at -11.43 22.86 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "8254" (extends "82C54")
+    (property "Reference" "U" (id 0) (at -5.08 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "8254" (id 1) (at 2.54 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-24_W15.24mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.scs.stanford.edu/10wi-cs140/pintos/specs/8254.pdf" (id 3) (at -11.43 22.86 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Programmable Interval Timer, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W15.24mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "82C54_PLCC" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -3.81 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "82C54_PLCC" (id 1) (at 2.54 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_LCC:PLCC-28" (id 2) (at 2.54 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://download.intel.com/design/archives/periphrl/docs/23124406.pdf" (id 3) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer Counter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CHMOS Programmable Interval Timer, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*PLCC?28*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "82C54_PLCC_0_1"
+      (rectangle (start -7.62 -22.86) (end 7.62 22.86)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "82C54_PLCC_1_1"
+      (pin no_connect line (at -5.08 -22.86 90) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 15.24 180) (length 2.54)
+        (name "CLK0" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at -2.54 -22.86 90) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 10.16 180) (length 2.54)
+        (name "OUT0" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 12.7 180) (length 2.54)
+        (name "G0" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 2.54 -22.86 90) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 0 180) (length 2.54)
+        (name "G1" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 2.54 180) (length 2.54)
+        (name "CLK1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 10.16 -12.7 180) (length 2.54)
+        (name "G2" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 0 0) (length 2.54)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -15.24 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 10.16 -10.16 180) (length 2.54)
+        (name "CLK2" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -12.7 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -17.78 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 5.08 -22.86 90) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "~{RD}" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 25.4 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 5.08 0) (length 2.54)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 10.16 0) (length 2.54)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 12.7 0) (length 2.54)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 15.24 0) (length 2.54)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 17.78 0) (length 2.54)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9513" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "AD9513" (id 1) (at 11.43 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9513.pdf" (id 3) (at 0 15.24 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock distribution LVDS CMOS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "800 MHz, 3 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9513_0_1"
+      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD9513_1_1"
+      (pin power_in line (at -10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "S7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 2.54)
+        (name "S6" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 2.54)
+        (name "S5" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "S4" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "S3" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 15.24 0) (length 2.54)
+        (name "S2" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 17.78 0) (length 2.54)
+        (name "S1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -12.7 180) (length 2.54)
+        (name "OUT2B" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -10.16 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -5.08 180) (length 2.54)
+        (name "OUT1B" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -2.54 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 20.32 0) (length 2.54)
+        (name "S0" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 2.54 180) (length 2.54)
+        (name "OUT0B" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 5.08 180) (length 2.54)
+        (name "OUT0" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -12.7 0) (length 2.54)
+        (name "CLKB" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -27.94 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -22.86 0) (length 2.54)
+        (name "RSET" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -27.94 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -17.78 0) (length 2.54)
+        (name "SYNCB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at 15.24 20.32 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 2.54)
+        (name "S10" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "S9" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "S8" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9514" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "AD9514" (id 1) (at 11.43 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9514.pdf" (id 3) (at 0 16.51 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock distribution LVPECL LVDS CMOS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1.6 GHz, 3 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9514_1_1"
+      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at -10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "S7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 2.54)
+        (name "S6" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 2.54)
+        (name "S5" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "S4" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "S3" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 15.24 0) (length 2.54)
+        (name "S2" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 17.78 0) (length 2.54)
+        (name "S1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -12.7 180) (length 2.54)
+        (name "OUT2B" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -10.16 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -5.08 180) (length 2.54)
+        (name "OUT1B" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -2.54 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 20.32 0) (length 2.54)
+        (name "S0" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 2.54 180) (length 2.54)
+        (name "OUT0B" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 5.08 180) (length 2.54)
+        (name "OUT0" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -12.7 0) (length 2.54)
+        (name "CLKB" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -27.94 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -22.86 0) (length 2.54)
+        (name "RSET" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -27.94 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -17.78 0) (length 2.54)
+        (name "SYNCB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at 15.24 20.32 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 2.54)
+        (name "S10" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "S9" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "S8" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9515" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -12.7 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "AD9515" (id 1) (at 11.43 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9515.pdf" (id 3) (at 0 15.24 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock distribution LVPECL LVDS CMOS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1.6 GHz, 2 Outputs, Clock Distribution IC, Divider, Delay Adjust, LFCSP-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9515_1_1"
+      (rectangle (start -12.7 25.4) (end 12.7 -25.4)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at -10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "S7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 2.54)
+        (name "S6" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 2.54)
+        (name "S5" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "S4" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "S3" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 15.24 0) (length 2.54)
+        (name "S2" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 17.78 0) (length 2.54)
+        (name "S1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -5.08 180) (length 2.54)
+        (name "OUT1B" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -2.54 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 2.54 180) (length 2.54)
+        (name "OUT0B" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 5.08 180) (length 2.54)
+        (name "OUT0" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 20.32 0) (length 2.54)
+        (name "S0" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 12.7 10.16 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 12.7 12.7 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -12.7 0) (length 2.54)
+        (name "CLKB" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 10.16 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -27.94 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -22.86 0) (length 2.54)
+        (name "RSET" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -27.94 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 27.94 270) (length 2.54)
+        (name "VS" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -17.78 0) (length 2.54)
+        (name "SYNCB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at 15.24 20.32 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 2.54)
+        (name "S10" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "S9" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "S8" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ICM7209" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "ICM7209" (id 1) (at 8.636 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://pdf.datasheetcatalog.com/datasheets/320/500974_DS.pdf" (id 3) (at 5.08 -5.08 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timebase generator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timebase generator, DIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "ICM7209_0_1"
+      (rectangle (start -12.7 -5.08) (end 12.7 5.08)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "ICM7209_1_1"
+      (pin output line (at 15.24 -2.54 180) (length 2.54)
+        (name "OSC_OUT" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "OSC_IN" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "DISABLE" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 7.62 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 0 180) (length 2.54)
+        (name "OUT/1" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 2.54 180) (length 2.54)
+        (name "OUT/8" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -7.62 90) (length 2.54)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LM555xMM" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LM555xMM" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LM555xMM_0_0"
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "LM555xMM_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LM555xMM_1_1"
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LMC555xMM" (extends "LM555xMM")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LMC555xMM" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS Timer, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "TLC555xPS" (extends "LM555xMM")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "TLC555xPS" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:VSSOP-8_3.0x3.0mm_P0.65mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single LinCMOS Timer, 555 compatible, VSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*VSSOP*3.0x3.0mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LM556" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LM556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm556.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual Timer, DIP-14/SOIC-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LM556_0_0"
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "LM556_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LM556_1_1"
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "LM556_2_1"
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ICM7556" (extends "LM556")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ICM7556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer 556" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual CMOS General Purpose Timer, DIP-14/SOIC-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NA556" (extends "LM556")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NA556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/se556.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14/SSOP-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NE556" (extends "LM556")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NE556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SA556" (extends "LM556")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SA556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SE556" (extends "LM556")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SE556" (id 1) (at -10.16 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne556.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dual timer" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual Precision Timers, DIP-14/SOIC-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* TSSOP*5.3x6.2mm*P0.65mm* SOIC*3.9x8.7mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LMC555xTP" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LMC555xTP" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_BGA:Texas_DSBGA-8_1.43x1.41mm_Layout3x3_P0.5mm" (id 2) (at 2.54 -12.7 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS Timer, DSBGA-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "Texas*DSBGA*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LMC555xTP_0_0"
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "A2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "A3" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "LMC555xTP_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LMC555xTP_1_1"
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "A1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "B1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "B3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "C1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "C2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "C3" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6902" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6902" (id 1) (at 5.08 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 0 11.43 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/6902f.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock generator dual triple quad signal" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Multiphase oscillator, spread spectrum frequency modulation, MSOP-10" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LTC6902_0_1"
+      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LTC6902_1_1"
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 5.08 0) (length 2.54)
+        (name "SET" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "DIV" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "PH" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 2.54)
+        (name "OUT3" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "OUT4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 2.54 0) (length 2.54)
+        (name "MOD" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6909" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -6.35 11.43 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6909" (id 1) (at 5.08 11.43 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:MSOP-16_3x4mm_P0.5mm" (id 2) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/6909fa.pdf" (id 3) (at -6.35 11.43 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock generator signal" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Multiphase oscillator, spread spectrum frequency modulation, MSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x4mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LTC6909_0_1"
+      (rectangle (start -7.62 10.16) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LTC6909_1_1"
+      (pin power_in line (at -2.54 12.7 270) (length 2.54)
+        (name "V+A" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 -5.08 180) (length 2.54)
+        (name "OUT6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 -7.62 180) (length 2.54)
+        (name "OUT7" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 -10.16 180) (length 2.54)
+        (name "OUT8" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 12.7 270) (length 2.54)
+        (name "V+D" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 -10.16 0) (length 2.54)
+        (name "MOD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "PH2" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 2.54 0) (length 2.54)
+        (name "SET" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "PH0" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "PH1" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 7.62 180) (length 2.54)
+        (name "OUT1" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 5.08 180) (length 2.54)
+        (name "OUT2" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 2.54 180) (length 2.54)
+        (name "OUT3" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 0 180) (length 2.54)
+        (name "OUT4" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 10.16 -2.54 180) (length 2.54)
+        (name "OUT5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6993xS6-1" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6993xS6-1" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Rising-edge input, non-retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LTC6993xS6-1_0_1"
+      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LTC6993xS6-1_1_1"
+      (pin input line (at -10.16 0 0) (length 3.81)
+        (name "TRIG" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -7.62 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 -2.54 0) (length 3.81)
+        (name "SET" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 3.81)
+        (name "DIV" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 7.62 270) (length 2.54)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 3.81)
+        (name "OUT" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6993xS6-2" (extends "LTC6993xS6-1")
+    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6993xS6-2" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Rising-edge input, retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LTC6993xS6-3" (extends "LTC6993xS6-1")
+    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6993xS6-3" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Falling-edge input, non-retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LTC6993xS6-4" (extends "LTC6993xS6-1")
+    (property "Reference" "U" (id 0) (at -5.08 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6993xS6-4" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/69931234fc.pdf" (id 3) (at 1.27 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Timer TimerBlox monostable pulse" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Monostable Pulse Generator (One Shot), Falling-edge input, retriggerable, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LTC6994xDCB-1" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6994xDCB-1" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DFN_QFN:DFN-6-1EP_3x2mm_P0.5mm_EP1.65x1.35mm" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "TimerBlox delay block noise discriminator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Delay Block, Programmable, Noise Discriminator, Rising or Falling Edge, DFN-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DFN*1EP*3x2mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LTC6994xDCB-1_0_1"
+      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LTC6994xDCB-1_1_1"
+      (pin power_in line (at 0 7.62 270) (length 2.54)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 3.81)
+        (name "DIV" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 -2.54 0) (length 3.81)
+        (name "SET" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 3.81)
+        (name "IN" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -7.62 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 3.81)
+        (name "OUT" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6994xDCB-2" (extends "LTC6994xDCB-1")
+    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6994xDCB-2" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DFN_QFN:DFN-6-1EP_3x2mm_P0.5mm_EP1.65x1.35mm" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "TimerBlox debouncer noise discriminator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Debouncer, Programmable, Noise Discriminator, Rising and Falling Edges, DFN-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DFN*1EP*3x2mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LTC6994xS6-1" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6994xS6-1" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "TimerBlox delay block noise discriminator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Delay Block, Programmable, Noise Discriminator, Rising or Falling Edge, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "LTC6994xS6-1_0_1"
+      (rectangle (start -6.35 5.08) (end 6.35 -5.08)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "LTC6994xS6-1_1_1"
+      (pin input line (at -10.16 0 0) (length 3.81)
+        (name "IN" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -7.62 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -10.16 -2.54 0) (length 3.81)
+        (name "SET" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 3.81)
+        (name "DIV" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 7.62 270) (length 2.54)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 3.81)
+        (name "OUT" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "LTC6994xS6-2" (extends "LTC6994xS6-1")
+    (property "Reference" "U" (id 0) (at -6.35 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LTC6994xS6-2" (id 1) (at 7.62 6.35 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:TSOT-23-6" (id 2) (at 0 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/699412fb.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "TimerBlox debouncer noise discriminator" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "TimerBlox Debouncer, Programmable, Noise Discriminator, Rising and Falling Edges, TSOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSOT*23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "MN3101" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -7.62 10.16 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "MN3101" (id 1) (at 7.62 -10.16 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.experimentalistsanonymous.com/diy/Datasheets/MN3101.pdf" (id 3) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Matsushita Panasonic BBD CMOS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Clock Generator Driver/Driver for MN3000 Series BBD (bucket brigade device), -8V to -16V, DIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "MN3101_0_1"
+      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "MN3101_1_1"
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "CP1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -5.08 180) (length 2.54)
+        (name "CP2" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "OX3" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "OX2" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "OX1" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at 10.16 0 180) (length 2.54)
+        (name "VGG_OUT" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "MN3102" (extends "MN3101")
+    (property "Reference" "U" (id 0) (at -7.62 10.16 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "MN3102" (id 1) (at 7.62 -10.16 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.experimentalistsanonymous.com/diy/Datasheets/MN3102.pdf" (id 3) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "Matsushita Panasonic BBD CMOS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Clock Generator Driver/Driver for MN3000 Series BBD (bucket brigade device), 4V to 10V, DIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NE555D" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NE555D" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "NE555D_0_0"
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "NE555D_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "NE555D_1_1"
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ICM7555xB" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ICM7555xB" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS General Purpose Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LM555xM" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LM555xM" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LMC555xM" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LMC555xM" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "MC1455B" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "MC1455B" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC1455-D.PDF" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NA555D" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NA555D" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SA555D" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SA555D" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SE555D" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SE555D" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "TLC555xD" (extends "NE555D")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "TLC555xD" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" (id 2) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single LinCMOS Timer, 555 compatible, SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NE555P" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NE555P" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible,  PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "NE555P_0_0"
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "NE555P_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "NE555P_1_1"
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "Q" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "R" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CV" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THR" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DIS" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ICM7555xP" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ICM7555xP" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.intersil.com/content/dam/Intersil/documents/icm7/icm7555-56.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS General Purpose Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LM555xN" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LM555xN" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "LMC555xN" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LMC555xN" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lmc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "CMOS Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "MC1455P" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "MC1455P" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC1455-D.PDF" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NA555P" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "NA555P" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SA555P" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SA555P" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "SE555P" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "SE555P" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ne555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Precision Timers, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "TLC555xP" (extends "NE555P")
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "TLC555xP" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-8_W7.62mm" (id 2) (at 16.51 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 21.59 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single LinCMOS Timer, 555 compatible, PDIP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "NE567" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -2.54 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "NE567" (id 1) (at -2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (id 2) (at 1.27 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm567.pdf" (id 3) (at -7.62 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "tone decoder PLL" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tone Decoder/Phase-Locked Loop, DIP-8/SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "NE567_0_1"
+      (rectangle (start -10.16 7.62) (end 12.7 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "NE567_1_1"
+      (pin output line (at 15.24 -5.08 180) (length 2.54)
+        (name "OFLT_C" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 0 180) (length 2.54)
+        (name "LP_FLT_C" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "INPUT" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "TIM_R" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "TIM_RC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 5.08 180) (length 2.54)
+        (name "OUTPUT" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "SE567" (extends "NE567")
+    (property "Reference" "U" (id 0) (at -2.54 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SE567" (id 1) (at -2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (id 2) (at 1.27 -8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm567.pdf" (id 3) (at -7.62 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "tone decoder PLL" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tone Decoder/Phase-Locked Loop, DIP-8/SOIC-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "PL611-01-xxxT" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -7.62 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "PL611-01-xxxT" (id 1) (at 1.27 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/PL611-01.pdf" (id 3) (at -6.35 8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "clock generator dual programmable" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Programmable Clock, Dual Programmable Clock Outputs, Up To 200MHz, SOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "PL611-01-xxxT_0_1"
+      (rectangle (start -10.16 7.62) (end 10.16 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "PL611-01-xxxT_1_1"
+      (pin output line (at 12.7 2.54 180) (length 2.54)
+        (name "CLK1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "XIN,FIN" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -5.08 0) (length 2.54)
+        (name "XOUT" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 12.7 0 180) (length 2.54)
+        (name "CLK2,OE,~{PDB},FSEL" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "SY58031U" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SY58031U" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58031u.pdf" (id 3) (at 17.78 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "CML 2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1:8 CML Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "SY58031U_0_1"
+      (rectangle (start 12.7 30.48) (end -12.7 -30.48)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "SY58031U_1_1"
+      (pin power_in line (at -10.16 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -27.94 180) (length 2.54)
+        (name "~{Q7}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -25.4 180) (length 2.54)
+        (name "Q7" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -20.32 180) (length 2.54)
+        (name "~{Q6}" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -17.78 180) (length 2.54)
+        (name "Q6" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -12.7 180) (length 2.54)
+        (name "~{Q5}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -10.16 180) (length 2.54)
+        (name "Q5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -5.08 180) (length 2.54)
+        (name "~{Q4}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -33.02 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 -2.54 180) (length 2.54)
+        (name "Q4" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 2.54 180) (length 2.54)
+        (name "~{Q3}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 5.08 180) (length 2.54)
+        (name "Q3" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 10.16 180) (length 2.54)
+        (name "~{Q2}" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 12.7 180) (length 2.54)
+        (name "Q2" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 17.78 180) (length 2.54)
+        (name "~{Q1}" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 20.32 180) (length 2.54)
+        (name "Q1" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "IN" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 25.4 180) (length 2.54)
+        (name "~{Q0}" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 27.94 180) (length 2.54)
+        (name "Q0" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 7.62 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -10.16 0) (length 2.54)
+        (name "VT" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -12.7 0) (length 2.54)
+        (name "VREF-AC" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "~{IN}" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "SY58032U" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SY58032U" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58032u.pdf" (id 3) (at 17.78 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1:8 LVPECL Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "SY58032U_0_1"
+      (rectangle (start 12.7 30.48) (end -12.7 -30.48)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "SY58032U_1_1"
+      (pin power_in line (at -10.16 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -27.94 180) (length 2.54)
+        (name "~{Q7}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -25.4 180) (length 2.54)
+        (name "Q7" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -20.32 180) (length 2.54)
+        (name "~{Q6}" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -17.78 180) (length 2.54)
+        (name "Q6" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -12.7 180) (length 2.54)
+        (name "~{Q5}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -10.16 180) (length 2.54)
+        (name "Q5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -5.08 180) (length 2.54)
+        (name "~{Q4}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -33.02 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 -2.54 180) (length 2.54)
+        (name "Q4" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 2.54 180) (length 2.54)
+        (name "~{Q3}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 5.08 180) (length 2.54)
+        (name "Q3" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 10.16 180) (length 2.54)
+        (name "~{Q2}" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 12.7 180) (length 2.54)
+        (name "Q2" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 17.78 180) (length 2.54)
+        (name "~{Q1}" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 20.32 180) (length 2.54)
+        (name "Q1" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "IN" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 25.4 180) (length 2.54)
+        (name "~{Q0}" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_emitter line (at 15.24 27.94 180) (length 2.54)
+        (name "Q0" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 7.62 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -10.16 0) (length 2.54)
+        (name "VT" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -15.24 -12.7 0) (length 2.54)
+        (name "VREF-AC" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "~{IN}" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 -33.02 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 33.02 270) (length 2.54)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "SY58033U" (extends "SY58032U")
+    (property "Reference" "U" (id 0) (at 12.7 -31.75 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "SY58033U" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.1x3.1mm_ThermalVias" (id 2) (at 0 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/sy58033u.pdf" (id 3) (at 17.78 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "2.5V/3.3V differential LVPECL LVDS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1:8 400mV LVPECL Fanout Buffer 75fsRMS, QFN-32" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "QFN*1EP*5x5mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "TLC555xPW" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 2.54 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "TLC555xPW" (id 1) (at 2.54 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-14_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tlc555.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "single timer 555" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single LinCMOS Timer, TSSOP-14" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "TLC555xPW_0_0"
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "TLC555xPW_0_1"
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start -8.89 -7.62) (end 8.89 7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "TLC555xPW_1_1"
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "THRES" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 0 0 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "DISCH" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 2.54 0 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at -2.54 5.08 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "TR" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 0 5.08 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 3.81)
+        (name "OUT" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 2.54 5.08 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input inverted (at -12.7 -5.08 0) (length 3.81)
+        (name "RESET" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "CONT" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at -2.54 0 270) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "TPL5010" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -8.89 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "TPL5010" (id 1) (at 6.35 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5010.pdf" (id 3) (at -5.08 -7.62 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "timer watchdog nano wake done" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, Nano Power, Watchdog, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "TPL5010_0_1"
+      (rectangle (start -12.7 7.62) (end 10.16 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "TPL5010_1_1"
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "DELAY/M_RST" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 2.54)
+        (name "DONE" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 -2.54 180) (length 2.54)
+        (name "WAKE" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin open_collector line (at 12.7 2.54 180) (length 2.54)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "TPL5110" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "TPL5110" (id 1) (at 6.35 8.89 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5110.pdf" (id 3) (at -5.08 -10.16 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "timer active-low nano wake done" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, Nano Power, Active-Low, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA, SOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "TPL5110_0_1"
+      (rectangle (start -12.7 7.62) (end 10.16 -10.16)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "TPL5110_1_1"
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -12.7 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "DELAY/M_DRV" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -2.54 180) (length 2.54)
+        (name "DONE" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 0 180) (length 2.54)
+        (name "DRV" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "EN/ONE_SHOT" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "TPL5111" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 11.43 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "TPL5111" (id 1) (at 6.35 11.43 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/tpl5111.pdf" (id 3) (at -41.91 3.81 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "timer active-high nano wake done" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Timer, Nano Power, Active-High, 35 nA, 100 ms to 7200 s, VDD 1.8V to 5.5V, Iout max 1mA, SOT-23-6" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOT?23*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "TPL5111_0_1"
+      (rectangle (start -12.7 10.16) (end 10.16 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "TPL5111_1_1"
+      (pin power_in line (at 0 12.7 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "DELAY/M_DRV" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 2.54)
+        (name "DONE" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 2.54 180) (length 2.54)
+        (name "~{DRV}" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "EN/ONE_SHOT" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary b/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary
new file mode 100644
index 0000000..dd527ba
--- /dev/null
+++ b/tests/testdata/symbol/test_createNewSymbolInEmptyLibrary
@@ -0,0 +1,16 @@
+(kicad_symbol_lib (version 20211014) (generator kiutils)
+  (symbol "testsymbol" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0.0 0.0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "testvalue" (id 1) (at 0.0 0.0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0.0 0.0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (id 3) (at 0.0 0.0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild
new file mode 100644
index 0000000..1af97f0
--- /dev/null
+++ b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild
@@ -0,0 +1,16 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD1853_0_0"
+      (text "NormalStuff" (at 0 19.05 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at 13.335 13.97 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
\ No newline at end of file
diff --git a/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected
new file mode 100644
index 0000000..12e15f2
--- /dev/null
+++ b/tests/testdata/symbol/test_createNewTopLevelSymbolFromChild.expected
@@ -0,0 +1,25 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD1853_0_0"
+      (text "NormalStuff" (at 0 19.05 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at 13.335 13.97 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "SomeNewName:AD2023"
+    (text "NormalStuff" (at 0 19.05 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (pin input line (at 13.335 13.97 0) (length 2.54)
+      (name "NormalPin" (effects (font (size 1.27 1.27))))
+      (number "123" (effects (font (size 1.27 1.27))))
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_mergeLibraries b/tests/testdata/symbol/test_mergeLibraries
new file mode 100644
index 0000000..2db88ae
--- /dev/null
+++ b/tests/testdata/symbol/test_mergeLibraries
@@ -0,0 +1,4760 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD390JD" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD390JD" (id 1) (at 8.89 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 12bit DAC, 4LSB Gain Error, DH-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD390JD_0_1"
+      (rectangle (start -13.97 -29.21) (end 13.97 29.21)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD390JD_1_1"
+      (pin input line (at -17.78 25.4 0) (length 3.81)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "D9" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "D10" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 3.81)
+        (name "D11" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -33.02 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 33.02 270) (length 3.81)
+        (name "-VS" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -25.4 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "REFOUT" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -12.7 180) (length 3.81)
+        (name "REFIN" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 20.32 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 22.86 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 33.02 270) (length 3.81)
+        (name "+VS" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "~{A1}" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{A0}" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{CS1}" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -20.32 0) (length 3.81)
+        (name "~{CS2}" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -22.86 0) (length 3.81)
+        (name "~{CS3}" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -25.4 0) (length 3.81)
+        (name "~{CS4}" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 20.32 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD390KD" (extends "AD390JD")
+    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD390KD" (id 1) (at 8.89 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 12bit DAC, 2LSB Gain Error, DH-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD558JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558JN" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD558JN_0_1"
+      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD558JN_1_1"
+      (pin input line (at -12.7 12.7 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -12.7 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "VSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "VSEN" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 3.81)
+        (name "~{CE}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD558KN" (extends "AD558JN")
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558KN" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD558JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558JP" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD558JP_0_1"
+      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD558JP_1_1"
+      (pin input line (at -12.7 -5.08 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 3.81)
+        (name "~{CE}" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -12.7 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "VSEL" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "VSEN" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 12.7 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD558KP" (extends "AD558JP")
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558KP" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5687BCPZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687BCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5687BCPZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5687BCPZ_1_1"
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 7.62 0) (length 2.54)
+        (name "SDIN" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5687RBCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687RBCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689BCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689BCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689RxCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689RxCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5687BRUZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687BRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5687BRUZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5687BRUZ_1_1"
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 7.62 0) (length 2.54)
+        (name "SDIN" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5687RBRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687RBRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689BRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689BRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689RxRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689RxRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5691RxRM" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5691RxRM" (id 1) (at 8.89 3.81 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tiny, 12-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5691RxRM_0_1"
+      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5691RxRM_1_1"
+      (pin power_in line (at 2.54 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 2.54)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 10.16 -2.54 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5693RxRM" (extends "AD5691RxRM")
+    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5693RxRM" (id 1) (at 8.89 3.81 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tiny, 16-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5697RBCPZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5697RBCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5697RBCPZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5697RBCPZ_1_1"
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5697RBRUZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5697RBRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5697RBRUZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5697RBRUZ_1_1"
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KN" (id 1) (at 6.35 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply 1ch" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KN_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LN" (extends "AD7224KN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LN" (id 1) (at 6.35 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KP" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KP_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LP" (extends "AD7224KP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LP" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KR-1" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KR-1" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KR-1_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LR-1" (extends "AD7224KR-1")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LR-1" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KR-18" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KR-18" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KR-18_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LR-18" (extends "AD7224KR-18")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LR-18" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225BRS" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225BRS" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225BRS_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225BRS_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225CRS" (extends "AD7225BRS")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225CRS" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KN_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LN" (extends "AD7225KN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KP_1_1"
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LP" (extends "AD7225KP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KR_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LR" (extends "AD7225KR")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SO-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7226BRSZ" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226BRSZ" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SSOP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226BRSZ_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226BRSZ_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, DIP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KN_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KP_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KR_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ABN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABN_1_1"
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACN" (extends "AD7228ABN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7228ABP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABP_1_1"
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACP" (extends "AD7228ABP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7228ABR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABR_1_1"
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACR" (extends "AD7228ABR")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7304" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 13.97 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7304" (id 1) (at 2.54 13.97 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 4ch 8bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, SPI Interface, SOIC-16/TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*W*7.5x10.3mm*P1.27mm* TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7304_0_1"
+      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7304_1_1"
+      (pin output line (at 12.7 7.62 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "SDI/SHDN" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -10.16 180) (length 2.54)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 2.54 180) (length 2.54)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 2.54)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 10.16 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -15.24 90) (length 2.54)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -2.54 180) (length 2.54)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -2.54 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -5.08 0) (length 2.54)
+        (name "~{CLR}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7305" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 16.51 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7305" (id 1) (at 3.81 16.51 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 4ch 8bit parallel" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, Parallel Interface, SOIC-20/TSSOP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*W*7.5x12.8mm*P1.27mm* TSSOP*4.4x6.5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7305_0_1"
+      (rectangle (start -10.16 15.24) (end 10.16 -15.24)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7305_1_1"
+      (pin output line (at 12.7 10.16 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -12.7 0) (length 2.54)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "A0/SHDN" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 17.78 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 2.54)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 12.7 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 2.54)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -17.78 90) (length 2.54)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -17.78 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 12.7 0) (length 2.54)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 2.54)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 2.54)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7390" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7390" (id 1) (at 1.27 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "SPI 12 bit DAC" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Serial-Input Micropower 12-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7390_0_0"
+      (polyline
+        (pts
+          (xy 12.7 0)
+          (xy 5.08 7.62)
+          (xy -10.16 7.62)
+          (xy -10.16 -7.62)
+          (xy 5.08 -7.62)
+          (xy 12.7 0)
+        )
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7390_1_1"
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "~{LD}" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "SDI" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "~{CLR}" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "Vss" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 0 180) (length 2.54)
+        (name "Vout" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "Vdd" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -2.54 10.16 270) (length 2.54)
+        (name "Vref" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7391" (extends "AD7390")
+    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7391" (id 1) (at 1.27 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "SPI 10 bit DAC" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Serial-Input Micropower 10-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533JN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533JN_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533JN_1_1"
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7533KN" (extends "AD7533JN")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533LN" (extends "AD7533JN")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533LN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533JP" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533JP_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533JP_1_1"
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -12.7 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7533KP" (extends "AD7533JP")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KP" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KR" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, SOIC-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533KR_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533KR_1_1"
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD775" (pin_names (offset 0.762)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD775" (id 1) (at 8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD775.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "DAC CNA" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "DA Converter 8 bits - 20MHz, PDIP/SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD775_0_1"
+      (rectangle (start -13.97 -16.51) (end 13.97 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD775_1_1"
+      (pin input line (at 17.78 -10.16 180) (length 3.81)
+        (name "~{OE}" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 -5.08 180) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 20.32 270) (length 3.81)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 17.78 -12.7 180) (length 3.81)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 20.32 270) (length 3.81)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "VRTS" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 3.81)
+        (name "VRT" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "VIN" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 -20.32 90) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -20.32 90) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "VRBS" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "VRB" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 12.7 180) (length 3.81)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 10.16 180) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 7.62 180) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 5.08 180) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 2.54 180) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 0 180) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 -2.54 180) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9106BCP" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 29.21 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9106BCP" (id 1) (at 11.43 29.21 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.6x3.6mm" (id 2) (at 0 3.81 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/ad9106.pdf" (id 3) (at 0 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "analog devices DAC DDS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Analog Devices Quad, Low Power, 12-Bit, 180 MSPS, Digital-to-Analog Converter and Waveform Generator" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*LFCSP*1EP*5x5mm*P0.5mm*EP3.6x3.6mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9106BCP_0_0"
+      (rectangle (start -15.24 27.94) (end 15.24 -27.94)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -7.62)
+          (xy 7.62 -7.62)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -5.08)
+          (xy 7.62 -5.08)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 0)
+          (xy 7.62 0)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 2.54)
+          (xy 7.62 2.54)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 7.62)
+          (xy 7.62 7.62)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 10.16)
+          (xy 7.62 10.16)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 15.24)
+          (xy 7.62 15.24)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 17.78)
+          (xy 7.62 17.78)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (text "DAC" (at 1.778 -6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 8.89 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 16.51 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD9106BCP_0_1"
+      (polyline
+        (pts
+          (xy -1.27 -3.81)
+          (xy 3.81 -3.81)
+          (xy 6.35 -6.35)
+          (xy 3.81 -8.89)
+          (xy -1.27 -8.89)
+          (xy -1.27 -3.81)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 3.81)
+          (xy 3.81 3.81)
+          (xy 6.35 1.27)
+          (xy 3.81 -1.27)
+          (xy -1.27 -1.27)
+          (xy -1.27 3.81)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 11.43)
+          (xy 3.81 11.43)
+          (xy 6.35 8.89)
+          (xy 3.81 6.35)
+          (xy -1.27 6.35)
+          (xy -1.27 11.43)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 19.05)
+          (xy 3.81 19.05)
+          (xy 6.35 16.51)
+          (xy 3.81 13.97)
+          (xy -1.27 13.97)
+          (xy -1.27 19.05)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+    )
+    (symbol "AD9106BCP_1_1"
+      (pin input line (at -17.78 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -5.08 180) (length 2.54)
+        (name "IOUTP4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -7.62 180) (length 2.54)
+        (name "IOUTN4" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 30.48 270) (length 2.54)
+        (name "AVDD2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 2.54)
+        (name "IOUTN3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 2.54)
+        (name "IOUTP3" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 -30.48 90) (length 2.54)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -17.78 180) (length 2.54)
+        (name "FSADJ3" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -20.32 180) (length 2.54)
+        (name "FSADJ4" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 -22.86 0) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -30.48 90) (length 2.54)
+        (name "CLKGND" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 7.62 0) (length 2.54)
+        (name "SDIO" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 2.54)
+        (name "CLKN" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 2.54)
+        (name "CLKP" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 -12.7 0) (length 2.54)
+        (name "CLDO" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 30.48 270) (length 2.54)
+        (name "CLKVDD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 17.78 -15.24 180) (length 2.54)
+        (name "FSADJ2/CAL_SENSE" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -12.7 180) (length 2.54)
+        (name "FSADJ1" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 5.08 -30.48 90) (length 2.54) hide
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 2.54)
+        (name "IOUTP1" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 2.54)
+        (name "IOUTN1" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 30.48 270) (length 2.54)
+        (name "AVDD1" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 -30.48 90) (length 2.54)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 2.54)
+        (name "IOUTN2" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 2.54)
+        (name "IOUTP2" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 2.54)
+        (name "~{TRIGGER}" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -5.08 -30.48 90) (length 2.54) hide
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at -17.78 -17.78 0) (length 2.54)
+        (name "DLDO2" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 30.48 270) (length 2.54)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at -17.78 -15.24 0) (length 2.54)
+        (name "DLDO1" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -17.78 5.08 0) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+        (alternate "DOUT" output line)
+        (alternate "SDI2" input line)
+      )
+      (pin input line (at -17.78 12.7 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9142" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9142" (id 1) (at -10.16 -59.69 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-72-1EP_10x10mm_P0.5mm_EP6.15x6.15mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9142.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "16bit DAC 2CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1.6GSPS 16bit dual-channel DAC, LFCSP-72" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*1EP*10x10mm*P0.5mm*EP6.15x6.15mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9142_0_0"
+      (rectangle (start -7.62 46.99) (end -5.08 -41.91)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -1.27 -45.72) (end 3.81 -48.26)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 19.05)
+          (xy -5.08 19.05)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 34.29)
+          (xy -5.08 34.29)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 1.27 -45.72)
+          (xy 1.27 16.51)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 3.81 -21.59)
+          (xy 1.27 -21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -21.59)
+          (xy 3.81 -21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 17.78)
+          (xy 7.62 17.78)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 20.32)
+          (xy 7.62 20.32)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 33.02)
+          (xy 7.62 33.02)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 35.56)
+          (xy 7.62 35.56)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 1.27 11.43)
+          (xy -2.54 11.43)
+          (xy -2.54 26.67)
+          (xy 1.27 26.67)
+          (xy 1.27 31.75)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 21.59)
+          (xy 5.08 21.59)
+          (xy 7.62 19.05)
+          (xy 5.08 16.51)
+          (xy -1.27 16.51)
+          (xy -1.27 21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 36.83)
+          (xy 5.08 36.83)
+          (xy 7.62 34.29)
+          (xy 5.08 31.75)
+          (xy -1.27 31.75)
+          (xy -1.27 36.83)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start 5.08 -11.43) (end 7.62 -31.75)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (text "CTRL" (at 6.35 -20.32 900)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "DAC" (at 2.54 19.05 0)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "DAC" (at 2.54 34.29 0)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "IFC" (at -6.35 2.54 900)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "PLL" (at 1.27 -46.99 0)
+        (effects (font (size 1.524 1.524)))
+      )
+    )
+    (symbol "AD9142_0_1"
+      (rectangle (start -15.24 58.42) (end 15.24 -58.42)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD9142_1_1"
+      (pin power_in line (at 0 60.96 270) (length 2.54)
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -30.48 0) (length 2.54)
+        (name "D15P" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -33.02 0) (length 2.54)
+        (name "D15N" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -25.4 0) (length 2.54)
+        (name "D14P" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -27.94 0) (length 2.54)
+        (name "D14N" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -20.32 0) (length 2.54)
+        (name "D13P" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -22.86 0) (length 2.54)
+        (name "D13N" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 2.54)
+        (name "D12P" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 2.54)
+        (name "D12N" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -45.72 0) (length 2.54)
+        (name "REFP/SYNCP" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 2.54)
+        (name "D11P" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 2.54)
+        (name "D11N" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 2.54)
+        (name "D10P" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 2.54)
+        (name "D10N" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 2.54)
+        (name "D9P" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 2.54)
+        (name "D9N" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 2.54)
+        (name "D8P" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 2.54)
+        (name "D8N" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -38.1 0) (length 2.54)
+        (name "DCIP" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -40.64 0) (length 2.54)
+        (name "DCIN" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -48.26 0) (length 2.54)
+        (name "REFN/SYNCN" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 2.54)
+        (name "D7P" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 2.54)
+        (name "D7N" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 2.54)
+        (name "D6P" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 2.54)
+        (name "D6N" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 20.32 0) (length 2.54)
+        (name "D5P" (effects (font (size 1.27 1.27))))
+        (number "34" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "D5N" (effects (font (size 1.27 1.27))))
+        (number "35" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "36" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "D4P" (effects (font (size 1.27 1.27))))
+        (number "37" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 22.86 0) (length 2.54)
+        (name "D4N" (effects (font (size 1.27 1.27))))
+        (number "38" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 30.48 0) (length 2.54)
+        (name "D3P" (effects (font (size 1.27 1.27))))
+        (number "39" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 27.94 0) (length 2.54)
+        (name "D3N" (effects (font (size 1.27 1.27))))
+        (number "40" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 35.56 0) (length 2.54)
+        (name "D2P" (effects (font (size 1.27 1.27))))
+        (number "41" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 33.02 0) (length 2.54)
+        (name "D2N" (effects (font (size 1.27 1.27))))
+        (number "42" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "43" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 40.64 0) (length 2.54)
+        (name "D1P" (effects (font (size 1.27 1.27))))
+        (number "44" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 38.1 0) (length 2.54)
+        (name "D1N" (effects (font (size 1.27 1.27))))
+        (number "45" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 45.72 0) (length 2.54)
+        (name "D0P" (effects (font (size 1.27 1.27))))
+        (number "46" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 43.18 0) (length 2.54)
+        (name "D0N" (effects (font (size 1.27 1.27))))
+        (number "47" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "48" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "49" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -27.94 180) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -15.24 180) (length 2.54)
+        (name "~{IRQ2}" (effects (font (size 1.27 1.27))))
+        (number "50" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -12.7 180) (length 2.54)
+        (name "~{IRQ1}" (effects (font (size 1.27 1.27))))
+        (number "51" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 17.78 -17.78 180) (length 2.54)
+        (name "SDIO" (effects (font (size 1.27 1.27))))
+        (number "52" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -20.32 180) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "53" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -22.86 180) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "54" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 60.96 270) (length 2.54)
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "55" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 20.32 180) (length 2.54)
+        (name "IOUT2P" (effects (font (size 1.27 1.27))))
+        (number "56" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 2.54)
+        (name "IOUT2N" (effects (font (size 1.27 1.27))))
+        (number "57" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "58" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "59" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -30.48 180) (length 2.54)
+        (name "TXEN" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "60" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -53.34 0) (length 2.54)
+        (name "DACCLKN" (effects (font (size 1.27 1.27))))
+        (number "61" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -50.8 0) (length 2.54)
+        (name "DACCLKP" (effects (font (size 1.27 1.27))))
+        (number "62" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "63" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "64" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "65" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 33.02 180) (length 2.54)
+        (name "IOUT1N" (effects (font (size 1.27 1.27))))
+        (number "66" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 35.56 180) (length 2.54)
+        (name "IOUT1P" (effects (font (size 1.27 1.27))))
+        (number "67" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "68" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 2.54)
+        (name "FSADJ" (effects (font (size 1.27 1.27))))
+        (number "69" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 60.96 270) (length 2.54)
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "70" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "71" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "72" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -60.96 90) (length 2.54)
+        (name "AVSS" (effects (font (size 1.27 1.27))))
+        (number "73" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 53.34 0) (length 2.54)
+        (name "FRAMEP" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 50.8 0) (length 2.54)
+        (name "FRAMEN" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9744" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 -24.13 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9744" (id 1) (at 7.62 24.13 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm" (id 2) (at 15.24 5.08 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9744.pdf" (id 3) (at 15.24 5.08 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "14bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "210MSPS 14bit DAC, TSSOP-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x9.7mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9744_0_1"
+      (rectangle (start 12.7 22.86) (end -12.7 -22.86)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD9744_1_1"
+      (pin input line (at -15.24 -15.24 0) (length 2.54)
+        (name "D13" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 2.54)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 15.24 0) (length 2.54)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 17.78 0) (length 2.54)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 2.54 180) (length 2.54)
+        (name "SLEEP" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -15.24 180) (length 2.54)
+        (name "REFLO" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -12.7 180) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -2.54 180) (length 2.54)
+        (name "FS_ADJ" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -12.7 0) (length 2.54)
+        (name "D12" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -25.4 90) (length 2.54)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 10.16 180) (length 2.54)
+        (name "IOUTB" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 12.7 180) (length 2.54)
+        (name "IOUTA" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 25.4 270) (length 2.54)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 0 180) (length 2.54)
+        (name "MODE" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 2.54)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 2.54)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -20.32 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 2.54)
+        (name "D11" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 2.54)
+        (name "D10" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 2.54)
+        (name "D9" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 2.54)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ADS7830" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 13.716 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ADS7830" (id 1) (at 1.778 13.716 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 2.54 -17.78 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ads7830.pdf" (id 3) (at 5.08 -11.43 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single-supply, 8bit, 8 ch, SAR, 70kHz SR, 2.7 - 5 VDD, I2C, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "ADS7830_0_1"
+      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "ADS7830_1_1"
+      (pin input line (at -12.7 10.16 0) (length 2.54)
+        (name "CH0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 12.7 0 180) (length 2.54)
+        (name "REFin/REFout" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 2.54)
+        (name "COM" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 7.62 180) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 12.7 10.16 180) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 2.54)
+        (name "CH1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "CH2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "CH3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "CH4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "CH5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "CH6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -7.62 0) (length 2.54)
+        (name "CH7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_mergeLibraries.expected b/tests/testdata/symbol/test_mergeLibraries.expected
new file mode 100644
index 0000000..9a633a0
--- /dev/null
+++ b/tests/testdata/symbol/test_mergeLibraries.expected
@@ -0,0 +1,5128 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Reference" "U" (id 0) (at 0 16.51 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -5.715 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -7.62 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_locked" "" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD1853_0_0"
+      (rectangle (start -44.45 -102.235) (end -18.415 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -28.575 -252.73) (mid -2.8272 -239.9607) (end 6.35 -212.725)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -16.51 -102.235) (end 9.525 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -8.255 -254.635) (mid 17.4928 -241.8657) (end 26.67 -214.63)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 83.82 -252.095)
+          (xy 89.535 -293.37)
+          (xy 116.205 -267.335)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 116.205 -249.555)
+          (xy 121.92 -290.83)
+          (xy 148.59 -264.795)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 151.765 -248.285)
+          (xy 157.48 -289.56)
+          (xy 184.15 -263.525)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -102.235) (end 38.1 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 12.7 -255.27) (mid 38.4478 -242.5007) (end 47.625 -215.265)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 69.215 -99.695) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 111.76 -100.33) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 149.225 -99.06) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (text "NormalStuff" (at 0 26.035 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -62.865 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -59.69 0)
+        (effects (font (size 1.27 1.27) bold) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -56.515 0)
+        (effects (font (size 1.27 1.27) italic) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -53.34 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -43.18 0)
+        (effects (font (size 1.27 1.27) bold italic))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -40.005 0)
+        (effects (font (size 1.27 1.27) bold))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -36.83 0)
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -33.655 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -78.105 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -74.93 0)
+        (effects (font (size 1.27 1.27) bold) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -71.755 0)
+        (effects (font (size 1.27 1.27) italic) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -68.58 0)
+        (effects (font (size 1.27 1.27)) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 262.255 -33.655 900)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 264.795 -33.655 900)
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text "test text with \"quoted\" string" (at 267.335 -34.29 900)
+        (effects (font (size 1.27 1.27) bold))
+      )
+      (text "test text with \"quoted\" string" (at 270.51 -34.925 900)
+        (effects (font (size 1.27 1.27) bold italic))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -59.055 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -55.88 0)
+        (effects (font (size 1.27 1.27) bold) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -52.705 0)
+        (effects (font (size 1.27 1.27) italic) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -49.53 0)
+        (effects (font (size 1.27 1.27)) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -41.91 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -38.735 0)
+        (effects (font (size 1.27 1.27) bold) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -35.56 0)
+        (effects (font (size 1.27 1.27) italic) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -32.385 0)
+        (effects (font (size 1.27 1.27)) (justify top))
+      )
+      (pin input line (at 13.335 20.955 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_0"
+      (pin input line (at 10.795 31.115 0) (length 2.54)
+        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_1"
+      (rectangle (start -44.45 -71.755) (end -18.415 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -44.45 -41.275) (end -18.415 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -24.13 -208.28) (mid 1.6178 -195.5107) (end 10.795 -168.275)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -23.495 -167.005) (mid 2.2528 -154.2357) (end 11.43 -127)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -16.51 -71.755) (end 9.525 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (rectangle (start -16.51 -41.275) (end 9.525 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -3.81 -210.185) (mid 21.9378 -197.4157) (end 31.115 -170.18)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -3.175 -168.91) (mid 22.5728 -156.1407) (end 31.75 -128.905)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 80.645 -208.915)
+          (xy 86.36 -250.19)
+          (xy 113.03 -224.155)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 83.82 -161.29)
+          (xy 89.535 -202.565)
+          (xy 116.205 -176.53)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 113.03 -206.375)
+          (xy 118.745 -247.65)
+          (xy 145.415 -221.615)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 116.205 -158.75)
+          (xy 121.92 -200.025)
+          (xy 148.59 -173.99)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 148.59 -205.105)
+          (xy 154.305 -246.38)
+          (xy 180.975 -220.345)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (polyline
+        (pts
+          (xy 151.765 -157.48)
+          (xy 157.48 -198.755)
+          (xy 184.15 -172.72)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -71.755) (end 38.1 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -41.275) (end 38.1 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 17.145 -210.82) (mid 42.8928 -198.0507) (end 52.07 -170.815)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 17.78 -169.545) (mid 43.5278 -156.7757) (end 52.705 -129.54)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 66.04 -28.575) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 69.85 -64.135) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 108.585 -29.21) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 112.395 -64.77) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 146.05 -27.94) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 149.86 -63.5) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (text "Unit A, Normal" (at -1.27 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 24.765 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_2"
+      (text "Unit A, DeMorgan" (at 0.635 6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 24.13 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_0"
+      (pin input line (at 13.335 29.845 0) (length 2.54)
+        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -15.24 20.32 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_2"
+      (text "Unit B, DeMorgan" (at -1.905 6.985 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_0"
+      (pin input line (at 15.24 28.575 0) (length 2.54)
+        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.145 24.765 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD390JD" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD390JD" (id 1) (at 8.89 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 12bit DAC, 4LSB Gain Error, DH-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD390JD_0_1"
+      (rectangle (start -13.97 -29.21) (end 13.97 29.21)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD390JD_1_1"
+      (pin input line (at -17.78 25.4 0) (length 3.81)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "D9" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "D10" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 3.81)
+        (name "D11" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -33.02 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 33.02 270) (length 3.81)
+        (name "-VS" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -25.4 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "REFOUT" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -12.7 180) (length 3.81)
+        (name "REFIN" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 20.32 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 22.86 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 33.02 270) (length 3.81)
+        (name "+VS" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "~{A1}" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{A0}" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{CS1}" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -20.32 0) (length 3.81)
+        (name "~{CS2}" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -22.86 0) (length 3.81)
+        (name "~{CS3}" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -25.4 0) (length 3.81)
+        (name "~{CS4}" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 20.32 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD390KD" (extends "AD390JD")
+    (property "Reference" "U" (id 0) (at -13.97 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD390KD" (id 1) (at 8.89 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD390MIL.pdf" (id 3) (at 0 2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4ch DAC 12bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 12bit DAC, 2LSB Gain Error, DH-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD558JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558JN" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD558JN_0_1"
+      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD558JN_1_1"
+      (pin input line (at -12.7 12.7 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -12.7 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "VSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "VSEN" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 3.81)
+        (name "~{CE}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD558KN" (extends "AD558JN")
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558KN" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 -1.27 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD558JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558JP" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD558JP_0_1"
+      (rectangle (start -8.89 -16.51) (end 8.89 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD558JP_1_1"
+      (pin input line (at -12.7 -5.08 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 3.81)
+        (name "~{CE}" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -12.7 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "V+" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 12.7 -12.7 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 3.81)
+        (name "VSEL" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 3.81)
+        (name "VSEN" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 12.7 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD558KP" (extends "AD558JP")
+    (property "Reference" "U" (id 0) (at -8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD558KP" (id 1) (at 2.54 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD558.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Reference Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single 8-bit DAC, Internal Reference, Output Amp, Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5687BCPZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687BCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5687BCPZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5687BCPZ_1_1"
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 7.62 0) (length 2.54)
+        (name "SDIN" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5687RBCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687RBCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689BCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689BCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689RxCPZ" (extends "AD5687BCPZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689RxCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5687BRUZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687BRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5687BRUZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5687BRUZ_1_1"
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{SYNC}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 7.62 0) (length 2.54)
+        (name "SDIN" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 -2.54 180) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5687RBRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5687RBRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689BRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689BRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689_5687.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5689RxRUZ" (extends "AD5687BRUZ")
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5689RxRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5689R_5687R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 16bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 16-Bit nanoDAC+ with 2 ppm/°C Reference, SPI Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5691RxRM" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5691RxRM" (id 1) (at 8.89 3.81 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tiny, 12-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5691RxRM_0_1"
+      (rectangle (start -7.62 7.62) (end 7.62 -7.62)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5691RxRM_1_1"
+      (pin power_in line (at 2.54 10.16 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 0 180) (length 2.54)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 0 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 10.16 -2.54 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5693RxRM" (extends "AD5691RxRM")
+    (property "Reference" "U" (id 0) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5693RxRM" (id 1) (at 8.89 3.81 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:MSOP-10_3x3mm_P0.5mm" (id 2) (at 33.02 -8.89 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5693R_5692R_5691R_5693.pdf" (id 3) (at 8.89 6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "serial DAC i2c digital analog converter" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Tiny, 16-Bit, I2C, nanoDAC+, 2 ppm/°C Reference, MSOP-10" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "MSOP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD5697RBCPZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5697RBCPZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-16-1EP_3x3mm_P0.5mm_EP1.854x1.854mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, LFCSP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*3x3mm*P0.5mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5697RBCPZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5697RBCPZ_1_1"
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 -15.24 90) (length 2.54) hide
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD5697RBRUZ" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 8.89 11.43 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD5697RBRUZ" (id 1) (at 8.89 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD5697R.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 2nch 12bit i2c" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Dual, 12-Bit nanoDAC+ with 2 ppm/°C Reference, I2C Interface, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD5697RBRUZ_0_1"
+      (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD5697RBRUZ_1_1"
+      (pin power_in line (at 5.08 15.24 270) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -7.62 0) (length 2.54)
+        (name "GAIN" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VLOGIC" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -5.08 0) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 10.16 0) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -2.54 0) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 2.54 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 -10.16 0) (length 2.54)
+        (name "RSTSEL" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -5.08 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 5.08 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin no_connect line (at 7.62 -7.62 180) (length 2.54) hide
+        (name "NC" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 10.16 2.54 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -10.16 5.08 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KN" (id 1) (at 6.35 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply 1ch" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KN_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LN" (extends "AD7224KN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LN" (id 1) (at 6.35 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, DIP-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KP" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KP_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LP" (extends "AD7224KP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LP" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KR-1" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KR-1" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KR-1_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LR-1" (extends "AD7224KR-1")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LR-1" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7224KR-18" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224KR-18" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7224KR-18_1_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (pin power_in line (at 2.54 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "~{RST}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7(MSB)" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7224LR-18" (extends "AD7224KR-18")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7224LR-18" (id 1) (at 5.08 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7224.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC Dual Single Supply" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC, Dual or Single Supply, SOIC-18" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225BRS" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225BRS" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225BRS_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225BRS_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225CRS" (extends "AD7225BRS")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225CRS" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SSOP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KN_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LN" (extends "AD7225KN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PDIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KP_1_1"
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LP" (extends "AD7225KP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7225KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225KR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7225KR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7225KR_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -7.62 180) (length 3.81)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -5.08 180) (length 3.81)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 3.81)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 3.81)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7225LR" (extends "AD7225KR")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7225LR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7225.pdf" (id 3) (at 0 -6.35 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 4CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, Separate Reference Voltage, SO-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7226BRSZ" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226BRSZ" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SSOP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226BRSZ_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226BRSZ_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, DIP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KN_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KP_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7226KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7226KR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7226.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "4CH DAC 8bit" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Quad 8bit DAC, 4 Channel, Single Reference Voltage, SOIC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7226KR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7226KR_1_1"
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -17.78 180) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ABN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABN_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABN_1_1"
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACN" (extends "AD7228ABN")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACN" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, DIP-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PDIP* DIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7228ABP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABP_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABP_1_1"
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACP" (extends "AD7228ABP")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACP" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, PLCC-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7228ABR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ABR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7228ABR_0_1"
+      (rectangle (start -13.97 -21.59) (end 13.97 21.59)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7228ABR_1_1"
+      (pin power_in line (at -5.08 25.4 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 25.4 270) (length 3.81)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 17.78 -17.78 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 3.81)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 3.81)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 3.81)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 3.81)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 3.81)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 3.81)
+        (name "VOUT8" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 3.81)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 3.81)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 3.81)
+        (name "A2" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 3.81)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 3.81)
+        (name "VOUT7" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 5.08 180) (length 3.81)
+        (name "VOUT6" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 3.81)
+        (name "VOUT5" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 3.81)
+        (name "VOUT4" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 12.7 180) (length 3.81)
+        (name "VOUT3" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 3.81)
+        (name "VOUT2" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 3.81)
+        (name "VOUT1" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7228ACR" (extends "AD7228ABR")
+    (property "Reference" "U" (id 0) (at -13.97 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7228ACR" (id 1) (at 7.62 22.86 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7228.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "8bit DAC 8 Channel, Single Reference, SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SO*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7304" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 13.97 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7304" (id 1) (at 2.54 13.97 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 4ch 8bit spi" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, SPI Interface, SOIC-16/TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*W*7.5x10.3mm*P1.27mm* TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7304_0_1"
+      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7304_1_1"
+      (pin output line (at 12.7 7.62 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "SDI/SHDN" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "VREFC" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -10.16 180) (length 2.54)
+        (name "VREFD" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 2.54 180) (length 2.54)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 2.54)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 10.16 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -15.24 90) (length 2.54)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -2.54 180) (length 2.54)
+        (name "VREFA" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "VREFB" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -2.54 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -5.08 0) (length 2.54)
+        (name "~{CLR}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7305" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 16.51 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7305" (id 1) (at 3.81 16.51 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7304_7305.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "dac 4ch 8bit parallel" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "3V/5V, Rail-to-Rail, Quad, 8-Bit DAC, Parallel Interface, SOIC-20/TSSOP-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SOIC*W*7.5x12.8mm*P1.27mm* TSSOP*4.4x6.5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7305_0_1"
+      (rectangle (start -10.16 15.24) (end 10.16 -15.24)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7305_1_1"
+      (pin output line (at 12.7 10.16 180) (length 2.54)
+        (name "VOUTB" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "DB4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "DB3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "DB2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "DB1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "DB0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -12.7 -12.7 0) (length 2.54)
+        (name "~{WR}" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "A0/SHDN" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 17.78 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 5.08 180) (length 2.54)
+        (name "VOUTD" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 12.7 180) (length 2.54)
+        (name "VOUTA" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 12.7 7.62 180) (length 2.54)
+        (name "VOUTC" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -17.78 90) (length 2.54)
+        (name "VSS" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 0 180) (length 2.54)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -17.78 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 2.54)
+        (name "~{LDAC}" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 12.7 0) (length 2.54)
+        (name "DB7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 10.16 0) (length 2.54)
+        (name "DB6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 2.54)
+        (name "DB5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7390" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7390" (id 1) (at 1.27 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "SPI 12 bit DAC" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Serial-Input Micropower 12-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7390_0_0"
+      (polyline
+        (pts
+          (xy 12.7 0)
+          (xy 5.08 7.62)
+          (xy -10.16 7.62)
+          (xy -10.16 -7.62)
+          (xy 5.08 -7.62)
+          (xy 12.7 0)
+        )
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7390_1_1"
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "~{LD}" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "SDI" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "~{CLR}" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -10.16 90) (length 2.54)
+        (name "Vss" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 0 180) (length 2.54)
+        (name "Vout" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 10.16 270) (length 2.54)
+        (name "Vdd" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -2.54 10.16 270) (length 2.54)
+        (name "Vref" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7391" (extends "AD7390")
+    (property "Reference" "U" (id 0) (at 1.27 10.795 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7391" (id 1) (at 1.27 8.89 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7390_7391.pdf" (id 3) (at 22.86 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "SPI 10 bit DAC" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Serial-Input Micropower 10-Bit DAC, DIP-8/SOIC-8/TSSOP-8" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x4.9mm*P1.27mm* TSSOP*4.4x3mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533JN" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533JN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533JN_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533JN_1_1"
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7533KN" (extends "AD7533JN")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533LN" (extends "AD7533JN")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533LN" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, DIP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533JP" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533JP" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533JP_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533JP_1_1"
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -12.7 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD7533KP" (extends "AD7533JP")
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KP" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, PLCC-20" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "PLCC*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+  (symbol "AD7533KR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -11.43 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD7533KR" (id 1) (at 3.81 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/static/imported-files/data_sheets/AD7533.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "10bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "10bit Multiplying DAC, 1 Channel, SOIC-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "DIP* PDIP*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD7533KR_0_1"
+      (rectangle (start -11.43 -16.51) (end 11.43 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD7533KR_1_1"
+      (pin passive line (at 15.24 5.08 180) (length 3.81)
+        (name "I_OUT1" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 3.81)
+        (name "D0(LSB)" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 20.32 270) (length 3.81)
+        (name "VCC" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -10.16 180) (length 3.81)
+        (name "VREF" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 12.7 180) (length 3.81)
+        (name "RFBACK" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 15.24 -2.54 180) (length 3.81)
+        (name "I_OUT2" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -20.32 90) (length 3.81)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 3.81)
+        (name "D9(MSB)" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 3.81)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD775" (pin_names (offset 0.762)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "AD775" (id 1) (at 8.89 17.78 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD775.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "DAC CNA" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "DA Converter 8 bits - 20MHz, PDIP/SOIC-24" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD775_0_1"
+      (rectangle (start -13.97 -16.51) (end 13.97 16.51)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD775_1_1"
+      (pin input line (at 17.78 -10.16 180) (length 3.81)
+        (name "~{OE}" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 -5.08 180) (length 3.81)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 20.32 270) (length 3.81)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input clock (at 17.78 -12.7 180) (length 3.81)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 20.32 270) (length 3.81)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -7.62 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 3.81)
+        (name "VRTS" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 3.81)
+        (name "VRT" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 20.32 270) (length 3.81)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 3.81)
+        (name "VIN" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 -20.32 90) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -20.32 90) (length 3.81)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 3.81)
+        (name "VRBS" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 3.81)
+        (name "VRB" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 -20.32 90) (length 3.81)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 12.7 180) (length 3.81)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 10.16 180) (length 3.81)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 7.62 180) (length 3.81)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 5.08 180) (length 3.81)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 2.54 180) (length 3.81)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 0 180) (length 3.81)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin tri_state line (at 17.78 -2.54 180) (length 3.81)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9106BCP" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -13.97 29.21 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9106BCP" (id 1) (at 11.43 29.21 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-32-1EP_5x5mm_P0.5mm_EP3.6x3.6mm" (id 2) (at 0 3.81 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/ad9106.pdf" (id 3) (at 0 -2.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "analog devices DAC DDS" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Analog Devices Quad, Low Power, 12-Bit, 180 MSPS, Digital-to-Analog Converter and Waveform Generator" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "*LFCSP*1EP*5x5mm*P0.5mm*EP3.6x3.6mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9106BCP_0_0"
+      (rectangle (start -15.24 27.94) (end 15.24 -27.94)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -7.62)
+          (xy 7.62 -7.62)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -5.08)
+          (xy 7.62 -5.08)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 0)
+          (xy 7.62 0)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 2.54)
+          (xy 7.62 2.54)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 7.62)
+          (xy 7.62 7.62)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 10.16)
+          (xy 7.62 10.16)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 15.24)
+          (xy 7.62 15.24)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 17.78)
+          (xy 7.62 17.78)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (text "DAC" (at 1.778 -6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 8.89 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "DAC" (at 1.778 16.51 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD9106BCP_0_1"
+      (polyline
+        (pts
+          (xy -1.27 -3.81)
+          (xy 3.81 -3.81)
+          (xy 6.35 -6.35)
+          (xy 3.81 -8.89)
+          (xy -1.27 -8.89)
+          (xy -1.27 -3.81)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 3.81)
+          (xy 3.81 3.81)
+          (xy 6.35 1.27)
+          (xy 3.81 -1.27)
+          (xy -1.27 -1.27)
+          (xy -1.27 3.81)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 11.43)
+          (xy 3.81 11.43)
+          (xy 6.35 8.89)
+          (xy 3.81 6.35)
+          (xy -1.27 6.35)
+          (xy -1.27 11.43)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 19.05)
+          (xy 3.81 19.05)
+          (xy 6.35 16.51)
+          (xy 3.81 13.97)
+          (xy -1.27 13.97)
+          (xy -1.27 19.05)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+    )
+    (symbol "AD9106BCP_1_1"
+      (pin input line (at -17.78 10.16 0) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -5.08 180) (length 2.54)
+        (name "IOUTP4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -7.62 180) (length 2.54)
+        (name "IOUTN4" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 30.48 270) (length 2.54)
+        (name "AVDD2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 0 180) (length 2.54)
+        (name "IOUTN3" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 2.54 180) (length 2.54)
+        (name "IOUTP3" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 5.08 -30.48 90) (length 2.54)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -17.78 180) (length 2.54)
+        (name "FSADJ3" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -20.32 180) (length 2.54)
+        (name "FSADJ4" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 -22.86 0) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -30.48 90) (length 2.54)
+        (name "CLKGND" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 7.62 0) (length 2.54)
+        (name "SDIO" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 2.54)
+        (name "CLKN" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 2.54)
+        (name "CLKP" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at -17.78 -12.7 0) (length 2.54)
+        (name "CLDO" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 30.48 270) (length 2.54)
+        (name "CLKVDD" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 17.78 -15.24 180) (length 2.54)
+        (name "FSADJ2/CAL_SENSE" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 -12.7 180) (length 2.54)
+        (name "FSADJ1" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 5.08 -30.48 90) (length 2.54) hide
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 2.54)
+        (name "IOUTP1" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 15.24 180) (length 2.54)
+        (name "IOUTN1" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 30.48 270) (length 2.54)
+        (name "AVDD1" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 -30.48 90) (length 2.54)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 7.62 180) (length 2.54)
+        (name "IOUTN2" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 10.16 180) (length 2.54)
+        (name "IOUTP2" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 2.54)
+        (name "~{TRIGGER}" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -5.08 -30.48 90) (length 2.54) hide
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at -17.78 -17.78 0) (length 2.54)
+        (name "DLDO2" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -5.08 30.48 270) (length 2.54)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_out line (at -17.78 -15.24 0) (length 2.54)
+        (name "DLDO1" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at -17.78 5.08 0) (length 2.54)
+        (name "SDO" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+        (alternate "DOUT" output line)
+        (alternate "SDI2" input line)
+      )
+      (pin input line (at -17.78 12.7 0) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9142" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9142" (id 1) (at -10.16 -59.69 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_CSP:LFCSP-72-1EP_10x10mm_P0.5mm_EP6.15x6.15mm" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9142.pdf" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "16bit DAC 2CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "1.6GSPS 16bit dual-channel DAC, LFCSP-72" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "LFCSP*1EP*10x10mm*P0.5mm*EP6.15x6.15mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9142_0_0"
+      (rectangle (start -7.62 46.99) (end -5.08 -41.91)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -1.27 -45.72) (end 3.81 -48.26)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 19.05)
+          (xy -5.08 19.05)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 34.29)
+          (xy -5.08 34.29)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 1.27 -45.72)
+          (xy 1.27 16.51)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 3.81 -21.59)
+          (xy 1.27 -21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 5.08 -21.59)
+          (xy 3.81 -21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 17.78)
+          (xy 7.62 17.78)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 20.32)
+          (xy 7.62 20.32)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 33.02)
+          (xy 7.62 33.02)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 6.35 35.56)
+          (xy 7.62 35.56)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 1.27 11.43)
+          (xy -2.54 11.43)
+          (xy -2.54 26.67)
+          (xy 1.27 26.67)
+          (xy 1.27 31.75)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 21.59)
+          (xy 5.08 21.59)
+          (xy 7.62 19.05)
+          (xy 5.08 16.51)
+          (xy -1.27 16.51)
+          (xy -1.27 21.59)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy -1.27 36.83)
+          (xy 5.08 36.83)
+          (xy 7.62 34.29)
+          (xy 5.08 31.75)
+          (xy -1.27 31.75)
+          (xy -1.27 36.83)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start 5.08 -11.43) (end 7.62 -31.75)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (text "CTRL" (at 6.35 -20.32 900)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "DAC" (at 2.54 19.05 0)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "DAC" (at 2.54 34.29 0)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "IFC" (at -6.35 2.54 900)
+        (effects (font (size 1.524 1.524)))
+      )
+      (text "PLL" (at 1.27 -46.99 0)
+        (effects (font (size 1.524 1.524)))
+      )
+    )
+    (symbol "AD9142_0_1"
+      (rectangle (start -15.24 58.42) (end 15.24 -58.42)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD9142_1_1"
+      (pin power_in line (at 0 60.96 270) (length 2.54)
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -30.48 0) (length 2.54)
+        (name "D15P" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -33.02 0) (length 2.54)
+        (name "D15N" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -25.4 0) (length 2.54)
+        (name "D14P" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -27.94 0) (length 2.54)
+        (name "D14N" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -20.32 0) (length 2.54)
+        (name "D13P" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -22.86 0) (length 2.54)
+        (name "D13N" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -15.24 0) (length 2.54)
+        (name "D12P" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -17.78 0) (length 2.54)
+        (name "D12N" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "19" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -45.72 0) (length 2.54)
+        (name "REFP/SYNCP" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -10.16 0) (length 2.54)
+        (name "D11P" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -12.7 0) (length 2.54)
+        (name "D11N" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -5.08 0) (length 2.54)
+        (name "D10P" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -7.62 0) (length 2.54)
+        (name "D10N" (effects (font (size 1.27 1.27))))
+        (number "23" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 0 0) (length 2.54)
+        (name "D9P" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -2.54 0) (length 2.54)
+        (name "D9N" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 5.08 0) (length 2.54)
+        (name "D8P" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 2.54 0) (length 2.54)
+        (name "D8N" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -38.1 0) (length 2.54)
+        (name "DCIP" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -40.64 0) (length 2.54)
+        (name "DCIN" (effects (font (size 1.27 1.27))))
+        (number "29" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -48.26 0) (length 2.54)
+        (name "REFN/SYNCN" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 10.16 0) (length 2.54)
+        (name "D7P" (effects (font (size 1.27 1.27))))
+        (number "30" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 7.62 0) (length 2.54)
+        (name "D7N" (effects (font (size 1.27 1.27))))
+        (number "31" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 15.24 0) (length 2.54)
+        (name "D6P" (effects (font (size 1.27 1.27))))
+        (number "32" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 12.7 0) (length 2.54)
+        (name "D6N" (effects (font (size 1.27 1.27))))
+        (number "33" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 20.32 0) (length 2.54)
+        (name "D5P" (effects (font (size 1.27 1.27))))
+        (number "34" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "D5N" (effects (font (size 1.27 1.27))))
+        (number "35" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "36" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "D4P" (effects (font (size 1.27 1.27))))
+        (number "37" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 22.86 0) (length 2.54)
+        (name "D4N" (effects (font (size 1.27 1.27))))
+        (number "38" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 30.48 0) (length 2.54)
+        (name "D3P" (effects (font (size 1.27 1.27))))
+        (number "39" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 27.94 0) (length 2.54)
+        (name "D3N" (effects (font (size 1.27 1.27))))
+        (number "40" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 35.56 0) (length 2.54)
+        (name "D2P" (effects (font (size 1.27 1.27))))
+        (number "41" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 33.02 0) (length 2.54)
+        (name "D2N" (effects (font (size 1.27 1.27))))
+        (number "42" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "43" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 40.64 0) (length 2.54)
+        (name "D1P" (effects (font (size 1.27 1.27))))
+        (number "44" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 38.1 0) (length 2.54)
+        (name "D1N" (effects (font (size 1.27 1.27))))
+        (number "45" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 45.72 0) (length 2.54)
+        (name "D0P" (effects (font (size 1.27 1.27))))
+        (number "46" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 43.18 0) (length 2.54)
+        (name "D0N" (effects (font (size 1.27 1.27))))
+        (number "47" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "48" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at -2.54 60.96 270) (length 2.54) hide
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "49" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -27.94 180) (length 2.54)
+        (name "~{RESET}" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -15.24 180) (length 2.54)
+        (name "~{IRQ2}" (effects (font (size 1.27 1.27))))
+        (number "50" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -12.7 180) (length 2.54)
+        (name "~{IRQ1}" (effects (font (size 1.27 1.27))))
+        (number "51" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 17.78 -17.78 180) (length 2.54)
+        (name "SDIO" (effects (font (size 1.27 1.27))))
+        (number "52" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -20.32 180) (length 2.54)
+        (name "SCLK" (effects (font (size 1.27 1.27))))
+        (number "53" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -22.86 180) (length 2.54)
+        (name "~{CS}" (effects (font (size 1.27 1.27))))
+        (number "54" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 2.54 60.96 270) (length 2.54)
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "55" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 20.32 180) (length 2.54)
+        (name "IOUT2P" (effects (font (size 1.27 1.27))))
+        (number "56" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 17.78 180) (length 2.54)
+        (name "IOUT2N" (effects (font (size 1.27 1.27))))
+        (number "57" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "58" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "59" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -30.48 180) (length 2.54)
+        (name "TXEN" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "60" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -53.34 0) (length 2.54)
+        (name "DACCLKN" (effects (font (size 1.27 1.27))))
+        (number "61" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 -50.8 0) (length 2.54)
+        (name "DACCLKP" (effects (font (size 1.27 1.27))))
+        (number "62" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "63" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "64" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "65" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 33.02 180) (length 2.54)
+        (name "IOUT1N" (effects (font (size 1.27 1.27))))
+        (number "66" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 17.78 35.56 180) (length 2.54)
+        (name "IOUT1P" (effects (font (size 1.27 1.27))))
+        (number "67" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 2.54 60.96 270) (length 2.54) hide
+        (name "AVDD33" (effects (font (size 1.27 1.27))))
+        (number "68" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 0 180) (length 2.54)
+        (name "FSADJ" (effects (font (size 1.27 1.27))))
+        (number "69" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 60.96 270) (length 2.54)
+        (name "DVDD18" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 17.78 -2.54 180) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "70" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "71" (effects (font (size 1.27 1.27))))
+      )
+      (pin passive line (at 0 60.96 270) (length 2.54) hide
+        (name "CVDD18" (effects (font (size 1.27 1.27))))
+        (number "72" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -60.96 90) (length 2.54)
+        (name "AVSS" (effects (font (size 1.27 1.27))))
+        (number "73" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 53.34 0) (length 2.54)
+        (name "FRAMEP" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -17.78 50.8 0) (length 2.54)
+        (name "FRAMEN" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "AD9744" (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 -24.13 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD9744" (id 1) (at 7.62 24.13 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm" (id 2) (at 15.24 5.08 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD9744.pdf" (id 3) (at 15.24 5.08 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "14bit DAC 1CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "210MSPS 14bit DAC, TSSOP-28" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x9.7mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD9744_0_1"
+      (rectangle (start 12.7 22.86) (end -12.7 -22.86)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "AD9744_1_1"
+      (pin input line (at -15.24 -15.24 0) (length 2.54)
+        (name "D13" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 7.62 0) (length 2.54)
+        (name "D4" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 10.16 0) (length 2.54)
+        (name "D3" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 12.7 0) (length 2.54)
+        (name "D2" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 15.24 0) (length 2.54)
+        (name "D1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 17.78 0) (length 2.54)
+        (name "D0" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 2.54 180) (length 2.54)
+        (name "SLEEP" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -15.24 180) (length 2.54)
+        (name "REFLO" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -12.7 180) (length 2.54)
+        (name "REFIO" (effects (font (size 1.27 1.27))))
+        (number "17" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 -2.54 180) (length 2.54)
+        (name "FS_ADJ" (effects (font (size 1.27 1.27))))
+        (number "18" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -12.7 0) (length 2.54)
+        (name "D12" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 -25.4 90) (length 2.54)
+        (name "AGND" (effects (font (size 1.27 1.27))))
+        (number "20" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 10.16 180) (length 2.54)
+        (name "IOUTB" (effects (font (size 1.27 1.27))))
+        (number "21" (effects (font (size 1.27 1.27))))
+      )
+      (pin output line (at 15.24 12.7 180) (length 2.54)
+        (name "IOUTA" (effects (font (size 1.27 1.27))))
+        (number "22" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 25.4 270) (length 2.54)
+        (name "AVDD" (effects (font (size 1.27 1.27))))
+        (number "24" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 15.24 0 180) (length 2.54)
+        (name "MODE" (effects (font (size 1.27 1.27))))
+        (number "25" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -25.4 90) (length 2.54)
+        (name "DGND" (effects (font (size 1.27 1.27))))
+        (number "26" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at -2.54 25.4 270) (length 2.54)
+        (name "DVDD" (effects (font (size 1.27 1.27))))
+        (number "27" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -20.32 0) (length 2.54)
+        (name "CLK" (effects (font (size 1.27 1.27))))
+        (number "28" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -10.16 0) (length 2.54)
+        (name "D11" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -7.62 0) (length 2.54)
+        (name "D10" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -5.08 0) (length 2.54)
+        (name "D9" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 -2.54 0) (length 2.54)
+        (name "D8" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 0 0) (length 2.54)
+        (name "D7" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 2.54 0) (length 2.54)
+        (name "D6" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -15.24 5.08 0) (length 2.54)
+        (name "D5" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+  (symbol "ADS7830" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+    (property "Reference" "U" (id 0) (at -10.16 13.716 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ADS7830" (id 1) (at 1.778 13.716 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_SO:TSSOP-16_4.4x5mm_P0.65mm" (id 2) (at 2.54 -17.78 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "http://www.ti.com/lit/ds/symlink/ads7830.pdf" (id 3) (at 5.08 -11.43 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_keywords" "8bit DAC 8CH" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Single-supply, 8bit, 8 ch, SAR, 70kHz SR, 2.7 - 5 VDD, I2C, TSSOP-16" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "TSSOP*4.4x5mm*P0.65mm*" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "ADS7830_0_1"
+      (rectangle (start -10.16 12.7) (end 10.16 -12.7)
+        (stroke (width 0.254) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+    )
+    (symbol "ADS7830_1_1"
+      (pin input line (at -12.7 10.16 0) (length 2.54)
+        (name "CH0" (effects (font (size 1.27 1.27))))
+        (number "1" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 12.7 0 180) (length 2.54)
+        (name "REFin/REFout" (effects (font (size 1.27 1.27))))
+        (number "10" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -10.16 0) (length 2.54)
+        (name "COM" (effects (font (size 1.27 1.27))))
+        (number "11" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -7.62 180) (length 2.54)
+        (name "A0" (effects (font (size 1.27 1.27))))
+        (number "12" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 -5.08 180) (length 2.54)
+        (name "A1" (effects (font (size 1.27 1.27))))
+        (number "13" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at 12.7 7.62 180) (length 2.54)
+        (name "SCL" (effects (font (size 1.27 1.27))))
+        (number "14" (effects (font (size 1.27 1.27))))
+      )
+      (pin bidirectional line (at 12.7 10.16 180) (length 2.54)
+        (name "SDA" (effects (font (size 1.27 1.27))))
+        (number "15" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 15.24 270) (length 2.54)
+        (name "VDD" (effects (font (size 1.27 1.27))))
+        (number "16" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 7.62 0) (length 2.54)
+        (name "CH1" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 5.08 0) (length 2.54)
+        (name "CH2" (effects (font (size 1.27 1.27))))
+        (number "3" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 2.54 0) (length 2.54)
+        (name "CH3" (effects (font (size 1.27 1.27))))
+        (number "4" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 0 0) (length 2.54)
+        (name "CH4" (effects (font (size 1.27 1.27))))
+        (number "5" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -2.54 0) (length 2.54)
+        (name "CH5" (effects (font (size 1.27 1.27))))
+        (number "6" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -5.08 0) (length 2.54)
+        (name "CH6" (effects (font (size 1.27 1.27))))
+        (number "7" (effects (font (size 1.27 1.27))))
+      )
+      (pin input line (at -12.7 -7.62 0) (length 2.54)
+        (name "CH7" (effects (font (size 1.27 1.27))))
+        (number "8" (effects (font (size 1.27 1.27))))
+      )
+      (pin power_in line (at 0 -15.24 90) (length 2.54)
+        (name "GND" (effects (font (size 1.27 1.27))))
+        (number "9" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_renameParentIdUsingIdToken b/tests/testdata/symbol/test_renameParentIdUsingIdToken
new file mode 100644
index 0000000..b1165f6
--- /dev/null
+++ b/tests/testdata/symbol/test_renameParentIdUsingIdToken
@@ -0,0 +1,112 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853JRS" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD1853JRS_0_0"
+      (text "Top Unit" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_0"
+      (text "Unit A" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_1"
+      (text "Unit A, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_2"
+      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_0"
+      (text "Unit B" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_2"
+      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_0"
+      (text "Unit C" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+  )
+  (symbol "Has_Library_Nick_Set:AD1853JRS" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD1853JRS_0_0"
+      (text "Top Unit" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_0"
+      (text "Unit A" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_1"
+      (text "Unit A, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_1_2"
+      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_0"
+      (text "Unit B" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_2_2"
+      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_0"
+      (text "Unit C" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD1853JRS_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected b/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected
new file mode 100644
index 0000000..d4b1408
--- /dev/null
+++ b/tests/testdata/symbol/test_renameParentIdUsingIdToken.expected
@@ -0,0 +1,112 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "ExampleLibrary:AD2023" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD2023_0_0"
+      (text "Top Unit" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_0"
+      (text "Unit A" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_1"
+      (text "Unit A, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_2"
+      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_0"
+      (text "Unit B" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_2"
+      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_0"
+      (text "Unit C" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+  )
+  (symbol "AD2023" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (symbol "AD2023_0_0"
+      (text "Top Unit" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_0"
+      (text "Unit A" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_1"
+      (text "Unit A, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_1_2"
+      (text "Unit A, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_0"
+      (text "Unit B" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_2_2"
+      (text "Unit B, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_0"
+      (text "Unit C" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+    (symbol "AD2023_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_symbolDemorganSyItems b/tests/testdata/symbol/test_symbolDemorganSyItems
new file mode 100644
index 0000000..7fcce54
--- /dev/null
+++ b/tests/testdata/symbol/test_symbolDemorganSyItems
@@ -0,0 +1,370 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Reference" "U" (id 0) (at 0 16.51 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD1853" (id 1) (at 0 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -5.715 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -7.62 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_locked" "" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD1853_0_0"
+      (rectangle (start -44.45 -102.235) (end -18.415 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -28.575 -252.73) (mid -2.8272 -239.9607) (end 6.35 -212.725)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -16.51 -102.235) (end 9.525 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -8.255 -254.635) (mid 17.4928 -241.8657) (end 26.67 -214.63)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 83.82 -252.095)
+          (xy 89.535 -293.37)
+          (xy 116.205 -267.335)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 116.205 -249.555)
+          (xy 121.92 -290.83)
+          (xy 148.59 -264.795)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 151.765 -248.285)
+          (xy 157.48 -289.56)
+          (xy 184.15 -263.525)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -102.235) (end 38.1 -73.025)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 12.7 -255.27) (mid 38.4478 -242.5007) (end 47.625 -215.265)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 69.215 -99.695) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 111.76 -100.33) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 149.225 -99.06) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (text "NormalStuff" (at 0 26.035 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -62.865 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -59.69 0)
+        (effects (font (size 1.27 1.27) bold) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -56.515 0)
+        (effects (font (size 1.27 1.27) italic) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 229.87 -53.34 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -43.18 0)
+        (effects (font (size 1.27 1.27) bold italic))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -40.005 0)
+        (effects (font (size 1.27 1.27) bold))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -36.83 0)
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text "test text with \"quoted\" string" (at 230.505 -33.655 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -78.105 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -74.93 0)
+        (effects (font (size 1.27 1.27) bold) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -71.755 0)
+        (effects (font (size 1.27 1.27) italic) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 231.14 -68.58 0)
+        (effects (font (size 1.27 1.27)) (justify right))
+      )
+      (text "test text with \"quoted\" string" (at 262.255 -33.655 900)
+        (effects (font (size 1.27 1.27)))
+      )
+      (text "test text with \"quoted\" string" (at 264.795 -33.655 900)
+        (effects (font (size 1.27 1.27) italic))
+      )
+      (text "test text with \"quoted\" string" (at 267.335 -34.29 900)
+        (effects (font (size 1.27 1.27) bold))
+      )
+      (text "test text with \"quoted\" string" (at 270.51 -34.925 900)
+        (effects (font (size 1.27 1.27) bold italic))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -59.055 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -55.88 0)
+        (effects (font (size 1.27 1.27) bold) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -52.705 0)
+        (effects (font (size 1.27 1.27) italic) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 304.8 -49.53 0)
+        (effects (font (size 1.27 1.27)) (justify bottom))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -41.91 0)
+        (effects (font (size 1.27 1.27) bold italic) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -38.735 0)
+        (effects (font (size 1.27 1.27) bold) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -35.56 0)
+        (effects (font (size 1.27 1.27) italic) (justify top))
+      )
+      (text "test text with \"quoted\" string" (at 305.435 -32.385 0)
+        (effects (font (size 1.27 1.27)) (justify top))
+      )
+      (pin input line (at 13.335 20.955 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_0"
+      (pin input line (at 10.795 31.115 0) (length 2.54)
+        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_1"
+      (rectangle (start -44.45 -71.755) (end -18.415 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -44.45 -41.275) (end -18.415 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -24.13 -208.28) (mid 1.6178 -195.5107) (end 10.795 -168.275)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (arc (start -23.495 -167.005) (mid 2.2528 -154.2357) (end 11.43 -127)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (rectangle (start -16.51 -71.755) (end 9.525 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (rectangle (start -16.51 -41.275) (end 9.525 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -3.81 -210.185) (mid 21.9378 -197.4157) (end 31.115 -170.18)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (arc (start -3.175 -168.91) (mid 22.5728 -156.1407) (end 31.75 -128.905)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 80.645 -208.915)
+          (xy 86.36 -250.19)
+          (xy 113.03 -224.155)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 83.82 -161.29)
+          (xy 89.535 -202.565)
+          (xy 116.205 -176.53)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (polyline
+        (pts
+          (xy 113.03 -206.375)
+          (xy 118.745 -247.65)
+          (xy 145.415 -221.615)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 116.205 -158.75)
+          (xy 121.92 -200.025)
+          (xy 148.59 -173.99)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (polyline
+        (pts
+          (xy 148.59 -205.105)
+          (xy 154.305 -246.38)
+          (xy 180.975 -220.345)
+        )
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (polyline
+        (pts
+          (xy 151.765 -157.48)
+          (xy 157.48 -198.755)
+          (xy 184.15 -172.72)
+        )
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -71.755) (end 38.1 -42.545)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (rectangle (start 12.065 -41.275) (end 38.1 -12.065)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 17.145 -210.82) (mid 42.8928 -198.0507) (end 52.07 -170.815)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (arc (start 17.78 -169.545) (mid 43.5278 -156.7757) (end 52.705 -129.54)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 66.04 -28.575) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 69.85 -64.135) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type none))
+      )
+      (circle (center 108.585 -29.21) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 112.395 -64.77) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type outline))
+      )
+      (circle (center 146.05 -27.94) (radius 16.7645)
+        (stroke (width 0) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (circle (center 149.86 -63.5) (radius 16.7645)
+        (stroke (width 0.127) (type default) (color 0 0 0 0))
+        (fill (type background))
+      )
+      (text "Unit A, Normal" (at -1.27 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 24.765 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_2"
+      (text "Unit A, DeMorgan" (at 0.635 6.35 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 24.13 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_0"
+      (pin input line (at 13.335 29.845 0) (length 2.54)
+        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_1"
+      (text "Unit B, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -15.24 20.32 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_2"
+      (text "Unit B, DeMorgan" (at -1.905 6.985 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_0"
+      (pin input line (at 15.24 28.575 0) (length 2.54)
+        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_1"
+      (text "Unit C, Normal" (at 0 8.255 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.145 24.765 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 25.4 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_symbolDemorganUnits b/tests/testdata/symbol/test_symbolDemorganUnits
new file mode 100644
index 0000000..6c104ac
--- /dev/null
+++ b/tests/testdata/symbol/test_symbolDemorganUnits
@@ -0,0 +1,109 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "AD1853" (power) (pin_numbers hide) (pin_names (offset 0.635)) (in_bom no) (on_board no)
+    (property "Reference" "U" (id 0) (at 0 9.525 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "AD1853" (id 1) (at 0 6.985 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_SO:SSOP-28_5.3x10.2mm_P0.65mm" (id 2) (at 0.635 -12.7 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD1853.pdf" (id 3) (at 0 -14.605 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_locked" "" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "ki_keywords" "audio dac 2ch 24bit 192kHz" (id 5) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "Stereo, 24-Bit, 192 kHz, Multibit Sigma-Delta DAC, SSOP-28" (id 6) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" (id 7) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (symbol "AD1853_0_0"
+      (text "NormalStuff" (at 0 19.05 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at 13.335 13.97 0) (length 2.54)
+        (name "NormalPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_0"
+      (pin input line (at 10.795 24.13 0) (length 2.54)
+        (name "UnitABothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_1"
+      (text "Unit A, Normal" (at -1.27 0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 17.78 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_1_2"
+      (text "Unit A, DeMorgan" (at 0.635 -0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 17.145 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_0"
+      (pin input line (at 13.335 22.86 0) (length 2.54)
+        (name "UnitBBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_1"
+      (text "Unit B, Normal" (at 0 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -15.24 13.335 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_2_2"
+      (text "Unit B, DeMorgan" (at -1.905 0 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 18.415 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_0"
+      (pin input line (at 15.24 21.59 0) (length 2.54)
+        (name "UnitCBothPin" (effects (font (size 1.27 1.27))))
+        (number "123" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_1"
+      (text "Unit C, Normal" (at 0 1.27 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.145 17.78 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+    (symbol "AD1853_3_2"
+      (text "Unit C, DeMorgan" (at -0.635 0.635 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (pin input line (at -17.78 18.415 0) (length 2.54)
+        (name "MCLK" (effects (font (size 1.27 1.27))))
+        (number "2" (effects (font (size 1.27 1.27))))
+      )
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_symbolIdParser b/tests/testdata/symbol/test_symbolIdParser
new file mode 100644
index 0000000..ac1d554
--- /dev/null
+++ b/tests/testdata/symbol/test_symbolIdParser
@@ -0,0 +1,14 @@
+(kicad_symbol_lib (version 20211014) (generator kiutils)
+  (symbol "AD2023"
+    (symbol "AD2023_0_0"
+    )
+  )
+  (symbol "formula:R_0_2512"
+    (symbol "R_0_2512_0_0"
+    )
+  )
+  (symbol "Some_Library:R_0_2512"
+    (symbol "R_0_2512_0_0"
+    )
+  )
+)
diff --git a/tests/testdata/symbol/test_symbolParameters b/tests/testdata/symbol/test_symbolParameters
new file mode 100644
index 0000000..f9fe42e
--- /dev/null
+++ b/tests/testdata/symbol/test_symbolParameters
@@ -0,0 +1,52 @@
+(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
+  (symbol "test" (power) (pin_names (offset 0.5334)) (in_bom no) (on_board no)
+    (property "Reference" "U" (id 0) (at 0 1.905 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "test" (id 1) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (id 2) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "this test with \"quoted\" string" (id 3) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "p1" "property with \"quoted\" string" (id 4) (at 0 0 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "1" "2" (id 5) (at 0 0 0)
+      (effects (font (size 1.2954 1.2954) italic) (justify left top))
+    )
+    (property "2" "2" (id 6) (at 0 0 0)
+      (effects (font (size 1.3208 1.3208) bold) (justify left))
+    )
+    (property "3" "3" (id 7) (at 0 0 0)
+      (effects (font (size 1.3462 1.3462) bold italic) (justify left bottom))
+    )
+    (property "4" "4" (id 8) (at 0 0 0)
+      (effects (font (size 1.3716 1.3716) italic) (justify top))
+    )
+    (property "5" "5" (id 9) (at 0 0 0)
+      (effects (font (size 1.397 1.397) bold))
+    )
+    (property "6" "6" (id 10) (at 0 0 0)
+      (effects (font (size 1.4224 1.4224) bold italic) (justify bottom))
+    )
+    (property "7" "7" (id 11) (at 0 0 0)
+      (effects (font (size 1.4478 1.4478) italic) (justify right top))
+    )
+    (property "8" "8" (id 12) (at 0 0 0)
+      (effects (font (size 1.4732 1.4732) bold) (justify right))
+    )
+    (property "9" "9" (id 13) (at 0 0 0)
+      (effects (font (size 1.4986 1.4986) bold italic) (justify right bottom))
+    )
+    (property "ki_keywords" "test with \"quoted\" string" (id 14) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "ki_description" "test with \"quoted\" string" (id 15) (at 0 0 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+  )
+)
diff --git a/tests/testdata/worksheets/test_allWorkSheetItems b/tests/testdata/worksheets/test_allWorkSheetItems
new file mode 100644
index 0000000..dc589a9
--- /dev/null
+++ b/tests/testdata/worksheets/test_allWorkSheetItems
@@ -0,0 +1,2104 @@
+(kicad_wks (version 20210606) (generator pl_editor)
+  (setup (textsize 1.5 1.5)(linewidth 0.15)(textlinewidth 0.15)
+  (left_margin 10)(right_margin 10)(top_margin 10)(bottom_margin 10))
+  (rect (name "") (start 110 34) (end 2 2) (comment "rect around the title block")
+)
+  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
+  (line (name "") (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50))
+  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
+  (line (name "") (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50))
+  (tbtext "1" (name "") (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
+  (line (name "") (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50))
+  (tbtext "A" (name "") (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
+  (line (name "") (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50))
+  (tbtext "A" (name "") (pos 1 25 rtcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
+  (tbtext "Date: ${ISSUE_DATE}" (name "") (pos 87 6.9))
+  (line (name "") (start 110 5.5) (end 2 5.5))
+  (tbtext "${KICAD_VERSION}" (name "") (pos 109 4.1) (comment "Kicad version")
+)
+  (line (name "") (start 110 8.5) (end 2 8.5))
+  (tbtext "Rev: ${REVISION}" (name "") (pos 24 6.9) (font bold))
+  (tbtext "Size: ${PAPER}" (name "") (pos 109 6.9) (comment "Paper format name")
+)
+  (tbtext "Id: ${#}/${##}" (name "") (pos 24 4.1) (comment "Sheet id")
+)
+  (line (name "") (start 110 12.5) (end 2 12.5))
+  (tbtext "Title: ${TITLE}" (name "") (pos 109 10.7) (font (size 2 2) bold italic))
+  (tbtext "File: ${FILENAME}" (name "") (pos 109 14.3))
+  (line (name "") (start 110 18.5) (end 2 18.5))
+  (tbtext "Sheet: ${SHEETNAME}" (name "") (pos 109 17))
+  (tbtext "${COMPANY}" (name "") (pos 109 20) (font bold) (comment "Company name")
+)
+  (tbtext "${COMMENT1}" (name "") (pos 109 23) (comment "Comment 0")
+)
+  (tbtext "${COMMENT2}" (name "") (pos 109 26) (comment "Comment 1")
+)
+  (tbtext "${COMMENT3}" (name "") (pos 109 29) (comment "Comment 2")
+)
+  (tbtext "${COMMENT4}" (name "") (pos 109 32) (comment "Comment 3")
+)
+  (line (name "") (start 90 8.5) (end 90 5.5))
+  (line (name "") (start 26 8.5) (end 26 2))
+  (rect (name "") (start 392.189 267.402) (end 356.889 261.302) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
+  (line (name "") (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50))
+  (rect (name "") (start 0 0 ltcorner) (end 0 0) (repeat 2) (incrx 2) (incry 2))
+  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
+  (tbtext "A" (name "") (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50))
+  (tbtext "1" (name "") (pos 25 1 ltcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50))
+  (rect (name "") (start 390.939 45.702 rtcorner) (end 355.639 39.602 rtcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 54.389 66.2 ltcorner) (end 19.089 60.1 ltcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 53.5 205.9002 lbcorner) (end 18.2 199.8002 lbcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 332.539 45.152 rtcorner) (end 297.239 39.052 rtcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 112.789 65.65 ltcorner) (end 77.489 59.55 ltcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 111.9 206.45 lbcorner) (end 76.6 200.35 lbcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 333.789 267.952) (end 298.489 261.852) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 276.639 267.952) (end 241.339 261.852) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 169.05 206.45 lbcorner) (end 133.75 200.35 lbcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 275.389 45.152 rtcorner) (end 240.089 39.052 rtcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (rect (name "") (start 169.939 65.65 ltcorner) (end 134.639 59.55 ltcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A rectangle with a \"comment\"")
+)
+  (line (name "") (start 390.939 172.702) (end 352.839 172.702) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 390.939 134.602 rtcorner) (end 352.839 134.602 rtcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 54.389 153.652 ltcorner) (end 16.289 153.652 ltcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 54.389 115.5522 lbcorner) (end 16.289 115.5522 lbcorner) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 111.539 115.552 lbcorner) (end 73.439 115.552 lbcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 333.789 134.602 rtcorner) (end 295.689 134.602 rtcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 333.789 172.702) (end 295.689 172.702) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 111.539 153.652 ltcorner) (end 73.439 153.652 ltcorner) (option page1only) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 276.639 134.602 rtcorner) (end 238.539 134.602 rtcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 168.689 115.552 lbcorner) (end 130.589 115.552 lbcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 168.689 153.652 ltcorner) (end 130.589 153.652 ltcorner) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (line (name "") (start 276.639 172.702) (end 238.539 172.702) (option notonpage1) (linewidth 2) (repeat 2) (incrx -10) (incry -10) (comment "A line \"with a comment\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 83.8022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 77.4522) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 90.1522) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 71.1022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 83.8022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 77.4522) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 90.1522) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 71.1022) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 90.152) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 77.452) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 83.802) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 71.102) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 45.702) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 52.052) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 39.352) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 58.4022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 45.7022) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 39.3522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 52.0522) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 58.402) (option page1only) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 20.302) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 7.602) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 20.302) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 321.089 26.652) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 13.952) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 26.652) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 251.239 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 289.339 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 270.289 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center bottom) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 390.939 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 340.139 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 7.6022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 352.839 20.3022) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) bold) (justify right) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 371.889 13.9522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2) italic) (justify center) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (tbtext "Test \"text\"" (name "") (pos 302.039 26.6522) (option notonpage1) (rotate 25) (font (linewidth 2) (size 1.2 1.2)) (justify right top) (maxlen 20) (maxheight 20) (repeat 2) (incrx 2) (incry 2) (incrlabel 2) (comment "This is a comment of \"the text\"")
+)
+  (bitmap (name "") (pos 54.389 236.202) (scale 1) (repeat 2) (incrx -10) (incry -10)
+  (pngdata
+    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
+    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
+    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
+    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
+    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
+    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
+    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
+    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
+    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
+    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
+    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
+    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
+    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
+    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
+    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
+    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
+    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
+    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
+    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
+    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
+    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
+    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
+    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
+    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
+    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
+    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
+    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
+    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
+    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
+    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
+    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
+    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
+    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
+    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
+    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
+    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
+    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
+    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
+    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
+    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
+    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
+    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
+    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
+    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
+    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
+    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
+    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
+    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
+    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
+    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
+    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
+    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
+    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
+    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
+    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
+    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
+    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
+    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
+    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
+    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
+    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
+    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
+    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
+    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
+    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
+    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
+    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
+    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
+    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
+    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
+    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
+    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
+    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
+    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
+    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
+    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
+    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
+    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
+    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
+    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
+    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
+    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
+    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
+    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
+    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
+    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
+    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
+    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
+    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
+    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
+    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
+    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
+    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
+    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
+    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
+    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
+    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
+    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
+    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
+    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
+    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
+    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
+    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
+    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
+    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
+    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
+    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
+    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
+    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
+    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
+    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
+    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
+    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
+    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
+    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
+    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
+    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
+    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
+    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
+    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
+    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
+    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
+    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
+    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
+    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
+    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
+    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
+    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
+    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
+    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
+    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
+    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
+    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
+    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
+    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
+    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
+    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
+    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
+    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
+    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
+    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
+    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
+    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
+    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
+    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
+    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
+    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
+    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
+    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
+    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
+    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
+    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
+    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
+    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
+    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
+    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
+    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
+    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
+    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
+    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
+    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
+    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
+    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
+    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
+    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
+    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
+    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
+    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
+    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
+    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
+    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
+    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
+    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
+    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
+    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
+    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
+    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
+    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
+    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
+    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
+    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
+    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
+    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
+    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
+    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
+    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
+    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
+    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
+    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
+    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
+    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
+    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
+    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
+    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
+    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
+    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
+    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
+    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
+    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
+    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
+    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
+    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
+    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
+    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
+    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
+    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
+    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
+    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
+    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
+    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
+    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
+    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
+    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
+    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
+    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
+    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
+    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
+    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
+    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
+    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
+    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
+    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
+    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
+    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
+    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
+    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
+    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
+    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
+    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
+    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
+    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
+    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
+    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
+    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
+    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
+    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
+    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
+    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
+    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
+    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
+    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
+    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
+    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
+    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
+    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
+    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
+    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
+    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
+    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
+    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
+    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
+    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
+    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
+    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
+    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
+    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
+    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
+    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
+    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
+    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
+    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
+    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
+    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
+    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
+    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
+    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
+    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
+    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
+    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
+    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
+    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
+    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
+    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
+    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
+    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
+    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
+    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
+    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
+    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
+    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
+    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
+    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
+    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
+    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
+    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
+    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
+    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
+    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
+    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
+    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
+    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
+    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
+    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
+    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
+    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
+    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
+    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
+    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
+    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
+    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
+    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
+    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
+    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
+    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
+    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
+    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
+    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
+    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
+    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
+    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
+    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
+    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
+    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
+    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
+    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
+    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
+    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
+    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
+    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
+    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
+    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
+    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
+    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
+    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
+    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
+    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
+    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
+    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
+    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
+    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
+    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
+    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
+    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
+    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
+    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
+    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
+    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
+    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
+    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
+    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
+    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
+    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
+    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
+    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
+    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
+    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
+    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
+    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
+    (data "00 00 49 45 4E 44 AE 42 60 82 ")
+    )
+  )
+  (bitmap (name "") (pos 28.989 52.052 rtcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
+  (pngdata
+    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
+    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
+    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
+    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
+    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
+    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
+    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
+    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
+    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
+    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
+    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
+    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
+    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
+    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
+    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
+    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
+    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
+    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
+    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
+    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
+    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
+    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
+    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
+    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
+    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
+    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
+    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
+    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
+    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
+    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
+    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
+    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
+    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
+    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
+    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
+    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
+    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
+    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
+    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
+    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
+    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
+    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
+    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
+    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
+    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
+    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
+    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
+    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
+    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
+    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
+    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
+    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
+    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
+    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
+    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
+    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
+    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
+    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
+    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
+    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
+    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
+    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
+    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
+    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
+    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
+    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
+    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
+    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
+    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
+    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
+    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
+    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
+    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
+    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
+    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
+    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
+    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
+    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
+    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
+    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
+    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
+    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
+    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
+    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
+    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
+    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
+    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
+    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
+    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
+    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
+    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
+    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
+    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
+    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
+    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
+    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
+    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
+    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
+    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
+    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
+    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
+    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
+    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
+    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
+    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
+    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
+    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
+    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
+    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
+    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
+    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
+    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
+    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
+    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
+    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
+    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
+    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
+    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
+    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
+    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
+    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
+    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
+    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
+    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
+    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
+    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
+    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
+    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
+    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
+    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
+    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
+    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
+    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
+    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
+    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
+    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
+    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
+    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
+    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
+    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
+    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
+    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
+    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
+    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
+    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
+    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
+    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
+    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
+    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
+    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
+    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
+    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
+    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
+    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
+    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
+    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
+    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
+    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
+    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
+    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
+    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
+    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
+    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
+    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
+    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
+    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
+    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
+    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
+    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
+    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
+    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
+    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
+    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
+    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
+    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
+    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
+    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
+    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
+    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
+    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
+    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
+    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
+    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
+    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
+    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
+    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
+    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
+    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
+    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
+    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
+    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
+    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
+    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
+    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
+    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
+    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
+    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
+    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
+    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
+    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
+    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
+    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
+    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
+    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
+    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
+    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
+    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
+    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
+    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
+    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
+    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
+    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
+    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
+    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
+    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
+    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
+    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
+    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
+    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
+    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
+    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
+    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
+    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
+    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
+    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
+    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
+    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
+    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
+    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
+    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
+    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
+    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
+    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
+    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
+    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
+    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
+    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
+    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
+    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
+    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
+    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
+    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
+    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
+    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
+    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
+    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
+    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
+    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
+    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
+    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
+    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
+    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
+    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
+    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
+    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
+    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
+    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
+    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
+    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
+    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
+    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
+    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
+    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
+    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
+    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
+    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
+    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
+    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
+    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
+    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
+    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
+    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
+    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
+    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
+    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
+    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
+    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
+    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
+    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
+    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
+    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
+    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
+    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
+    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
+    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
+    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
+    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
+    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
+    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
+    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
+    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
+    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
+    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
+    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
+    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
+    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
+    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
+    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
+    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
+    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
+    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
+    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
+    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
+    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
+    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
+    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
+    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
+    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
+    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
+    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
+    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
+    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
+    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
+    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
+    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
+    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
+    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
+    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
+    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
+    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
+    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
+    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
+    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
+    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
+    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
+    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
+    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
+    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
+    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
+    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
+    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
+    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
+    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
+    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
+    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
+    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
+    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
+    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
+    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
+    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
+    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
+    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
+    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
+    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
+    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
+    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
+    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
+    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
+    (data "00 00 49 45 4E 44 AE 42 60 82 ")
+    )
+  )
+  (bitmap (name "") (pos 352.839 121.902 ltcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
+  (pngdata
+    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
+    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
+    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
+    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
+    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
+    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
+    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
+    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
+    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
+    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
+    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
+    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
+    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
+    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
+    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
+    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
+    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
+    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
+    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
+    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
+    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
+    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
+    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
+    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
+    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
+    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
+    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
+    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
+    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
+    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
+    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
+    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
+    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
+    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
+    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
+    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
+    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
+    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
+    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
+    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
+    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
+    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
+    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
+    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
+    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
+    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
+    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
+    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
+    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
+    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
+    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
+    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
+    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
+    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
+    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
+    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
+    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
+    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
+    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
+    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
+    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
+    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
+    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
+    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
+    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
+    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
+    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
+    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
+    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
+    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
+    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
+    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
+    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
+    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
+    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
+    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
+    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
+    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
+    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
+    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
+    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
+    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
+    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
+    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
+    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
+    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
+    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
+    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
+    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
+    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
+    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
+    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
+    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
+    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
+    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
+    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
+    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
+    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
+    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
+    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
+    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
+    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
+    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
+    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
+    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
+    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
+    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
+    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
+    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
+    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
+    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
+    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
+    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
+    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
+    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
+    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
+    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
+    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
+    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
+    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
+    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
+    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
+    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
+    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
+    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
+    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
+    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
+    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
+    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
+    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
+    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
+    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
+    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
+    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
+    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
+    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
+    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
+    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
+    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
+    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
+    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
+    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
+    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
+    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
+    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
+    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
+    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
+    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
+    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
+    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
+    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
+    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
+    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
+    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
+    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
+    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
+    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
+    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
+    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
+    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
+    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
+    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
+    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
+    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
+    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
+    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
+    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
+    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
+    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
+    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
+    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
+    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
+    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
+    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
+    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
+    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
+    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
+    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
+    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
+    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
+    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
+    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
+    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
+    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
+    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
+    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
+    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
+    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
+    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
+    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
+    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
+    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
+    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
+    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
+    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
+    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
+    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
+    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
+    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
+    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
+    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
+    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
+    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
+    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
+    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
+    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
+    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
+    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
+    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
+    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
+    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
+    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
+    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
+    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
+    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
+    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
+    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
+    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
+    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
+    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
+    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
+    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
+    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
+    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
+    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
+    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
+    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
+    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
+    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
+    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
+    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
+    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
+    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
+    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
+    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
+    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
+    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
+    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
+    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
+    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
+    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
+    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
+    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
+    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
+    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
+    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
+    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
+    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
+    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
+    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
+    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
+    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
+    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
+    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
+    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
+    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
+    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
+    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
+    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
+    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
+    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
+    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
+    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
+    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
+    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
+    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
+    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
+    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
+    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
+    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
+    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
+    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
+    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
+    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
+    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
+    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
+    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
+    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
+    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
+    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
+    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
+    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
+    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
+    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
+    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
+    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
+    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
+    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
+    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
+    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
+    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
+    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
+    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
+    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
+    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
+    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
+    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
+    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
+    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
+    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
+    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
+    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
+    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
+    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
+    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
+    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
+    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
+    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
+    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
+    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
+    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
+    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
+    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
+    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
+    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
+    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
+    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
+    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
+    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
+    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
+    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
+    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
+    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
+    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
+    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
+    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
+    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
+    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
+    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
+    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
+    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
+    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
+    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
+    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
+    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
+    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
+    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
+    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
+    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
+    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
+    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
+    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
+    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
+    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
+    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
+    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
+    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
+    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
+    (data "00 00 49 45 4E 44 AE 42 60 82 ")
+    )
+  )
+  (bitmap (name "") (pos 378.239 121.902 ltcorner) (scale 1) (repeat 2) (incrx -10) (incry -10)
+  (pngdata
+    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
+    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
+    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
+    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
+    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
+    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
+    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
+    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
+    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
+    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
+    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
+    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
+    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
+    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
+    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
+    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
+    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
+    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
+    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
+    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
+    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
+    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
+    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
+    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
+    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
+    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
+    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
+    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
+    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
+    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
+    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
+    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
+    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
+    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
+    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
+    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
+    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
+    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
+    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
+    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
+    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
+    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
+    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
+    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
+    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
+    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
+    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
+    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
+    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
+    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
+    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
+    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
+    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
+    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
+    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
+    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
+    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
+    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
+    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
+    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
+    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
+    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
+    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
+    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
+    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
+    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
+    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
+    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
+    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
+    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
+    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
+    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
+    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
+    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
+    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
+    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
+    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
+    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
+    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
+    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
+    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
+    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
+    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
+    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
+    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
+    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
+    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
+    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
+    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
+    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
+    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
+    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
+    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
+    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
+    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
+    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
+    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
+    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
+    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
+    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
+    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
+    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
+    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
+    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
+    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
+    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
+    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
+    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
+    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
+    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
+    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
+    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
+    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
+    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
+    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
+    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
+    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
+    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
+    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
+    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
+    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
+    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
+    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
+    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
+    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
+    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
+    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
+    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
+    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
+    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
+    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
+    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
+    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
+    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
+    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
+    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
+    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
+    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
+    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
+    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
+    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
+    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
+    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
+    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
+    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
+    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
+    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
+    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
+    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
+    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
+    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
+    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
+    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
+    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
+    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
+    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
+    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
+    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
+    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
+    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
+    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
+    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
+    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
+    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
+    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
+    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
+    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
+    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
+    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
+    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
+    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
+    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
+    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
+    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
+    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
+    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
+    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
+    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
+    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
+    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
+    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
+    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
+    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
+    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
+    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
+    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
+    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
+    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
+    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
+    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
+    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
+    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
+    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
+    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
+    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
+    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
+    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
+    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
+    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
+    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
+    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
+    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
+    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
+    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
+    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
+    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
+    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
+    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
+    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
+    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
+    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
+    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
+    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
+    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
+    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
+    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
+    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
+    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
+    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
+    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
+    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
+    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
+    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
+    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
+    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
+    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
+    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
+    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
+    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
+    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
+    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
+    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
+    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
+    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
+    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
+    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
+    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
+    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
+    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
+    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
+    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
+    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
+    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
+    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
+    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
+    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
+    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
+    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
+    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
+    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
+    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
+    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
+    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
+    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
+    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
+    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
+    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
+    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
+    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
+    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
+    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
+    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
+    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
+    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
+    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
+    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
+    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
+    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
+    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
+    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
+    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
+    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
+    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
+    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
+    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
+    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
+    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
+    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
+    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
+    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
+    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
+    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
+    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
+    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
+    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
+    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
+    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
+    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
+    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
+    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
+    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
+    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
+    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
+    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
+    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
+    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
+    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
+    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
+    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
+    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
+    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
+    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
+    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
+    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
+    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
+    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
+    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
+    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
+    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
+    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
+    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
+    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
+    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
+    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
+    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
+    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
+    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
+    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
+    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
+    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
+    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
+    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
+    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
+    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
+    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
+    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
+    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
+    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
+    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
+    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
+    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
+    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
+    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
+    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
+    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
+    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
+    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
+    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
+    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
+    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
+    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
+    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
+    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
+    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
+    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
+    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
+    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
+    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
+    (data "00 00 49 45 4E 44 AE 42 60 82 ")
+    )
+  )
+  (rect (name "") (start 105.189 102.8522) (end 54.389 90.1522))
+  (line (name "") (start 105.189 71.1022) (end 54.389 71.1022))
+  (tbtext "Standard text" (name "") (pos 105.189 58.402))
+  (tbtext "Text" (name "") (pos 0 0))
+  (bitmap (name "") (pos 35.339 83.8022) (scale 1)
+  (pngdata
+    (data "89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 40 00 00 02 24 08 02 00 00 00 21 F1 BA ")
+    (data "EC 00 00 00 03 73 42 49 54 08 08 08 DB E1 4F E0 00 00 00 09 70 48 59 73 00 00 0E 74 00 00 0E 74 ")
+    (data "01 6B 24 B3 D6 00 00 20 00 49 44 41 54 78 9C ED 9D 79 5C 15 D7 FD F7 BF 33 77 5F D9 37 05 44 16 ")
+    (data "41 76 45 11 14 89 22 22 8A 89 49 D4 A8 25 36 9B 69 9A 9F 4F D3 FE FA B4 E9 92 34 26 6D FA FA F5 ")
+    (data "F5 34 49 7F AD CD 93 C4 AA 49 F3 8B 35 5A 8D BB A2 80 E0 12 59 C4 05 05 04 44 56 D9 D7 CB DD B7 ")
+    (data "99 E7 8F C1 2B 5E EE CC 9D B9 0B 13 9F DC F7 2B AF BC 70 E6 DC 33 DF CF 9C FD 9C EF 9C 83 8C 8D ")
+    (data "8D C1 E3 0C CA B6 01 CE E2 11 C0 36 1E 01 6C F3 D8 0B E0 D2 09 84 99 4D 9A F1 01 E5 58 8F 51 AF ")
+    (data "C6 CC 46 BB E1 25 DB 8E 58 5D 51 EF 7E 86 A6 41 28 87 C7 13 48 E4 BE 33 C5 B2 00 04 B5 6F 9E DD ")
+    (data "10 B8 62 B8 73 B4 EF 2E CD C7 3B 0F 66 36 EA 35 63 83 9A 31 00 F0 0B 8E 95 F9 85 02 20 14 E1 A9 ")
+    (data "B3 10 3E D0 55 37 9D D6 5B 31 DC D7 34 D8 75 1B 00 A7 08 43 25 40 31 DC A9 19 EF 77 B5 55 CC 50 ")
+    (data "8F 0F 8C 8F DC A7 08 40 9A 85 30 B3 C9 E6 BB C7 71 FC 74 E9 B5 7B ED BD 56 D7 7D BC A5 EB 0B 16 ")
+    (data "8B 45 02 C7 0C A5 60 A4 B7 49 EA 1D 82 92 94 07 D2 14 D0 28 07 6C 5E 57 AA B5 F5 4D 9D 3A BD D1 ")
+    (data "EA BF DE FE D1 D6 0E 77 25 97 56 39 44 76 8B 54 80 72 B4 C7 E6 75 99 44 1C 15 11 32 F5 BA 8F 97 ")
+    (data "34 22 2C D0 01 E3 E8 A0 22 31 06 28 B2 90 49 AF B6 79 1D 41 60 7D 41 A6 C1 68 C2 B0 87 65 0B 45 ")
+    (data "10 3E 9F 56 8D EC 18 06 9D 92 EC 16 E9 53 CD 94 F5 3D 9F E7 46 73 A7 42 61 CC 63 DF 12 7B 04 D8 ")
+    (data "02 97 0B 29 FE E9 5A DC 92 95 35 1F AD 06 80 F7 FF F2 35 00 BC FD 9F 9B DD F1 08 0B 9E 2C C4 36 ")
+    (data "1E 01 6C F3 D8 0B 70 57 83 6A 36 63 5A AD 16 00 30 0C 47 D1 47 46 24 92 9F 9E 02 B5 81 E2 B7 B8 ")
+    (data "94 AF F9 EF 02 9A 0F 72 4F 3B 80 E3 1F FC FD 5F 7D 7D 7D 7D 7D 7D 1F EF 39 8C E3 8F 8E 48 28 AD ")
+    (data "07 00 44 65 27 C0 23 81 C9 A6 16 DB EB 4B E8 C7 62 45 43 53 FB 87 1F EF B7 FC 73 C6 8C 19 02 C1 ")
+    (data "C3 71 C2 7F D5 DB 1F 33 FC 26 41 6F 75 65 F7 EE DD 36 43 7A CA 80 2D E2 62 C2 E3 63 23 1A 9A DA ")
+    (data "01 20 69 6E E4 4F 7F FC 1C 82 4C 2A 06 53 E6 2C A6 42 BF FD 76 4B 0A A0 28 FA B3 1F 6F 0A 0E 0E ")
+    (data "0E 0E 0E 7E E3 B5 47 AD 07 C0 A5 7C EA 9F DB 0D 30 19 77 D5 42 1C 0E 2A 12 89 00 C0 AA 0A 02 00 ")
+    (data "FA 35 0C 1D DC 38 2E D1 EB AD 0B A2 3B 70 81 80 AA 9A FA 92 0B 35 4B 32 92 97 2D 99 47 5C 19 1D ")
+    (data "53 1E 3C 7A BE A7 A7 87 C3 E1 38 1F 3F 35 2E 10 B0 FF 9B 12 A5 4A D3 D9 DD 9F 9D 99 02 00 25 17 ")
+    (data "6A 8E 9D BE A4 D3 1B F8 7C 5E FE 8A 0C E7 E3 A7 C6 05 02 F4 06 23 00 98 4C E6 C6 E6 8E 03 47 4B ")
+    (data "EF F7 0C 02 40 4A 62 F4 0F D6 AF F4 F7 F3 76 3E 7E 6A 5C 59 06 3E FA E4 00 8E E3 81 FE 3E 3F D8 ")
+    (data "B0 32 29 3E CA 85 31 53 E0 02 01 96 F9 15 0E 07 5D B3 32 73 CD CA C5 3C AE 75 D6 2F BF 52 77 FB ")
+    (data "4E FB E4 3E 05 82 20 3E 5E D2 27 F3 16 7A C9 25 CE 3C DD 25 29 30 61 D6 3B BF 7C 69 66 48 C0 D4 ")
+    (data "DB 7A BD B1 FA 46 F3 D4 EB 5A DD 48 7D 53 D7 E2 85 71 CE 3C DB 05 0D 19 8A 4E 44 12 40 92 E3 F9 ")
+    (data "7C 6E 54 44 F0 D4 EB 02 3E 2F D2 D6 75 46 90 A6 00 31 24 B7 49 7F 7F BF 46 A3 A1 FF 0C 04 41 D6 ")
+    (data "17 2C D6 1B 8C 56 BD 52 1E 97 C3 E1 38 FB 06 A7 6F 82 4D C0 E7 B9 23 5A 52 01 F4 BB 53 AF FF E2 ")
+    (data "03 83 C1 CE BA 53 D1 F9 EB B7 1B 3B AC 07 06 93 08 F4 F7 DA F2 4C B6 03 22 5D 50 06 30 0C 23 FE ")
+    (data "68 69 B5 BD 12 61 36 63 D4 D6 03 C0 C0 90 E2 7E 0F E9 1C 3A 05 2E 10 60 E9 6C 7E F4 C9 81 5D 5F ")
+    (data "1E 1F 53 28 01 80 73 BD 97 73 7B 62 B9 80 C3 41 D3 92 A3 B8 E4 DD 0A 14 45 43 43 FC C2 66 DA A8 ")
+    (data "C1 EC E2 82 32 60 11 20 E0 F3 AA 6A EA 6F DC 6A 7E 6A E9 A2 F5 55 3A 2C 44 6A 4E 0A 22 6E E5 64 ")
+    (data "25 E7 64 25 3B FF AC A9 B8 72 3C F0 F6 2F 5E 4C 4B 89 35 18 8C B2 A3 8D C8 80 0A BD DD 8F 76 B8 ")
+    (data "DD 15 86 54 00 87 43 B7 3C 11 6B 05 28 8A 06 FA FB FC C7 2B CF EE 78 FA A9 65 A8 2F 00 20 18 6E ")
+    (data "BC D2 EE 0A 23 A9 8C 21 15 C0 15 4A 69 C6 BE 71 5D 4E 48 B0 FF C6 75 CB 89 4A 3D B6 56 21 40 26 ")
+    (data "A2 95 B4 8D 33 B1 93 14 BE 50 46 76 8B B4 0C C8 7D 66 0C AA 47 E9 C4 9E 95 91 9C 95 31 91 BF D1 ")
+    (data "3E 15 C6 47 F1 F9 33 00 87 BA 8E 1E AD 72 38 09 C7 01 A1 5A A9 A6 83 C4 DB C6 AA 1C 01 A9 00 B1 ")
+    (data "CC 91 3A 01 0B 96 EA B7 4F 8C 01 BE FE CB D7 00 90 E4 B4 F5 00 20 91 93 2E 1F 92 66 21 04 E5 FA ")
+    (data "05 C7 3A FF 6C E7 F1 0D 99 83 A0 E4 55 30 C5 2F 65 7E A1 14 D2 A7 07 89 57 B0 DC 37 8C 22 00 75 ")
+    (data "35 8A 04 84 25 F9 86 B0 96 0E BE C1 B1 01 A1 09 D4 CE 1E 76 1B 32 44 EE 1B 26 F5 0E D1 2A 87 C6 ")
+    (data "47 BB 4D 3A 15 F5 F2 AB F3 70 38 3C BE 50 26 F1 0E 91 C8 03 29 72 CE 43 FB 3C 6E 97 2C E3 11 C0 ")
+    (data "36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C F3 FD 13 A0 56 AB 4B 4B 4B BF 3B 9D 70 C6 ")
+    (data "E3 81 33 67 CE 1C 3E 7C 58 2C 16 6F D9 B2 25 33 33 D3 4D 66 D1 87 71 0A 18 8D 46 00 D0 68 34 7B ")
+    (data "F6 EC F9 F8 E3 8F C7 C7 5D 33 F3 E3 30 0E 96 01 FF A0 19 7C BE E0 C6 8D 1B EF BC F3 CE D5 AB 57 ")
+    (data "5D 6B 13 23 1C 14 10 1C 1A B1 E6 B9 97 67 CE 8A 52 A9 54 9F 7D F6 D9 CE 9D 3B D9 2A 15 8E D7 42 ")
+    (data "42 B1 64 E9 AA 67 96 E4 3E C9 E3 0B 6A 6B 6B DF 7B EF BD 6B D7 AE B9 D0 32 9A 38 5B 8D 86 45 C6 ")
+    (data "AE DE F0 42 70 E8 2C A5 52 F9 C9 27 9F 7C FA E9 A7 2A 95 CA 25 96 D1 C4 05 ED 80 58 2A 7F 62 F5 ")
+    (data "86 85 D9 79 3C 1E BF A6 A6 E6 9D 77 DE B9 71 E3 86 F3 D1 D2 84 AA 1A FD D3 9F FE D4 D2 D2 62 F3 ")
+    (data "D6 AC E8 B9 99 39 D6 5E 33 6A D5 78 75 79 51 7F 4F 27 00 2C 58 B0 E0 F9 E7 9F 97 4A E9 4E 71 3B ")
+    (data "8C 2B 5B 62 89 54 BE AC 60 E3 C2 EC 3C 2E 97 57 53 53 B3 63 C7 8E 9B 37 6F BA 30 7E 9B 30 6E C8 ")
+    (data "8E 1F 3F 7E FC F8 F1 C4 B4 C5 89 69 8B C9 C2 A8 95 8A AA 0B 45 03 3D 5D 00 B0 60 C1 82 AD 5B B7 ")
+    (data "4A 24 4E F9 13 50 E0 D4 1A D9 C9 4E AC B4 07 33 3F BA FA C8 47 91 CD 51 F2 E5 05 CF B5 36 DD BE ")
+    (data "7E E5 7C 4D 4D 4D 4B 4B CB D6 AD 5B 53 52 52 9C B2 94 04 A7 B2 50 79 2F 6E 9E B2 76 6A C0 F0 2B ")
+    (data "FD 18 82 20 51 71 C9 AB 37 BC 18 18 12 36 36 36 B6 73 E7 CE 3D 7B F6 E8 74 3A 67 1E 67 13 A7 04 ")
+    (data "2C 0B 41 38 53 66 8E F9 28 B2 38 68 22 5A A9 DC 3B E7 C9 E7 16 66 E7 71 B8 BC 8A 8A 8A 1D 3B 76 ")
+    (data "DC B9 73 C7 99 27 4E C5 A9 2C B4 36 1C 5D 1B 6E F7 15 20 51 71 C9 01 41 33 AB 2E 14 0D 0F F4 7E ")
+    (data "F4 D1 47 4B 97 2E DD B4 69 D3 64 57 58 67 98 A6 F1 80 DC C7 6F C5 53 5B 52 D2 B3 11 14 BD 78 F1 ")
+    (data "E2 3B EF BC D3 D8 D8 E8 92 98 A7 6F 40 83 A2 E8 DC D4 F4 55 CF 6E F5 0D 08 1E 1E 1E FE F0 C3 0F ")
+    (data "BF FC F2 4B E7 3D 1B A7 7B 44 E6 E5 E3 9F BB EE 07 29 E9 D9 08 82 5C BC 78 F1 DD 77 DF 6D 6E B6 ")
+    (data "E1 0B 45 1F 16 86 94 0F 92 E2 87 BE FE 41 83 83 83 7F FE F3 9F BF FC F2 4B 83 81 81 C7 FA 23 B1 ")
+    (data "B9 D6 38 FA 78 F9 FA AF 7C BA D0 92 14 3B 76 EC 70 2C 29 A6 F5 8B 42 2B 10 14 9D 9B 9A 1E 34 33 ")
+    (data "BC AA BC 88 48 8A A9 2E 39 D1 D1 D1 BF FE F5 AF 29 22 79 EC 67 25 D8 4C 01 1C C3 1A 6F D5 DC AE ")
+    (data "B9 8C 61 58 40 40 C0 CB 2F BF 1C 13 13 C3 34 12 D6 04 28 46 86 AA CA CF 8C 0C F5 23 08 92 9D 9D ")
+    (data "BD 79 F3 66 3E 9F 81 D7 BD 05 D7 08 38 D9 89 9D EF C5 72 42 E8 34 CC 80 61 58 D3 A4 17 FF D2 4B ")
+    (data "2F CD 99 33 C7 E1 47 BB 46 00 D1 27 2D ED C1 EC 0A 50 8C 0E 55 95 17 8D 0C F6 39 F9 E2 2D B8 46 ")
+    (data "00 D1 27 9D DA 33 9D CC C4 8B BF F6 2D 66 36 FB F9 F9 BD F4 D2 4B 71 71 4E F9 EC 12 B8 78 3C F0 ")
+    (data "46 85 89 83 C0 8A 19 D6 79 69 7C 74 98 E8 CC 11 2F DE 85 9D 39 A7 04 D8 1C 0F 98 71 28 EF C5 D7 ")
+    (data "86 5B 2E E0 F7 1A 6F DF A8 28 33 19 8D 7E 7E 7E 2F BE F8 E2 DC B9 73 9D 79 A8 15 4E 09 58 16 82 ")
+    (data "94 F6 58 6B E0 20 B0 2C 64 62 94 A0 1A 57 54 5F 28 1A E8 ED 02 80 CC CC CC C2 C2 42 A1 D0 C5 1F ")
+    (data "47 BB 66 3C F0 46 85 89 B8 F2 B7 CC 89 08 71 1C 27 86 94 66 93 C9 DB DB DB 7D 43 4A 2A 01 14 D3 ")
+    (data "2A 4A C5 23 EE 74 42 14 74 18 08 1F 64 FB C7 66 50 6F E1 B9 28 F4 72 1F 9E 15 8C 10 2F FE C6 95 ")
+    (data "32 93 C9 E8 E5 E5 B5 75 EB D6 D4 D4 54 97 3C 82 0C 57 4E AB B0 32 B1 E5 9A 14 20 5E FC CD 8A 72 ")
+    (data "A3 D1 20 97 CB B7 6E DD 3A 6F DE 3C 97 C4 6C 17 17 08 50 2B C7 AF 5E 3A DB 77 BF 03 A6 F1 C5 5B ")
+    (data "70 56 40 57 6B 53 F5 C5 73 46 83 5E 2E 97 17 16 16 A6 A5 A5 B9 C4 2C FA 38 2E 40 A7 51 5F BD 74 ")
+    (data "AE BB E3 1E 00 2C 58 B0 A0 B0 B0 50 26 23 75 10 76 1F 0E 0A E8 BB DF DE 7C FB 9A C1 A0 97 4A A5 ")
+    (data "85 85 85 0B 17 2E 74 AD 59 F4 71 50 C0 50 7F 0F 00 CC 9B 37 6F EB D6 AD 72 B9 DC A5 26 31 83 B1 ")
+    (data "00 1E 8F 07 00 DF 9D 65 56 C6 02 B2 B3 B3 F9 7C 7E 5A 5A 9A B7 B7 DB BF 93 A4 83 C7 F1 95 6D 3C ")
+    (data "02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 3C 02 D8 C6 23 80 6D 1E 7B 01 B4 C6 03 15 6D 15 FB AE EE ")
+    (data "43 85 E8 98 76 EC F8 D5 E3 00 90 3F 3F 1F 00 8A AE 17 59 FD 4D 40 5C 21 98 7C DD EA 96 4D F8 1C ")
+    (data "BE B7 C8 3B 21 28 61 59 E4 B2 D8 00 FB 1F 11 DA 11 A0 D4 29 B7 1F D8 7E FC F6 43 A3 DD 8D C1 6C ")
+    (data "18 50 0D 0C A8 06 CA EE 95 65 84 67 BC B6 E8 35 11 4F 44 11 9E 4A 80 52 A7 CC FF 38 BF BE B7 DE ")
+    (data "D5 46 D2 A5 B2 B3 B2 77 BC F7 DD 95 EF 52 68 A0 2A 03 DB 0F 6C 67 D1 7A 82 8E B1 8E 5D 55 BB 28 ")
+    (data "02 90 0A A8 68 AB 20 72 0E EB 54 74 56 34 0D 36 91 DD 25 15 F0 55 F5 57 EE B1 C7 11 2E B4 5E 20 ")
+    (data "BB 45 2A E0 DB D6 6F DD 63 8C 23 34 0C 34 90 DD 22 15 D0 A7 E8 73 8F 31 8E 30 AC 19 26 BB 45 2A ")
+    (data "40 67 72 BD 83 1E 00 34 77 3B E2 92 62 24 FF 0A 7B BA 5D 0D 5A FB 5B 51 14 8D 0E 89 9E 7C 51 A3 ")
+    (data "D7 0C 28 06 46 55 A3 06 93 C1 60 32 F0 B9 7C 3E 97 EF 23 F5 09 F4 0A 14 0B C4 D4 11 BA 5D 40 88 ")
+    (data "4F 48 EF E8 23 5B E5 B7 F4 B6 00 80 45 43 63 77 63 7B 7F FB E4 00 6A 50 03 40 FF 58 7F E3 FD 46 ")
+    (data "3F B9 5F 52 78 92 90 4F BA B6 E9 16 01 38 E0 C8 83 2F F9 93 67 27 03 C0 54 0D 84 0C BB 0C 8F 0F ")
+    (data "57 34 55 64 C6 92 4E C2 BA A5 33 57 DB 5A 8B 3F D8 39 0C 01 24 39 22 79 86 EF 0C 87 63 D3 1B F5 ")
+    (data "75 9D 75 64 77 5D 26 80 CF 7D E8 B3 D1 37 D6 F7 88 06 04 49 9A 95 E4 8C 86 A1 71 E6 E7 0F D0 47 ")
+    (data "A5 55 01 40 7A 4C BA 33 1A 78 08 FC 34 00 AE CD 81 DE 04 A8 8C 81 9F 05 D0 CD DC 4E 09 20 2C AE ")
+    (data "BE 5B AD D4 29 A5 22 E9 A2 39 8B 04 BC 87 2E 1C F4 35 A0 00 FF 0A 87 3F 04 43 8C 00 24 28 C4 0B ")
+    (data "E1 F7 C1 70 28 02 A6 FA 35 4F C5 C1 42 AC D2 AA A4 22 69 7A 4C 7A F5 DD 6A 83 C9 70 B5 F9 EA C2 ")
+    (data "39 0B 65 42 19 71 45 6F D4 5B 34 20 6D 48 F2 EC 64 A2 4C 23 08 92 1C 91 9C 1C 61 BD D5 D3 62 AC ")
+    (data "6F 95 F9 26 F0 BD 60 E9 67 30 63 19 F4 7F 0B 65 2F E5 C8 C6 37 78 C1 01 7B 93 FF 8C 53 C0 E6 5B ")
+    (data "27 34 28 75 4A 89 50 92 1E 93 3E 39 1D 7A 47 7B 6F B5 DD C2 29 8F 62 49 C2 87 01 00 E6 BE 0A E1 ")
+    (data "6B 80 2B 86 99 2B 21 E1 75 00 C8 A5 B1 68 C8 40 C0 E4 BC 3E D5 62 6A 0D 93 F3 92 2D 23 88 7D D2 ")
+    (data "26 E5 18 DC 0C 00 3A CC A5 02 EC BE 75 0A 0D 56 E5 C1 8A 5A C4 1F 00 A0 E1 33 E8 3C 05 26 35 74 ")
+    (data "9E 86 FA 4F 00 E0 3C 8D EF A1 48 97 98 BC 7F 61 63 09 8C CF E5 13 79 5D AD 53 13 79 9D CE 15 FB ")
+    (data "46 20 70 60 16 E4 3F 9A 61 4E 8E 43 61 27 58 3C 61 C7 3E B0 6D 27 B3 32 40 E7 AD 13 57 54 5A 95 ")
+    (data "44 28 59 18 4D 6B FD 18 C7 61 4B 07 FC AE 0F 1A 74 30 66 86 66 3D FC AE 0F B6 4E B2 9E 02 C6 85 ")
+    (data "98 A6 86 EA BB D5 00 20 15 D1 75 9A 30 E3 F0 D7 41 C8 B8 0B E1 0D B0 A0 19 FE 3A 68 C7 85 D0 71 ")
+    (data "01 14 1A 26 BF 75 83 C9 41 6F 74 9B F8 CB FD C9 6E 31 68 07 04 08 98 71 20 7C CB 6C D6 FD D5 77 ")
+    (data "AB 73 92 73 C8 DE 7A 74 48 B4 55 2F 1A 00 EA 3A EB EE 0F 51 9D 15 05 00 42 9E 30 71 56 22 D9 5D ")
+    (data "5A 29 F0 9C 37 54 CD 81 FE 44 18 48 82 A3 11 90 28 7C A8 81 FE 5B 9F 6A 3D 00 24 84 25 50 F7 91 ")
+    (data "FC E5 FE 19 71 19 42 9E 13 DD E9 ED FE F0 5F C4 2E 6F 1C 01 6A 36 E4 C8 F0 12 09 E4 DD 83 5B 3A ")
+    (data "20 F2 3A C5 5B B7 0B D1 36 47 87 44 0F 28 06 C6 D4 63 7A 83 DE 88 19 79 28 4F C0 17 78 4B BC 9D ")
+    (data "1A D0 10 F3 70 32 30 BE 67 2C 07 30 0B B2 3E E0 CF FB 19 AE 1B D1 9D DB 2A EE 38 FB 7E 08 3C D5 ")
+    (data "06 E0 A2 BC 2E 16 88 23 02 23 1C FB AD 9D 2C 34 07 1F E5 83 19 F5 4B E4 CF FF DF 80 70 10 51 80 ")
+    (data "20 FB AF 00 90 25 A5 D5 D3 9A 06 EC 64 21 0C 47 00 00 CC 3A C0 31 20 76 50 34 EB 00 40 87 01 8D ")
+    (data "66 9E 0A 9D 51 57 DF 51 3F AC 1A 26 F6 5B 9D 3A 1F 8C A2 A8 9F CC 2F 21 3C 81 A2 00 80 DD 14 68 ")
+    (data "40 7D 35 C0 C5 C6 5A 74 65 FF 81 29 3B CC FD 57 75 25 AF 00 40 89 92 56 2B 43 41 7D 47 FD E0 F8 ")
+    (data "A0 65 B7 D8 A9 60 18 36 A8 18 AC EF B4 33 B7 49 9A 02 96 69 71 DC 0B BE 08 07 A8 FB CC 58 F7 19 ")
+    (data "71 A5 DB 08 6F 5B 9F 68 C7 98 61 D5 30 00 2C 97 F2 FF 18 22 0B E2 A2 A0 9D F4 39 FB DC 80 3E 13 ")
+    (data "F6 56 AF B2 5C 65 18 56 92 CE 08 11 D8 AF 46 8F 2B 60 E5 3D 38 AE 80 76 03 34 E9 E1 D3 21 78 A2 ")
+    (data "05 3A 1F CC D3 48 69 EF EA 69 05 F1 EE DF 27 AC 9F 42 30 17 7D 3F 58 06 93 36 F4 25 83 56 43 76 ")
+    (data "4D 03 CF 77 DA B8 3E D3 77 66 7C 78 3C 3C E8 69 33 82 C8 F4 C1 5A D2 7D 04 42 78 28 9D 15 09 07 ")
+    (data "47 64 1C 84 13 17 16 17 E6 1F 06 00 3D C3 3D F5 5D F5 E0 44 6A 38 83 23 02 24 42 49 6A 64 AA 4C ")
+    (data "28 33 E3 E6 E6 FB CD 1D 83 1D C0 3C 35 88 32 D6 17 E3 17 6C 2B 0B 01 40 AF 11 2B BA F3 70 09 8B ")
+    (data "0C C6 02 08 43 39 28 47 AD 53 DF 6C BD A9 D4 29 1D 4B 0D 14 45 31 0C 7B AB 57 F9 C7 10 D9 54 0D ")
+    (data "BD 46 EC AD 5E 25 4C DA D8 DD 05 02 A6 1A 6A C6 CC 0E A7 86 9F CC 6F 50 31 58 AE 32 2C B9 3B 0C ")
+    (data "E4 EB 82 7E 32 3F 97 09 C8 8C CB 94 8A A4 66 CC DC D0 D9 D0 3D D2 0D B4 53 03 45 D1 D8 99 D6 EB ")
+    (data "8D 09 E1 09 F5 9D F5 C3 CA 61 B2 7A 86 68 C8 12 C3 49 FB A1 8C 05 10 3D B6 8A C6 0A 95 4E 45 3F ")
+    (data "35 24 02 49 4A 64 8A 5C 64 ED 1C 2B E4 09 D3 A2 6C 3B 5A 33 5A 0E 25 15 20 E4 0A 6D 2E 11 A8 74 ")
+    (data "2A A0 97 1A 00 10 E4 1D 94 34 2B 89 CB 71 76 0A 99 47 BE EF 34 69 D4 21 5E 21 6D C3 6D 64 77 ED ")
+    (data "A6 06 91 6D 66 05 CC 72 CE F2 09 FC C4 A4 25 81 54 40 56 54 16 85 00 02 B2 D4 90 08 25 A9 B3 53 ")
+    (data "65 22 AA 79 29 AB CE DC 54 26 77 E6 12 82 12 C8 E2 21 AD A4 0A D3 0B A9 AD B7 60 49 0D C2 FA 19 ")
+    (data "7E 33 16 C7 2D A6 B6 1E 18 76 E6 B2 67 67 93 05 23 4D 81 8C 88 8C A7 53 9E 3E 5A 7B D4 AE 00 02 ")
+    (data "22 35 00 20 79 16 AD 5D EE AD 3B 73 8F 32 B9 33 97 39 2B 93 C2 69 82 AA 99 D8 B9 71 67 E2 0C 3B ")
+    (data "B5 98 C3 D0 EC CC 25 04 27 BC B6 E8 35 8A 78 28 37 CE 16 CA 8A B6 17 3D 93 42 F7 80 73 07 20 EB ")
+    (data "47 00 40 08 0F 5D 9F BA FE CC F6 33 42 2E D5 80 C6 4E 05 27 15 48 3F DF FA F9 6B 59 AF FD AB E6 ")
+    (data "5F 88 00 19 D1 8E 38 68 29 7D 38 02 8E 24 98 1B 92 21 88 79 76 4F D0 7C BB C1 3D EE F7 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 8C 67 6C 5E FA A6 AD AA 4B ")
+    (data "6D 75 31 29 48 B4 7F 53 14 71 12 31 0E F0 E2 A1 B6 AB DD D6 61 16 86 4A BE 58 3F 9B 58 58 C3 70 ")
+    (data "D8 72 E0 DE ED 7E AD 55 98 45 61 92 CF 9F 9D CD C8 1E C6 29 30 D5 7A 00 B8 DD AF D5 18 27 E6 17 ")
+    (data "0C 26 6C AA F5 00 70 F5 BE DA 60 9A 08 A3 31 62 53 AD 27 8B 9C 9A C7 3E 0B 3D F6 02 68 8D 89 27 ")
+    (data "6F 73 73 25 E9 67 36 C3 2C 6A F8 84 63 D6 03 00 86 70 2A 13 7F 62 33 4C 46 DD 4E 14 37 03 80 99 ")
+    (data "23 A8 8A 7F DD 66 98 C5 B7 FF 9B F8 C3 EE 16 79 04 B4 52 80 6C 93 1E B7 42 F3 A1 0C 6A A1 CD 3F ")
+    (data "FA 05 00 5C 79 B0 17 92 15 EB 5F FC 89 90 03 00 60 C2 A0 B2 CA 76 98 E7 5E F9 4F 62 1E 48 67 86 ")
+    (data "AA 6A DB 61 88 A7 7C BD EB 03 9A 56 3D F6 65 C0 23 80 6D 3C 02 D8 86 B1 80 44 1F 44 C4 01 AB FF ")
+    (data "22 65 88 E0 C1 F9 7F 1C 14 A2 BD 6C F8 12 85 49 10 CB 79 D6 02 0E CC 14 DB 08 13 CE 7C A9 9F 71 ")
+    (data "67 EE 47 71 76 4E 2A 44 00 DE 88 B7 1F E6 57 29 F6 4F 3C A4 03 AD 14 20 4E 20 1E 19 EA 77 C9 23 ")
+    (data "5D 0B 2D 01 4B 96 2C 01 80 8B 45 DF 68 54 2C 9F 79 32 15 5A 02 9E 7F FE F9 B8 B8 38 9D 46 7D F9 ")
+    (data "DC 31 77 1B C4 14 5A 02 B8 5C EE F6 ED DB E1 3B 99 8B E8 D6 42 22 11 D5 57 C9 2C F2 FD 6B 07 BE ")
+    (data "6B 7C 6F 04 68 B5 36 C6 E0 DF 05 68 09 30 99 4C 1F 7F FC 31 00 F8 FA 07 B9 D9 1E C6 D0 12 F0 D5 ")
+    (data "57 5F 35 36 36 0A C5 92 AC BC 75 EE 36 88 29 B4 04 7C FB ED B7 00 90 9D FF AC 58 CA E6 AE 84 36 ")
+    (data "A1 25 80 D8 55 FF 3B 98 7F C0 81 DE E8 DF 1B CC CD 0A 6B BF EF 59 52 E4 E7 49 13 FE F8 38 C0 CE ")
+    (data "7A 73 CB F8 94 93 04 BC 90 9F C4 3F F4 D9 B7 1B 0F 4D 18 57 A3 53 9F 0A 00 1D 2A 5C 6F 9E F8 DB ")
+    (data "8C C1 54 EB 01 A0 45 81 9B 27 79 37 D9 8D 87 26 DF 9B 76 E0 3B 8B 47 00 DB 3C F6 02 18 54 A3 13 ")
+    (data "F3 95 24 B3 D3 87 BF D8 69 99 9D 06 92 D9 E9 83 7B FE 42 CC 4E D3 89 87 26 B4 52 20 3A DA C6 47 ")
+    (data "78 EE 86 E6 43 19 FB CC C5 FF D5 F6 16 0F D5 AF C7 4B F9 28 00 E8 4D D8 BC 8F 6D 6F 46 73 63 7B ")
+    (data "BC E0 81 9B A2 DD 78 68 F2 D8 97 81 C7 5E 00 E3 BE D0 B2 D9 B2 EB 3D 1A AB 8B D1 7E 42 31 6F E2 ")
+    (data "5D F0 B9 E8 C2 50 C9 D5 FB D6 EB 8D 09 81 22 FE 24 37 57 BB F1 D0 C4 E3 37 CA 36 1E 01 6C E3 11 ")
+    (data "C0 36 1E 01 6C E3 11 C0 36 1E 01 6C E3 11 C0 36 1E 01 6C 43 6B 40 63 34 1A 6F DF BE 7D F9 F2 E5 ")
+    (data "F6 F6 F6 F1 F1 87 6B DD AF BE FA 2A F1 C7 3F FE F1 8F A9 BF A2 BE 4B 86 5C 2E 8F 8C 8C 5C B2 64 ")
+    (data "49 62 62 22 71 68 0F 35 F6 05 54 56 56 EE DD BB D7 EE 06 15 AE 62 7C 7C FC E6 CD 9B 37 6F DE 44 ")
+    (data "51 74 DB B6 6D E9 E9 E9 D4 E1 ED 08 D8 BF 7F 7F 69 69 A9 EB CC 63 00 86 61 BB 76 ED 6A 6D 6D DD ")
+    (data "BC 79 33 45 30 2A 01 95 95 95 36 AD 7F FE F9 E7 AD D6 BD 5F 7D F5 55 AD 56 FB D5 57 F6 37 4A 9E ")
+    (data "FA 5B 00 A0 F8 6D 49 49 49 54 54 14 C5 69 5B A4 02 8C 46 E3 DE BD 7B 6D DE B2 B9 6A 4F 73 29 9F ")
+    (data "EC B7 96 02 33 15 1C C7 B5 5A 2D 59 FC A4 B5 50 6D 6D ED B4 E5 7B 6A 70 1C 1F 18 18 20 BB 4B 2A ")
+    (data "E0 CA 95 2B EE B1 C7 11 14 0A 05 D9 2D D2 2C D4 DE DE 4E 76 CB 66 82 6A 34 8F 4C F2 78 79 79 59 ")
+    (data "FE 96 4A A5 2A 95 8A FA B7 FB F6 ED 23 7B 1C 00 78 7B 7B 7F F0 81 6D 57 58 D2 79 A1 6D DB B6 51 ")
+    (data "C4 48 8D 97 97 D7 BA 75 EB 2C E7 DF 1A 0C 86 C3 87 0F 5B 34 38 C6 EE DD BB 6D 5E 77 4B 4B 9C 92 ")
+    (data "92 32 F9 F4 5E 3E 9F EF BE F3 41 DD 22 60 EA 61 71 EE 3B 3E CE 2D 02 A6 96 39 8A 52 E8 24 6E 11 ")
+    (data "70 FD FA 75 83 E1 E1 06 7A 7A BD FE D6 AD 5B EE 78 10 38 B6 C3 93 DD D6 54 A9 54 1E 39 72 64 D3 ")
+    (data "A6 4D C4 3F 8F 1C 39 A2 54 2A 69 FE 96 29 A4 02 28 9A 46 9B 58 99 35 B9 D3 6A B1 7E 6A 30 CB 45 ")
+    (data "A6 8F B3 F0 D8 8F 07 1E 7B 01 A4 59 88 62 14 62 33 1F 5B B5 C4 64 38 D6 12 03 C0 A2 45 8B 6C 5E ")
+    (data "77 A4 10 3B 5C E0 9C FC AD 4D 1E FB 2C 34 1D 02 42 42 42 DC 17 B9 1B 05 58 4A 45 7E 7E BE FB 34 ")
+    (data "D8 11 10 1E 1E 9E 94 94 14 1A 1A EA 40 D4 27 4F 9E 54 AB D5 00 C0 E5 72 F3 F3 F3 67 CC 70 FC 00 ")
+    (data "05 0A 48 0B 31 82 20 B9 B9 B9 11 11 11 C4 3F 5B 5A 5A CA CA CA 88 BF 69 B6 A6 0A 85 E2 D4 A9 53 ")
+    (data "05 05 05 12 89 84 CB E5 AE 5A B5 EA EC D9 B3 39 39 39 AE 6D 89 49 C7 03 EF BD F7 5E 7E BE 23 E7 ")
+    (data "77 69 B5 DA 53 A7 4E 8D 8E 8E 12 FF F4 F2 F2 5A BB 76 AD 58 6C 67 F3 62 BB 90 55 A3 A4 59 C8 DF ")
+    (data "9F 74 B3 6D 6A 44 22 51 41 41 81 A5 FF AC 50 28 4E 9E 3C 49 B3 95 70 00 52 01 23 23 8E EF 46 25 ")
+    (data "12 89 D6 AE 5D 6B A5 81 28 0F 2E 87 34 0B BD FA EA AB 39 39 39 91 91 91 C4 3F 5B 5B 5B CF 9F 3F ")
+    (data "4F 78 C0 92 B5 C4 FB F6 ED 0B 0A 0A 5A BD 7A 35 31 25 68 95 97 08 28 7E 4B 6D 28 D9 90 92 6A 4C ")
+    (data "8C 20 48 58 58 98 8F 8F CF F0 F0 70 77 77 37 4E 6F 9F 63 BB 1A 1C C3 91 31 31 8E E3 9D 9D 9D B5 ")
+    (data "B5 B5 F7 EF DF A7 69 3D 00 F4 F7 F7 17 15 15 19 8D 46 78 50 1E 98 DA CA 08 B7 34 64 7D 7D 7D 45 ")
+    (data "45 13 9B 9E BA FB E3 1B 77 B5 C4 7D 7D D3 74 9C 19 AD DE A8 44 22 59 BB 76 AD 5C 2E 07 00 95 4A ")
+    (data "75 E2 C4 09 27 27 79 5C 08 A9 80 17 5E 78 C1 F2 37 8A A2 5C EE 44 48 A9 54 BA 71 E3 C6 A9 D3 A6 ")
+    (data "E3 E3 E3 67 CE 9C D1 E9 DC 72 0C 1B 05 A4 59 88 3F 09 8B F5 04 5C 2E 97 3F 05 7F 7F 7F C7 5A 6E ")
+    (data "27 71 65 19 F0 F3 B3 B3 43 B1 3B 70 A5 00 E2 A3 D7 69 C6 23 C0 2A 3A 7B 1B 75 BB 9C FF 7F 05 70 ")
+    (data "38 8E 7C 32 EE A6 5C 44 31 B9 4D 2A 60 F2 04 3F 7D DC 24 60 F6 6C D2 5D 93 48 05 C8 64 34 4E 33 ")
+    (data "9B 1A 9D 7B B2 10 F1 4D BC ED 27 92 DD 08 0A 0A 72 E0 75 BA 43 00 97 CB 4D 48 60 BE 71 B6 48 24 ")
+    (data "0A 0C 0C 64 FA 30 77 64 A1 6D DB B6 51 38 4D 50 BD B0 F0 F0 70 A2 03 47 1F 97 A7 40 5E 5E DE 82 ")
+    (data "05 0B 28 02 50 F5 46 51 14 8D 8D 8D ED EC EC 1C 18 18 A0 39 A0 71 61 0A 70 B9 DC 6D DB B6 51 5B ")
+    (data "0F 76 BB D3 28 8A 46 44 44 04 05 05 0D 0C 0C 28 14 0A 83 C1 60 36 53 7D 2B E8 7C 0A 78 7B 7B 47 ")
+    (data "46 46 2E 5E BC 38 21 21 81 8E BB 8D E7 FB 01 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 ")
+    (data "60 1B 5A 73 A3 5A AD 96 E8 CC E9 F5 7A 77 FB 62 A2 28 2A 10 08 BC BC BC 02 03 03 E9 CC 6C DB E9 ")
+    (data "CC 61 18 D6 D5 D5 D5 DF DF 4F 7F 7D C0 55 20 08 12 14 14 14 1A 1A 4A 3D BD 40 25 00 C3 B0 E6 E6 ")
+    (data "66 F7 79 8B D9 A5 A2 A2 42 A9 54 BE F5 D6 5B 14 BD 74 AA 32 D0 D5 D5 C5 AE F5 75 75 75 32 99 AC ")
+    (data "AB AB 8B 22 18 A9 00 8D 46 D3 DF CF DA A6 6C D5 D5 D5 75 75 75 89 89 89 99 99 99 FD FD FD 14 AB ")
+    (data "B4 A4 02 06 07 07 A7 3F DF 13 54 57 57 D7 D6 D6 12 D6 03 00 8E E3 83 83 83 64 81 49 05 B0 95 79 ")
+    (data "AC AC B7 6B 0C A9 00 BD 9E C1 EE 14 AE C2 A6 F5 00 30 D9 89 D3 0A D2 76 C0 1D F5 FD 88 4A E7 2B ")
+    (data "15 02 40 73 73 B3 E5 E2 9C 39 73 88 3F C8 AC 07 00 8A 99 04 67 8F FB A3 4F 53 F7 70 79 D1 89 D7 ")
+    (data "5E 79 11 00 2E 5C B8 60 B9 4E 08 F8 A6 E4 DB E1 B6 06 9B D6 53 33 7D 02 CA 2F 5F 41 31 A3 CD 5B ")
+    (data "D5 D5 D5 C3 6D 0D 71 09 49 99 99 19 4C A3 9D A6 BE 50 DB C0 18 3A 6E 7B E5 98 C8 39 3D FE F3 D0 ")
+    (data "98 2C 07 62 9E A6 14 50 6A 0C 93 A7 C8 2D 7F 8F 8E 8E 12 D6 B7 87 3C D1 A6 32 2E 09 60 1C F3 34 ")
+    (data "09 48 8E 08 84 88 5C CB 3F 73 73 73 01 A0 BA BA BA AD AD 8D B0 1E 00 8C B8 23 D3 92 D3 24 60 4C ")
+    (data "AD 1F 1B EC 05 00 C2 87 AD BD BD FD EE DD BB ED ED ED 16 EB 01 C0 5F E0 48 BD 37 4D 65 40 2A E2 ")
+    (data "9D 29 FF B6 B8 B8 98 F8 67 71 71 B1 95 F5 08 40 9A 2F C3 1D DA 00 60 DA 04 70 51 34 2C 71 E2 A3 ")
+    (data "C2 EA EA 6A 00 98 6C 3D 00 2C 09 30 CD 10 7D 87 53 00 00 D6 2E 88 11 46 A6 59 EA 9C C9 D6 C7 C9 ")
+    (data "B1 AD B3 49 DB 5A 6A A6 AF 1D 00 80 58 99 A9 B6 B6 56 15 9C DA 1E 30 61 BD 0F 1F 5B 19 6C CA 0B ")
+    (data "31 32 DB 9F 70 12 D3 27 60 52 4F 61 A1 C2 A8 19 33 20 62 2E F8 0B 30 27 57 44 9C 15 30 AE 52 2B ")
+    (data "15 13 63 BA 99 33 67 92 05 B3 EA E7 78 F1 70 2F 9E 6B FA EA CE 0A 38 78 F4 24 AE 9D F8 DA 84 F8 ")
+    (data "8C A4 5F 0B 41 8F 8E C5 29 7A 69 CE E3 6C 21 B6 58 6F 61 5F 71 B5 7E 52 75 E2 56 EB C1 1D B5 90 ")
+    (data "AC BF 76 EF A5 7B 44 FE 70 B7 F5 E0 7C 16 9A BA 96 1C 18 18 88 2B 1A CA EF F9 4B 86 9B DC 6D 3D ")
+    (data "50 4C AB 54 55 55 39 13 AF CB DF BD 2B BF A1 01 00 95 5A 23 95 88 01 60 F2 70 3B 20 20 80 B8 D2 ")
+    (data "D0 D0 D0 DC DC 3C 10 30 2F 2C 25 1D C0 BD 33 79 8E 08 30 99 4C FB 0F 1D 79 F5 85 42 00 38 7A F4 ")
+    (data "E1 19 D8 44 2D 44 5C E9 F1 9F D7 1E FC C4 5F 9B B0 77 12 B5 32 FB AB BD 8E E3 48 21 FE F6 46 3D ")
+    (data "18 6C 4F D4 58 F5 73 86 F4 E8 A7 2D 42 B3 3B 67 67 18 0B 30 1A 8D 4D 75 B6 BF EC B4 D9 CF 69 50 ")
+    (data "70 0E 76 F0 A9 E3 EC D3 A1 F5 0A 8E C1 A1 46 99 71 16 BA DE D0 E2 23 15 02 4C 9C 9B 6D F1 A5 D2 ")
+    (data "E9 74 53 AD 27 38 D7 C7 0B 93 60 59 01 B6 0F 5F 3A D9 CD FF A6 8B 8B 03 12 20 C0 7F 95 A0 F3 E3 ")
+    (data "33 2B 33 AE A9 85 6C BE FB C9 70 10 78 33 5E 37 47 66 DD E3 2F 1F E0 FD B3 F5 61 FA C4 C9 B1 37 ")
+    (data "E3 B5 36 13 82 F1 27 28 36 D1 68 75 8A 07 10 57 14 0A C5 A5 4B 97 A8 AD 07 00 33 0E FF B7 59 30 ")
+    (data "6A 78 E4 71 37 46 B9 FF D3 FA 48 EE 6A 1C 47 CB FB 99 65 0A 66 A1 BF DA 7F 00 31 4F 74 DC 89 3A ")
+    (data "E7 E0 C1 83 30 65 74 62 13 85 11 D9 D9 CC FF E5 5C BD 88 83 03 40 83 02 FD E4 AE 8D 41 E4 BF 3B ")
+    (data "F9 A9 3E 98 0F ED 8C C4 4C 80 C5 7A 02 9B 63 2B 0A DA 54 9C 1D B7 84 E9 7E E6 31 23 52 39 C4 B5 ")
+    (data "59 3B 69 CD C8 3F DB F8 3F 8B A5 EB 44 EE 78 57 C2 6E BE B7 C9 A0 1E 3D D5 63 27 DF D6 8E 72 2A ")
+    (data "87 B9 19 7E B6 0B BD 15 CC 04 58 3E 07 33 1A 8D 0E 58 4F 9F 7D 6D FC 78 B9 59 4E 63 CC 40 AB 10 ")
+    (data "5B D6 17 0A 0B 0B 0B 0B 0B 63 62 62 8C 46 A3 FB AC 07 00 95 09 D9 DF 41 CB 71 95 96 80 73 95 B5 ")
+    (data "C4 1F 5A AD F6 CA 95 2B 6E 7D F7 16 2A 87 38 D7 47 EC 7B 0F DB CF 42 2A B5 7A B0 ED 0E 40 26 3C ")
+    (data "F8 9C 79 1A AC 27 F8 B2 4D 10 27 D7 88 29 6D 24 4D 01 8B FF E1 B9 8A 9B 80 99 81 79 9D E3 3C 0A ")
+    (data "23 F2 EF 4E 01 50 FA 12 DA F1 9D 36 1A 8D 43 ED 4D E0 68 9D E3 3C 17 06 B8 AD 2A 94 CF 27 ED 4D ")
+    (data "D9 F1 9D 46 38 1C AD 38 00 00 58 B1 1E 00 70 80 21 3D 4A E1 7F 4B 9A BF 02 03 03 07 07 07 B9 28 ")
+    (data "9A 32 3B F8 6E 5D 5F 40 74 72 6A F2 22 80 E9 FE 48 49 CC 85 78 2F 33 C5 A7 B5 A4 02 A4 52 A9 8F ")
+    (data "8F CF E9 D3 A7 EF 4E AC D7 2E 02 70 64 F2 D5 79 7C 7D 7D 29 5C E9 A9 AA D1 88 88 88 EE EE 6E 77 ")
+    (data "8F CA A9 11 89 44 96 2F 6A 6D 62 C7 D9 C3 60 30 DC BB 77 6F F2 46 29 D3 89 97 97 57 74 74 B4 D5 ")
+    (data "57 6C 56 D0 72 3D 1E 19 19 19 18 18 50 2A 95 D3 B3 EF 19 8A A2 32 99 2C 28 28 C8 C7 C7 C7 6E 60 ")
+    (data "8F EF 34 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D AD 79 21 64 AC 01 69 FE 12 EF ")
+    (data "2D 47 54 9D 60 62 B0 D1 8E EC 0D 1C 00 94 7F 63 32 6F CE 15 E3 D2 70 08 59 8E CF 79 01 BC E3 EC ")
+    (data "07 B7 73 DF AC 47 AE FE 16 69 FE 1C 70 67 97 D4 E9 62 D2 20 63 8D 30 D6 88 34 EE 82 B8 57 B0 B4 ")
+    (data "F7 81 43 B5 BC 40 99 85 CC 7A A4 64 03 D2 B4 07 70 36 76 0F C6 CD 70 67 17 52 BA 11 CC 54 7E 20 ")
+    (data "54 02 90 AB BF 41 FA 2E B9 DA 2E 66 20 BD 17 D0 6B 6F 53 04 20 9F 17 1A 6B 40 9A BF 70 BD 45 0E ")
+    (data "D0 B8 07 19 6B 24 BB 49 2E A0 F9 4B 76 72 CE 54 70 33 34 FF 93 EC 26 79 16 EA 2D 77 87 31 0E D2 ")
+    (data "5B 46 76 87 BC 16 52 51 79 ED D7 8F 06 DE 51 04 CD F5 EA 4F F0 21 DD 93 DB 85 20 AA 2E B2 89 76 ")
+    (data "F2 14 30 51 6D 4A D6 32 EE 7F BA 2B B6 65 DC C1 AD DC 18 43 6E CC F7 A3 25 B6 70 77 DC FF AE C2 ")
+    (data "0F 00 5A 94 FE C4 FF 4F 77 C5 02 40 8C D7 70 8C 7C 88 E9 B3 8F 75 C4 4F BD B8 6E 96 ED 13 15 C9 ")
+    (data "60 26 A0 61 34 F0 58 E7 C3 A7 D6 8F 06 D6 8F 06 02 C0 BA F0 06 47 04 74 4E BB 80 68 F9 D0 9A B0 ")
+    (data "26 78 90 14 96 17 1F CD DC 7A 00 58 17 CE CC 56 9B 30 13 90 E0 33 40 54 3B C7 3A E2 EF 2A FC E2 ")
+    (data "BD FA 99 BE B0 C9 38 F3 5B 0B DF B3 42 6C 21 DE 67 80 87 9A 63 BC 86 5D 6B 8D 03 38 28 20 46 3E ")
+    (data "E4 40 A9 75 07 8F 7D 16 F2 08 60 1B 8F 00 B6 79 EC 05 90 2E 31 4D 3E 48 E6 BB 00 D9 F7 A0 8F 7D ")
+    (data "0A 90 36 64 CC 66 A3 48 20 26 B6 CE 9D 3B E7 7C 54 AE F1 5A FC 0E E2 11 C0 36 1E 01 6C F3 BD 14 ")
+    (data "C0 D2 6E 0D B6 61 2C E0 DE B8 EF 1F 6A 57 8C 19 84 00 A0 34 0A FE 58 9B D3 A4 98 AE E9 2D 5B 30 ")
+    (data "1E 91 1D 6C 4B 6E 57 FA 7C 70 3B FB C7 71 95 BB 9A 32 EE AB E5 87 DA 92 7E 9B 52 E6 C0 26 8B D4 ")
+    (data "E7 89 D2 84 71 0A FC AF F8 8A 50 89 A2 47 23 DF 71 7D E5 7D B5 7C A6 78 FC 27 F1 57 D8 D8 EE 78 ")
+    (data "02 C6 29 20 E3 E9 7F 1C 57 F5 BB 6B 2B 71 40 10 C0 5F 8B AB 92 F3 1D DC 42 C3 E1 13 B0 26 C3 58 ")
+    (data "80 D2 28 F8 B4 31 83 B0 1E 07 E4 D3 C6 45 6F 26 5F 94 F3 1C F1 66 64 27 0B FD BD 21 93 C8 39 BF ")
+    (data "4F 2B 26 F2 D2 CE 7A D6 5C 02 C1 81 14 D8 1C 59 FB 75 5B EA F6 B8 2B 72 BE FE 97 49 17 FF DE 90 ")
+    (data "B9 29 D2 C1 E3 EA DC 9C 85 B8 12 9B B3 F2 B3 65 A3 BF 49 9E 58 2F 91 F1 F4 BF 49 29 77 DE 08 BB ")
+    (data "70 71 2D D9 2D F2 2C 24 0D 73 8B 2D 0E C1 37 93 7A 26 92 0A C0 43 96 BB C7 18 47 F0 E6 33 DF E1 ")
+    (data "09 9F F3 02 20 8E EC 5E EE 72 10 DC 1C 30 8B F4 60 51 F2 2C E4 1D 07 71 AF B8 C5 22 86 04 23 6D ")
+    (data "C2 40 1B 4B 21 04 54 D5 28 96 F6 3E 3E ED FE F6 56 78 19 5B C3 17 6C A4 08 40 D9 0E 70 F8 F8 8A ")
+    (data "7F C3 DC 1F B1 92 97 10 DC 1C 02 2D 71 99 EB A9 9D 3D EC B5 03 1C 3E 96 FE 7F 90 39 2F 43 F3 3F ")
+    (data "A1 B7 1C 51 75 30 72 B7 71 00 2E A6 11 E0 0A 2F AE 3A 60 F6 3C 61 60 A1 DD F0 1E DF 69 B6 F1 08 ")
+    (data "60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 1B BA 83 FA DA 5E CD E9 66 45 65 97 AA 4F 65 52 EA ")
+    (data "DD F5 51 A5 4C C0 09 96 72 33 C2 A4 05 28 6C 88 F7 00 00 0B A1 49 44 41 54 B1 5E C9 C1 B4 8E 73 ")
+    (data "B5 DF 99 1B 54 9B DE 3D DF 5D D6 AA A4 0E E6 72 72 22 65 3B 72 66 06 48 EC BC 62 3B 02 1A 07 75 ")
+    (data "AF 1D 6B 1F 54 9B A4 7C 74 4B 8A 7F 5E 8C D7 6C 1F 81 4C E0 AE E1 C1 B8 DE DC 36 A2 3F 77 77 6C ")
+    (data "7F ED B0 DA 88 05 4A B8 9F 3D 1D 11 EB 2F A4 F8 09 95 80 41 B5 69 C3 FE 96 41 B5 29 33 5C FA E1 ")
+    (data "9A 59 7E D4 1F B7 BB 94 61 8D E9 E7 A7 3B 2A 3B 55 81 12 EE BF B7 44 05 48 1C 3A CA E8 DD F3 DD ")
+    (data "84 F5 BB 9F 8D 9C 4E EB 01 C0 4F CC DD F3 6C E4 A2 30 E9 80 DA F4 FB B2 5E 8A 90 A4 02 6A 7B 35 ")
+    (data "65 AD 4A 29 1F FD A8 60 16 17 65 61 F6 99 8B 22 1F 15 CC 92 F0 D0 D2 7B E3 B7 FB 98 4F 6C 9D 6E ")
+    (data "56 00 C0 96 14 7F 5F D1 B4 BE FB C9 F8 8B B9 9B 53 FC 00 E0 54 13 F3 89 AD CA 2E 15 00 E4 C5 50 ")
+    (data "79 4C 9C 3D 7B 76 FB F6 ED 9F 7F FE B9 13 46 DA 21 2F C6 1B 00 2A EF 33 77 3D EE 55 1A 01 20 D2 ")
+    (data "97 AA 06 28 2A 2A D2 68 34 17 2F 5E 74 DF 36 E1 91 BE 02 00 E8 53 DA DE 2E 19 28 04 A8 0C 18 00 ")
+    (data "48 F9 54 A5 3C 23 23 03 00 12 12 12 98 1E 5B 46 1F B9 80 03 00 E3 E4 4D 27 E3 FC DD DB DB 7B E2 ")
+    (data "C4 89 17 5E 78 41 20 10 6C DA B4 69 DD BA 75 42 21 55 2A B9 1B C6 7D A1 43 87 0E 55 54 54 EC DE ")
+    (data "BD 9B D8 1B 9F 5D EB 81 A9 80 F6 F6 F6 1B 37 6E 00 40 4D 4D CD 99 33 67 88 8B D3 B3 53 00 19 CC ")
+    (data "04 1C 39 72 C4 72 28 C1 A1 43 87 6E DD BA 35 32 32 F2 E6 9B 6F 9E 3C 79 D2 0D B6 D1 82 41 19 68 ")
+    (data "69 69 B9 75 EB E1 6A 12 8E E3 7F FB DB DF 78 3C 9E 4E A7 3B 76 EC 58 6A 6A 6A 68 68 A8 1B 2C B4 ")
+    (data "03 83 14 F8 E6 9B 6F AC AE 98 CD 66 E2 48 68 93 C9 B4 77 EF 5E 56 F2 12 83 14 48 4D 4D 4D 4C 4C ")
+    (data "24 BB 8B 20 88 C9 64 A2 D8 47 C7 4D 30 10 90 97 97 E7 3E 3B 1C E6 B1 1F 52 7A 04 B0 8D 47 00 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 CD 63 2F C0 8D 73 3E B1 1F D5 5A 5D 69 FA 79 8A CD EB 53 21 42 D2 ")
+    (data "E1 B1 4F 01 8F 00 B6 F1 08 60 1B 37 D6 42 64 35 09 FD 1A 86 0E 9E 14 20 87 E5 76 80 58 C9 73 DF ")
+    (data "8A 2A 4D 14 3A 33 00 78 09 49 97 15 49 05 04 4B B9 00 D0 36 CA C2 F1 9A 93 69 1D D1 03 40 90 94 ")
+    (data "74 91 8F 34 0B 65 84 49 EF 0E EB CF 36 8F D1 5C 70 A6 8F 9C C9 2A 6D 71 8B 02 00 32 C2 24 64 01 ")
+    (data "48 97 59 6F F5 69 36 1F 68 95 F0 D0 E2 57 E6 4E F3 12 A5 85 41 B5 31 6F 6F A3 D6 88 7D BD 39 2A ")
+    (data "29 C8 F6 69 D1 A4 59 28 39 58 9C 13 29 53 1B B1 9F 9F EE 30 61 2C 7C 78 65 C2 F0 9F 9F EE D4 18 ")
+    (data "B1 DC 68 39 99 F5 40 5D 8D EE C8 99 19 28 E1 56 76 AA 5E 3E DC 3A A4 A1 75 9C 81 AB 18 54 1B 5F ")
+    (data "3A DC 5A DD A5 0A 92 72 DF 5E 16 42 11 D2 8E AB 41 D3 90 EE B5 A3 ED 03 6A 93 84 87 6E 4E F1 CB ")
+    (data "8B F1 8E F4 15 30 CA C4 8C 50 E8 CC AD 23 FA E2 16 C5 FE DA 21 8D 11 0B 92 72 3F 5B 17 31 C7 61 ")
+    (data "57 03 82 41 B5 F1 F7 65 BD A5 F7 A6 7B EB E9 95 D1 F2 B7 97 85 50 38 19 10 D0 75 3D BE DD A7 3D ")
+    (data "D5 34 56 D1 A5 EA 57 99 28 D6 0C 9D 44 2E E0 04 CB 78 19 61 92 82 58 6F 8A 7C 3F 19 8F EF 34 DB ")
+    (data "78 04 B0 8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 8D BB 86 5A 03 03 43 C5 C5 E5 C5 E7 CA 8C 26 ")
+    (data "D3 8A 15 CB 56 AE 7C 22 2C 6C 86 3B 1E E4 E2 CE 9C 5A AD B9 70 E1 4A D1 99 D2 9B 37 EB 01 81 A4 ")
+    (data "28 01 82 22 B5 CD 3A 1C C7 E3 E7 46 AF CC CB C9 C9 C9 F2 F3 B3 7F B6 09 7D 5C 23 00 C3 B0 EB D7 ")
+    (data "6F 15 15 95 95 97 5F D6 E9 0C B3 42 04 39 0B C4 AB 32 25 33 03 78 00 30 34 66 2A AB D1 94 5D D7 ")
+    (data "DC BE AB 45 51 24 31 31 2E 3F 3F 67 C5 8A 6C 89 C4 05 D3 05 CE 0A 68 6B EB 2C 2A 2A 3B 75 EA EC ")
+    (data "D8 98 92 CB 45 92 A2 84 CF AF F6 4A 4F B0 DD 95 EF E8 35 96 5E 55 97 5C D5 74 F5 E9 05 7C DE 82 ")
+    (data "85 F3 F2 F3 97 67 65 2D E2 F1 1C 3F BD D5 41 01 44 16 3F 79 B2 A4 AB AB 9B CF E7 2D 4D 9F CD E3 ")
+    (data "71 6A 1B 7A 7A FB 15 02 3E 27 7B 9E 68 55 A6 74 61 BC 88 CC 65 B9 A9 43 5F 54 A1 2E BB A6 19 1E ")
+    (data "33 4A 25 A2 AC A5 99 F9 F9 CB E7 CF 4F A6 38 77 CC 35 02 54 2A F5 E5 CB 55 A7 4E 15 DF B8 51 87 ")
+    (data "A2 48 6C 54 D0 33 AB 13 57 2D 9B 2B 16 F1 00 00 C7 F1 9B F5 DD A7 4A 1A 4A 2F DF 55 A9 F5 FE 3E ")
+    (data "BC 95 E9 E2 FC 4C 69 E4 4C DB 5E 50 18 0E 75 2D BA B3 95 EA 92 6A B5 46 67 0E 0C F0 79 62 D9 D2 ")
+    (data "E5 CB 97 24 27 93 7E FE EC A0 00 83 C1 78 F5 EA 8D B2 B2 CB 65 65 DF EA F5 86 F0 10 81 D9 8C F5 ")
+    (data "0C 1A 01 20 25 7E 66 41 6E 7C 6E 76 AC 54 FC D0 4A BD C1 74 A1 E2 DE E9 D2 86 8A 6B 1D 18 86 C5 ")
+    (data "84 8B 56 65 88 56 A6 4B 7D BD 6C CF 06 E8 8D 78 4D 83 F6 6C A5 FA D2 4D 8D C9 84 CD 9E 1D BA 7C ")
+    (data "79 F6 AA 55 CB 66 CE A4 9A 8F A0 25 A0 A9 A9 A5 A8 A8 EC DC B9 F3 0A 85 2A C8 8F BF 34 55 54 B0 ")
+    (data "44 1A 1D C6 07 80 81 11 53 71 B5 EA E4 65 F5 FD 7E 03 9F C7 59 34 7F 56 C1 8A F8 27 16 47 73 39 ")
+    (data "0F B3 C1 B8 52 57 7A B9 F9 54 E9 9D DA FA 6E 14 41 E6 C5 09 F3 33 25 CB E6 4B 85 02 DB 79 4B A5 ")
+    (data "C5 2E DF 54 9F AD D4 5C 6F D4 61 18 16 1B 1B 95 9F BF 22 37 77 A9 8F 8F 37 63 01 BF FA D5 1F 6E ")
+    (data "DD AA 57 2A D5 72 09 77 79 9A 28 2F 43 9A 14 2D B4 B9 09 0C 91 A1 4B AA 35 63 4A A3 5C 26 5C 91 ")
+    (data "35 67 CD 8A B9 A9 09 8F 9C 59 DF DA 39 5C 72 B1 F9 64 49 43 6F BF 42 2A E6 2E 49 11 E6 67 4A D3 ")
+    (data "E2 44 64 BB CA F4 8F 98 4A AA 55 25 D5 DA 96 2E 1D 8A A2 81 81 7E 87 0E ED 65 26 20 2B EB 49 00 ")
+    (data "40 10 24 65 8E 70 65 BA 64 59 9A 58 2E A1 9A 0E 32 98 F0 AB F5 DA B3 95 9A 4B 37 D4 26 33 36 3B ")
+    (data "DC 37 77 69 EC 93 79 09 21 81 0F DD AA 31 0C BF 75 A7 E7 74 E9 9D A2 B2 3B 5A 9D 31 C0 87 97 B7 ")
+    (data "48 52 90 25 0D 0B B2 AE 85 BA FA 8D 25 D5 AA E2 2A 4D 57 BF 01 41 10 1C C7 2F 5F 3E C1 58 40 5E ")
+    (data "1A 47 26 46 2A 1A A0 67 D8 84 A2 C8 BC 58 61 7E A6 E4 89 F9 52 11 49 06 20 18 57 9B CB AF A9 8B ")
+    (data "2A B4 B7 5B 34 28 82 24 CD 0D 29 C8 8D B7 14 74 02 95 46 7F E1 4A CB E9 F3 8D 57 6F 76 E2 38 1E ")
+    (data "1B 21 5A B5 48 BC 32 43 82 22 50 7E 4D 5D 54 A9 A9 6B D1 E2 38 C4 84 0B 72 17 0A 86 C6 CC FF 2E ")
+    (data "55 3B 22 60 FD 52 EE 86 A5 1C 00 E8 1A C4 AB 1A B1 4B 75 30 30 6A E2 F3 D0 05 73 85 F9 8B A5 59 ")
+    (data "29 62 1E 97 4A C9 BD FB 86 A2 0A 65 71 B5 76 78 CC 28 12 F2 56 2C 8D 59 93 93 90 96 1C 8A 4E AA ")
+    (data "5C 7B FB C7 4F 9F BF 73 AA A4 A1 AB 67 14 41 00 41 10 0C C3 67 85 F0 B2 53 05 B9 E9 C2 19 FE 5C ")
+    (data "00 F8 F2 B4 EA 7F CE A8 C8 04 D0 EA 0B 85 05 20 61 01 9C 67 B3 F0 E6 FB BC AA 46 AC E2 8E FE CA ")
+    (data "2D 8D 4C CC 59 9C 22 5A 9E 26 C9 4C 16 DB AC EF A3 42 F9 DB 37 FA BD BE 01 AE D6 6B 8A 2A D4 C5 ")
+    (data "17 9A 4E 16 37 04 F9 CB 56 AF 98 BB 26 27 7E 76 B8 2F 86 E1 5D 3D A3 9D DD A3 C3 A3 6A 00 40 51 ")
+    (data "C4 47 86 BE F5 A2 57 62 14 03 E7 53 06 9D 39 14 41 E2 C2 90 B8 30 F4 87 B9 50 DF 81 5E BC 8D 5D ")
+    (data "BC AE 39 5B A1 F2 F7 E6 2D 4B 13 2F 4F 13 DB 2C E5 28 02 8B 12 C5 8B 12 C5 6A 2D 76 BE 46 5D 54 ")
+    (data "A1 FE E7 C1 EA 2F 0E 54 FB 7A 8B F4 46 4C AD D6 4B 25 82 65 8B A3 0B 56 CC 3D 7C EA D6 F0 40 07 ")
+    (data "23 EB 99 09 B0 80 20 90 18 81 26 46 A0 06 13 DC 6E 33 5F AE C3 8E 96 8F 1F 2A 55 04 FB F3 56 2C ")
+    (data "90 AC C9 92 86 4F 29 94 00 20 11 A1 49 51 C2 C1 51 F3 C0 88 A9 6F D8 38 32 A6 95 88 F9 7F FA ED ")
+    (data "DA EC CC 28 1E 97 03 00 87 4F 3B B2 CD 8F 53 DD 69 3E 17 D2 62 38 69 31 A0 D1 43 4D B3 B9 AA 11 ")
+    (data "FF FA 9C 62 5F D1 D8 EC 19 82 65 69 E2 D5 8B A5 21 FE 5C 78 B4 33 87 20 48 C2 6C DE 96 3C 79 71 ")
+    (data "B5 4E 67 96 AF 58 3A C7 19 03 9C 15 60 41 2C 80 EC 24 4E 76 12 8C AA D0 CA 3B 58 C5 1D F3 E7 27 ")
+    (data "46 BF 38 39 16 1D C6 07 1C BF 77 DF 88 E1 78 DC 6C C1 EB EB E5 CB E6 0B 7D E5 28 00 9C AF D1 B9 ")
+    (data "E4 9C 4B 17 0F 68 7C A4 C8 EA 85 9C D5 0B A1 7F 14 BD D2 60 3E 56 61 00 40 0A F3 25 39 0B 44 A1 ")
+    (data "81 6E 59 55 70 D7 88 2C C8 07 79 66 09 B7 AE DD C8 E3 73 7F B8 46 EA A6 A7 80 5B 17 BA 69 A2 D3 ")
+    (data "1B CB AF DC 3B 55 DA 50 7D A3 33 33 89 B1 F7 3E 9B 02 14 4A FD 7B 1F 9E 2D BB D2 A2 D6 E8 13 A2 ")
+    (data "C4 6F 3C 27 5B 96 46 EB 58 EB C9 B0 26 00 45 60 70 58 59 75 BD E5 A9 2C 6E DE 22 59 68 A0 83 96 ")
+    (data "B0 26 E0 87 6B A4 1B 57 E0 69 73 05 4E 7E 68 CA 9A 00 A6 2D 2E 19 8F FD C4 96 47 00 DB 78 04 B0 ")
+    (data "8D 47 00 DB 78 04 B0 8D 47 00 DB 78 04 B0 0D 69 6F 54 20 E0 9F AC 34 8D A9 F0 95 F3 D1 59 41 EC ")
+    (data "E8 BC D7 6D 3C 7E 49 5B 7A 55 4F B1 F0 41 2A 60 D7 AE 0F 0F 1E 3C 5E 5C 5C 5E 7A C3 18 17 CE 5D ")
+    (data "39 1F 59 14 87 72 A6 45 88 C9 8C 5F BA A9 3F 7E 49 5B 77 4F CF E5 72 97 2F CF DA B8 F1 29 B2 C0 ")
+    (data "76 D6 07 D4 6A 4D 69 E9 C5 03 5F 1F E9 E8 EC F1 96 A2 4B 13 D1 BC 34 D4 DF 8B EE 18 E4 0F FB 8C ")
+    (data "3C 3E F7 83 37 7C 69 86 1F 19 C7 8A AB 35 C7 2F E9 07 46 8C FE 7E DE AB F2 73 37 6C 58 1B 10 E0 ")
+    (data "47 F1 13 5A 2B 34 C4 22 E4 B1 A3 45 17 2E 5E 01 1C 52 A3 90 D5 E9 9C 84 59 A8 DD 3D E3 E9 0B B8 ")
+    (data "DB 65 FC A6 5C 53 7E 4D 67 32 E3 B1 B1 51 1B 37 3E 95 9B 9B CD E5 DA 1F 6F D1 1A 91 A1 28 BA 60 ")
+    (data "41 EA 82 05 A9 DD DD BD C7 8F 9F 3B 71 E2 CC 1F FF A5 0E F1 E3 AC 9C 8F 2C 4F E1 08 9D 18 5A 19 ")
+    (data "8C F8 85 1B BA C3 65 DA 7B F7 0D 62 B1 70 4D C1 AA 0D 1B D6 46 46 CE A2 1F 83 23 AB 94 06 83 F1 ")
+    (data "FC F9 4B 07 0F 1E 6D 6E 6E 13 0B D1 8C 38 24 7F 21 27 2C C0 46 72 50 A4 40 F7 A0 F9 CC 15 ED 99 ")
+    (data "4A DD B8 CA 14 1A 1A FC E4 93 AB 9E 7A 2A 5F 26 63 3C 83 E4 D4 3A 71 53 53 CB B1 63 67 CF 16 9D ")
+    (data "D7 1B 0C B1 61 E8 EA 85 E8 C2 39 9C C9 15 C6 54 01 18 86 DF BC 6B 38 52 AE AD AA D7 21 80 CC 4F ")
+    (data "4B D9 B8 F1 C9 C5 8B 17 22 8E 1E 61 E0 82 95 FA 91 91 D1 33 67 4A 8F 7C 73 AA AF 7F C8 57 86 2E ")
+    (data "4F 45 F3 D2 38 72 B1 B5 00 B5 0E 3F 5B A9 3D 52 AE E9 1B 36 79 7B CB 0B 0A F2 9E 79 66 75 70 70 ")
+    (data "A0 93 4F 77 99 AF 04 86 61 15 15 35 07 0F 1E BF 7E FD 16 97 03 F3 A3 D1 D5 E9 E8 C1 0B 66 1E 9F ")
+    (data "FB E3 67 65 27 2E 69 4B 6B F4 7A 83 39 76 4E D4 BA A7 F3 F3 F3 73 5C B5 85 86 EB 3D 77 DB DA 3A ")
+    (data "8F 1C 39 7D E6 4C 89 56 AB 17 0B 50 04 45 D4 5A B3 40 C0 CF CD 7D 62 FD FA 82 39 73 A2 5C FB 38 ")
+    (data "77 B9 1E AB D5 9A A2 A2 F3 BB 77 7F 65 36 63 2F BD B4 A5 A0 20 57 2E 97 B9 E3 41 1E DF 69 B6 F1 ")
+    (data "08 60 1B 8F 00 B6 F1 08 60 1B 8F 00 B6 F1 08 60 9B C7 5E C0 FF 03 A6 DF 09 53 E9 36 35 63 00 00 ")
+    (data "00 00 49 45 4E 44 AE 42 60 82 ")
+    )
+  )
+  (tbtext "Text justified center-center" (name "") (pos 187.739 115.552) (justify center))
+  (tbtext "Text justified center-top" (name "") (pos 187.739 109.202) (justify center top))
+  (tbtext "Text justified center-bottom" (name "") (pos 187.739 102.852) (justify center bottom))
+)
diff --git a/tests/testdata/worksheets/test_createNewWorksheet b/tests/testdata/worksheets/test_createNewWorksheet
new file mode 100644
index 0000000..31e6aaa
--- /dev/null
+++ b/tests/testdata/worksheets/test_createNewWorksheet
@@ -0,0 +1,4 @@
+(kicad_wks (version 20211014) (generator kiutils)
+  (setup (textsize 1.5 1.5)(linewidth 0.15)(textlinewidth 0.15)
+  (left_margin 10.0)(right_margin 10.0)(top_margin 10.0)(bottom_margin 10.0))
+)
diff --git a/tests/testfunctions.py b/tests/testfunctions.py
new file mode 100644
index 0000000..bee3818
--- /dev/null
+++ b/tests/testfunctions.py
@@ -0,0 +1,100 @@
+"""Helper functions for the unittests
+
+Authors:
+    (C) Marvin Mager - @mvnmgrx - 2022
+
+License identifier:
+    GPL-3.0
+"""
+
+from dataclasses import dataclass
+from typing import Optional
+import filecmp
+import os
+
+TEST_BASE = os.path.join('tests', 'testdata')
+
+@dataclass
+class TestData():
+    """Data container to relay testcase-specific information to the report generator. May be added
+    as a member to ``unittest.TestCase`` in the ``setUp()`` function. The object will then be
+    available in ``result._TestInfo()`` classes constructor."""
+    producedOutput: Optional[str] = None
+    expectedOutput: Optional[str] = None
+    ownDescription: Optional[str] = None
+    pathToTestFile: Optional[str] = None
+    compareToTestFile: bool = False
+    wasSuccessful: bool = False
+
+
+def to_file_and_compare(object, test_data: TestData) -> bool:
+    """Write the object to a file using its ``to_file()`` method and comparing the output with
+    the given expected output supplied by a file with ``.expected`` suffix
+
+    Cleans up the test files afterwards, leaving only failing test outputs behind. Test output
+    is furthermore saved to ``test_data.expectedOutput`` and ``test_data.producedOutput`` to be
+    displayed in the HTML test report.
+
+    Args:
+        - object: KiUtils object with a ``to_file()`` method
+        - test_data (TestData): Test data object of the currently running test (contains path to 
+                                test file)
+
+    Returns:
+        - bool: True, if both the output of ``to_file()`` and the given expected output are the same
+    """
+    # Create S-Expression from object
+    if test_data.pathToTestFile is None:
+        raise Exception("pathToTestFile may not be None!")
+
+    object.to_file(f'{test_data.pathToTestFile}.testoutput')
+
+    # Compare with the expected result
+    if test_data.compareToTestFile:
+        compare_file = test_data.pathToTestFile
+    else:
+        compare_file = f'{test_data.pathToTestFile}.expected'
+
+    test_data.wasSuccessful = filecmp.cmp(f'{test_data.pathToTestFile}.testoutput', compare_file)
+    cleanup_after_test(test_data)
+    return test_data.wasSuccessful
+
+def load_contents(file: str) -> str:
+    """Load contents of a specific file and return it as a joined string
+
+    Args:
+        file (str): Path to file
+
+    Returns:
+        str: Contents of file in one string
+    """
+    with open(file, "r") as outfile:
+        return ''.join(outfile.readlines())
+
+def prepare_test(object):
+    """Prepare a unittest test case in the KiUtils framework
+
+    Args:
+        object: Test case class object
+    """
+    object.testData = TestData()
+
+def cleanup_after_test(test_data: TestData):
+    """Cleanup after a unittest test case ran
+
+    Args:
+        test_data (TestData): Test data structure of test case that finished last
+
+    Raises:
+        Exception: When ``test_data.pathToTestFile`` is None
+    """
+    if test_data.pathToTestFile is None:
+        raise Exception("Path to testfile must not be None!")
+    test_data.producedOutput = load_contents(f'{test_data.pathToTestFile}.testoutput')
+    if test_data.compareToTestFile:
+        test_data.expectedOutput = load_contents(f'{test_data.pathToTestFile}')
+    else:
+        test_data.expectedOutput = load_contents(f'{test_data.pathToTestFile}.expected')
+
+    if test_data.wasSuccessful:
+        os.remove(f'{test_data.pathToTestFile}.testoutput')
\ No newline at end of file
diff --git a/utils/sexpr.py b/utils/sexpr.py
deleted file mode 100644
index 764fa58..0000000
--- a/utils/sexpr.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env python
-# code extracted from: http://rosettacode.org/wiki/S-Expressions
-# Originally taken from: https://gitlab.com/kicad/libraries/kicad-library-utils/-/blob/master/common/sexpr.py
-
-import re
-
-dbg = False
-
-term_regex = r'''(?mx)
-    \s*(?:
-        (?P\()|
-        (?P\))|
-        (?P[+-]?\d+\.\d+(?=[\ \)])|\-?\d+(?=[\ \)]))|
-        (?P"(?:[^"]|(?<=\\)")*"(?:(?=\))|(?=\s)))|
-        (?P[^(^)\s]+)
-       )'''
-
-def parse_sexp(sexp):
-    stack = []
-    out = []
-    if dbg: print("%-6s %-14s %-44s %-s" % tuple("term value out stack".split()))
-    for termtypes in re.finditer(term_regex, sexp):
-        term, value = [(t,v) for t,v in termtypes.groupdict().items() if v][0]
-        if dbg: print("%-7s %-14s %-44r %-r" % (term, value, out, stack))
-        if   term == 'brackl':
-            stack.append(out)
-            out = []
-        elif term == 'brackr':
-            assert stack, "Trouble with nesting of brackets"
-            tmpout, out = out, stack.pop(-1)
-            out.append(tmpout)
-        elif term == 'num':
-            v = float(value)
-            if v.is_integer(): v = int(v)
-            out.append(v)
-        elif term == 'sq':
-            out.append(value[1:-1].replace(r'\"', '"'))
-        elif term == 's':
-            out.append(value)
-        else:
-            raise NotImplementedError("Error: %r" % (term, value))
-    assert not stack, "Trouble with nesting of brackets"
-    return out[0]
\ No newline at end of file
diff --git a/utils/strings.py b/utils/strings.py
deleted file mode 100644
index e2e97a7..0000000
--- a/utils/strings.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""Functions for string manipulation
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    28.02.2022 - created
-"""
-
-def dequote(input: str) -> str:
-    """Escapes double-quotes in a string using a backslash
-
-    Args:
-        - input (str): String to replace double-quotes
-
-    Returns:
-        - str: String with replaced double-quotes
-    """
-    return str(input).replace("\"", "\\\"")
-
-
-def remove_prefix(input: str, prefix: str) -> str:
-    """Removes the given prefix from a string (to remove incompatibility of ``str.removeprefix()``
-    for Python versions < 3.9)
-
-    Args:
-        - input (str): String to remove the prefix from
-        - prefix (str): The prefix
-
-    Returns:
-        - str: String with removed prefix, or the ``input`` string as is, if the prefix was not found
-    """
-    return input[len(prefix):] if input.startswith(prefix) else input
\ No newline at end of file
diff --git a/wks.py b/wks.py
deleted file mode 100644
index d19ea61..0000000
--- a/wks.py
+++ /dev/null
@@ -1,962 +0,0 @@
-"""Classes for worksheets (.kicad_wks) and its contents
-
-Author:
-    (C) Marvin Mager - @mvnmgrx - 2022
-
-License identifier:
-    GPL-3.0
-
-Major changes:
-    24.06.2022 - created
-
-Documentation taken from:
-    https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/
-"""
-
-from __future__ import annotations
-
-from dataclasses import dataclass, field
-from typing import Optional, List
-from os import path
-
-from kiutils.items.common import Justify
-from kiutils.utils.strings import dequote
-from kiutils.utils import sexpr
-from kiutils.misc.config import KIUTILS_CREATE_NEW_GENERATOR_STR, KIUTILS_CREATE_NEW_VERSION_STR
-
-@dataclass
-class WksFontSize():
-    """The ``WksFontSize`` token defines the size of a font in a worksheet"""
-
-    width: float = 1.0
-    """The ``width`` token defines the width of the font. Defaults to 1."""
-
-    height: float = 1.0
-    """The ``height`` token defines the height of the font. Defaults to 1."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> WksFontSize:
-        """Convert the given S-Expresstion into a WksFontSize object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(size ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or its length is not equal to 3
-            - Exception: When the first item of the list is not ``size``
-
-        Returns:
-            - WksFontSize: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) != 3:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'size':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.width = exp[1]
-        object.height = exp[2]
-        return object
-
-    def to_sexpr(self, indent=0, newline=False):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        return f'{indents}(size {self.width} {self.height}){endline}'
-
-@dataclass
-class WksFont():
-    """The ``WksFont`` token defines how a text is drawn"""
-
-    linewidth: Optional[float] = None
-    """The optional ``linewidth`` token defines the width of the font's lines"""
-
-    size: Optional[WksFontSize] = None
-    """The optional ``size`` token defines the size of the font"""
-
-    bold: bool = False
-    """The ``bold`` token defines if the font is drawn bold. Defaults to False."""
-
-    italic: bool = False
-    """The ``italic`` token defines if the font is drawn italic. Defaults to False."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> WksFont:
-        """Convert the given S-Expresstion into a WksFont object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(font ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``font``
-
-        Returns:
-            - WksFont: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'font':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp:
-            if type(item) != type([]):
-                if item == 'bold': object.bold = True
-                if item == 'italic': object.italic = True
-                continue
-            if item[0] == 'linewidth': object.linewidth = item[1]
-            if item[0] == 'size': object.size = WksFontSize().from_sexpr(item)
-        return object
-
-    def to_sexpr(self, indent=0, newline=False):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object. Will return an empty string, if all members of this
-                   class are set to ``None``.
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        lw = f' (linewidth {self.linewidth})' if self.linewidth is not None else ''
-        size = f' {self.size.to_sexpr()}' if self.size is not None else ''
-        bold = f' bold' if self.bold else ''
-        italic = f' italic' if self.italic else ''
-
-        if lw == '' and size == '' and bold == '' and italic == '':
-            return ''
-        else:
-            return f'{indents}(font{lw}{size}{bold}{italic}){endline}'
-
-@dataclass
-class WksPosition():
-    """The ``WksPosition`` token defines the positional coordinates and rotation of an worksheet
-    object.
-    """
-
-    X: float = 0.0
-    """The ``X`` attribute defines the horizontal position of the object. Defaults to 0."""
-
-    Y: float = 0.0
-    """The ``Y`` attribute defines the vertical position of the object. Defaults to 0."""
-
-    corner: Optional[str] = None
-    """The optional ``corner`` token is used to define the initial corner for repeating"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> WksPosition:
-        """Convert the given S-Expresstion into a WksPosition object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(xxx ...)``
-
-        Raises:
-            - Exception: When the given expression is not of type ``list`` or the list is less than
-                         3 items long
-
-        Returns:
-            - WksPosition: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) < 3:
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.X = exp[1]
-        object.Y = exp[2]
-
-        # The last parameter refers to the corner token, if any is present
-        if len(exp) > 3:
-            object.corner = exp[3]
-
-        return object
-
-    def to_sexpr(self) -> str:
-        """This object does not have a direct S-Expression representation."""
-        raise NotImplementedError("This object does not have a direct S-Expression representation")
-
-@dataclass
-class Line():
-    """The ``Line`` token defines how a line is drawn in a work sheet
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_line"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the line object"""
-
-    start: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``start`` token defines the start position of the line"""
-
-    end: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``end`` token defines the end position of the line"""
-
-    option: Optional[str] = None
-    """The optional ``option`` token defines on which pages the line shall be shown. Possible values
-    are:
-    - None: Item will be shown on all pages
-    - `notonpage1`: On all pages except page 1
-    - `page1only`: Only visible on page 1"""
-
-    lineWidth: Optional[float] = None
-    """The optional ``lineWidth`` token attribute defines the width of the rectangle lines"""
-
-    repeat: Optional[int] = None
-    """The optional ``repeat`` token defines the count for repeated incremental lines"""
-
-    incrx: Optional[float] = None
-    """The optional ``incrx`` token defines the repeat distance on the X axis"""
-
-    incry: Optional[float] = None
-    """The optional ``incry`` token defines the repeat distance on the Y axis"""
-
-    comment: Optional[str] = None
-    """The optional ``comment`` token is a comment for the line object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Line:
-        """Convert the given S-Expresstion into a Line object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(line ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``tbtext``
-
-        Returns:
-            - Line: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'line':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'start': object.start = WksPosition().from_sexpr(item)
-            if item[0] == 'end': object.end = WksPosition().from_sexpr(item)
-            if item[0] == 'option': object.option = item[1]
-            if item[0] == 'linewidth': object.lineWidth = item[1]
-            if item[0] == 'repeat': object.repeat = item[1]
-            if item[0] == 'incrx': object.incrx = item[1]
-            if item[0] == 'incry': object.incry = item[1]
-            if item[0] == 'comment': object.comment = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        start_corner = f' {self.start.corner}' if self.start.corner is not None else ''
-        end_corner = f' {self.end.corner}' if self.end.corner is not None else ''
-        option = f' (option {self.option})' if self.option is not None else ''
-        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
-        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
-        incry = f' (incry {self.incry})' if self.incry is not None else ''
-        comment = f' (comment "{dequote(self.comment)}")\n' if self.comment is not None else ''
-        lw = f' (linewidth {self.lineWidth})' if self.lineWidth is not None else ''
-
-        expression  = f'{indents}(line (name "{dequote(self.name)}") '
-        expression += f'(start {self.start.X} {self.start.Y}{start_corner}) '
-        expression += f'(end {self.end.X} {self.end.Y}{end_corner})'
-        expression += f'{option}{lw}{repeat}{incrx}{incry}{comment}){endline}'
-        return expression
-
-@dataclass
-class Rect():
-    """The ``Rect`` token defines how a rectangle is drawn in a work sheet
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_rectangle"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the rectangle object"""
-
-    start: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``start`` token defines the start position of the rectangle"""
-
-    end: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``end`` token defines the end position of the rectangle"""
-
-    option: Optional[str] = None
-    """The optional ``option`` token defines on which pages the rectangle shall be shown. Possible values
-    are:
-    - None: Item will be shown on all pages
-    - `notonpage1`: On all pages except page 1
-    - `page1only`: Only visible on page 1"""
-
-    lineWidth: Optional[float] = None
-    """The optional ``lineWidth`` token attribute defines the width of the rectangle lines"""
-
-    repeat: Optional[int] = None
-    """The optional ``repeat`` token defines the count for repeated incremental rectangles"""
-
-    incrx: Optional[float] = None
-    """The optional ``incrx`` token defines the repeat distance on the X axis"""
-
-    incry: Optional[float] = None
-    """The optional ``incry`` token defines the repeat distance on the Y axis"""
-
-    comment: Optional[str] = None
-    """The optional ``comment`` token is a comment for the rectangle object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Rect:
-        """Convert the given S-Expresstion into a Rect object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(rect ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``rect``
-
-        Returns:
-            - Rect: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'rect':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'start': object.start = WksPosition().from_sexpr(item)
-            if item[0] == 'end': object.end = WksPosition().from_sexpr(item)
-            if item[0] == 'option': object.option = item[1]
-            if item[0] == 'linewidth': object.lineWidth = item[1]
-            if item[0] == 'repeat': object.repeat = item[1]
-            if item[0] == 'incrx': object.incrx = item[1]
-            if item[0] == 'incry': object.incry = item[1]
-            if item[0] == 'comment': object.comment = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        start_corner = f' {self.start.corner}' if self.start.corner is not None else ''
-        end_corner = f' {self.end.corner}' if self.end.corner is not None else ''
-        option = f' (option {self.option})' if self.option is not None else ''
-        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
-        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
-        incry = f' (incry {self.incry})' if self.incry is not None else ''
-        comment = f' (comment "{dequote(self.comment)}")\n' if self.comment is not None else ''
-        lw = f' (linewidth {self.lineWidth})' if self.lineWidth is not None else ''
-
-        expression  = f'{indents}(rect (name "{dequote(self.name)}") '
-        expression += f'(start {self.start.X} {self.start.Y}{start_corner}) '
-        expression += f'(end {self.end.X} {self.end.Y}{end_corner})'
-        expression += f'{option}{lw}{repeat}{incrx}{incry}{comment}){endline}'
-        return expression
-
-@dataclass
-class Polygon():
-    """The ``Polygon`` token defines a graphical polygon in a worksheet
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_graphical_polygon
-    """
-
-    name: str = ""
-    """The ``name`` token defines the name of the polygon"""
-
-    position: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``position`` token defines the coordinates of the polygon"""
-
-    option: Optional[str] = None
-    """The optional ``option`` token defines on which pages the polygon shall be shown. Possible values
-    are:
-    - None: Item will be shown on all pages
-    - `notonpage1`: On all pages except page 1
-    - `page1only`: Only visible on page 1"""
-
-    rotate: Optional[float] = None
-    """The optional ``rotate`` token defines the rotation angle of the polygon object"""
-
-    coordinates: List[WksPosition] = field(default_factory=list)
-    """The ``coordinates`` token defines a list of X/Y coordinates that forms the polygon"""
-
-    repeat: Optional[int] = None
-    """The optional ``repeat`` token defines the count for repeated incremental polygons"""
-
-    incrx: Optional[float] = None
-    """The optional ``incrx`` token defines the repeat distance on the X axis"""
-
-    incry: Optional[float] = None
-    """The optional ``incry`` token defines the repeat distance on the Y axis"""
-
-    comment: Optional[str] = None
-    """The optional ``comment`` token is a comment for the polygon object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Polygon:
-        """Convert the given S-Expresstion into a Polygon object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(polygon ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``polygon``
-
-        Returns:
-            - Polygon: Object of the class initialized with the given S-Expression
-        """
-        # TODO: Polygons seem to not be available in the WKS editor GUI. Are those still a feature?
-        raise NotImplementedError("Polygons are not yet handled! Please report this bug along with the file being parsed.")
-
-    def to_sexpr(self, indent=0, newline=False):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        raise NotImplementedError("Polygons are not yet handled! Please report this bug along with the file being parsed.")
-
-@dataclass
-class Bitmap():
-    """The ``Polygon`` token defines on or more embedded images
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_image
-    """
-
-    name: str = ""
-    """The ``name`` token defines the name of the bitmap"""
-
-    position: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``position`` token defines the coordinates of the bitmap"""
-
-    option: Optional[str] = None
-    """The optional ``option`` token defines on which pages the image shall be shown. Possible values
-    are:
-    - None: Item will be shown on all pages
-    - `notonpage1`: On all pages except page 1
-    - `page1only`: Only visible on page 1"""
-
-    scale: float = 1.0
-    """The ``scale`` token defines the scale of the bitmap object"""
-
-    repeat: Optional[int] = None
-    """The optional ``repeat`` token defines the count for repeated incremental bitmaps"""
-
-    incrx: Optional[float] = None
-    """The optional ``incrx`` token defines the repeat distance on the X axis"""
-
-    incry: Optional[float] = None
-    """The optional ``incry`` token defines the repeat distance on the Y axis"""
-
-    # Comments seem to be buggy as of 25.06.2022 ..
-    comment: Optional[str] = None
-    """The optional ``comment`` token is a comment for the bitmap object"""
-
-    # TODO: Parse this nonesense as a binary struct to make it more useful
-    pngdata: List[str] = field(default_factory=list)
-    """The ``pngdata`` token defines a list of strings representing up to 32 bytes per entry of
-    the image being saved.
-
-    Format:
-    - "xx xx xx xx xx (..) xx "
-
-    The list must be 32byte aligned, leaving a space after the last byte as shown in the format
-    example.
-    """
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Bitmap:
-        """Convert the given S-Expresstion into a Bitmap object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(bitmap ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``bitmap``
-
-        Returns:
-            - Bitmap: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'bitmap':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'pos': object.position = WksPosition().from_sexpr(item)
-            if item[0] == 'option': object.option = item[1]
-            if item[0] == 'scale': object.scale = item[1]
-            if item[0] == 'repeat': object.repeat = item[1]
-            if item[0] == 'incrx': object.incrx = item[1]
-            if item[0] == 'incry': object.incry = item[1]
-            if item[0] == 'comment': object.comment = item[1]
-            if item[0] == 'pngdata':
-                if len(item) < 2: continue
-                for data in item[1:]:
-                    if data[0] != 'data': continue
-                    object.pngdata.append(data[1])
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
-        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
-        incry = f' (incry {self.incry})' if self.incry is not None else ''
-        option = f' (option {self.option})' if self.option is not None else ''
-        corner = f' {self.position.corner}' if self.position.corner is not None else ''
-
-        expression  = f'{indents}(bitmap (name "{dequote(self.name)}") '
-        expression += f'(pos {self.position.X} {self.position.Y}{corner}){option} (scale {self.scale})'
-        expression += f'{repeat}{incrx}{incry}\n'
-        if self.comment is not None:
-            # Here KiCad decides to only use 1 space for some unknown reason ..
-            expression += f' (comment "{dequote(self.comment)}")\n'
-        expression += f'{indents}(pngdata\n'
-        for data in self.pngdata:
-            expression += f'{indents}  (data "{data}")\n'
-        expression += f'{indents}  )\n'
-        expression += f'{indents}){endline}'
-        return expression
-
-
-@dataclass
-class TbText():
-    """The ``TbText`` token define text used in the title block of a work sheet
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_title_block_text"""
-
-    text: str = ""
-    """The ``text`` token defines the text itself"""
-
-    name: str = ""
-    """The ``name`` token defines the name of the text object"""
-
-    position: WksPosition = field(default_factory=lambda: WksPosition())
-    """The ``position`` token defines the position of the text"""
-
-    option: Optional[str] = None
-    """The optional ``option`` token defines on which pages the text shall be shown. Possible values
-    are:
-    - None: Item will be shown on all pages
-    - `notonpage1`: On all pages except page 1
-    - `page1only`: Only visible on page 1"""
-
-    rotate: Optional[float] = None
-    """The optional ``rotate`` token defines the rotation of the text in degrees"""
-
-    font: WksFont = field(default_factory=lambda: WksFont())
-    """The ``font`` token define how the text is drawn"""
-
-    justify: Optional[Justify] = None
-    """The optional ``justify`` token defines the justification of the text"""
-
-    maxlen: Optional[float] = None
-    """The optional ``maxlen`` token defines the maximum length of the text"""
-
-    maxheight: Optional[float] = None
-    """The optional ``maxheight`` token defines the maximum height of the text"""
-
-    repeat: Optional[int] = None
-    """The optional ``repeat`` token defines the count for repeated incremental text"""
-
-    incrx: Optional[float] = None
-    """The optional ``incrx`` token defines the repeat distance on the X axis"""
-
-    incry: Optional[float] = None
-    """The optional ``incry`` token defines the repeat distance on the Y axis"""
-
-    incrlabel: Optional[int] = None
-    """The optional ``incrlabel`` token defines the amount of characters that are moved with every
-    repeated incremental text"""
-
-    comment: Optional[str] = None
-    """The optional ``comment`` token is a comment for the text object"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> TbText:
-        """Convert the given S-Expresstion into a TbText object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(tbtext ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``tbtext``
-
-        Returns:
-            - TbText: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'tbtext':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.text = exp[1]
-        for item in exp[2:]:
-            if item[0] == 'name': object.name = item[1]
-            if item[0] == 'pos': object.position = WksPosition().from_sexpr(item)
-            if item[0] == 'option': object.option = item[1]
-            if item[0] == 'rotate': object.rotate = item[1]
-            if item[0] == 'font': object.font = WksFont().from_sexpr(item)
-            if item[0] == 'justify': object.justify = Justify().from_sexpr(item)
-            if item[0] == 'maxlen': object.maxlen = item[1]
-            if item[0] == 'maxheight': object.maxheight = item[1]
-            if item[0] == 'repeat': object.repeat = item[1]
-            if item[0] == 'incrx': object.incrx = item[1]
-            if item[0] == 'incry': object.incry = item[1]
-            if item[0] == 'incrlabel': object.incrlabel = item[1]
-            if item[0] == 'comment': object.comment = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        corner = f' {self.position.corner}' if self.position.corner is not None else ''
-        repeat = f' (repeat {self.repeat})' if self.repeat is not None else ''
-        incrx = f' (incrx {self.incrx})' if self.incrx is not None else ''
-        incry = f' (incry {self.incry})' if self.incry is not None else ''
-        option = f' (option {self.option})' if self.option is not None else ''
-        rotate = f' (rotate {self.rotate})' if self.rotate is not None else ''
-        justify = f' {self.justify.to_sexpr()}' if self.justify is not None else ''
-        maxlen = f' (maxlen {self.maxlen})' if self.maxlen is not None else ''
-        maxheight = f' (maxheight {self.maxheight})' if self.maxheight is not None else ''
-        incrlabel = f' (incrlabel {self.incrlabel})' if self.incrlabel is not None else ''
-        font = f' {self.font.to_sexpr()}' if self.font.to_sexpr() != '' else ''
-
-        expression  = f'{indents}(tbtext "{dequote(self.text)}" (name "{dequote(self.name)}") '
-        expression += f'(pos {self.position.X} {self.position.Y}{corner}){option}{rotate}'
-        expression += f'{font}{justify}{maxlen}{maxheight}{repeat}{incrx}{incry}{incrlabel}'
-        if self.comment is not None:
-            expression += f' (comment "{dequote(self.comment)}")\n'
-        expression += f'){endline}'
-        return expression
-
-
-@dataclass
-class TextSize():
-    """The ``TextSize`` define the default width and height of text"""
-
-    width: float = 1.5
-    """The ``width`` token defines the default width of a text element. Defaults to 1,5."""
-
-    height: float = 1.5
-    """The ``height`` token defines the default height of a text element. Defaults to 1,5."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> TextSize:
-        """Convert the given S-Expresstion into a TextSize object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(textsize ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list or when its not exactly 3 long
-            - Exception: When the first item of the list is not ``textsize``
-
-        Returns:
-            - TextSize: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list) or len(exp) != 3:
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'textsize':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        object.width = exp[1]
-        object.height = exp[2]
-        return object
-
-    def to_sexpr(self, indent=0, newline=False):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to False.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-        return f'{indents}(textsize {self.width} {self.height}){endline}'
-
-@dataclass
-class Setup():
-    """The ``setup`` token defines the configuration information for the work sheet
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_set_up_section"""
-
-    textSize: TextSize = field(default_factory=lambda: TextSize())
-    """The ``textSize`` token defines the default width and height of text"""
-
-    lineWidth: float = 0.15
-    """The ``lineWidth`` token attribute defines the default width of lines. Defaults to 0,15."""
-
-    textLineWidth: float = 0.15
-    """The ``textLineWidth`` token attribute define the default width of the lines used to draw 
-    text. Defaults to 0,15."""
-
-    leftMargin: float = 10.0
-    """The ``leftMargin`` token defines the distance from the left edge of the page"""
-
-    rightMargin: float = 10.0
-    """The ``rightMargin`` token defines the distance from the right edge of the page"""
-
-    topMargin: float = 10.0
-    """The ``topMargin`` token defines the distance from the top edge of the page"""
-
-    bottomMargin: float = 10.0
-    """The ``bottomMargin`` token defines the distance from the bottom edge of the page"""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> Setup:
-        """Convert the given S-Expresstion into a Setup object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(setup ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``setup``
-
-        Returns:
-            - Setup: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'setup':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'textsize': object.textSize = TextSize().from_sexpr(item)
-            if item[0] == 'linewidth': object.lineWidth = item[1]
-            if item[0] == 'textlinewidth': object.textLineWidth = item[1]
-            if item[0] == 'left_margin': object.leftMargin = item[1]
-            if item[0] == 'right_margin': object.rightMargin = item[1]
-            if item[0] == 'top_margin': object.topMargin = item[1]
-            if item[0] == 'bottom_margin': object.bottomMargin = item[1]
-        return object
-
-    def to_sexpr(self, indent=2, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 2.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        # KiCad puts no spaces between tokens here
-        expression =  f'{indents}(setup {self.textSize.to_sexpr()}(linewidth {self.lineWidth})'
-        expression += f'(textlinewidth {self.textLineWidth})\n{indents}'
-        expression += f'(left_margin {self.leftMargin})(right_margin {self.rightMargin})'
-        expression += f'(top_margin {self.topMargin})(bottom_margin {self.bottomMargin})'
-        expression += f'){endline}'
-
-        return expression
-
-@dataclass
-class WorkSheet():
-    """The ``WorkSheet`` token defines a KiCad worksheet (.kicad_wks file)
-
-    Documentation:
-        https://dev-docs.kicad.org/en/file-formats/sexpr-worksheet/#_header_section"""
-
-    version: str = KIUTILS_CREATE_NEW_VERSION_STR
-    """The ``version`` token defines the work sheet version using the YYYYMMDD date format"""
-
-    generator: str = KIUTILS_CREATE_NEW_GENERATOR_STR
-    """The ``generator`` token defines the program used to write the file"""
-
-    setup: Setup = field(default_factory=lambda: Setup())
-    """The ``setup`` token defines the configuration information for the work sheet"""
-
-    drawingObjects: List = field(default_factory=list)
-    """The ``drawingObjects`` token can contain zero or more texts, lines, rectangles, polys or images"""
-
-    filePath: Optional[str] = None
-    """The ``filePath`` token defines the path-like string to the board file. Automatically set when
-    ``self.from_file()`` is used. Allows the use of ``self.to_file()`` without parameters."""
-
-    @classmethod
-    def from_sexpr(cls, exp: list) -> WorkSheet:
-        """Convert the given S-Expresstion into a WorkSheet object
-
-        Args:
-            - exp (list): Part of parsed S-Expression ``(kicad_wks ...)``
-
-        Raises:
-            - Exception: When given parameter's type is not a list
-            - Exception: When the first item of the list is not ``kicad_wks``
-
-        Returns:
-            - WorkSheet: Object of the class initialized with the given S-Expression
-        """
-        if not isinstance(exp, list):
-            raise Exception("Expression does not have the correct type")
-
-        if exp[0] != 'kicad_wks':
-            raise Exception("Expression does not have the correct type")
-
-        object = cls()
-        for item in exp[1:]:
-            if item[0] == 'version': object.version = item[1]
-            if item[0] == 'generator': object.generator = item[1]
-            if item[0] == 'setup': object.setup = Setup().from_sexpr(item)
-            if item[0] == 'rect': object.drawingObjects.append(Rect().from_sexpr(item))
-            if item[0] == 'line': object.drawingObjects.append(Line().from_sexpr(item))
-            if item[0] == 'polygon': object.drawingObjects.append(Polygon().from_sexpr(item))
-            if item[0] == 'tbtext': object.drawingObjects.append(TbText().from_sexpr(item))
-            if item[0] == 'bitmap': object.drawingObjects.append(Bitmap().from_sexpr(item))
-        return object
-
-    @classmethod
-    def from_file(cls, filepath: str, encoding: Optional[str] = None) -> WorkSheet:
-        """Load a worksheet directly from a KiCad worksheet file (`.kicad_wks`) and sets the
-        ``self.filePath`` attribute to the given file path.
-
-        Args:
-            - filepath (str): Path or path-like object that points to the file
-            - encoding (str, optional): Encoding of the input file. Defaults to None (platform 
-                                        dependent encoding).
-
-        Raises:
-            - Exception: If the given path is not a file
-
-        Returns:
-            - WorkSheet: Object of the WorkSheet class initialized with the given KiCad worksheet
-        """
-        if not path.isfile(filepath):
-            raise Exception("Given path is not a file!")
-
-        with open(filepath, 'r', encoding=encoding) as infile:
-            item = cls.from_sexpr(sexpr.parse_sexp(infile.read()))
-            item.filePath = filepath
-            return item
-
-    @classmethod
-    def create_new(cls) -> WorkSheet:
-        """Creates a new empty worksheet as KiCad would create it
-
-        Returns:
-            WorkSheet: A empty worksheet
-        """
-        return cls(
-            version = KIUTILS_CREATE_NEW_VERSION_STR,
-            generator = KIUTILS_CREATE_NEW_GENERATOR_STR
-        )
-
-    def to_file(self, filepath = None):
-        """Save the object to a file in S-Expression format
-
-        Args:
-            - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, 
-                                        the attribute ``self.filePath`` will be used instead.
-
-        Raises:
-            - Exception: If no file path is given via the argument or via `self.filePath`
-        """
-        if filepath is None:
-            if self.filePath is None:
-                raise Exception("File path not set")
-            filepath = self.filePath
-
-        with open(filepath, 'w') as outfile:
-            outfile.write(self.to_sexpr())
-
-    def to_sexpr(self, indent=0, newline=True):
-        """Generate the S-Expression representing this object
-
-        Args:
-            - indent (int): Number of whitespaces used to indent the output. Defaults to 0.
-            - newline (bool): Adds a newline to the end of the output. Defaults to True.
-
-        Returns:
-            - str: S-Expression of this object
-        """
-        indents = ' '*indent
-        endline = '\n' if newline else ''
-
-        expression =  f'{indents}(kicad_wks (version {self.version}) (generator {self.generator})\n'
-        expression += self.setup.to_sexpr(indent+2)
-        for item in self.drawingObjects:
-            expression += item.to_sexpr(indent+2)
-        expression += f'{indents}){endline}'
-
-        return expression
\ No newline at end of file

From da1851b153e33b7d7eb9190f645527295ead6a5f Mon Sep 17 00:00:00 2001
From: Manoj Chavva 
Date: Fri, 20 Sep 2024 17:52:09 +0530
Subject: [PATCH 3/3] Added Version increment

---
 setup.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/setup.cfg b/setup.cfg
index 4cefcc4..1302e89 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 [metadata]
 name = kiutils
-version = 1.4.8
+version = 1.4.9
 author = Marvin Mager
 author_email = 99667992+mvnmgrx@users.noreply.github.com
 description = Simple and SCM-friendly KiCad file parser for KiCad 6.0 and up