diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2016-04-23 21:35:45 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2016-04-23 21:35:45 +0300 |
commit | aa4f6e4b5666583e49ac0bf421f2ba35f78358d1 (patch) | |
tree | 163473d023b8ee1ef108be62b3e785026be4b66e |
First commit
-rw-r--r-- | Config/LUFAConfig.h | 126 | ||||
-rw-r--r-- | Descriptors.c | 224 | ||||
-rw-r--r-- | Descriptors.h | 124 | ||||
-rw-r--r-- | bits.h | 13 | ||||
-rw-r--r-- | board/BoardOutline.gbr | 19 | ||||
-rw-r--r-- | board/Bottom.gbr | 1990 | ||||
-rw-r--r-- | board/BottomMask.gbr | 94 | ||||
-rw-r--r-- | board/BottomSilk.gbr | 12 | ||||
-rw-r--r-- | board/Top.gbr | 2322 | ||||
-rw-r--r-- | board/TopMask.gbr | 177 | ||||
-rw-r--r-- | board/TopSilk.gbr | 1078 | ||||
-rw-r--r-- | board/nessmd2usb.dip | bin | 0 -> 209041 bytes | |||
-rw-r--r-- | board/~nessmd2usb.dip~ | 3 | ||||
-rw-r--r-- | defines.h | 30 | ||||
-rw-r--r-- | doxyfile | 2364 | ||||
-rw-r--r-- | gamepad.c | 347 | ||||
-rw-r--r-- | gamepad.h | 59 | ||||
-rw-r--r-- | images/board_3d.png | bin | 0 -> 37098 bytes | |||
-rw-r--r-- | images/photo.jpg | bin | 0 -> 92218 bytes | |||
-rw-r--r-- | makefile | 30 | ||||
-rw-r--r-- | nessmd2usb.c | 212 | ||||
-rw-r--r-- | nessmd2usb.h | 113 | ||||
-rw-r--r-- | nessmd2usb.hex | 418 |
23 files changed, 9755 insertions, 0 deletions
diff --git a/Config/LUFAConfig.h b/Config/LUFAConfig.h new file mode 100644 index 0000000..c654244 --- /dev/null +++ b/Config/LUFAConfig.h @@ -0,0 +1,126 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief LUFA Library Configuration Header File + * + * This header file is used to configure LUFA's compile time options, + * as an alternative to the compile time constants supplied through + * a makefile. + * + * For information on what each token does, refer to the LUFA + * manual section "Summary of Compile Tokens". + */ + +#ifndef _LUFA_CONFIG_H_ +#define _LUFA_CONFIG_H_ + + #if (ARCH == ARCH_AVR8) + + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ +// #define ORDERED_EP_CONFIG + #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) + #define USB_DEVICE_ONLY +// #define USB_HOST_ONLY +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 +// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE +// #define INTERRUPT_CONTROL_ENDPOINT +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + + /* USB Host Mode Driver Related Tokens: */ +// #define HOST_STATE_AS_GPIOR {Insert Value Here} +// #define USB_HOST_TIMEOUT_MS {Insert Value Here} +// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} +// #define NO_AUTO_VBUS_MANAGEMENT +// #define INVERTED_VBUS_ENABLE_LINE + + #elif (ARCH == ARCH_XMEGA) + + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ + #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 +// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE + #define MAX_ENDPOINT_INDEX 1 +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + + #else + + #error Unsupported architecture for this LUFA configuration file. + + #endif +#endif diff --git a/Descriptors.c b/Descriptors.c new file mode 100644 index 0000000..09583ae --- /dev/null +++ b/Descriptors.c @@ -0,0 +1,224 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** HID class report descriptor. This is a special descriptor constructed with values from the + * USBIF HID class specification to describe the reports and capabilities of the HID device. This + * descriptor is parsed by the host and its contents used to determine what data (and in what encoding) + * the device will send, and what it may be sent back from the host. Refer to the HID specification for + * more details on HID report descriptors. + */ + +const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = +{ + /* Use the HID class driver's standard Joystick report. + * Min X/Y/Z Axis values: -100 + * Max X/Y/Z Axis values: 100 + * Min physical X/Y/Z Axis values (used to determine resolution): -1 + * Max physical X/Y/Z Axis values (used to determine resolution): 1 + * Buttons: 2 + */ + HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 8, 1), + HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 8, 2), + HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 4, 3), + HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 4, 4) +}; + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(1,1,0), + .Class = USB_CSCP_NoDeviceClass, + .SubClass = USB_CSCP_NoDeviceSubclass, + .Protocol = USB_CSCP_NoDeviceProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, + .ProductID = 0x2044, + .ReleaseNumber = VERSION_BCD(0,0,1), + + .ManufacturerStrIndex = STRING_ID_Manufacturer, + .ProductStrIndex = STRING_ID_Product, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 1, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .HID_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = INTERFACE_ID_Joystick, + .AlternateSetting = 0x00, + + .TotalEndpoints = 1, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .HID_JoystickHID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(JoystickReport) + }, + + .HID_ReportINEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Cluster"); + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"Sega/Dendy controllers"); + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case STRING_ID_Language: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case STRING_ID_Manufacturer: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case STRING_ID_Product: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + case HID_DTYPE_HID: + Address = &ConfigurationDescriptor.HID_JoystickHID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; + case HID_DTYPE_Report: + Address = &JoystickReport; + Size = sizeof(JoystickReport); + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/Descriptors.h b/Descriptors.h new file mode 100644 index 0000000..6355eeb --- /dev/null +++ b/Descriptors.h @@ -0,0 +1,124 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include <avr/pgmspace.h> + + #include <LUFA/Drivers/USB/USB.h> + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // Joystick HID Interface + USB_Descriptor_Interface_t HID_Interface; + USB_HID_Descriptor_HID_t HID_JoystickHID; + USB_Descriptor_Endpoint_t HID_ReportINEndpoint; + } USB_Descriptor_Configuration_t; + + /** Enum for the device interface descriptor IDs within the device. Each interface descriptor + * should have a unique ID index associated with it, which can be used to refer to the + * interface from other descriptors. + */ + enum InterfaceDescriptors_t + { + INTERFACE_ID_Joystick = 0, /**< Joystick interface desciptor ID */ + }; + + /** Enum for the device string descriptor IDs within the device. Each string descriptor should + * have a unique ID index associated with it, which can be used to refer to the string from + * other descriptors. + */ + enum StringDescriptors_t + { + STRING_ID_Language = 0, /**< Supported Languages string descriptor ID (must be zero) */ + STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ + STRING_ID_Product = 2, /**< Product string ID */ + }; + + /* Macros: */ + /** Endpoint address of the Joystick HID reporting IN endpoint. */ + #define JOYSTICK_EPADDR (ENDPOINT_DIR_IN | 1) + + /** Size in bytes of the Joystick HID reporting IN endpoint. */ + #define JOYSTICK_EPSIZE 8 + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + + +#define HID_DESCRIPTOR_JOYSTICK_MY(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, ReportId) \ + HID_RI_USAGE_PAGE(8, 0x01), \ + HID_RI_USAGE(8, 0x04), \ + HID_RI_COLLECTION(8, 0x01), \ + HID_RI_USAGE(8, 0x01), \ + HID_RI_COLLECTION(8, 0x00), \ + HID_RI_REPORT_ID(8, ReportId), \ + HID_RI_USAGE(8, 0x30), \ + HID_RI_USAGE(8, 0x31), \ + HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ + HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ + HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ + HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ + HID_RI_REPORT_COUNT(8, 2), \ + HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_END_COLLECTION(0), \ + HID_RI_USAGE_PAGE(8, 0x09), \ + HID_RI_USAGE_MINIMUM(8, 0x01), \ + HID_RI_USAGE_MAXIMUM(8, Buttons), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ + HID_RI_REPORT_SIZE(8, 0x01), \ + HID_RI_REPORT_COUNT(8, Buttons), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ + HID_RI_REPORT_COUNT(8, 0x01), \ + HID_RI_INPUT(8, HID_IOF_CONSTANT), \ + HID_RI_END_COLLECTION(0) + +#endif + @@ -0,0 +1,13 @@ +#define _BVL(bit) (1UL << (bit)) +#define set(reg,value) reg |= (value) +#define unset(reg,value) reg &= ~(value) +#define set_bit(reg,value) reg |= (_BVL(value)) +#define set_bit2(reg,value1,value2) reg |= (_BVL(value1) | _BVL(value2)) +#define set_bit3(reg,value1,value2,value3) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3)) +#define set_bit4(reg,value1,value2,value3,value4) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4)) +#define set_bit5(reg,value1,value2,value3,value4,value5) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4) | _BVL(value5)) +#define unset_bit(reg,value) reg &= ~(_BVL(value)) +#define unset_bit2(reg,value1,value2) reg &= ~(_BVL(value1) | _BVL(value2)) +#define unset_bit3(reg,value1,value2,value3) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3)) +#define unset_bit4(reg,value1,value2,value3,value4) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4)) +#define unset_bit5(reg,value1,value2,value3,value4,value5) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4) | _BVL(value5)) diff --git a/board/BoardOutline.gbr b/board/BoardOutline.gbr new file mode 100644 index 0000000..66ff305 --- /dev/null +++ b/board/BoardOutline.gbr @@ -0,0 +1,19 @@ +G04 DipTrace 2.4.0.2* +%INBoardOutline.gbr*% +%MOIN*% +%ADD11C,0.0055*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNBoardOutline*% +%LPD*% +X3937Y24437D2* +D11* +X33437D1* +Y3937D1* +X3937D1* +Y24437D1* +M02* diff --git a/board/Bottom.gbr b/board/Bottom.gbr new file mode 100644 index 0000000..bdafb34 --- /dev/null +++ b/board/Bottom.gbr @@ -0,0 +1,1990 @@ +G04 DipTrace 2.4.0.2* +%INBottom.gbr*% +%MOIN*% +%ADD13C,0.0118*% +%ADD14C,0.0079*% +%ADD15C,0.025*% +%ADD18R,0.063X0.063*% +%ADD19C,0.063*% +%ADD24R,0.0665X0.0665*% +%ADD26C,0.0665*% +%ADD27C,0.1874*% +%ADD28C,0.189*% +%ADD34C,0.0276*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNBottom*% +%LPD*% +X24302Y11411D2* +D14* +X13051D1* +X12913Y11549D1* +Y15590D1* +X12776Y15727D1* +X6574D1* +X28526Y20805D2* +Y18044D1* +X26645Y16163D1* +Y11431D1* +X26221Y11008D1* +Y8273D1* +X25676Y7727D1* +Y7217D1* +X25538Y7079D1* +X22464D1* +X21973Y7569D1* +X25245D2* +Y11125D1* +X25582Y11462D1* +Y11746D1* +X25818Y11982D1* +Y16959D1* +X25254Y17523D1* +Y20805D1* +X25247Y11648D2* +X21437Y15458D1* +Y19687D1* +X13189Y12691D2* +Y19980D1* +X13051Y20118D1* +X11475D1* +X10788Y20805D1* +X13882Y13321D2* +Y20667D1* +X13744Y20805D1* +X11879D1* +X8075Y8687D2* +Y12061D1* +X9165Y8687D2* +Y11746D1* +X10256Y8687D2* +Y11431D1* +X8620Y7569D2* +Y9915D1* +X28516Y13293D2* +X27706D1* +X25470Y13321D2* +D13* +X24932D1* +Y13596D1* +X24617D1* +X8062Y19687D2* +X6023Y17648D1* +Y14686D1* +X6259Y14449D1* +X12201D1* +X12437Y14213D1* +Y8687D1* +X21982Y20805D2* +X21183Y21604D1* +X8298D1* +X8062Y21368D1* +Y19687D1* +X24617Y13596D2* +X21982Y16231D1* +Y20805D1* +X29011Y13435D2* +Y12954D1* +X28517Y12460D1* +Y7569D1* +X27984Y13687D2* +X28047Y13750D1* +X28696D1* +X29011Y13435D1* +D34* +X10872Y14938D3* +X8997D3* +Y18126D3* +Y16126D3* +X12562Y14937D3* +X12123Y16126D3* +X10497Y18876D3* +X12873Y16439D3* +X12935Y17501D3* +X11623Y18876D3* +X12748D3* +X13560Y18064D3* +X16623Y15001D3* +X15935Y14563D3* +X15248Y14126D3* +X13560Y16939D3* +X21749Y12376D3* +X17873D3* +X13623D3* +X11935D3* +X8560D3* +X8622Y11438D3* +Y10438D3* +X9685Y11313D3* +Y10438D3* +X10685Y10750D3* +X11998D3* +X12935Y10625D3* +X17998D3* +X22936D3* +X6434Y16876D3* +X8997Y13438D3* +X11998D3* +X13498D3* +Y14813D3* +X24936Y14626D3* +X26187Y14938D3* +Y14063D3* +X26937Y12438D3* +X28624Y12938D3* +X27749Y10625D3* +X25937Y10688D3* +X22374Y18001D3* +X24874D3* +X24374Y15563D3* +X13560Y15813D3* +X4309Y24064D3* +X33062D3* +Y4312D3* +X4309D3* +X7810Y9250D3* +X25624Y18001D3* +X27999D3* +X25749Y9625D3* +X7872Y7375D3* +X6997Y8500D3* +X23561Y11751D3* +X24061Y13501D3* +X25499Y12501D3* +X6574Y15727D3* +X24302Y11411D3* +X26645Y11431D3* +X25582Y11746D3* +X25247Y11648D3* +X13189Y12691D3* +X13882Y13321D3* +X8075Y12061D3* +X9165Y11746D3* +X10256Y11431D3* +X8620Y9915D3* +X27706Y13293D3* +X28516D3* +X27984Y13687D3* +X29011Y13435D3* +X25470Y13321D3* +X24617Y13596D3* +X4337Y23813D2* +D15* +X33039D1* +X4337Y23565D2* +X33039D1* +X4337Y23316D2* +X33039D1* +X4337Y23067D2* +X33039D1* +X4337Y22819D2* +X33039D1* +X4337Y22570D2* +X33039D1* +X4337Y22321D2* +X33039D1* +X4337Y22073D2* +X33039D1* +X4337Y21824D2* +X8035D1* +X21448D2* +X33039D1* +X4337Y21575D2* +X7789D1* +X21694D2* +X33039D1* +X4337Y21326D2* +X7715D1* +X22300D2* +X22758D1* +X23390D2* +X23848D1* +X24480D2* +X24937D1* +X25569D2* +X26027D1* +X26663D2* +X27117D1* +X27753D2* +X28207D1* +X28843D2* +X33039D1* +X4337Y21078D2* +X7715D1* +X9163D2* +X10230D1* +X13905D2* +X21226D1* +X29081D2* +X33039D1* +X4337Y20829D2* +X7715D1* +X9230D2* +X10168D1* +X14163D2* +X21359D1* +X29148D2* +X33039D1* +X4337Y20580D2* +X7715D1* +X9187D2* +X10211D1* +X14210D2* +X21402D1* +X29105D2* +X33039D1* +X4337Y20332D2* +X7715D1* +X8995D2* +X10398D1* +X13292D2* +X13551D1* +X14210D2* +X21594D1* +X28913D2* +X33039D1* +X4337Y20083D2* +X7590D1* +X8534D2* +X8680D1* +X9624D2* +X9770D1* +X10714D2* +X10862D1* +X14210D2* +X20965D1* +X28855D2* +X33039D1* +X4337Y19834D2* +X7457D1* +X14210D2* +X20832D1* +X28855D2* +X33039D1* +X4337Y19586D2* +X7449D1* +X14210D2* +X20824D1* +X28855D2* +X33039D1* +X4337Y19337D2* +X7230D1* +X14210D2* +X20930D1* +X28855D2* +X33039D1* +X4337Y19088D2* +X6980D1* +X7944D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X28195D1* +X28855D2* +X33039D1* +X4337Y18840D2* +X6730D1* +X7698D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X28195D1* +X28855D2* +X33039D1* +X4337Y18591D2* +X6484D1* +X7448D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X28195D1* +X28855D2* +X33039D1* +X4337Y18342D2* +X6234D1* +X7198D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X28195D1* +X28855D2* +X33039D1* +X4337Y18094D2* +X5984D1* +X6952D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X28121D1* +X28855D2* +X33039D1* +X4337Y17845D2* +X5742D1* +X6702D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25581D2* +X27871D1* +X28780D2* +X33039D1* +X4337Y17596D2* +X5676D1* +X6452D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24926D1* +X25636D2* +X27621D1* +X28534D2* +X33039D1* +X4337Y17347D2* +X5676D1* +X6370D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X24980D1* +X25886D2* +X27375D1* +X28284D2* +X33039D1* +X4337Y17099D2* +X5676D1* +X6370D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X25223D1* +X26112D2* +X27125D1* +X28034D2* +X33039D1* +X4337Y16850D2* +X5676D1* +X6370D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X25473D1* +X26148D2* +X26875D1* +X27788D2* +X33039D1* +X4337Y16601D2* +X5676D1* +X6370D2* +X12859D1* +X14210D2* +X21109D1* +X22331D2* +X25488D1* +X26148D2* +X26629D1* +X27538D2* +X33039D1* +X4337Y16353D2* +X5676D1* +X6370D2* +X12859D1* +X14210D2* +X21109D1* +X22343D2* +X25488D1* +X26148D2* +X26383D1* +X27288D2* +X33039D1* +X4337Y16104D2* +X5676D1* +X6741D2* +X12859D1* +X14210D2* +X21109D1* +X22593D2* +X25488D1* +X26148D2* +X26316D1* +X27042D2* +X33039D1* +X4337Y15855D2* +X5676D1* +X14210D2* +X21109D1* +X22843D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X33039D1* +X4337Y15607D2* +X5676D1* +X14210D2* +X21109D1* +X21765D2* +X22125D1* +X23089D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X33039D1* +X4337Y15358D2* +X5676D1* +X6757D2* +X12586D1* +X14210D2* +X21125D1* +X21991D2* +X22371D1* +X23339D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X31453D1* +X31733D2* +X33039D1* +X4337Y15109D2* +X5676D1* +X6370D2* +X12586D1* +X14210D2* +X21332D1* +X22241D2* +X22621D1* +X23589D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X31164D1* +X32023D2* +X33039D1* +X4337Y14861D2* +X5676D1* +X6370D2* +X12586D1* +X14210D2* +X21578D1* +X22491D2* +X22871D1* +X23835D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X31133D1* +X32054D2* +X33039D1* +X4337Y14612D2* +X5683D1* +X14210D2* +X21828D1* +X22737D2* +X23117D1* +X24085D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X31262D1* +X31925D2* +X33039D1* +X4337Y14363D2* +X5863D1* +X14210D2* +X22078D1* +X22987D2* +X23367D1* +X24335D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X33039D1* +X4337Y14115D2* +X12051D1* +X14210D2* +X22324D1* +X23237D2* +X23617D1* +X24581D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X33039D1* +X4337Y13866D2* +X12090D1* +X14210D2* +X22574D1* +X23483D2* +X23863D1* +X25136D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X27598D1* +X29062D2* +X33039D1* +X4337Y13617D2* +X12090D1* +X14210D2* +X22824D1* +X23733D2* +X24113D1* +X26148D2* +X26316D1* +X26976D2* +X27441D1* +X29394D2* +X31426D1* +X31761D2* +X33039D1* +X4337Y13368D2* +X12090D1* +X14308D2* +X23070D1* +X23983D2* +X24262D1* +X26148D2* +X26316D1* +X26976D2* +X27285D1* +X29433D2* +X31160D1* +X32026D2* +X33039D1* +X4337Y13120D2* +X12090D1* +X14257D2* +X23320D1* +X24230D2* +X24652D1* +X26148D2* +X26316D1* +X26976D2* +X27316D1* +X29358D2* +X31133D1* +X32054D2* +X33039D1* +X4337Y12871D2* +X12090D1* +X13573D2* +X23570D1* +X24480D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X28445D1* +X29351D2* +X31273D1* +X31913D2* +X33039D1* +X4337Y12622D2* +X12090D1* +X13612D2* +X23816D1* +X24730D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X28211D1* +X29163D2* +X33039D1* +X4337Y12374D2* +X7797D1* +X8355D2* +X12090D1* +X13460D2* +X24066D1* +X24976D2* +X25488D1* +X26148D2* +X26316D1* +X26976D2* +X28168D1* +X28913D2* +X33039D1* +X4337Y12125D2* +X7652D1* +X8499D2* +X9004D1* +X9327D2* +X12090D1* +X13241D2* +X24316D1* +X25226D2* +X25422D1* +X26148D2* +X26316D1* +X26976D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y11876D2* +X7691D1* +X8456D2* +X8758D1* +X9569D2* +X12090D1* +X13241D2* +X24562D1* +X26128D2* +X26316D1* +X26976D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y11628D2* +X7746D1* +X8405D2* +X8754D1* +X9573D2* +X9879D1* +X10632D2* +X12090D1* +X24667D2* +X24812D1* +X25991D2* +X26269D1* +X27023D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y11379D2* +X7746D1* +X8405D2* +X8836D1* +X9495D2* +X9832D1* +X10679D2* +X12090D1* +X24730D2* +X24922D1* +X25898D2* +X26137D1* +X27069D2* +X28168D1* +X28866D2* +X29207D1* +X30417D2* +X33039D1* +X4337Y11130D2* +X7746D1* +X8405D2* +X8836D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X24616D2* +X24918D1* +X25706D2* +X25918D1* +X26937D2* +X28168D1* +X28866D2* +X29207D1* +X30417D2* +X33039D1* +X4337Y10882D2* +X7746D1* +X8405D2* +X8836D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X29207D1* +X30417D2* +X33039D1* +X4337Y10633D2* +X7746D1* +X8405D2* +X8836D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X29207D1* +X30417D2* +X33039D1* +X4337Y10384D2* +X7746D1* +X8405D2* +X8836D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X29207D1* +X30417D2* +X33039D1* +X4337Y10135D2* +X7746D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y9887D2* +X7746D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y9638D2* +X7746D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y9389D2* +X7746D1* +X9495D2* +X9926D1* +X10585D2* +X12090D1* +X12784D2* +X24918D1* +X25573D2* +X25891D1* +X26550D2* +X28168D1* +X28866D2* +X33039D1* +X4337Y9141D2* +X7453D1* +X9577D2* +X9844D1* +X10671D2* +X10933D1* +X11761D2* +X12023D1* +X12851D2* +X22105D1* +X22933D2* +X23195D1* +X24023D2* +X24285D1* +X27296D2* +X27558D1* +X29476D2* +X33039D1* +X4337Y8892D2* +X7453D1* +X13023D2* +X21933D1* +X29648D2* +X33039D1* +X4337Y8643D2* +X7453D1* +X13058D2* +X21898D1* +X29683D2* +X33039D1* +X4337Y8395D2* +X7453D1* +X12983D2* +X21973D1* +X29608D2* +X33039D1* +X4337Y8146D2* +X7453D1* +X10534D2* +X11066D1* +X12714D2* +X21793D1* +X29339D2* +X33039D1* +X4337Y7897D2* +X8098D1* +X10233D2* +X11367D1* +X12417D2* +X21449D1* +X29042D2* +X33039D1* +X4337Y7649D2* +X8004D1* +X10327D2* +X11273D1* +X12507D2* +X21355D1* +X29132D2* +X33039D1* +X4337Y7400D2* +X8023D1* +X10308D2* +X11293D1* +X12491D2* +X21375D1* +X29116D2* +X33039D1* +X4337Y7151D2* +X8168D1* +X9073D2* +X9258D1* +X10163D2* +X11441D1* +X12343D2* +X21519D1* +X26788D2* +X26973D1* +X27878D2* +X28066D1* +X28968D2* +X33039D1* +X4337Y6903D2* +X22183D1* +X25816D2* +X33039D1* +X4337Y6654D2* +X33039D1* +X4337Y6405D2* +X33039D1* +X4337Y6156D2* +X33039D1* +X4337Y5908D2* +X33039D1* +X4337Y5659D2* +X33039D1* +X4337Y5410D2* +X33039D1* +X4337Y5162D2* +X33039D1* +X4337Y4913D2* +X33039D1* +X4337Y4664D2* +X33039D1* +X4337Y4416D2* +X33039D1* +X29357Y11393D2* +X30392D1* +Y10233D1* +X29232D1* +Y11393D1* +X29357D1* +X32018Y13076D2* +X31967Y12962D1* +X31886Y12867D1* +X31782Y12799D1* +X31663Y12762D1* +X31538Y12760D1* +X31418Y12793D1* +X31312Y12858D1* +X31228Y12951D1* +X31173Y13062D1* +X31152Y13185D1* +X31165Y13309D1* +X31213Y13424D1* +X31291Y13521D1* +X31393Y13593D1* +X31511Y13633D1* +X31635Y13639D1* +X31756Y13610D1* +X31865Y13548D1* +X31951Y13459D1* +X32009Y13349D1* +X32036Y13199D1* +X32018Y13076D1* +Y14808D2* +X31967Y14694D1* +X31886Y14600D1* +X31782Y14531D1* +X31663Y14495D1* +X31538Y14493D1* +X31418Y14526D1* +X31312Y14591D1* +X31228Y14683D1* +X31173Y14795D1* +X31152Y14917D1* +X31165Y15041D1* +X31213Y15156D1* +X31291Y15254D1* +X31393Y15325D1* +X31511Y15366D1* +X31635Y15371D1* +X31756Y15342D1* +X31865Y15281D1* +X31951Y15191D1* +X32009Y15081D1* +X32036Y14931D1* +X32018Y14808D1* +X7602Y9285D2* +X7770D1* +X7771Y11800D1* +X7696Y11924D1* +X7672Y12046D1* +X7687Y12170D1* +X7739Y12283D1* +X7822Y12375D1* +X7930Y12437D1* +X8052Y12463D1* +X8176Y12451D1* +X8290Y12401D1* +X8384Y12319D1* +X8448Y12213D1* +X8478Y12061D1* +X8458Y11938D1* +X8402Y11827D1* +X8378Y11802D1* +X8379Y10237D1* +X8476Y10291D1* +X8597Y10318D1* +X8721Y10305D1* +X8835Y10256D1* +X8862Y10233D1* +X8861Y11480D1* +X8787Y11609D1* +X8763Y11731D1* +X8778Y11855D1* +X8829Y11968D1* +X8913Y12060D1* +X9021Y12122D1* +X9143Y12148D1* +X9266Y12136D1* +X9381Y12086D1* +X9474Y12004D1* +X9538Y11898D1* +X9568Y11746D1* +X9549Y11623D1* +X9493Y11512D1* +X9468Y11487D1* +X9470Y9203D1* +X9562Y9134D1* +X9646Y9042D1* +X9711Y8930D1* +X9771Y9036D1* +X9854Y9129D1* +X9951Y9201D1* +X9952Y11167D1* +X9877Y11294D1* +X9853Y11416D1* +X9868Y11540D1* +X9920Y11653D1* +X10004Y11745D1* +X10111Y11807D1* +X10233Y11833D1* +X10357Y11821D1* +X10471Y11771D1* +X10565Y11689D1* +X10629Y11583D1* +X10659Y11431D1* +X10639Y11308D1* +X10583Y11197D1* +X10559Y11172D1* +X10560Y9201D1* +X10653Y9134D1* +X10737Y9042D1* +X10801Y8930D1* +X10861Y9036D1* +X10944Y9129D1* +X11045Y9203D1* +X11159Y9254D1* +X11280Y9281D1* +X11405Y9282D1* +X11527Y9257D1* +X11642Y9207D1* +X11743Y9134D1* +X11827Y9042D1* +X11892Y8930D1* +X11952Y9036D1* +X12035Y9129D1* +X12113Y9187D1* +Y14082D1* +X11951Y14125D1* +X6259D1* +X6137Y14149D1* +X6030Y14220D1* +X5794Y14456D1* +X5724Y14560D1* +X5699Y14686D1* +Y17648D1* +X5722Y17770D1* +X5794Y17877D1* +X7476Y19559D1* +X7464Y19685D1* +X7477Y19809D1* +X7515Y19928D1* +X7577Y20036D1* +X7660Y20129D1* +X7738Y20187D1* +Y21368D1* +X7762Y21490D1* +X7833Y21597D1* +X8069Y21833D1* +X8172Y21903D1* +X8298Y21928D1* +X21183D1* +X21305Y21904D1* +X21412Y21833D1* +X21857Y21389D1* +X21916Y21399D1* +X22041Y21400D1* +X22163Y21375D1* +X22278Y21325D1* +X22379Y21252D1* +X22463Y21160D1* +X22528Y21049D1* +X22588Y21154D1* +X22671Y21247D1* +X22771Y21321D1* +X22885Y21372D1* +X23007Y21399D1* +X23132Y21400D1* +X23254Y21375D1* +X23368Y21325D1* +X23470Y21252D1* +X23554Y21160D1* +X23618Y21049D1* +X23678Y21154D1* +X23761Y21247D1* +X23862Y21321D1* +X23975Y21372D1* +X24097Y21399D1* +X24222Y21400D1* +X24344Y21375D1* +X24459Y21325D1* +X24560Y21252D1* +X24644Y21160D1* +X24709Y21049D1* +X24769Y21154D1* +X24852Y21247D1* +X24952Y21321D1* +X25066Y21372D1* +X25188Y21399D1* +X25313Y21400D1* +X25435Y21375D1* +X25549Y21325D1* +X25651Y21252D1* +X25735Y21160D1* +X25799Y21049D1* +X25859Y21154D1* +X25942Y21247D1* +X26043Y21321D1* +X26157Y21372D1* +X26278Y21399D1* +X26403Y21400D1* +X26525Y21375D1* +X26640Y21325D1* +X26741Y21252D1* +X26825Y21160D1* +X26890Y21049D1* +X26950Y21154D1* +X27033Y21247D1* +X27133Y21321D1* +X27247Y21372D1* +X27369Y21399D1* +X27494Y21400D1* +X27616Y21375D1* +X27730Y21325D1* +X27832Y21252D1* +X27916Y21160D1* +X27980Y21049D1* +X28040Y21154D1* +X28123Y21247D1* +X28224Y21321D1* +X28338Y21372D1* +X28460Y21399D1* +X28584Y21400D1* +X28707Y21375D1* +X28821Y21325D1* +X28922Y21252D1* +X29006Y21160D1* +X29070Y21052D1* +X29109Y20934D1* +X29123Y20805D1* +X29110Y20681D1* +X29072Y20562D1* +X29009Y20454D1* +X28926Y20361D1* +X28828Y20290D1* +X28830Y18044D1* +X28802Y17919D1* +X28741Y17829D1* +X26948Y16036D1* +X26949Y11698D1* +X27018Y11583D1* +X27047Y11431D1* +X27028Y11308D1* +X26972Y11197D1* +X26885Y11108D1* +X26775Y11050D1* +X26679Y11033D1* +X26526Y10882D1* +Y9168D1* +X26579Y9203D1* +X26693Y9254D1* +X26815Y9281D1* +X26940Y9282D1* +X27062Y9257D1* +X27176Y9207D1* +X27278Y9134D1* +X27362Y9042D1* +X27426Y8930D1* +X27486Y9036D1* +X27569Y9129D1* +X27670Y9203D1* +X27784Y9254D1* +X27905Y9281D1* +X28030Y9282D1* +X28152Y9257D1* +X28192Y9239D1* +X28193Y12460D1* +X28217Y12582D1* +X28288Y12689D1* +X28489Y12890D1* +X28400Y12908D1* +X28288Y12961D1* +X28256Y12991D1* +X27973Y12989D1* +X27836Y12912D1* +X27713Y12891D1* +X27590Y12908D1* +X27478Y12961D1* +X27387Y13047D1* +X27327Y13156D1* +X27303Y13278D1* +X27318Y13402D1* +X27370Y13515D1* +X27453Y13607D1* +X27580Y13673D1* +X27596Y13795D1* +X27648Y13909D1* +X27732Y14001D1* +X27840Y14063D1* +X27961Y14089D1* +X28172Y14074D1* +X28696D1* +X28818Y14050D1* +X28925Y13979D1* +X29072Y13833D1* +X29112Y13825D1* +X29226Y13775D1* +X29320Y13693D1* +X29384Y13587D1* +X29414Y13435D1* +X29395Y13312D1* +X29335Y13185D1* +Y12954D1* +X29311Y12832D1* +X29240Y12725D1* +X28840Y12325D1* +X28841Y9245D1* +X28996Y9281D1* +X29121Y9282D1* +X29243Y9257D1* +X29357Y9207D1* +X29459Y9134D1* +X29543Y9042D1* +X29606Y8934D1* +X29646Y8816D1* +X29660Y8687D1* +X29647Y8563D1* +X29608Y8444D1* +X29546Y8336D1* +X29462Y8243D1* +X29362Y8170D1* +X29248Y8119D1* +X29126Y8093D1* +X29001D1* +X28879Y8118D1* +X28839Y8136D1* +X28841Y8073D1* +X28913Y8016D1* +X28998Y7924D1* +X29061Y7816D1* +X29100Y7698D1* +X29114Y7569D1* +X29101Y7445D1* +X29063Y7326D1* +X29000Y7218D1* +X28917Y7125D1* +X28816Y7052D1* +X28702Y7001D1* +X28580Y6975D1* +X28456Y6974D1* +X28333Y7000D1* +X28219Y7051D1* +X28118Y7124D1* +X28034Y7216D1* +X27970Y7328D1* +X27910Y7218D1* +X27827Y7125D1* +X27726Y7052D1* +X27612Y7001D1* +X27490Y6975D1* +X27365Y6974D1* +X27243Y7000D1* +X27129Y7051D1* +X27028Y7124D1* +X26944Y7216D1* +X26880Y7328D1* +X26819Y7218D1* +X26736Y7125D1* +X26635Y7052D1* +X26521Y7001D1* +X26399Y6975D1* +X26274Y6974D1* +X26152Y7000D1* +X26038Y7051D1* +X25959Y7108D1* +X25940Y7066D1* +X25891Y7001D1* +X25754Y6864D1* +X25646Y6795D1* +X25538Y6774D1* +X22464D1* +X22339Y6802D1* +X22248Y6864D1* +X22124Y6988D1* +X22037Y6975D1* +X21912Y6974D1* +X21790Y7000D1* +X21676Y7051D1* +X21575Y7124D1* +X21491Y7216D1* +X21428Y7324D1* +X21389Y7442D1* +X21376Y7566D1* +X21388Y7691D1* +X21426Y7809D1* +X21488Y7918D1* +X21571Y8011D1* +X21672Y8085D1* +X21786Y8136D1* +X21907Y8163D1* +X22032Y8164D1* +X22154Y8138D1* +X22269Y8088D1* +X22370Y8016D1* +X22454Y7924D1* +X22519Y7812D1* +X22579Y7918D1* +X22662Y8011D1* +X22762Y8085D1* +X22876Y8136D1* +X22998Y8163D1* +X23123Y8164D1* +X23245Y8138D1* +X23359Y8088D1* +X23461Y8016D1* +X23545Y7924D1* +X23609Y7812D1* +X23669Y7918D1* +X23752Y8011D1* +X23853Y8085D1* +X23967Y8136D1* +X24089Y8163D1* +X24213Y8164D1* +X24336Y8138D1* +X24450Y8088D1* +X24551Y8016D1* +X24635Y7924D1* +X24700Y7812D1* +X24760Y7918D1* +X24843Y8011D1* +X24940Y8083D1* +X24885Y8119D1* +X24763Y8093D1* +X24639D1* +X24517Y8118D1* +X24402Y8169D1* +X24301Y8242D1* +X24217Y8334D1* +X24154Y8446D1* +X24093Y8336D1* +X24010Y8243D1* +X23909Y8170D1* +X23795Y8119D1* +X23673Y8093D1* +X23548D1* +X23426Y8118D1* +X23312Y8169D1* +X23211Y8242D1* +X23127Y8334D1* +X23063Y8446D1* +X23002Y8336D1* +X22919Y8243D1* +X22818Y8170D1* +X22704Y8119D1* +X22582Y8093D1* +X22458D1* +X22335Y8118D1* +X22221Y8169D1* +X22120Y8242D1* +X22036Y8334D1* +X21974Y8442D1* +X21935Y8561D1* +X21921Y8685D1* +X21934Y8809D1* +X21972Y8928D1* +X22034Y9036D1* +X22117Y9129D1* +X22217Y9203D1* +X22331Y9254D1* +X22453Y9281D1* +X22577Y9282D1* +X22700Y9257D1* +X22814Y9207D1* +X22915Y9134D1* +X23000Y9042D1* +X23064Y8930D1* +X23124Y9036D1* +X23207Y9129D1* +X23308Y9203D1* +X23421Y9254D1* +X23543Y9281D1* +X23668Y9282D1* +X23790Y9257D1* +X23905Y9207D1* +X24006Y9134D1* +X24090Y9042D1* +X24155Y8930D1* +X24215Y9036D1* +X24298Y9129D1* +X24398Y9203D1* +X24512Y9254D1* +X24634Y9281D1* +X24759Y9282D1* +X24881Y9257D1* +X24942Y9230D1* +X24941Y11125D1* +X24968Y11250D1* +X24982Y11278D1* +X24868Y11511D1* +X24848Y11614D1* +X21222Y15243D1* +X21153Y15351D1* +X21133Y15458D1* +Y19173D1* +X21038Y19242D1* +X20955Y19334D1* +X20892Y19442D1* +X20853Y19561D1* +X20839Y19685D1* +X20852Y19809D1* +X20890Y19928D1* +X20952Y20036D1* +X21035Y20129D1* +X21135Y20203D1* +X21249Y20254D1* +X21371Y20281D1* +X21496Y20282D1* +X21618Y20257D1* +X21657Y20239D1* +X21584Y20360D1* +X21500Y20452D1* +X21437Y20560D1* +X21398Y20679D1* +X21385Y20803D1* +X21398Y20931D1* +X21049Y21280D1* +X12242D1* +X12360Y21160D1* +X12389Y21109D1* +X13744D1* +X13869Y21082D1* +X13959Y21020D1* +X14097Y20882D1* +X14166Y20775D1* +X14186Y20667D1* +X14191Y13579D1* +X14255Y13472D1* +X14284Y13321D1* +X14265Y13198D1* +X14209Y13087D1* +X14122Y12998D1* +X14012Y12940D1* +X13889Y12918D1* +X13766Y12935D1* +X13654Y12989D1* +X13563Y13074D1* +X13503Y13184D1* +X13494Y13233D1* +X13498Y12949D1* +X13562Y12842D1* +X13592Y12691D1* +X13572Y12568D1* +X13517Y12457D1* +X13429Y12368D1* +X13319Y12310D1* +X13216Y12292D1* +X13218Y11718D1* +X14551Y11716D1* +X24039D1* +X24158Y11787D1* +X24279Y11813D1* +X24403Y11801D1* +X24518Y11752D1* +X24611Y11670D1* +X24675Y11563D1* +X24705Y11411D1* +X24686Y11288D1* +X24630Y11177D1* +X24543Y11088D1* +X24432Y11030D1* +X24310Y11009D1* +X24186Y11026D1* +X24074Y11079D1* +X24043Y11109D1* +X17802Y11107D1* +X13051D1* +X12926Y11135D1* +X12836Y11196D1* +X12761Y11271D1* +Y9186D1* +X12834Y9134D1* +X12918Y9042D1* +X12981Y8934D1* +X13021Y8816D1* +X13035Y8687D1* +X13022Y8563D1* +X12983Y8444D1* +X12921Y8336D1* +X12837Y8243D1* +X12736Y8170D1* +X12623Y8119D1* +X12501Y8093D1* +X12376D1* +X12254Y8118D1* +X12140Y8169D1* +X12038Y8242D1* +X11955Y8334D1* +X11891Y8446D1* +X11830Y8336D1* +X11747Y8243D1* +X11646Y8170D1* +X11532Y8119D1* +X11410Y8093D1* +X11285D1* +X11163Y8118D1* +X11049Y8169D1* +X10948Y8242D1* +X10864Y8334D1* +X10800Y8446D1* +X10740Y8336D1* +X10656Y8243D1* +X10555Y8170D1* +X10441Y8119D1* +X10319Y8093D1* +X10195D1* +X10073Y8118D1* +X9958Y8169D1* +X9857Y8242D1* +X9774Y8334D1* +X9710Y8446D1* +X9649Y8336D1* +X9566Y8243D1* +X9465Y8170D1* +X9351Y8119D1* +X9229Y8093D1* +X9104D1* +X8982Y8118D1* +X8921Y8145D1* +X9017Y8016D1* +X9101Y7924D1* +X9165Y7812D1* +X9225Y7918D1* +X9308Y8011D1* +X9409Y8085D1* +X9523Y8136D1* +X9645Y8163D1* +X9769Y8164D1* +X9892Y8138D1* +X10006Y8088D1* +X10107Y8016D1* +X10192Y7924D1* +X10255Y7816D1* +X10294Y7698D1* +X10308Y7569D1* +X10295Y7445D1* +X10257Y7326D1* +X10194Y7218D1* +X10111Y7125D1* +X10010Y7052D1* +X9896Y7001D1* +X9774Y6975D1* +X9649Y6974D1* +X9527Y7000D1* +X9413Y7051D1* +X9312Y7124D1* +X9228Y7216D1* +X9164Y7328D1* +X9104Y7218D1* +X9020Y7125D1* +X8920Y7052D1* +X8806Y7001D1* +X8684Y6975D1* +X8559Y6974D1* +X8437Y7000D1* +X8323Y7051D1* +X8222Y7124D1* +X8138Y7216D1* +X8075Y7324D1* +X8036Y7442D1* +X8022Y7566D1* +X8035Y7691D1* +X8073Y7809D1* +X8135Y7918D1* +X8218Y8011D1* +X8315Y8083D1* +X8172Y8089D1* +X7477D1* +Y9285D1* +X7602D1* +X12476Y7445D2* +X12438Y7326D1* +X12375Y7218D1* +X12292Y7125D1* +X12191Y7052D1* +X12077Y7001D1* +X11955Y6975D1* +X11831Y6974D1* +X11708Y7000D1* +X11594Y7051D1* +X11493Y7124D1* +X11409Y7216D1* +X11347Y7324D1* +X11308Y7442D1* +X11294Y7566D1* +X11307Y7691D1* +X11345Y7809D1* +X11407Y7918D1* +X11490Y8011D1* +X11590Y8085D1* +X11704Y8136D1* +X11826Y8163D1* +X11951Y8164D1* +X12073Y8138D1* +X12187Y8088D1* +X12288Y8016D1* +X12373Y7924D1* +X12436Y7816D1* +X12475Y7698D1* +X12489Y7569D1* +X12476Y7445D1* +X25549Y9230D2* +X25602Y9254D1* +X25724Y9281D1* +X25849Y9282D1* +X25917Y9273D1* +Y11008D1* +X25945Y11133D1* +X26006Y11223D1* +X26241Y11458D1* +X26257Y11540D1* +X26309Y11653D1* +X26343Y11690D1* +X26340Y14806D1* +Y16163D1* +X26368Y16288D1* +X26430Y16378D1* +X28222Y18171D1* +X28221Y19142D1* +X28166Y19119D1* +X28044Y19093D1* +X27919D1* +X27797Y19118D1* +X27683Y19169D1* +X27582Y19242D1* +X27498Y19334D1* +X27434Y19446D1* +X27374Y19336D1* +X27290Y19243D1* +X27189Y19170D1* +X27075Y19119D1* +X26953Y19093D1* +X26829D1* +X26706Y19118D1* +X26592Y19169D1* +X26491Y19242D1* +X26407Y19334D1* +X26343Y19446D1* +X26283Y19336D1* +X26200Y19243D1* +X26099Y19170D1* +X25985Y19119D1* +X25863Y19093D1* +X25738D1* +X25616Y19118D1* +X25555Y19145D1* +X25558Y17930D1* +Y17653D1* +X26033Y17175D1* +X26102Y17067D1* +X26122Y16959D1* +Y11982D1* +X26095Y11858D1* +X26033Y11767D1* +X25981Y11715D1* +X25965Y11623D1* +X25909Y11512D1* +X25885Y11487D1* +X25861Y11340D1* +X25797Y11246D1* +X25551Y11001D1* +X25549Y9231D1* +X24948Y19143D2* +X24894Y19119D1* +X24772Y19093D1* +X24647D1* +X24525Y19118D1* +X24411Y19169D1* +X24310Y19242D1* +X24226Y19334D1* +X24162Y19446D1* +X24102Y19336D1* +X24018Y19243D1* +X23918Y19170D1* +X23804Y19119D1* +X23682Y19093D1* +X23557D1* +X23435Y19118D1* +X23321Y19169D1* +X23220Y19242D1* +X23136Y19334D1* +X23072Y19446D1* +X23011Y19336D1* +X22928Y19243D1* +X22827Y19170D1* +X22713Y19119D1* +X22591Y19093D1* +X22466D1* +X22344Y19118D1* +X22305Y19136D1* +X22306Y16364D1* +X24678Y13994D1* +X24718Y13986D1* +X24832Y13937D1* +X24853Y13919D1* +X24932Y13920D1* +X25054Y13897D1* +X25158Y13829D1* +X25226Y13731D1* +X25326Y13697D1* +X25448Y13723D1* +X25514Y13716D1* +Y16830D1* +X25039Y17308D1* +X24970Y17416D1* +X24950Y17523D1* +Y19137D1* +X12885Y19089D2* +X11827D1* +Y19351D1* +X11734Y19243D1* +X11633Y19170D1* +X11519Y19119D1* +X11397Y19093D1* +X11272D1* +X11150Y19118D1* +X11036Y19169D1* +X10935Y19242D1* +X10851Y19334D1* +X10787Y19446D1* +X10727Y19336D1* +X10643Y19243D1* +X10543Y19170D1* +X10429Y19119D1* +X10307Y19093D1* +X10182D1* +X10060Y19118D1* +X9946Y19169D1* +X9845Y19242D1* +X9761Y19334D1* +X9697Y19446D1* +X9636Y19336D1* +X9553Y19243D1* +X9452Y19170D1* +X9338Y19119D1* +X9216Y19093D1* +X9091D1* +X8969Y19118D1* +X8855Y19169D1* +X8754Y19242D1* +X8670Y19334D1* +X8606Y19446D1* +X8546Y19336D1* +X8462Y19243D1* +X8362Y19170D1* +X8248Y19119D1* +X8126Y19093D1* +X8001D1* +X7936Y19106D1* +X6344Y17511D1* +X6347Y16058D1* +X6429Y16103D1* +X6551Y16129D1* +X6675Y16117D1* +X6789Y16068D1* +X6833Y16029D1* +X8949Y16032D1* +X12812Y16029D1* +X12885Y16066D1* +Y19093D1* +X10789Y19931D2* +X10849Y20036D1* +X10932Y20129D1* +X10991Y20173D1* +X10852Y20211D1* +X10727D1* +X10605Y20236D1* +X10491Y20287D1* +X10390Y20360D1* +X10306Y20452D1* +X10243Y20560D1* +X10204Y20679D1* +X10191Y20803D1* +X10203Y20927D1* +X10241Y21046D1* +X10303Y21154D1* +X10386Y21247D1* +X10433Y21282D1* +X8968Y21280D1* +X9088Y21160D1* +X9151Y21052D1* +X9191Y20934D1* +X9205Y20805D1* +X9192Y20681D1* +X9153Y20562D1* +X9091Y20454D1* +X9008Y20361D1* +X8907Y20288D1* +X8793Y20237D1* +X8671Y20211D1* +X8546D1* +X8424Y20236D1* +X8385Y20254D1* +X8386Y20192D1* +X8459Y20134D1* +X8543Y20042D1* +X8607Y19930D1* +X8667Y20036D1* +X8750Y20129D1* +X8851Y20203D1* +X8965Y20254D1* +X9087Y20281D1* +X9211Y20282D1* +X9334Y20257D1* +X9448Y20207D1* +X9549Y20134D1* +X9633Y20042D1* +X9698Y19930D1* +X9758Y20036D1* +X9841Y20129D1* +X9942Y20203D1* +X10055Y20254D1* +X10177Y20281D1* +X10302Y20282D1* +X10424Y20257D1* +X10538Y20207D1* +X10640Y20134D1* +X10724Y20042D1* +X10788Y19930D1* +X12388Y20498D2* +X12334Y20422D1* +X13051D1* +X13176Y20395D1* +X13266Y20333D1* +X13404Y20195D1* +X13473Y20088D1* +X13493Y19980D1* +X13494Y13429D1* +X13546Y13543D1* +X13580Y13580D1* +X13577Y16696D1* +Y20504D1* +X12869Y20501D1* +X12396D1* +X6833Y15424D2* +X6814Y15404D1* +X6704Y15346D1* +X6581Y15325D1* +X6458Y15342D1* +X6349Y15394D1* +X6347Y14823D1* +X6509Y14773D1* +X12201D1* +X12323Y14750D1* +X12430Y14678D1* +X12608Y14500D1* +X12609Y15420D1* +X11276Y15423D1* +X6834D1* +X25316Y12045D2* +X25437Y12122D1* +X25517Y12139D1* +X25514Y12924D1* +X25478Y12918D1* +X25355Y12935D1* +X25234Y12997D1* +X24932D1* +X24810Y13021D1* +X24706Y13089D1* +X24635Y13195D1* +X24501Y13211D1* +X24389Y13265D1* +X24299Y13350D1* +X24239Y13459D1* +X24224Y13532D1* +X21751Y16005D1* +X21741Y15937D1* +Y15582D1* +X25273Y12052D1* +X32937Y24062D2* +X4312D1* +Y4312D1* +X33062D1* +Y24062D1* +X32937D1* +D18* +X29812Y10813D3* +D19* +Y9813D3* +D24* +X8075Y8687D3* +D26* +X9165D3* +X10256D3* +X11346D3* +X12437D3* +X8620Y7569D3* +X9711D3* +X10801D3* +X11892D3* +D27* +X5337Y8128D3* +X15175D3* +D24* +X21428Y8687D3* +D26* +X22519D3* +X23609D3* +X24700D3* +X25790D3* +X26881D3* +X27971D3* +X29062D3* +X21973Y7569D3* +X23064D3* +X24155D3* +X25245D3* +X26336D3* +X27426D3* +X28517D3* +D28* +X18686Y8128D3* +X31804D3* +D24* +X29071Y19687D3* +D26* +X27980D3* +X26890D3* +X25799D3* +X24709D3* +X23618D3* +X22528D3* +X21437D3* +X28526Y20805D3* +X27435D3* +X26344D3* +X25254D3* +X24163D3* +X23073D3* +X21982D3* +D28* +X31813Y20246D3* +X18695D3* +D24* +X12424Y19687D3* +D26* +X11334D3* +X10243D3* +X9153D3* +X8062D3* +X11879Y20805D3* +X10788D3* +X9698D3* +X8607D3* +D27* +X15162Y20246D3* +X5324D3* +M02* diff --git a/board/BottomMask.gbr b/board/BottomMask.gbr new file mode 100644 index 0000000..1c2a193 --- /dev/null +++ b/board/BottomMask.gbr @@ -0,0 +1,94 @@ +G04 DipTrace 2.4.0.2* +%INBottomMask.gbr*% +%MOIN*% +%ADD35C,0.0354*% +%ADD45C,0.1969*% +%ADD47C,0.1953*% +%ADD49C,0.0744*% +%ADD53R,0.0744X0.0744*% +%ADD61C,0.0709*% +%ADD63R,0.0709X0.0709*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNBotMask*% +%LPD*% +D63* +X29812Y10813D3* +D61* +Y9813D3* +D35* +X31594Y13199D3* +Y14931D3* +D53* +X8075Y8687D3* +D49* +X9165D3* +X10256D3* +X11346D3* +X12437D3* +X8620Y7569D3* +X9711D3* +X10801D3* +X11892D3* +D47* +X5337Y8128D3* +X15175D3* +D53* +X21428Y8687D3* +D49* +X22519D3* +X23609D3* +X24700D3* +X25790D3* +X26881D3* +X27971D3* +X29062D3* +X21973Y7569D3* +X23064D3* +X24155D3* +X25245D3* +X26336D3* +X27426D3* +X28517D3* +D45* +X18686Y8128D3* +X31804D3* +D53* +X29071Y19687D3* +D49* +X27980D3* +X26890D3* +X25799D3* +X24709D3* +X23618D3* +X22528D3* +X21437D3* +X28526Y20805D3* +X27435D3* +X26344D3* +X25254D3* +X24163D3* +X23073D3* +X21982D3* +D45* +X31813Y20246D3* +X18695D3* +D53* +X12424Y19687D3* +D49* +X11334D3* +X10243D3* +X9153D3* +X8062D3* +X11879Y20805D3* +X10788D3* +X9698D3* +X8607D3* +D47* +X15162Y20246D3* +X5324D3* +M02* diff --git a/board/BottomSilk.gbr b/board/BottomSilk.gbr new file mode 100644 index 0000000..995ecc0 --- /dev/null +++ b/board/BottomSilk.gbr @@ -0,0 +1,12 @@ +G04 DipTrace 2.4.0.2* +%INBottomSilk.gbr*% +%MOIN*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNBotSilk*% +%LPD*% +M02* diff --git a/board/Top.gbr b/board/Top.gbr new file mode 100644 index 0000000..81faab8 --- /dev/null +++ b/board/Top.gbr @@ -0,0 +1,2322 @@ +G04 DipTrace 2.4.0.2* +%INTop.gbr*% +%MOIN*% +%ADD13C,0.0118*% +%ADD14C,0.0079*% +%ADD15C,0.025*% +%ADD16R,0.0276X0.0354*% +%ADD17R,0.0354X0.0276*% +%ADD18R,0.063X0.063*% +%ADD19C,0.063*% +%ADD21R,0.0906X0.0197*% +%ADD22R,0.0984X0.0787*% +%ADD23R,0.0571X0.0394*% +%ADD24R,0.0665X0.0665*% +%ADD25R,0.0591X0.0591*% +%ADD26C,0.0665*% +%ADD27C,0.1874*% +%ADD28C,0.189*% +%ADD30R,0.0197X0.0669*% +%ADD31R,0.0669X0.0197*% +%ADD33R,0.2165X0.0787*% +%ADD34C,0.0276*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNTop*% +%LPD*% +X22806Y12376D2* +D13* +X21749D1* +X24932Y14187D2* +Y14622D1* +X24936Y14626D1* +X26113Y12376D2* +X26874D1* +X26937Y12438D1* +X11935Y12376D2* +X13623D1* +X22806D2* +X23436D1* +X23561Y12251D1* +Y11751D1* +X24932Y14187D2* +Y13068D1* +X25499Y12501D1* +X26113Y12376D2* +X25624D1* +X25499Y12501D1* +X4499Y16062D2* +D14* +X5446D1* +X6062D1* +X4499Y11687D2* +X5446D1* +X6062D1* +X6574Y15727D2* +Y16062D1* +X24302Y11411D2* +Y10880D1* +X24617D2* +Y9315D1* +X24479Y9177D1* +X20430D1* +X20292Y9039D1* +Y7026D1* +X20154Y6888D1* +X6712D1* +X6574Y7026D1* +Y11687D1* +X26645Y11431D2* +X26113D1* +X25582Y11746D2* +X26113D1* +X25247Y11648D2* +Y10880D1* +X29062Y8687D2* +X28631Y9118D1* +X25070D1* +X24932Y9256D1* +Y10880D1* +X25562D2* +Y10375D1* +X25624Y10313D1* +X32812D1* +Y11188D1* +Y10313D2* +X28062D1* +Y11063D1* +X22806Y12691D2* +X13189D1* +X7644D1* +X7506Y12553D1* +Y8138D1* +X7644Y8000D1* +X9280D1* +X9711Y7569D1* +X12424Y19687D2* +X17353Y14758D1* +X23849D1* +X23987Y14620D1* +Y14187D1* +X11334Y19687D2* +X16401Y14620D1* +X23672D1* +Y14187D1* +X10243Y19687D2* +X15743Y14187D1* +X23357D1* +X9153Y19687D2* +X15204Y13636D1* +X22806D1* +X13882Y13321D2* +X22806D1* +X8607Y20805D2* +Y13144D1* +X8745Y13006D1* +X22806D1* +X8075Y12061D2* +X22806D1* +X9165Y11746D2* +X22806D1* +X10256Y11431D2* +X22806D1* +X11346Y8687D2* +X10915Y9118D1* +X8384D1* +X8246Y9256D1* +Y10014D1* +X8384Y10152D1* +X23220D1* +X23357Y10289D1* +Y10880D1* +X8620Y9915D2* +X23534D1* +X23672Y10053D1* +Y10880D1* +X11892Y7569D2* +Y9177D1* +X12030Y9315D1* +X23849D1* +X23987Y9453D1* +Y10880D1* +X26113Y12061D2* +X26546D1* +X26670Y11937D1* +X27312D1* +X30570Y14065D2* +X28417D1* +X28279Y13927D1* +Y12921D1* +X28142Y12783D1* +X26925D1* +X26833Y12691D1* +X26113D1* +X27706Y13293D2* +X27418Y13006D1* +X26113D1* +X28516Y13293D2* +Y13612D1* +X28653Y13750D1* +X30570D1* +X27984Y13687D2* +D13* +X27312D1* +X30570Y13435D2* +X29011D1* +X24617Y13596D2* +Y14187D1* +X25470Y13321D2* +X26113D1* +Y13636D2* +X25608D1* +X25470Y13498D1* +Y13321D1* +X27312Y13687D2* +X26676D1* +X26625Y13636D1* +X26113D1* +X29011Y13435D2* +Y11063D1* +X28574D1* +X30062D1* +X29812Y10813D1* +X22562Y16687D2* +D14* +X21381D1* +Y15575D1* +X21519Y15437D1* +X21812D1* +Y15033D1* +X21950Y14896D1* +X25109D1* +X25247Y14758D1* +Y14187D1* +X26302Y16687D2* +X27542D1* +Y15870D1* +X27405Y15732D1* +X26562D1* +Y15437D1* +X25700D1* +X25562Y15299D1* +Y14187D1* +D34* +X10872Y14938D3* +X8997D3* +Y18126D3* +Y16126D3* +X12562Y14937D3* +X12123Y16126D3* +X10497Y18876D3* +X12873Y16439D3* +X12935Y17501D3* +X11623Y18876D3* +X12748D3* +X13560Y18064D3* +X16623Y15001D3* +X15935Y14563D3* +X15248Y14126D3* +X13560Y16939D3* +X21749Y12376D3* +X17873D3* +X13623D3* +X11935D3* +X8560D3* +X8622Y11438D3* +Y10438D3* +X9685Y11313D3* +Y10438D3* +X10685Y10750D3* +X11998D3* +X12935Y10625D3* +X17998D3* +X22936D3* +X6434Y16876D3* +X8997Y13438D3* +X11998D3* +X13498D3* +Y14813D3* +X24936Y14626D3* +X26187Y14938D3* +Y14063D3* +X26937Y12438D3* +X28624Y12938D3* +X27749Y10625D3* +X25937Y10688D3* +X22374Y18001D3* +X24874D3* +X24374Y15563D3* +X13560Y15813D3* +X4309Y24064D3* +X33062D3* +Y4312D3* +X4309D3* +X7810Y9250D3* +X25624Y18001D3* +X27999D3* +X25749Y9625D3* +X7872Y7375D3* +X6997Y8500D3* +X23561Y11751D3* +X24061Y13501D3* +X25499Y12501D3* +X6574Y15727D3* +X24302Y11411D3* +X26645Y11431D3* +X25582Y11746D3* +X25247Y11648D3* +X13189Y12691D3* +X13882Y13321D3* +X8075Y12061D3* +X9165Y11746D3* +X10256Y11431D3* +X8620Y9915D3* +X27706Y13293D3* +X28516D3* +X27984Y13687D3* +X29011Y13435D3* +X25470Y13321D3* +X24617Y13596D3* +X4337Y23813D2* +D15* +X33039D1* +X4337Y23565D2* +X33039D1* +X4337Y23316D2* +X33039D1* +X4337Y23067D2* +X33039D1* +X4337Y22819D2* +X33039D1* +X4337Y22570D2* +X33039D1* +X4337Y22321D2* +X33039D1* +X4337Y22073D2* +X33039D1* +X4337Y21824D2* +X33039D1* +X4337Y21575D2* +X33039D1* +X4337Y21326D2* +X8289D1* +X8925D2* +X10473D1* +X11105D2* +X11562D1* +X12194D2* +X21664D1* +X22300D2* +X22758D1* +X23390D2* +X23848D1* +X24480D2* +X24937D1* +X25569D2* +X26027D1* +X26663D2* +X27117D1* +X27753D2* +X28207D1* +X28843D2* +X33039D1* +X4337Y21078D2* +X8051D1* +X9163D2* +X10230D1* +X12437D2* +X21426D1* +X29081D2* +X33039D1* +X4337Y20829D2* +X7984D1* +X9230D2* +X10168D1* +X12499D2* +X21359D1* +X29148D2* +X33039D1* +X4337Y20580D2* +X8027D1* +X9187D2* +X10211D1* +X12456D2* +X21402D1* +X29105D2* +X33039D1* +X4337Y20332D2* +X8219D1* +X8995D2* +X10398D1* +X11179D2* +X11488D1* +X12269D2* +X21594D1* +X22370D2* +X22683D1* +X23464D2* +X23773D1* +X24554D2* +X24863D1* +X25644D2* +X25957D1* +X26733D2* +X27047D1* +X27823D2* +X28137D1* +X28913D2* +X33039D1* +X4337Y20083D2* +X7590D1* +X9624D2* +X9770D1* +X10714D2* +X10862D1* +X13046D2* +X20965D1* +X21909D2* +X22055D1* +X22999D2* +X23145D1* +X24089D2* +X24237D1* +X25183D2* +X25328D1* +X26273D2* +X26418D1* +X27362D2* +X27505D1* +X28452D2* +X33039D1* +X4337Y19834D2* +X7457D1* +X13046D2* +X20832D1* +X28585D2* +X33039D1* +X4337Y19586D2* +X7449D1* +X13046D2* +X20824D1* +X28593D2* +X33039D1* +X4337Y19337D2* +X7555D1* +X13230D2* +X20930D1* +X28491D2* +X33039D1* +X4337Y19088D2* +X8277D1* +X8937D2* +X9297D1* +X10206D2* +X10387D1* +X11296D2* +X11476D1* +X12386D2* +X12566D1* +X13480D2* +X33039D1* +X4337Y18840D2* +X8277D1* +X8937D2* +X9547D1* +X10456D2* +X10637D1* +X11546D2* +X11726D1* +X12636D2* +X12816D1* +X13726D2* +X33039D1* +X4337Y18591D2* +X8277D1* +X8937D2* +X9793D1* +X10702D2* +X10883D1* +X11796D2* +X11976D1* +X12886D2* +X13066D1* +X13976D2* +X33039D1* +X4337Y18342D2* +X8277D1* +X8937D2* +X10043D1* +X10952D2* +X11133D1* +X12042D2* +X12223D1* +X13132D2* +X13312D1* +X14226D2* +X33039D1* +X4337Y18094D2* +X8277D1* +X8937D2* +X10293D1* +X11202D2* +X11383D1* +X12292D2* +X12473D1* +X13382D2* +X13562D1* +X14472D2* +X33039D1* +X4337Y17845D2* +X8277D1* +X8937D2* +X10539D1* +X11448D2* +X11629D1* +X12542D2* +X12723D1* +X13632D2* +X13812D1* +X14722D2* +X33039D1* +X4337Y17596D2* +X8277D1* +X8937D2* +X10789D1* +X11698D2* +X11879D1* +X12788D2* +X12969D1* +X13878D2* +X14058D1* +X14972D2* +X33039D1* +X4337Y17347D2* +X8277D1* +X8937D2* +X11035D1* +X11948D2* +X12129D1* +X13038D2* +X13219D1* +X14128D2* +X14308D1* +X15218D2* +X33039D1* +X4337Y17099D2* +X8277D1* +X8937D2* +X11285D1* +X12194D2* +X12375D1* +X13288D2* +X13469D1* +X14378D2* +X14558D1* +X15468D2* +X21191D1* +X23933D2* +X24930D1* +X27675D2* +X33039D1* +X4337Y16850D2* +X8277D1* +X8937D2* +X11535D1* +X12444D2* +X12625D1* +X13534D2* +X13715D1* +X14624D2* +X14805D1* +X15718D2* +X21098D1* +X23933D2* +X24930D1* +X27823D2* +X33039D1* +X4337Y16601D2* +X8277D1* +X8937D2* +X11781D1* +X12694D2* +X12875D1* +X13784D2* +X13965D1* +X14874D2* +X15055D1* +X15964D2* +X21051D1* +X23933D2* +X24930D1* +X27870D2* +X33039D1* +X7042Y16353D2* +X8277D1* +X8937D2* +X12031D1* +X12941D2* +X13121D1* +X14034D2* +X14215D1* +X15124D2* +X15305D1* +X16214D2* +X21051D1* +X23933D2* +X24930D1* +X27870D2* +X33039D1* +X7042Y16104D2* +X8277D1* +X8937D2* +X12281D1* +X13191D2* +X13371D1* +X14280D2* +X14461D1* +X15370D2* +X15551D1* +X16464D2* +X21051D1* +X23933D2* +X24930D1* +X27870D2* +X33039D1* +X7042Y15855D2* +X8277D1* +X8937D2* +X12527D1* +X13441D2* +X13621D1* +X14530D2* +X14711D1* +X15620D2* +X15801D1* +X16710D2* +X21051D1* +X21710D2* +X26258D1* +X27870D2* +X33039D1* +X5073Y15607D2* +X6164D1* +X6983D2* +X8277D1* +X8937D2* +X12777D1* +X13687D2* +X13867D1* +X14780D2* +X14961D1* +X15870D2* +X16051D1* +X16960D2* +X21051D1* +X22280D2* +X25414D1* +X27733D2* +X33039D1* +X4337Y15358D2* +X6391D1* +X6757D2* +X8277D1* +X8937D2* +X13027D1* +X13937D2* +X14117D1* +X15026D2* +X15207D1* +X16116D2* +X16297D1* +X17210D2* +X21144D1* +X22280D2* +X25238D1* +X27030D2* +X31453D1* +X31733D2* +X33039D1* +X4337Y15109D2* +X8277D1* +X8937D2* +X13273D1* +X14187D2* +X14367D1* +X15276D2* +X15457D1* +X16366D2* +X16547D1* +X17456D2* +X21344D1* +X25890D2* +X26094D1* +X27030D2* +X31164D1* +X32023D2* +X33039D1* +X4337Y14861D2* +X8277D1* +X8937D2* +X13523D1* +X14433D2* +X14613D1* +X15526D2* +X15703D1* +X25890D2* +X31133D1* +X32054D2* +X33039D1* +X4337Y14612D2* +X8277D1* +X8937D2* +X13773D1* +X14683D2* +X14863D1* +X15773D2* +X15953D1* +X25948D2* +X29828D1* +X31925D2* +X33039D1* +X4337Y14363D2* +X8277D1* +X8937D2* +X14019D1* +X14933D2* +X15113D1* +X25948D2* +X28332D1* +X31312D2* +X33039D1* +X4337Y14115D2* +X8277D1* +X8937D2* +X14269D1* +X15179D2* +X15359D1* +X25948D2* +X26883D1* +X27741D2* +X28016D1* +X31312D2* +X33039D1* +X4337Y13866D2* +X8277D1* +X8937D2* +X14519D1* +X31312D2* +X33039D1* +X4337Y13617D2* +X8277D1* +X8937D2* +X13586D1* +X31761D2* +X33039D1* +X4337Y13368D2* +X8277D1* +X8937D2* +X13457D1* +X23429D2* +X24262D1* +X32026D2* +X33039D1* +X4337Y13120D2* +X8277D1* +X23429D2* +X25098D1* +X32054D2* +X33039D1* +X4337Y12871D2* +X7367D1* +X23429D2* +X25488D1* +X29358D2* +X31273D1* +X31913D2* +X33039D1* +X4337Y12622D2* +X7183D1* +X23429D2* +X25488D1* +X28437D2* +X28664D1* +X29358D2* +X33039D1* +X4337Y12374D2* +X7176D1* +X8355D2* +X12918D1* +X13460D2* +X22183D1* +X23429D2* +X25488D1* +X26737D2* +X26887D1* +X27741D2* +X28664D1* +X29358D2* +X33039D1* +X5073Y12125D2* +X7176D1* +X23429D2* +X25422D1* +X27741D2* +X28664D1* +X29358D2* +X33039D1* +X7042Y11876D2* +X7176D1* +X23429D2* +X24891D1* +X27741D2* +X28664D1* +X29358D2* +X33039D1* +X7042Y11628D2* +X7176D1* +X7835D2* +X8754D1* +X23429D2* +X23937D1* +X24667D2* +X24820D1* +X27741D2* +X28664D1* +X29358D2* +X32226D1* +X5073Y11379D2* +X5594D1* +X7042D2* +X7176D1* +X7835D2* +X8976D1* +X9355D2* +X9832D1* +X27069D2* +X27594D1* +X30417D2* +X32226D1* +X4337Y11130D2* +X6246D1* +X6901D2* +X7176D1* +X7835D2* +X9965D1* +X26937D2* +X27594D1* +X30417D2* +X32226D1* +X4337Y10882D2* +X6246D1* +X6901D2* +X7176D1* +X7835D2* +X22969D1* +X25948D2* +X27594D1* +X30417D2* +X32226D1* +X4337Y10633D2* +X6246D1* +X6901D2* +X7176D1* +X7835D2* +X22969D1* +X25948D2* +X27734D1* +X30417D2* +X32226D1* +X4337Y10384D2* +X6246D1* +X6901D2* +X7176D1* +X7835D2* +X8164D1* +X4337Y10135D2* +X6246D1* +X6901D2* +X7176D1* +X4337Y9887D2* +X6246D1* +X6901D2* +X7176D1* +X25261D2* +X33039D1* +X4337Y9638D2* +X6246D1* +X6901D2* +X7176D1* +X25261D2* +X33039D1* +X4337Y9389D2* +X6246D1* +X6901D2* +X7176D1* +X28792D2* +X33039D1* +X4337Y9141D2* +X6246D1* +X6901D2* +X7176D1* +X29476D2* +X33039D1* +X4337Y8892D2* +X6246D1* +X6901D2* +X7176D1* +X13023D2* +X19961D1* +X29648D2* +X33039D1* +X4337Y8643D2* +X6246D1* +X6901D2* +X7176D1* +X13058D2* +X19961D1* +X20620D2* +X21898D1* +X29683D2* +X33039D1* +X4337Y8395D2* +X6246D1* +X6901D2* +X7176D1* +X12983D2* +X19961D1* +X20620D2* +X21973D1* +X29608D2* +X33039D1* +X4337Y8146D2* +X6246D1* +X6901D2* +X7176D1* +X10534D2* +X11066D1* +X12714D2* +X19961D1* +X20620D2* +X21793D1* +X29339D2* +X33039D1* +X4337Y7897D2* +X6246D1* +X6901D2* +X7293D1* +X10233D2* +X11367D1* +X12417D2* +X19961D1* +X20620D2* +X21449D1* +X29042D2* +X33039D1* +X4337Y7649D2* +X6246D1* +X6901D2* +X8004D1* +X10327D2* +X11273D1* +X12507D2* +X19961D1* +X20620D2* +X21355D1* +X29132D2* +X33039D1* +X4337Y7400D2* +X6246D1* +X6901D2* +X8023D1* +X10308D2* +X11293D1* +X12491D2* +X19961D1* +X20620D2* +X21375D1* +X29116D2* +X33039D1* +X4337Y7151D2* +X6246D1* +X20620D2* +X21519D1* +X22425D2* +X22613D1* +X23515D2* +X23703D1* +X24608D2* +X24793D1* +X25698D2* +X25883D1* +X26788D2* +X26973D1* +X27878D2* +X28066D1* +X28968D2* +X33039D1* +X4337Y6903D2* +X6269D1* +X20597D2* +X33039D1* +X4337Y6654D2* +X6492D1* +X20374D2* +X33039D1* +X4337Y6405D2* +X33039D1* +X4337Y6156D2* +X33039D1* +X4337Y5908D2* +X33039D1* +X4337Y5659D2* +X33039D1* +X4337Y5410D2* +X33039D1* +X4337Y5162D2* +X33039D1* +X4337Y4913D2* +X33039D1* +X4337Y4664D2* +X33039D1* +X4337Y4416D2* +X33039D1* +X27034Y12379D2* +X27715D1* +Y11495D1* +X27039D1* +X27047Y11431D1* +X27028Y11308D1* +X26972Y11197D1* +X26885Y11108D1* +X26775Y11050D1* +X26652Y11028D1* +X26529Y11045D1* +X26463Y11068D1* +X25928D1* +X25925Y10616D1* +X27761Y10617D1* +X27754Y10660D1* +X27620D1* +Y11466D1* +X28504Y11462D1* +X28690Y11466D1* +X28687Y12688D1* +Y12926D1* +X28581Y12901D1* +X28544Y12770D1* +X28495Y12706D1* +X28357Y12568D1* +X28249Y12500D1* +X28142Y12479D1* +X27048Y12476D1* +X26978Y12424D1* +X26913Y12397D1* +X26833Y12387D1* +X26712D1* +X26709Y12328D1* +X26795Y12243D1* +X26909Y12245D1* +Y12379D1* +X27034D1* +Y14129D2* +X27715D1* +Y14008D1* +X27840Y14063D1* +X27961Y14089D1* +X28019Y14083D1* +X28064Y14142D1* +X28202Y14280D1* +X28310Y14349D1* +X28417Y14369D1* +X29851D1* +X29852Y14743D1* +X31192D1* +X31173Y14795D1* +X31152Y14917D1* +X31165Y15041D1* +X31213Y15156D1* +X31291Y15254D1* +X31393Y15325D1* +X31511Y15366D1* +X31635Y15371D1* +X31756Y15342D1* +X31865Y15281D1* +X31951Y15191D1* +X32009Y15081D1* +X32036Y14931D1* +X32018Y14808D1* +X31967Y14694D1* +X31886Y14600D1* +X31782Y14531D1* +X31663Y14495D1* +X31538Y14493D1* +X31418Y14526D1* +X31309Y14594D1* +X31288Y14493D1* +X31284Y14017D1* +X31288Y13613D1* +X31291Y13521D1* +X31393Y13593D1* +X31511Y13633D1* +X31635Y13639D1* +X31756Y13610D1* +X31865Y13548D1* +X31951Y13459D1* +X32009Y13349D1* +X32036Y13199D1* +X32018Y13076D1* +X31967Y12962D1* +X31886Y12867D1* +X31782Y12799D1* +X31663Y12762D1* +X31538Y12760D1* +X31418Y12793D1* +X31312Y12858D1* +X31228Y12951D1* +X31172Y13066D1* +X31038Y13072D1* +X29852D1* +Y13115D1* +X29445Y13111D1* +X29332D1* +X29335Y12560D1* +Y11392D1* +X30392Y11393D1* +Y10615D1* +X32511Y10617D1* +X32497Y10628D1* +X32252D1* +Y11748D1* +X33061D1* +X33062Y24062D1* +X4312D1* +Y16527D1* +X4824Y16524D1* +X5050D1* +Y16364D1* +X5622Y16366D1* +X5620Y16465D1* +X6504Y16461D1* +X6757Y16465D1* +X7016D1* +Y15659D1* +X6973D1* +X6957Y15604D1* +X6901Y15493D1* +X6814Y15404D1* +X6704Y15346D1* +X6581Y15325D1* +X6458Y15342D1* +X6346Y15395D1* +X6255Y15481D1* +X6195Y15590D1* +X6181Y15663D1* +X6132D1* +X5879Y15659D1* +X5620D1* +Y15757D1* +X5051Y15758D1* +X5050Y15600D1* +X4312D1* +Y12152D1* +X4824Y12149D1* +X5050D1* +Y11989D1* +X5622Y11991D1* +X5620Y12090D1* +X6504Y12086D1* +X6757Y12090D1* +X7016D1* +Y11284D1* +X6879D1* +X6878Y7191D1* +X8153Y7192D1* +X8075Y7324D1* +X8036Y7442D1* +X8022Y7566D1* +X8036Y7694D1* +X7644Y7696D1* +X7519Y7723D1* +X7428Y7785D1* +X7291Y7923D1* +X7222Y8030D1* +X7202Y8138D1* +Y12553D1* +X7229Y12678D1* +X7291Y12768D1* +X7428Y12906D1* +X7536Y12975D1* +X7644Y12995D1* +X8343D1* +X8314Y13064D1* +X8303Y13144D1* +Y19140D1* +X8126Y19093D1* +X8001D1* +X7879Y19118D1* +X7765Y19169D1* +X7663Y19242D1* +X7580Y19334D1* +X7517Y19442D1* +X7478Y19561D1* +X7464Y19685D1* +X7477Y19809D1* +X7515Y19928D1* +X7577Y20036D1* +X7660Y20129D1* +X7760Y20203D1* +X7874Y20254D1* +X7996Y20281D1* +X8121Y20282D1* +X8243Y20257D1* +X8304Y20230D1* +X8303Y20288D1* +X8209Y20360D1* +X8125Y20452D1* +X8062Y20560D1* +X8023Y20679D1* +X8010Y20803D1* +X8022Y20927D1* +X8060Y21046D1* +X8122Y21154D1* +X8205Y21247D1* +X8306Y21321D1* +X8419Y21372D1* +X8541Y21399D1* +X8666Y21400D1* +X8788Y21375D1* +X8903Y21325D1* +X9004Y21252D1* +X9088Y21160D1* +X9151Y21052D1* +X9191Y20934D1* +X9205Y20805D1* +X9192Y20681D1* +X9153Y20562D1* +X9091Y20454D1* +X9008Y20361D1* +X8910Y20290D1* +X8965Y20254D1* +X9087Y20281D1* +X9211Y20282D1* +X9334Y20257D1* +X9448Y20207D1* +X9549Y20134D1* +X9633Y20042D1* +X9698Y19930D1* +X9758Y20036D1* +X9841Y20129D1* +X9942Y20203D1* +X10055Y20254D1* +X10177Y20281D1* +X10302Y20282D1* +X10424Y20257D1* +X10538Y20207D1* +X10640Y20134D1* +X10724Y20042D1* +X10788Y19930D1* +X10849Y20036D1* +X10932Y20129D1* +X11032Y20203D1* +X11146Y20254D1* +X11268Y20281D1* +X11392Y20282D1* +X11515Y20257D1* +X11629Y20207D1* +X11730Y20134D1* +X11828Y20018D1* +X11827Y20210D1* +X11696Y20236D1* +X11582Y20287D1* +X11480Y20360D1* +X11397Y20452D1* +X11333Y20564D1* +X11272Y20454D1* +X11189Y20361D1* +X11088Y20288D1* +X10974Y20237D1* +X10852Y20211D1* +X10727D1* +X10605Y20236D1* +X10491Y20287D1* +X10390Y20360D1* +X10306Y20452D1* +X10243Y20560D1* +X10204Y20679D1* +X10191Y20803D1* +X10203Y20927D1* +X10241Y21046D1* +X10303Y21154D1* +X10386Y21247D1* +X10487Y21321D1* +X10601Y21372D1* +X10722Y21399D1* +X10847Y21400D1* +X10969Y21375D1* +X11084Y21325D1* +X11185Y21252D1* +X11269Y21160D1* +X11334Y21049D1* +X11394Y21154D1* +X11477Y21247D1* +X11577Y21321D1* +X11691Y21372D1* +X11813Y21399D1* +X11938Y21400D1* +X12060Y21375D1* +X12174Y21325D1* +X12276Y21252D1* +X12360Y21160D1* +X12423Y21052D1* +X12462Y20934D1* +X12477Y20805D1* +X12464Y20681D1* +X12425Y20562D1* +X12363Y20454D1* +X12279Y20361D1* +X12168Y20283D1* +X13022Y20285D1* +Y19523D1* +X14761Y17781D1* +X17481Y15060D1* +X21373Y15062D1* +X21368Y15173D1* +X21304Y15222D1* +X21166Y15360D1* +X21097Y15467D1* +X21077Y15575D1* +Y16687D1* +X21102Y16809D1* +X21194Y16926D1* +X21214Y17028D1* +Y17346D1* +X23910D1* +Y16028D1* +X21687D1* +X21685Y15839D1* +X22254Y15840D1* +Y15203D1* +X23200Y15200D1* +X25109D1* +X25234Y15172D1* +X25258Y15187D1* +Y15299D1* +X25285Y15424D1* +X25347Y15514D1* +X25485Y15652D1* +X25592Y15721D1* +X25700Y15741D1* +X26118D1* +X26120Y15840D1* +X26280D1* +X26355Y15955D1* +X26485Y16026D1* +X24955Y16028D1* +Y17346D1* +X27650D1* +Y16975D1* +X27765Y16894D1* +X27836Y16767D1* +X27847Y16687D1* +Y15870D1* +X27819Y15745D1* +X27757Y15655D1* +X27620Y15517D1* +X27512Y15448D1* +X27405Y15428D1* +X27002D1* +X27004Y15034D1* +X26120D1* +Y15132D1* +X25863Y15133D1* +X25866Y14787D1* +X25925D1* +Y14001D1* +X26588Y13999D1* +X26676Y14011D1* +X26907D1* +X26909Y14129D1* +X27034D1* +X5050Y11379D2* +Y11225D1* +X4312D1* +Y4312D1* +X33062D1* +Y10136D1* +X33019Y10090D1* +X32909Y10025D1* +X32812Y10009D1* +X25624D1* +X25499Y10036D1* +X25424Y10083D1* +X25310Y10205D1* +X25281Y10258D1* +X25236Y10255D1* +Y9423D1* +X28631Y9422D1* +X28756Y9395D1* +X28846Y9333D1* +X28915Y9264D1* +X28996Y9281D1* +X29121Y9282D1* +X29243Y9257D1* +X29357Y9207D1* +X29459Y9134D1* +X29543Y9042D1* +X29606Y8934D1* +X29646Y8816D1* +X29660Y8687D1* +X29647Y8563D1* +X29608Y8444D1* +X29546Y8336D1* +X29462Y8243D1* +X29362Y8170D1* +X29248Y8119D1* +X29126Y8093D1* +X29001D1* +X28879Y8118D1* +X28765Y8169D1* +X28663Y8242D1* +X28580Y8334D1* +X28516Y8446D1* +X28455Y8336D1* +X28372Y8243D1* +X28271Y8170D1* +X28157Y8119D1* +X28035Y8093D1* +X27910D1* +X27788Y8118D1* +X27674Y8169D1* +X27573Y8242D1* +X27489Y8334D1* +X27425Y8446D1* +X27365Y8336D1* +X27281Y8243D1* +X27180Y8170D1* +X27066Y8119D1* +X26944Y8093D1* +X26820D1* +X26698Y8118D1* +X26584Y8169D1* +X26482Y8242D1* +X26399Y8334D1* +X26335Y8446D1* +X26274Y8336D1* +X26191Y8243D1* +X26090Y8170D1* +X25976Y8119D1* +X25854Y8093D1* +X25729D1* +X25607Y8118D1* +X25493Y8169D1* +X25392Y8242D1* +X25308Y8334D1* +X25244Y8446D1* +X25184Y8336D1* +X25100Y8243D1* +X24999Y8170D1* +X24885Y8119D1* +X24763Y8093D1* +X24639D1* +X24517Y8118D1* +X24402Y8169D1* +X24301Y8242D1* +X24217Y8334D1* +X24154Y8446D1* +X24093Y8336D1* +X24010Y8243D1* +X23909Y8170D1* +X23795Y8119D1* +X23673Y8093D1* +X23548D1* +X23426Y8118D1* +X23312Y8169D1* +X23211Y8242D1* +X23127Y8334D1* +X23063Y8446D1* +X23002Y8336D1* +X22919Y8243D1* +X22818Y8170D1* +X22704Y8119D1* +X22582Y8093D1* +X22458D1* +X22335Y8118D1* +X22221Y8169D1* +X22120Y8242D1* +X22036Y8334D1* +X21974Y8442D1* +X21935Y8561D1* +X21921Y8685D1* +X21934Y8809D1* +X21954Y8872D1* +X20593Y8873D1* +X20596Y8164D1* +Y7026D1* +X20569Y6901D1* +X20507Y6810D1* +X20369Y6673D1* +X20262Y6604D1* +X20154Y6584D1* +X6712D1* +X6587Y6611D1* +X6496Y6673D1* +X6359Y6810D1* +X6290Y6918D1* +X6270Y7026D1* +X6266Y11284D1* +X6132Y11288D1* +X5879Y11284D1* +X5620D1* +Y11382D1* +X5051Y11383D1* +X7809Y9285D2* +X7942D1* +Y10014D1* +X7969Y10139D1* +X8031Y10229D1* +X8169Y10367D1* +X8276Y10435D1* +X8384Y10456D1* +X22997D1* +X22994Y11066D1* +X22207Y11068D1* +Y11126D1* +X10521Y11127D1* +X10386Y11050D1* +X10263Y11028D1* +X10140Y11045D1* +X10028Y11099D1* +X9937Y11185D1* +X9877Y11294D1* +X9853Y11416D1* +X9857Y11443D1* +X9427Y11442D1* +X9296Y11365D1* +X9173Y11343D1* +X9050Y11360D1* +X8937Y11414D1* +X8847Y11500D1* +X8787Y11609D1* +X8763Y11731D1* +X8766Y11758D1* +X8341Y11757D1* +X8205Y11680D1* +X8082Y11658D1* +X7959Y11675D1* +X7847Y11729D1* +X7810Y11764D1* +Y9284D1* +X9709Y8441D2* +X9649Y8336D1* +X9566Y8243D1* +X9506Y8200D1* +X9645Y8163D1* +X9769Y8164D1* +X9892Y8138D1* +X10006Y8088D1* +X10107Y8016D1* +X10192Y7924D1* +X10255Y7816D1* +X10294Y7698D1* +X10308Y7569D1* +X10295Y7445D1* +X10257Y7326D1* +X10171Y7192D1* +X11426D1* +X11347Y7324D1* +X11308Y7442D1* +X11294Y7566D1* +X11307Y7691D1* +X11345Y7809D1* +X11407Y7918D1* +X11490Y8011D1* +X11587Y8083D1* +X11532Y8119D1* +X11410Y8093D1* +X11285D1* +X11163Y8118D1* +X11049Y8169D1* +X10948Y8242D1* +X10864Y8334D1* +X10800Y8446D1* +X10740Y8336D1* +X10656Y8243D1* +X10555Y8170D1* +X10441Y8119D1* +X10319Y8093D1* +X10195D1* +X10073Y8118D1* +X9958Y8169D1* +X9857Y8242D1* +X9774Y8334D1* +X9710Y8446D1* +X13022Y8563D2* +X12983Y8444D1* +X12921Y8336D1* +X12837Y8243D1* +X12736Y8170D1* +X12623Y8119D1* +X12501Y8093D1* +X12376D1* +X12254Y8118D1* +X12193Y8145D1* +X12288Y8016D1* +X12373Y7924D1* +X12436Y7816D1* +X12475Y7698D1* +X12489Y7569D1* +X12476Y7445D1* +X12438Y7326D1* +X12352Y7192D1* +X19989D1* +X19988Y9014D1* +X19599Y9011D1* +X12939D1* +X12981Y8934D1* +X13021Y8816D1* +X13035Y8687D1* +X13022Y8563D1* +X22518Y7323D2* +X22457Y7218D1* +X22374Y7125D1* +X22273Y7052D1* +X22159Y7001D1* +X22037Y6975D1* +X21912Y6974D1* +X21790Y7000D1* +X21676Y7051D1* +X21575Y7124D1* +X21491Y7216D1* +X21428Y7324D1* +X21389Y7442D1* +X21376Y7566D1* +X21388Y7691D1* +X21426Y7809D1* +X21488Y7918D1* +X21571Y8011D1* +X21672Y8085D1* +X21786Y8136D1* +X21907Y8163D1* +X22032Y8164D1* +X22154Y8138D1* +X22269Y8088D1* +X22370Y8016D1* +X22454Y7924D1* +X22519Y7812D1* +X22579Y7918D1* +X22662Y8011D1* +X22762Y8085D1* +X22876Y8136D1* +X22998Y8163D1* +X23123Y8164D1* +X23245Y8138D1* +X23359Y8088D1* +X23461Y8016D1* +X23545Y7924D1* +X23609Y7812D1* +X23669Y7918D1* +X23752Y8011D1* +X23853Y8085D1* +X23967Y8136D1* +X24089Y8163D1* +X24213Y8164D1* +X24336Y8138D1* +X24450Y8088D1* +X24551Y8016D1* +X24635Y7924D1* +X24700Y7812D1* +X24760Y7918D1* +X24843Y8011D1* +X24944Y8085D1* +X25057Y8136D1* +X25179Y8163D1* +X25304Y8164D1* +X25426Y8138D1* +X25540Y8088D1* +X25642Y8016D1* +X25726Y7924D1* +X25790Y7812D1* +X25850Y7918D1* +X25933Y8011D1* +X26034Y8085D1* +X26148Y8136D1* +X26270Y8163D1* +X26394Y8164D1* +X26517Y8138D1* +X26631Y8088D1* +X26732Y8016D1* +X26817Y7924D1* +X26881Y7812D1* +X26941Y7918D1* +X27024Y8011D1* +X27125Y8085D1* +X27238Y8136D1* +X27360Y8163D1* +X27485Y8164D1* +X27607Y8138D1* +X27721Y8088D1* +X27823Y8016D1* +X27907Y7924D1* +X27971Y7812D1* +X28032Y7918D1* +X28115Y8011D1* +X28215Y8085D1* +X28329Y8136D1* +X28451Y8163D1* +X28576Y8164D1* +X28698Y8138D1* +X28812Y8088D1* +X28913Y8016D1* +X28998Y7924D1* +X29061Y7816D1* +X29100Y7698D1* +X29114Y7569D1* +X29101Y7445D1* +X29063Y7326D1* +X29000Y7218D1* +X28917Y7125D1* +X28816Y7052D1* +X28702Y7001D1* +X28580Y6975D1* +X28456Y6974D1* +X28333Y7000D1* +X28219Y7051D1* +X28118Y7124D1* +X28034Y7216D1* +X27970Y7328D1* +X27910Y7218D1* +X27827Y7125D1* +X27726Y7052D1* +X27612Y7001D1* +X27490Y6975D1* +X27365Y6974D1* +X27243Y7000D1* +X27129Y7051D1* +X27028Y7124D1* +X26944Y7216D1* +X26880Y7328D1* +X26819Y7218D1* +X26736Y7125D1* +X26635Y7052D1* +X26521Y7001D1* +X26399Y6975D1* +X26274Y6974D1* +X26152Y7000D1* +X26038Y7051D1* +X25937Y7124D1* +X25853Y7216D1* +X25789Y7328D1* +X25729Y7218D1* +X25645Y7125D1* +X25545Y7052D1* +X25431Y7001D1* +X25309Y6975D1* +X25184Y6974D1* +X25062Y7000D1* +X24948Y7051D1* +X24847Y7124D1* +X24763Y7216D1* +X24699Y7328D1* +X24638Y7218D1* +X24555Y7125D1* +X24454Y7052D1* +X24340Y7001D1* +X24218Y6975D1* +X24093Y6974D1* +X23971Y7000D1* +X23857Y7051D1* +X23756Y7124D1* +X23672Y7216D1* +X23608Y7328D1* +X23548Y7218D1* +X23464Y7125D1* +X23363Y7052D1* +X23250Y7001D1* +X23128Y6975D1* +X23003Y6974D1* +X22881Y7000D1* +X22767Y7051D1* +X22665Y7124D1* +X22582Y7216D1* +X22518Y7328D1* +X28565Y19563D2* +X28526Y19444D1* +X28464Y19336D1* +X28381Y19243D1* +X28280Y19170D1* +X28166Y19119D1* +X28044Y19093D1* +X27919D1* +X27797Y19118D1* +X27683Y19169D1* +X27582Y19242D1* +X27498Y19334D1* +X27434Y19446D1* +X27374Y19336D1* +X27290Y19243D1* +X27189Y19170D1* +X27075Y19119D1* +X26953Y19093D1* +X26829D1* +X26706Y19118D1* +X26592Y19169D1* +X26491Y19242D1* +X26407Y19334D1* +X26343Y19446D1* +X26283Y19336D1* +X26200Y19243D1* +X26099Y19170D1* +X25985Y19119D1* +X25863Y19093D1* +X25738D1* +X25616Y19118D1* +X25502Y19169D1* +X25401Y19242D1* +X25317Y19334D1* +X25253Y19446D1* +X25192Y19336D1* +X25109Y19243D1* +X25008Y19170D1* +X24894Y19119D1* +X24772Y19093D1* +X24647D1* +X24525Y19118D1* +X24411Y19169D1* +X24310Y19242D1* +X24226Y19334D1* +X24162Y19446D1* +X24102Y19336D1* +X24018Y19243D1* +X23918Y19170D1* +X23804Y19119D1* +X23682Y19093D1* +X23557D1* +X23435Y19118D1* +X23321Y19169D1* +X23220Y19242D1* +X23136Y19334D1* +X23072Y19446D1* +X23011Y19336D1* +X22928Y19243D1* +X22827Y19170D1* +X22713Y19119D1* +X22591Y19093D1* +X22466D1* +X22344Y19118D1* +X22230Y19169D1* +X22129Y19242D1* +X22045Y19334D1* +X21981Y19446D1* +X21921Y19336D1* +X21837Y19243D1* +X21736Y19170D1* +X21623Y19119D1* +X21501Y19093D1* +X21376D1* +X21254Y19118D1* +X21140Y19169D1* +X21038Y19242D1* +X20955Y19334D1* +X20892Y19442D1* +X20853Y19561D1* +X20839Y19685D1* +X20852Y19809D1* +X20890Y19928D1* +X20952Y20036D1* +X21035Y20129D1* +X21135Y20203D1* +X21249Y20254D1* +X21371Y20281D1* +X21496Y20282D1* +X21618Y20257D1* +X21732Y20207D1* +X21834Y20134D1* +X21918Y20042D1* +X21982Y19930D1* +X22042Y20036D1* +X22125Y20129D1* +X22226Y20203D1* +X22340Y20254D1* +X22462Y20281D1* +X22586Y20282D1* +X22709Y20257D1* +X22823Y20207D1* +X22924Y20134D1* +X23008Y20042D1* +X23073Y19930D1* +X23133Y20036D1* +X23216Y20129D1* +X23317Y20203D1* +X23430Y20254D1* +X23552Y20281D1* +X23677Y20282D1* +X23799Y20257D1* +X23913Y20207D1* +X24015Y20134D1* +X24099Y20042D1* +X24163Y19930D1* +X24223Y20036D1* +X24307Y20129D1* +X24407Y20203D1* +X24521Y20254D1* +X24643Y20281D1* +X24767Y20282D1* +X24890Y20257D1* +X25004Y20207D1* +X25105Y20134D1* +X25190Y20042D1* +X25254Y19930D1* +X25314Y20036D1* +X25397Y20129D1* +X25498Y20203D1* +X25611Y20254D1* +X25733Y20281D1* +X25858Y20282D1* +X25980Y20257D1* +X26095Y20207D1* +X26196Y20134D1* +X26280Y20042D1* +X26345Y19930D1* +X26405Y20036D1* +X26488Y20129D1* +X26588Y20203D1* +X26702Y20254D1* +X26824Y20281D1* +X26949Y20282D1* +X27071Y20257D1* +X27185Y20207D1* +X27287Y20134D1* +X27371Y20042D1* +X27435Y19930D1* +X27495Y20036D1* +X27578Y20129D1* +X27679Y20203D1* +X27792Y20254D1* +X27914Y20281D1* +X28039Y20282D1* +X28161Y20257D1* +X28276Y20207D1* +X28377Y20134D1* +X28461Y20042D1* +X28524Y19934D1* +X28564Y19816D1* +X28578Y19687D1* +X28565Y19563D1* +X29110Y20681D2* +X29072Y20562D1* +X29009Y20454D1* +X28926Y20361D1* +X28825Y20288D1* +X28711Y20237D1* +X28589Y20211D1* +X28464D1* +X28342Y20236D1* +X28228Y20287D1* +X28127Y20360D1* +X28043Y20452D1* +X27979Y20564D1* +X27919Y20454D1* +X27835Y20361D1* +X27735Y20288D1* +X27621Y20237D1* +X27499Y20211D1* +X27374D1* +X27252Y20236D1* +X27138Y20287D1* +X27036Y20360D1* +X26953Y20452D1* +X26889Y20564D1* +X26828Y20454D1* +X26745Y20361D1* +X26644Y20288D1* +X26530Y20237D1* +X26408Y20211D1* +X26283D1* +X26161Y20236D1* +X26047Y20287D1* +X25946Y20360D1* +X25862Y20452D1* +X25798Y20564D1* +X25738Y20454D1* +X25654Y20361D1* +X25553Y20288D1* +X25440Y20237D1* +X25318Y20211D1* +X25193D1* +X25071Y20236D1* +X24957Y20287D1* +X24855Y20360D1* +X24772Y20452D1* +X24708Y20564D1* +X24647Y20454D1* +X24564Y20361D1* +X24463Y20288D1* +X24349Y20237D1* +X24227Y20211D1* +X24102D1* +X23980Y20236D1* +X23866Y20287D1* +X23765Y20360D1* +X23681Y20452D1* +X23617Y20564D1* +X23557Y20454D1* +X23473Y20361D1* +X23372Y20288D1* +X23258Y20237D1* +X23136Y20211D1* +X23012D1* +X22890Y20236D1* +X22775Y20287D1* +X22674Y20360D1* +X22590Y20452D1* +X22527Y20564D1* +X22466Y20454D1* +X22383Y20361D1* +X22282Y20288D1* +X22168Y20237D1* +X22046Y20211D1* +X21921D1* +X21799Y20236D1* +X21685Y20287D1* +X21584Y20360D1* +X21500Y20452D1* +X21437Y20560D1* +X21398Y20679D1* +X21385Y20803D1* +X21397Y20927D1* +X21435Y21046D1* +X21497Y21154D1* +X21580Y21247D1* +X21681Y21321D1* +X21794Y21372D1* +X21916Y21399D1* +X22041Y21400D1* +X22163Y21375D1* +X22278Y21325D1* +X22379Y21252D1* +X22463Y21160D1* +X22528Y21049D1* +X22588Y21154D1* +X22671Y21247D1* +X22771Y21321D1* +X22885Y21372D1* +X23007Y21399D1* +X23132Y21400D1* +X23254Y21375D1* +X23368Y21325D1* +X23470Y21252D1* +X23554Y21160D1* +X23618Y21049D1* +X23678Y21154D1* +X23761Y21247D1* +X23862Y21321D1* +X23975Y21372D1* +X24097Y21399D1* +X24222Y21400D1* +X24344Y21375D1* +X24459Y21325D1* +X24560Y21252D1* +X24644Y21160D1* +X24709Y21049D1* +X24769Y21154D1* +X24852Y21247D1* +X24952Y21321D1* +X25066Y21372D1* +X25188Y21399D1* +X25313Y21400D1* +X25435Y21375D1* +X25549Y21325D1* +X25651Y21252D1* +X25735Y21160D1* +X25799Y21049D1* +X25859Y21154D1* +X25942Y21247D1* +X26043Y21321D1* +X26157Y21372D1* +X26278Y21399D1* +X26403Y21400D1* +X26525Y21375D1* +X26640Y21325D1* +X26741Y21252D1* +X26825Y21160D1* +X26890Y21049D1* +X26950Y21154D1* +X27033Y21247D1* +X27133Y21321D1* +X27247Y21372D1* +X27369Y21399D1* +X27494Y21400D1* +X27616Y21375D1* +X27730Y21325D1* +X27832Y21252D1* +X27916Y21160D1* +X27980Y21049D1* +X28040Y21154D1* +X28123Y21247D1* +X28224Y21321D1* +X28338Y21372D1* +X28460Y21399D1* +X28584Y21400D1* +X28707Y21375D1* +X28821Y21325D1* +X28922Y21252D1* +X29006Y21160D1* +X29070Y21052D1* +X29109Y20934D1* +X29123Y20805D1* +X29110Y20681D1* +X12588Y19089D2* +X12362D1* +X16529Y14922D1* +X16756Y14924D1* +X12589Y19092D1* +X11477Y19110D2* +X11397Y19093D1* +X11269D1* +X15869Y14491D1* +X16097Y14493D1* +X11482Y19109D1* +X10387Y19110D2* +X10307Y19093D1* +X10178D1* +X15331Y13939D1* +X15567Y13940D1* +X15351Y14149D1* +X10393Y19107D1* +X9296Y19110D2* +X9216Y19093D1* +X9091D1* +X8969Y19118D1* +X8909Y19145D1* +X8912Y17930D1* +Y13309D1* +X13476Y13310D1* +X13494Y13429D1* +X13546Y13543D1* +X13629Y13635D1* +X13737Y13697D1* +X13859Y13723D1* +X13983Y13711D1* +X14097Y13661D1* +X14141Y13623D1* +X14784Y13625D1* +X9301Y19108D1* +X25161Y13587D2* +X25021D1* +X25001Y13473D1* +X24945Y13362D1* +X24858Y13273D1* +X24747Y13215D1* +X24625Y13194D1* +X24501Y13211D1* +X24389Y13265D1* +X24299Y13350D1* +X24239Y13459D1* +X24215Y13585D1* +X23939Y13587D1* +X23407D1* +X23406Y12958D1* +Y12328D1* +Y11698D1* +Y11481D1* +X23909Y11479D1* +X23914Y11520D1* +X23966Y11633D1* +X24050Y11725D1* +X24158Y11787D1* +X24279Y11813D1* +X24403Y11801D1* +X24518Y11752D1* +X24611Y11670D1* +X24675Y11563D1* +X24696Y11476D1* +X24882Y11479D1* +X24845Y11633D1* +X24859Y11757D1* +X24911Y11870D1* +X24995Y11962D1* +X25103Y12024D1* +X25224Y12050D1* +X25306Y12042D1* +X25437Y12122D1* +X25517Y12139D1* +X25514Y12424D1* +Y12920D1* +X25355Y12935D1* +X25242Y12989D1* +X25152Y13074D1* +X25092Y13184D1* +X25068Y13306D1* +X25083Y13429D1* +X25134Y13543D1* +X25153Y13563D1* +X24214Y13587D2* +X23624Y13591D1* +X23404Y13587D1* +X23402Y13272D1* +X23406Y12869D1* +X23402Y12643D1* +X23406Y12299D1* +X23404Y11479D1* +X23721Y11476D1* +X23874Y11479D1* +X13448Y12387D2* +X13426Y12366D1* +X22204Y12365D1* +X22181Y12387D1* +X13451D1* +X12927D2* +X8310D1* +X8450Y12365D1* +X12954D1* +D16* +X27312Y11937D3* +Y12449D3* +Y13687D3* +Y14199D3* +D17* +X21812Y15437D3* +X22324D3* +X26562D3* +X27074D3* +D18* +X29812Y10813D3* +D19* +Y9813D3* +D21* +X30570Y13435D3* +Y13750D3* +Y14065D3* +Y14380D3* +Y14695D3* +D22* +X30609Y12313D3* +Y15817D3* +X32775Y12313D3* +Y15817D3* +D23* +X4499Y16062D3* +Y16692D3* +Y11687D3* +Y12317D3* +D24* +X8075Y8687D3* +D25* +X32812Y11188D3* +D26* +X9165Y8687D3* +X10256D3* +X11346D3* +X12437D3* +X8620Y7569D3* +X9711D3* +X10801D3* +X11892D3* +D27* +X5337Y8128D3* +X15175D3* +D24* +X21428Y8687D3* +D26* +X22519D3* +X23609D3* +X24700D3* +X25790D3* +X26881D3* +X27971D3* +X29062D3* +X21973Y7569D3* +X23064D3* +X24155D3* +X25245D3* +X26336D3* +X27426D3* +X28517D3* +D28* +X18686Y8128D3* +X31804D3* +D24* +X29071Y19687D3* +D26* +X27980D3* +X26890D3* +X25799D3* +X24709D3* +X23618D3* +X22528D3* +X21437D3* +X28526Y20805D3* +X27435D3* +X26344D3* +X25254D3* +X24163D3* +X23073D3* +X21982D3* +D28* +X31813Y20246D3* +X18695D3* +D24* +X12424Y19687D3* +D26* +X11334D3* +X10243D3* +X9153D3* +X8062D3* +X11879Y20805D3* +X10788D3* +X9698D3* +X8607D3* +D27* +X15162Y20246D3* +X5324D3* +D17* +X6062Y16062D3* +X6574D3* +X6062Y11687D3* +X6574D3* +X28062Y11063D3* +X28574D3* +D30* +X25562Y14187D3* +X25247D3* +X24932D3* +X24617D3* +X24302D3* +X23987D3* +X23672D3* +X23357D3* +D31* +X22806Y13636D3* +Y13321D3* +Y13006D3* +Y12691D3* +Y12376D3* +Y12061D3* +Y11746D3* +Y11431D3* +D30* +X23357Y10880D3* +X23672D3* +X23987D3* +X24302D3* +X24617D3* +X24932D3* +X25247D3* +X25562D3* +D31* +X26113Y11431D3* +Y11746D3* +Y12061D3* +Y12376D3* +Y12691D3* +Y13006D3* +Y13321D3* +Y13636D3* +D33* +X22562Y16687D3* +X26302D3* +M02* diff --git a/board/TopMask.gbr b/board/TopMask.gbr new file mode 100644 index 0000000..c004bf1 --- /dev/null +++ b/board/TopMask.gbr @@ -0,0 +1,177 @@ +G04 DipTrace 2.4.0.2* +%INTopMask.gbr*% +%MOIN*% +%ADD35C,0.0354*% +%ADD39R,0.2244X0.0866*% +%ADD41R,0.0748X0.0276*% +%ADD43R,0.0276X0.0748*% +%ADD45C,0.1969*% +%ADD47C,0.1953*% +%ADD49C,0.0744*% +%ADD51R,0.0669X0.0669*% +%ADD53R,0.0744X0.0744*% +%ADD55R,0.065X0.0472*% +%ADD57R,0.1063X0.0866*% +%ADD59R,0.0984X0.0276*% +%ADD61C,0.0709*% +%ADD63R,0.0709X0.0709*% +%ADD65R,0.0433X0.0354*% +%ADD67R,0.0354X0.0433*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNTopMask*% +%LPD*% +D67* +X27312Y11937D3* +Y12449D3* +Y13687D3* +Y14199D3* +D65* +X21812Y15437D3* +X22324D3* +X26562D3* +X27074D3* +D63* +X29812Y10813D3* +D61* +Y9813D3* +D59* +X30570Y13435D3* +Y13750D3* +Y14065D3* +Y14380D3* +Y14695D3* +D57* +X30609Y12313D3* +Y15817D3* +X32775Y12313D3* +Y15817D3* +D35* +X31594Y13199D3* +Y14931D3* +D55* +X4499Y16062D3* +Y16692D3* +Y11687D3* +Y12317D3* +D53* +X8075Y8687D3* +D51* +X32812Y11188D3* +D49* +X9165Y8687D3* +X10256D3* +X11346D3* +X12437D3* +X8620Y7569D3* +X9711D3* +X10801D3* +X11892D3* +D47* +X5337Y8128D3* +X15175D3* +D53* +X21428Y8687D3* +D49* +X22519D3* +X23609D3* +X24700D3* +X25790D3* +X26881D3* +X27971D3* +X29062D3* +X21973Y7569D3* +X23064D3* +X24155D3* +X25245D3* +X26336D3* +X27426D3* +X28517D3* +D45* +X18686Y8128D3* +X31804D3* +D53* +X29071Y19687D3* +D49* +X27980D3* +X26890D3* +X25799D3* +X24709D3* +X23618D3* +X22528D3* +X21437D3* +X28526Y20805D3* +X27435D3* +X26344D3* +X25254D3* +X24163D3* +X23073D3* +X21982D3* +D45* +X31813Y20246D3* +X18695D3* +D53* +X12424Y19687D3* +D49* +X11334D3* +X10243D3* +X9153D3* +X8062D3* +X11879Y20805D3* +X10788D3* +X9698D3* +X8607D3* +D47* +X15162Y20246D3* +X5324D3* +D65* +X6062Y16062D3* +X6574D3* +X6062Y11687D3* +X6574D3* +X28062Y11063D3* +X28574D3* +D43* +X25562Y14187D3* +X25247D3* +X24932D3* +X24617D3* +X24302D3* +X23987D3* +X23672D3* +X23357D3* +D41* +X22806Y13636D3* +Y13321D3* +Y13006D3* +Y12691D3* +Y12376D3* +Y12061D3* +Y11746D3* +Y11431D3* +D43* +X23357Y10880D3* +X23672D3* +X23987D3* +X24302D3* +X24617D3* +X24932D3* +X25247D3* +X25562D3* +D41* +X26113Y11431D3* +Y11746D3* +Y12061D3* +Y12376D3* +Y12691D3* +Y13006D3* +Y13321D3* +Y13636D3* +D39* +X22562Y16687D3* +X26302D3* +M02* diff --git a/board/TopSilk.gbr b/board/TopSilk.gbr new file mode 100644 index 0000000..0f0d9ea --- /dev/null +++ b/board/TopSilk.gbr @@ -0,0 +1,1078 @@ +G04 DipTrace 2.4.0.2* +%INTopSilk.gbr*% +%MOIN*% +%ADD10C,0.0098*% +%ADD20C,0.0197*% +%ADD29O,0.0164X0.0165*% +%ADD32C,0.0154*% +%ADD69C,0.0077*% +%ADD70C,0.0062*% +%ADD71C,0.0139*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNTopSilk*% +%LPD*% +X29694Y11612D2* +D10* +X29930D1* +X29812Y11730D2* +Y11494D1* +X28812Y10313D2* +G02X28812Y10313I1000J0D01* +G01* +X33936Y12530D2* +Y15600D1* +Y12530D2* +X33444D1* +X32113D2* +X31271D1* +X30235Y12884D2* +Y13159D1* +Y14970D2* +Y15246D1* +X31271Y15600D2* +X32113D1* +X33444D2* +X33936D1* +D20* +X29901Y13435D3* +X4736Y17058D2* +D10* +X4263D1* +X4736Y12683D2* +X4263D1* +X25582Y13675D2* +X23298D1* +Y11392D1* +X25582D1* +Y13675D1* +D29* +X25893Y14192D3* +G36* +X25582Y13675D2* +X25267D1* +X25582Y13360D1* +Y13675D1* +G37* +D32* +X21697Y17302D3* +X22188Y17356D2* +D10* +Y17652D1* +X26676Y15722D2* +Y16018D1* +X22188Y15722D2* +X26676D1* +X22188D2* +Y16018D1* +X26676Y17356D2* +Y17652D1* +X22188D2* +X26676D1* +X27735Y12235D2* +D69* +X27688Y12211D1* +X27640Y12163D1* +X27616Y12116D1* +Y12020D1* +X27640Y11972D1* +X27688Y11924D1* +X27735Y11900D1* +X27807Y11876D1* +X27927D1* +X27998Y11900D1* +X28047Y11924D1* +X28094Y11972D1* +X28118Y12020D1* +Y12116D1* +X28094Y12163D1* +X28047Y12211D1* +X27998Y12235D1* +X27712Y12389D2* +X27688Y12438D1* +X27617Y12509D1* +X28118D1* +X27716Y13878D2* +X27669Y13854D1* +X27621Y13806D1* +X27597Y13758D1* +Y13663D1* +X27621Y13615D1* +X27669Y13567D1* +X27716Y13543D1* +X27788Y13519D1* +X27908D1* +X27979Y13543D1* +X28027Y13567D1* +X28075Y13615D1* +X28099Y13663D1* +Y13758D1* +X28075Y13806D1* +X28027Y13854D1* +X27979Y13878D1* +X27717Y14056D2* +X27693D1* +X27645Y14080D1* +X27621Y14104D1* +X27597Y14152D1* +Y14248D1* +X27621Y14295D1* +X27645Y14319D1* +X27693Y14343D1* +X27741D1* +X27789Y14319D1* +X27860Y14271D1* +X28099Y14032D1* +Y14367D1* +X21003Y15438D2* +X20979Y15485D1* +X20931Y15533D1* +X20883Y15557D1* +X20788D1* +X20740Y15533D1* +X20692Y15485D1* +X20668Y15438D1* +X20644Y15366D1* +Y15246D1* +X20668Y15175D1* +X20692Y15126D1* +X20740Y15079D1* +X20788Y15055D1* +X20883D1* +X20931Y15079D1* +X20979Y15126D1* +X21003Y15175D1* +X21205Y15556D2* +X21468D1* +X21324Y15365D1* +X21396D1* +X21444Y15341D1* +X21468Y15318D1* +X21492Y15246D1* +Y15198D1* +X21468Y15126D1* +X21420Y15078D1* +X21348Y15055D1* +X21276D1* +X21205Y15078D1* +X21181Y15103D1* +X21157Y15150D1* +X27741Y15438D2* +X27717Y15485D1* +X27669Y15533D1* +X27621Y15557D1* +X27526D1* +X27478Y15533D1* +X27430Y15485D1* +X27406Y15438D1* +X27382Y15366D1* +Y15246D1* +X27406Y15175D1* +X27430Y15126D1* +X27478Y15079D1* +X27526Y15055D1* +X27621D1* +X27669Y15079D1* +X27717Y15126D1* +X27741Y15175D1* +X28134Y15055D2* +Y15556D1* +X27895Y15222D1* +X28254D1* +X29747Y12343D2* +X29723Y12390D1* +X29675Y12438D1* +X29627Y12462D1* +X29532D1* +X29484Y12438D1* +X29436Y12390D1* +X29412Y12343D1* +X29388Y12271D1* +Y12151D1* +X29412Y12080D1* +X29436Y12032D1* +X29484Y11984D1* +X29532Y11960D1* +X29627D1* +X29675Y11984D1* +X29723Y12032D1* +X29747Y12080D1* +X30188Y12462D2* +X29949D1* +X29925Y12247D1* +X29949Y12270D1* +X30021Y12295D1* +X30092D1* +X30164Y12270D1* +X30212Y12223D1* +X30236Y12151D1* +Y12103D1* +X30212Y12032D1* +X30164Y11984D1* +X30092Y11960D1* +X30021D1* +X29949Y11984D1* +X29925Y12008D1* +X29901Y12055D1* +X31744Y16943D2* +Y16560D1* +X31720Y16489D1* +X31696Y16465D1* +X31648Y16440D1* +X31600D1* +X31553Y16465D1* +X31529Y16489D1* +X31505Y16560D1* +Y16608D1* +X32185Y16942D2* +X31947D1* +X31923Y16727D1* +X31947Y16751D1* +X32018Y16775D1* +X32090D1* +X32162Y16751D1* +X32210Y16704D1* +X32233Y16632D1* +Y16584D1* +X32210Y16512D1* +X32162Y16464D1* +X32090Y16440D1* +X32018D1* +X31947Y16464D1* +X31923Y16489D1* +X31898Y16536D1* +X5044Y15704D2* +X5547D1* +Y15991D1* +X5044Y16456D2* +Y16145D1* +X5547D1* +Y16456D1* +X5284Y16145D2* +Y16336D1* +X5044Y16610D2* +X5547D1* +Y16778D1* +X5523Y16849D1* +X5475Y16898D1* +X5427Y16921D1* +X5356Y16945D1* +X5236D1* +X5164Y16921D1* +X5116Y16898D1* +X5068Y16849D1* +X5044Y16778D1* +Y16610D1* +X5141Y17099D2* +X5116Y17148D1* +X5045Y17219D1* +X5547D1* +X4982Y11284D2* +X5484D1* +Y11571D1* +X4982Y12036D2* +Y11725D1* +X5484D1* +Y12036D1* +X5221Y11725D2* +Y11916D1* +X4982Y12190D2* +X5484D1* +Y12358D1* +X5460Y12429D1* +X5412Y12478D1* +X5364Y12501D1* +X5293Y12525D1* +X5173D1* +X5101Y12501D1* +X5054Y12478D1* +X5006Y12429D1* +X4982Y12358D1* +Y12190D1* +X5102Y12704D2* +X5078D1* +X5030Y12728D1* +X5006Y12751D1* +X4982Y12799D1* +Y12895D1* +X5006Y12943D1* +X5030Y12966D1* +X5078Y12991D1* +X5126D1* +X5174Y12966D1* +X5245Y12919D1* +X5484Y12679D1* +Y13014D1* +X6013Y16693D2* +X6228D1* +X6300Y16717D1* +X6324Y16741D1* +X6348Y16788D1* +Y16836D1* +X6324Y16884D1* +X6300Y16908D1* +X6228Y16932D1* +X6013D1* +Y16430D1* +X6181Y16693D2* +X6348Y16430D1* +X6503Y16836D2* +X6551Y16860D1* +X6623Y16931D1* +Y16430D1* +X5906Y12318D2* +X6121D1* +X6193Y12342D1* +X6217Y12366D1* +X6241Y12413D1* +Y12461D1* +X6217Y12509D1* +X6193Y12533D1* +X6121Y12557D1* +X5906D1* +Y12055D1* +X6073Y12318D2* +X6241Y12055D1* +X6419Y12437D2* +Y12461D1* +X6443Y12509D1* +X6467Y12533D1* +X6515Y12556D1* +X6611D1* +X6658Y12533D1* +X6682Y12509D1* +X6706Y12461D1* +Y12413D1* +X6682Y12365D1* +X6634Y12294D1* +X6395Y12055D1* +X6730D1* +X27906Y11694D2* +X28121D1* +X28192Y11718D1* +X28217Y11742D1* +X28240Y11789D1* +Y11837D1* +X28217Y11885D1* +X28192Y11909D1* +X28121Y11933D1* +X27906D1* +Y11431D1* +X28073Y11694D2* +X28240Y11431D1* +X28443Y11932D2* +X28705D1* +X28562Y11741D1* +X28634D1* +X28682Y11717D1* +X28705Y11694D1* +X28730Y11622D1* +Y11574D1* +X28705Y11502D1* +X28658Y11454D1* +X28586Y11431D1* +X28514D1* +X28443Y11454D1* +X28419Y11479D1* +X28395Y11526D1* +X24155Y15254D2* +Y14895D1* +X24179Y14823D1* +X24227Y14776D1* +X24299Y14751D1* +X24346D1* +X24418Y14776D1* +X24466Y14823D1* +X24490Y14895D1* +Y15254D1* +X24644Y15158D2* +X24692Y15182D1* +X24764Y15253D1* +Y14751D1* +X24104Y18384D2* +X24295Y18144D1* +Y17881D1* +X24486Y18384D2* +X24295Y18144D1* +X24641Y18288D2* +X24689Y18312D1* +X24760Y18383D1* +Y17881D1* +X31280Y11202D2* +D70* +X31452D1* +X31510Y11221D1* +X31529Y11240D1* +X31548Y11278D1* +Y11317D1* +X31529Y11355D1* +X31510Y11374D1* +X31452Y11393D1* +X31280D1* +Y10991D1* +X31414Y11202D2* +X31548Y10991D1* +X31939Y11336D2* +X31901Y11374D1* +X31844Y11393D1* +X31767D1* +X31710Y11374D1* +X31672Y11336D1* +Y11298D1* +X31691Y11259D1* +X31710Y11240D1* +X31748Y11221D1* +X31863Y11183D1* +X31901Y11164D1* +X31920Y11144D1* +X31939Y11106D1* +Y11049D1* +X31901Y11011D1* +X31844Y10991D1* +X31767D1* +X31710Y11011D1* +X31672Y11049D1* +X32197Y11393D2* +Y10991D1* +X32063Y11393D2* +X32331D1* +X8551Y14393D2* +D71* +X8509Y14479D1* +X8422Y14565D1* +X8337Y14608D1* +X8164D1* +X8078Y14565D1* +X7992Y14479D1* +X7949Y14393D1* +X7906Y14264D1* +Y14048D1* +X7949Y13919D1* +X7992Y13833D1* +X8078Y13747D1* +X8164Y13704D1* +X8337D1* +X8422Y13747D1* +X8509Y13833D1* +X8551Y13919D1* +X8829Y14608D2* +Y13704D1* +X9346D1* +X9624Y14608D2* +Y13962D1* +X9666Y13833D1* +X9753Y13747D1* +X9882Y13704D1* +X9968D1* +X10097Y13747D1* +X10184Y13833D1* +X10226Y13962D1* +Y14608D1* +X11107Y14479D2* +X11022Y14565D1* +X10892Y14608D1* +X10720D1* +X10591Y14565D1* +X10504Y14479D1* +Y14393D1* +X10548Y14306D1* +X10591Y14264D1* +X10676Y14221D1* +X10935Y14134D1* +X11022Y14092D1* +X11064Y14048D1* +X11107Y13962D1* +Y13833D1* +X11022Y13747D1* +X10892Y13704D1* +X10720D1* +X10591Y13747D1* +X10504Y13833D1* +X11687Y14608D2* +Y13704D1* +X11385Y14608D2* +X11988D1* +X12825D2* +X12266D1* +Y13704D1* +X12825D1* +X12266Y14177D2* +X12610D1* +X13103D2* +X13490D1* +X13619Y14221D1* +X13663Y14264D1* +X13706Y14349D1* +Y14436D1* +X13663Y14521D1* +X13619Y14565D1* +X13490Y14608D1* +X13103D1* +Y13704D1* +X13404Y14177D2* +X13706Y13704D1* +X13984Y14177D2* +X14371D1* +X14500Y14221D1* +X14544Y14264D1* +X14587Y14349D1* +Y14436D1* +X14544Y14521D1* +X14500Y14565D1* +X14371Y14608D1* +X13984D1* +Y13704D1* +X14285Y14177D2* +X14587Y13704D1* +X14864Y14177D2* +X15251D1* +X15381Y14221D1* +X15425Y14264D1* +X15467Y14349D1* +Y14436D1* +X15425Y14521D1* +X15381Y14565D1* +X15251Y14608D1* +X14864D1* +Y13704D1* +X15166Y14177D2* +X15467Y13704D1* +X15788Y13790D2* +X15745Y13746D1* +X15788Y13704D1* +X15832Y13746D1* +X15788Y13790D1* +X16755Y14393D2* +X16713Y14479D1* +X16626Y14565D1* +X16540Y14608D1* +X16368D1* +X16282Y14565D1* +X16196Y14479D1* +X16153Y14393D1* +X16110Y14264D1* +Y14048D1* +X16153Y13919D1* +X16196Y13833D1* +X16282Y13747D1* +X16368Y13704D1* +X16540D1* +X16626Y13747D1* +X16713Y13833D1* +X16755Y13919D1* +X17292Y14608D2* +X17205Y14565D1* +X17120Y14479D1* +X17076Y14393D1* +X17033Y14264D1* +Y14048D1* +X17076Y13919D1* +X17120Y13833D1* +X17205Y13747D1* +X17292Y13704D1* +X17464D1* +X17550Y13747D1* +X17636Y13833D1* +X17679Y13919D1* +X17722Y14048D1* +Y14264D1* +X17679Y14393D1* +X17636Y14479D1* +X17550Y14565D1* +X17464Y14608D1* +X17292D1* +X18688Y13704D2* +Y14608D1* +X18344Y13704D1* +X18000Y14608D1* +Y13704D1* +X7092Y18915D2* +D69* +X7044Y18963D1* +X6973Y18987D1* +X6877D1* +X6805Y18963D1* +X6757Y18915D1* +Y18867D1* +X6781Y18819D1* +X6805Y18795D1* +X6853Y18772D1* +X6996Y18724D1* +X7044Y18700D1* +X7068Y18676D1* +X7092Y18628D1* +Y18556D1* +X7044Y18509D1* +X6973Y18484D1* +X6877D1* +X6805Y18509D1* +X6757Y18556D1* +X7557Y18987D2* +X7246D1* +Y18484D1* +X7557D1* +X7246Y18747D2* +X7438D1* +X8070Y18867D2* +X8046Y18915D1* +X7998Y18963D1* +X7951Y18987D1* +X7855D1* +X7807Y18963D1* +X7759Y18915D1* +X7735Y18867D1* +X7711Y18795D1* +Y18676D1* +X7735Y18604D1* +X7759Y18556D1* +X7807Y18509D1* +X7855Y18484D1* +X7951D1* +X7998Y18509D1* +X8046Y18556D1* +X8070Y18604D1* +Y18676D1* +X7951D1* +X8607Y18484D2* +X8416Y18987D1* +X8224Y18484D1* +X8296Y18652D2* +X8536D1* +X9630Y18484D2* +Y18987D1* +X9439Y18484D1* +X9248Y18987D1* +Y18484D1* +X9785Y18987D2* +Y18484D1* +X9952D1* +X10024Y18509D1* +X10072Y18556D1* +X10096Y18604D1* +X10120Y18676D1* +Y18795D1* +X10096Y18867D1* +X10072Y18915D1* +X10024Y18963D1* +X9952Y18987D1* +X9785D1* +X10760Y18724D2* +X10976D1* +X11047Y18747D1* +X11071Y18772D1* +X11095Y18819D1* +Y18891D1* +X11071Y18939D1* +X11047Y18963D1* +X10976Y18987D1* +X10760D1* +Y18484D1* +X11393Y18987D2* +X11345Y18963D1* +X11297Y18915D1* +X11273Y18867D1* +X11249Y18795D1* +Y18676D1* +X11273Y18604D1* +X11297Y18556D1* +X11345Y18509D1* +X11393Y18484D1* +X11489D1* +X11536Y18509D1* +X11584Y18556D1* +X11608Y18604D1* +X11632Y18676D1* +Y18795D1* +X11608Y18867D1* +X11584Y18915D1* +X11536Y18963D1* +X11489Y18987D1* +X11393D1* +X11786Y18747D2* +X12001D1* +X12073Y18772D1* +X12097Y18795D1* +X12121Y18843D1* +Y18891D1* +X12097Y18939D1* +X12073Y18963D1* +X12001Y18987D1* +X11786D1* +Y18484D1* +X11954Y18747D2* +X12121Y18484D1* +X12443Y18987D2* +Y18484D1* +X12276Y18987D2* +X12610D1* +X13442Y19082D2* +X13275Y18388D1* +X13586Y19082D2* +X13418Y18388D1* +X13275Y18807D2* +X13610D1* +X13251Y18663D2* +X13586D1* +X13764Y18891D2* +X13812Y18915D1* +X13884Y18986D1* +Y18484D1* +X13688Y9495D2* +X13736Y9447D1* +X13808Y9423D1* +X13903D1* +X13975Y9447D1* +X14023Y9495D1* +Y9543D1* +X13999Y9591D1* +X13975Y9614D1* +X13928Y9638D1* +X13784Y9686D1* +X13736Y9710D1* +X13712Y9734D1* +X13688Y9782D1* +Y9854D1* +X13736Y9901D1* +X13808Y9926D1* +X13903D1* +X13975Y9901D1* +X14023Y9854D1* +X13223Y9423D2* +X13534D1* +Y9926D1* +X13223D1* +X13534Y9662D2* +X13343D1* +X12710Y9543D2* +X12734Y9495D1* +X12782Y9447D1* +X12830Y9423D1* +X12925D1* +X12973Y9447D1* +X13021Y9495D1* +X13045Y9543D1* +X13069Y9614D1* +Y9734D1* +X13045Y9806D1* +X13021Y9854D1* +X12973Y9901D1* +X12925Y9926D1* +X12830D1* +X12782Y9901D1* +X12734Y9854D1* +X12710Y9806D1* +Y9734D1* +X12830D1* +X12173Y9926D2* +X12365Y9423D1* +X12556Y9926D1* +X12484Y9758D2* +X12245D1* +X11150Y9926D2* +Y9423D1* +X11341Y9926D1* +X11533Y9423D1* +Y9926D1* +X10996Y9423D2* +Y9926D1* +X10828D1* +X10756Y9901D1* +X10708Y9854D1* +X10685Y9806D1* +X10661Y9734D1* +Y9614D1* +X10685Y9543D1* +X10708Y9495D1* +X10756Y9447D1* +X10828Y9423D1* +X10996D1* +X10020Y9686D2* +X9805D1* +X9733Y9662D1* +X9709Y9638D1* +X9685Y9591D1* +Y9519D1* +X9709Y9471D1* +X9733Y9447D1* +X9805Y9423D1* +X10020D1* +Y9926D1* +X9387Y9423D2* +X9435Y9447D1* +X9483Y9495D1* +X9507Y9543D1* +X9531Y9614D1* +Y9734D1* +X9507Y9806D1* +X9483Y9854D1* +X9435Y9901D1* +X9387Y9926D1* +X9292D1* +X9244Y9901D1* +X9196Y9854D1* +X9172Y9806D1* +X9149Y9734D1* +Y9614D1* +X9172Y9543D1* +X9196Y9495D1* +X9244Y9447D1* +X9292Y9423D1* +X9387D1* +X8994Y9662D2* +X8779D1* +X8707Y9638D1* +X8683Y9614D1* +X8659Y9567D1* +Y9519D1* +X8683Y9471D1* +X8707Y9447D1* +X8779Y9423D1* +X8994D1* +Y9926D1* +X8827Y9662D2* +X8659Y9926D1* +X8337Y9423D2* +Y9926D1* +X8505Y9423D2* +X8170D1* +X7338Y9328D2* +X7505Y10021D1* +X7195Y9328D2* +X7362Y10021D1* +X7505Y9603D2* +X7171D1* +X7529Y9746D2* +X7195D1* +X6992Y9543D2* +Y9519D1* +X6968Y9471D1* +X6945Y9447D1* +X6896Y9424D1* +X6801D1* +X6753Y9447D1* +X6730Y9471D1* +X6705Y9519D1* +Y9567D1* +X6730Y9615D1* +X6777Y9686D1* +X7016Y9926D1* +X6681D1* +X22384Y18987D2* +Y18484D1* +X22551D1* +X22623Y18509D1* +X22671Y18556D1* +X22695Y18604D1* +X22719Y18676D1* +Y18795D1* +X22695Y18867D1* +X22671Y18915D1* +X22623Y18963D1* +X22551Y18987D1* +X22384D1* +X23184D2* +X22873D1* +Y18484D1* +X23184D1* +X22873Y18747D2* +X23064D1* +X23673Y18987D2* +Y18484D1* +X23338Y18987D1* +Y18484D1* +X23827Y18987D2* +Y18484D1* +X23995D1* +X24067Y18509D1* +X24115Y18556D1* +X24138Y18604D1* +X24162Y18676D1* +Y18795D1* +X24138Y18867D1* +X24115Y18915D1* +X24067Y18963D1* +X23995Y18987D1* +X23827D1* +X24317D2* +X24508Y18747D1* +Y18484D1* +X24699Y18987D2* +X24508Y18747D1* +X25340Y18724D2* +X25555D1* +X25626Y18747D1* +X25651Y18772D1* +X25674Y18819D1* +Y18891D1* +X25651Y18939D1* +X25626Y18963D1* +X25555Y18987D1* +X25340D1* +Y18484D1* +X25973Y18987D2* +X25924Y18963D1* +X25877Y18915D1* +X25853Y18867D1* +X25829Y18795D1* +Y18676D1* +X25853Y18604D1* +X25877Y18556D1* +X25924Y18509D1* +X25973Y18484D1* +X26068D1* +X26116Y18509D1* +X26164Y18556D1* +X26188Y18604D1* +X26211Y18676D1* +Y18795D1* +X26188Y18867D1* +X26164Y18915D1* +X26116Y18963D1* +X26068Y18987D1* +X25973D1* +X26366Y18747D2* +X26581D1* +X26653Y18772D1* +X26677Y18795D1* +X26701Y18843D1* +Y18891D1* +X26677Y18939D1* +X26653Y18963D1* +X26581Y18987D1* +X26366D1* +Y18484D1* +X26533Y18747D2* +X26701Y18484D1* +X27022Y18987D2* +Y18484D1* +X26855Y18987D2* +X27190D1* +X28022Y19082D2* +X27855Y18388D1* +X28165Y19082D2* +X27998Y18388D1* +X27855Y18807D2* +X28189D1* +X27830Y18663D2* +X28165D1* +X28343Y18891D2* +X28392Y18915D1* +X28463Y18986D1* +Y18484D1* +X28303Y9361D2* +Y9863D1* +X28136D1* +X28064Y9839D1* +X28016Y9791D1* +X27992Y9743D1* +X27968Y9672D1* +Y9552D1* +X27992Y9480D1* +X28016Y9432D1* +X28064Y9384D1* +X28136Y9361D1* +X28303D1* +X27503D2* +X27814D1* +Y9863D1* +X27503D1* +X27814Y9600D2* +X27623D1* +X27014Y9361D2* +Y9863D1* +X27349Y9361D1* +Y9863D1* +X26860Y9361D2* +Y9863D1* +X26692D1* +X26620Y9839D1* +X26572Y9791D1* +X26549Y9743D1* +X26525Y9672D1* +Y9552D1* +X26549Y9480D1* +X26572Y9432D1* +X26620Y9384D1* +X26692Y9361D1* +X26860D1* +X26370D2* +X26179Y9600D1* +Y9863D1* +X25988Y9361D2* +X26179Y9600D1* +X25347Y9624D2* +X25132D1* +X25061Y9600D1* +X25036Y9576D1* +X25013Y9528D1* +Y9456D1* +X25036Y9409D1* +X25061Y9384D1* +X25132Y9361D1* +X25347D1* +Y9863D1* +X24714Y9361D2* +X24763Y9384D1* +X24810Y9432D1* +X24834Y9480D1* +X24858Y9552D1* +Y9672D1* +X24834Y9743D1* +X24810Y9791D1* +X24763Y9839D1* +X24714Y9863D1* +X24619D1* +X24571Y9839D1* +X24523Y9791D1* +X24499Y9743D1* +X24476Y9672D1* +Y9552D1* +X24499Y9480D1* +X24523Y9432D1* +X24571Y9384D1* +X24619Y9361D1* +X24714D1* +X24321Y9600D2* +X24106D1* +X24034Y9576D1* +X24010Y9552D1* +X23986Y9504D1* +Y9456D1* +X24010Y9409D1* +X24034Y9384D1* +X24106Y9361D1* +X24321D1* +Y9863D1* +X24154Y9600D2* +X23986Y9863D1* +X23665Y9361D2* +Y9863D1* +X23832Y9361D2* +X23497D1* +X22665Y9265D2* +X22832Y9959D1* +X22522Y9265D2* +X22689Y9959D1* +X22832Y9540D2* +X22498D1* +X22857Y9684D2* +X22522D1* +X22319Y9481D2* +Y9457D1* +X22295Y9409D1* +X22272Y9385D1* +X22224Y9361D1* +X22128D1* +X22080Y9385D1* +X22057Y9409D1* +X22032Y9457D1* +Y9504D1* +X22057Y9552D1* +X22104Y9624D1* +X22344Y9863D1* +X22009D1* +M02* diff --git a/board/nessmd2usb.dip b/board/nessmd2usb.dip Binary files differnew file mode 100644 index 0000000..da85a14 --- /dev/null +++ b/board/nessmd2usb.dip diff --git a/board/~nessmd2usb.dip~ b/board/~nessmd2usb.dip~ new file mode 100644 index 0000000..d847d8a --- /dev/null +++ b/board/~nessmd2usb.dip~ @@ -0,0 +1,3 @@ +CLUSTER-MAIN +Cluster +23.04.2016 21:29:56 diff --git a/defines.h b/defines.h new file mode 100644 index 0000000..2ebf2a2 --- /dev/null +++ b/defines.h @@ -0,0 +1,30 @@ +#define SMD_ENABLED +#define SMD_SECOND_ENABLED +#define SMD_SELECT_PORT D +#define SMD_SELECT_PIN 6 +#define SMD_DATA_PORT D +#define SMD_DATA0_PIN 0 +#define SMD_DATA1_PIN 1 +#define SMD_DATA2_PIN 2 +#define SMD_DATA3_PIN 3 +#define SMD_DATA4_PIN 4 +#define SMD_DATA5_PIN 5 +#define SMD_DATA_PORT2 B +#define SMD_DATA0_PIN2 0 +#define SMD_DATA1_PIN2 1 +#define SMD_DATA2_PIN2 2 +#define SMD_DATA3_PIN2 3 +#define SMD_DATA4_PIN2 4 +#define SMD_DATA5_PIN2 5 + +#define NES_ENABLED +#define NES_SECOND_ENABLED +#define NES_PORT C +#define NES_LATCH_PIN 4 +#define NES_CLOCK_PIN 5 +#define NES_DATA_PIN 6 +#define NES_DATA_PIN2 7 + +#define LED_PORT B +#define LED_RED_PIN 6 +#define LED_GREEN_PIN 7 diff --git a/doxyfile b/doxyfile new file mode 100644 index 0000000..a48265c --- /dev/null +++ b/doxyfile @@ -0,0 +1,2364 @@ +# Doxyfile 1.8.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "LUFA Library - Joystick Device Demo" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Documentation/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = NO + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = *.h \ + *.c \ + *.txt + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = Documentation/ + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = __* \ + INCLUDE_FROM_* + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = NO + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# compiled with the --with-libclang option. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra stylesheet files is of importance (e.g. the last +# stylesheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer ( doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer ( doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# The default value is: YES. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. To get the times font for +# instance you can specify +# EXTRA_PACKAGES=times +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string, +# for the replacement values of the other commands the user is refered to +# HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES to get a +# higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BATCHMODE = NO + +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HIDE_INDICES = NO + +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_EXTENSION = .3 + +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_OUTPUT = xml + +# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen +# Definitions (see http://autogen.sf.net) file that captures the structure of +# the code including all documentation. Note that this feature is still +# experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names +# in the source code. If set to NO only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED = __DOXYGEN__ \ + PROGMEM + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external class will be listed in the +# class index. If set to NO only the inherited external classes will be listed. +# The default value is: NO. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in +# the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: NO. + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME = + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +CLASS_GRAPH = NO + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = NO + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = NO + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = NO + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = NO + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif and svg. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. +# This tag requires that the tag HAVE_DOT is set to YES. + +PLANTUML_JAR_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 15 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 2 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_CLEANUP = YES diff --git a/gamepad.c b/gamepad.c new file mode 100644 index 0000000..98253a5 --- /dev/null +++ b/gamepad.c @@ -0,0 +1,347 @@ +#include "defines.h" +#include <avr/io.h> +#include <util/delay.h> +#include "gamepad.h" +#include "bits.h" + +#ifdef NES_ENABLED + +void init_nes_gamepad() +{ + NES_PORT_DDR |= 1<<NES_LATCH_PIN; // Latch, output + NES_PORT_DDR |= 1<<NES_CLOCK_PIN; // Clock, output + NES_PORT_DDR &= ~(1<<NES_DATA_PIN); // Data, input +#ifdef NES_SECOND_ENABLED + NES_PORT_PORT |= 1<<NES_DATA_PIN; // Data, pull-up + NES_PORT_DDR &= ~(1<<NES_DATA_PIN2); // Data, input + NES_PORT_PORT |= 1<<NES_DATA_PIN2; // Data, pull-up +#endif +} + +uint16_t get_nes_gamepad() +{ + uint16_t gamepad_data = 0; + NES_PORT_PORT &= ~(1<<NES_LATCH_PIN); // Latch + int b; + for (b = 0; b < 8; b++) + { + NES_PORT_PORT &= ~(1<<NES_CLOCK_PIN); // Clock + _delay_us(10); + gamepad_data |= (((NES_PORT_PIN>>NES_DATA_PIN)&1)<<b); +#ifdef NES_SECOND_ENABLED + gamepad_data |= (((NES_PORT_PIN>>NES_DATA_PIN2)&1)<<b) * 0x100; +#endif + NES_PORT_PORT |= 1<<NES_CLOCK_PIN; // Clock + _delay_us(10); + } + NES_PORT_PORT |= 1<<NES_LATCH_PIN; // Latch + return gamepad_data; +} +#endif + +uint16_t get_nes_gamepad_decoded(void) +{ + return get_nes_gamepad() ^ 0xFFFF; +} + +#ifdef SNES_ENABLED +void init_snes_gamepad() +{ + SNES_PORT_DDR |= 1<<SNES_LATCH_PIN; // Latch, output + SNES_PORT_DDR |= 1<<SNES_CLOCK_PIN; // Clock, output + SNES_PORT_DDR &= ~(1<<SNES_DATA_PIN); // Data, input + SNES_PORT_PORT |= 1<<SNES_DATA_PIN; // Data, pull-up +} + +uint16_t get_snes_gamepad() +{ + uint16_t gamepad_data = 0; + SNES_PORT_PORT &= ~(1<<SNES_LATCH_PIN); // Latch + int b; + for (b = 0; b < 16; b++) + { + SNES_PORT_PORT &= ~(1<<SNES_CLOCK_PIN); // Clock + _delay_us(10); + gamepad_data |= ((uint16_t)((SNES_PORT_PIN>>SNES_DATA_PIN)&1)<<b); + SNES_PORT_PORT |= 1<<SNES_CLOCK_PIN; // Clock + _delay_us(10); + } + SNES_PORT_PORT |= 1<<SNES_LATCH_PIN; // Latch + return gamepad_data; +} +#endif + +#ifdef N64_ENABLED +void init_n64_gamepad() +{ + TCCR0 |= _BV(CS00); // Timer + N64_PORT_DDR &= ~(1<<N64_DATA_PIN); // Input + N64_PORT_PORT &= ~(1<<N64_DATA_PIN); // No pull-up (using external resistor) +} + +int get_n64_gamepad(uint8_t* data) +{ + int b, bit; + N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_1; N64SEND_STOP; + for (b = 0; b < 4; b++) + { + data[b] = 0; + for (bit = 0; bit < 8; bit++) + { + TCNT0 = 0; + while (!N64SIGNAL) if (TCNT0 >= 0xF0) return 0; + TCNT0 = 0; + while(N64SIGNAL) if (TCNT0 >= 0xF0) return 0; + data[b] = data[b]<<1; + if (TCNT0 < 0x24 * F_CPU / 20000000UL) data[b] |= 1; + } + } + return 1; +} +#endif + +#ifdef SMD_ENABLED +void init_smd_gamepad() +{ + SMD_SELECT_PORT_DDR |= 1<<SMD_SELECT_PIN; // Select, output + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA0_PIN); // Data 0, input + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA1_PIN); // Data 1, input + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA2_PIN); // Data 2, input + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA3_PIN); // Data 3, input + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA4_PIN); // Data 4, input + SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA5_PIN); // Data 5, input + SMD_DATA_PORT_PORT |= 1<<SMD_DATA0_PIN; // Data 0, pull-up + SMD_DATA_PORT_PORT |= 1<<SMD_DATA1_PIN; // Data 1, pull-up + SMD_DATA_PORT_PORT |= 1<<SMD_DATA2_PIN; // Data 2, pull-up + SMD_DATA_PORT_PORT |= 1<<SMD_DATA3_PIN; // Data 3, pull-up + SMD_DATA_PORT_PORT |= 1<<SMD_DATA4_PIN; // Data 4, pull-up + SMD_DATA_PORT_PORT |= 1<<SMD_DATA5_PIN; // Data 5, pull-up +#ifdef SMD_SECOND_ENABLED + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA0_PIN2); // Data 0, input + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA1_PIN2); // Data 1, input + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA2_PIN2); // Data 2, input + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA3_PIN2); // Data 3, input + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA4_PIN2); // Data 4, input + SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA5_PIN2); // Data 5, input + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA0_PIN2; // Data 0, pull-up + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA1_PIN2; // Data 1, pull-up + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA2_PIN2; // Data 2, pull-up + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA3_PIN2; // Data 3, pull-up + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA4_PIN2; // Data 4, pull-up + SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA5_PIN2; // Data 5, pull-up +#endif +} + +uint32_t get_smd_gamepad() +{ + uint8_t gamepad_data_low = 0xFF; + uint8_t gamepad_data_high = 0xFF; + uint8_t gamepad_data_low2 = 0xFF; + uint8_t gamepad_data_high2 = 0xFF; + SMD_SELECT_PORT_PORT &= ~(1<<SMD_SELECT_PIN); // Select - low + _delay_us(50); + gamepad_data_low = ((SMD_DATA_PORT_PIN>>SMD_DATA0_PIN)&1) + | (((SMD_DATA_PORT_PIN>>SMD_DATA1_PIN)&1)<<1) + | (((SMD_DATA_PORT_PIN>>SMD_DATA2_PIN)&1)<<2) + | (((SMD_DATA_PORT_PIN>>SMD_DATA3_PIN)&1)<<3) + | (((SMD_DATA_PORT_PIN>>SMD_DATA4_PIN)&1)<<4) + | (((SMD_DATA_PORT_PIN>>SMD_DATA5_PIN)&1)<<5); +#ifdef SMD_SECOND_ENABLED + gamepad_data_low2 = ((SMD_DATA_PORT_PIN2>>SMD_DATA0_PIN2)&1) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA1_PIN2)&1)<<1) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA2_PIN2)&1)<<2) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA3_PIN2)&1)<<3) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA4_PIN2)&1)<<4) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA5_PIN2)&1)<<5); +#endif + SMD_SELECT_PORT_PORT |= 1<<SMD_SELECT_PIN; // Select - high + _delay_us(50); + gamepad_data_high = ((SMD_DATA_PORT_PIN>>SMD_DATA0_PIN)&1) + | (((SMD_DATA_PORT_PIN>>SMD_DATA1_PIN)&1)<<1) + | (((SMD_DATA_PORT_PIN>>SMD_DATA2_PIN)&1)<<2) + | (((SMD_DATA_PORT_PIN>>SMD_DATA3_PIN)&1)<<3) + | (((SMD_DATA_PORT_PIN>>SMD_DATA4_PIN)&1)<<4) + | (((SMD_DATA_PORT_PIN>>SMD_DATA5_PIN)&1)<<5); +#ifdef SMD_SECOND_ENABLED + gamepad_data_high2 = ((SMD_DATA_PORT_PIN2>>SMD_DATA0_PIN2)&1) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA1_PIN2)&1)<<1) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA2_PIN2)&1)<<2) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA3_PIN2)&1)<<3) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA4_PIN2)&1)<<4) + | (((SMD_DATA_PORT_PIN2>>SMD_DATA5_PIN2)&1)<<5); +#endif + return ((uint32_t)gamepad_data_high2<<24) | ((uint32_t)gamepad_data_low2<<16) | ((uint32_t)gamepad_data_high<<8) | gamepad_data_low; +} +#endif + +uint32_t get_smd_gamepad_decoded(void) +{ + uint32_t result = 0; + uint8_t b, c, d; + for (c = 0; c < 4; c++) + { + uint32_t smd_gamepad_data = get_smd_gamepad(); + for (d = 0; d < 2; d++) + { + if ((smd_gamepad_data & 0b00001111) || (c < 2)) // 3-button mode + { + for (b = 0; b <= 13; b++) + { + if (!((smd_gamepad_data>>b)&1)) + { + switch (b) + { + case 0: // Up + set_bit(result, 8 + d*16); + break; + case 1: // Down + set_bit(result, 9 + d*16); + break; + case 4: // A + set_bit(result, 0 + d*16); + break; + case 5: // Start + set_bit(result, 6 + d*16); + break; + case 10: // Left + set_bit(result, 10 + d*16); + break; + case 11: // Right + set_bit(result, 11 + d*16); + break; + case 12: // B + set_bit(result, 1 + d*16); + break; + case 13: // C + set_bit(result, 2 + d*16); + break; + } + } + } + } else { // 6-button mode + for (b = 4; b <= 11; b++) + { + if (!((smd_gamepad_data>>b)&1)) + { + switch (b) + { + case 4: // A + set_bit(result, 0 + d*16); + break; + case 5: // Start + set_bit(result, 6 + d*16); + break; + case 8: // Z + set_bit(result, 5 + d*16); + break; + case 9: // Y + set_bit(result, 4 + d*16); + break; + case 10: // X + set_bit(result, 3 + d*16); + break; + case 11: // Mode + set_bit(result, 7 + d*16); + break; + } + } + } + } + smd_gamepad_data >>= 16; + } + } + return result; +} + +#ifdef DUALSHOCK_ENABLED +void init_dualshock_gamepad() +{ + DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_COMMAND_PIN); // Command pin - output + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_COMMAND_PIN); // Command pin - login high + DUALSHOCK_PORT_DDR &= ~(1<<DUALSHOCK_DATA_PIN); // Data pin - input + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_DATA_PIN); // Data pin - pull-up + DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_ATTENTION_PIN); // Attention - output + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // Attention - logic high + DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - output + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - logic high + /* + DUALSHOCK_PORT_DDR &= ~(1<<DUALSHOCK_ACK_PIN); // Ack pin - input + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ACK_PIN); // Ack pin - pull-up + */ +} + +int dualshock_command(uint8_t* command, uint8_t* data, int length) +{ + DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_ATTENTION_PIN); // Attention! + _delay_us(20); + int b, bit; + for (b = 0; b < length; b++) // Each byte... + { + data[b] = 0; + for (bit = 0; bit < 8; bit++) + { + if ((command[b] >> bit) & 1) // 1? + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_COMMAND_PIN); // 1! + else DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_COMMAND_PIN); // 0! + DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_CLOCK_PIN); // Clock - logic low + _delay_us(20); + if ((DUALSHOCK_PORT_PIN >> DUALSHOCK_DATA_PIN) & 1) // Reading data... 1? + data[b] |= (1<<bit); // 1! + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - logic high + _delay_us(20); + } + if (b == 1 && data[1] == 0xFF) // Alternative device detection + { + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // No attention... + return 0; + } + /* + if (b<length-1) // Waiting for ACK + { + int t; + for (t = 0; t < 50; t++) + { + if (!((DUALSHOCK_PORT_PIN >> DUALSHOCK_ACK_PIN)&1)) // ACK reveived + { + ok = 1; + break; + } + _delay_us(1); + } + if ((b < 2) && !ok) return 0; // No ACK in first two bytes? Aboooort! Saving time + } + */ + } + DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // No attention... + _delay_us(20); + return 1; +} + +int get_dualshock_gamepad(uint8_t* data, int size, uint8_t motor_small, uint8_t motor_large) // pointer to uint8_t[21], number of bytes to request, vibration... +{ + static char dualshock_configered = 0; + + uint8_t command_query[21] = {0x01, 0x42, 0, motor_small, motor_large, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + if (!dualshock_command(command_query, data, size)) + { + dualshock_configered = 0; + return 0; + } + if (!dualshock_configered) // Need to reconfigure dualshock + { + uint8_t command_config_mode[5] = {0x01, 0x43, 0x00, 0x01, 0x00}; + if (!dualshock_command(command_config_mode, data, sizeof(command_config_mode))) return 0; + uint8_t command_analog_mode[9] = {0x01, 0x44, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00}; + if (!dualshock_command(command_analog_mode, data, sizeof(command_analog_mode))) return 0; + uint8_t command_config_motors[9] = {0x01, 0x4D, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF}; + if (!dualshock_command(command_config_motors, data, sizeof(command_config_motors))) return 0; + uint8_t command_config_pressure[9] = {0x01, 0x4F, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00}; + if (!dualshock_command(command_config_pressure, data, sizeof(command_config_pressure))) return 0; + uint8_t command_config_mode_exit[8] = {0x01, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}; + if (!dualshock_command(command_config_mode_exit, data, sizeof(command_config_mode_exit))) return 0; + dualshock_configered = 1; + if (!dualshock_command(command_query, data, size)) return 0; + } + return 1; +} +#endif diff --git a/gamepad.h b/gamepad.h new file mode 100644 index 0000000..2758db3 --- /dev/null +++ b/gamepad.h @@ -0,0 +1,59 @@ +#ifndef _GAMEPAD_H_ +#define _GAMEPAD_H_ + +#include <inttypes.h> +#include "defines.h" + +#define GLUE(a,b) a##b +#define DDR(p) GLUE(DDR,p) +#define PORT(p) GLUE(PORT,p) +#define PIN(p) GLUE(PIN,p) + +#define N64_PORT_PORT PORT(N64_PORT) +#define N64_PORT_DDR DDR(N64_PORT) +#define N64_PORT_PIN PIN(N64_PORT) + +#define NES_PORT_PORT PORT(NES_PORT) +#define NES_PORT_DDR DDR(NES_PORT) +#define NES_PORT_PIN PIN(NES_PORT) + +#define SNES_PORT_PORT PORT(NES_PORT) +#define SNES_PORT_DDR DDR(NES_PORT) +#define SNES_PORT_PIN PIN(NES_PORT) + +#define SMD_SELECT_PORT_PORT PORT(SMD_SELECT_PORT) +#define SMD_SELECT_PORT_DDR DDR(SMD_SELECT_PORT) +#define SMD_DATA_PORT_PORT PORT(SMD_DATA_PORT) +#define SMD_DATA_PORT_DDR DDR(SMD_DATA_PORT) +#define SMD_DATA_PORT_PIN PIN(SMD_DATA_PORT) +#define SMD_DATA_PORT_PORT2 PORT(SMD_DATA_PORT2) +#define SMD_DATA_PORT_DDR2 DDR(SMD_DATA_PORT2) +#define SMD_DATA_PORT_PIN2 PIN(SMD_DATA_PORT2) + +#define DUALSHOCK_PORT_PORT PORT(DUALSHOCK_PORT) +#define DUALSHOCK_PORT_DDR DDR(DUALSHOCK_PORT) +#define DUALSHOCK_PORT_PIN PIN(DUALSHOCK_PORT) + +#define WAIT(t) {TCNT0=0; while(TCNT0 < (F_CPU / 1000000UL) * t);} + +#define N64SEND(t) {N64_PORT_DDR |= (1<<N64_DATA_PIN); WAIT(t); N64_PORT_DDR &= ~(1<<N64_DATA_PIN);} +#define N64SEND_1 {N64SEND(1); WAIT(3);} +#define N64SEND_0 {N64SEND(3); WAIT(1);} +#define N64SEND_STOP {N64SEND(1); WAIT(2);} +#define N64SIGNAL (!((N64_PORT_PIN>>N64_DATA_PIN)&1)) + +void init_nes_gamepad(void); +uint16_t get_nes_gamepad(void); +uint16_t get_nes_gamepad_decoded(void); +void init_snes_gamepad(void); +uint16_t get_snes_gamepad(void); +void init_n64_gamepad(void); +int get_n64_gamepad(uint8_t* data); +void init_smd_gamepad(void); +uint32_t get_smd_gamepad(void); +uint32_t get_smd_gamepad_decoded(void); +void init_dualshock_gamepad(void); +int dualshock_command(uint8_t* command, uint8_t* data, int length); +int get_dualshock_gamepad(uint8_t* data, int size, uint8_t motor_small, uint8_t motor_large); + +#endif diff --git a/images/board_3d.png b/images/board_3d.png Binary files differnew file mode 100644 index 0000000..3044f1f --- /dev/null +++ b/images/board_3d.png diff --git a/images/photo.jpg b/images/photo.jpg Binary files differnew file mode 100644 index 0000000..8fc5447 --- /dev/null +++ b/images/photo.jpg diff --git a/makefile b/makefile new file mode 100644 index 0000000..1fae595 --- /dev/null +++ b/makefile @@ -0,0 +1,30 @@ +MCU = at90usb162 +ARCH = AVR8 +BOARD = NONE +F_CPU = 16000000 +F_USB = $(F_CPU) +OPTIMIZATION = s +TARGET = nessmd2usb +SRC = $(TARGET).c Descriptors.c gamepad.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +LUFA_PATH = ../LUFA/LUFA +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +LD_FLAGS = + +# Default target +all: + +build: $(TARGET).hex + +program: $(TARGET).hex + ./teensy_loader_cli.exe -mmcu=atmega32u4 -w -v $(TARGET).hex + +# Include LUFA build script makefiles +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +include $(LUFA_PATH)/Build/lufa_doxygen.mk +include $(LUFA_PATH)/Build/lufa_dfu.mk +include $(LUFA_PATH)/Build/lufa_hid.mk +include $(LUFA_PATH)/Build/lufa_avrdude.mk +include $(LUFA_PATH)/Build/lufa_atprogram.mk diff --git a/nessmd2usb.c b/nessmd2usb.c new file mode 100644 index 0000000..f70c790 --- /dev/null +++ b/nessmd2usb.c @@ -0,0 +1,212 @@ +#include <avr/eeprom.h> +#include "nessmd2usb.h" +#include "defines.h" +#include "bits.h" +#include "gamepad.h" + +/** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ +static uint8_t PrevJoystickHIDReportBuffer[sizeof(USB_JoystickReport_Data_t)]; + +/** LUFA HID Class driver interface configuration and state information. This structure is + * passed to all HID Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_HID_Device_t Joystick_HID_Interface = + { + .Config = + { + .InterfaceNumber = INTERFACE_ID_Joystick, + .ReportINEndpoint = + { + .Address = JOYSTICK_EPADDR, + .Size = JOYSTICK_EPSIZE, + .Banks = 1, + }, + .PrevReportINBuffer = PrevJoystickHIDReportBuffer, + .PrevReportINBufferSize = sizeof(PrevJoystickHIDReportBuffer), + }, + }; + + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ + +volatile uint8_t current_report = 0; +volatile uint8_t buttons[4]; +volatile int x[4]; +volatile int y[4]; + +int main(void) +{ + LEDS_INIT; + RED_OFF; + GREEN_OFF; + + SetupHardware(); + + GlobalInterruptEnable(); + + int c; + + for (;;) + { + uint32_t smd_gamepad_data = get_smd_gamepad_decoded(); + uint16_t nes_gamepad_data = get_nes_gamepad_decoded(); + + buttons[0] = smd_gamepad_data & 0xFF; + buttons[1] = (smd_gamepad_data>>16) & 0xFF; + buttons[2] = nes_gamepad_data&0x0F; + buttons[3] = (nes_gamepad_data>>8)&0x0F; + + for (c = 0; c < 4; c++) + { + uint8_t dpad = 0; + switch (c) + { + case 0: + dpad = (smd_gamepad_data>>8) & 0xF; + break; + case 1: + dpad = (smd_gamepad_data>>24) & 0xF; + break; + case 2: + dpad = (nes_gamepad_data>>4) & 0xF; + break; + case 3: + dpad = (nes_gamepad_data>>12) & 0xF; + break; + } + if (dpad&1) y[c] = -100; + else if (dpad&2) y[c] = 100; + else y[c] = 0; + if (dpad&4) x[c] = -100; + else if (dpad&8) x[c] = 100; + else x[c] = 0; + } + + if (smd_gamepad_data || nes_gamepad_data) + { + GREEN_ON; + } else { + GREEN_OFF; + } + + for (c = 0; c < 1000; c++) + { + _delay_us(1); + HID_Device_USBTask(&Joystick_HID_Interface); + USB_USBTask(); + } + } +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ +#if (ARCH == ARCH_AVR8) + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); +#elif (ARCH == ARCH_XMEGA) + /* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ + XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); + XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); + + /* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ + XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); + XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); + + PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; +#endif + + /* Hardware Initialization */ + USB_Init(); + init_smd_gamepad(); + init_nes_gamepad(); +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Device_Connect(void) +{ +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ + RED_OFF; +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + bool ConfigSuccess = true; + + ConfigSuccess &= HID_Device_ConfigureEndpoints(&Joystick_HID_Interface); + + USB_Device_EnableSOFEvents(); + + RED_ON; +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + HID_Device_ProcessControlRequest(&Joystick_HID_Interface); +} + +/** Event handler for the USB device Start Of Frame event. */ +void EVENT_USB_Device_StartOfFrame(void) +{ + HID_Device_MillisecondElapsed(&Joystick_HID_Interface); +} + +/** HID class driver callback function for the creation of HID reports to the host. + * + * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced + * \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID + * \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature + * \param[out] ReportData Pointer to a buffer where the created report should be stored + * \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent) + * + * \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent + */ +bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize) +{ + USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData; + + current_report = (current_report+1) % 4; + + JoystickReport->X = x[current_report]; + JoystickReport->Y = y[current_report]; + JoystickReport->Button |= buttons[current_report]; + + *ReportID = current_report+1; + *ReportSize = sizeof(USB_JoystickReport_Data_t); + return true; +} + +/** HID class driver callback function for the processing of HID reports from the host. + * + * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced + * \param[in] ReportID Report ID of the received report from the host + * \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature + * \param[in] ReportData Pointer to a buffer where the received report has been stored + * \param[in] ReportSize Size in bytes of the received HID report + */ +void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize) +{ + // Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports +} + diff --git a/nessmd2usb.h b/nessmd2usb.h new file mode 100644 index 0000000..4c05f95 --- /dev/null +++ b/nessmd2usb.h @@ -0,0 +1,113 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Joystick.c. + */ + +#ifndef _JOYSTICK_H_ +#define _JOYSTICK_H_ + + #define GLUE(a,b) a##b + #define DDR(p) GLUE(DDR,p) + #define PORT(p) GLUE(PORT,p) + + #define LED_RED_DDR DDR(LED_PORT) + #define LED_RED_PORT PORT(LED_PORT) + + #define LEDS_INIT LED_RED_DDR |= (1<<LED_RED_PIN)|(1<<LED_GREEN_PIN) + #define RED_ON LED_RED_PORT |= (1<<LED_RED_PIN) + #define RED_OFF LED_RED_PORT &= ~(1<<LED_RED_PIN) + #define GREEN_ON LED_RED_PORT |= (1<<LED_GREEN_PIN) + #define GREEN_OFF LED_RED_PORT &= ~(1<<LED_GREEN_PIN) + + /* Includes: */ + #include <avr/io.h> + #include <avr/wdt.h> + #include <avr/power.h> + #include <avr/interrupt.h> + #include <string.h> + + #include "Descriptors.h" + + #include <LUFA/Drivers/Board/Joystick.h> + #include <LUFA/Drivers/Board/LEDs.h> + #include <LUFA/Drivers/Board/Buttons.h> + #include <LUFA/Drivers/USB/USB.h> + #include <LUFA/Platform/Platform.h> + + /* Type Defines: */ + /** Type define for the joystick HID report structure, for creating and sending HID reports to the host PC. + * This mirrors the layout described to the host in the HID report descriptor, in Descriptors.c. + */ + typedef struct + { + int8_t X; /**< Current absolute joystick X position, as a signed 8-bit integer */ + int8_t Y; /**< Current absolute joystick Y position, as a signed 8-bit integer */ + //int8_t Z; /**< Current absolute joystick Z position, as a signed 8-bit integer */ + uint8_t Button; /**< Bit mask of the currently pressed joystick buttons */ + } USB_JoystickReport_Data_t; + + /* Macros: */ + /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ + #define LEDMASK_USB_NOTREADY LEDS_LED1 + + /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ + #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3) + + /** LED mask for the library LED driver, to indicate that the USB interface is ready. */ + #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4) + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) + + /* Function Prototypes: */ + void SetupHardware(void); + + void EVENT_USB_Device_Connect(void); + void EVENT_USB_Device_Disconnect(void); + void EVENT_USB_Device_ConfigurationChanged(void); + void EVENT_USB_Device_ControlRequest(void); + void EVENT_USB_Device_StartOfFrame(void); + + bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize); + void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize); + +#endif + diff --git a/nessmd2usb.hex b/nessmd2usb.hex new file mode 100644 index 0000000..a43d520 --- /dev/null +++ b/nessmd2usb.hex @@ -0,0 +1,418 @@ +:10000000EAC0000004C1000002C1000000C10000FD +:10001000FEC00000FCC00000FAC00000F8C00000F4 +:10002000F6C00000F4C00000F2C000000C947F088D +:10003000EEC00000ECC00000EAC00000E8C0000014 +:10004000E6C00000E4C00000E2C00000E0C0000024 +:10005000DEC00000DCC00000DAC00000D8C0000034 +:10006000D6C00000D4C00000D2C00000D0C0000044 +:10007000CEC0000005010904A1010901A10085010C +:1000800009300931169CFF26640036FFFF46010047 +:10009000950275088102C005091901290815002576 +:1000A00001750195088102750095018101C0050166 +:1000B0000904A1010901A100850209300931169C3A +:1000C000FF26640036FFFF46010095027508810295 +:1000D000C005091901290815002501750195088138 +:1000E00002750095018101C005010904A101090102 +:1000F000A100850309300931169CFF26640036FFF4 +:10010000FF460100950275088102C0050919012901 +:10011000041500250175019504810275049501817E +:1001200001C005010904A1010901A10085040930EC +:100130000931169CFF26640036FFFF460100950238 +:1001400075088102C00509190129041500250175EA +:100150000195048102750495018101C0120110010D +:1001600000000008EB034420010001020001090225 +:100170002200010100C03209040000010300000058 +:1001800009211101000122E800070581030800058B +:1001900004030904100343006C007500730074002D +:1001A0006500720000002E035300650067006100C7 +:1001B0002F00440065006E00640079002000630099 +:1001C0006F006E00740072006F006C006C006500C0 +:1001D00072007300000011241FBECFEFD2E0DEBF1B +:1001E000CDBF11E0A0E0B1E0E8EFF9E102C0059079 +:1001F0000D92A031B107D9F711E0A0E1B1E001C043 +:100200001D92A533B107E1F776D00C94FA0CF8CE25 +:1002100008952E98089580910E0190910F010097F6 +:1002200029F0019790930F0180930E0108950F9389 +:100230001F93D9018091100190E001968370907016 +:1002400080931001E0911001F0E0EE0FFF1FEC5ED3 +:10025000FE4F808191818C93E0911001F0E0EE0FD0 +:10026000FF1FE05EFE4F8081918111968C93119764 +:1002700080911001ECE1F1E0E80FF11D9081129600 +:100280008C911297892B12968C93809110018F5F1D +:10029000FB01808383E090E0F8019183808381E01B +:1002A0001F910F910895089580E091E00C94930BB5 +:1002B00080E091E00E94720BE2EEF0E080818460C9 +:1002C00080832E9A089584B7877F84BF88E10FB614 +:1002D000F89480936000109260000FBE80E090E080 +:1002E00020E80FB6F89420936100809361000FBE60 +:1002F000F7D637D1F4C08F929F92AF92BF92CF9230 +:10030000DF92EF92FF920F931F93CF93DF9384B10D +:10031000806C84B92E982F98D6DF7894B4E68B2E13 +:10032000912CACE9AA2EAFEFBA2EF5E0CF2EA2D2D7 +:100330007B018C0110D1AC01E0921C01C801AA27FD +:10034000BB2780931D01842F8F7080931E01852F02 +:100350008F7080931F01BB27A12F902F8F2D6FE0EF +:10036000D62ED822812F9927AA27BB27782F7F70D6 +:10037000CA0124E0969587952A95E1F78F70652F3D +:1003800062956F7020E030E02130310589F0223035 +:10039000310524F42115310549F006C0223031051C +:1003A00049F02330310541F090E007C09D2D05C094 +:1003B000972F03C0982F01C0962F90FF08C0F90116 +:1003C000EE0FFF1FE05EFE4FB182A0820EC0F9016A +:1003D000EE0FFF1F91FF05C0E05EFE4F918280820D +:1003E00004C0E05EFE4F1182108292FF08C0F90146 +:1003F000EE0FFF1FEC5EFE4FB182A0820EC0F9012E +:10040000EE0FFF1F93FF05C0EC5EFE4F91828082CE +:1004100004C0EC5EFE4F118210822F5F3F4F2430EC +:10042000310509F0B1CFE114F1040105110511F412 +:10043000452B11F02F9A01C02F98C0E0D0E08C2DF1 +:100440008A95F1F780E091E00E94A30A0E948E0A4B +:10045000219683E0C83ED80709F469CFF0CFDA01CE +:100460009330B1F0943028F4913041F0923079F526 +:100470000AC0913211F1923251F524C0ECE5F1E05D +:1004800022E130E028C0EEE6F1E022E230E023C0D5 +:10049000813049F0813018F08230C9F40AC0E0E9B7 +:1004A000F1E0849103C0E4E9F1E08491282F30E089 +:1004B00012C0E6EAF1E08491F9CFE0E8F1E029E04A +:1004C00030E009C0E4E7F0E028EE30E004C0E0E00E +:1004D000F0E020E030E0ED93FC93C90108953C9AF0 +:1004E0003D9A3E98469A3F98479A0895449860E00E +:1004F00070E040E050E0E5E345988E2F8A95F1F7F3 +:1005000026B186B1229526952695237030E021707C +:100510003070042E02C0220F331F0A94E2F7881FA6 +:100520008827881F90E0042E02C0880F991F0A9424 +:10053000E2F7982F8827282B392B622B732B459AAB +:100540008E2F8A95F1F74F5F5F4F48305105A1F626 +:10055000449ACB010895CADF9C0120953095C901CA +:100560000895569A5098519852985398549855987F +:10057000589A599A5A9A5B9A5C9A5D9A209821984F +:100580002298239824982598289A299A2A9A2B9A6F +:100590002C9A2D9A08952F923F924F925F926F92CC +:1005A0007F928F929F92AF92BF92CF92DF92EF9203 +:1005B000FF920F931F93DF93CF93CDB7DEB72797AB +:1005C0000FB6F894DEBF0FBECDBF5E9888EC90E00A +:1005D000FC013197F1F7F9B009B149B029B029B15F +:1005E0002F8369B16E8313B1A3B1C3B0A3B083B03D +:1005F00063B05E9A0197F1F789B18D83E9B0E9B1F3 +:10060000EC83F9B1FB8329B12A8369B1698353B1C2 +:1006100083B123B143B163B1E3B1869590E08170BA +:100620009070880F991F2695269530E021703070C4 +:10063000220F331F220F331F822B5170852B4695BB +:100640004695469550E041705070B3E0440F551FF9 +:10065000BA95E1F7842B62956F7070E061707070ED +:10066000F4E0660F771FFA95E1F7862BE295E695A1 +:10067000E770F0E0E170F07075E0EE0FFF1F7A9523 +:10068000E1F78E2B282F30E040E050E0522F442736 +:1006900033272227A695B0E0A170B070AA0FBB1F28 +:1006A000C694C694DD2481E0C822DD24CC0CDD1C78 +:1006B000CC0CDD1CAC291170A12BA694A694A69499 +:1006C000BB24E1E0AE22BB2413E0AA0CBB1C1A95AC +:1006D000E1F7AA298294BFE08B229924F1E08F22CE +:1006E0009924F4E0880C991CFA95E1F7A829629402 +:1006F0006694E7E06E22772461E06622772475E055 +:10070000660C771C7A95E1F7A6298A2F90E0A0E085 +:10071000B0E0DC0199278827282B392B4A2B5B2B4B +:10072000069510E001701070000F111F469446945A +:10073000552481E048225524440C551C440C551C7A +:100740000429E1E0FE220F292694269426943324DE +:10075000F1E02F22332413E0220C331C1A95E1F729 +:1007600002296F8162956F70862F90E08170907082 +:10077000B4E0880F991FBA95E1F7082B8E81829516 +:10078000869587708E8390E081709070A5E0880FC9 +:10079000991FAA95E1F7082B802F90E0A0E0B0E028 +:1007A000282B392B4A2B5B2BE694FF24E1E0EE2229 +:1007B000FF24EE0CFF1CFC81F695F6958F2F90E040 +:1007C00081709070880F991F880F991FE82A6D819A +:1007D0006170E62A8B818695869586958B8390E05D +:1007E0008170907073E0880F991F7A95E1F7E82A7D +:1007F000EA81E295EF708E2F90E08170907064E056 +:10080000880F991F6A95E1F7E82AF981F295F69524 +:10081000F7708F2F90E08170907005E0880F991F1E +:100820000A95E1F7E82A8E2D90E0A0E0B0E0BA2F1B +:10083000A92F982F8827282B392B4A2B5B2BB901FE +:10084000CA0127960FB6F894DEBF0FBECDBFCF9179 +:10085000DF911F910F91FF90EF90DF90CF90BF90AD +:10086000AF909F908F907F906F905F904F903F9050 +:100870002F9008952F923F924F925F926F927F92A6 +:100880008F929F92AF92BF92CF92DF92EF92FF92A0 +:100890000F931F93DF93CF93CDB7DEB7E1970FB6DA +:1008A000F894DEBF0FBECDBFEE24FF24870119866A +:1008B00051E0A52EB12CC12CD12C6DDE3B014C0199 +:1008C00020E030E066E070E0D401C3018F709070EA +:1008D000A070B0700097A105B10509F47FC0285F32 +:1008E0003F4FD601C501022E04C0880F991FAA1FD1 +:1008F000BB1F0A94D2F78EA79FA7A8ABB9AB2F5FF7 +:100900003F4FD601C501022E04C0880F991FAA1FB0 +:10091000BB1F0A94D2F78AA79BA7ACA7BDA72950F3 +:100920003040D601C501022E04C0880F991FAA1FAE +:10093000BB1F0A94D2F78D839E83AF83B887D601FD +:10094000C501062E04C0880F991FAA1FBB1F0A9459 +:10095000D2F789839A83AB83BC83265F3F4FD6014E +:10096000C501022E04C0880F991FAA1FBB1F0A943D +:10097000D2F78E8F9F8FA8A3B9A32F5F3F4FD601C9 +:10098000C501022E04C0880F991FAA1FBB1F0A941D +:10099000D2F78A8F9B8FAC8FBD8F2A503040D60103 +:1009A000C501022E04C0880F991FAA1FBB1F0A94FD +:1009B000D2F78E8B9F8BA88FB98F2F5F3F4F15017A +:1009C0002601022E04C0220C331C441C551C0A9420 +:1009D000D2F722503040E0E0F0E005C09985923037 +:1009E00008F058C07CCFD401C3010E2E04C0B695C8 +:1009F000A795979587950A94D2F781709070892B67 +:100A000009F042C0E53041F1E63038F4E130B1F0B0 +:100A1000E13078F0E430C1F51AC0EB3039F1EC3058 +:100A200018F4EA3089F51DC0EC3029F1ED3061F59C +:100A300027C08EA59FA5A8A9B9A904C08AA59BA572 +:100A4000ACA5BDA5E82AF92A0A2B1B2B1DC08D8158 +:100A50009E81AF81B885F6CF89819A81AB81BC81B7 +:100A6000F1CF8E8D9F8DA8A1B9A1ECCF8A8D9B8DE2 +:100A7000AC8DBD8DE7CF8E899F89A88DB98DE2CFD2 +:100A8000E228F328042915293196EE30F10509F002 +:100A9000AACFA0C0D601C501022E04C0880F991F9D +:100AA000AA1FBB1F0A94D2F78EA39FA3A8A7B9A71A +:100AB000D601C501062E04C0880F991FAA1FBB1FAF +:100AC0000A94D2F78AA39BA3ACA3BDA32B5F3F4F8D +:100AD000D601C501022E04C0880F991FAA1FBB1F93 +:100AE0000A94D2F78A8B9B8BAC8BBD8B2150304004 +:100AF000D601C501022E04C0880F991FAA1FBB1F73 +:100B00000A94D2F78E879F87A88BB98B21503040EB +:100B1000D601C501022E04C0880F991FAA1FBB1F52 +:100B20000A94D2F78A879B87AC87BD872C5F3F4F9B +:100B300015012601022E04C0220C331C441C551C36 +:100B40000A94D2F727503040E4E0F0E0D401C3012A +:100B50000E2E04C0B695A795979587950A94D2F75F +:100B600081709070892B89F5E830E1F0E93028F444 +:100B7000E43051F0E53049F50CC0EA30E9F0EA30F4 +:100B8000B0F0EB3011F51DC08EA19FA1A8A5B9A5AD +:100B900004C08AA19BA1ACA1BDA1E82AF92A0A2B15 +:100BA0001B2B13C08A899B89AC89BD89F6CF8E85A2 +:100BB0009F85A889B989F1CF8A859B85AC85BD853C +:100BC000ECCFE228F328042915293196EC30F10501 +:100BD00009F0BCCF205F3F4F605F7F4F203231056F +:100BE00021F03401882499246FCE99859F5F9987DD +:100BF000943009F062CEB701C801E1960FB6F894BF +:100C0000DEBF0FBECDBFCF91DF911F910F91FF903F +:100C1000EF90DF90CF90BF90AF909F908F907F909C +:100C20006F905F904F903F902F9008959C0140915E +:100C30003301509134014617570718F4F90190E039 +:100C40003DC06115710511F0AB01F8CF8091E8004E +:100C50008E778093E80040E050E0F0CF80912C0147 +:100C6000882309F441C0853009F440C08091E80030 +:100C700083FD3EC08091E80082FD30C08091E80095 +:100C800080FF1CC08091F200282F30E007C08191C6 +:100C90008093F100415050402F5F3F4F4115510567 +:100CA00019F02830310598F390E02830310509F427 +:100CB00091E08091E8008E778093E800411551051E +:100CC00069F6992359F60AC080912C01882361F0B6 +:100CD000853061F08091E80083FD0AC08091E800D2 +:100CE00082FFF2CF80E0089582E0089583E00895C6 +:100CF00081E008959C016115710529F48091E80057 +:100D00008B778093E800F90120C080912C01882323 +:100D100061F1853061F18091E80083FF02C081E0DC +:100D200008958091E80082FFF0CF06C08091F10025 +:100D300081936150704021F08091F2008823B1F7D7 +:100D40008091E8008B778093E80061157105E9F6E2 +:100D500006C080912C01882341F0853041F08091BC +:100D6000E80080FFF6CF80E0089582E0089583E0F8 +:100D700008959C0140913301509134014617570763 +:100D800018F4F90190E03EC06115710511F0AB0156 +:100D9000F8CF8091E8008E778093E80040E050E043 +:100DA000F0CF80912C01882309F442C0853009F4EA +:100DB00041C08091E80083FD3FC08091E80082FD42 +:100DC00031C08091E80080FF1DC08091F200282F83 +:100DD00030E008C084918093F1003196415050403A +:100DE0002F5F3F4F4115510519F02830310590F321 +:100DF00090E02830310509F491E08091E8008E7789 +:100E00008093E8004115510561F6992351F60AC017 +:100E100080912C01882361F0853061F08091E80099 +:100E200083FD0AC08091E80082FFF2CF80E0089540 +:100E300082E0089583E0089581E00895BF92CF9203 +:100E4000DF92EF92FF920F931F93CF93DF93182FB0 +:100E5000092F7B016A01D9D0B82E8823B1F5812FE3 +:100E6000902F9C01E901C114D10439F0F601808171 +:100E70009181E81AF90AC80FD91F00E010E022C0DA +:100E80008091E80085FD16C08091E8008E77809300 +:100E9000E80044D3C114D10449F0F6018081918166 +:100EA000800F911F9183808385E010C0AED088238E +:100EB00049F00CC089918093F1000894E108F10891 +:100EC0000F5F1F4FE114F104D9F68B2DDF91CF9105 +:100ED0001F910F91FF90EF90DF90CF90BF900895FA +:100EE000382F282F2EC0822F8F708093E900231770 +:100EF00021F4762F942F50E006C07091EC00909171 +:100F0000ED005091F00091FF1BC08091EB008E7FAF +:100F10008093EB008091ED008D7F8093ED008091B8 +:100F2000EB0081608093EB007093EC009093ED00F8 +:100F30005093F0008091EE0087FD02C080E008959C +:100F40002F5F253080F23F703093E90081E00895F3 +:100F50000F931F93CF93DF93062FEC0110E02AC06D +:100F60009881992329F16B81E981FA812C81892F5C +:100F70008F70853018F5223010F452E001C056E031 +:100F800040E028E030E003C04F5F220F331F2E17F0 +:100F90003F07D0F36295660F660F607C991F992713 +:100FA000991F692B4295407F452B9ADF882331F0AA +:100FB0001F5F25961017A0F281E001C080E0DF914D +:100FC000CF911F910F91089580912D0188239CF45A +:100FD00004C080912C018823B9F08091E80082FF41 +:100FE000F8CF8091E8008B778093E8000895809196 +:100FF0002C01882349F08091E80080FFF8CF809190 +:10100000E8008E778093E80008954091E4005091C5 +:10101000E50024E68091EC0080FF24C08091E80088 +:1010200080FD1EC080912C01882311F482E0089578 +:10103000853011F483E008958091EB0085FF02C0B4 +:1010400081E008958091E4009091E5008417950770 +:1010500009F3222311F484E008952150AC01DACF82 +:1010600080E008958091E80082FFDCCFF9CF41D085 +:1010700043D08091D8008F778093D8008091D8009A +:1010800080688093D8008091D8008F7D8093D800AD +:1010900084E089BD86E089BD09B400FEFDCF1092D1 +:1010A0002C011092280110922A011092290180E04F +:1010B00060E042E015DF8091E1008E7F8093E100E7 +:1010C0008091E20081608093E2008091E20088607C +:1010D0008093E2008091E0008E7F8093E00008958D +:1010E000E3E6F0E080818E7F808381E080932B01B6 +:1010F000BECF1092E20008951092E10008951F9271 +:101100000F920FB60F9211242F933F934F935F933B +:101110006F937F938F939F93AF93BF93EF93FF93BF +:101120008091E10082FF0AC08091E20082FF06C048 +:101130008091E1008B7F8093E1006DD88091E10088 +:1011400080FF17C08091E20080FF13C08091E20011 +:101150008E7F8093E2008091E20080618093E200C4 +:101160008091D80080628093D80019BC10922C0125 +:1011700050D88091E10084FF2FC08091E20084FF6D +:101180002BC084E089BD86E089BD09B400FEFDCF97 +:101190008091D8008F7D8093D8008091E1008F7E70 +:1011A0008093E1008091E2008F7E8093E200809145 +:1011B000E20081608093E20080912801882311F091 +:1011C00084E007C08091E30087FD02C081E001C098 +:1011D00083E080932C011CD88091E10083FF22C022 +:1011E0008091E20083FF1EC08091E100877F8093A1 +:1011F000E10082E080932C01109228018091E100AF +:101200008E7F8093E1008091E2008E7F8093E200E8 +:101210008091E20080618093E20080E060E042E043 +:101220005FDE7BD1FF91EF91BF91AF919F918F9145 +:101230007F916F915F914F913F912F910F900FBED2 +:101240000F901F9018951F93DF93CF93CDB7DEB704 +:10125000AC970FB6F894DEBF0FBECDBFEDE2F1E064 +:101260008091F100819321E0E533F207C9F71CD8A2 +:101270008091E80083FF39C180912D0130912E01CA +:10128000353009F487C0363040F43130C9F131309F +:1012900070F0333009F029C133C0383009F4F6C09A +:1012A000393009F405C1363009F01FC196C08038C5 +:1012B00021F0823809F019C108C09091290180916C +:1012C0002A01882399F0926011C0809131018F70BA +:1012D0008093E9008091EB0090E025E0969587955A +:1012E0002A95E1F7982F91701092E9008091E8001B +:1012F000877F8093E8009093F1001092F100D1C0B5 +:10130000882319F0823009F0F0C090E08F7190705E +:10131000009721F0029709F0E8C00CC080912F01DE +:10132000813009F0E2C010922A01333069F58093D0 +:101330002A012AC080912F01882331F520913101A3 +:101340002F7009F4D2C02093E9008091EB0080FF58 +:101350001BC0333021F48091EB00806213C0809178 +:10136000EB0080618093EB0081E090E002C0880F89 +:10137000991F2A95E2F78093EA001092EA00809183 +:10138000EB0088608093EB001092E9008091E80008 +:10139000877F8AC0882309F0A8C010912F011F778A +:1013A0008091E3008078812B8093E3008091E800B6 +:1013B000877F8093E80008DE8091E80080FFFCCF03 +:1013C0008091E30080688093E300112311F482E0B0 +:1013D00001C083E080932C0188C08058823008F0DF +:1013E00084C080912F019091300123E08C3D9207C1 +:1013F00009F033C083E08C838AE28B837FB7F89453 +:10140000DE0115966EE040E050E011E2E62FF0E0DC +:1014100010935700849140FF03C082958F706F5FD7 +:101420008F70282F30E08A3018F0C901C79602C0AB +:10143000C901C0968D939D934F5F5F4F4431510515 +:1014400029F77FBF8091E800877F8093E800CE0175 +:1014500003966AE270E0EADB13C060913101AE01ED +:101460004F5F5F4F0E942F02BC01009709F43DC0FF +:101470008091E800877F8093E80089819A8179DCF8 +:101480008091E8008B778093E8002FC0803869F561 +:101490008091E800877F8093E80080912801809305 +:1014A000F1008091E8008E778093E8008DDD1DC00B +:1014B0008823D9F490912F019230B8F48091E800FC +:1014C000877F8093E800909328017EDD809128013A +:1014D000882331F48091E30087FD02C081E001C0E0 +:1014E00084E080932C010E9458018091E80083FFE2 +:1014F0000AC08091E800877F8093E8008091EB002C +:1015000080628093EB00AC960FB6F894DEBF0FBEFE +:10151000CDBFCF91DF911F91089508951F938091C2 +:101520002C01882371F01091E9008091EC00109259 +:10153000E9008091E80083FF01C085DE1F701093F1 +:10154000E9001F9108954F925F926F927F928F9260 +:101550009F92AF92BF92CF92DF92EF92FF920F9342 +:101560001F93DF93CF9300D00F92CDB7DEB77C01EE +:101570006DB67EB680912C01843009F09AC020911E +:10158000E4003091E500F701828593858217930787 +:1015900009F48FC081818F708093E9008091E80009 +:1015A00085FF87C05DB64EB6408550E08DB79EB7CB +:1015B000841B950B0FB6F8949EBF0FBE8DBF0DB761 +:1015C0001EB70F5F1F4F19821B821A82C02E912EE9 +:1015D000C80160E070E050E006D2C701BE016F5F55 +:1015E0007F4F40E098018E010E5F1F4F0E94170150 +:1015F000882EF70184859585892B19F4AA24BB24AC +:101600000BC020E0F70186859785892B09F021E042 +:1016100081E02827A22EBB24F7010681178101153E +:10162000110511F4DD2412C04A815B818C2D992DA6 +:10163000B801C3D1DD24009711F0DD24D394F70164 +:101640004085C8016C2D792D50E0C4D18A819B81E1 +:10165000892B01F1882021F4DD2011F4AB28D1F091 +:10166000F701848595859787868781818F70809320 +:10167000E9008981882311F08093F1006A817B81E0 +:101680008C2D992D40E050E0D9DB8091E8008E77D9 +:101690008093E8008091E4009091E500F701938742 +:1016A0008287252D342DC9010FB6F8949EBF0FBE39 +:1016B0008DBF0FB6F8947EBE0FBE6DBE0F900F901B +:1016C0000F90CF91DF911F910F91FF90EF90DF90DE +:1016D000CF90BF90AF909F908F907F906F905F90D2 +:1016E0004F900895CF93DF93DC010996FC0187E0CA +:1016F000EF0119928A95E9F781E019968C93199771 +:1017000084EF91E01D969C938E931C9783E0149632 +:101710008C931497CD01019661E01ADC811181E070 +:10172000DF91CF9108956F927F928F929F92AF92A7 +:10173000BF92CF92DF92EF92FF920F931F93DF93AE +:10174000CF9300D00F92CDB7DEB76C016DB67EB6E9 +:101750008091E80083FF1AC1F601808190E020911A +:101760003101309132012817390709F00FC18091FA +:101770002E01833009F4B2C0843030F4813071F02E +:10178000823009F003C1E6C08A3009F4CBC08B3047 +:1017900009F4B5C0893009F0F9C05CC080912D0111 +:1017A000813A09F0F3C09DB68EB61B821A828091F1 +:1017B0002F01109130018983F601408550E08DB7EB +:1017C0009EB7841B950B0FB6F8949EBF0FBE8DBFBE +:1017D000EDB6FEB60894E11CF11CBE2CAF2CC7017F +:1017E00060E070E050E0FFD01150C601BE016F5FB5 +:1017F0007F4F412F97018E010E5F1F4F0E941701EF +:10180000F601268137812115310529F04085C9016E +:10181000B70150E0DFD01092E9008091E800877FA7 +:101820008093E8008981882311F08093F1006A8118 +:101830007B818B2D9A2DFAD98091E8008B7780934C +:10184000E800292D382DC9010FB6F8949EBF0FBEB0 +:101850008DBF9CC080912D01813209F097C09DB64B +:101860008EB60091330110913401A0902F01B090F9 +:1018700030018DB79EB7801B910B0FB6F8949EBFB9 +:101880000FBE8DBFEDB6FEB60894E11CF11C809131 +:10189000E800877F8093E800C701B8012BDA8091C8 +:1018A000E8008E778093E80080E090E0AA2011F0B5 +:1018B00081E090E0BA94E80EF91E081B190BC601EE +:1018C0006A2D4B2D97010E945301892D982D9C0163 +:1018D0000FB6F8943EBF0FBE2DBF58C080912D01AA +:1018E000813A09F053C08091E800877F8093E80037 +:1018F0008091E80080FFFCCFF60181853FC0809198 +:101900002D01813209F042C08091E800877F8093E9 +:10191000E8005ADB90E080912F01811191E0F601FF +:10192000918734C080912D01813281F58091E8004A +:10193000877F8093E80048DB80912F0190913001F0 +:10194000807036E0969587953A95E1F7F601958790 +:1019500084871CC080912D01813AC1F48091E800F8 +:10196000877F8093E8008091E80080FFFCCFF6013C +:101970008485958596958795969587958093F100B2 +:101980008091E8008E778093E8001EDB0FB6F89414 +:101990007EBE0FBE6DBE0F900F900F90CF91DF9166 +:1019A0001F910F91FF90EF90DF90CF90BF90AF907D +:1019B0009F908F907F906F900895FB01DC0104C091 +:1019C0008D910190801921F441505040C8F7881B37 +:1019D000990B0895FB01DC0102C001900D9241506A +:1019E0005040D8F70895DC0101C06D93415050403C +:0819F000E0F70895F894FFCF21 +:1019F8000081080000011101030000000000000040 +:00000001FF |