Skip to content

Instantly share code, notes, and snippets.

@odaki
Last active March 7, 2023 01:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save odaki/982ee76cc60666d2f1460affb31cf297 to your computer and use it in GitHub Desktop.
Save odaki/982ee76cc60666d2f1460affb31cf297 to your computer and use it in GitHub Desktop.
usbasp_patch
diff -cr usbasp.2011-05-28/Changelog.txt usbasp.2023-02-18/Changelog.txt
*** usbasp.2011-05-28/Changelog.txt 2011-05-28 16:57:49.000000000 +0900
--- usbasp.2023-02-18/Changelog.txt 2023-02-18 14:56:46.000000000 +0900
***************
*** 1,3 ****
--- 1,7 ----
+ usbasp.2023-02-18 (v1.4 patch by odaki)
+ - fixed slow clock mode
+ - Fixed a signal conflict problem where a signal other than the PD2 pin is connected to USB- on compatible products such as USB-ASP2, causing that pin to be initialized as an output.
+
usbasp.2011-05-28 (v1.4)
------------------------
- added TPI support for ATTiny4/5/6/10 (by Slawomir Fraś)
Only in usbasp.2023-02-18/bin: .DS_Store
diff -cr usbasp.2011-05-28/firmware/Makefile usbasp.2023-02-18/firmware/Makefile
*** usbasp.2011-05-28/firmware/Makefile 2011-05-28 16:57:49.000000000 +0900
--- usbasp.2023-02-18/firmware/Makefile 2023-02-19 00:32:28.000000000 +0900
***************
*** 11,16 ****
--- 11,24 ----
HFUSE=0xc9
LFUSE=0xef
+ AVRGCCDIR=~/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/
+ AVRDUDEDIR=~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino18/bin/
+
+ CC=$(AVRGCCDIR)avr-gcc
+ OBJCOPY=$(AVRGCCDIR)avr-objcopy
+ OBJDUMP=$(AVRGCCDIR)avr-objdump
+ AVRDUDE=$(AVRDUDEDIR)avrdude
+ AVRDUDE_CONF=$(AVRDUDEDIR)../etc/avrdude.conf
# ISP=bsd PORT=/dev/parport0
# ISP=ponyser PORT=/dev/ttyS1
***************
*** 18,24 ****
# ISP=usbasp PORT=/dev/usb/ttyUSB0
# ISP=stk500v2 PORT=/dev/ttyUSB0
ISP=usbasp
- PORT=/dev/usb/ttyUSB0
help:
@echo "Usage: make same as make help"
--- 26,31 ----
***************
*** 35,43 ****
@echo " HFUSE=${HFUSE}"
@echo " CLOCK=12000000"
@echo " ISP=${ISP}"
- @echo " PORT=${PORT}"
! COMPILE = avr-gcc -Wall -O2 -Iusbdrv -I. -mmcu=$(TARGET) # -DDEBUG_LEVEL=2
OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o isp.o clock.o tpi.o main.o
--- 42,49 ----
@echo " HFUSE=${HFUSE}"
@echo " CLOCK=12000000"
@echo " ISP=${ISP}"
! COMPILE = $(CC) -Wall -O2 -Iusbdrv -I. -mmcu=$(TARGET) # -DDEBUG_LEVEL=2
OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o isp.o clock.o tpi.o main.o
***************
*** 64,88 ****
main.hex: main.bin
rm -f main.hex main.eep.hex
! avr-objcopy -j .text -j .data -O ihex main.bin main.hex
# ./checksize main.bin
# do the checksize script as our last action to allow successful compilation
# on Windows with WinAVR where the Unix commands will fail.
disasm: main.bin
! avr-objdump -d main.bin
cpp:
$(COMPILE) -E main.c
flash:
! avrdude -c ${ISP} -p ${TARGET} -P ${PORT} -U flash:w:main.hex
fuses:
! avrdude -c ${ISP} -p ${TARGET} -P ${PORT} -u -U hfuse:w:$(HFUSE):m -U lfuse:w:$(LFUSE):m
avrdude:
! avrdude -c ${ISP} -p ${TARGET} -P ${PORT} -v
# Fuse atmega8 high byte HFUSE:
# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000)
--- 70,94 ----
main.hex: main.bin
rm -f main.hex main.eep.hex
! $(OBJCOPY) -j .text -j .data -O ihex main.bin main.hex
# ./checksize main.bin
# do the checksize script as our last action to allow successful compilation
# on Windows with WinAVR where the Unix commands will fail.
disasm: main.bin
! $(OBJDUMP) -d main.bin
cpp:
$(COMPILE) -E main.c
flash:
! $(AVRDUDE) -C $(AVRDUDE_CONF) -c ${ISP} -p ${TARGET} -u -U flash:w:main.hex
fuses:
! $(AVRDUDE) -C $(AVRDUDE_CONF) -c ${ISP} -p ${TARGET} -u -U hfuse:w:$(HFUSE):m -U lfuse:w:$(LFUSE):m
avrdude:
! $(AVRDUDE) -C $(AVRDUDE_CONF) -c ${ISP} -p ${TARGET} -v
# Fuse atmega8 high byte HFUSE:
# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000)
Only in usbasp.2023-02-18/firmware: Makefile.orig
diff -cr usbasp.2011-05-28/firmware/isp.c usbasp.2023-02-18/firmware/isp.c
*** usbasp.2011-05-28/firmware/isp.c 2011-01-20 03:18:00.000000000 +0900
--- usbasp.2023-02-18/firmware/isp.c 2023-02-18 13:37:54.000000000 +0900
***************
*** 162,171 ****
}
/* pulse SCK */
ISP_OUT |= (1 << ISP_SCK); /* SCK high */
ispDelay();
ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */
- ispDelay();
}
return rec_byte;
--- 162,171 ----
}
/* pulse SCK */
+ ispDelay(); /* slow CLK option */
ISP_OUT |= (1 << ISP_SCK); /* SCK high */
ispDelay();
ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */
}
return rec_byte;
diff -cr usbasp.2011-05-28/firmware/main.c usbasp.2023-02-18/firmware/main.c
*** usbasp.2011-05-28/firmware/main.c 2011-05-28 16:57:49.000000000 +0900
--- usbasp.2023-02-18/firmware/main.c 2023-02-19 00:33:28.000000000 +0900
***************
*** 306,313 ****
/* no pullups on USB and ISP pins */
PORTD = 0;
PORTB = 0;
! /* all outputs except PD2 = INT0 */
! DDRD = ~(1 << 2);
/* output SE0 for USB reset */
DDRB = ~0;
--- 306,313 ----
/* no pullups on USB and ISP pins */
PORTD = 0;
PORTB = 0;
! /* all PDx inputs */
! DDRD = 0;
/* output SE0 for USB reset */
DDRB = ~0;
***************
*** 324,330 ****
/* all inputs except PC0, PC1 */
DDRC = 0x03;
! PORTC = 0xfe;
/* init timer */
clockInit();
--- 324,330 ----
/* all inputs except PC0, PC1 */
DDRC = 0x03;
! PORTC = 0xFF;
/* init timer */
clockInit();
diff -cr usbasp.2011-05-28/firmware/usbdrv/usbdrv.c usbasp.2023-02-18/firmware/usbdrv/usbdrv.c
*** usbasp.2011-05-28/firmware/usbdrv/usbdrv.c 2011-01-20 02:17:36.000000000 +0900
--- usbasp.2023-02-18/firmware/usbdrv/usbdrv.c 2023-02-18 13:33:31.000000000 +0900
***************
*** 67,73 ****
#if USB_CFG_DESCR_PROPS_STRING_0 == 0
#undef USB_CFG_DESCR_PROPS_STRING_0
#define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0)
! PROGMEM char usbDescriptorString0[] = { /* language descriptor */
4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */
3, /* descriptor type */
0x09, 0x04, /* language index (0x0409 = US-English) */
--- 67,73 ----
#if USB_CFG_DESCR_PROPS_STRING_0 == 0
#undef USB_CFG_DESCR_PROPS_STRING_0
#define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0)
! PROGMEM const char usbDescriptorString0[] = { /* language descriptor */
4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */
3, /* descriptor type */
0x09, 0x04, /* language index (0x0409 = US-English) */
***************
*** 77,83 ****
#if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_VENDOR
#define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor)
! PROGMEM int usbDescriptorStringVendor[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN),
USB_CFG_VENDOR_NAME
};
--- 77,83 ----
#if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_VENDOR
#define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor)
! PROGMEM const int usbDescriptorStringVendor[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN),
USB_CFG_VENDOR_NAME
};
***************
*** 86,92 ****
#if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_PRODUCT
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice)
! PROGMEM int usbDescriptorStringDevice[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN),
USB_CFG_DEVICE_NAME
};
--- 86,92 ----
#if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_PRODUCT
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice)
! PROGMEM const int usbDescriptorStringDevice[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN),
USB_CFG_DEVICE_NAME
};
***************
*** 95,101 ****
#if USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER == 0 && USB_CFG_SERIAL_NUMBER_LEN
#undef USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER sizeof(usbDescriptorStringSerialNumber)
! PROGMEM int usbDescriptorStringSerialNumber[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LEN),
USB_CFG_SERIAL_NUMBER
};
--- 95,101 ----
#if USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER == 0 && USB_CFG_SERIAL_NUMBER_LEN
#undef USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER sizeof(usbDescriptorStringSerialNumber)
! PROGMEM const int usbDescriptorStringSerialNumber[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LEN),
USB_CFG_SERIAL_NUMBER
};
***************
*** 108,114 ****
#if USB_CFG_DESCR_PROPS_DEVICE == 0
#undef USB_CFG_DESCR_PROPS_DEVICE
#define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice)
! PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */
18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
USBDESCR_DEVICE, /* descriptor type */
0x10, 0x01, /* USB version supported */
--- 108,114 ----
#if USB_CFG_DESCR_PROPS_DEVICE == 0
#undef USB_CFG_DESCR_PROPS_DEVICE
#define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice)
! PROGMEM const char usbDescriptorDevice[] = { /* USB device descriptor */
18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
USBDESCR_DEVICE, /* descriptor type */
0x10, 0x01, /* USB version supported */
***************
*** 139,145 ****
#if USB_CFG_DESCR_PROPS_CONFIGURATION == 0
#undef USB_CFG_DESCR_PROPS_CONFIGURATION
#define USB_CFG_DESCR_PROPS_CONFIGURATION sizeof(usbDescriptorConfiguration)
! PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 +
--- 139,145 ----
#if USB_CFG_DESCR_PROPS_CONFIGURATION == 0
#undef USB_CFG_DESCR_PROPS_CONFIGURATION
#define USB_CFG_DESCR_PROPS_CONFIGURATION sizeof(usbDescriptorConfiguration)
! PROGMEM const char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 +
diff -cr usbasp.2011-05-28/firmware/usbdrv/usbdrv.h usbasp.2023-02-18/firmware/usbdrv/usbdrv.h
*** usbasp.2011-05-28/firmware/usbdrv/usbdrv.h 2011-01-20 02:17:36.000000000 +0900
--- usbasp.2023-02-18/firmware/usbdrv/usbdrv.h 2023-02-18 13:34:14.000000000 +0900
***************
*** 452,494 ****
#if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM)
PROGMEM
#endif
! char usbDescriptorDevice[];
extern
#if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM)
PROGMEM
#endif
! char usbDescriptorConfiguration[];
extern
#if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM)
PROGMEM
#endif
! char usbDescriptorHidReport[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM)
PROGMEM
#endif
! char usbDescriptorString0[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM)
PROGMEM
#endif
! int usbDescriptorStringVendor[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM)
PROGMEM
#endif
! int usbDescriptorStringDevice[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM)
PROGMEM
#endif
! int usbDescriptorStringSerialNumber[];
#endif /* __ASSEMBLER__ */
--- 452,494 ----
#if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM)
PROGMEM
#endif
! const char usbDescriptorDevice[];
extern
#if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM)
PROGMEM
#endif
! const char usbDescriptorConfiguration[];
extern
#if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM)
PROGMEM
#endif
! const char usbDescriptorHidReport[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM)
PROGMEM
#endif
! const char usbDescriptorString0[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM)
PROGMEM
#endif
! const int usbDescriptorStringVendor[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM)
PROGMEM
#endif
! const int usbDescriptorStringDevice[];
extern
#if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM)
PROGMEM
#endif
! const int usbDescriptorStringSerialNumber[];
#endif /* __ASSEMBLER__ */
:100000003BC0D3C154C053C052C051C050C04FC0F8
:100010004EC04DC04CC04BC04AC049C048C047C08C
:1000200046C045C044C00902120001010080190900
:10003000040000000000000012011001FF00000891
:10004000C016DC050401010200010E035500530037
:1000500042006100730070001C0377007700770096
:100060002E00660069007300630068006C002E00BB
:10007000640065000403090411241FBECFE5D4E029
:10008000DEBFCDBF10E0A0E6B0E0EAE9F1E102C0DA
:1000900005900D92A236B107D9F720E0A2E6B0E0B4
:1000A00001C01D92AA3AB207E1F766D874C8A8CF7A
:1000B0001F93CF93DF9360918800635067FF49C01F
:1000C0008091610084FF04C0109160001F3F61F4C3
:1000D00094E103C0915009F450C086B38370D1F30A
:1000E000DF91CF911F9108958091780098E889273A
:1000F000193008F44AC0C8EFC10FC0936000809364
:10010000780018E08091620087FDA0C0E091860031
:10011000F091870086FF78C0A9E7B0E08FEF810FEC
:1001200090E001968E0F9F1F24912D933196E81732
:10013000F907D1F7F0938700E0938600612F89E7F4
:1001400090E02FD1C4E0C10FCC3051F5C0936100D5
:10015000BFCF209185008CE090E0821B9109EC01DB
:10016000C457DF4F809184008D32F1F0809162009E
:1001700087FD40C010928800A3CF10928900109292
:100180008300DF91CF911F910895109260008093BA
:1001900078001111B7CF60E089E790E002D1C4E0A8
:1001A0009FEF90936000D2CF683021F783EC80936B
:1001B00078008AE5809361001092620088818076E1
:1001C000D1F52A81109281009981911152C010922B
:1001D000820081E890E0909387008093860082E01F
:1001E0009F81911104C09E81981708F4892F8093F4
:1001F0006000C0CFCE01E5D68F3FB9F1882309F466
:10020000B9CF10926000B6CFDF0189E790E06FEFC1
:10021000610F70E0AF014F5F5F4F460F571F2D9189
:10022000EC012993CE014A175B07C9F76F5F7F4F37
:10023000E60FF71F7FCFCE01BED48F3F89F698819E
:1002400097FD8E8190E890936200D1CF612F89E76E
:1002500090E03DD6182F893008F470CF8FEF80934F
:100260006000CEE1C093610033CF8EE180936100E6
:1002700081CF953079F09630B1F09830F9F099301F
:1002800029F19A30C9F121E830E0309387002093BA
:100290008600ADCF2093890021E830E030938700BD
:1002A00020938600A4CF9B819130C9F1923061F1F7
:1002B0009330A9F090E49093620099CF8BE890E09E
:1002C000909387008093860081E08ACF20938B00F3
:1002D00021E830E0309387002093860088CF2111F9
:1002E00029C084E790E0909387008093860080E4A3
:1002F0008093620084E074CF81E890E0909387005F
:100300008093860081E06CCF86E290E09093870036
:100310008093860080E48093620082E161CF88E36D
:1003200090E0909387008093860080E48093620041
:1003300082E156CF213071F0223009F0BBCF8AE440
:1003400090E0909387008093860080E48093620021
:100350008EE046CF88E590E09093870080938600FA
:1003600080E4809362008CE13BCF85B7836085BFDA
:100370008BB780648BBF0895A82FB92F80E090E0E1
:1003800041E050EA609530E009C02D9182279795B1
:10039000879510F084279527305EC8F36F5FA8F328
:1003A0000895EADF8D939D930895CF93CFB7CF93B0
:1003B000C395B09BE9F7B09B09C0B09B07C0B09B49
:1003C00005C0B09B03C0B09B01C0A1C0DF93C0912A
:1003D0008500DD27C457DF4FB09B02C0DF91EBCF14
:1003E0002F930F931F9306B32FEF00FB20F94F932A
:1003F0003F9316B34FEF012700FB21F93BE031C0DB
:100400004E7F012F16B3216028C0102F4D7F226030
:10041000000006B329C04B7F2460012F000016B3F3
:100420002BC016B3477F28602AC04F7E06B32061D9
:100430002CC04F7D16B320622FC04F7B06B32064C3
:1004400032C0422706B349934FEF0000102710FB3C
:1004500020F916B31370C9F1297F91F2012700FB2F
:1004600021F906B3237F89F2315058F1102710FB90
:1004700022F916B3277E79F2012700FB23F92F7C9E
:1004800081F206B3102710FB24F92F7971F200C016
:1004900016B3012700FB25F92F7359F200C006B3EC
:1004A000102710FB26F9223040F200C016B30127B6
:1004B00000FB27F9243028F64F77206816B3000098
:1004C000F9CF10E41ABF002717C03B503195C31B6A
:1004D000D04010E41ABF0881033CE9F00B34D9F096
:1004E000209183001981110F1213EDCF093641F1CC
:1004F0000D3211F0013E39F700938A003F914F9180
:100500001F910F912F91DF91CAB7C6FD51CFCF91A7
:10051000CFBFCF91189520918A00222379F31091B3
:100520008800112311F5343012F1309388002093A4
:100530008400109185003BE0311B3093850017C08B
:100540000091880001308CF40AE53091610034FD9F
:1005500010C000936100C8E7D0E00FC02795A8F451
:100560005150A9F4220F0000F9CF4AE503C042ED33
:1005700001C0432FC4E1D0E032E017B31360C09A4A
:1005800017BB08B320E413E05F93012756E008BBD4
:10059000279520F4515021F4220FF9CF012756E07E
:1005A00000003B5A08BBD0F2279528F4515029F49B
:1005B000220F0000F9CF012756E0279508BB20F451
:1005C000515021F4220FF9CF012756E0299133230E
:1005D00008BB21F60C7F10918900110FC651D04045
:1005E00008BB11F01093830010E41ABF016017B329
:1005F0001C7F402F4C7F5F9100C000C008BB17BB21
:1006000048BB7CCF582F48E080E057FD18C0C39806
:10061000550F880FB4998F5F32B72091A70092B71A
:10062000931B9217E0F3C59A32B72091A70092B7B7
:10063000931B9217E0F3C598415039F70895C39A78
:10064000E7CF8FB9779BFECF8FB10895DC01CB0147
:1006500021E1B695A795979587952A95D1F7209191
:10066000A6002817D9F08093A600E091A300F0918E
:10067000A4008DE40995E091A300F091A40080E02E
:100680000995E091A300F091A4008091A60009953E
:10069000E091A300F091A40080E009940895809176
:1006A000A5008DB98091A2008EB90895811110C066
:1006B00081E293E09093A4008093A30081E0809373
:1006C000A70082E58093A50081E08093A2000895B1
:1006D000883098F422E033E03093A4002093A30004
:1006E000843009F441C008F1863099F1C8F18730AF
:1006F00079F583E08093A700089521E233E03093F9
:10070000A4002093A3001092A20091E09093A70070
:10071000893099F0B0F08B3021F08C3091F69093C5
:10072000A20081E58093A50008958230A9F083306E
:1007300079F480E38093A700089582E58093A50073
:100740000895883009F0BDCF83E58093A500089512
:1007500080EC8093A700089580E68093A700089519
:100760008CE08093A700089588E18093A700089506
:1007700022B79091A70082B7821B8917E0F30895F2
:1007800087B38C6287BBC298C59822B79091A700A7
:1007900082B7821B8917E0F3C29A22B79091A70013
:1007A00082B7821B8917E0F3C2988091A3009091D1
:1007B000A4008152934031F48091A5008DB98091BD
:1007C000A2008EB91092A600089587B3837D87BBDF
:1007D00088B3837D88BB1DB80895CF93DF93C0E2B3
:1007E000E091A300F091A4008CEA0995E091A300A8
:1007F000F091A40083E50995E091A300F091A40095
:1008000080E00995D82FE091A300F091A40080E04A
:100810000995D33561F11DB822B79091A70082B731
:10082000821B8917E0F3C29A22B79091A70082B782
:10083000821B8917E0F3C29822B79091A70082B774
:10084000821B8917E0F38091A3009091A40081524C
:10085000934031F0C15021F681E0DF91CF910895AE
:100860008091A5008DB98091A2008EB9F3CF80E070
:10087000DF91CF910895CF92DF92EF92FF926B01BB
:100880007C01E4DE8C2D880F880F880F8870E09142
:10089000A300F091A40080620995D701C60129E068
:1008A000B695A795979587952A95D1F7E091A300DE
:1008B000F091A4000995D701C601B695A795979523
:1008C0008795E091A300F091A4000995E091A30021
:1008D000F091A40080E0FF90EF90DF90CF9009941A
:1008E000CF92DF92EF92FF92CF93DF936B017C0167
:1008F000C42FD22FABDE8C2D880F880F880F887005
:10090000E091A300F091A40080640995D701C6018D
:1009100029E0B695A795979587952A95D1F7E09107
:10092000A300F091A4000995D701C601B695A7953B
:1009300097958795E091A300F091A4000995E09127
:10094000A300F091A4008C2F0995DD23C1F0CF37CF
:10095000F1F0C2B7DEE1C701B6018DDF8F3779F460
:1009600082B78C1B8D33B8F3C2B7D150A1F781E0A9
:10097000DF91CF91FF90EF90DF90CF90089580E0CE
:10098000DF91CF91FF90EF90DF90CF9008958FE0AF
:100990009DD080E0F5CFCF92DF92EF92FF92CF9380
:1009A000DF936B017C01C42F51DEE091A300F09135
:1009B000A4008CE40995D701C60129E0B695A79556
:1009C000979587952A95D1F7E091A300F091A4001F
:1009D0000995D701C601B695A79597958795E0919A
:1009E000A300F091A4000995E091A300F091A40068
:1009F00080E00995CF3FF1F0C2B7DEE1C701B60153
:100A00003ADF8F3F79F482B78C1B8D33B8F3C2B7CE
:100A1000D150A1F781E0DF91CF91FF90EF90DF906F
:100A2000CF90089580E0DF91CF91FF90EF90DF901D
:100A3000CF9008958FE04AD080E0DF91CF91FF9072
:100A4000EF90DF90CF900895CF93DF93EC01E0918A
:100A5000A300F091A40080EA0995E091A300F09131
:100A6000A4008D2F0995E091A300F091A4008C2F94
:100A70000995E091A300F091A40080E0DF91CF916F
:100A800009941F93CF93DF93D82F192FC62FE0918E
:100A9000A300F091A40080EC0995E091A300F091EF
:100AA000A400812F0995E091A300F091A4008D2F5F
:100AB0000995E091A300F091A4008C2F09958EE197
:100AC00005D080E0DF91CF911F910895882349F0F0
:100AD00030E022B792B7921B9C33E0F33F5F831361
:100AE000F8CF0895BD9ABB98C39A50E217D05A9593
:100AF000E9F70895AC0188E605D0842F03D089E694
:100B000001D0852F0FD028E030E0382780FB869574
:100B100006D02A95D1F730FB02D000D06894BB985C
:100B2000C39A16F0C398BB9AE091A800F091A9006F
:100B30003197F0F7C59AE6B3E3FBE091A800F09196
:100B4000A9003197F0F7C598089520ECE7DF46F447
:100B50002A95E1F780E02AE1E5DF2A95E9F7DECF83
:100B600028E030E0DBDF869587F938272A95D1F732
:100B7000D5DF27F9322772F3D1DFD0CFDB01742F15
:100B8000B9DF84E2BFDFE1DF8D937A95D1F7089575
:100B9000DB01742FAFDF83EFB5DF8DE1B3DF84E6D8
:100BA000B1DF8D91AFDF82E7ADDFCFDF8078D9F79E
:100BB0007A9589F70895CF93DF93EC01898181308D
:100BC00009F45AC0823009F465C0833051F5E091D0
:100BD000A300F091A4008A81099580937000E091B0
:100BE000A300F091A4008B81099580937100E0919E
:100BF000A300F091A4008C81099580937200E0918C
:100C0000A300F091A4008D8109958093730084E086
:100C100020E730E03093870020938600DF91CF916A
:100C200008958430D9F1873009F45CC0853009F427
:100C300076C0863009F489C0883009F4B9C089309B
:100C400009F472C08A3009F446C08B3009F4D3C06D
:100C50008C3009F4E1C08D3009F4F3C08E3009F412
:100C6000F5C08F3009F4F6C0803109F40CC18F371C
:100C700009F422C180E0CCCF9A9B09C080916E001C
:100C800015DD10926D00A9987BDD80E0C1CF85E075
:100C90000DDDF7CF9ADDA99A80E0BACF80916D0083
:100CA00081110EC08A819B81092E000CAA0BBB0BFF
:100CB0008093690090936A00A0936B00B0936C00DE
:100CC0008E819F81909368008093670082E080937B
:100CD0006F008FEF9DCF8A8180936E00109270001D
:100CE00081E096CF80916D0081110EC08A819B8139
:100CF000092E000CAA0BBB0B8093690090936A002D
:100D0000A0936B00B0936C008E819F8190936800DC
:100D10008093670083E080936F008FEF79CF5DDD74
:100D20008093700081E074CF81E080936D008A81B0
:100D30009B81AC81BD818093690090936A00A093F0
:100D40006B00B0936C0080E063CF80916D008111E7
:100D50000EC08A819B81092E000CAA0BBB0B8093CD
:100D6000690090936A00A0936B00B0936C008C8133
:100D70002D81922F9F709093640090E1299FA00194
:100D8000112444275F70840F952F911D9093660066
:100D90008093650020FD809363008E819F819093F6
:100DA00068008093670081E080936F008FEF30CF01
:100DB00080916D0081110EC08A819B81092E000CEB
:100DC000AA0BBB0B8093690090936A00A0936B0001
:100DD000B0936C001092660010926500109264004F
:100DE0008E819F81909368008093670084E0809358
:100DF0006F008FEF0DCF8A819B819093A900809324
:100E0000A800C29ABA9A83E061DEC298A99880E1EC
:100E10005DDE68DE80E0FCCE80EC74DE80E072DEB9
:100E20008AE054DEC29A85E051DEC29885E04EDE4B
:100E300087B3837D87BB88B3837D88BBA99A80E015
:100E4000E7CE83DE8093700081E0E2CE8A815ADEB5
:100E500080E0DECE8A819B81092E000CAA0BBB0BA1
:100E60008093690090936A00A0936B00B0936C002C
:100E70008E819F81909368008093670085E08093C6
:100E80006F008FEFC5CE8A819B81092E000CAA0BC3
:100E9000BB0B8093690090936A00A0936B00B093A2
:100EA0006C008E819F81909368008093670086E03C
:100EB00080936F008FEFACCE81E080937000109232
:100EC0007100109272001092730084E0A1CEFF9224
:100ED0000F931F93CF93DF93582F792FF62E2091E6
:100EE0006F003EEF320F323028F18FEF2530E1F402
:100EF000462F652F8091690090916A003FDE8091B6
:100F0000690090916A00A0916B00B0916C008F0D08
:100F1000911DA11DB11D8093690090936A00A0935B
:100F20006B00B0936C008F2DDF91CF911F910F91CB
:100F3000FF900895662391F18091690090916A0075
:100F4000A0916B00B0916C00C52FD72F0FEF060F4B
:100F50000C0F1D2F111D1BC077DD88838091690048
:100F600090916A00A0916B00B0916C000196A11D58
:100F7000B11D8093690090936A00A0936B00B093B9
:100F80006C000C171D0799F020916F0021962230FC
:100F900019F7BC01CD016FDC8883E0CF10926F00A0
:100FA0008F2DDF91CF911F910F91FF90089587E0D2
:100FB0008F15A0F78F2DDF91CF911F910F91FF908B
:100FC0000895FF920F931F93CF93DF93382F792FBC
:100FD000062F20916F002130C9F12430B9F1FF2490
:100FE000FA94263061F5462F682F80916900909120
:100FF0006A00CEDD8091690090916A00A0916B003B
:10100000B0916C00800F911DA11DB11D80936900EE
:1010100090936A00A0936B00B0936C00809167007E
:1010200090916800801B91099093680080936700FD
:10103000892B09F099C010926F00FF24F3948F2D33
:10104000DF91CF911F910F91FF900895002309F434
:101050008BC08091690090916A00A0916B00B09163
:101060006C00C32FD72F0150AE014F5F5F4F040FAD
:10107000152F111DF12C4991213009F045C0209107
:10108000650030916600232B09F041C021E0BC01CE
:10109000CD0126DC20916700309168002150310994
:1010A00030936800209367008091690090916A00F6
:1010B000A0916B00B0916C00232B89F410926F000B
:1010C0002091640021FF09C04091630020916500D8
:1010D0003091660042171306B1F5FF24F394019690
:1010E000A11DB11D8093690090936A00A0936B00CD
:1010F000B0936C000C171D0709F4A1CF20916F006D
:101100004991213009F4BBCF642FBBDCC3CF20E071
:10111000BC01CD01E5DB80916300815080936300C9
:101120008111B8CF6091690070916A0080916B0065
:1011300090916C00FE01319740812DDC809165001B
:1011400080936300A7CFFE0131974081BC01CD01A0
:1011500022DC8091690090916A00A0916B00B091AF
:101160006C00FF24F394BBCFF12C8F2DDF91CF9136
:101170001F910F91FF90089512BA18BA11BA9FEFFC
:1011800097BB17BA83E084BB95BB83BFEED8789436
:0A1190008FD78ED7FDCFF894FFCF64
:02119A00FF5AFA
:00000001FF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment