sábado, 5 de setembro de 2015

Uso de memórias I2C

Editor/Leitor de memórias EEPROM I2C

Precisei ler algumas memórias EEPROM do tipo I2C e resolvi aproveitar uma placa de desenvolvimento MCLAB2 da Mosaico que já tem um soquete de 8 pinos para memórias 24LCXX, um PIC 16F877A e um LCD de 16x2.

As memórias EEPROM 24LC usam comunicação serial I2C (ou IIC) que utiliza 2 sinais: um clock de até 400kHz e uma via de dados bidirecional. Isso economiza bastante as portas de um microcontrolador e por isso diversos aparelhos e sistemas usam essas memórias para armazenar dados de configuração ou de monitoramento coletados por sensores.

As memórias que incluí no programa são:
24LC01 de 1kbits (8 x 128)
24LC02 de 2kbits (8 x 256)
24LC04 de 4 kbits (8 x 512)
24LC08 de 8 kbits (8 x 1024)
24LC16 de 16 kbits (8 x 2048)
24LC32 de 32 kbits (8 x 4096)
24LC64 de 64 kbits (8 x 8192)
24LC128 de 128 kbits (8 x 16384)
24LC256 de 256 kbits (8 x 32768)
24LC512 de 512 kbits (8 x 65536)

A vantagem é que todas essas memórias usam a mesma pinagem e encapsulamento DIP 8.

A parte do circuito aproveitada da placa MCLAB2 é a seguinte e pode ser montada em protoboard:

A MCLAB2 possui 4 botões de contato momentâneo, assim designei-os de botões 1 a 4, sendo que B1 tem a função de decremento, B2 de incremento, B3 de avanço e B4 de enter ou saída.

Ao ligar, aparece um Menu com as seguintes opções:
1 - Seleciona dispositivo: escolhe qual a memória a editar ou ler.
2 - Leitura da memória: apenas se consegue ver os dados gravados nos endereços
3 - Edição da memória: pode-se ver os dados e alterá-los
4 - Apagamento da memória: seta todas as posições de memória com o valor $FF (255 em decimal).

Para escolher uma das opções, aperta-se o botão correspondente à desejada.

Ao escolher a opção 1, devemos a seguir escolher qual o modelo de memória a ser usada. Os botões B1 e B2 selecionam na lista de modelos e o botão B4 aceita a seleção e volta ao menu inicial.

Na opção de leitura, devemos entrar com o endereço inicial a ser lido. Iniciando pelo digito hexadecimal mais significativo (o primeiro da esquerda, de 4) podemos mudá-lo de 0 a F com os botões B1 e B2. Aparecendo o dígito desejado, aperta-se B3 e passamos ao segundo dígito e assim por diante até o último dígito menos significativo. Se o endereço for maior do que a capacidade da memória escolhida, aparece uma mensagem de erro e volta-se para a seleção do endereço. A qualquer momento também aparece o valor do endereço em decimal. Ao final já se apresenta o valor do dado (em hexadecimal e decimal) naquela posição de memória:

Para passar para o endereço seguinte, aperta-se B2, para voltar uma posição, aperta-se B1.  Para sair da leitura, aperta-se B4.

Na opção de edição/gravação (3), também devemos entrar com o endereço inicial a ser editado. Depois de entrado o endereço, aparece o valor atual do dado naquela posição de memória. Para alterar o valor usamos B1 para modificar o valor do dígito (nibble) hexadecimal mais significativo e B2 para o nibble menos significativo. Para gravar e avançar para o próximo endereço usamos o botão B3. Para terminar a edição e voltar para o menu, aperta-se B4.


A última opção apaga a memória por inteiro, gravando o valor $FF em todas as posições. Memórias com grande capacidade demoram um certo tempo para terem todas posições apagadas. Ao final do processo aparece uma mensagem informando o final do apagamento e pedindo para apertar B4 para voltar ao menu.

O firmware para o 16F877A é o seguinte:

:10000000B2017C29B216B21EB212B2190B28B21577
:100010004420031832280830A3005920A20DA30B56
:100020000D28B21E3D2063205F20B21A32203720F7
:10003000220803107729B216B21EB21232192528EF
:10004000FE39B300321503107729321A2D28A60085
:10005000321644200318322826084C200318322870
:10006000B21E77293D20632032113212B2113608B8
:100070008400340884178004432836088400340937
:100080008005841780057729372063207B213D2058
:100090005F203308B2190138A2000830A300A20D76
:1000A00003183720031C3D2063205F20A30B4F283B
:1000B000372063203608840034080005FF3E3708E7
:1000C0008400350940283708840035083A28040898
:1000D000A70089100910091083168910091009104A
:1000E000880183122708B21890283A30A100FC300A
:1000F00002213330A600A3201030A1006830022175
:10010000A32064300121A32038308F200C308F20B1
:1001100001308F2006308F20B21427089028321427
:10012000A600321C9E280910033C031CA328A32010
:100130000730A100D0300221031408003214FE3C25
:1001400003197729091489142608880032108910A8
:100150003230012103140800B31329080319B3171F
:100160000430A800250EB9202508B920240EB92096
:1001700024080F39F63E0318073E0A3EDC28B31365
:1001800029080319B3170530A8002730A300103041
:10019000D5200330A300E830D520A3016430D5205A
:1001A000A3010A30D5202408DC28A2002508A100DC
:1001B0002408A00040212008A000A8030319B313BD
:1001C00029080319E6282802031808002008031D3F
:1001D000B313B31B0800303E722983178001840AD1
:1001E000FF3E031DEE287729A301A200FF30A207DE
:1001F000031CA307031C77290330A100DF30022171
:10020000F628A101E83EA000A109FC30031C0B293F
:10021000A00703180829A0076400A10F08292018C7
:100220001129A01C1529000015290800A101A3010E
:10023000A20001302529A20006302529A101A30131
:10024000A20004302529A2000530A80023082102BD
:10025000031D2C2922082002043003180130031941
:1002600002302805031DFF3077290038031DFF30B9
:100270000405031DFF3077290404031DFF3077298F
:10028000A501A4011030A600210DA40DA50D220882
:10029000A4022308031C230FA502031856292208D1
:1002A000A40723080318230FA5070310A00DA10D11
:1002B000A60B4429200877291030A800A101A0012D
:1002C000A70CA60C031C6A292208A0072308031800
:1002D000230FA107A10CA00CA50CA40CA80B60294E
:1002E00024087729840031088A00300882008313AB
:1002F00003138312640008008316DF3085000F307B
:100300008600913087008801890106309F00073000
:100310009C00831207112030840060308A01EE2097
:10032000A030840050308A01EE201030840060300C
:100330008A01ED209030840060308A01ED20FE308B
:100340008A01682001308A01682050308A016820C3
:100350006C308A01682061308A01682063308A012C
:10036000682061308A01682020308A0168204D3081
:100370008A01682043308A0168204C308A01682055
:1003800041308A01682042308A01682032308A0177
:10039000682020308A01682020308A0168202030BF
:1003A0008A01682020308A016820FE308A01682096
:1003B000C0308A0168204C308A01682065308A018B
:1003C00068202F308A01682067308A0168207230E7
:1003D0008A01682061308A01682076308A016820AD
:1003E00061308A01682020308A01682049308A0102
:1003F000682032308A01682043308A01682020302A
:100400008A01682020308A01682020308A01682013
:10041000FE308A0168200F308A0168200730A3006F
:10042000D0308A01F520FE308A01682001308A012F
:10043000682031308A0168202D308A0168207330AD
:100440008A01682065308A0168206C308A01682042
:1004500020308A01682064308A01682065308A0172
:10046000682076308A01682020308A016820323086
:100470008A0168202D308A01682072308A01682044
:1004800065308A01682061308A01682064308A0101
:100490006820FE308A016820C0308A01682033302D
:1004A0008A0168202D308A01682077308A0168200F
:1004B00072308A01682069308A01682074308A01AC
:1004C000682065308A01682020308A016820343035
:1004D0008A0168202D308A01682065308A016820F1
:1004E00072308A01682061308A01682073308A0185
:1004F000682065308A01682064008A110A12061893
:10050000892AFA308A01F4200130C6008A110A12C1
:10051000AC2A64008A110A128618942AFA308A01D9
:10052000F4208A150A122E2A64008A110A1206196A
:100530009F2AFA308A01F4208A150A126B2B640074
:100540008A110A128619AA2AFA308A01F4208A1519
:100550000A12C92D8A017C2AFE308A0168200130E6
:100560008A01682053308A01682065308A0168203A
:100570006C308A01682065308A01682063308A0106
:10058000682074308A01682020308A016820643035
:100590008A01682065308A01682076308A016820E7
:1005A00069308A01682063308A01682065308A01D9
:1005B00068203A308A01682020308A016820203083
:1005C0008A016820FE308A016820C0308A016820D4
:1005D0003D308A0168208A110A12242364008A119E
:1005E0000A120618022BFA308A01F420C6036400AE
:1005F0004608003C8A110A12031D002B0B30C6006E
:100600008A01E22A64008A110A128618162BFA302F
:100610008A01F420C60A640046080C3C8A110A12BA
:10062000031D142B0130C6008A01E22A64008A11DE
:100630000A128619222B0130A3005E308A01F520B0
:100640008A019F298A01EE2A64004608013C8A112A
:100650000A12031D542BFE308A016820C0308A0123
:1006600068203D308A01682032308A0168203430A9
:100670008A0168204C308A01682043308A01682052
:1006800030308A01682031308A01682020308A01A8
:10069000682020308A01682020308A016820A0303C
:1006A000C4007F30BA00BB0164004608023C8A11D6
:1006B0000A12031D842BFE308A016820C0308A0193
:1006C00068203D308A01682032308A016820343049
:1006D0008A0168204C308A01682043308A016820F2
:1006E00030308A01682032308A01682020308A0147
:1006F000682020308A01682020308A016820A030DC
:10070000C400FF30BA00BB0164004608033C8A11F4
:100710000A12031DB52BFE308A016820C0308A0101
:1007200068203D308A01682032308A0168203430E8
:100730008A0168204C308A01682043308A01682091
:1007400030308A01682034308A01682020308A01E4
:10075000682020308A01682020308A016820A0307B
:10076000C400FF30BA000130BB0064004608043CFE
:100770008A110A12031DE62BFE308A016820C03060
:100780008A0168203D308A01682032308A01682061
:1007900034308A0168204C308A01682043308A0155
:1007A000682030308A01682038308A016820203083
:1007B0008A01682020308A01682020308A01682060
:1007C000A030C400FF30BA000330BB00640046080C
:1007D000053C8A110A12031D172CFE308A0168207D
:1007E000C0308A0168203D308A01682032308A0199
:1007F000682034308A0168204C308A0168204330F8
:100800008A01682031308A01682036308A016820E8
:1008100020308A01682020308A01682020308A0137
:100820006820A030C400FF30BA000730BB0064006D
:100830004608063C8A110A12031D482CFE308A0124
:100840006820C0308A0168203D308A01682032303B
:100850008A01682034308A0168204C308A0168207F
:1008600043308A01682033308A01682032308A019F
:10087000682020308A01682020308A0168202030DA
:100880008A016820A030C400FF30BA000F30BB00DE
:1008900064004608073C8A110A12031D792CA03017
:1008A000C400FE308A016820C0308A0168203D30D3
:1008B0008A01682032308A01682034308A01682039
:1008C0004C308A01682043308A01682036308A0122
:1008D000682034308A01682020308A016820203066
:1008E0008A01682020308A016820FF30BA001F305A
:1008F000BB0064004608083C8A110A12031DA82C9C
:10090000FE308A016820C0308A0168203D308A01AB
:10091000682032308A01682034308A0168204C30E7
:100920008A01682043308A01682031308A016820BA
:1009300032308A01682038308A01682020308A01EC
:10094000682020308A016820FF30BA003F30BB00A9
:1009500064004608093C8A110A12031DD72CFE3098
:100960008A016820C0308A0168203D308A016820F1
:1009700032308A01682034308A0168204C308A0184
:10098000682043308A01682032308A01682035307F
:100990008A01682036308A01682020308A01682068
:1009A00020308A016820FF30BA007F30BB0064002D
:1009B00046080A3C8A110A12031D062DFE308A01E0
:1009C0006820C0308A0168203D308A0168203230BA
:1009D0008A01682034308A0168204C308A016820FE
:1009E00043308A01682035308A01682031308A011D
:1009F000682032308A01682020308A016820203047
:100A00008A016820FF30BA00FF30BB00640046084E
:100A10000B3C8A110A12031D312DFE308A01682019
:100A2000C0308A0168203D308A01682073308A0115
:100A3000682070308A01682065308A016820633040
:100A40008A01682069308A01682061308A01682043
:100A50006C308A01682020308A01682020308A01A9
:100A600068200800FE308A0168200F308A01682063
:100A7000FE308A01682001308A01682045308A01F1
:100A800068206E308A01682074308A0168206530E1
:100A90008A01682072308A01682020308A0168202B
:100AA00061308A01682064308A01682064308A01DC
:100AB000682072308A01682065308A0168207330AE
:100AC0008A01682073308A0168203A308A016820E0
:100AD00020308A01682020308A016820A601103069
:100AE000A7004C08A200A3018A015C21BC002508D4
:100AF000BD00A6010130A7004B08A200A3018A0196
:100B00005C21BE002508BF003C08BE073D08031855
:100B1000013EBF071030A600A7014A08A200A301AA
:100B20008A015C21C0002508C1003E08C0073F08BB
:100B30000318013EC10749084007B80041080318DF
:100B4000013EB900FE308A016820C0308A01682069
:100B50003D308A0168200430A9003808A400390813
:100B6000A5006730B000B1018A01AC2020308A01B5
:100B700068200530A9003808A4003908A5006730AE
:100B8000B000B1018A01BF20FE308A016820C13067
:100B90008A01682064008A110A120618382EFA3079
:100BA0008A01F420CC0364004C08FF3C8A110A122D
:100BB000031DDC2D0F30CC00A6011030A7004C081F
:100BC000A200A3018A015C21BC002508BD00A6018A
:100BD0000130A7004B08A200A3018A015C21BE00DE
:100BE0002508BF003C08BE073D080318013EBF07AB
:100BF0001030A600A7014A08A200A3018A015C21C7
:100C0000C0002508C1003E08C0073F080318013E88
:100C1000C10749084007B80041080318013EB90060
:100C2000FE308A016820C0308A0168203D308A0188
:100C300068200430A9003808A4003908A5006730EE
:100C4000B000B1018A01AC2020308A016820053053
:100C5000A9003808A4003908A5006730B000B10128
:100C60008A01BF20FE308A016820C1308A016820D5
:100C700064008A110A128618A52EFA308A01F4201F
:100C8000CC0A64004C08103C8A110A12031D492E3C
:100C9000CC01A6011030A7004C08A200A3018A01D4
:100CA0005C21BC002508BD00A6010130A7004B084F
:100CB000A200A3018A015C21BE002508BF003C08F8
:100CC000BE073D080318013EBF071030A600A7016C
:100CD0004A08A200A3018A015C21C0002508C100C6
:100CE0003E08C0073F080318013EC10749084007F6
:100CF000B80041080318013EB900FE308A0168209F
:100D0000C0308A0168203D308A0168200430A90083
:100D10003808A4003908A5006730B000B1018A0185
:100D2000AC2020308A0168200530A9003808A400D2
:100D30003908A5006730B000B1018A01BF20FE303C
:100D40008A016820C1308A01682064008A110A1271
:100D50000619B62EFA308A01F420FE308A01682086
:100D600014308A0168208A110A12B82E8A01CA2D0D
:100D700064008A110A120618262FFA308A01F4201C
:100D8000CB0364004B08FF3C8A110A12031DCA2ED4
:100D90000F30CB00A6011030A7004C08A200A30121
:100DA0008A015C21BC002508BD00A6010130A70016
:100DB0004B08A200A3018A015C21BE002508BF00E8
:100DC0003C08BE073D080318013EBF071030A600CF
:100DD000A7014A08A200A3018A015C21C0002508DE
:100DE000C1003E08C0073F080318013EC10749087B
:100DF0004007B80041080318013EB900FE308A01DF
:100E00006820C0308A0168203D308A0168200430A3
:100E1000A9003808A4003908A5006730B000B10166
:100E20008A01AC2020308A0168200530A9003808EA
:100E3000A4003908A5006730B000B1018A01BF20C5
:100E4000FE308A016820C2308A01682064008A115D
:100E50000A128618932FFA308A01F420CB0A640014
:100E60004B08103C8A110A12031D372FCB01A60133
:100E70001030A7004C08A200A3018A015C21BC002D
:100E80002508BD00A6010130A7004B08A200A30160
:100E90008A015C21BE002508BF003C08BE073D0852
:100EA0000318013EBF071030A600A7014A08A200A0
:100EB000A3018A015C21C0002508C1003E08C007CB
:100EC0003F080318013EC10749084007B800410820
:100ED0000318013EB900FE308A016820C0308A0143
:100EE00068203D308A0168200430A9003808A40039
:100EF0003908A5006730B000B1018A01AC2020306C
:100F00008A0168200530A9003808A4003908A50026
:100F10006730B000B1018A01BF20FE308A0168202D
:100F2000C2308A01682064008A110A120619A42FAF
:100F3000FA308A01F420FE308A01682014308A01D8
:100F400068208A110A12A62F8A01B82E64008A1519
:100F50000A1206181428FA308A01F420CA03640021
:100F60004A08FF3C8A110A12031DB82F0F30CA002D
:100F7000A6011030A7004C08A200A3018A015C2141
:100F8000BC002508BD00A6010130A7004B08A20047
:100F9000A3018A015C21BE002508BF003C08BE07F2
:100FA0003D080318013EBF071030A600A7014A08FC
:100FB000A200A3018A015C21C0002508C1003E08EF
:100FC000C0073F080318013EC10749084007B800A1
:100FD00041080318013EB900FE308A016820C03084
:100FE0008A0168203D308A0168200430A900380851
:100FF000A4003908A5006730B000B1018A01AC2017
:1010000020308A0168200530A9003808A40039087A
:10101000A5006730B000B1018A01BF20FE308A010F
:101020006820C3308A01682064008A150A12861875
:101030008128FA308A01F420CA0A64004A08103C68
:101040008A150A12031D2528CA01A6011030A7001F
:101050004C08A200A3018A015C21BC002508BD0048
:10106000A6010130A7004B08A200A3018A015C2160
:10107000BE002508BF003C08BE073D080318013E1E
:10108000BF071030A600A7014A08A200A3018A01E9
:101090005C21C0002508C1003E08C0073F080318B6
:1010A000013EC10749084007B80041080318013E46
:1010B000B900FE308A016820C0308A0168203D30C6
:1010C0008A0168200430A9003808A4003908A50066
:1010D0006730B000B1018A01AC2020308A0168205D
:1010E0000530A9003808A4003908A5006730B00011
:1010F000B1018A01BF20FE308A016820C3308A0115
:10110000682064008A150A1206199228FA308A01AA
:10111000F420FE308A01682014308A0168208A1584
:101120000A1294288A01A62F64008A150A1206184A
:101130000229FA308A01F420C90364004908FF3CFF
:101140008A150A12031DA6280F30C900A601103007
:10115000A7004C08A200A3018A015C21BC0025085D
:10116000BD00A6010130A7004B08A200A3018A011F
:101170005C21BE002508BF003C08BE073D080318DF
:10118000013EBF071030A600A7014A08A200A30134
:101190008A015C21C0002508C1003E08C0073F0845
:1011A0000318013EC10749084007B8004108031869
:1011B000013EB900FE308A016820C0308A016820F3
:1011C0003D308A0168200430A9003808A40039089D
:1011D000A5006730B000B1018A01AC2020308A013F
:1011E00068200530A9003808A4003908A500673038
:1011F000B000B1018A01BF20FE308A016820C430EE
:101200008A01682064008A150A1286186F29FA304C
:101210008A01F420C90A64004908103C8A150A12A0
:10122000031D1329C901A6011030A7004C08A20014
:10123000A3018A015C21BC002508BD00A601013084
:10124000A7004B08A200A3018A015C21BE0025086B
:10125000BF003C08BE073D080318013EBF07103021
:10126000A600A7014A08A200A3018A015C21C000D0
:101270002508C1003E08C0073F080318013EC1070A
:1012800049084007B80041080318013EB900FE3084
:101290008A016820C0308A0168203D308A016820B8
:1012A0000430A9003808A4003908A5006730B00050
:1012B000B1018A01AC2020308A0168200530A900E4
:1012C0003808A4003908A5006730B000B1018A01D0
:1012D000BF20FE308A016820C4308A016820640083
:1012E0008A150A1206198029FA308A01F420FE3084
:1012F0008A01682014308A0168208A150A1283291D
:101300008A150A129428A6011030A7004C08A200E2
:10131000A3018A015C21BC002508BD00A6010130A3
:10132000A7004B08A200A3018A015C21BE0025088A
:10133000BF003C08BE073D080318013EBF07103040
:10134000A600A7014A08A200A3018A015C21C000EF
:101350002508C1003E08C0073F080318013EC10729
:1013600049084007B80041080318013EB900380891
:10137000A0003908A1003B08A3003A088A011B21FC
:101380008A150A12031D2D2AFE308A0168200130B9
:101390008A01682049308A0168206E308A016820FD
:1013A00076308A01682061308A0168206C308A01B9
:1013B000682069308A01682064308A016820203002
:1013C0008A01682061308A01682064308A016820BF
:1013D00064308A01682072308A01682065308A0191
:1013E000682073308A01682073308A0168202030B9
:1013F0008A016820FE308A016820C0308A01682096
:101400004D308A01682061308A01682078308A0175
:10141000682020308A01682061308A0168206430A9
:101420008A01682064308A01682072308A0168204D
:101430003D308A0168200530A9003A08A4003B0825
:10144000A5006730B000B1018A01BF200B30A300B6
:10145000B8308A01F5208A01322D08008A01322530
:101460004414FE308A01682001308A01682061300E
:101470008A01682064308A01682064308A0168200B
:1014800072308A0168203D308A0168200430A9004A
:101490003808A4003908A5006730B000B1018A01FE
:1014A000AC2020308A0168200530A9003808A4004B
:1014B0003908A5006730B000B1018A01BF2064007F
:1014C000033046028A150A120318772A0730B6003D
:1014D0001030B4000730B7000830B50044088A0166
:1014E0001D2038088A011D208A010220CD004608EF
:1014F000033C031DFF30FF3ABC004608043C031DBB
:10150000FF30FF3ABE003C0884003E088A013C21BF
:10151000BE00BF004608053C031DFF30FF3AC00077
:101520003E083F04840040088A013C21C000C100FD
:101530006400400841048A150A120319BC2A3918AC
:10154000C414391CC410B9184415B91C44113919F4
:10155000C415391DC4110730B6001030B40007306F
:10156000B7000830B50044088A011D2038088A01F8
:101570001D208A010220CD004608A00005308A0106
:101580001621BC004608A0000B308A011E21BE00B7
:101590003C0884003E088A013521BE00BF0064007B
:1015A0003E083F048A150A120319EA2A0730B600DA
:1015B0001030B4000730B7000830B50044088A0185
:1015C0001D2039088A011D2038088A011D208A0142
:1015D0000220CD00FE308A016820C0308A016820D8
:1015E00064308A01682061308A01682074308A0181
:1015F000682061308A0168203D308A01682002300D
:10160000A9004D08A400A5016730B000B1018A010E
:10161000AC2020308A0168200330A9004D08A400C6
:10162000A5016730B000B1018A01BF2064008A15AE
:101630000A1206183F2BFA308A01F4200130B80252
:101640000030031C013EB902FF30A000FF30A100B2
:101650003908A30038088A0123218A150A12031DBC
:101660003C2B64000A3046028A150A1203183C2BF0
:101670003A08B8003B08B9008A150A12302A6400FB
:101680008A150A1286185C2BFA308A01F420B80AEF
:101690000319B90A3808A0003908A1003B08A300C3
:1016A0003A088A011B218A150A12031D592BB80119
:1016B000B9018A150A12302A64008A150A1286199D
:1016C000682B0130A3005E308A01F5208A019F2932
:1016D0008A150A12162B8A01322514308A01F42049
:1016E0004414FE308A01682001308A01682061308C
:1016F0008A01682064308A01682064308A01682089
:1017000072308A0168203D308A0168200430A900C7
:101710003808A4003908A5006730B000B1018A017B
:10172000AC2020308A0168200530A9003808A400C8
:101730003908A5006730B000B1018A01BF206400FC
:10174000033046028A150A120318B72B0730B60079
:101750001030B4000730B7000830B50044088A01E3
:101760001D2038088A011D208A010220CD0046086C
:10177000033C031DFF30FF3ABC004608043C031D38
:10178000FF30FF3ABE003C0884003E088A013C213D
:10179000BE00BF004608053C031DFF30FF3AC000F5
:1017A0003E083F04840040088A013C21C000C1007B
:1017B0006400400841048A150A120319FC2B3918E9
:1017C000C414391CC410B9184415B91C4411391972
:1017D000C415391DC4110730B6001030B4000730ED
:1017E000B7000830B50044088A011D2038088A0176
:1017F0001D208A010220CD004608A00005308A0184
:101800001621BC004608A0000B308A011E21BE0034
:101810003C0884003E088A013521BE00BF006400F8
:101820003E083F048A150A1203192A2C0730B60015
:101830001030B4000730B7000830B50044088A0102
:101840001D2039088A011D2038088A011D208A01BF
:101850000220CD00FE308A016820C0308A01682055
:1018600064308A01682061308A01682074308A01FE
:10187000682061308A0168203D308A01682002308A
:10188000A9004D08A400A5016730B000B1018A018C
:10189000AC2020308A0168200330A9004D08A40044
:1018A000A5016730B000B1018A01BF20FE308A0176
:1018B000682010308A016820FE308A0168201030CC
:1018C0008A016820FE308A01682010308A01682071
:1018D000FE308A01682010308A0168204D08A0007F
:1018E000A1011030A200A3018A014021C8004808CC
:1018F000A600A7011030A200A3018A015C21BC0050
:101900002508BD003C084D02C70064008A150A1274
:101910000618992CFA308A01F420C80A6400480895
:10192000103C8A150A12031D962CC8018A150A124A
:10193000762564008A150A128618AD2CFA308A01C1
:10194000F420C70A64004708103C8A150A12031DD8
:10195000AA2CC7018A150A12762564008A150A1274
:101960000619672D4410FA308A01F4201030A600C1
:10197000A7014808A200A3018A015C21BC00250838
:10198000BD003C084707CD006400033046028A15BD
:101990000A120318DC2C0730B6001030B4000730F0
:1019A000B7000830B50044088A011D2038088A01B4
:1019B0001D204D088A011B204608033C031DFF30F3
:1019C000FF3ABC004608043C031DFF30FF3ABE004E
:1019D0003C0884003E088A013C21BE00BF00460846
:1019E000053C031DFF30FF3AC0003E083F04840061
:1019F00040088A013C21C000C10064004008410445
:101A00008A150A120319212D3918C414391CC4105F
:101A1000B9184415B91C44113919C415391DC4111C
:101A20000730B6001030B4000730B7000830B500FA
:101A300044088A011D2038088A011D204D088A01AA
:101A40001B204608A00005308A011621BC0046086C
:101A5000A0000B308A011E21BE003C0884003E0815
:101A60008A013521BE00BF0064003E083F048A158C
:101A70000A1203194F2D0730B6001030B40007309A
:101A8000B7000830B50044088A011D2039088A01D2
:101A90001D2038088A011D204D088A011B20B80A24
:101AA0000319B90A3808A0003908A1003B08A300AF
:101AB0003A088A0123218A150A12031D612DB801F3
:101AC000B90114308A01F4208A150A126D2B6400C2
:101AD0008A150A128619732D0130A3005E308A011F
:101AE000F5208A019F298A150A12852C1030A6003C
:101AF000A7014808A200A3018A015C21BC002508B7
:101B0000BD003C084707CD00FE308A016820C03088
:101B10008A01682064308A01682061308A01682067
:101B200074308A01682061308A0168203D308A0162
:101B300068200230A9004D08A400A5016730B0005C
:101B4000B1018A01AC2020308A0168200330A9004D
:101B50004D08A400A5016730B000B1018A01BF2083
:101B6000FE308A01682010308A016820FE308A0128
:101B7000682010308A016820FE308A016820103009
:101B80008A016820FE308A01682010308A016820AE
:101B900008004410FE308A01682001308A01682064
:101BA00045308A01682072308A01682061308A01DC
:101BB000682073308A01682069308A0168206E309D
:101BC0008A01682067308A01682020308A016820F5
:101BD0006D308A01682065308A0168206D308A0185
:101BE00068206F308A01682072308A01682079305D
:101BF0008A01682020308A01682020308A0168200C
:101C0000FE308A016820C0308A01682043308A0192
:101C100068206F308A0168206E308A016820663043
:101C20008A01682069308A01682072308A01682040
:101C30006D308A01682020308A0168203F308A0197
:101C4000682020308A01682042308A01682075307F
:101C50008A01682074308A01682031308A01682046
:101C600020308A01682020308A01682064008A15AB
:101C70000A120618412EFA308A01F4208A150A1237
:101C80004E2E64008A150A1286184B2EFA308A01ED
:101C9000F4208A019F298A150A12362EFE308A0105
:101CA000682001308A01682045308A01682072303E
:101CB0008A01682061308A01682073308A016820B7
:101CC00069308A0168206E308A01682067308A0195
:101CD000682020308A0168206D308A0168206530D4
:101CE0008A0168206D308A0168206F308A0168207F
:101CF00072308A01682079308A01682020308A0198
:101D0000682020308A016820FE308A016820C030B7
:101D10008A01682057308A01682061308A01682072
:101D200069308A01682074308A01682020308A0175
:101D3000682020308A01682020308A016820203005
:101D40008A01682020308A01682020308A016820BA
:101D500020308A01682020308A01682020308A01E2
:101D6000682020308A01682020308A0168202030D5
:101D70008A016820C201C3014208A0004308A100F3
:101D80003B08A3003A088A0118218A150A12031D8C
:101D9000602FFF30CD006400033046028A150A121E
:101DA0000318E32E0730B6001030B4000730B70038
:101DB0000830B50044088A011D2042088A011D2010
:101DC0004D088A011B204608033C031DFF30FF3AE3
:101DD000BC004608043C031DFF30FF3ABE003C082F
:101DE00084003E088A013C21BE00BF004608053C35
:101DF000031DFF30FF3AC0003E083F048400400846
:101E00008A013C21C000C1006400400841048A15D9
:101E10000A120319282F4318C414431CC410C318F2
:101E20004415C31C44114319C415431DC411073084
:101E3000B6001030B4000730B7000830B5004408D1
:101E40008A011D2042088A011D204D088A011B209D
:101E50004608A00005308A011621BC004608A000F3
:101E60000B308A011E21BE003C0884003E088A0116
:101E70003521BE00BF0064003E083F048A150A12E7
:101E80000319562F0730B6001030B4000730B700E2
:101E90000830B50044088A011D2043088A011D202E
:101EA00042088A011D204D088A011B2014308A0136
:101EB000F420C20A0319C30A8A150A12031DBC2E94
:101EC000FE308A01682001308A0168204D308A0185
:101ED000682065308A0168206D308A0168206F3083
:101EE0008A01682072308A01682079308A0168206E
:101EF00020308A01682065308A01682072308A01AA
:101F0000682061308A01682073308A01682065305A
:101F10008A01682064308A01682020308A016820A4
:101F200020308A01682020308A016820FE308A0132
:101F30006820C0308A01682050308A0168207230E1
:101F40008A01682065308A01682073308A01682020
:101F500073308A01682020308A01682042308A016B
:101F6000682075308A01682074308A0168207430D6
:101F70008A0168206F308A0168206E308A016820EB
:101F800020308A01682034308A01682020308A019C
:101F9000682020308A01682064008A150A12861998
:101FA000D82F0130A30090308A01F5208A019F29A3
:0E1FB0008A150A12CC2F63008A150A12DB2F45
:02400E00313F40
:00000001FF