Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 1464 → Rev 1465

/NGVideo5_8/tags/V1.30/GPGGA_01_2011.txt
0,0 → 1,69
MON-VER - 0A 04 46 00 35 2E 30 30 20 20 20 20 4A 61 6E 20 30 39 20 32 30 30 36 20 31 32 3A 30 30 3A 30 30 00 01 30 30 30 34 30 30 30 31 00 00 4D 34 48 31 2E 31 20 20 4A 61 6E 20 30 39 20 32 30 30 36 20 31 35 3A 33 39 3A 35 34 00 00
CFG-ANT - 06 13 04 00 0B 00 0F 38
CFG-DAT - 06 06 02 00 00 00
CFG-FXN - 06 0E 24 00 02 00 00 00 C0 D4 01 00 C0 D4 01 00 20 BF 02 00 20 BF 02 00 00 00 00 00 40 77 1B 00 00 00 00 00 00 00 00 00
CFG-INF - 06 02 08 00 00 00 00 00 00 87 00 00
CFG-INF - 06 02 08 00 01 00 00 00 00 87 00 87
CFG-INF - 06 02 08 00 03 00 00 00 00 00 00 00
CFG-MSG - 06 01 06 00 01 01 00 00 00 00
CFG-MSG - 06 01 06 00 01 02 00 01 00 00
CFG-MSG - 06 01 06 00 01 03 00 00 00 00
CFG-MSG - 06 01 06 00 01 04 00 00 00 00
CFG-MSG - 06 01 06 00 01 06 00 01 00 00
CFG-MSG - 06 01 06 00 01 08 00 01 00 00
CFG-MSG - 06 01 06 00 01 11 00 00 00 00
CFG-MSG - 06 01 06 00 01 12 00 01 00 00
CFG-MSG - 06 01 06 00 01 20 00 00 00 00
CFG-MSG - 06 01 06 00 01 21 00 00 00 00
CFG-MSG - 06 01 06 00 01 22 00 00 00 00
CFG-MSG - 06 01 06 00 01 30 00 00 00 00
CFG-MSG - 06 01 06 00 01 31 00 00 00 00
CFG-MSG - 06 01 06 00 01 32 00 00 00 00
CFG-MSG - 06 01 06 00 02 10 00 00 00 00
CFG-MSG - 06 01 06 00 02 11 00 00 00 00
CFG-MSG - 06 01 06 00 02 20 00 00 00 00
CFG-MSG - 06 01 06 00 02 30 00 00 00 00
CFG-MSG - 06 01 06 00 02 31 00 00 00 00
CFG-MSG - 06 01 06 00 0A 01 00 00 00 00
CFG-MSG - 06 01 06 00 0A 02 00 00 00 00
CFG-MSG - 06 01 06 00 0A 03 00 00 00 00
CFG-MSG - 06 01 06 00 0A 05 00 00 01 00
CFG-MSG - 06 01 06 00 0A 06 00 00 00 00
CFG-MSG - 06 01 06 00 0A 07 00 00 00 00
CFG-MSG - 06 01 06 00 0A 08 00 00 01 00
CFG-MSG - 06 01 06 00 0A 09 00 00 00 00
CFG-MSG - 06 01 06 00 0A 0A 00 00 00 00
CFG-MSG - 06 01 06 00 0B 00 00 00 00 00
CFG-MSG - 06 01 06 00 0B 30 00 00 00 00
CFG-MSG - 06 01 06 00 0B 31 00 00 00 00
CFG-MSG - 06 01 06 00 0D 01 00 00 00 00
CFG-MSG - 06 01 06 00 0D 03 00 00 00 00
CFG-MSG - 06 01 06 00 0D 04 00 00 00 00
CFG-MSG - 06 01 06 00 F0 00 00 01 00 00
CFG-MSG - 06 01 06 00 F0 01 00 00 00 01
CFG-MSG - 06 01 06 00 F0 02 00 00 00 01
CFG-MSG - 06 01 06 00 F0 03 00 00 00 01
CFG-MSG - 06 01 06 00 F0 04 00 00 00 01
CFG-MSG - 06 01 06 00 F0 05 00 00 00 01
CFG-MSG - 06 01 06 00 F0 06 00 00 00 00
CFG-MSG - 06 01 06 00 F0 07 00 00 00 00
CFG-MSG - 06 01 06 00 F0 08 00 00 00 01
CFG-MSG - 06 01 06 00 F0 09 00 00 00 00
CFG-MSG - 06 01 06 00 F0 0A 00 00 00 00
CFG-MSG - 06 01 06 00 F1 00 00 00 00 00
CFG-MSG - 06 01 06 00 F1 01 00 00 00 00
CFG-MSG - 06 01 06 00 F1 03 00 01 00 00
CFG-MSG - 06 01 06 00 F1 04 00 00 00 00
CFG-NAV2 - 06 1A 28 00 05 00 00 00 04 04 10 03 50 C3 00 00 18 14 05 3C 00 03 00 00 FA 00 FA 00 64 00 2C 01 00 00 00 00 00 00 00 00 00 00 00 00
CFG-NMEA - 06 17 04 00 00 23 00 02
CFG-PRT - 06 00 14 00 01 00 00 00 D0 08 00 00 00 E1 00 00 03 00 02 00 00 00 00 00
CFG-PRT - 06 00 14 00 02 00 00 00 D0 08 08 00 00 E1 00 00 07 00 03 00 00 00 00 00
CFG-PRT - 06 00 14 00 03 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 00 00 00 00
CFG-RATE - 06 08 06 00 C8 00 01 00 00 00
CFG-RXM - 06 11 02 00 03 00
CFG-SBAS - 06 16 08 00 01 01 01 00 51 08 00 00
CFG-TM2 - 06 19 0C 00 00 00 00 00 E8 03 00 00 14 01 00 00
CFG-TM2 - 06 19 0C 00 01 00 00 00 E8 03 00 00 14 01 00 00
CFG-TMODE - 06 1D 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 27 00 00 80 51 01 00 10 27 00 00
CFG-TP - 06 07 14 00 40 42 0F 00 20 A1 07 00 FF 01 00 00 32 00 34 03 00 00 00 00
CFG-USB - 06 1B 6C 00 46 15 A4 01 00 00 01 00 64 00 02 00 75 2D 62 6C 6F 78 20 41 47 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 4E 54 41 52 49 53 28 72 29 20 34 20 20 2D 20 20 47 50 53 20 52 65 63 65 69 76 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/NGVideo5_8/tags/V1.30/Hexfiles/NGVideo_MEGA644.hex
0,0 → 1,2104
:100000000C949A070C94AE100C9402110C94B70740
:100010000C94B7070C94B7070C94B7070C94B70768
:100020000C94B7070C94B7070C94B7070C941B10EB
:100030000C94B7070C94CF290C94B7070C94B7070E
:100040000C94B7070C94B7070C94D8260C94B707F8
:100050000C94832A0C94B7070C94B7070C94B70739
:100060000C94B7070C94B7070C94B7070C94B70718
:10007000084AD73B3BCE016E84BCBFFDC12F3D6C0F
:1000800074319ABD56833DDA3D00C77F11BED9E475
:10009000BB4C3E916BAAAABE000000803F05A84C55
:1000A000CDB2D44EB93836A9020C50B99186880821
:1000B0003CA6AAAA2ABE000000803F2020101010F3
:1000C000102020202018181818202020201C1C1C6C
:1000D0001C202020201E1E1E1E202020201F1F1F2F
:1000E0001F20200608141314080620040A200E04FA
:1000F000040E202001010101010120201F01010146
:10010000011F20201F030303031F20201F070707D1
:10011000071F20201F0F0F0F0F1F20201F1F1F1F43
:100120001F1F202010101010101020201F20202032
:10013000201F202001010101010120201F101010AB
:10014000101F20201F181818181F20201F1C1C1CEF
:100150001C1F20201F1E1E1E1E1F20C012201C80C0
:10016000254038004B009600E10000525353492DC2
:100170004D696E00525353492D4D617800446976A4
:10018000657273697479004C4344004156310041F3
:10019000563200312E52583A00322E52583A00321E
:1001A0003535003130323300536572766F00536558
:1001B00072766F203100536572766F20320053657E
:1001C00072766F2D546573740052535349004D4B32
:1001D0002D436F636B70697400536572766F2D48A1
:1001E00079737465722E0042617564726174650082
:1001F000093556004E472D566964656F2020352E0F
:100200003847487A0A48573A200020204D2E426548
:10021000636B46573A20312E333020206765626188
:10022000640053707261636865004465757473633C
:100230006800456E676C69736368004672616E7A28
:10024000947369736368005A757281636B004156D9
:100250002D5175656C6C650052582D4B616E616C4B
:1002600000525353492D4B616C6962722E004D69E7
:100270006E20616C6C65204B616E2E004B616C6969
:10028000622E00426974746520545820617566209E
:10029000004155530045494E005765697465722009
:1002A0006D697420456E746572004B6F6E74726177
:1002B0007374004C43442D42656C65756368742EFD
:1002C000004C696368743A0020696D6D6572206145
:1002D00075730020696D6D65722065696E0020532D
:1002E000656B2E00426174746572696500552D4D11
:1002F000696E00556E74657273702E2D536574753A
:100300007000552D4F6666736574004D4B2D42612C
:10031000747465726965004261742E204E756D6D4E
:100320006572004261742E204B6170617A69748439
:100330007400492D4F666673657400492D4B6F65D7
:100340006666697A69656E7400572D4B6F656666DF
:10035000697A69656E74004B616C69627269657275
:10036000756E67006C84756674004665686C6572AE
:10037000210053656E646572206E696368742000A5
:10038000202020202020416B6B750A202020206532
:100390006E746C6164656E2100536572766F2D4BCF
:1003A000616C6962722E00536572766F2D536368BB
:1003B000726974746500536572766F2031207265BE
:1003C000762E004B616C69622E31206C696E6B7306
:1003D000004B616C69622E31207265636874730032
:1003E0004B616C69622E31204D69747465005365F0
:1003F00072766F2032207265762E004B616C6962D6
:100400002E32206C696E6B73004B616C69622E3208
:1004100020726563687473004B616C69622E3220D0
:100420004D6974746500506572696F646500546548
:1004300073742050756C736C846E676500546573BB
:100440007420666F72746C6175662E0045696E7AF1
:10045000656C736368726974746500416E7A616873
:100460006C20546573747300506175736520456E1C
:1004700064706F732E0050617573652070726F2009
:10048000496E632E005A84686C65723A0053746139
:1004900072742054657374006175730065696E0031
:1004A000416E74656E6E65206E616368662E0047EE
:1004B0005053206D6974207769323332004E4D45B8
:1004C0004120475053005458204F53442D446174E9
:1004D000656E004879737465726573650053656E67
:1004E000646520466F72646572756E67004750538D
:1004F0002D416E7A656967656E0062657265636835
:100500006E2E20446174656E00616B7475656C6C51
:100510006520506F732E005374617274706F73692D
:1005200074696F6E00456C656B74722E205765722E
:1005300074650020202020204E6F63680A20206B05
:1005400065696E6520446174656E0A202020656DC2
:100550007066616E67656E210052582D5A65697428
:100560000053657269656C6C20434F4D002C00335D
:100570002C3356004C616E67756167650047657284
:100580006D616E00456E676C697368004672656EDA
:1005900063680052657475726E0041562D536F7515
:1005A0007263650052582D4368616E6E656C00522F
:1005B0005353492D43616C6962722E004D696E2060
:1005C000616C6C204368616E2E0043616C69622E21
:1005D0000054582073776974636820004F464600C2
:1005E0004F4E00436F6E74696E756520456E74657D
:1005F0007200436F6E7472617374004261636B6763
:10060000722E204C69676874004C696768743A0000
:10061000616C77617973206F66660020616C776129
:100620007973206F6E00207365632E0042617474CD
:1006300065727900552D4D696E004C6F7720766F8D
:100640006C7461676500552D4F6666736574004D67
:100650004B2D42617474657279004261742E204E94
:10066000756D626572004261742E20436170616332
:1006700069747900492D4F666673657400492D438E
:100680006F656666696369656E7400572D436F65B3
:100690006666696369656E740043616C6962726164
:1006A00074696F6E0072756E6E696E670045727266
:1006B0006F7221005472616E736D6974746572207B
:1006C0006E6F742000202020202020416363750A73
:1006D0002020202020206C6F772100536572766FD8
:1006E0002D43616C6962722E00536572766F2D53D3
:1006F0007465707300536572766F20312072657671
:100700002E0043616C69622E31206C656674004373
:10071000616C69622E312072696768740043616C94
:1007200069622E31206D6964646C65005365727670
:100730006F2032207265762E0043616C69622E3222
:10074000206C6566740043616C69622E32207269A8
:100750006768740043616C69622E32206D6964645D
:100760006C6500506572696F646500546573742030
:100770005057005465737420636F6E74696E2E0059
:1007800053696E676C652073746570004E756D6299
:100790006572206F662074657374005061757365AF
:1007A00020656E6420706F732E0050617573652034
:1007B00070726F20696E632E00436F756E74657280
:1007C0003A0053746172742054657374006F6666E6
:1007D000006F6E2000547261636B696E6700475052
:1007E000532077697468207769323332004E4D4563
:1007F0004120475053005458204F53442D446174B6
:100800006100487973746572657365005472616E36
:10081000736D69742064656D616E64004469737002
:100820006C6179204750530063616C632E204461F2
:1008300074610063757272656E7420506F732E0060
:10084000486F6D65706F736974696F6E00456C6990
:1008500063747269632056616C2E00202020204E44
:100860006F74207965740A2020202020446174610F
:100870000A202020726563656976656421005258FC
:100880002D54696D650053657269656C6C20434F2A
:100890004D002E00332E3356004C616E6775650097
:1008A000416C6C656D616E6400416E676C6169736B
:1008B000004672616E87616973005265746F75726C
:1008C0000041562D536F757263650052582D436178
:1008D0006E616C00525353492D43616C6962722EF4
:1008E00000546F7574857A82726F0043616C69621F
:1008F0002E0000457465696E64726520547800416D
:100900006C6C756D6572205478004170702E2045B6
:100910006E74657200436F6E747261737465005219
:100920006574722E2045636C0045636C61693A0002
:1009300020457465696E740020546A7273204F4EAE
:1009400000205365632E004261747465726965000E
:10095000562D4D696E00536575696C20416C61724E
:100960006D6500562D4F6666736574004D4B2D42C4
:1009700061747465726965004261742E206E756DD4
:1009800082726F004261742E2063617061636974CA
:100990008200492D4F666673657400492D436F656B
:1009A0006666696369656E7400572D436F65666698
:1009B000696369656E740043616C69627261746930
:1009C0006F6E00456E20636F7572730045727265BD
:1009D000757221004E6F2054780020202020426143
:1009E0007474657269650A20202020666169626CF2
:1009F000652100536572766F2D43616C69627200E8
:100A00004E6272652064652050617300496E7665A0
:100A100072732E20536572766F310043616C2E2005
:100A20004761756368650043616C2E2044726F698D
:100A300074650043616C2E2043656E7472650049D5
:100A40006E766572732E20536572766F3200436145
:100A50006C2E204761756368650043616C2E2044ED
:100A6000726F6974650043616C2E2043656E747209
:100A70006500508272696F6465004C6172676575CC
:100A80007220496D702E005465737420436F6E742C
:100A9000696E75003120506173004E6F6D62726532
:100AA0002054657374730050617573652066696EB8
:100AB000616C6500506175736520706172207061B2
:100AC0007300436F6D707465723A0044826275748E
:100AD0002054657374004F4646004F4E20005472F8
:100AE00061636B696E6700475053207769746820B3
:100AF0007769323332004E4D454120475053005400
:100B000058204F53442D44617461004879737465D3
:100B1000726573697300446F6E6E826520547261F2
:100B20006E736D696500416666696368616765201B
:100B30004750530043616C63756C2047505300501D
:100B40006F732E2061637475656C6C6500486F6D02
:100B500065706F736974696F6E00906C82637472F4
:100B60002E2076616C2E0020417563756E652064C1
:100B70006F6E6E82650A2020202020726587756561
:100B8000210052582D54656D707300434F4D2E2037
:100B90005382726965002E00332E33560022022ADA
:100BA0000232023B0247024E02580261026E027C90
:100BB000028302910295029902AA02B302C102C8FD
:100BC00002D302DE02E402ED02F30202030B03177A
:100BD00003230332033B034903570364036A03728D
:100BE0000380039903A703B603C303D103E003EE15
:100BF00003FB030904180426042E043D044C045B83
:100C0000046804760485048D0498049C04A004AF51
:100C100004BD04C604D304DD04ED04FA0409051779
:100C20000525053305590561056D056F0574057DBD
:100C30000584058C0593059A05A405AF05BC05CA76
:100C400005D105DC05E005E305F205FB0509061005
:100C5000061B0626062C0634063A0646064F065A9A
:100C600006660674067D068B069906A506AD06B4D3
:100C700006C506DB06E906F50602070F071D072C69
:100C80000739074607540763076B07730780078C0C
:100C9000079B07AA07B907C207CD07D107D507DE0B
:100CA00007ED07F60702080C081C0828083308405F
:100CB000084D085B087E088608920894089908A0E9
:100CC00008A908B108BA08C108CB08D408E108EBA4
:100CD00008F208F308FF080A0915091F0929093055
:100CE000093809410947095009560963096C09780F
:100CF00009840992099B09A909B709C309CC09D438
:100D000009DA09F309000A0C0A1B0A270A330A3F09
:100D10000A4E0A5A0A660A720A7A0A870A940A9AD4
:100D20000AA70AB40AC20ACB0AD60ADA0ADE0AE716
:100D30000AF60AFF0A0B0B160B260B340B3F0B4D62
:100D40000B5A0B670B820B8B0B960B980B6B01747A
:100D5000017D0187018B018F01930199019F01A3FF
:100D600001A801AE01B601BE01C901CE01D901E75A
:100D700001F001F4010A023000303100303200305D
:100D8000330030333100303332003033330030340D
:100D900000303500303531003035320030353231F9
:100DA00000303532320030353233003035323400E5
:100DB00030353300303533310030353332003035A3
:100DC00033330030353334003036003036310030C4
:100DD0003632003036323100303632320030363280
:100DE000330030363234003036323500303633009E
:100DF0003036340030370030373100303732003091
:100E00003800303831003038320030383300303874
:100E10003331003038333200303833330030383338
:100E200034003038333500303900303A00303B0080
:100E3000303B3100303B3200303B3300303B34003C
:100E4000303B3500770D881D790D741B7C0D2B1BF5
:100E50007F0D681D820DB91E860D161F8A0DA51EF9
:100E60008E0DF11A910D481D940D3620980D251DFB
:100E70009C0D3B21A10DC721A60D5122AB0DCD220A
:100E8000B00D011DB40D3521B90DC121BE0D4B2290
:100E9000C30DC722C80DDA1CCB0D9520CF0DB61C93
:100EA000D30D1523D80D5C1ADD0D2D1AE20DFE1998
:100EB000E70DCF19EC0D8B1AF00DBA1AF40D991C31
:100EC000F70D9219FB0D5319FF0D791C020E17191E
:100ED000060EE8180A0E551C0E0E9624130E9918CD
:100EE000180E6A181D0E3B18220E0C18270E811FB3
:100EF0002A0E36252D0E251C300E341E340E341EBF
:100F0000380E341E3C0E341E400EFB1D0100000046
:100F10000A00000064000000E80300001027000041
:100F2000A086010040420F008096980000E1F50580
:100F300000CA9A3B11241FBECFEFD0E1DEBFCDBF68
:100F400012E0A0E0B1E0E0EFF1E802C005900D9200
:100F5000AC37B107D9F714E0ACE7B2E001C01D929D
:100F6000A73BB107E1F70E94B9070C94F6400C9437
:100F70000000AF92CF92EF92FF920F9388EE93E032
:100F800024EF31E0F9013197F1F70197D9F7239A6E
:100F90002B9887B18F7387B9579896B1907C81E071
:100FA00009F480E00E948F084F9904C0369902C06E
:100FB0000E94730A81B18F6181B984B1876184B95C
:100FC00080910C010E94000F80910C018093C80356
:100FD00013980E94ED0A85E085BD80916E008160C6
:100FE00080936E0083E08093B100809170008160F7
:100FF000809370008AB1837F8AB9809169008A608A
:101000008093690080917D020E94970A8AB1806373
:101010008AB98091EA02882319F084E10E94C927E5
:101020008091C9036091A80340E020E00E947026EF
:101030000E94B50A8BEB90E067E00E94AF250E940A
:10104000991582E06EE10E94D50B789480910D0194
:101050008E3F21F410920D010E94F11A0E94461752
:101060000E9456110E9461110E94B6118091810266
:101070008823B1F780E20E94A227882329F081E02B
:101080008093CB030E94881D80910C0190E061E069
:1010900070E047E050E020E000E03DEAE32E32E17E
:1010A000F32ECC24C394AA240E94FF1490910C0127
:1010B000891721F080930C010E94000F80E20E94AA
:1010C000AA27882369F28091EA02843049F60E94B7
:1010D0001035C6CF0E945E28BC017695679580E0EA
:1010E0000E94202981E060E070E00E94202908959C
:1010F0008091EA028350823068F4E0912701F0E0A9
:10110000EE0FFF1FE55AFE4F259135914591549101
:10111000C90102C080E091EE0E944B2A0895EF922F
:10112000FF920F931F93DF93CF9300D000D00F92C5
:10113000CDB7DEB7F82E80E090E00E94AA40E82EFE
:101140008E010F5F1F4FC80161E070E045E050E085
:101150000E949A40E8E8F3E13197F1F78E2D8B3445
:1011600099F4FF2041F080E091E0B8010E94064030
:10117000009709F4C3C080E091E0BE016F5F7F4F2C
:101180000E9406400097B9F080E090E06BE40E9476
:10119000C84086E090E060E00E94C84087E090E0B0
:1011A00060E10E94C84080E091E061E070E045E0CD
:1011B00050E00E94BE4088E090E06FE10E94C8408D
:1011C00089E090E065E50E94C8408AE090E060EC2C
:1011D00073E00E94DE408CE090E061E00E94C84035
:1011E0008DE090E060E00E94C8408EE090E06EEFFD
:1011F0000E94C8400FE010E08EE091E0B80148E0A6
:1012000050E00E94BE40085F1F4FE0E007341E0719
:1012100099F787E490E060E00E94C84086E191E0A1
:1012200068E470E047E050E00E94BE408DE191E04C
:101230006FE470E047E050E00E94BE4086E590E039
:1012400064E10E94C84087E590E060E00E94C840E9
:1012500088E590E060E00E94C84089E590E061E0A8
:101260000E94C8408AE590E06AE00E94C8408BE591
:1012700090E060E00E94C8408CE590E060E00E9451
:10128000C8408DE590E068E20E94C8408EE590E09D
:1012900060E00E94C8408FE590E065E00E94C84091
:1012A00086EF92E060E670E046E050E00E94BE40CB
:1012B00086E690E060E00E94C84007E610E083E721
:1012C00092E0B80149E050E00E94BE40075F1F4F26
:1012D000F0E0013C1F0799F781EC90E068E00E9484
:1012E000C84082EC90E060E50E94C84083EC90E04A
:1012F00060E50E94C840109204039EC088E090E020
:101300000E94AA408093080189E090E00E94AA40D0
:10131000809309018AE090E00E94B84090930B010D
:1013200080930A018CE090E00E94AA4080930C0117
:101330008DE090E00E94AA4080937D028EE090E0D4
:101340000E94AA4080930D0187E490E00E94AA4089
:101350008093040386E191E068E470E047E050E0A8
:101360000E949A408DE191E06FE470E047E050E028
:101370000E949A4086E590E00E94AA408093240152
:1013800088E590E00E94AA4080937E0289E590E083
:101390000E94AA40809325018AE590E00E94AA401D
:1013A000809326018BE590E00E94AA4080937F0203
:1013B0008CE590E00E94AA408093EA028DE590E0DF
:1013C0000E94AA4080936F028EE590E00E94AA409E
:1013D0008093EB028FE590E00E94AA408093270162
:1013E00086EF92E060E670E046E050E00E949A40AE
:1013F00086E690E00E94AA408093F50269E0869F0D
:10140000B001112469597F4F83E792E049E050E031
:101410000E949A4081EC90E00E94AA408093700262
:1014200082EC90E00E94AA408093710283EC90E0ED
:101430000E94AA408093720286E090E00E94AA4037
:101440008093C90387E090E00E94AA408093A8039C
:1014500080910A0190910B019093AC038093AB03B0
:1014600080917D028093C50306E111E0FF248F2D5A
:10147000F80160810E946B28F801618172818F2DD3
:101480000E947A28F801638174818F2D0E94992827
:10149000F801658176818F2D0E94B728F394095F4A
:1014A0001F4FFF2DF23019F70E946A0881E08093E8
:1014B000A7030E9478088091EA020E941F2C809165
:1014C0007602909177029093F4028093F3020F904A
:1014D0000F900F900F900F90CF91DF911F910F9170
:1014E000FF90EF9008958091C903813021F410920C
:1014F000C90380E104C081E08093C9038CE080933C
:10150000A80386E090E06091C9030E94C84087E08C
:1015100090E06091A8030E94C8400895149810922A
:10152000AA030895149A81E08093AA0308951F9353
:10153000182F813041F0813018F0823079F409C0E1
:101540008DB38C7F08C08DB38C7F8DBB0E94920AB7
:1015500005C08DB383608DBB0E948E0A812F1F91C1
:10156000089510927C022F98089580917C02882320
:1015700071F420910103309102038091080190E001
:101580002817390720F481E080937C022F9A089570
:1015900080917C02813001F580910801882319F443
:1015A0000E94B10A08958F31B8F4F8948091010334
:1015B0009091020301969093020380930103789423
:1015C00020910103309102038091080190E02817D7
:1015D000390710F00E94B10A089580E480937C00DE
:1015E00087E080937A0080917A00806880937A0007
:1015F00080917A00806480937A0080917A0086FDE1
:10160000FCCF8091780090917900089590917C00B2
:101610008F71907E892B80937C0080917A0080640A
:1016200080937A0080917A0086FDFCCF209178002B
:1016300030917900C90108954F925F926F927F9225
:101640008F929F92AF92BF92CF92DF92EF92FF92D2
:101650000F931F93CF93DF93882E962E6A01C0E0DD
:10166000D0E0442455243201EE24FF24870128E8E9
:10167000A22E23E1B22E16C0882D0E94060BA0E0F8
:10168000B0E0E80EF91E0A1F1B1F892D0E94060BF1
:10169000A0E0B0E0480E591E6A1E7B1EC5010197EE
:1016A000F1F72196CC15DD0538F34601AA24BB24B9
:1016B000C801B701A50194010E941F3EE22EC32E6E
:1016C000C301B201A50194010E941F3EC9016E2D04
:1016D0007C2DDF91CF911F910F91FF90EF90DF90C4
:1016E000CF90BF90AF909F908F907F906F905F90C2
:1016F0004F900895AF92BF92CF92DF92EF92FF92F8
:101700000F931F932C9A682F70E080E090E00E9466
:10171000963B5B016C0120E030E44CE955E40E940B
:101720000D3D7B018C017F2D912F20E030E040E8C2
:101730005FE30E94F63A87FD29C06E2D7F2D802F32
:10174000912F20E03FEF4FE757E40E94023D18162B
:10175000B4F4C601B50120E030E040E251E40E945B
:101760000D3D0E946A3B24EF31E005C0C90101979D
:10177000F1F76150704061157105C1F70CC06E2D15
:101780007F2D802F912F0E946A3B02C061E070E0A4
:10179000CB010197F1F72C981F910F91FF90EF90DB
:1017A000DF90CF90BF90AF9008959F92AF92BF927D
:1017B000CF92DF92EF92FF920F931F93DF93CF931D
:1017C0000F92CDB7DEB7982E69830E947A0B69819C
:1017D00070E080E090E00E94963B5B016C0120E0AD
:1017E00030E44CE955E40E940D3D7B018C017F2DD6
:1017F000912F20E030E040E85FE30E94F63A87FD59
:1018000029C06E2D7F2D802F912F20E03FEF4FE7D5
:1018100057E40E94023D1816B4F4C601B50120E059
:1018200030E040E251E40E940D3D0E946A3B24EF0B
:1018300031E005C0C9010197F1F7615070406115B1
:101840007105C1F70CC06E2D7F2D802F912F0E9446
:101850006A3B02C061E070E0CB010197F1F7892D8E
:101860000E947A0B0F90CF91DF911F910F91FF9003
:10187000EF90DF90CF90BF90AF909F9008950F931F
:10188000BC0180E090E044E022E001E00E945B2C9B
:101890000E9423260F9108950F93BC0180E090E0F1
:1018A00045E022E002E00E945B2C0E94232686E5B0
:1018B0000E9470250F9108958F929F92AF92BF92D0
:1018C000CF92DF92EF92FF920F931F93882E87E0C3
:1018D0000E94060B9C0140E050E060E070E080E078
:1018E00090E0F0EFAF2EE9EABE2ECC24DD24EE240A
:1018F000FF2400E010E00E948338F22E132FE42E24
:10190000D52EC62EB72EA82E992E2091090130E093
:1019100040E050E060E070E080E090E00DE00E9488
:10192000BE392F0DA1E02F1508F0A0E0E12FE30F45
:10193000F1E0E11708F0F0E03A2F3E0FA1E03E178A
:1019400008F0A0E0FA2BAE2DA40FE1E0AE1508F0F0
:10195000E0E04F2F4A0FF1E04A1708F0F0E0EF2BDC
:10196000AD2DA50FF1E0AD1508F0F0E05E2F5A0F98
:10197000E1E05A1708F0E0E0FE2BAC2DA60FE1E005
:10198000AC1508F0E0E06F2F6A0FF1E06A1708F07D
:10199000F0E0EF2BAB2DA70FF1E0AB1508F0F0E076
:1019A0007E2F7A0FE1E07A1708F0E0E0FE2BAA2DF7
:1019B000A80FE1E0AA1508F0E0E08F2F8A0FF1E010
:1019C0008A1708F0F0E0EF2B990D9E0F0DE00E94B2
:1019D0004D3979012091AB033091AC032E153F05B1
:1019E000F0F180918102882311F580910A01909194
:1019F0000B0144969093AC038093AB038091EA0271
:101A0000823011F40E94F1360E94CC2582E290E0EF
:101A10000E9451130E94232681E08093810284E179
:101A20000E947A0B80EF80938E0210928F02882D95
:101A3000813021F580918F0210918E02982F9F5F47
:101A400090938F028117D0F084E10E947A0B1330BB
:101A500018F0169510938E0210928F020FC080918D
:101A60000A0190910B018217930740F410928102B2
:101A70009093AC038093AB030E944617C7011F915C
:101A80000F91FF90EF90DF90CF90BF90AF909F901D
:101A90008F900895CF93DF9381E00E945C0CEC015E
:101AA00080918102882339F48BE060E00E94012656
:101AB000CE010E943F0CDF91CF9108958F929F92AB
:101AC000BF92CF92DF92EF92FF920F931F93CF932B
:101AD000DF93B82E6B01EA017A0100E010E09B0170
:101AE00040E050E06C177D07C8F4C801B70117E06B
:101AF000660F771F881F991F1A95D1F70E941F3E06
:101B0000309313012093120180E890E09093150127
:101B1000809314014E01EC2EC92C19C0CA01B901E1
:101B2000B7E0660F771F881F991FBA95D1F7A801F4
:101B300097010E941F3E309315012093140180E805
:101B400090E09093130180931201EC2CCD2CCB2DBF
:101B5000D0E02197A3E0CC0FDD1FAA95E1F76091BB
:101B6000120170911301CE018D5E9F4F0E94DE40E5
:101B70006091140170911501CE018B5E9F4F0E9400
:101B8000DE408E2D9C2DDF91CF911F910F91FF9004
:101B9000EF90DF90CF90BF909F908F900895FF922D
:101BA0000F931F93DF93CF93CDB7DEB762970FB636
:101BB000F894DEBF0FBECDBFF82E0E94CC258EE17B
:101BC00090E00E94511360E00E944926FF2041F1FD
:101BD00086E090E00E945113BC018E010F5F1F4F01
:101BE000C8010E940F40C80165E071E00E94FB3F00
:101BF000F80101900020E9F73197E01BD801AE0F02
:101C0000B11D8F2D805D8C93EF5FC8018E0F911DEC
:101C1000FC011082C80161E00E94492662E001C017
:101C200061E08FE190E06A8B0E9451136A890E9403
:101C3000492662960FB6F894DEBF0FBECDBFCF9196
:101C4000DF911F910F91FF9008951F93182F0E940D
:101C5000CC2580E290E00E94511360E00E9449266A
:101C600081E290E00E94511361E00E944926812F99
:101C700090E00E94511362E00E9449268EE10E948A
:101C8000102E1F9108950F931F938C0160910C01EA
:101C900070E083E0660F771F8A95E1F7695F7F4FF9
:101CA0008EE091E048E050E00E949A4080910E0161
:101CB00090910F010F972091100130911101821B1B
:101CC000930B6BE070E00E94F83D862FA62FB0E0EA
:101CD000202F312FF90120E030E090E040910E01FB
:101CE00050910F01421B530B419351939F5F2A0F59
:101CF0003B1F9C3099F765E00E94EC3D1F910F91CE
:101D00000895CF93DF93EC0180E00E94CF0D85E032
:101D100066E048EE53E00E941C0B9B01AC01CB0136
:101D2000840F951F61E080399607E0F480910C01E3
:101D3000B9010E945E0DBC0180910C0190E023E08E
:101D4000880F991F2A95E1F7875F9F4F0E94DE4019
:101D500084E06EE10E94D50BCE010E94430E809379
:101D6000A90303C08CE00E94250EDF91CF91089556
:101D70000F931F93CF93DF93182FEB0101E0811195
:101D800000E0812F0E94CF0D002311F010910C0173
:101D900085E066E048EE53E00E941C0B9B01AC011D
:101DA000CB01840F951F61E0853F9607E0F0812FFE
:101DB000B9010E945E0DBC01812F90E033E0880FD5
:101DC000991F3A95E1F7895F9F4F0E94DE400023FB
:101DD00079F084E06EE10E94D50BCE010E94430EA3
:101DE0008093A90305C0002329F08BE00E94250EF3
:101DF00081E001C080E0DF91CF911F910F910895A4
:101E00008150282F277092B1922B92B995B1922BC5
:101E100095B9886F92B1982392B995B1982395B9E5
:101E20008DEA93E00E94430E8093A9030895EF92F8
:101E3000FF920F931F93DF93CF93CDB7DEB72C970D
:101E40000FB6F894DEBF0FBECDBF8E010F5F1F4FE0
:101E5000FC01D8013FEF74E02BE0703239F0E080F4
:101E6000F180E416F50610F4232F70E27D933F5FB6
:101E700032963B3091F727FD18C0332727FD309568
:101E8000F901EE0FFF1FE80FF91F80819181841B7C
:101E9000950B70E00E94F83DFE013196E20FF31FB2
:101EA0006083653010F084E080834DE0E42EF12CF7
:101EB000EC0EFD1EF80181918F010E9470250E1518
:101EC0001F05C1F72C960FB6F894DEBF0FBECDBF2D
:101ED000CF91DF911F910F91FF90EF900895CF92D6
:101EE000DF92EF92FF920F931F93CF93DF93182F00
:101EF0006B01042F85E00E94060BBC0180E090E09E
:101F0000209112013091130140E050E00E94CD3D3C
:101F1000F7E09695879577956795FA95D1F77B01C8
:101F200086E00E94060BBC0180E090E02091140145
:101F30003091150140E050E00E94CD3DE7E09695DC
:101F4000879577956795EA95D1F7EB011230F1F413
:101F5000E616F70668F410928C028091C6038F3F54
:101F6000B9F48091A4038F3F99F40E948E0A10C0A7
:101F700081E080938C028091C6038F3F49F4809169
:101F8000A4038F3F29F40E94920A02C010938C028E
:101F9000002309F445C01230E9F49091A503809123
:101FA000C703981789F09091C6038091A4038923F1
:101FB0008F3F51F09091A50381E0992309F480E0CF
:101FC00080938D0203E707C080918C0280938D027D
:101FD00004E601C00BEFF601808191818E159F050B
:101FE00020F48C179D0708F400E282E061E00E9473
:101FF0000126C6016091A903A7010E94170F82E084
:1020000062E00E940126C6016091A903AE010E9410
:10201000170F123029F480918D02602F0E9414173F
:1020200080918C02DF91CF911F910F91FF90EF90E3
:10203000DF90CF9008951F920F920FB60F92112448
:102040002F938F939F93AF93BF9384E68093B200B7
:102050008091C6038F3F29F08091C6038F5F8093E4
:10206000C6038091A4038F3F29F08091A4038F5F62
:102070008093A40380919E0390919F0320E2803D72
:10208000920748F480919E0390919F03019690934C
:102090009F0380939E03809183028823D9F08091CF
:1020A000780290917902A0917A02B0917B028036F9
:1020B0002AEA92072BEDA20720E0B20758F4019616
:1020C000A11DB11D8093780290937902A0937A02AA
:1020D000B0937B028091EA02823029F480918202DF
:1020E000882339F431C0843079F58091A70388239F
:1020F00059F58091AA038823A1F0809188029091DC
:102100008902A0918A02B0918B020196A11DB11D96
:102110008093880290938902A0938A02B0938B02E5
:1021200013C08091840290918502A0918602B091A3
:1021300087020196A11DB11D8093840290938502B0
:10214000A0938602B0938702BF91AF919F918F9128
:102150002F910F900FBE0F901F9018951F920F9206
:102160000FB60F9211242F933F934F935F936F936A
:102170007F938F939F93AF93BF93EF93FF93809140
:10218000C6038F34A0F08091C603823580F410928C
:10219000A5038091AA03882399F08091A4038F3F1F
:1021A00079F40E948E0A81E08093C70309C081E020
:1021B0008093A5038091C703882311F40E94920A9B
:1021C0009091A5038091C703981749F48091C503A6
:1021D000882319F40E948E0A02C00E94920A10926B
:1021E000C603FF91EF91BF91AF919F918F917F9126
:1021F0006F915F914F913F912F910F900FBE0F9074
:102200001F9018951F920F920FB60F9211242F93C3
:102210003F934F935F936F937F938F939F93AF936E
:10222000BF93EF93FF938091A4038F34A0F080912C
:10223000A403823580F41092C7038091AA038823F7
:1022400099F48091C6038F3F79F40E94920A81E04D
:102250008093A50309C081E08093C7038091A50303
:10226000882311F40E948E0A9091A5038091C703E0
:10227000981749F48091C503882319F40E948E0AA7
:1022800002C00E94920A1092A403FF91EF91BF91A5
:10229000AF919F918F917F916F915F914F913F91FE
:1022A0002F910F900FBE0F901F9018958091A00353
:1022B000882331F0F8941092A00378940E944A0D7C
:1022C000089580910303882389F0F8941092030302
:1022D000789441E080918102811140E080917D02FB
:1022E0006DEA73E00E946F0F8093C503089580919B
:1022F0000703882399F0F89410920703789480914B
:102300007D026DEA73E040E00E946F0F8093C50389
:102310008091EA02833011F40E94C23608958091C0
:10232000FE028823A9F0F8941092FE02789480911E
:10233000EA02823019F40E947C3404C0843011F423
:102340000E94D63580918002853011F40E94F716E4
:1023500008950E94B50A8091A203882331F0F89471
:102360001092A20378940E94C80A08950E947711DF
:102370000E948F110E94A9118091EA02813011F40C
:102380000E94C72E08950F93BC0180E090E044E0C6
:1023900022E002E00E945B2C0E9423260F91089508
:1023A0000F9322E330E0829FB001839F700D929FD4
:1023B000700D112480E090E044E020E000E00E94F5
:1023C0005B2C0E94232688E291E00E9423260F9135
:1023D00008950F93BC0180E090E043E020E000E02E
:1023E0000E945B2C0E9423260F9108950F938A3040
:1023F000910568F0BC0180E090E043E021E001E05D
:102400000E945B2C0E9423268CE291E00EC024E601
:1024100030E0AC01429FC001439F900D529F900D50
:1024200011240E94E9118FE291E00E9423260F916E
:1024300008950F931F93CF93DF93EC010E945E28C2
:1024400096958795BE01681B790B882777FD809547
:10245000982F44E020E000E00E945B2C0E9423269D
:102460008091CA03BE010E94B7281091CA030E943E
:102470005E28BC0176956795812F0E942029DF9107
:10248000CF911F910F910895CF93DF93EC010E949C
:10249000E9118091CA03BE010E947A288091CA0383
:1024A00090E0FC0133E0EE0FFF1F3A95E1F7E81BE7
:1024B000F90BEA5EFE4F8081882321F00E945E289E
:1024C000BC0102C060E070E08091CA030E94202934
:1024D000DF91CF9108950F931F93CF93DF938C01DA
:1024E0000E945E28EC01C8010E94E9118091CA0394
:1024F000B8010E9499288091CA03282F30E0F90181
:1025000043E0EE0FFF1F4A95E1F7E21BF30BEA5E93
:10251000FE4F9081992311F0C0E0D0E0BE010E94EF
:102520002029DF91CF911F910F9108950F93992743
:1025300087FD909505979C01B901882777FD8095C7
:10254000982F44E021E001E00E945B2C0E942326AA
:1025500081E40E9470250F9108950F931F93DF93DC
:10256000CF93CDB7DEB72E970FB6F894DEBF0FBE70
:10257000CDBF8C01DE011196E0ECF1E08EE0019020
:102580000D928150E1F7802F805D0E94702582E3DB
:1025900091E00E942326F8013197EE0FFF1FEC0F08
:1025A000FD1F818192810E94232685E391E00E9494
:1025B00023262E960FB6F894DEBF0FBECDBFCF9167
:1025C000DF911F910F9108950F931F93DF93CF9386
:1025D000CDB7DEB727970FB6F894DEBF0FBECDBFDD
:1025E000FC01EE0FFF1FE55AFE4F85919591A591D5
:1025F000B491BC0180E090E08E010F5F1F4FA801F5
:102600002AE030E00E945E40C80161E00E94492655
:1026100027960FB6F894DEBF0FBECDBFCF91DF91E6
:102620001F910F910895DF93CF930F92CDB7DEB72F
:10263000682F69830E94E9118091C90369810E9412
:10264000E8250F90CF91DF9108950F931F93CF93BB
:10265000DF93809149018823F9F0C0E0D0E08E013A
:10266000000F111F000F111FF801EC5BF14F2591B6
:10267000349189E491E0B9010E94E63F009741F46A
:102680000A5B114FF80185919491FC01099504C0F2
:102690002196C233D10519F7DF91CF911F910F9188
:1026A00008958834910540F0FC01EE0FFF1FE354BC
:1026B000F34F259134911BC020910D01213031F051
:1026C000FC01EE0FFF1F223071F408C0FC01EE0F79
:1026D000FF1FE35DF34F2591349109C0E354F34F9D
:1026E0002591349104C0E356F44F2591349181EA49
:1026F00092E0B9010E94EF3F81EA92E00895DF93F2
:10270000CF9300D00F92CDB7DEB7DE011196E0E88F
:10271000F1E023E001900D922150E1F7FE01E80F76
:10272000F91F818190E00E94511361E00E944926C7
:102730000F900F900F90CF91DF910895CF93DF937B
:10274000EC01009741F486E390E00E94511361E0B0
:102750000E9449260AC085E061E00E940126CE0160
:102760000E94E91180E20E947025DF91CF910895C7
:10277000CF93DF93EC010E949E13209741F088E0F5
:1027800061E00E9401268FE291E00E942326DF9102
:10279000CF910895009719F483E590E002C084E595
:1027A00090E00E9451130E9423260895DF93CF9357
:1027B00000D0CDB7DEB720E5298321E52A83FE01CD
:1027C000E80FF91F818190E00E94511361E00E949F
:1027D00049260F900F90CF91DF910895009719F43B
:1027E00086E390E002C087E390E00E9451130E94CC
:1027F000232608950F931F93DF93CF9300D000D02B
:102800000F92CDB7DEB7009721F08F31910539F4E3
:1028100003C081E190E01DC082E190E01AC09C01FC
:10282000220F331F43E0880F991F4A95E1F7820F6B
:10283000931F8E010F5F1F4FB8014AE050E00E94C6
:102840003D4080E20E947025C8010E94232683E15A
:1028500090E00E9451130E9423260E94D6250F90DB
:102860000F900F900F900F90CF91DF911F910F91CC
:102870000895DF93CF9300D0CDB7DEB726E3298349
:102880002DE32A83FE01E80FF91F818190E00E9469
:10289000511361E00E9449260F900F90CF91DF9174
:1028A0000895DF93CF9300D000D00F92CDB7DEB75D
:1028B000DE011196E5E9F1E025E001900D9221504D
:1028C000E1F7FE01E80FF91F818190E00E945113AA
:1028D00061E00E9449260F900F900F900F900F908B
:1028E000CF91DF910895DF93CF9300D00F92CDB7B2
:1028F000DEB7DE011196EAE9F1E023E001900D92E6
:102900002150E1F7FE01E80FF91F818190E00E945C
:10291000511361E00E9449260F900F900F90CF91C4
:10292000DF910895EF92FF920F931F93CF93DF9360
:102930008C01FC0180818823F1F0C0E0D0E07E01B1
:10294000EE0CFF1CEE0CFF1CF701EC5BF14F259128
:102950003491C801B9010E94E63F009741F4F701A4
:10296000EA5BF14F85919491FC01099504C0219691
:10297000C233D10521F7DF91CF911F910F91FF90C5
:10298000EF9008950E94B61180E00E945C0C80E2F6
:102990000E94AA27882321F480918102882321F0B4
:1029A0001092490181E0089580E008950F931F93EC
:1029B000CF93DF93EC01662319F0162F115001C05D
:1029C000188100E082E0602F0E940126FE01E10FE5
:1029D000F11D818190E00E9451130E9423260E94E4
:1029E000D6258881181710F41F5F01C010E00F5F13
:1029F000033041F7DF91CF911F910F9108956F92AE
:102A00007F928F929F92AF92CF92EF92FF920F930D
:102A10001F93CF93DF93EC013B014A01122F80E417
:102A20000E948C27882329F480E40E94972788231A
:102A300089F0C815D90528F421968A2D0E94AF2760
:102A400002C0C110E301812F602F0E940126CE0138
:102A5000F701099580E80E948C27882329F480E8F3
:102A60000E949727882389F06C167D0628F4219709
:102A70008A2D0E94AF2702C0C110E401812F602F70
:102A80000E940126CE01F7010995CE01DF91CF9179
:102A90001F910F91FF90EF90CF90AF909F908F90EC
:102AA0007F906F9008950F931F93182F90E00E94CE
:102AB0005113DC010D900020E9F71197A81BA031FC
:102AC000E0F420E130E02A1B310935952795022FEB
:102AD0002230A0F0822F825060E00E94012689E31C
:102AE00091E00E942326812F90E00E9451130E94C2
:102AF000232680E20E94702516C000E080E060E09E
:102B00000E9401268AE20E947025802F60E00E94C8
:102B10000126812F90E00E9451130E9423268FE00E
:102B200060E00E9401268AE20E9470251F910F91A9
:102B3000089580E060E00E9401268BE590E00E940D
:102B400051130E9423268091C903882319F487E436
:102B500090E002C08AE590E00E9451130E94232673
:102B60008CE590E00E9451130E9423268EE10E9482
:102B7000102E0E94CC25089510929102E2E9F2E015
:102B800087E0819392E0E03AF907D9F786E08093F5
:102B9000A002CF010F970895DF92EF92FF920F935B
:102BA0001F93CF93DF938C017B01D42E0E94BC1521
:102BB000EC01980117FF04C022273327201B310B9B
:102BC000C901E3E0880F991FEA95E1F7821B930B97
:102BD000B7010E940C3E462FE62FFF27E7FDF09538
:102BE000EE9DC001EF9D900DFE9D900D112469EFAB
:102BF0007FEF0E940C3E620F731F23E230E0629F62
:102C0000C001639F900D729F900D1124B7010E9427
:102C10000C3E65300CF064E017FF0DC088E0841BAB
:102C200016167CF4E82FFF27E7FDF095EC0FFD1F4B
:102C30003197608306C016161CF4EC0FFD1F6087E9
:102C400088E0E82FFF27E7FDF095EC0FFD1F80E0FF
:102C500095E002C091938F5F8417E4F380E06D2DBF
:102C60000E94012600E189910E9470250150D9F748
:102C7000DF91CF911F910F91FF90EF90DF9008951A
:102C8000EF92FF92CF93DF93E091CC0397FF0DC0BB
:102C9000E901C61BD70BE130A9F41092CC0383EFF6
:102CA00090E065E00E94AF250DC0EA01C21BD30B86
:102CB000EE2341F483E391E065E00E94AF2581E0DB
:102CC0008093CC03CE01DF91CF91FF90EF900895D8
:102CD000CF92DF92EF92FF920F931F93DF93CF93E8
:102CE00000D00F92CDB7DEB77C01DE011196EFE286
:102CF000F1E083E001900D928150E1F78091CA03E9
:102D0000B7010E94F7288091040390E0FC01EE0FC8
:102D1000FF1FE80FF91FEE0FFF1FE850FE4F248141
:102D200035818701021B130B6081718142815381C0
:102D3000C8010E9440166C01C801B60142E00E9421
:102D4000CC15B801882777FD8095982F28EE33E0C1
:102D500040E050E00E94CD3D9601442737FD40956C
:102D6000542F0E94413E690181E061E00E940126EA
:102D7000C7010E9437288C0183E0083E180750F4F1
:102D800085E789838CE391E00E942326C8010E9495
:102D9000E9110AC0B80180E090E045E023E003E0DB
:102DA0000E945B2C0E942326CE0101960E942326BE
:102DB00088E061E00E940126B601882777FD8095B2
:102DC000982F46E021E001E00E945B2C0E94232620
:102DD00085E20E9470250F900F900F90CF91DF91A8
:102DE0001F910F91FF90EF90DF90CF90089586E0B4
:102DF00061E00E94012660918402709185028091B9
:102E00008602909187020E94882E86E062E00E94EE
:102E10000126609188027091890280918A029091C6
:102E20008B020E94882E08950F931F93182F062F50
:102E3000823078F462E0681B8FE00E94012680E215
:102E40000E947025612F6F5F8FE00E940126802F06
:102E50000CC08FE061E00E94012680E20E94702594
:102E60008FE062E00E94012680E20E9470251F919F
:102E70000F91089580917D02823010F46BEF01C0B4
:102E800064E68091C5030E941417089510924901C9
:102E90000E94CC25809181028823A1F40E94CC2538
:102EA00080910C0190E00E94AD128FE060E00E94E2
:102EB00001268FE391E00E9423260E943A170E9488
:102EC0004A0D089582E290E00E94511360E00E9452
:102ED00049260895823058F08150E82FF0E0E75BF2
:102EE000FE4F808180538093CB03108208950E940F
:102EF000461708952F923F924F925F926F927F9262
:102F00008F929F92AF92BF92CF92DF92EF92FF92F9
:102F10000F931F93DF93CF9300D00F92CDB7DEB7FF
:102F20009B838A831B012A013801FC0180809180E8
:102F3000122F1F70812F61E029830E940126C40196
:102F4000F30109958091490129818823D1F489E40D
:102F500091E065E471E00E940F40298112C0EA818E
:102F6000FB8180819181B101A201212F01E07301D8
:102F7000CB2CAD2C0E94FF14EA81FB8191838083CE
:102F800006C080E4B82EB22200E8D02ED22280E221
:102F90000E94A227882341F40E94C214882321F4AE
:102FA000809190028823D9F20E94CC2580919002D2
:102FB000882339F010929002EA81FB81918280820D
:102FC0000CC089E491E0FC0101900020E9F7CF01F9
:102FD0000197895491400E946A1781E0EA81FB8140
:102FE000208131818216930609F480E00F900F90C2
:102FF0000F90CF91DF911F910F91FF90EF90DF9095
:10300000CF90BF90AF909F908F907F906F905F9088
:103010004F903F902F9008950F931F93DF93CF937E
:1030200000D0CDB7DEB78DE10E94531580917202BA
:1030300089831A82CE0101966EE170E048EC50E07F
:1030400026E803EC11E10E947A17882359F0698180
:103050006093720283EC90E00E94C84084E06EE1CD
:103060000E94D50B0E9425130F900F90CF91DF91F6
:103070001F910F9108950F931F93DF93CF9300D06B
:10308000CDB7DEB78CE10E94531580917102898320
:103090001A82CE0101966EE170E048EC50E026E81D
:1030A00003EC11E10E947A17882359F0698160933B
:1030B000710282EC90E00E94C84084E06EE10E94C0
:1030C000D50B0E9425130F900F90CF91DF911F9188
:1030D0000F9108950F931F93DF93CF9300D0CDB737
:1030E000DEB78BE10E9453158091700289831A82AA
:1030F000CE01019660E070E044E150E025E806E989
:1031000012E10E947A17882359F069816093700256
:1031100081EC90E00E94C84084E06EE10E94D50BF3
:103120000E9425130F900F90CF91DF911F910F9167
:103130000895EF92FF920F931F93DF93CF9300D0E8
:10314000CDB7DEB78AE10E94531580917402909149
:10315000750222E3E22EF12CB7010E94F83D7A833A
:103160006983CE01019664E170E048E750E025E80C
:1031700000ED11E10E947A178823F9F029813A8144
:103180002E9DC0012F9D900D3E9D900D112490937A
:103190007502809374026091F50289E0689FB00126
:1031A000112469597F4F83E792E049E050E00E9483
:1031B000BE4084E06EE10E94D50B0E9425130F9063
:1031C0000F90CF91DF911F910F91FF90EF90089595
:1031D0000F931F93DF93CF9300D0CDB7DEB787E176
:1031E0000E9453158091090189831A82CE010196AC
:1031F00060E070E048EC50E024E80CE41CE00E9441
:103200007A17882359F069816093090189E090E079
:103210000E94C84084E06EE10E94D50B0E942513F5
:103220000F900F90CF91DF911F910F9108950F9301
:103230001F93DF93CF9300D0CDB7DEB785E10E9417
:10324000531580910A0190910B019A838983CE01D5
:10325000019666E272E048E755E024E80CE41CE0E1
:103260000E947A178823B1F069817A8170930B01EB
:1032700060930A018AE090E00E94DE4080910A019A
:1032800090910B019093AC038093AB0384E06EE1CB
:103290000E94D50B0E9425130F900F90CF91DF91C4
:1032A0001F910F9108950F931F93DF93CF9300D039
:1032B000CDB7DEB78FE00E94531580E061E00E9439
:1032C000012680E190E00E9451130E942326809104
:1032D000080189831A82CE01019660E070E04FE117
:1032E00050E026E80AEF13E10E947A17882389F05C
:1032F00069816093080188E090E00E94C84084E002
:103300006EE10E94D50B80910801882311F40E9480
:10331000B10A0E9425130F900F90CF91DF911F915A
:103320000F9108950F931F93DF93CF9300D0CDB7E4
:10333000DEB78BE40E94531582E061E00E94012613
:103340008EE090E00E9451130E94232682E391E0D8
:103350000E9423268091A80389831A82CE010196B8
:1033600060E070E04EE150E02BE003E113E10E94E9
:103370007A17882359F069816093A80387E090E069
:103380000E94C84084E06EE10E94D50B0E94251384
:103390000F900F90CF91DF911F910F9108950F9390
:1033A0001F93DF93CF9300D0CDB7DEB783E30E94A6
:1033B000531580917F0289831A82CE01019660E0C5
:1033C00070E048EC50E025E808EB13E10E947A1722
:1033D000882359F0698160937F028BE590E00E9419
:1033E000C84084E06EE10E94D50B0E9425130F9027
:1033F0000F90CF91DF911F910F9108950F931F931D
:10340000DF93CF9300D0CDB7DEB782E30E94531590
:103410008091260189831A82CE01019664E070E0D2
:1034200044E150E025E806EF11E10E947A17882375
:1034300059F06981609326018AE590E00E94C840B6
:1034400084E06EE10E94D50B0E9425130F900F902F
:10345000CF91DF911F910F9108950F931F93DF93E9
:10346000CF9300D0CDB7DEB781E30E945315809192
:10347000250189831A82CE01019661E070E044E65D
:1034800050E025E809EE11E10E947A17882359F0EF
:1034900069816093250189E590E00E94C84084E03D
:1034A0006EE10E94D50B0E9425130F900F90CF91D3
:1034B000DF911F910F9108950F931F93DF93CF9387
:1034C00000D0CDB7DEB780E30E94531580917E0215
:1034D00089831A82CE01019660E070E044E150E0F9
:1034E00025E80EE913E10E947A17882359F06981D3
:1034F00060937E0288E590E00E94C84084E06EE11F
:103500000E94D50B0E9425130F900F90CF91DF9151
:103510001F910F9108950F931F93DF93CF9300D0C6
:10352000CDB7DEB782E50E9453158091CA03898327
:103530001A82CE01019660E070E041E050E024E0A4
:103540000AEC13E10E947A17882359F0698160938D
:10355000CA0387E590E00E94C84084E06EE10E94C3
:10356000D50B0E9425130F900F90CF91DF911F91E3
:103570000F9108950F931F93DF93CF9300D0CDB792
:10358000DEB78DE20E94531588E061E00E940126BB
:103590008FE291E00E9423268091240189831A8280
:1035A000CE0101966AE070E04EE150E025E809EEB8
:1035B00011E10E947A17882359F0698160932401F0
:1035C00086E590E00E94C84084E06EE10E94D50B41
:1035D0000E9425130F900F90CF91DF911F910F91B3
:1035E00008950F931F93DF93CF9300D0CDB7DEB72D
:1035F00080E00E94531580910D0189831A828EE02C
:1036000090E00E94AA4080930D01CE01019660E0F7
:1036100070E042E050E023E00FE713E10E947A17E8
:1036200069817A8180910D0190E06817790751F0E6
:1036300060930D018EE090E00E94C84084E06EE14E
:103640000E94D50B0E9425130F900F90CF91DF9110
:103650001F910F9108950F931F93DF93CF9300D085
:10366000CDB7DEB786E00E94531580910C018983A7
:103670001A82CE01019661E070E047E050E023E05D
:103680000DEA12E10E947A17882341F48091C80361
:1036900090E029813A8128173907E9F06981609320
:1036A0000C016093C8038CE090E00E94C84084E065
:1036B0006EE10E94D50B80910C010E94000F809159
:1036C0004901882341F460E00E94012680910C01A9
:1036D00090E00E94AD120E9425130F900F90CF91A1
:1036E000DF911F910F9108950F931F93DF93CF9355
:1036F00000D0CDB7DEB785E00E94531580917D02E2
:1037000089831A82CE01019660E070E042E050E0C9
:1037100023E003E714E10E947A178823C9F0F894A4
:10372000698160937D028DE090E00E94C84084E052
:103730006EE10E94D50B80917D020E94970A8093D2
:10374000C50380914901882311F40E943A177894A7
:103750000E9425130F900F90CF91DF911F910F9131
:1037600008951F93CF93DF93EC01162F0E94CC2571
:1037700080E061E00E9401268CEF0E94702523C04A
:1037800080E40E948C27882329F480E40E949727F4
:10379000882349F0112311F0115001C01881CE0186
:1037A000612F0E94D61480E80E948C27882329F478
:1037B00080E80E949727882351F08881181710F419
:1037C0001F5F01C010E0CE01612F0E94D61480E27D
:1037D0000E94A227882341F40E94C214882321F466
:1037E00080919002882361F20E94CC258091900202
:1037F000882319F01093CB0322C0E9E4F1E0019093
:103800000020E9F73197E954F1408E2F112311F090
:10381000EE2319F40E946A1712C091E09093CB0333
:10382000AE2FB0E0A75BBE4F105D1C938F5FE82FFB
:10383000F0E0E75BFE4F108281E00E947A0B10926D
:103840009002DF91CF911F910895DF93CF93CDB771
:10385000DEB727970FB6F894DEBF0FBECDBFDE01EF
:103860001196EFE4F1E087E001900D928150E1F7CD
:103870008091EA02843021F4898384E48E8304C039
:10388000823011F083E08983CE0101966091CB03F1
:103890000E94B11B0E94251327960FB6F894DEBF35
:1038A0000FBECDBFCF91DF910895DF93CF93CDB7FA
:1038B000DEB727970FB6F894DEBF0FBECDBFDE018F
:1038C0001196E6E5F1E087E001900D928150E1F775
:1038D000CE0101966091CB030E94B11B0E9425137B
:1038E00027960FB6F894DEBF0FBECDBFCF91DF9104
:1038F0000895DF93CF9300D000D00F92CDB7DEB7FD
:10390000DE011196EDE5F1E085E001900D92815028
:10391000E1F7CE0101966091CB030E94B11B0E949A
:1039200025130F900F900F900F900F90CF91DF9174
:103930000895DF93CF9300D000D0CDB7DEB782E0FB
:10394000898384E08A838EE08B838FE08C83CE0131
:1039500001966091CB030E94B11B0E9425130F902A
:103960000F900F900F90CF91DF910895DF93CF9339
:10397000CDB7DEB727970FB6F894DEBF0FBECDBF29
:10398000DE011196E2E6F1E087E001900D928150B0
:10399000E1F7CE0101966091CB030E94B11B0E941A
:1039A000251327960FB6F894DEBF0FBECDBFCF917B
:1039B000DF910895DF93CF9300D000D000D0CDB732
:1039C000DEB7DE011196E9E6F1E086E001900D92A6
:1039D0008150E1F7CE0101966091CB030E94B11BAB
:1039E00087E590E00E94AA408093CA030E942513B5
:1039F00026960FB6F894DEBF0FBECDBFCF91DF91F4
:103A00000895DF93CF9300D000D000D0CDB7DEB7BC
:103A1000DE011196EFE6F1E086E001900D92815013
:103A2000E1F7CE0101966091CB030E94B11B81E0CA
:103A30008093CA030E94251326960FB6F894DEBF22
:103A40000FBECDBFCF91DF910895DF93CF9300D00C
:103A500000D000D0CDB7DEB7DE011196E5E7F1E08A
:103A600086E001900D928150E1F7CE0101966091C0
:103A7000CB030E94B11B1092CA030E942513269605
:103A80000FB6F894DEBF0FBECDBFCF91DF91089582
:103A9000DF93CF9300D000D00F92CDB7DEB7DE0119
:103AA0001196EBE7F1E085E001900D928150E1F78E
:103AB000CE0101966091CB030E94B11B0E94251399
:103AC0000F900F900F900F900F90CF91DF9108956E
:103AD000DF93CF9300D000D00F92CDB7DEB7DE01D9
:103AE0001196E3E8F1E085E001900D928150E1F755
:103AF000CE0101966091CB030E94B11B0E94251359
:103B00000F900F900F900F900F90CF91DF9108952D
:103B1000DF93CF93CDB7DEB72D970FB6F894DEBF06
:103B20000FBECDBFDE011196E8E8F1E08DE0019017
:103B30000D928150E1F78091EA02823079F0833072
:103B400018F48130C9F405C0833089F08430A1F4C1
:103B50000BC088E58C8789818F5F04C08BE38C87DD
:103B600089818E5F898308C089818F5F898389817C
:103B70008F5F898385E48C8789E491E065E471E057
:103B80000E940F40CE0101966091CB030E94B11BB1
:103B90000E9425132D960FB6F894DEBF0FBECDBF41
:103BA000CF91DF91089580E20E94A227882341F4FB
:103BB0000E94C214882321F480919002882399F3F3
:103BC0000E94CC2580914901882319F40E94461750
:103BD00003C081E00E947A0B80914901882331F073
:103BE00081E090E020919002222311F080E090E0AB
:103BF00010929002089584E40E94531580E061E0E1
:103C00000E9401268EE490E00E9451130E94232618
:103C100080E062E00E9401268FE490E00E94511350
:103C20000E9423260E94F7168091EA02843021F434
:103C300080918002843011F085E001C084E080939F
:103C4000CB0385E0809380020E94D31D882339F046
:103C5000E9E4F1E001900020E9F732971082109238
:103C600080020E9425130895CF93DF93C9E4D1E029
:103C700009900020E9F72197C954D1409E012150B5
:103C8000C22FD0E0FE01E75BFE4F8081805380931E
:103C900080029091EA02943029F4843019F485E38B
:103CA000808316C08093CB0391E09093A603843069
:103CB00031F083E490E00E9451130E9423260E9479
:103CC000D31D882319F0C75BDE4F18821092800243
:103CD0000E942513DF91CF910895FF920F931F93B8
:103CE000DF93CF93CDB7DEB764970FB6F894DEBFFE
:103CF0000FBECDBFF82E8AE090E00E945113BC01A8
:103D00008E010F5F1F4FC8010E940F408F2D90E062
:103D10000E945113BC01C8010E94FB3FC80161E031
:103D20000E9449268DE090E00E94511362E00E94BB
:103D3000492664960FB6F894DEBF0FBECDBFCF9173
:103D4000DF911F910F91FF90089589E40E94531510
:103D50008CE00E946D1E0E94D31D882339F08DEAED
:103D600093E00E94810E0E94461708950E94251339
:103D7000089588E40E9453158BE00E946D1E0E94F6
:103D8000D31D882341F080E06DEA73E00E94B80EF5
:103D90000E94461708950E9425130895EF92FF92FE
:103DA0000F931F93DF93CF93CDB7DEB761970FB615
:103DB000F894DEBF0FBECDBF7C010E94CC2589E008
:103DC00090E00E945113BC018E010F5F1F4FC8018C
:103DD0000E940F40C80167E471E00E94FB3F80E24F
:103DE00090E00E945113BC01C8010E94FB3FC80132
:103DF00060E00E94492686E090E00E94511361E055
:103E00000E944926C70162E00E9449268EE10E9475
:103E1000102E61960FB6F894DEBF0FBECDBFCF91C6
:103E2000DF911F910F91FF90EF900895DF92EF9235
:103E3000FF920F931F93DF93CF93CDB7DEB72F97EA
:103E40000FB6F894DEBF0FBECDBF88E00E945315B9
:103E50008BE00E946D1E0E94D31D8823C1F1FF24B8
:103E6000F394EE248E010F5F1F4F3CE2D32E8F2D73
:103E70000E94000F8F2D6DEA73E00E94B80E882318
:103E800061F4F801EE0DF11D8F2D805D8083E394C8
:103E9000F801EE0DF11DD082E394F3948F2D88305C
:103EA00031F780910C010E94000F84E06EE10E94C6
:103EB000D50BEE2049F0EA94CE010196FC01EE0DFF
:103EC000F11D10820E94CE1E0E94461702C00E9461
:103ED00025132F960FB6F894DEBF0FBECDBFCF913E
:103EE000DF911F910F91FF90EF90DF9008958091E7
:103EF000EA02882329F484E00E94102E0E94F1280F
:103F000008950F931F93DF93CF9300D0CDB7DEB703
:103F100088E30E9453158091EA0289831A82CE01B8
:103F2000019660E070E044E050E023E001E514E138
:103F30000E947A17882399F1F89489818093EA0284
:103F400078948CE590E06091EA020E94C84084E099
:103F50006EE10E94D50B8091EA020E941F2C81E045
:103F60008093A70310928402109285021092860219
:103F700010928702109288021092890210928A028F
:103F800010928B020E946A088091EA02882319F03D
:103F900084E10E94C9270E94771F0E9478080E942E
:103FA00025130F900F90CF91DF911F910F910895DE
:103FB000EF92FF920F931F93CF93DF93E82EC6E10A
:103FC000D1E008E410E0FF2449815A812B813C8133
:103FD0008D819E81EE2089F456954795569547959B
:103FE0005A83498336952795369527953C832B83AD
:103FF000969587959695879511C0440F551F440F48
:10400000551F5A834983220F331F220F331F3C83CE
:104010002B83880F991F880F991F03969E838D838A
:1040200069817A818F2D0E947A286B817C818F2D06
:104030000E9499286D817E818F2D0E94B728CE0124
:10404000B80147E050E00E94BE40F3942796095F14
:104050001F4F8F2D823009F0B7CF0E946A08DF9181
:10406000CF911F910F91FF90EF9008950F931F93A1
:10407000DF93CF9300D0CDB7DEB784E20E94531513
:1040800088E061E00E9401268091040389831A82FE
:10409000CE01019660E070E041E050E025E006EDE1
:1040A00013E10E947A178823B1F0F8946981609334
:1040B000040387E490E00E94C840809104030E94BA
:1040C000D81F84E10E94C92778940E94771F84E05A
:1040D0006EE10E94D50B0E9425130F900F90CF9197
:1040E000DF911F910F9108951F931091EA02109292
:1040F000EA020E94C92780E060E00E940126812F29
:104100001F910895DF93CF930F92CDB7DEB78983C8
:104110000E946A0889818093EA020E94771F0E94A8
:1041200025130F90CF91DF910895FF920F931F9366
:10413000DF93CF9300D0CDB7DEB7809124010E94EA
:104140007420F82E83EF90E068E00E94AF25109273
:10415000CC038EE20E9453158091040390E0FC0191
:10416000EE0FFF1FE80FF91FEE0FFF1FE850FE4F85
:10417000848195819A838983608171814281538191
:10418000CE01019624E808E616E10E947A178BEB2F
:1041900090E067E00E94AF25F89484E10E94C9276F
:1041A00078948F2D0E9482200F900F90CF91DF91F5
:1041B0001F910F91FF900895FF920F931F93DF932C
:1041C000CF9300D0CDB7DEB784E10E947420F82EE3
:1041D0008091CA0390E0FC0103E0EE0FFF1F0A95F7
:1041E000E1F7E81BF90BEA5EFE4F808189831A82B2
:1041F000CE01019660E070E041E050E026E00EEE76
:1042000013E10E947A17882329F18091CA036981FA
:10421000282F30E0F90113E0EE0FFF1F1A95E1F7A8
:10422000E21BF30BEA5EFE4F60830E946B289091C5
:10423000CA0387E0989FC0011124BC01685B7F4FCF
:104240008A5E9E4F47E050E00E94BE4084E06EE1EF
:104250000E94D50B8F2D0E9482200F900F90CF913E
:10426000DF911F910F91FF90089589E20E945315ED
:104270000E94DC20089585E20E9453150E94DC20F4
:104280000895FF920F931F93DF93CF9300D0CDB784
:10429000DEB784E10E947420F82E1091CA030E94B8
:1042A0005E28BC01812F0E9420298091CA0390E0E2
:1042B000FC0173E0EE0FFF1F7A95E1F7E81BF90BA5
:1042C000EA5EFE4F838194819A83898380910403FF
:1042D00090E0FC01EE0FFF1FE80FF91FEE0FFF1F2C
:1042E000EE0FFF1FE052FE4F6481758146815781BA
:1042F000CE01019626E80BE612E10E947A17882388
:10430000A9F18091CA03282F30E0F90143E0EE0FB4
:10431000FF1F4A95E1F7E21BF30BEA5EFE4F29818E
:104320003A813483238397E0899FC0011124BC0123
:10433000685B7F4F8A5E9E4F47E050E00E94BE4020
:104340008091CA03282F30E0F90193E0EE0FFF1FA0
:104350009A95E1F7E21BF30BEA5EFE4F65817681E9
:104360000E94B72884E06EE10E94D50B8F2D0E9439
:1043700082200F900F90CF91DF911F910F91FF90AE
:1043800008958AE20E9453150E944121089586E211
:104390000E9453150E9441210895FF920F931F938D
:1043A000DF93CF9300D0CDB7DEB784E10E947420B5
:1043B000F82E8091CA0360E070E00E94202980916D
:1043C000CA0390E0FC0123E0EE0FFF1F2A95E1F7FE
:1043D000E81BF90BEA5EFE4F818192819A83898303
:1043E0008091040390E0FC01EE0FFF1FE80FF91F1E
:1043F000EE0FFF1FEE0FFF1FE052FE4F6081718135
:1044000042815381CE01019626E804E412E10E9424
:104410007A178823A9F18091CA03282F30E0F90187
:10442000B3E0EE0FFF1FBA95E1F7E21BF30BEA5E74
:10443000FE4F29813A813283218397E0899FC00111
:104440001124BC01685B7F4F8A5E9E4F47E050E0BD
:104450000E94BE408091CA03282F30E0F901A3E0FA
:10446000EE0FFF1FAA95E1F7E21BF30BEA5EFE4F8A
:10447000658176810E94B72884E06EE10E94D50BA9
:104480008F2D0E9482200F900F90CF91DF911F916E
:104490000F91FF9008958BE20E9453150E94CD2149
:1044A000089587E20E9453150E94CD210895FF923E
:1044B0000F931F93DF93CF9300D0CDB7DEB784E186
:1044C0000E947420F82E1091CA030E945E28BC013D
:1044D00076956795812F0E9420298091CA0390E0EC
:1044E000FC0173E0EE0FFF1F7A95E1F7E81BF90B73
:1044F000EA5EFE4F858196819A83898380910403C9
:1045000090E0FC01EE0FFF1FE80FF91FEE0FFF1FF9
:10451000EE0FFF1FE052FE4F608571854285538587
:10452000CE01019625E809E112E10E947A1788235D
:1045300019F18091CA03282F30E0F90143E0EE0F12
:10454000FF1F4A95E1F7E21BF30BEA5EFE4F29815C
:104550003A813683258397E0899FC0011124BC01ED
:10456000685B7F4F8A5E9E4F47E050E00E94BE40EE
:1045700084E06EE10E94D50B8F2D0E9482200F9067
:104580000F90CF91DF911F910F91FF9008958CE2D2
:104590000E9453150E945722089588E20E945315E5
:1045A0000E9457220895282F30E02330310514F45B
:1045B0008F5F01C080E02C5F3D4FF901A081B0E02A
:1045C000AA0FBB1FA60FB71FE82FF0E0EC5FFD4F4F
:1045D000E081F0E0EE0FFF1FE60FF71F2D913C91F9
:1045E0001197808191818217930714F081E00895DB
:1045F0008FEF08950F931F93182F82E062E00E94BF
:10460000012684E390E00E9451130E942326612F2B
:1046100070E080E090E044E020E000E00E945B2C4D
:104620000E9423261F910F9108952F923F924F923F
:104630005F926F927F928F929F92AF92BF92CF9232
:10464000DF92EF92FF920F931F93DF93CF9300D0EF
:1046500000D000D0CDB7DEB7809124010E94742035
:10466000882E83EF90E068E00E94AF251092CC0383
:104670008FE20E945315809125010E94FA221A822E
:1046800019820E945E28969587959C838B830E9451
:104690005E289E838D8380E08E010F5F1F4FB801DF
:1046A0000E94D322A82EE0910402F0E0EE0FFF1F3B
:1046B000E00FF11FC080D18090902501FF24F3947A
:1046C0001801A3C02B813C818601021B130B698159
:1046D0007A814D815E81C8010E944016BC01C801EB
:1046E00041E00E94CC158091CA03B6010E942029A6
:1046F000EF2DF0E0EC5FFD4FE081F0E0EE0FFF1FEB
:10470000E20DF31D00811181C016D10609F466C0C7
:1047100020917E023A2D3203C00111248C0D9D1D83
:10472000A7FE04C08017910744F005C0AA2019F025
:104730000817190714F021118C0180912401609150
:104740007F0270E0680F711D6F5F7F4F882777FDD4
:104750008095982F0E94983B2B013C0120E030E48B
:104760004CE955E40E940D3DC62EE72ED82EB92EF9
:1047700020E030E040E85FE30E94F63A87FD28C081
:104780006C2D7E2D8D2D9B2D20E03FEF4FE757E4C4
:104790000E94023D1816ACF4C301B20120E030E0E3
:1047A00040E251E40E940D3D0E946A3B06C084EF46
:1047B00091E00197F1F76150704061157105B9F70B
:1047C00023C06C2D7E2D8D2D9B2D0E946A3B02C037
:1047D00061E070E0CB010197F1F716C08F2DB101B8
:1047E0000E94D322A82E8F2D833040F4FF2021F485
:1047F0009A94892D0E94FA22F39401C0FF2480919B
:1048000026010E94102E8601680180E20E94A227E4
:10481000882339F40E94C214882319F4992009F0DE
:1048200051CF0E94CC2580914901882319F40E9420
:1048300046170CC089E491E0FC0101900020E9F7E3
:10484000CF010197895491400E946A178BEB90E049
:1048500067E00E94AF25F89484E10E94C92778940C
:10486000882D0E94822026960FB6F894DEBF0FBED8
:10487000CDBFCF91DF911F910F91FF90EF90DF900F
:10488000CF90BF90AF909F908F907F906F905F90F0
:104890004F903F902F9008950F931F93DF93CF93E6
:1048A00000D0CDB7DEB789E10E9453158091F502A3
:1048B00090E001969A838983CE01019661E070E0D1
:1048C0004AE050E025E809EE11E10E947A178823BA
:1048D00031F169817A81615070407A836983609394
:1048E000F50286E690E00E94C8406091F50289E0FA
:1048F000689FB001112469597F4F83E792E049E036
:1049000050E00E949A4080917602909177029093B5
:10491000F4028093F30284E06EE10E94D50B0F90C5
:104920000F90CF91DF911F910F9108950E944C2419
:104930000E94251308950F931F93DF93CF9300D008
:10494000CDB7DEB78CE30E94531580916F02898347
:104950001A82CE01019660E070E044E650E027E85C
:1049600009EE11E10E947A17882359F0698160935A
:104970006F028DE590E00E94C84084E06EE10E94E5
:10498000D50B0E9425130F900F90CF91DF911F91AF
:104990000F9108950F931F93DF93CF9300D0CDB75E
:1049A000DEB78BE30E9453158091EB0289831A8254
:1049B000CE01019660E070E041E050E023E009E3C1
:1049C00014E10E947A17882359F069816093EB0201
:1049D0008EE590E00E94C84084E06EE10E94D50B15
:1049E0000E9425130F900F90CF91DF911F910F918F
:1049F00008950F931F93DF93CF9300D0CDB7DEB709
:104A000089E50E9453158091270189831A82CE017E
:104A1000019660E070E046E050E023E004EE12E131
:104A20000E947A178823C9F06981609327018FE576
:104A300090E00E94C84084E06EE10E94D50BE091B6
:104A40002701F0E0EE0FFF1FE55AFE4F259135914B
:104A500045915491C9010E944B2A0E9425130F9041
:104A60000F90CF91DF911F910F9108958091EA02ED
:104A7000823059F0833018F4813061F403C08530FE
:104A800048F406C00E949B2408950E94CA240895F9
:104A90000E94F924089528B1982F9F70922B98B9FD
:104AA00098B1806F892388B9459A8DE08A95F1F78E
:104AB000459888EC8A95F1F708951F93182F8295F1
:104AC0008F700E944B25812F0E944B251F910895C6
:104AD00044980E945D250895449A0E945D2508959A
:104AE0000E946C258091CD038F5F8093CD0380332E
:104AF00010F01092CD030895EF92FF920F931F9341
:104B0000DF93CF9300D0CDB7DEB7182F88E269834B
:104B10007A830E946825110F110F110F69817A8124
:104B2000462F572F7A0100E0802F810F80640E946A
:104B30006825F70184910E9470250F5F0894E11C9D
:104B4000F11C083089F789E20E9468250F900F90C8
:104B5000CF91DF911F910F91FF90EF900895EF9209
:104B6000FF920F931F93CF93DF93162FE82EE70149
:104B70007E01F92EE70100E006C0802FBE010E94F1
:104B80007C250F5F28960117C0F3DF91CF911F910D
:104B90000F91FF90EF90089581E00E946825109298
:104BA000CD0380E197E20197F1F708951F931091EB
:104BB000CD031F7031F080E20E946C251F5F103121
:104BC000D1F78091CD0380680E9468251F910895D8
:104BD0000F931F93062F813011F014E501C010E5EB
:104BE00089E20E946825802F8F7080670E94682567
:104BF000802F82958370812B0E9468251F910F91D1
:104C00000895813108F080E0643008F060E062953A
:104C1000607F680F6093CD03862F80680E946825AF
:104C200008951F93682F80E00E94012610E180E222
:104C30000E946C251150D9F78091CD0380680E94A5
:104C400068251F910895EF92FF921F93CF93DF93F2
:104C50001091CD0312951F70E82EE7017E01F92E09
:104C6000E7010EC08A3051F4133010F41F5F01C009
:104C700010E080E0612F0E94012602C00E94702592
:104C80008991882379F7DF91CF911F91FF90EF9061
:104C900008951F93DF93CF9300D0CDB7DEB7182FC1
:104CA000862F69839A830E941126212F9A81392F9A
:104CB000F90101900020E9F72E1B3F0B2F5E3F4FBB
:104CC00036952795822F69810E940126812F9A812E
:104CD0000E9423260F900F90CF91DF911F9108958E
:104CE0000F931F93DF93CF9300D000D0CDB7DEB7E3
:104CF000162F279A3D9A3C9A97B19F6097B945988D
:104D0000E0E9F1E064EF71E0DB011197F1F7319731
:104D1000D9F7813021F094E50EE635E103C090E546
:104D20000CE63DE1449883E02C8339834B839A83DE
:104D30000E944B25E0E1F7E23197F1F783E30E940F
:104D40004B2582E30E94682589E20E94682539810B
:104D5000832F0E946825812F8F7080670E946825AD
:104D6000812F829583709A81892B0E946825802FDC
:104D70000E94682588E20E9468252C81822F81701C
:104D80008C604B8150E041705070440F551F842B54
:104D90000E9468250E94CC2586E00E9468250F901D
:104DA0000F900F900F90CF91DF911F910F91089569
:104DB0001F920F920FB60F9211242F933F938F9350
:104DC0009F938DE386BD26B189B13091A30390E016
:104DD000807890709595879595958795207C282B60
:104DE000209523278091D802822380958093D80232
:104DF0009091D702922398279093D70228232923B2
:104E00008091A30382278093A3038091A1039091B3
:104E1000A3039223982B9093A1038091A103807EFA
:104E200051F0109202031092010388EE93E09093E8
:104E3000CF018093CE018091A303807E49F482E369
:104E40008093D60284E18093060386E08093FF027C
:104E50008091D60281508093D602882361F480919C
:104E600006038093D602909105038091A303807E70
:104E7000892B809305038091D50281508093D502C0
:104E8000882331F482E38093D50281E08093A003EC
:104E90008091D40281508093D402882331F484E13C
:104EA0008093D40281E0809303038091D3028150E8
:104EB0008093D302882331F482E08093D30281E08F
:104EC000809307038091D20281508093D20288237D
:104ED00031F48AE08093D20281E08093FE028091D7
:104EE000CE019091CF0101979093CF018093CE0195
:104EF000009749F488EE93E09093CF018093CE0120
:104F000081E08093A2039F918F913F912F910F9009
:104F10000FBE0F901F901895F8949091A1038923CC
:104F20009091A10398279093A10378940895F89401
:104F30009091050389239091050398279093050389
:104F400078940895F8949091A303909589230E94F2
:104F50008C2708950E9497270E948C270895882304
:104F6000B9F08091FF02882341F0F8948091FF020C
:104F700081508093FF0278940895809106038430D5
:104F800038F0F89480910603825080930603789459
:104F90000895EF92FF920F931F9390916F009D7F62
:104FA00090936F0090910403992309F057C090915A
:104FB00081009C7F909381009091810094609093F8
:104FC000810090E19093CE0390E29093DA031092E7
:104FD000E7031092E603E82EFF2400E010E0E091E2
:104FE0000403F0E083E0EE0FFF1F8A95E1F7E05342
:104FF000FE4F2681378140E050E060E07DE281E3B2
:1050000091E00E941F3EC801B7010E94CD3D0E9461
:10501000963B2FE632E143E85AE30E940D3D0E94A1
:105020006A3B9B017093E9036093E8034091880019
:1050300050918900952F80E0840F911D820F931F5E
:10504000909389008093880080916F0082608093A4
:105050006F001F910F91FF90EF9008959091810044
:105060009B7F90938100909181009360A8CFE09105
:105070000403F0E023E0EE0FFF1F2A95E1F7E05371
:10508000FE4F26813781829FB001839F700D929FD2
:10509000700D112480E090E00E94963B20E030E00B
:1050A00040EA51E40E94FD3A20E030E040E05FE356
:1050B0000E94303A0E946A3BCB010895E0910403BC
:1050C000F0E033E0EE0FFF1F3A95E1F7E053FE4FBB
:1050D00084819581089590E0FC01EE0FFF1FE80F99
:1050E000F91FEE0FFF1FEE0FFF1FE253FC4F617021
:1050F0006383089590E0FC01EE0FFF1FE80FF91F96
:10510000EE0FFF1FEE0FFF1FE253FC4FA0910403B1
:10511000B0E083E0AA0FBB1F8A95E1F7A053BE4F12
:1051200012968D919C911397680F791F75836483F4
:10513000089590E0FC01EE0FFF1FE80FF91FEE0F3E
:10514000FF1FEE0FFF1FE253FC4FA0910403B0E0DE
:1051500033E0AA0FBB1F3A95E1F7A053BE4F8D91E4
:105160009C911197861B970B97838683089590E0F7
:10517000FC01EE0FFF1FE80FF91FEE0FFF1FEE0FF0
:10518000FF1FE253FC4F7387628724813581A09112
:105190000403B0E083E0AA0FBB1F8A95E1F7A05398
:1051A000BE4F14968D919C911597909581959F4F28
:1051B000821B930B46815781840F951F660F771FC3
:1051C000860F971F73E0880F991F7A95E1F764E0C7
:1051D000969587956A95E1F7820F931F918780874F
:1051E0000895EFE6F0E080818D7F8083089590E060
:1051F000FC01EE0FFF1FE80FF91FEE0FFF1FEE0F70
:10520000FF1FE253FC4F44815581262F372F24176F
:10521000350708F49A01FC01EE0FFF1FE80FF91F94
:10522000EE0FFF1FEE0FFF1FE253FC4F4681578129
:10523000C9014217530708F4CA0192838183089574
:10524000AF92BF92CF92DF92EF92FF921F93CF93D4
:10525000DF93182F9B0190E0FC01EE0FFF1FE80F7A
:10526000F91FEE0FFF1FEE0FFF1FE253FC4F4381AC
:10527000442381F0E0910403F0E0B3E0EE0FFF1F60
:10528000BA95E1F7E053FE4F44815581BA01621BA4
:10529000730B9B01E0910403F0E0A3E0EE0FFF1F0E
:1052A000AA95E1F7E053FE4FC480D580A60156953C
:1052B0004795FC01EE0FFF1FEE24FF24241735074E
:1052C000E8F4E80FF91FEE0FFF1FEE0FFF1FE25388
:1052D000FC4FC481D581608571856C1B7D0B80E09E
:1052E00090E0660F771F881F991F40E050E00E94F2
:1052F000CD3DA70196010E94413E1FC0E80FF91F56
:10530000EE0FFF1FEE0FFF1FE253FC4FA084B1848E
:10531000668177816A197B0980E090E0660F771FCC
:10532000881F991F241B350B40E050E00E94CD3DA3
:10533000A70196010E941F3EE501C20FD31F812FD6
:10534000BE010E94F728DF91CF911F91FF90EF904F
:10535000DF90CF90BF90AF9008951F93182F8827AC
:1053600077FD8095982FE0910403F0E0A3E0EE0F25
:10537000FF1FAA95E1F7E053FE4F2481358140E0FD
:1053800050E00E94CD3D24EB30E040E050E00E9430
:105390001F3E812FB9010E9420291F9108951F925D
:1053A0000F920FB60F9211242F933F934F935F9359
:1053B0008F939F93EF93FF932091D902223090F423
:1053C0003BB1822F90E0FC01EE0FFF1FE80FF91FA9
:1053D000EE0FFF1FEE0FFF1FE253FC4F8081809501
:1053E00083238BB9822F8F5F8093D9028230C9F0DB
:1053F000833010F01092D9022BB18091D90290E045
:10540000FC01EE0FFF1FE80FF91FEE0FFF1FEE0F5D
:10541000FF1FE253FC4F8081282B2BB981819281A1
:105420000AC08091E8039091E9032091E60330914E
:10543000E703821B930B4091880050918900352F20
:1054400020E0240F311D280F391F3093890020934D
:1054500088002091E6033091E703280F391F30932D
:10546000E7032093E6038091E8039091E90328176E
:10547000390720F01092E7031092E603FF91EF91B5
:105480009F918F915F914F913F912F910F900FBE00
:105490000F901F9018959C0140E050E084E0220F8F
:1054A000331F441F551F8A95D1F760E07DE281E3E9
:1054B00091E00E941F3E215030403093C500209360
:1054C000C40088E98093C10086E08093C2000895FB
:1054D0009091C00095FFFCCF8093C6000895EF9295
:1054E000FF92CF93DF93E82EE7017E01F92EE701CB
:1054F00002C00E94682A89918823D9F7DF91CF9151
:10550000FF90EF9008951F920F920FB60F92112403
:105510002F938F939F93EF93FF932091C6008091D9
:10552000DA02882309F059C08091DB02281771F450
:1055300080910B02882351F010920B028AEE93E0C7
:1055400090930A02809309021092810480910B02C9
:10555000882309F042C0E0910902F0910A022083F9
:10556000809181048F5F80938104809180048823DF
:1055700029F08091DC02281701F51AC0809181047E
:10558000823029F4213019F081E080930B02809160
:105590008104833021F4223010F086E001C085E0E0
:1055A000809308029091810480910802981729F451
:1055B00081E080930B028093DA028091090290913E
:1055C0000A02019690930A02809309028091810455
:1055D000863919F481E080930B02FF91EF919F913E
:1055E0008F912F910F900FBE0F901F901895982FAD
:1055F00080538A3050F08153863020F0892F8154B7
:10560000863010F4865F089580E00895EF92FF924F
:105610000F931F93CF93DF938091DA02813009F0CB
:1056200043C080918104882309F43EC081E0FF24B7
:1056300002C0F9268F5F90918104891738F4E82F12
:10564000F0E0E651FC4F90819A3299F7C82FD0E0F4
:105650008E010E5F1F4F8091810490E0081719079B
:105660001CF5C651DC4F89810E94F72AE82EF8010B
:10567000E651FC4F80810E94F72AE29490EFE922E4
:10568000E82AEF1489F4188288E093E06BEE73E067
:105690000E940F4081E080930003F89410929F03D2
:1056A00010929E03789401C080E020919E03309177
:1056B0009F0394E02C3E390718F491E09093000387
:1056C0001092DA02DF91CF911F910F91FF90EF902E
:1056D00008950F931F9330E046C0E42FEF5FF0E092
:1056E000E651FC4F50815D53E42FEE5FF0E0E65150
:1056F000FC4F1081E42FED5FF0E0E651FC4F70812C
:10570000DC01A30FB11D052F02950F70E42FF0E00F
:10571000E651FC4F20812D53220F220F202B2C937A
:10572000613021F1212F2D53E32FEF5FDC01AE0F0C
:10573000B11DFD015295507FA22FA695A6955A2B1B
:105740005083623099F04C5F6350532F5E5FFC01D1
:10575000E50FF11D2295220F220F207C572F5D535C
:10576000252B20833D5F662309F0B7CF1F910F9152
:1057700008959091DA02913009F04CC09091810423
:10578000933008F447C09091EC03981709F042C099
:1057900060E080E090E007C046515C4FFA01208154
:1057A000820F911D6F5F462F50E02091810430E001
:1057B00023503040421753077CF39C013F70E09127
:1057C000810446E0359527954A95E1F7235CF0E0A2
:1057D000E951FC4F30812317A9F4E09181048F73C4
:1057E0009070835CF0E0E851FC4F9081891751F490
:1057F00060918104665088E093E043E00E94692B49
:1058000081E001C080E0F89410929F0310929E0303
:10581000789401C080E020919E0330919F03F4E0D2
:105820002C3E3F0748F49091EC03913428F09B35CF
:1058300018F491E0909300031092DA0208958230F8
:1058400019F0843081F405C083E28093DB028DE09F
:1058500004C084E28093DB028AE08093DC0281E072
:1058600080938004089580E88093DB021092800486
:105870000895209181042250209381042091DA021E
:10588000213091F420E009C0DC01A20FB11DF0E04D
:10589000E651FC4F30813C932F5FE22FE60F3091B1
:1058A0008104231788F302C0109281041092DA0257
:1058B0008091810408952F923F924F925F926F9250
:1058C0007F928F929F92AF92BF92CF92DF92EF9290
:1058D000FF920F931F93CF93DF936B017C01742E84
:1058E000122F242E3324F101E352FD4F10820217B0
:1058F000A8F4E22FF0E0E01BF109EE0FFF1FEE0F1E
:10590000FF1FE45FF04F2591359145915491C701F8
:10591000B6010E94413E69017A01102FF7FE0BC0CB
:10592000F094E094D094C094C11CD11CE11CF11CF3
:105930006624639401C0662420E030E001E003C0E7
:105940000F5F0A3091F02F5F3F4FF901EE0FFF1FFD
:10595000EE0FFF1FE45FF04F85919591A591B491F3
:10596000C816D906EA06FB065CF761100F5F111135
:105970000F5F071910160CF07CC0202F332727FD6E
:105980003095812F90E02817390731F0AC014F5F37
:105990005F4F2417350779F5A12FB0E0FD01EE0F19
:1059A000FF1FEE0FFF1FE85FF04F259135914591E6
:1059B0005491CA01B90112E0660F771F881F991F21
:1059C0001A95D1F7620F731F841F951F6C0D7D1DF3
:1059D0008E1D9F1DFD01EE0FFF1FEE0FFF1FE45FE9
:1059E000F04F25913591459154910E94413E6901B6
:1059F0007A0110E03EC0281739076CF5F901EE0F67
:105A0000FF1FEE0FFF1FE85FF04F85909590A59068
:105A1000B490C501B40142E0660F771F881F991F3B
:105A20004A95D1F7680D791D8A1D9B1D6C0D7D1D52
:105A30008E1D9F1DF901EE0FFF1FEE0FFF1FE45F8C
:105A4000F04F25913591459154910E94413E690155
:105A50007A01101B0EC07A94E72DFF27E7FDF09521
:105A6000E252FD4F8AE202C082937A9477FEFCCF25
:105A700056C0072D0150C02FDD27C7FDD095C3525A
:105A8000DD4F462C55248AE0882E912CA12CB12C78
:105A900008942108310826C0112379F09101211BB7
:105AA00031098217930749F486E490E00E9451136C
:105AB000FC018081888310E013C0C701B601A501F5
:105AC00094010E94413E605D688369017A01C114BE
:105AD000D104E104F10421F4112311F4015008C0B0
:105AE00001502197CE018D5D924084159505A4F655
:105AF000662049F0E02FFF27E7FDF095E352FD4FC8
:105B00008DE280830150E02FFF27E7FDF095E25200
:105B1000FD4F80E202C08293015007FFFCCF8DED64
:105B200092E0DF91CF911F910F91FF90EF90DF9066
:105B3000CF90BF90AF909F908F907F906F905F902D
:105B40004F903F902F900895AF92BF92DF92EF92C7
:105B5000FF920F931F93DF93CF9300D0CDB7DEB7A3
:105B60007A018B01BE016F5F7F4F4AE050E00E94D7
:105B7000933E9B01AC01E981FA8180818E3251F51F
:105B80005F010894A11CB11C1AC0CA01B9012AE026
:105B900030E040E050E00E94CD3D9B01AC018D2DF6
:105BA00090E0C097AA2797FDA095BA2F280F391F1C
:105BB0004A1F5B1F0894E108F10801091109F5016A
:105BC000D1905F01DD2031F0E114F10401051105F0
:105BD000E1F618C0E114F1040105110599F0F7018F
:105BE000EE0FFF1FEE0FFF1FE45FF04FE590F59003
:105BF00005911491CA01B9019701A8010E94CD3DF8
:105C00009B01AC01B901CA010F900F90CF91DF91B8
:105C10001F910F91FF90EF90DF90BF90AF9008958C
:105C200090E044EF51E009C028EE33E0FA013197EB
:105C3000F1F721503040D1F79F5F9817A8F30895EE
:105C4000DF92EF92FF920F931F93CF93DF93EC01BC
:105C5000CB01BA01022F2CE330E040E050E00E947B
:105C60001F3E122FF32EE42ED52EC00FD11D2AE099
:105C700030E040E050E00E941F3E205D2883605DE0
:105C80006983612F7F2D8E2D9D2DDF91CF911F91E7
:105C90000F91FF90EF90DF9008950F931F93DF9384
:105CA000CF93CDB7DEB727970FB6F894DEBF0FBE00
:105CB000CDBFAB01BC011F8277FF0BC057FF03C0F4
:105CC000509541955F4F662757FD6095762F8DE281
:105CD00001C080E289838E010F5F1F4FC80124E05D
:105CE0000E94202EAB01BC018AE38C83C80121E015
:105CF0000E94202EC8010E94232627960FB6F894F2
:105D0000DEBF0FBECDBFCF91DF911F910F910895E0
:105D1000FF920F931F93DF93CF93CDB7DEB72997F1
:105D20000FB6F894DEBF0FBECDBF20EA3FE040E0E3
:105D300050E00E941F3EF42FE52F19868E010F5F61
:105D40001F4FC801A9016F2F7E2F26E00E94202E31
:105D5000AB01BC01EAE3FE2EFE82C80123E00E94F3
:105D6000202EAB01BC01FB82C80120E00E94202E46
:105D7000C8010E94232629960FB6F894DEBF0FBEF5
:105D8000CDBFCF91DF911F910F91FF900895CF93D9
:105D9000DF9385E00E94060BBC0180E090E020913B
:105DA00012013091130140E050E00E94CD3D37E0F8
:105DB00096958795779567953A95D1F7EB0186E0AB
:105DC0000E94060BBC0180E090E02091140130910C
:105DD000150140E050E00E94CD3D27E09695879563
:105DE000779567952A95D1F78091F2028823B1F4CF
:105DF000C617D70740F48091F0029091F102009706
:105E000011F101971CC080916F02680F711D6C1712
:105E10007D0750F581E08093F20226C06C177D0764
:105E2000D0F4C091F002D091F1020E945E28C81710
:105E3000D90748F48091F0029091F1020196909375
:105E4000F1028093F0026091F0027091F10280E023
:105E50000E94202909C080916F02C80FD11DC6176A
:105E6000D70710F41092F202DF91CF91089580913C
:105E70008102882389F580914901882369F581E0B1
:105E800060E00E940126809100038823B9F0809190
:105E9000EF02863020F41092EE0285E010C080916F
:105EA000EE02882371F481E08093EE0280918204F7
:105EB0008A3014F4805D03C088E501C08AE30E9443
:105EC0007025109200038091EF028F5F8093EF02A4
:105ED0008C3011F41092EF0208952F923F924F925E
:105EE0005F926F927F928F929F92AF92BF92CF926A
:105EF000DF92EF92FF920F931F93DF93CF93CDB773
:105F0000DEB72B970FB6F894DEBF0FBECDBF7C0176
:105F10008B01FC0184809580A680B780FB016481A1
:105F20007581868197810E94983B20E836E948E197
:105F30005BE40E94FD3A762E79878A879B87C501AC
:105F4000B401A985FA85EB85272D3A2F4F2F5E2FB7
:105F50000E94303A20E030E040E05FE30E940D3DD7
:105F600029E33AEF4EE85CE30E940D3D0E94FA3AC5
:105F700020E032E649ED57E40E940D3D1B012C0163
:105F8000F80160817181828193810E94983B20E8B1
:105F900036E948E15BE40E94FD3A9B01AC01F70160
:105FA00060817181828193810E942F3A9B01AC01B3
:105FB000C201B1010E940D3DE62ED72EC82E692EDA
:105FC000C501B401A985FA85EB85272D3A2F4F2FFE
:105FD0005E2F0E942F3A20E032E649ED57E40E94FE
:105FE0000D3DA62E972E882E792E6E2D7D2D8C2D73
:105FF000962D2A2D392D482D572D0E94A33A21EE9A
:106000003EE245E652E40E940D3D20E030E044E3EC
:1060100053E40E94303A20E030E044EB53E40E9425
:10602000DA3BF62E172F082FB92E20E030E044EB94
:1060300053E40E94023D181674F46F2D712F802FC7
:106040009B2D20E030E044EB53E40E942F3AF62EE3
:10605000172F082FB92E6E2D7D2D8C2D962D2E2DC0
:106060003D2D4C2D562D0E940D3D1B012C016A2DFE
:10607000792D882D972D2A2D392D482D572D0E94A9
:106080000D3D9B01AC01C201B1010E94303A0E945A
:10609000743D9B01AB01BC0149835A836B837C83B4
:1060A0006F2DA8018F2D952FA02FBB2D8D839E8343
:1060B000AF83B8873A814B815C817E818F819885DF
:1060C0002B960FB6F894DEBF0FBECDBFCF91DF91F8
:1060D0001F910F91FF90EF90DF90CF90BF90AF9006
:1060E0009F908F907F906F905F904F903F902F90F8
:1060F0000895EF92FF920F93CF93DF937A01E90116
:106100000E940126C7010E942326CE010E94232659
:10611000002319F0802F0E947025DF91CF910F91FD
:10612000FF90EF900895CF92DF92EF92FF920F933E
:10613000CF93DF9390918002992309F408C2809154
:10614000A703882319F0943009F001C290918102CD
:10615000992309F0FCC19091A603992331F088237B
:1061600021F41092A6030E94CC25809180028230F7
:1061700009F49AC0833020F4813009F0E8C107C0E7
:10618000833009F4D1C0843009F0E1C11BC16091B2
:10619000AC047091AD04882777FD8095982F43E07B
:1061A00020E000E00E945B2C9C0180E060E04CE07D
:1061B00052E00FED0E94793060919004709191044B
:1061C00080919204909193040E946A3B43E020E006
:1061D00000E00E945B2C9C0188E060E041E152E01D
:1061E0000DE60E947930609194047091950480913D
:1061F0009604909197040E946A3B43E020E000E0FF
:106200000E945B2C9C0180E061E046E152E00FEDD2
:106210000E94793060918B0470918C0480918D0480
:1062200090918E042091A8043091A9044091AA0471
:106230005091AB04621B730B840B950B43E023E07E
:1062400001E00E945B2C9C0188E061E04BE152E0A0
:106250000DE60E9479306091AE047091AF048827FA
:1062600077FD8095982F43E020E000E00E945B2CB2
:106270009C0180E062E040E252E00FED0E94793044
:106280006091B0047091B104882777FD8095982FB4
:1062900043E020E000E00E945B2C9C0188E062E08B
:1062A00045E252E00FED3DC060918304709184049B
:1062B00080918504909186044BE027E007E00E94DE
:1062C0005B2C9C0180E060E04AE252E000E00E942A
:1062D000793060918704709188048091890490914D
:1062E0008A044BE027E007E00E945B2C9C0180E0E1
:1062F00061E040E352E000E00E94793060918B045D
:1063000070918C0480918D0490918E044BE023E079
:1063100001E00E945B2C9C0180E062E046E352E0D9
:1063200000E00E94793013C16091A0047091A10433
:106330008091A2049091A3044BE027E007E00E9423
:106340005B2C9C0180E060E04CE352E000E00E94A6
:1063500079306091A4047091A5048091A604909175
:10636000A7044BE027E007E00E945B2C9C0180E043
:1063700061E042E452E000E00E9479306091A804BC
:106380007091A9048091AA049091AB044BE023E0A2
:1063900001E00E945B2C9C0180E062E048E452E056
:1063A00000E00E94793080E40E948C27882331F439
:1063B00080E80E948C27882309F4C9C081E080937B
:1063C000A703C5C06091B20470E080E090E044E0B3
:1063D00021E001E00E945B2C9C0180E060E04EE443
:1063E00052E006E50E9479306091F3027091F40268
:1063F00080E090E044E020E000E00E945B2C9C0103
:1064000088E060E041E552E00E9479306091B30499
:106410007091B40480E090E044E021E001E00E944B
:106420005B2C9C0180E061E044E552E001E40E94C5
:1064300079302091FA023091FB022115310509F4DF
:1064400041C040E050E06091F6027091F702809107
:10645000F8029091F9020E941F3EE9012097C1F1D4
:10646000609174027091750280E090E02091F302D7
:106470003091F40240E050E0621B730B840B950BEB
:1064800024E230E040E050E00E94CD3D9E0140E03B
:1064900050E00E94413E69017A01C90137FF03C003
:1064A000909581959F4F6EE080319607DCF057FF05
:1064B00013C051EFC52E51EFD52E5FEFE52E5FEFE4
:1064C000F52E10C0CC24DD247601C0E0D0E00AC057
:1064D000CC24DD24760106C04FE0C42E4EE0D42E3D
:1064E000E12CF12CBE0180E090E044E021E001E0ED
:1064F0000E945B2C9C0188E061E047E552E001E4EA
:106500000E94793080E062E00E9401268AE10E94C8
:106510007025609178027091790280917A02909151
:106520007B0220EA3FE040E050E00E941F3ECA01AB
:10653000B9010E944D2E88E062E00E9401268AE5A2
:1065400092E00E942326C701B6010E944D2E0E94B0
:10655000372FDF91CF910F91FF90EF90DF90CF9089
:106560000895EF92FF920F931F93DF93CF93CDB7D0
:10657000DEB728970FB6F894DEBF0FBECDBF88E90F
:1065800094E063E874E00E946D2F29833A834B8383
:106590005C836D837E838F839887A0E9B4E0FE01DE
:1065A000319688E001900D928150E1F7E0909004DF
:1065B000F0909104009192041091930460918B04E7
:1065C00070918C0480918D0490918E042091A80488
:1065D0003091A9044091AA045091AB04621B730B43
:1065E000840B950B0E94983B20E030E04AE754E48E
:1065F0000E94FD3AA80197010E94A33A21EE3EE2D3
:1066000045E652E40E940D3D0E94653B7093B10443
:106610006093B004C801B70120E030E040E850E4E6
:106620000E94F63A87FD0EC0C801B70120E030E0B5
:1066300040EC50E40E94F63A87FF1EC08091ED02C4
:106640008823D1F06091AC047091AD04882777FD68
:106650008095982F0E94983B6093940470939504C2
:1066600080939604909397041092B1041092B00412
:1066700081E08093ED0202C01092ED026091AC04C3
:106680007091AD04882777FD8095982F0E94983BE4
:106690009B01AC01609194047091950480919604E3
:1066A000909197040E942F3A20E030E044EB53E4AD
:1066B0000E94303A20E030E044EB52E40E94303A4D
:1066C00020E030E044EB53E40E94DA3B0E94653B5B
:1066D0009B017093AF046093AE0481E029363807C4
:1066E00034F0285631403093AF042093AE048091AB
:1066F000B0049091B10497FF04C01092B1041092BD
:10670000B0048091B0049091B104853B910534F0C0
:1067100084EB90E09093B1048093B0048091AE0438
:106720009091AF04843B910594F0845B90409093EA
:10673000AF048093AE0484EB90E02091B0043091DC
:10674000B104821B930B9093B1048093B0046091C9
:10675000AE047091AF0480E00E94AD296091B00456
:106760007091B10481E00E94AD2928960FB6F8948B
:10677000DEBF0FBECDBFCF91DF911F910F91FF9074
:10678000EF9008956F927F928F929F92AF92BF92F7
:10679000CF92DF92EF92FF921F93CF93DF93EC01A2
:1067A0008FE40E94B92B882309F47CC0E8E0F3E071
:1067B000F983E88380919E0390919F0324E08C3EAF
:1067C000920708F079C0A3E8B4E031968DE001901B
:1067D0000D928150E1F7E880F980F701EC5BFF4F03
:1067E0001081111F1127111F6091A8047091A90435
:1067F0008091AA049091AB040E94983B5B016C01CC
:10680000F70163A974A9882777FD8095982F20EA5E
:106810003FE040E050E00E94CD3D0E94983B20E0E8
:1068200030E044EB51E40E94FD3A3B014C016091A1
:106830008B0470918C0480918D0490918E040E9441
:10684000983B9B01AC01C401B3010E94303AA60100
:1068500095010E942F3A20E030E040EA50E40E9487
:10686000FD3A9B01AC01C601B5010E94303A0E947D
:10687000653B60938B0470938C0480938D0490939C
:106880008E04F701ED5BFF4F80818170809382025F
:10689000888199810E946837E881F98182A9809373
:1068A00082040BC080919E0390919F03F0E2803D93
:1068B0009F0711F40E94F13610E08091EB028823CB
:1068C00061F080919E0390919F0321E0853A9207A9
:1068D00020F08CE592E00E946F2A812FDF91CF910A
:1068E0001F91FF90EF90DF90CF90BF90AF909F905F
:1068F0008F907F906F9008958F929F92AF92BF92EA
:10690000CF92DF92EF92FF920F931F93DF93CF937B
:1069100000D0CDB7DEB78091EC02882309F071C0BA
:1069200081E08093EC02CE0101960E94C23388235D
:1069300009F463C08091A703882309F45CC009812E
:106940001A81F801ED5BFF4F808183FF56C0F8018B
:10695000C78CD0A0E1A0F2A0C701B6010E94983B6D
:1069600020E836E948E15BE40E94FD3A6093980430
:106970007093990480939A0490939B04F80183A0E8
:1069800094A0A5A0B6A0C501B4010E94983B20E840
:1069900036E948E15BE40E94FD3A60939C04709301
:1069A0009D0480939E0490939F04C092A004D09273
:1069B000A104E092A204F092A3048092A404909215
:1069C000A504A092A604B092A704F80187A190A5FF
:1069D000A1A5B2A58093A8049093A904A093AA04AA
:1069E000B093AB0486AD97AD9093AD048093AC04A7
:1069F0001092A70302C00E94B1320E9493301092FD
:106A0000EC020F900F90CF91DF911F910F91FF90AB
:106A1000EF90DF90CF90BF90AF909F908F900895B0
:106A20008091A703882371F4609194047091950478
:106A300080919604909197040E94653B7093AD04F9
:106A40006093AC040895AF92BF92CF92DF92EF9221
:106A5000FF920F931F93CF93DF93EB01FC013081E3
:106A60002AE0329F900111244181240F311D2051D1
:106A700032405901CC24B7FCC094DC2C029646E08D
:106A800050E060E070E00E94A42D7B018C01C60103
:106A9000B50120E836E948E950E00E94CD3D5B01B0
:106AA0006C01C801B70126E030E040E050E00E94F0
:106AB000413E2A0D3B1D4C1D5D1D8881833539F4F7
:106AC00050954095309521953F4F4F4F5F4FB901FD
:106AD000CA01DF91CF911F910F91FF90EF90DF904E
:106AE000CF90BF90AF900895AF92BF92CF92DF92B8
:106AF000EF92FF920F931F93CF93DF93FC01EB0173
:106B0000228130E02051324090818AE0989FC0017C
:106B100011244181840F911D805E9140AC01440F8E
:106B2000551F63E0880F991F6A95E1F7480F591FB9
:106B3000240F351F5901CC24B7FCC094DC2CCF01A5
:106B4000039646E050E060E070E00E94A42D7B01D7
:106B50008C01C601B50120E836E948E950E00E9401
:106B6000CD3D5B016C01C801B70126E030E040E09B
:106B700050E00E94413E2A0D3B1D4C1D5D1D888149
:106B8000873539F450954095309521953F4F4F4FBB
:106B90005F4FB901CA01DF91CF911F910F91FF9013
:106BA000EF90DF90CF90BF90AF9008956F927F925B
:106BB0008F929F92AF92BF92CF92DF92EF92FF920D
:106BC0000F931F930E94062B882309F4CCC088E002
:106BD00093E067E672E00E94F63F69E672E00E9489
:106BE0000640009709F0BFC080E090E067E672E0E1
:106BF0000E94F63F80E090E067E672E00E94F63F78
:106C00007C0180E090E067E672E00E94F63FBC0104
:106C1000C7010E9423355B016C0180E090E067E6CC
:106C200072E00E94F63F7C0180E090E067E672E04F
:106C30000E94F63FBC01C7010E9474357B018C01A4
:106C400080E090E067E672E00E94F63FFC01808100
:106C5000803309F488C080E090E067E672E00E942B
:106C6000F63F0E94C03F8093820480E090E067E698
:106C700072E00E94F63F80E090E067E672E00E94DA
:106C8000F63F43E050E060E070E00E94A42D3B013D
:106C90004C0160938B0470938C0480938D049093CB
:106CA0008E04A0928704B0928804C0928904D09286
:106CB0008A04E0928304F092840400938504109384
:106CC00086048091A703882309F44BC08091820435
:106CD00086300CF446C0C801B7010E94983B20E8FA
:106CE00036E948E15BE40E94FD3A609398047093B2
:106CF000990480939A0490939B04C601B5010E9465
:106D0000983B20E836E948E15BE40E94FD3A609355
:106D10009C0470939D0480939E0490939F04E09242
:106D2000A004F092A1040093A2041093A304A092E3
:106D3000A404B092A504C092A604D092A7046092C5
:106D4000A8047092A9048092AA049092AB041092B5
:106D5000AD041092AC041092A70388E760EF0E9484
:106D6000D50B0E94B1320E9493301F910F91FF907A
:106D7000EF90DF90CF90BF90AF909F908F907F90DB
:106D80006F90089588E093E062E00E94392C882398
:106D900039F180910803843019F580910A0390E05D
:106DA0009695982F88279795879520910B0330E02B
:106DB000822B932B64E170E00E94F83D6C337105E7
:106DC00030F06C537040653B710520F405C060E005
:106DD00070E002C064EB70E0809109030E94AD296D
:106DE0000895CF93DF938091F502C82FD0E0CE01B4
:106DF00073E0880F991F7A95E1F78C0F9D1F8459D6
:106E00009F4F0E94B2409B01AC011092830280917F
:106E1000780290917902A0917A02B0917B022817B2
:106E200039074A075B0709F450C080918202882322
:106E300041F48091F3029091F40290937702809351
:106E40007602CE0163E0880F991F6A95E1F78C0FF7
:106E50009D1F89599F4F609173020E94C8402091E5
:106E6000F50230E0C90153E0880F991F5A95E1F708
:106E7000820F931F609176027091770286599F4F1F
:106E80000E94DE402091F50230E0C90143E0880F06
:106E9000991F4A95E1F7820F931F40917802509114
:106EA000790260917A0270917B0284599F4F0E940F
:106EB000D64086EF92E060E670E046E050E00E9447
:106EC000BE4084E06EE10E94D50BDF91CF91089522
:106ED000AF92BF92CF92DF92EF92FF920F931F93E8
:106EE000DF93CF9300D000D000D0CDB7DEB77C01C8
:106EF000FC0141AD4093B20480918202882309F0E5
:106F00004AC0E25BFF4F808191818730910508F094
:106F100042C0442309F43FC080917302481718F41B
:106F20004093730238C0242F30E090E0049682171B
:106F300093078CF540937302109283021092F4022F
:106F40001092F30210927702109276021092780259
:106F50001092790210927A0210927B020E94CC2544
:106F60008E010F5F1F4FC80169E471E00E940F405E
:106F70000E944C2489E491E0B8010E940F40809166
:106F80004901882319F40E94461703C081E08093C9
:106F900090020E94F13681E0809383020091FA0210
:106FA0001091FB02F6E401351F07E8F12091F6028B
:106FB0003091F7024091F8025091F902CA01B901EB
:106FC000A3E0660F771F881F991FAA95D1F7620F5C
:106FD000731F841F951FFAE0AF2EB12CC12CD12C4A
:106FE000A60195010E941F3E2093F6023093F702FE
:106FF0004093F8025093F90220E030E0C901B80153
:10700000E3E0660F771F881F991FEA95D1F7600F9D
:10701000711F821F931FA60195010E941F3E30938E
:10702000FB022093FA02F701E25BFF4F608171815E
:1070300065307105C8F16550704080E090E02091A6
:10704000710230E040E050E00E94CD3D24E630E0A7
:1070500040E050E00E941F3E8091700290E0820F5D
:10706000931F9093B4048093B304A0E0B0E0209108
:10707000F6023091F7024091F8025091F902820F26
:10708000931FA41FB51F8093F6029093F702A0935D
:10709000F802B093F9028091FA029091FB020196F6
:1070A0009093FB028093FA026091720270E080E09C
:1070B00090E0F701E05BFF4F2081318140E050E03C
:1070C0000E94CD3D24E630E040E050E00E941F3EAB
:1070D0008091760290917702820F931F9093F40231
:1070E0008093F30226960FB6F894DEBF0FBECDBF95
:1070F000CF91DF911F910F91FF90EF90DF90CF9094
:10710000BF90AF900895ACE2B0E0E9E8F8E30C94EA
:107110005C3E29833A834B835C836D837E838F83BC
:107120009887A986BA86CB86DC86ED86FE860F8791
:10713000188B69807A808B809C8069A27AA28BA24E
:107140009CA2840173018FEF9FEFA0E0B0E0E822E2
:10715000F9220A231B2314014424552469847A84C8
:107160008B849C846DA27EA28FA298A66401530199
:10717000A822B922CA22DB22340188249924C6011C
:10718000B501A80197010E94CD3D69A77AA78BA7F9
:107190009CA7C401B3010E94CD3D7B018C01C601B7
:1071A000B501A20191010E94CD3D5B016C01C401BA
:1071B000B3010E94CD3D9B01AC01EA0CFB1C0C1DF0
:1071C0001D1D69A47AA48BA49CA4C401AA27BB2773
:1071D000E80EF91E0A1F1B1FEA14FB040C051D050F
:1071E00020F4205030404F4F5F4FC801AA27BB27E3
:1071F000820F931FA41FB51F8D8F9E8FAF8FB8A3D3
:107200008701FF24EE2429A53AA54BA55CA5407073
:107210005070E20EF31E041F151FE98EFA8E0B8FBD
:107220001C8FDE2CAA8CCB8C6C8C8D8B8E8D8E8BD8
:107230008F8D8F8B88A1888F2D853E854F855889AE
:1072400069A17AA18BA19CA10E94CD3D7B018C01FB
:107250002D813E814F8158856DA17EA18FA198A57A
:107260000E94CD3DE60EF71E081F191F6D897E890D
:107270008F89988D6E0D7F1D801F911F6D8B7E8B6A
:107280008F8B988F7E892D2D3A2D4C2D562D8F89E1
:10729000988DAC96E2E10C94783E0F93DF93CF93F8
:1072A000CDB7DEB760970FB6F894DEBF0FBECDBF87
:1072B000002309F459C029833A834B835C836D838F
:1072C0007E838F839887E0E2E01B2D813E814F8192
:1072D00058851E16BCF01D861E861F86188A8E2FA6
:1072E000992787FD9095909581959F4F04C056955D
:1072F0004795379527958A95D2F729873A874B87FF
:107300005C872AC0CA01B901002E04C096958795F2
:10731000779567950A94D2F76D877E878F87988BCC
:10732000DA01C90104C0880F991FAA1FBB1FEA9583
:10733000D2F729813A814B815C8104C056954795EB
:10734000379527950A95D2F7822B932BA42BB52B33
:1073500089879A87AB87BC8729853A854B855C8569
:107360006D857E858F85988960960FB6F894DEBF0F
:107370000FBECDBFCF91DF910F9108950F93DF9393
:10738000CF93CDB7DEB760970FB6F894DEBF0FBED0
:10739000CDBF002309F459C029833A834B835C8312
:1073A0006D837E838F839887E0E2E01B29813A8199
:1073B0004B815C811E16BCF019861A861B861C86C2
:1073C0008E2F992787FD9095909581959F4F04C0AA
:1073D000220F331F441F551F8A95D2F72D873E87F2
:1073E0004F87588B2AC0CA01B901002E04C0660F0E
:1073F000771F881F991F0A94D2F769877A878B872E
:107400009C87DA01C90104C0B695A7959795879521
:10741000EA95D2F72D813E814F81588504C0220F15
:10742000331F441F551F0A95D2F7822B932BA42B91
:10743000B52B8D879E87AF87B88B29853A854B857D
:107440005C856D857E858F85988960960FB6F894EA
:10745000DEBF0FBECDBFCF91DF910F910895505881
:10746000BB27AA270ED083C24CD230F051D220F0D5
:1074700031F49F3F11F41EF41CC20EF4E095E7FBBB
:1074800004C2E92F96D280F3BA1762077307840704
:10749000950718F071F49EF5AEC20EF4E0950B2E30
:1074A000BA2FA02D0B01B90190010C01CA01A00156
:1074B0001124FF27591B99F0593F50F4503E68F1B1
:1074C0001A16F040A22F232F342F4427585FF3CFF2
:1074D000469537952795A795F0405395C9F77EF4C3
:1074E0001F16BA0B620B730B840BBAF09150A1F00C
:1074F000FF0FBB1F661F771F881FC2F70EC0BA0F92
:10750000621F731F841F48F4879577956795B79519
:10751000F7959E3F08F0B3CF9395880F08F0992711
:10752000EE0F979587950895ECD158F080E891E09B
:1075300009F49EEFEDD128F040E851E059F45EEFF8
:1075400009C0B7C158C2E92FE07833D268F3092ED9
:10755000052AC1F3261737074807590738F00E2EBA
:1075600007F8E02569F0E025E0640AC0EF6307F85A
:10757000009407FADB01B9019D01DC01CA01AD01EC
:10758000EF934AD0F4D10AD05F91552331F02BED1F
:107590003FE049E450FD49EC63CF0895DF93DD27D8
:1075A000B92FBF7740E85FE31616170648075B0759
:1075B00010F4D92F2BD29F938F937F936F93D2D2B6
:1075C000E0E7F0E079D1D3D12F913F914F915F91D6
:1075D00030D2DD2349F09058A2EA2AED3FE049EC91
:1075E0005FE3D0785D274DDFDF91C1C12AD108F478
:1075F00081E0089595D1E395CBC10CD0B8C188D175
:1076000040F07FD130F021F45F3F19F03EC15111BD
:10761000F3C14FC1CED198F39923C9F35523B1F3E8
:10762000951B550BBB27AA2762177307840738F0F1
:107630009F5F5F4F220F331F441FAA1FA9F333D050
:107640000E2E3AF0E0E830D091505040E695001C04
:10765000CAF729D0FE2F27D0660F771F881FBB1FC0
:10766000261737074807AB07B0E809F0BB0B802D9A
:10767000BF01FF2793585F4F2AF09E3F510568F0E6
:1076800004C1BAC15F3FECF3983EDCF38695779571
:107690006795B795F7959F5FC9F7880F911D9695E8
:1076A000879597F90895E1E0660F771F881FBB1F44
:1076B000621773078407BA0720F0621B730B840BF1
:1076C000BA0BEE1F88F7E095089504D06894B111C5
:1076D00093C1089576D188F09F5790F0B92F9927DC
:1076E000B751A0F0D1F0660F771F881F991F1AF0CD
:1076F000BA95C9F712C0B13081F07DD1B1E00895DB
:107700007AC1672F782F8827B85F39F0B93FCCF35B
:10771000869577956795B395D9F73EF490958095C2
:10772000709561957F4F8F4F9F4F0895E89409C0E2
:1077300097FB3EF490958095709561957F4F8F4FA4
:107740009F4F9923A9F0F92F96E9BB279395F695BA
:10775000879577956795B795F111F8CFFAF4BB0F38
:1077600011F460FF1BC06F5F7F4F8F4F9F4F16C09C
:10777000882311F096E911C0772321F09EE8872F26
:10778000762F05C0662371F096E8862F70E060E0E2
:107790002AF09A95660F771F881FDAF7880F96955B
:1077A000879597F90895ADD018F011F0B1D038F45D
:1077B00080C022C1E92FFDD0B0F35523C9F3E7FB08
:1077C0006217730784079507A8F199F3E92FFF273C
:1077D00088232AF03197660F771F881FDAF7952FD5
:1077E0005527442332F091505040220F331F441F3D
:1077F000D2F7BB27E91BF50B621B730B840BB10996
:10780000C1F222F4620F731F841FB11D31972AF059
:10781000660F771F881FBB1FEFCF915050405AF063
:1078200041F0882332F0660F771F881F9150504037
:10783000C1F7939530C08695779567959F5FD9F787
:10784000F8CF990F0008550FAA0BE0E8FEEF1616C7
:107850001706E807F907C0F012161306E407F50744
:1078600098F0621B730B840B950B39F40A2661F0B8
:10787000232B242B252B21F408950A2609F4A1405B
:10788000A6958FEF811D811D089597F99F6780E868
:1078900070E060E008959F3F31F0915020F48795AB
:1078A00077956795B795880F911D9695879597F968
:1078B00008959FEF80EC0895DF93CF931F930F936C
:1078C000FF92EF92DF927B018C01689405C0DA2E63
:1078D000EF01AFD0FE01E894A59125913591459136
:1078E0005591AEF3EF01CDDDFE019701A801DA94C9
:1078F00079F7DF90EF90FF900F911F91CF91DF917B
:10790000089500240A941616170618060906089505
:1079100000240A9412161306140605060895C9CF0A
:1079200050D0E8F3E894E0E0BB279F57F0F02AED51
:107930003FE049EC06C0EE0FBB0F661F771F881FA4
:1079400028F0B23A62077307840728F0B25A620B34
:10795000730B840BE3959A9572F7803830F49A95FF
:10796000BB0F661F771F881FD2F7904896CF092E4E
:107970000394000C11F4882352F0BB0F40F4BF2B8A
:1079800011F460FF04C06F5F7F4F8F4F9F4F0895CA
:10799000EF93E0FF06C0A2EA2AED3FE049EC5FEB7F
:1079A00070DDE5DF0F90039401FC9058EDE9F0E005
:1079B000E3C057FD9058440F551F59F05F3F71F0D9
:1079C0004795880F97FB991F61F09F3F79F0879546
:1079D0000895121613061406551FF2CF4695F1DFCF
:1079E00008C0161617061806991FF1CF869571055F
:1079F000610508940895E894BB2766277727CB0193
:107A000097F908951EDF08F48FEF08959B01AC01EC
:107A100060E070E080E89FE3F0CD0BD0A8CF71DF8D
:107A200028F076DF18F0952309F02FCF42CF1124EC
:107A3000E3CFBFDFA0F3959FD1F3950F50E0551F23
:107A4000629FF001729FBB27F00DB11D639FAA27B3
:107A5000F00DB11DAA1F649F6627B00DA11D661F02
:107A6000829F2227B00DA11D621F739FB00DA11D23
:107A7000621F839FA00D611D221F749F3327A00DDD
:107A8000611D231F849F600D211D822F762F6A2F79
:107A900011249F5750408AF0E1F088234AF0EE0FFE
:107AA000FF1FBB1F661F771F881F91505040A9F70B
:107AB0009E3F510570F0E9CE9FCF5F3FECF3983EBB
:107AC000DCF3869577956795B795F795E7959F5F72
:107AD000C1F7FE2B880F911D9695879597F908950C
:107AE00011F40EF4E6CED7CE6CDFD0F39923D9F3A0
:107AF000CEF39F57550B87FF38D00024A0E640EA0D
:107B0000900180585695979528F4805C660F771FF2
:107B1000881F20F026173707480730F4621B730BC5
:107B2000840B202931294A2BA695179407942025E8
:107B300031254A2758F7660F771F881F20F0261730
:107B40003707480730F4620B730B840B200D311D8F
:107B5000411DA09581F7B901842F9158880F969502
:107B6000879508959B01AC0158CF91505040660F06
:107B7000771F881FD2F708959F938F937F936F93FA
:107B8000FF93EF939B01AC0148DFEF91FF9194DEEF
:107B90002F913F914F915F9140CF629FD001739F92
:107BA000F001829FE00DF11D649FE00DF11D929F99
:107BB000F00D839FF00D749FF00D659FF00D9927D8
:107BC000729FB00DE11DF91F639FB00DE11DF91FFC
:107BD000BD01CF0111240895991B79E004C0991FBC
:107BE000961708F0961B881F7A95C9F78095089517
:107BF000AA1BBB1B51E107C0AA1FBB1FA617B707D3
:107C000010F0A61BB70B881F991F5A95A9F78095EE
:107C10009095BC01CD01089597FB092E07260AD047
:107C200077FD04D0E5DF06D000201AF47095619549
:107C30007F4F0895F6F7909581959F4F0895A1E2A3
:107C40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FD6
:107C5000FF1FA217B307E407F50720F0A21BB30B21
:107C6000E40BF50B661F771F881F991F1A9469F79D
:107C700060957095809590959B01AC01BD01CF01F9
:107C8000089597FB092E05260ED057FD04D0D7DFA7
:107C90000AD0001C38F450954095309521953F4FFF
:107CA0004F4F5F4F0895F6F79095809570956195C9
:107CB0007F4F8F4F9F4F08952F923F924F925F9229
:107CC0006F927F928F929F92AF92BF92CF92DF92EC
:107CD000EF92FF920F931F93CF93DF93CDB7DEB751
:107CE000CA1BDB0B0FB6F894DEBF0FBECDBF0994E5
:107CF0002A88398848885F846E847D848C849B843C
:107D0000AA84B984C884DF80EE80FD800C811B8149
:107D1000AA81B981CE0FD11D0FB6F894DEBF0FBE78
:107D2000CDBFED0108952F923F924F925F927F92C7
:107D30008F929F92AF92BF92CF92DF92EF92FF927B
:107D40000F931F93CF93DF934B01EA0161157105E8
:107D500019F0FB0180839183209739F09E01225016
:107D600030402332310508F0F4C0A82EB92EF501B9
:107D700011915F017F01812F90E00E94DE3F00970B
:107D8000B1F71D3229F4F50111917F0101E006C020
:107D90001B3219F4F50111917F0100E0209719F0D1
:107DA000C031D105B9F4103381F4F70180818837EF
:107DB00011F0883551F4F701118182E090E0E80E6E
:107DC000F91E0260C0E1D0E005C0209719F410331D
:107DD000C1F422C0C830D105F9F0C930D10524F46E
:107DE000C230D10509F507C0CA30D10551F0C03104
:107DF000D105D1F427C0A12CB12CC12CF0E4DF2E89
:107E000026C0CAE0D0E0ECECAE2EECECBE2EECECE2
:107E1000CE2EECE0DE2E1BC0C8E0D0E0A12CB12CB1
:107E2000C12C70E1D72E13C09E01442737FD409529
:107E3000542F60E070E080E090E80E941F3E5901FE
:107E40006A0105C0A12CB12CC12C68E0D62E40E0FF
:107E500060E070E0CB011E01442437FC4094542CB8
:107E600050ED752E710EE72DEA3070F0212F215460
:107E70002A3118F439EC732E06C0212F21562A31ED
:107E800030F529EA722E710E272D30E02C173D07B0
:107E9000F4F447FD18C0A616B706C806D90680F048
:107EA000A20191010E94CD3D670D711D811D911DA3
:107EB0006130F0E07F07F0E08F07F0E89F0710F0F7
:107EC0004FEF01C041E0F70111917F01C9CF81144B
:107ED000910491F0442339F00894E108F108F40189
:107EE000F182E08209C001FF1BC09701225030409F
:107EF000F4013183208314C047FF12C000FF05C086
:107F000060E070E080E090E804C06FEF7FEF8FEFFB
:107F10009FE722E230E03093B6042093B50416C008
:107F200000FF08C090958095709561957F4F8F4FA9
:107F30009F4F0CC097FF0AC082E290E09093B60476
:107F40008093B5046FEF7FEF8FEF9FE79B01AC014C
:107F500003C020E030E0A901B901CA01DF91CF914F
:107F60001F910F91FF90EF90DF90CF90BF90AF9057
:107F70009F908F907F905F904F903F902F900895AB
:107F8000FC0188279927E89421912032E9F32930D0
:107F900010F02E30C8F32B3241F02D3239F46894B2
:107FA00004C00E949240820F911D219120532A30DB
:107FB000C0F31EF4909581959F4F0895911103C1D0
:107FC000803219F089508550D0F70895FB01DC010B
:107FD0008D91059080190110D9F3990B0895FB013B
:107FE000DC0105900D920020E1F708954CEF52E07E
:107FF0000E9416400895FB01DC010D900020E9F776
:10800000119701900D920020E1F70895FB01DC012A
:108010008D91019080190110D9F3990B0895FB01FE
:10802000DC0101900D920020E1F70895FA01A19181
:10803000B081009719F41097E1F0CD01DC01CD017A
:108040000D90002011F4C00113C0FB0121912223E7
:1080500019F02015D9F7F3CFFB012191201519F460
:108060001E92119606C02223C1F70D900020A1F7A1
:10807000D001FA01A193B0830895FB019F01E89418
:108080004230C4F04532B4F44A3029F497FB1EF470
:10809000909581959F4F642F77270E94F83D805DD2
:1080A0008A330CF0895D8193CB010097A1F716F418
:1080B0005DE251931082C9010C94E640FA01CF931E
:1080C000FF93EF93223044F1253234F5C22FE89428
:1080D000CA3049F497FB3EF4909580957095619570
:1080E0007F4F8F4F9F4F2C2F332744275527FF93C8
:1080F000EF930E941F3EEF91FF91605D6A330CF099
:10810000695D6193B901CA01605070408040904040
:1081100051F716F4CDE2C19310828F919F91CF91C8
:108120000C94E6407AE0979F902D879F802D910DCB
:1081300011240895DC01CB01FC01F999FECF06C0A2
:10814000F2BDE1BDF89A319600B40D924150504015
:10815000B8F70895F999FECF92BD81BDF89A992795
:1081600080B50895A6E1B0E044E050E00C949C4056
:10817000A8E1B0E042E050E00C949C40DC01CB016F
:1081800003C02D910E94C94041505040D0F708953E
:10819000262FF999FECF1FBA92BD81BD20BD0FB623
:1081A000F894FA9AF99A0FBE01960895242F0E9426
:1081B000C940252F0E94C9400C94DE400E94C8404F
:1081C000272F0C94C940992788270895DC01FC01CA
:1081D000672F71917723E1F7329704C07C916D93FB
:1081E00070836291AE17BF07C8F30895F894FFCF6C
:1081F000312E3330003A20001F55C00301FECC0160
:108200004B0080008000002D002D007F00002D001D
:108210002D007F0014010A056D4168007320006D78
:1082200073003A20004D487A002A20002020005692
:108230000A310A320030002D003000000000000535
:10824000043F404142440504191A1B1C1D03041637
:1082500017180504353031323304042E2F522D0403
:1082600004292A2B2C0404252627280304245354EC
:1082700001020303044808490904050607002355C1
:108280004B1438003E365639573A4C4D4A35373440
:10829000300035373630003537383000353830303B
:1082A000003538323000353834300035383630005B
:1082B0009D01A201A701AC01B101B601BB01E80318
:1082C000D3001A00FF0000014C036800FF034000C8
:1082D0000000640000006400660098000000900147
:1082E000000090019B0163024A00A0007500290173
:1082F0008102D5010100010206EA03014469723AD4
:10830000004469733A004265613A00416C743A0076
:1083100050616E3A0054696C3A00614C6F6E3A00DD
:10832000614C61743A0061416C743A00684C6F6E44
:108330003A00684C61743A0068416C743A00553AEE
:1083400000573A00493A00EE3A00520023636F3F6B
:108350005D3D3D45480D002C0047504747410028F2
:0C836000085050FFC4090000000000009D
:00000001FF
/NGVideo5_8/tags/V1.30/Hexfiles
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property
/NGVideo5_8/tags/V1.30/KurzanleitungFW.pdf
0,0 → 1,1928
%PDF-1.4
%Ç쏢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
xœå][¯µV“n¹@à„[ÎN²‡±=Ï´¥(ªTõ©¡OT¥ª
ôÿK]ž{}/ÏÌNN.@‘ʜٶÇ^^—o]l~:©+¥OjÿOxøî‡ãO¾q'ßÿïxx}òÍ_¦‡Ÿ¿?þ鸫ŒÿßðŸ¿ûáä‹Ô±;¡aü븮ú¾oÔð›:±mÕ6'¦«Úº¦Ÿ8>=·{ðŸcMo´V'ûáãþyüðôüNWjTK-ü릵N¾àŸuomgÃ{×֚ZÿãÁ_¿zpü5MM·ZŸ4ª®Ú¶;ùÁÿiãŸÿÿÔ}ËjøóßÇ?ùñ‘—gT3­¯ép}ÃľÞ0¬ªÈFCúѨiXWçZù¾©”ëšžˆc*۹ޜ¾Ÿ.Œkzjú7}y·×þó֜Ŷùå·?䧎á®ëp€K°¯Láz}úíÏ;¢tÓÙþôò°'DÙ®wž£h[©)Qƒ©·¿îM¢šœ›DJIkZôߎÜ}xúênoª¦66YØk»½ªê¶ïNœçíh~R<ƒé»ãèçcßs°¤á›0bø"¿¢bÿ„ÀqÎ0QlLt%ú™ºîaà|QF‡ÁÂø/kàe~<—î˾­—Ac\ŽãB· ¾e£:ÛyrÏóÒFύ꫾vDzUiÛ4§¯Óƒk4äøô&wG~áï_ęIÖÙ&Y%¯Æ¶×&Ú) Ȥ¹¿x+Y.¥¬¶§7v=®¦éŽÌ£­­œU#G?„¡`¹É¤âø7GÊ:Óʽ`‚𖿏šð퉙#öè`±@–|Cýgß¡¦­iúöôV|z7>áøHx¤Ñ¥tË‘ÂÀ7œ–¶ˆ¸§ï'Þ1ª#æٓhÚ¹‘{”³ËÜÓªÀ<¤sý¨ÚÖ~söJ“¢wjÐ(îç7òºÌXWc[Ü8–º%vò¿‡auݜ¾ä„eŸøפŒm؅ŽÀYNZÀSf±. ¹Ff„C¯rnaŒÛq³ÞO¯Ç§üLk­M:}ã¾WxÏ\€=Q]|”—Ÿ?.8õÎdÏ´+¬õh”ò–æÞ7AÊå}.ì4>uÎ%`˜s×÷†¬bãdaÙ2ݎšöýøÄz8'ÿÐéC0BïÞ³
Ǟù‡÷Ø&'¿åÕ\±šaVZ5„tôo͌œñض7UݛÀ¶¿L3âáÑ)O û‰Ä¿¼Áäêßz¤Ø‘ñ®u7rš!ó1q)ç@.KK¼Ö%˜œ¢Í±]U+ó¬mÎ\¡â>œ§LïÁ…!vçˆZßîdS'ãi?et¦2¶ª»u• J‘ñõuP}wáùÕÐ;šRåÚQd:ò_a‹J~ùš{è^äëH(‰±‘è÷`”4îZ£A„½/½¤½Rþ™<AV&ùñ®Œ›1úV^ÈU]“#{º÷C¶:Å¿åñˆ½¦®¤L„AâDìöŽ'ªq5&¡]l
+b`Ÿ­RÊβRš[
+7 £+´ž^÷ÞïB΂/#wÂ,^ò¯m§ Q3é
+¢wÄÐ;ågÝÎaÙ¾¯¬öŒ½¾¥á÷M;ÊbºÙÊ$„›é^1s°Nâ>%ŸÍ :°øO@)#÷Ð|\_«Geô,"mPœ›Â?ôb IGÍLÈÌ;)ې»ƒÕ–Ɲ_ùÝ.t ø¸‰ õ"L hc#–=
+9¾“mÌe)®+jÅ,í4GïyÂfØ %°âE1üô3B8Ï
+Äç/³y¿/¼Û$$³ØVX&ÈÉ2äIÅÙÿqüþÃðï-
+¸ß+:æMYx.­Imjv¢ß „»­-§ä•×Q˜‹Ð>ÿØ\M-EäDikEk×fƒˆtú{Jýyý=é •%·¹Š|SÔ1ÌZ…À*ƒªkúͲð5`Ãp?P«_a¤Á´_qš€§n$ߝ;!³å ô9È4t”+#„¢‚[
+ÃúΩêaœ˜ÌßVª`ž\ƒ¡èw2#EªKisÜ.0Ôræ¾ &Cë$5¶ówkÌVâ~Ç[s@}AiÜåk)¯,Q˜{•$>Ñ<âêCÝÉhÃ<F9¨Ðq{Ž^ì&Û¸ÒâdNº—pҚj(ñ``‰f›oô¾wÎJ?œí–P1d29ÏIÈdL1¶•ncü~šŸk›ÕsôNúªˆÎ„(Sø˜¬Ôž^"ü¬ÃåÈx¹ÃóÄÂåëÚJÂ+¾¤o"cÂ%W2d÷\ÉLáoq%÷GPmœ#.ŒÖzœp{˜K^ú,д«µcë-`½¶ÏŒû>º Ïyâ|Z“,ÏQuÍÓÎ{Ã`Úó×&T…¢Úý$}Õ¶Í ¾6Jw… w̲†IÓÍAnC‹J»B
+C<rV¹ ‰åº—Ãâ6Pžð'¸`%’*ÚDˆŸrhá>‚õªn!ç
+È߄ŒAš” (9ÌÊiLZۙj•Ðís^úÁbu¨XÄ&–ìJ¨Ò ì: "ËÁÉϙÛä³¢¼\€<Ìlû!:ÕD¬ÝwQ(0¢FŽ@b„%‡†«äÚ=¹`C<ÿ;D؄Aã=mTß6iJ@61¥£øRfyK¾¿1(Ñl$ºr•;¶ÕÓE¾XhÃõA쯀؟ŸÄ~Ü@úAºñ‚‘/á=_óÁ‚Ä(É ôÌ+Faf}P@ÀN¥‡1rk^oÉÚE®?:ÛBP"ß/ÿ6˗ðÄÖÈFËÊ«dÒB¬yEZÅÜbÊÕÑ¥“SG)‰Æˆ±¿ª)¢
+!KšàÕ©5pZ¾-³Ãk)¹Å‘Ø6ߖnÍ®fcb¬Í·EâŒRá9—¹áÎzØ¿ ë!ïpÃ`%̀–nFI5_Á³zWgÓñ¹´3Ù¨¿dúÀÕ_
+âP@ÂÝd̳ìÖuUm%O
+ÌBCn°)1[ß-\\4­k5@¢ Êɓ³68«È=ó@ý9…Ò–7!ú‡•ƒ‰‘$Ü8ü@@ÑÜxá ŠÇ=Q9<]n†PàEoEޝëªsL¬HÝ}̨~'ŠîT¦÷÷NbÌ\³Ã+‰2ÞÊo:šÙ±* cпîo ½‰B(?šŠ· ?°[¾=.WÍï>ø")é
+ðBÔwø5ïÌ X¨)¡¥Ú-6¼.øè‹ì¸(«í¤²jÓͨŸ26»-…Ø N¡°@5º#úpezv¹*1o¹‡SOž‘µ& ê&®gÄS‹5fâî•Â“’î]=%ž”KŽ_½„ñ°cÙ*µ` »Óü>§5Ž€Ñg,¡ý-Æ2K,9’såŬ±@϶¦1̆R@@|’°éHƓ ÷&·/ƒƒ
+ë}Îb,*öaŸc¤qÈ ë®²JŠô¯Þ|»¾·-d€°Ç¹½‚{J7ÃÜfæÏ`îà,Ï`n|Ïþ¶ŠO7#êy+/ɚȨDNÊG³[óYâI7u«+š»tDìH
+Y÷ŠõC]yª­^÷x
+`‚ÙƒÌ5¶ê8ÕðôUÁ<ֈ’y6`à˜¾uyHKëí7z&û“פì!e)ü<Ãv³˜Bjù™w+õšÝMm7b΢¼ËÈi‘mE¿`ž…)–K»=K»%…Ńa)t#J%ì´\õ8Øië9l,M¤Ð’`kùú‚>ÿ”Œ8%3âx^«'@¥¶Ÿí<œï̀šÆêÊ9H˜ùawÞ}
+ sޟwäv5½Òó_•Î±HM:PQ·àኝ•“îZ
+´L¾@×û˜±&(_ˆcÀE
+JqM¥ú”Qá&=0îÝxS¡ÓÄ-ä¿‚¦9åݬnUÎî åºpÓJ檽x$GcžàáÖ¬@
+U;…CqIæ1½ês̉‹ØL64á^ÂÆßò/]¡*¸ÿ+K~aӅ¾­ë¦è³®–É/žœæÃÓJeã‰g¶ŠŒIrêB)¤ƒº˜ÍÎ ïȖ[2—ϱ(sk"Bò'/M¯qd®
+–‹Oã°¨ÃAª¶À]á?æÑX“c·ŒÏBKà3̅á3\âúhM‚JoUÕu°•üõ›°>x„wÐ$“»­ÉsXÅן‘ñ†ß7€iYWËó)ìNáØ“?Ÿ<VïÙâÕ§åyBýüôß
+ü?OO·îendstream
+endobj
+6 0 obj
+4731
+endobj
+15 0 obj
+<</Length 16 0 R/Filter /FlateDecode>>
+stream
+ hÞ<̏·ÁÅ|ŽpÅS8ž^]3œæ¸ïŽæ¼Þ7¥ÿÀ~g™S‹ï‡oõ&4J“îáF¸ã^Ön{³x6¯P_wÁDïNäS5C¡†NóÄ~\„ˆwgò¯†ñð“i5j
+,*®`í€xqðw„Áç;.Ä; ·~ÀŸÂ³ÐÓXœý…ÏèßýŌÖkÚh‘Tÿæós8ÆE pÙ^»i2ž]Vý6yö‡z+š~lJT/RipL{Ç©T«G}¹°ÇH›'LhõO9íz¶²Sª»z&¯Z_ÜÙGkÌ©9“zA€«òÝÁ,Ë Uei°DÏܸϓ7BaEåR„)ŽöàÂ$îû•ÀñÏÞÕ+26–w‰’“ ’ÕŽBÉéÆàïx×¼×Ð4ZOÌ˳;líø2âã"€£Â¸˜=ïăƒÇÅ'¸kîwvû†­ä‡{m—g¡Þ®{ûú­S#´¸ˆ¦š}-ª ,bMÏ܃ÉL&–š¡?Åubñ{pìÅ¢ÅT¯~G0ó¹C¤§0âg NcÒFsŽáü™J÷Öüž"˚Š
+š‚ö¼ºÛ¬­¿Š`ð,tØU'Gmwög ºmêÀÀåäsbPEjPHoÀæaOØ[ûŸ³j‘¡zVók7U×:22ùûör†ÞCºÜÞ•¨H :YQ–oL‡=Ã
+˜ôę[MÕ[ˆ^dTWv ®ÐFbjkH“ýÜM_ÍÌ°NæMKþ.?ÌÜVç3ÈZ¸8E‡Ñ\Z¥Šyd>¢jîédÁtÁËÏì¹ç¼ V{^6y¿ëK³¦h ¤zZceWc½÷
+@DÀõ¸b?°y¶Û)M£í”ÊØ)Í×裪6›t>‘D?–
+˜Ù¿–,bé—¥x1´ÞµãÈi(ÿ×
+ΙÎ@ &ʆ©ÓØP<5܄a© %à,Ù;½TΑú”ƒg¥uEóҝõø½ÂKßexï?øzæ(6 ] ÂÔµÆÓ[¼íkb€
+ºaÖ®d„(ˆÄŸ¸õÄ fI§5–Tÿ3cEúŸ»mƒcÚÚWŽº>Ò³íêfÄ£¯¨Zx9Éz}…1"fŠl‹±l-EzŠ½Èa­¿4˜ßBŒó¨YbÜk¢^­a=•Z„ ÊZ…§:*C>]`›´ñ“nuï¦k¿Öú¬žWW©”¿6ÑmÚõªå“!Œ5Ä xËùp
+ôÊ<‚4hû¡À´çF‰‹¾å¦2ú¬%H²Øª†à¼É±PõJñk©ÚðÐ+oyOª"÷Uºò'Y AïÊGï1}î±Ã\”lIÁ "ο@¤3|Õ(+:we(©æÞ <•Ž>=s¥®×1ô}xG6׬Ї…~c®Q€“•
+˜RÁÅÀ–åVýd¡ëX듅•çmîîæ
+„òUl{ÄÒ÷•¦c#-:Á×­}’¨JØÃE•áâ1ºpSlœ,"b¹$åÑ©™‚›fýy´j½#4õ‡GZBêGËB, ÝÌ ÈFnX„*¸škI:Ö
+hø™¥R'Öò7µì.¦H¡úU]n*»ÜÿKé€D³¢€Bß3׶ƒªÇ¥¿Ä.àMé/t©¹6MÓ…\.†¾Þ°LÂ$±ú‡
+´E†lL‡k(J µÎ¾D]„¬ygfÕuáaóº¾YϔӇ8cbL-{ÝS|\XȐƒEØ@^¥‡`谜)ÖÛümx·#ã(
+fm¹T%¢ý±æß¹¤Z3•û€Ôîw˜*ñUjn‚$ñ
+™†2¸l >ÄÇTœÀ1‡™hæ¯Ç ~  7´ÙÁ’N"/ô¾ Uä€î¸Í¥ˆçåžW‚Iƒ
+|ƒLYGëºÃýïàμàM Ñ_¼MÍMš¢oC|O²,‰\^uڞì'JYTŒ™ú /‹vÕ-X¼ôõ²Ñ‰Lþtù5G½1î•È›zÀ’ÄÔ²^§›·¨ê»sè˜w{t‘"àéÄZŠ5ªºH¦hƓÌC
+\ÍùÂÇËê2ù;í0†ÌJ«|zÒÇÞCM´Ôi#?s·ñPºôëþ£õ ’éR4Ñ€Š0
+êeò#g3².ºÝ@±í¸fõõרC y-$ù08¡®0¶€†ÞÙPÒ¬׊Y¨,
+6!ípiæ#ō
+pw5R+î´\åÚ±à@4ÄÙ/;¡*”ri
+¤ïÆé·u…‹÷È­úÉ#»IéWגIðàÅ¥{¡•Hh<Ÿ\J
+’Ë¢ ÀVÑäH3Š¶ZØUrªãjæ=\’¥¬Ç¿©ÂsüáCòהóf bTª‰§@‡f>°Çîªy†U厴k{HýpháÑ¢ƒä-£‚Z<ïO–ËSgÌJð3S%B¥nwՇ0Y“-±“ªç“
+ð>Á6 r=;³ÑMì"KQ-å˜åjƒ#ò\ç»}‘B«U÷^«æT™ŒÅ$C( 3í \ڗ˜Kõ†N6Í®_ªG5c®Mx‰/¢ªJ…-šîq–òqbyÏ«=TŠêÔŒ€þ÷wà˜'§ÝwêýJIÚBÔsÉFímLb*E HP|’X”¸XŸËÒ®EÛm‰h à5»GÈ÷vþ1 …ss?+d¾ŒI ` ‡Ól
+nëÛ;>èZq¥@¥AiÈ¥Zj©Çî@+[K‚tGB$7¸Ü
+f³6°:é6)«í0ÞÀM¿
+ ÁD€C˜Žµîš 3ìšÄ”¦ûˆUÔ•\…Œü¤©ÏtÌãüzÆ©F“dcøK«²ÅãiY¨C`œ."¤iCIUa»ÚáGùïiGF˜›_i
+8Mïj×$µw”8ýVì=baÅ%p[Ãô9Îut©I™H³$Cåîð`În﬌@f-M9é.±(ͨÆñ!MEwQ¦ÙQ;³4+x- ‘æe•)ØíM§Ë3…dø“à×J‰…_6ƒí“ÓŽ…RN Hƒ1Ke Ýxó¡¦m³“‘i2Z:
+ɀë>Ȝa–uµd²)ƒÍ;É¡œc‚FŠ6]àâËHî t”@xÖAƼí¢:1U_Œú¹ÆXµM³4û08ð˜E:¸¯ÓC˜¦ü#AÀԈG^Q÷y¾òò/<ÎW…¾_©xOW°d~QÛYè}ó}«ÚÄ؈Ñ©¾Ew¶D·§Õ0+ñï—Ò±ÐC[ȐÒ÷V’ùf2_В-®Ö‡Á°¡ëvÊ^±GQÆ̆/¶ÌIóœÄÆYÒãò0ÿÉdÏÖ8…ç9´M…—¤v;א–-ºÃ²™҉ÿɛÐò”iû$9Í/’`ù _È2àOÑêÞÜ>˜Äí ŒllB¥4Ð9
+š ë×Ô+ÍzTì{R<RPŜ×(óT"±hM¢Ì¯ÖÐ{­!ÎNÀô¡€á:é†gôxÇUSÓ6ðX C\Ðá$XÚà×Ù%/ÒhÛz¾¯Bù&ºÜV~C¡K(+¤„–ÔÓà m 8ΔÖõ¨,¥-Ô2ٛKÓÿªŽ ñzMö–ÛÅR=Ö5v²¿¹âÏ=]$ðÙPB•œ(Ú¼ }Âc­­K$—ˆI‹‹¹©£Í(Ç <©lY¶zƒ(
+Cg†´°ïn©‘#‹ägä™s­]K Å¶gâÖDZè
+ðcĆÆZ¿î°—¬¹‡»½¥qžŒ¯™«cÖÛ,‘øºhj§—
+IEá§5¼ÃÚhteÛT¡bŸbI,[6:CÝõqâ…L_t}嚭e|ͽEÂ@³Â\¾E®C
+Sú/Åë½tÜû¶goø²Þ»îð;jÎà=©pžŸ™´¶jÚàꎾîðÏ÷iìŽa"<v0ú Ô?ÜÀ<úµpþ“P|¸ó†5y~V á‚çék}8Á3§ãŏÉÿgâ§þ0ýF¡áÜÒQ øa‰ð»à»Û/Ÿ¿ÀÓ­Ï#ºƒuÛFºK˜Ó* °8îsi"xÞRBI?Ìä¦1-ôÝ)®E­e¤GéÓ[CmQŸ|®˜‡kä$ Oݽ·xYºBn…à9íì±7­p]äf}Žy‹,›uMûYJî?Át€=&"Þ=Fыóœ©"¡©ç~"öH"s(!«¶\\23]€l{•s·p,ááAɶzÁ¾s¸ªjÎq7ç‡ñ)Ì|$yÊÒÁz"®]$äC~ʩ̵+Š¡%jUÁ|Ùoe岛ó>Z7‡
+×Ú²f;êÇXWö?eã%þ­gãØWæâ:×ێWììpªç×LHÓÏ4¾ RSmD³\ÚVŸú†¯.MiËòRúµ¤ œf³ÖéYÈÅc•C· µCŠsÒõ´¡Æø‚éé|ÌÈQµhã¨e:HX6 × £S&Q;§³±Ú9)ñ|¬”Cžuâˆ{ Yx…<ÛaG£JU‘¾Or¡ãO£D9ak}6Y§’Î`сø:#úkû³K¶‹ë„½BÂ;tŸ`+\~Ŗ¼
+Qÿ¯Õ+wœé$,Dî‹Û×Ò=„,3{éòs­
+Ã]ÃÓqùáŠÛoÚzÀŒ$‰5pôñ¦’sOÈÇ
+wØÔy^xÉw*Åñ
+çk1ÏâúúIr›%¤îØc××Ii2Cµ,…ùÑVs÷:µîG”¶y±§Hi±Ç,í+ôUΚ *ZåšP7E²a’Ël¢'•a =\íh¶è£ö=çeïTáPþ™ÜÙ¬±Ù"èZç»à‡TÓ}º ]Xn`ߙŸÃq-è~ÜW€Æé„]¨~êW™2Žå}³Ýõ%æ×4,døyfœûh_®v#òD)>C/O^Àx`z¶š¤¦²r}–‡a oÝ2]óK\šÚC’,­¾ŽG\é¨Iö©Fög{¶ÀÇ DW;þœá°à™ £m´¢š½í+ÿþ9Áµ;­„§÷؃ØTžèàù:Ä÷Ÿµº}kê0|‹‡e}gê®þ¸WÐc÷’/‡‡¶”wƵ$ž)\„T¥Õèx¿Qu§Ð:%•Ð´n;[~“¸wâ>Ȋ†-…ܦBýÇ_5ÖI9hΪ†¦è†!uƒpÄ»²©©v¶ÖDhVˆI @ԏã½_©Ô¾q{ç¼Ûš$S¹+`­-Þ+Õ¾šeë@43këF]›¦ˆäÇÅ ø\+xЭ³9æø ®m(Ãdžße
+f;Ý.ûÓM\p4қtúüߞÒå[u©†q.ÿ1(Ëý3º×jÀ‚¾½èij¼îǒJÌòèm¦¾IµÚMv¡üÄ|ÒÿM¬!ÿú!]!þ ò“c´†¦¼]ôUO{“”PÈíÕùi¿)dl(§õÄϐÆnmàõÅ<AÃGí¸*ªÚÈ”9øášÂD>ÀþKáS)&â>sŠ}ڗ6çÝ_g‘ª†ccCÆÔiz1÷WT >uî€Òö¤žuÍ7W§ßèÿ݅íüendstream
+endobj
+16 0 obj
+6524
+endobj
+20 0 obj
+<</Length 21 0 R/Filter /FlateDecode>>
+stream
+xœÕ][Ü¶Æ&Ùx½^¸u¼ö"´ã$Žgl,Jԭ郓ÆNÑhâèƒÝ§MQÔ)’þ ¤$’ɏº¬w“¶y¨VCIäá9ß¹Ó?lòL›\ÿg.¾}uüèY³ùî?Çýíͳ/Nj¿;þá¸ÍJý¿þ^ûjóùsõ`»Q¯yþ÷ã<ëºNŠþ7±©ê¬–›²Íê<W?¿:Þìžÿó¸PwŠBlöýǟÿíøÅö]‘µBŠZÐ·e]5bû±¾.ºªj+s¿©óBþëó??y~üµšZQÅFŠ<«ëvóJÿYÙ?ÿ5üYtµû³€?ÿqü—Í÷ç^^)ä¸>Ùâúú‰}½àµ"Ÿ ›z¥þ?õÖ[±Y#‹®Ù¾½ÛËL4­ì¶¸Ë£]™UmӕÛ7íÕîgxèÚ@RÙ5ž4m»-vûBMU
+¼…„¿Ò=nBÛòr6¡ÛՙÚa)búêÍHΜÑá¾GT\Í-*oë몥Žò¡+ä^²Îúy¦KìÛ@ì„Ãòùn_*()Ú.aÃGN£¡y·*hZé’|Áþ3 Oì@‘TѨ¤ÓÉᬳ²²é‚¹ø='Iòónø,4k‚c#Þ uò}ÿ#Fõ¤,мçSƎD»‚›ð#éú*«ö®‚fó¼R¡oC3ÆdH*õ'
+DŽÿ3÷3~ÊÚÖ÷"¾sôó(ȜxÕ*¶i­ß̃=JtxLün±Ÿp_c¡íh¾çŒRñøêÔ·ëRvé -ó‰Ý2eŸÇ·ž8»ÛÚâg‡þQV6ÚÜ#uÁæÙ¬C±3`®l½È6腕ÛD=å+ÌR¯0Q["\hRÎ.Ž¦U¨ð¬t#ºëüqó~¦R
+äŒO‘+äÁs<ï/ˆ \uhèiHÈ6%ÈØzƒ9¡,ŽÒ‚:Hґ ›;¡éR§’‘Ó®V¯X璠ÜÀšIŽ9È<—•«Cht€í§s’b{××xKÊb’
+2YQêgðùu… $m@E!ašOáwˆ‚ef Fº8Cðpâ8[¹6e"lw¢ºG‚ °æ›ƒåY'­šû—÷•Ê® ÙbŠßSµe—h4{I<ÊR,Œùq)Æ)9ls0ðûEA«A)â;?pÁ‚a@Æ ÂP„1hËð„–Bw¢
+Å|ª¥ü! 9㾍 ©¼:´‰CË$x‚Ä°ËœÆcî¹:ñDqÐE·“ÒËkŒ€,3{¹!á8ĸô^n.jŋÜўE¼Ëɯ$5Ãow¢/³‰
+í%ñW
+ŽÜ²Ée„!8&Œ€HTP{B‹öhª_¡úqlȇ«gK[i•
+ ˜(sáJ Œ†N•>ዱ/.ŽD§—‘ˆù¯¬‰i²ºQ¶DêÑ ’’ɍù1κæ2¼kß}“.êÏ=]¥1ŒzyÁ-L?2^èb5+È…ˆûÀeh"eÍ¢^ÌD½r9ýU]ÌC¾8˜Ã>ˆ¦°®9pÜçÏØ׉þf!¹ysuºRÐ,ÎT¹â‘ž.Üü£Xlë¢=ZÔÄŠúzpVkÑ¥Äl.5NƒU«º,¸UÎ(ŠFÜXé\ËùÚCT‰ë͖ øjз¬&J¹;ú
+0[Ä~È#½,?Pwʎê.(¢rƒD
+¥k¢@‰èòÄá:óóå‚hv‘z-¿º/ñ”;‹gØï Õ y°O±ÄÑ5WóT%Muª,íå¥|¢¬È?^*š§ \Gí?N¹‡-ƒPâ4?ó×N©é|ƒù.ŽH-y/r@Lùv6ßo`—w]ÊlðK¡¡V¬’Û3Fö=pÔ¥ ÔÙ¹\íw8}á<,Vڕ2þ“ý™ì؅Õ[uEK6½I&dç•úz½ê¾Õ?D5:ÒØo)^Ó ´ä<¬¸žv}vÒËð} 7±Kñ3\'Â=¢ø»±ÉG´Ä÷;W……ØÖBˆ‚Pƒm3›Âݏ®nâûê#\itÀ¯4eWÌ'LœiFý#– šJm„0œH„aô7Ì1?‰xj✒d­éՖ5I® G¤êUR+ÅBªø¬¡·ðR…³ óãb#.­ìLÃŽ"ՇN›"c6ÕÁŽ „‚O¸œI’Ô­N<ÿìnѐïóñÓzß2qŠO­Š°"îŸ7¼iq7«LyÏäڐ;íd:H²Øïµ;MçÏã•ÿޏéLSþ‰×$m¼$n,)­2^RÑX/ võtŽú¸ ;’fÕiyFö‡Œ¹í•à óbÄÅÑ49ú(þ琂¦f/]Ã‹±füg³þ õ‰ãKendstream
+endobj
+21 0 obj
+4561
+endobj
+29 0 obj
+<</Length 30 0 R/Filter /FlateDecode>>
+stream
+xœÕ]ýÝÆu…íÚÚ] rlIVlí±«÷d-Íá7µŠ*)ÚübcÛ´±ûS‚¤(bIþ 3$gæÌ̹òí“Û&@BqùÈáÌý8÷Ü;—º. U]—æ¿öà·ß]}þuý‡¿\M§¯¿þårðç?\ýéj(jóŸéÿö»ë¸Õ?®õmnUã86jú›ºn»¢k®ë¡èÊRÿù»«ÃkÇÛÿ¾ªô™ªR×7ÓÃowõÍáõcU ªQ¾Âœnº¶W‡1ÇÕضCkÏ÷]Yé«ÿóöŸ¯^Þ^}¥‡VuUuݨ²èºáú;óÏÖýóó?«±óÿ¬àŸÿuõëëïO~½Z5Ëû5¾ß4°¯6ÜV•ô¾ýt[}Kóú®ß>:ª¢oª±?\ë¢ú±>¼áŽ~t¼QEٍúϗǛÊ<¨­ïϓ׌}sxëxÓªšñp™Ç~¬5ÌoóûS8Ç÷§y÷Ó¡ôºëÛ_]éyªÏ빝ÿPcWՍ~½ºó¤À¯š¢l†zþã7åÞí%ŒGÿ¦{Ó×`ðoÃÀ–+êʼ© ¼ø§ætݵm{øÒ=/hÝهóVúäƒI*õ(‚‡éŸiñRmÝ> cî¥Ì͆áðxúóкW›~tÏ?ÌÿNâøÝ£p…´¤T0²ª=üã±*‹f,;#úd]ªöðí÷NÍàønÜ—p֏ý38 Sý¦»àIt¾¢oÇ`¼ö} ëø<¼I8óFþª¾*ÊAYùywšmÕ·‡³”÷Uxê_;ê·o”V°Ãµ¹—ÖÕ60dÿÎþ_­'~*í¥Á~
+ïƒïöîñF[¼®ß5‹”˜qƒÄm”sAr²Sð*øøoÿ|¼éŠ^ ²y¾>Ô³1ÀµËÚÚü¬jK3É7v–o´’óL':bÌL¢#“ʢ܂œ<
+ÕÈ]òá<ª¡9°÷/Ú|—u‰*óàxÓj¬œ,š“ÝÑû‚p]òÅýà8êé*ë
+¾¥ X~ îû“·‹i‹6tVþÞÁ—ϝšXÉ1Ñ
+d²&€j÷Ü2qé1^†ZŸíBß˜Í у”OIƒ
+‚Ó½ðÏ` ŸÅ­k&ìµpa™F{9‹%NrÜË
+ Î󆈺…í# ƒCNÁˆ
+Ž!0”.¡Ù ïþ¡ë†ãNqِ=u¶c‘°ïQ¨¡ó©×Ýq!¤Äf
+ð ý4`zè8NW}ê€0jTC·“ô Ÿ&ìÞ½*#ͬÍSJïß(ȝ±£0]·ª©La€5~èo¸#häöí÷G-EYŽQ˵±¨”ª=×¹6æÛ³öÛt³5f»ö¯¶€î’VnfìxW[DñAÀ6`µ^ؙµµmV§µ6¬àö‰Ì°N«¡4Öa㟓¶çúM ÉØ|Ý-ÒÂÞ2Ø7ÏîR‰^šŽu`­fJÃéEÛø ªg ½Ãö$šâ±L:šWøu(Ŗ¬ö‹%^d`3xÂxÅF<‘üŠ¤öaþí X2™whJÁ|þ{nÜÏ
+YœL?7!±«É
+toàûʹÞQm£%ãP¥Í
+Ÿ­|¤¢˜
+é:Zz*ë£{ڎŒlE„ œ¹ƒ‹s„·ž«ügŒÈS A7'دp©±‹ ‚ågÛLü8ŽUê[†Œ ß¯íá4`ìLÐLªÔËw8LÑüM¸‘¾MÂv™ø{G]Ò@™ºÏ´¹þMRš!%K½ Û³á<ՉÕnÊÔHçèÅ-h;Àúæۖϲ*ÆÑ¥ÛDÞ¾?¯ÑÝSÌ˛²<Åæ
+c°ÁÃþ4Íä?yօß‚àîS¯šwfîçžaó `Æ4q6rـ}¼ÏôV‚Ä$¾\`*g2úý¬ –‚mú
+?lµÅCŖ_JΩõnŸ<¢¦qóZÅéÜÝ°‚<`ULÈþ‚|R±]¾¿zcgš' 0>vG>Cq³Ag7~âݞ]—IÐÏ-ǖÖ֌ÀûºXȗFn/JÀûãIU|×.‘ÓNÎ ä
+¾¥¢à¹lzÔÃp››HYÙ$­x~+)M¦dÜöìTÔå_n™ò#J›òŠ ßÂBRšÚÚÛ2ótA›A&¡JÄΓV˜Q‚2Ÿ«”,‘¯”ž}Ã. tù„0îWûšäÑñ1/€lSšï15MTëWk.õåͯ6gTӍÅà¥Ö–UϤ¿³ÔÞ.ŠLðC™fjm5CÁ“ü3µ?•ïÉû§åzùéÇVÊ|åv8TGeÎvyëÈٜõˆ-ªtÌy~>n©Bk•˜ÊéX•Y…Ú÷wœÏÙÏ«²x Ï=$фBæÌ^&ºë)ß5ò\1~ø!T‘ˆpšûWP! †Fރ$Ô:ÛÇ+x³Y®ÔZ­0l<=7Û«Û¡>5Rù·µ`ú’JÞ]íœ8åÀÚøK@`W…3P
+ªâfú˜¥af˜· XV7×6,íúÔ;R·õÛ\Ç&Aƒ¦äS¼Ø I¹+¥îb´+̹[Ô½òo£lh¥Š€“"6ÊVFà‘¹€àk©i6DP%‰²Û,ó¥ÁïOŒ´Õ}ešfÎyxe²Š«˜4±YÿªVDH"U€•}ʗÓü0úýš˜ÎQe«rîåG» ß¶/FUùÄ |H‹]„ÉAðæ>½4c®¶«VYúz¬q“ZÁ­"fÁïm¨þó8æ¹6‡nÎá<ÂS'Â;Ðäv"æãóWnƒÞ‹míÿNÍSf†3·Ö²
+‚l%õÍûéü¤à)Þv%»¶0Î+oØܘ ·•/4*ùØú?GàCQ·Cjƒ¸•“Òe[Ç`›Ø18›ËˆåÊ1`UÒB¹ ?h/՝«Pî7±xs~ËhnŸÈXN7¤¶H9ïHÙ,ê¢áäÏ°5NZ\9;õøâÐlS! ê϶íÍ…Ø ‰Ðæ—ëùûáډHæwúã×ÚOùÖ~³lΝí¬löÚUU\ BüDZ8ýÏËÛ«¯ôÿdÉûendstream
+endobj
+30 0 obj
+5883
+endobj
+36 0 obj
+<</Length 37 0 R/Filter /FlateDecode>>
+stream
+kãömœÄÅ«^­4ô>¯é¼H¦™ŸþÁÌ]ÿ—õœÞ{º¸¿Ø­Ö©Å•øê °É«qäçi‹w“ð߉O=[,élZGâ_¬ü’…r4­M]ÑXah̋8üAÓ1Z]©Z’RÿÅ8€_Ù*Šårš€ŽRTuãh½p‰Ý€Wú)”"1³oƒÕރ§øå<{µ\5U+DËOv©{—QMÿ³5:3÷´XÖ¥t‰c÷Grò³Ñ ¤ôÒùÄÝŠÖÀ•î¯,`Ïçƒ&µ´l¯IÒJRϖ¬2 Ô¼օ·ïÃ5Þ?HÃøÝôÒ£‘x.d½ŽŒ&îDuÝ†ë“1Œ®M’$ÈK>ýž-‡tNé•Öѹ×ÊÔUݒ,æáçÖÕž>†•Ü• s)C¶Ž «—¡¬Ì^+MíÏf5Ϊ³k@`¡IïŽèú•cØµ iàHIoGP¡ŒÉÎ*³ãA$h"c­õ&R°Ó xÈÕKj½x,9Ù×Àt„cÓ¯0ۍôü||+oç c×〹’ªÅbo¬gÓ›nEÇy‚ÆÔÑî&ãwKòÀ5í °áÑrE¬¥Ñ[ì57pÎH˜‘slþ¾µ0ÌqÍtâõ»¾ôC®Òî¤òKú‰A%lï½@>.¼…“oéD¬…ËE<¿Qd\zãí EéÜ LZÐBw²€’ôȬ| p-ÖÇ`nhzßÀhf‹Ù}?¾Ž3ÞMä¹é֡֞ZƒŽx½Ï؏/ÑaFðC~‘0.Ùr²ïÑ#
+UœÙ³Dm6Ýݖ<y–ÎPG½CQøÐZã
+»"'N; ³2Dz™†|Æ^š(GîêK
+—§0íùq7.—ŃûQ‡«®­È\=Q¿0 bÕÒÔI¡[ÏØlÓÑ·¶V珣º¶U“):úC.{wÈ:¹-ò®£˜p=ѓNªD zN_ë<Qjo<9À«#@)„DØÞ>Üæf‹
+¦s?!GŸOЄºMù„³Fà ?æð¢€7¬g.6N¤çª‰¤Iæ懝#=z“5aˆåëÿ'øþû ¾_¤ ™Ï ‚Û’CæYk¡ˆô}–W >Á÷ƒ‘ONéóÏ«Ik+ÿP0>±Vê͹Źj>l`M“­j°D£Šøúü¿óWù%ö’Çøé•E”në,´Ÿ]Q|§ØèL¼¯«§ô…„e ™ÖÍA{¢’•Y{⽔؛ôp…@¬tóAŠèS##Œdt€¿äÄG
+8칂®t£³pÀÕ¤Ž,DàTòYfÙ'èET&øA–ªŒöÉó6"‚eҞÛCßq>™^2ök›R-;4¶·,EEñ~^³î YŠNËXÀÆ烎ÜQ„)ʈ1½~lQxE<€¼^×ø©u¦
+‚åk\ÄÂg Žráv½ÜU³PiØäRú%¹”¡kb·¢´LJ
+;•Åº¬ nÚ ¡6$.\-t®³ƒ5M«lÂÚǜn
+žºi»Œ¢!‚#háMiŠU3¸Ò{ Ë»µms±Ã4¾EÔ*\jy+ø†s‰åvã‰ÞêضÄ÷-\
+p¹™⠚Í}¸_^ ;9=´$Jƒs_ᆎ2o2ËaL€Ï0AwöƎè¦Friԍm>ç!:¢êqA®°LGoûÍɨÉkoóç9¸ç­?ÒHÍõáö·¹ëršþE‘Äldy±i9ï×K, ”¨ÌÞ$¢;ÆÙéÛ r(+Wé…[€ÅBç‰OHQ<bóp„ë0+8Ÿ¾‘aØÎZõ3Zj`ýé+‡ôÆó7÷5â÷ùÍ-jäg-#°™“d^C‚Ö‡*=·k´l€1A“ÒQA§
+Ÿ -y ¾Mð·Ë¶$BŸóÀ’0æ
+ùÃéҗäÕØ̒çB…o‚vdj)›‹´ æ©0$à¥%M(4Ý惶É9›ÅXû>M’zX"jr)IߥÖ¸ë£4Ù¸+h*
+ùÜX€.þŸ4Â!h‡Yâ•WÅDÈ5.=ÊÏ?¨„OŽN–ÉÞ [÷òÍÝÈò9r)<r4Ù76ÛwýóÑ.œõt~-=Vèiy2ûpDˆìendstream
+endobj
+37 0 obj
+3557
+endobj
+44 0 obj
+<</Length 45 0 R/Filter /FlateDecode>>
+stream
+FT|o9ãQ‹èóçlI1¥ðJÙq ñ¸2£¢ù>“ãR¡*ÿÜã ´Rcµ±¸íqYˆáþÐy²æp  &>«Zæ•3#ó^#_¡õ멁=“U˜øäF+y ¡K#ßßÂ)õ0Q/ }¿¿l¥¡¥ áZ›(™ %×ëU' CA;¥<q-ô'Ê%C90@*”@>Á‘qÞ@B—„æó:CŠ¾\ph9-ëÁ7ÕT®Êéy˜ÓAž•È·¶¼VJ¡šó¶/\ÆQ£V
+6±q¹GœGãQºu€øbŸúrj7[N#o·çlqò`§>ªfa”üH³™Dû<]ÃÌæZx©>ÜËõ!èñð<
+6“Fᙉòƒ{9s1«ƒŠ*=5
+•bm9*‘ÆûWÖåX'•‹ã,7ðP¶ò–ÚtžãÑ(Šg¦;÷Á˄sk ½âŽŠ­çìÍwƳ×Í!:~-ìåP/ZÓ"Èײ)ó
+33ÎôŸòƒ%:SÍ´†eÈLl’ÇfÊ­~.ڗY‹Aa3M2Ûû蚘<&!> ³ZÀl£cšr–‚Yã÷döØqê~HܝVßÑÐ2t.‡¾…¿¬PHš!½ãôê„.7|èçôüÖÒ°ÌÚË^›½»©»ò±ÉÚÎÂsz4j‚Û¾Ÿ­íZëCÐâZ]êžåÌÉ=eáLë˜Ælhå}é&ô1¯‰â  (›zˆo"×ȼâ`Wî‹õ¹bŸ¢5Å)2Kx‘¯å
+õrZSäh;I© ªÒðŒeåAºþøh?… 'Ä<0¥ Y^¢âd€.NÛԁ›#Z ǚÏr&ݕ£ýÌs¶Ç¤a5‹fUôMÍ¢[ÅeÎÈÅ0aBüÜñ„éའ‹Û.àé'™0(€"&O}^"”(–4¼e>¸õՙ˜eÆAÕž¿—?ϟTÿüJFendstream
+endobj
+45 0 obj
+1479
+endobj
+49 0 obj
+<</Length 50 0 R/Filter /FlateDecode>>
+stream
+xœí][¯µVHÂ999
+…Ü
+ôãè÷6<¿¾ë³¶È+â6A5t¤a뫑/;x#XÅ·dßyVåf*j¯¯Q›]"õ6þݸ‰mÙBo’„~Xûrût§ËM.j]œÚ~OÙœ²Ø4÷ª‹¦´‹2´V»—UMUۏ–-›*kÚÆc¡¡íñNdy+šv»é-ZùÙ»}“‰¢­¹¿²mŸ×¢tZX B¸l¿ÃÝ»3 Xç¹P„*Šörڒ=„…ÇŒ j^¹³+ë|©Fùè¥ÈÔU1NnìÅ
+í<´ðf·ðˆŸT&Á4Åüj9ì‘}DÛtM§å”f/üŽ
+c‚Ò½ÞF@€Úˆ{À‚€tõ»Þ¾2·ÌVµÛ?ìä“èF›V=IçbB˜jr$”ć@û„ȇÕÈH[¶ŒPïöÒ½iä:ÐàWŸBoèáTŒ„Y8Ô¸U½5o)ϪôZZ¤#D­Ûzàúøý‰zە…@_Qü9]˜@ª-a´+ٍà{Ö~
+P÷Ž…ÈǶäÐ¥-jŒù¨ÿ÷ÀB­ð]¥@Áý¾8ÖÌÂÕÔÌø°Ra<!â,XV˜2Ôr·ˆ?¿’ UÖBl_5âúڼӁûö†»Æ£ÍQƒY!|8š¾a¹œš¹PNP¨CcY ¦‹Ó³6©¤ÚÏ#Hæ
+=÷²j[wEÕw:P"µW?T™Þ¤{0«‹{>V~†M”TÉuŒ„Ú!Øc_²ÀԑÍZùÐß41J‚`XÓIÞDeM+XIú ©C ÑÇ5÷·¹2'Y‘6üò†]ܘ+Ï&uÝ®I}Pü机%Y˜­œA~ohÑåe«k0=G†Eï|‡N1ª†½ÁÚ´Yßw(øRxâÎ]H«åæ™tázÏtÚ
+ø,Y3SÚkrœ{ï;=FI¡< -þY‘öãŒçˆÞ™>m ì ³{“:7@É/'Î!t3ÖíöÃ]¡ÂŒy1U´íõê‚xZ×½+pܓu º›ÆÁns{D9|I”
+G°m°
+cÃtfgþŠ1‘h¤ÃÁFŒn#qÎύ™ÛÓ<.ÓZA°~͹,Za µñ¢Œ„¶pZ“G¸Ãξ£Fˋ¤ÓJ ™% ²ÿقQ‡N"¤i›xšœÆ“ÑCkq]‘S!tAâ‚ÃoÔJ[±L%÷#I.lò׈-ñwÙa-wÉÑ¥YWuð=I­‰‚ÿ%gMX ä:¬5y@&´_½¼UÌ~Õ®ƒô`Ç]Ãô£¤¶l{`Žê°ÓÁ‘ÓäÃu/­äí.†ÀRùӋ¾[Þ=ً‚Ëô8Ñ´©‘”úé<Ú
+·Z̞ˆ…³8ø„ï ºylõ|à퐠írƒ¶Ÿ7°Õ’FނªªÀoő¤È9îx—ÙÛqüÂOŠIÕTVèÌB[NEn,§9k -=?ÿ`lÄ|v91˜Ö*¼ìq6ôåJCñ¹T8˜æ#Ÿk©Í¡ç£F¶hj·¢ÆÆGøA(ÀǦi$s–Œòªzn9YX4ù†}Q†]ŸWlkÁ
+6ê`ó3PÛhäܙ<y8©/]wnEÈæ p\£šfý–œ+=«Œçmc{g<EÓfmnÂ~tåúâÁðD”g“§k5Rĉ àbË hYñè>÷hgƒY²íù¦­½L&î`øIòå/FÂÚ±Tæs³*yÏâÓ¯j’‰ký!’%i;]úg‹æGN™¨Íéu§Jbõ,¹UÇ8Ÿ–Ÿò¶‡fÍ:±sŒìÌˁUþÉ ŠìÀ
+@*5-Š
+
+.j*ãÀFMä[ä=ƒ&#+šXK¢‰±³<íh“ëç &øā‘C ,êFñ€„(ó‡-)VÊ?ŸrßúF2ùŸ{“o<_k@#„†“
+:]:@+ÒùÒ®ˆAÒêéÈ­ ©;<C0ìº2róÎ|Qlºãœy~«¬†¼âÞ0¬ÉàÅÁÖ½9yÄj.æRþHF÷`ÛfÉÕàÜmuÓI¦Âû Ü>:™Šë[éÇA‹Nâ%®·nï¸vWCéó¬÷äý=¼AÄìLV¯$Mª4„QJ×eæÅlø÷ϑäeï\1è$™ÊÝëì8áñ#Ý­œ2fC*cÑî3Õ֚úXõÉ»“·™¨Ìñ¹˜Þ{d^ÈäÔTI_½÷%="›Šd-¹AKíª$Þx#E×T^5Ö¬Ÿy°>ä‡Õ#´}Ï7ÈÜÊÊqc’~Q:§·êº vg/xjëðp󪓰´Äw·àW /FØõWúðÿ±Îl^ÇåOt…¬¹»J}>.ò—z´Æ´Nä•Ym£ÕӒ´ð‹KÌÿ0ñÉÉÿo:ÖÄendstream
+endobj
+50 0 obj
+4721
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 12 0 R
+/Font 13 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+14 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 17 0 R
+/Font 18 0 R
+>>
+/Contents 15 0 R
+>>
+endobj
+19 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageC /Text]
+/ExtGState 25 0 R
+/XObject 26 0 R
+/Font 27 0 R
+>>
+/Contents 20 0 R
+>>
+endobj
+28 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 33 0 R
+/Font 34 0 R
+>>
+/Contents 29 0 R
+>>
+endobj
+35 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageC /Text]
+/ExtGState 40 0 R
+/XObject 41 0 R
+/Font 42 0 R
+>>
+/Contents 36 0 R
+>>
+endobj
+43 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 46 0 R
+/Font 47 0 R
+>>
+/Contents 44 0 R
+>>
+endobj
+48 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 51 0 R
+/Font 52 0 R
+>>
+/Contents 49 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+14 0 R
+19 0 R
+28 0 R
+35 0 R
+43 0 R
+48 0 R
+] /Count 7
+/Rotate 0>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 62 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+12 0 obj
+<</R7
+7 0 R>>
+endobj
+13 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+17 0 obj
+<</R7
+7 0 R>>
+endobj
+18 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+25 0 obj
+<</R7
+7 0 R>>
+endobj
+26 0 obj
+<</R24
+24 0 R>>
+endobj
+24 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 632
+/Height 385
+/BitsPerComponent 8
+/Filter/DCTDecode/Length 37759>>stream
+ÿØÿîAdobedÿÛC
+$, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀx"ÿÄ
+ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ
+¿îäQ¶I†sܓ×è;U¬ÜÿÏÄß÷Ù©®_2ÿ¾býšeŒ4÷—m4µV7Ú3úàu9ôíÚ¢M£¦(ÔÞV5@º?òñ7ýöiâ;“ÿ/ßfª[\I-üQ’<©(ÞÀ`–ôì;àž£3ëL uA;oT¤lf<‘üÅ
+W&­'MÙö¹?•sÿ?ßf*çþ~&ÿ¾ÍU’ðXVÚvt[d—/Œ’3ïŸlӟU¸Ž)üÛH’Xd
+7û÷þyAÿMÿÆéF|?å”øßün’ŠZ!Ô«*šnì>ÏfSk”.^Fb@;‡$ç­,ÐÚÎ\±‘L„3æt'î‘ÛµÙßóÎü
+oþ7Iý}ÿ<àÿÀ¦ÿãtÌƽ¥„ˆh„%UŠ©QÐ`qØõä‚Ñ<¿õ¯å¹u2LîA*W«؞(þǾÿžpàSñº?±ï¿çœøßün˜¾¦Hˆ ؑ¬ADŒUû €yÇlô«%-ì ù¥˜òã? ¨ÿ²/¿çœøßün“ûûþyÁÿMÿÆè¸hQ¶±DÔVv†bŒ8TYžLîí† ëÀþ•j+KaòHbHGØ.ӕÀ'Œ:TŸØ×ßóÎü
+oþ7Iý‹}ÿ<àÿÀ£ÿÆèhä‚)%t4­¹Îzœü€§ÈÇqUŽ‰}ýÈ?ð(ÿñºiÐoðCÿGÿÒÅCgˆ¢ä«"|ǀqŸä*'OUUXöì‡`WnqƒœŽ§ëžiçÃקøaÿÀ£ÿÆé§Ãw¾‘àQÿãtÆy:~ÙSkyrä²y­´ç!s…9ç#“ÊÓü£W9pûÌ®_p~wtã¯Jü#W¾‘àQÿãtŸðŒÞÓ/ü
+?ün€–Å°X1a·dmß.qóg=Ï×<Ô0ÚÛ|ò|Óov¼b£q<…'àã zÔÿðŒ^Ó/ü
+?ünøF/?é—þþ7@h1¢ÓÚ%Œ¡±y0Êc8<þ4Žš{îܙ-¿qÞÙmÃ'<ŒcŽØè*OøF/?é—þþ7Iÿ½çý2ÿÀ£ÿÆé…Ä™ì¥YC¨"XÄOóTgÔÔj‚-þ_سsÔÔ¿ð‹^Ó/ü ?ünš|'vzù_øøÝtS’ùz„ݧ­hÂ!séþŸþ7Iÿ…Ϥ_øøÝ!ÜÏûZzÑö´õ­øD.}"ÿÀ“ÿÆèÿ„>çÒ/ü ?ün€¹ž/Ö¥[Äõ«ð‡ÜúEÿ'ÿÒ܎ÑàIÿãtÊâí=hûZzÕ±áK¡Ú/ü ?ünøEn¿»þþ7@\©ö´õ£íiëVÿáºþì_øøÝðŠÝv/ü
+?ün€¹SíiëGÚÓÖ­ÿÂ+uýØ¿ð(ÿñº?áºþì_øøÝr§ÚÓ֏µ§­[ÿ„Rëû±àIÿãtÂ)uýØ¿ð$ÿñºå»OZˆÝ§­i Ýá‹ÿOÿ¦ŸܞÑàIÿãtÌï¶'­/ÛÖ¯ÿÂ!séþŸþ7Gü">‘àIÿãtÊlOZ>؞µ¡ÿ…Ϥ_øøÝðˆ\úEÿ'ÿÐ3þ؞´¿lOZ¿ÿ…Ϥ_øøÝðˆ\úEÿ'ÿÐ(}±=hûbzÕÿøD.}"ÿÀ“ÿÆèÿ„BçÒ/ü ?ün€¹Cí‰ëGÛÖ¯ÿÂ!séþŸþ7Gü">‘àIÿãtÊ?lOZ>؞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ 9Š?lOZ>؞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ 9Š?lOZ>֞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ .QûbzÑöÄõ«ßðˆÜúEÿ'ÿÑÿÏ¤_øøÝr—Û֔^'­\ÿ„FçÒ/ü ?ün—þŸH¿ð$ÿñºåaxž´ñxžµ8ðÐíþŸþ7Nÿ„Vëû±àQÿãtÈâzÓÅâzÔ£Â÷CøaÿÀ“ÿÆéá»þì?øøÝq‚í=ißi‰ö†-òœ©S‚ùìiãÃWcø!ÿÀ£ÿÆéG‡/ðCÿGÿÐ+§ü÷Ÿò‹ÿÓ„Éÿ=çü¢ÿâ)ÃÃ÷ƒø ÿÀ£ÿÆéÃA¼òÎü
+?ün˜h0J½®'ü¢ÿâ)UÑQTO>êºðSÿ°ï?çœøøÝ/ö%ïüòƒÿ›ÿÐ Þ¿óñ?åÿK½çâÊ/þ"Ÿý‹{ÿ< ÿÀ¦ÿãt¿Ø׿óÊü
+nîþ{Gÿ}Qº?ùíýõY4P¶èÿç´÷Õ*”c…‘ú¬ŠPH ƒ‚;о0 b¤ñMÝüöþú¬‹Id—F³idwfߒĒ~cK@Û£ÿžÑÿßTnþ{Gÿ}VM­º?ùíýõFèÿç´÷ÕdÑ@Û£ÿžÑÿßTnþ{Gÿ}VM­º?ùíýõFèÿç´÷ÕdÑ@ã GVÇ]§8§8É }kžÔ%’)^)7ãæRAê+¡“ïš6´¿?Ú_ΨGª[K~ÖKö=~ð6òžwÆӃœqWhÛ?Ú_΍Ÿí/çPÜO­´·6È¢BîØ'
+IâœÎÙs´aIìO8éÓ©öÅI³ý¥üèÙèTþ4Ú(ŒÖ5;ßúøÿÚQQPHi.سÎKŸõqÑY=ÎÚoÝEé¥'Quÿ§¨ÿôzWQsÿ’þιi“”‡þž£ÿÑé]MÏüzKø:Ñlü¹{q
+f×l<™¬ÈÈÅÐÄ KýÎûÕVk{¨—`{ˆb7)TšL³8)ÆÒOnsŸš¶dÕ,âiCÊÊ" Yü¶Úv‚XÆŒ'ƒèióß[ÛÈÑÈíæ(S±Q™ŽíØÀ'î·NÀšÈŠÞúI‘g–ô¹E•ƒÊ nxª‚ää¯~‡ É©3…ó®bTޖøŠI a#’º#æLƒ×ûÙÛ¥™p¢VÉ
+9nÑmšâçm´ ü­+mùx¶~îOcÏLàðsªY[Dî" „n~ã0Pý~îH桸´¼0c—|jÀ¨iY×äg‘ƒ‚rqƒÜšvº5ÌP˹¢Æ7UóùIÞ\#<†w'©Ç¨ÊÜÛµË[¬ñ4è74AÆårG^ãó§Cÿ!Í?þÚè5—k¥<:€•‚´k4“+™ä<¾îuq¼ŒóœtçHä9§ÿÛOý€#¾¸û%…ÅÎÝþLM&Üã8ã?…6´–9'ùRÕFVfl«»è{òz`“Q·{½6îÞ2¡æ…ãRÝ š‚K;ˆà’ I RÅJ`Œ #¢‘‘‘ÊvÈÀP 'Õ,¡´7hŠDØò Ô™[o<ã*ÞÚ´±D·0™%]ñ e×ÔãƒÍcE¡Ü1»óY"[ˆ¦‰žb»Ö%sOú²*s¥Í%ùžEB²ËÏþ‘&”(ÀA…~S†8ëÐãíýÜ֑¼Ën¯(d•Ì›NI
+0rp;àr9ë…Õä/áüÅE{ì—q´Q[Ín€0I&dùóÔá[8ã‡'’ê¿ò—ðþb€4ï¿ãîOÃù
+Ô1Ê¡‡##Øã¸èjKùØÿÛOýÔ:u»ÚiööÎT˜PG¸^öÈã·©ëSXÈÇþÚèF€EfÍ(՟O…PÊ`IP°8PYƒ3sÈ\É'°É^úÝ.|†vߐ¤ìbªO@[äpNy¢€,Õ=aMý#VwkyUFI%NØ5{+/ˑñ&6–‰Ô`ýÒIôõ< š Õì®<¿.GĘÚZ'Qƒ÷I$ ÐÔð2h=4é¡Ô´öef†ÒfŠ ¹ÎN?à Ï÷3üU/‡á–ÃN´·–'"X•·•;•öŒ«ý1€}S‚ë²j¶QA ÒN©È$G`@*JŒŸN]zúû‚ãUAäýžE,î¨b’&V’5$çp8#Àôê§EVkè²Ü6HœáLq;ç¯8PN8ëÐñê*²jÐ<ò)•#Ž9Bù„’)‹ÌÈnƒŒžüö…iQTN¯dª Èñ’ÁI«’A#
+´¯Ì>aU0 ÕÿHd҃o™ÔO:©˜±}¢W
+çšmÝæ•yl‹uڗyÄhò:°“ÒÇ$þð΍¿“öh¾Íåù—åãnÜqŒqŒP ò”iÇý<ýIó?ý|ýŠ»5çéÿ_Qè䮊çþ=%ü?s×Cmÿ_Qè䮑Ô<L‡8bô!3&Š¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øSBŠ¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øP
+*ÿÙ#ÿoþúáGÙ#ÿoþúá@(«ÿdý¿ûè…dý¿ûè…P¦Cÿ!Í?þÚè5¥öHÿÛÿ¾‡øSVÊ%º†àoßí£pÁÈÇ<PRѲ«² ¸ÊûŒñYí¦Ë0šK‹„k‡ò¶´qAå±uʖ$üÄ瑑éÖº²Gþßýô?²Gþßýô?€9vðü-Æï$G7šK¬
+&̙Îd9ãæ8ÀÉç%Ƌ%Ô­=ÕÄ3ÊvW·Ì@®ñ÷s’1!=zŒçWQöHÿÛÿ¾‡øQöHÿÛÿ¾‡øP6š0Ž7U••‹hH‚¢²HÒ´[§\¹9§Ùé’A~÷rÜùÒ>òÃËÚ2Â1Ç=—Çגq“Ðý’?öÿï¡þ}’?öÿï¡þÇ&›ynÐÙ@¬Öáàyet\1Œ&JùŽ
+žsÎFÝÇü|Xÿ×Ôε¾Éû÷Ðÿ
+cØBïùŠA ãð 
+÷ññ/ûçùÔu öÑ»³ÙcŸ½ÿÖ¤û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€3m?ä/?ýy·þ…O«±ÙEËN7îhŒDÆsé֝öHÿÛÿ¾‡øP
+i}’?öÿï¡þÕ²‰n¡¸÷ûhÜ0r1ÏJŠ¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øP
+*ÿÙ#ÿoþúáGÙ#ÿoþúá@*¦«ÿ ùæ+kì‘ÿ·ÿ}ð¨®4Øn!hœÈ±œ0Ï_¥6ûþ>äü?ªõ¥, ,…Ø0'Ñ¿úÔϲGþßýô?€(QWþÉû÷Ðÿ
+>Éû÷Ðÿ
+¡E_û$íÿßCü(û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€(S,?äcÿm?ô#Z_dý¿ûè…6(¡µŠÝw”‹8%†y9ô  i´ôšîYÙÙY‘
+Œ4l¥ÎààxÆ1ŒƒH¨N›+ÊKÜ'—$±Ï*ˆˆ&Dۍ§w ò/מxè~Éû÷Ðÿ
+>Éû÷Ðÿ
+æâѼ¸bÏϗ´yÙ×ÉrÙëß8ö÷¢-ˆ(üüùq[G|—-ž½óozé>Éû÷Ðÿ
+>Éû÷Ðÿ
+åƉ&mC^f;UXâO+*¼l2sË~ïôä` ºëCK«¹&’U)#†hÚ<‚3 óÏúŸü{۞›ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð vëJ{ˆãFš)–"v-Ô>jí8ê7 °ÆuÁ ä’jºø}¢ZµÃ€ð˜b|ƒ ÁÏ`ô8 õÏWÙ#ÿoþúáGÙ#ÿoþúá@òi²µìWwó#û¸Š©P²0XœæBsžÃŽõnÎßì°´{·fY$Î1÷œ¶? âµ¾Éû÷Ðÿ
+>Éû÷Ðÿ
+Í°ÿý´ÿЍ>®Ãe6±[®ò‘g°Ï'>”ï²Gþßýô?€(QWþÉû÷Ðÿ
+>Éû÷Ðÿ
+¡E_û$íÿßCü(û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€1u_ùËø1]$Ÿ|Õ 6ˆZ'2lg 3×éW˜î9Æ(m
+9–âF¸˜]Ë!•eáÁýÙ1†ÚÛB äs´f‹ .l–ÖYÛËóî%b«‚D¢P@ôǛמ9­Š(èJڐ½Ú<Œé,Žm“z…#v/Ê8Á#'$0i‘}§þ<bH³³ïíxŸ=xÿUŽÿ{۝ª(÷ÃÉuy-Ñ6ÒHò umæÆ ¤j~]ÃŸÝ ô$c½l[¶öÑ@œ¬Hpc ÀRQ@t ¸\únô\tTòF¶÷wp¦v­Çs“þª3ýh¤QjñÒÿÓÌ_ú9+ =?èkù0ÄÿÓÌ?ú9+dôü¡¡(¨î'ŽÖÚ[‰›dQ!wl…$ñXrj·VÖ}µ–Úæ)íÞBÅHXe•x'§Ê7¦zü›¸È¦# ¢±oõ‡ƒaòn#í.'v
+¢XÄ{pÀ1Ç!ºNJäjìz”2LªÉæ´²DSrl–ažü¸?í§÷¨íR9/£"<J-;$áxûÞí۞z`·@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿڀ¼‹Ü¡dU# à÷¥þÒoúÞÿß þ5Jä³K›ÂÙ´†yÍÂ2p;Ç®ÜŽàž¤]s¬-ê']9x`ó#C ‚Ìʤääòyl š·ý¤ßô½ÿ¾ühþÒoúÞÿß þ4[j°]Ü$p$ΏȲìÂá†åãï €y#nAÝÅ_ 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+eêcäõóþŽJÔ=?èj„Cwl—–æ KØ©`?ˆ Sê0GpHªGA°WV·…mfKuTW*êêXÎ
+Éühî÷[ò4`ÿu¿#U¿°´ÏùóOÌÿØZgüù§æƀ,àÿu¿#F÷[ò5[û LÿŸ4üÏøÕMBÏDӖÜÜZ ÜN–ñ…’ìp;ð:ŸÃ׊ÔÁþë~FŒî·äk(4ynÖ§:Æò<1Îq²IvåvàFÇä€>SÏ#:ØZgüù§æƀ,àÿu¿#F÷[ò5›k§iWRJƒO(Ðí?uʆÙÁ9 $Ž9'œYþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@Ë*A ’ÌÂ8À囁ީmißóöŸ­Mý…¦Ϛ~gühþÂÓ?çÍ?3þ4JÞê ½q^ÞU‘E³Gc¹kZ¢‡O´²rÖÐ$l˂G\dT´QEQEQEQEQEQEQEQEŠ«›íCþ¾GþŠŽŠ|#7º—ý|ý†T¹¿’{–‘B­Ì\i’º#Óñþ†¹Yþѓþ¾cÿÑË]QéøÿCBRÖ`’ëE¿·…wË-¼ˆ‹2ÅHš¤ÖOý³,ÒX}¡ÞTxn·ªùA\çxä9ÚS»òØÚ¢˜ŽHh·O  6…ÐD—r¬Š¦éı1”2Ç$9l7ÍÇ$֟Øn`±ÔílãòiB[yLBŒˆ¬êM­½±ÆH>¹­ª(›¸Ò/Fèq NmË U6ë•*tÉÉLòÀG¥2mä]Üý’áŒ$ñY•!E¹’(°êÝ–@qÎ[8Á&ºz(”´ÐI–ÝZÖá->ÐH¦hP`E('d@. d’XpF!ÐîZ-Išß2­»¥Î0Œ%œÇ´g
+UZ=§ àcšêè vÇJžy®¥[‚þl®Óf Ž»jä1°
+¬B¼•A訢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+²Þ7‘#L¶!,üÙT´r†™—pªË¹ as…8É6cÒní¼»›8#[óytí$‘å·œc AÎÂÆ2TwçÉ«ßñ6þý—å'ÿGüM¿¿eùIÿÅPnŒ`ЮnEìŸÙÖ³$~J^=´[œÞUb!zÉÆzz
+íÕííÚÙå„Ú1E<òܧó4”³Égscpˆ->ßæ¦<…¸UÀô¸`dÚ:ՋWƒRþ؇ϖKàÂ×·1‚2±cî¾Ðq“Ç˸㉨i‘ù~^Ôò“ËM°8ؼ|£åàp8öÅ΍tŒ·Ã2³‰IlÌ cŽW®8Ï¥]Ó-žÒÅ!®àXí_º€±!ÙA
+fjgYvÃLûÙÜí˜ÎŒZ>û†gÓ¸ìN-Ez“Á3Ú«ÌTchR™<÷l
+oûÿøÐßòOúõoý UúʂI¥ÖÕ¦ƒÈ?g`‘[?2úÕ Š( Š( Š( Š( Š( Š( Š( Š( ÄMRçþ»í(¨¦x”ãU¹ÿ®ßûJ*+)n2mÙ×%ôôŸú=+·=?èk„_ùÍÿ_Iÿ£Ò»³Óñþ†´@ʚ­ËÙi7·Q2AÈ¡ºªHÏåQÁ¨ -úB±Ù8S»ƒÑ°?½‘µ@ÏNçh›Qµûvui¿ËûDOìgnàFqß­U½ÑÒê)áWU·˜‰Méæ 3Бó/~¼Ib 5»ÊI%ÒÃzË#)܊ gÖ/QÈ`z
+ÑHΤóÈ$ŒŽ8yàDÔ þÐ{3.ù‹°TX›å
+h’DŠ7’WTff8
+RMAi{æñ2crKFÀ‡kppyéÁô4ûȒ{+ˆ¥‰¦ŽHÙZ58.Áäc=:­aÉ.¡.Ÿx¶Ó]Ëò¶Íqnc——ýè
+´cÇ÷¹99ät­vú‰m—±Ü´ð˜æò– '˜i1çýoSž˜þޒDCHêŠH\±Ç$àĐ)ÕÈ5ñÒô䕯æómâšï{9ed’ã«ó8\3c» Õ½“&Ózu²¼÷LþSL_w›ˆ±³æ °6ùz¤PÚ_[Ixö‹&gMۗiã ç§Ióö5f¸‘o¬ d•ã™.š?ßJ#'ªY‰یð²cií;y©¤EwöûS,×rÛ"NÊ]%‰sû ŏY1¿ž¸ÐEEPEPEPEPEPEPEPEPEP–4Ëwy~¥î¤†4¤bq’Uôò«V¶ðÝÆ^íC
+v²¼®Œ§®
+²¬ióm±Àùz¬ƒw
+ £mq-òH“Ìñ;ïM¥›ìñ8ÿxõPÏìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPxlãHeŽF’á[‰ÜÈ8ÏcÅ'ö}Ÿüú[ߕÿ
+²:?ÓúÌÔôƒ¨]ÛL/ïm–#ûÈà‘e_CƒÇ=Ç8Èô Ž ×!Š8×ìÌNÄ Ÿ™}iÕÿú׫èb¯ÐEPEPEPEPEPEPEPEPâù
+fXk†ÓJ4°i±ß;3ÿ¬gÄtã”>Ã8@‡©ê3ý‹WU‰ {HXä|À¨Ê’¾„Ž0X6+Z7qÞ<öæÚUH”þô>a¹x)íŸÔu!”ÝQ@Q@Q@Q@Q@Q@Q@|·mkæÛiàÇ34¹7#’NOðÕ¯7Rÿ rÿàJÿñ5‘’µ¶l!¼ž·šFŽÒaîV@ mëÀ Üg¸ãŽ$K¦$¿†òâo.òÒ\¹Ux¤d´c
+Ióä®FxÆ4üÝKþËÿ+ÿÄÑæê_ô_ü _þ&©hrÊeÒ¤i¦v¿ÓÚæq$ŒÀÈ<®T„;p¸ôàc£  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  idՌ.°ØF’0Àfœ0†RòüIéþ;]5§[j_o7–1EÚy9`{VµI/Qô?ÌTtQEQEQEQEQEQEQEQEçÞ*ÿ¥ÇývÿÚQQIâ³ÿ[úíÿ´¢¢²–å!Пø¨§ÿ¯´ÿÑé^€z~?Ðמ@⤸ÿ¯´ÿÑé^†z~?ÐÕÄLl‘¤±¼r¢¼n
+Ç;ƒ ORw ’zž¹Í>êÖ¸ÂL
+Gq¨ÇoªÙXÈ0×i!Fçï&ӎž„œÿ³ï@ƒNµ·¸ó㍼ì.Ò3€ç'ž#N}½Î[•eoG ;p͕eP€ƒœýÕúŒƒœœÔ:üMüà)†Êy!Ÿ û#ÞÛAr1ž€œÕ˜õ‹ Ó}ªŽØ yE ‡Ue`sÐîÀ=È45¥µ–ÿ³Ç³vù‰Àg¢Œœ(àdàsT×@²{­.“ÏH¢ò:²ïŒp¡€8bBz‘·5jîù ±[˜¶Î²X¶·ÊåØ*œóÆXr3ÇcS‹ˆNÜKÞæ5Ù†r£Ümlcé@®´{iá»Hǔ×HÑ»rÛUÏ´…-ԑÔàqZ5KûF’ÈÀÑÏÛ´i,Nn
+ߖ˞Hܬ:dgÐTàhbt•d·M›q\*RP6ÒF WÐb­¤ÑZhºt§ý§Ît‰¤ÂéÙäýî0NqÖ¥ÐÉ®M§Gi¥†ŠEB²\™ÁErËÐýJžÑô{9LOlmP×!„kýÔˆEàp¸AW?µlçîßþÿ'øÖ:êù0Hú]¸[ÈÖ[L0%ƒ<h<ϗä9•3ßÅ×:Zx†èN“XÛÅ=¼žTŠ˜uÎÕa‚@$a‡P9ÏԀMý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þø^[ܹXgŠF
+µ’Èad¶µ‘„{£}å·R¥¸R@È
+Š+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(ü½GÐÿ1QÔ0[O±ší§xZ®9‚¦ Š( Š( Š( Š( Š( Š( Š( Š( ÄÐyšµÁÿ¦ßûJ**Þ¼?âgsÿ]¿ö”tT2ÑÏÙ¶|ct?éñô¡+ÕOÇúò›ù®¿ëõô¥+ՏOÇú²
+b>§9³¾šÖ[+©PB¿m·]±…g!9|lR_' É\ué( bÆëQ¼š+q©G†Šà¤ðí•XR[b†Ú]¾è€H5+êwrėKýk$«”o ª¹vÞÃ÷€GÈÇˑ÷…tTP?u4÷^‰ÌŠe7‘,r²ä:‹•ä g*¸À9ã~.l!šî{¸ÅÍǗž€AJ¥˜/æc;˜dƒ’T`u­ê(·Õõ‹+Û¡yÛ+C0ªºÌË$Ê2ØVŒà õz}En_^°’ße¸ËKct<`2ûw­Š(’–öêÖÊÞ8n!´ç»3\K*ĦE˜Œdp7ä.3÷ŽnÚêÉx‹y|¶×9ˆ%¢ÅÄêQ 0FgÞgÈ ·‘ò¶z
+(‰FºAÒ`{¦1Mkå•}c–˜dŠÄ±l—< Šèl.ä—X¼î|À™>XŒÎºž¿{!ÆHVŠçlo¾ÄñyÒyv¯-ð?.wIö‘GrÄoŽO<Q£jW73Ø î÷¼Ö‘ÈÑÀÉ( b0É<8ù:®Nô0G™å.Ñ#—` ÆãԁÛ=N;’z“N‘‘¼lX+¤«<úÈúŠÅÓ¬"Ô|+¤Å32¨µ‰¾P§þYã¸>½;ô9ƒ¹MŽ4Š4Ž$TUU
+@:€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€0­õ+]?HÓD’ÚÃu4n±KrÁU#q$‘‘÷~PrN:XU0´ރå[Í=•±K{9ÖHÙ] ¹òOËۏ üØ­-2ÿÈÓ Ž ;ÙcUáÄKóãÕkûR_úßߑÿÅP4$I,´EGVk XVì“nDÖĉ?¸@G'8û­èk¤ÑdIçÕ.!u’ ®ƒG"« jH#‚2ã¸#µ/ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT~^£è˜¨ê.ÞåØ5­Ä;W¬¨G¹©¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Œ×üL®ë·þҎŠ]w‹û£ÿM¿ö”tT=ËG;`?â°»ÿ¯Åÿ҄¯T=?èkËì‡üU×GþŸÿJ½@ôü¡ª †ñ§K+†´E’åcc7F|p#¾;Ö\:œ6vw7×Ç܋˜2©cÕPm'6[6$A$o
+À©*ÅO>„r>¢¨dFÑÍçÜÜO4»?|û.Æܘ
+¡xbO ç<äqL
+ÐxŽÖ嶂âvÙ+²Ã±ÊùaIV!‰Þ˜ÚO'œ`â̚Ÿ“d %Ó6Á’T‰•›hb@ÈEÜrGzäT–úrÅsÃÜ\O2#¦ùXr¦x‹ÐÔòNj1£ÛÇl±@ò@ÑÊfŽXÂîF ¯‚0샅v€ ÔµÚ'Ú­¤š3ÇŒ<‰ûåGa#æÏLñQÁ¨Éiowq<—7q+%Ôio!rHeù„cl žäŒž‚øÓaûZʳ–ÈÜÎ$xÇ,2p^1R^Z-ÚGûÉ!’'ß±ãr6
+ä<1ƒ××€3“ĶrFdŠ;‰#H„òHŠ
+¼v·4÷}²&ŠWb»ˆf‘‰™[¶:qV¯,…Ì‘Ê—[OeY"ÚNÖÁ# 䪞™ã¯\€g?ˆ-,¬mžiÚá¥2*– 6ÆÚۄ…@ àÆNHt²5Ë2@&6ëœÏ坡J–}îTqŒ‚3»ŠEŠ¢[k›˜$ˆÊVPÊï‰{).<ã’3Àç®].m4„Ë%đšJH!”+|ß{Fq‘»¹ 
+×z´ñËd>Çw =ÆDž‘Y¤S„T•ûÊ;Œc'äËý¿fo!MÃ`m%Ýuþ-ËÀ
+H$TÑé€K ³ÝÜÜË žb´…Gð2ã
+­´Vð#$0 á@À>Ô=ÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šd½GÐÿ1QԎsÐqŽâ£ Š( Š( Š( Š( Š( Š( Š( Š( /Ä-‹ë¯úíÿ´ã¢ ñ;íÔ.ë·þҎŠÍîR2ì˜ÂYt?éñô¡+ÓÏOÇúò«ÿŠÆèÓêÿéJWªžŸô5¡$wÇkm-ÄͲ(»¶ ’x¨­.žãx’ÖâÙ×l¡NAî
+Äë,§™0Yœa“
+ò§Êwc#,h§¨m®RédhÃlI=ÇøŠœ6>Œçl¡éRißÙ¸‡Ê"Ä¥ÑÜ iG—´1Ï͌8@
+Ȏv"Q÷™D{2Ûg2ò2āž3ăW¹ºx…¬k w,µÄd²8ä|¨#8Ú0|ôÁÜ¢¨Z2jšk-ìʾcÅ"2eÇ!\í9êW8秮náa³ð%ŠÃmn¿i´bäFÜm$%Æ?ˆíÁ>„ÐgEaÛÃs¢^ÆfVŸíWٟ?»d™¼¼žs†Pzc s¾yÝõ8¢eUÚ@&\ÞGQ! uÁ1‚3Ñ°ã’@:
+¥¼PIñ$`+d`䃑Å>òg·²¸ž(Zy"b^®@ÈQׯJ¥e¨ƒi5Ä÷ÖWp!MhÞ?Á´Éåqƒ“»é °Z[[,k¼1,`ª@»A9 c¦Hý(’ÒÚ[w·–ށÉfbNâHéן­TmnÁsË"ü’; †E@ ÊðÊyÆw g"¦¸Ômm¤h呼Õ
+Û6v;·cOÜcœIâ€,ÇEG*F€*ªŒ £kKg {xZV2€ª¥po”‘ô$S<Ö»³ó,fY¾ëÉ`¤W*r0F2=zb²¯w†bÔg–Ûí@ÓF‹?¹i}ãÓi9î0 Ío,hŒìˆªÎw1ŽÉõàø
+:VŠ3$‹òž 0rÊY¸ÁÎxÇsÀ¤°³HD)in±hÂÀP¬rˌt8äw§Ïimr²,öðʲ®n䞸$‘õªÃX³1³–™X¾SA ”ç8ÂÜz7  z8j¶Fdfß¿n$Ef-‚ ¸A9äî£ Oe ÖbÔ/•m1ù`,©H8 ctÅ<Z[ †¸ð‰Ø†2l‰¨9ëÀ$} ¬Ý/^µ»Ó­fšUY¥Ž"ÁQ¶—rªBžøf
+pNÒpqVeÕ-G–©pªÏ!Aº69Û*Æ÷ñ0\ûç(EÓ­£k_*5Š+RÍQ¨T AÀŒÞß1ã8ź΃\Ó®!ó¢¸ÝÀêÛoòñó\H“Š­m®Å-ÕЖO*(•à‘dp#ÐóÒ` e·.=À6¨¬q¯[µê¢³, †_2I©‹j… ‘(ã’F*욍¬wbÙ¤o3!I±EcÑYñ´‘€NNG¨  tVv‘©¦¢³ùüŸ/÷ªŒ«(hÕÃz}ﻒGëSi×RÝÀÒMnÖì?(9ä_ñÁʀ tQEQEQEQEQE`ÛÉ£>kôV÷†ùZKfp3×O§åW×UÓ!EUUƒýP>#à¯ËòñÁ#ŽÆªé·_aÓ,¬Þ¤– %2KŒ£C/'xç=ºsÆƛwöý2Òóg—öˆR]™ÎÝÊ3ß­f%hÙo
+ý§>~-˜y¹Îw|Ÿ7S×ÔÔ¶ú®™kÃl« +©ª2sÀ ë[P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P5/]–bUr~FÇrMRKÔ}óQEQEQEQEQEQEQEQEy_Žÿä5?ýv?ú**)Þ:\ëÿ×cÿ¢¢¢¤d:xǍ.ÿëõô¥+ÖOÇúò‹όîÇý>/þ”%z¹éøÿCT!²)xÝUÚ6`@uÆWÜdùŠÉ›F{È®~Ý<2Í8‰~X1#rê
+9ù‰Ï##Ž:Ö´’$Q¼’º¤h 31ÀP:’j KØ/7ˆŒ“’Xš6ô;XƒƒÏN¡ 
+OQ
+õ½çü!ºm¼Q\yŸd1Ë©ÏüzÈ6°ÿ{hÁïŽõÕÑ@"ÆcáífÑ#“í3½ÖÕf8båŠm'ŒËӌ“žsPêìڜwRZArʚmÔD=»ÆK¾Í ¶v·Lþ¢ºJ(”¹[¶G_ǧo{L— 8“v"R3äýӎ½·P ԍ­ä¦{÷x,D–À+F@ÓùrI lX’AÁ=:º([Iä½Ú-¦Ý¬E[iÞLXÁíÎ9ª÷·7SÝËzŠZˆàØ6H›Èiwp¿¼\ü •‡ÊH)×¢hÑÙÑYîRFvœ‘éÁ#ñ4êÊ°ßýµqæy›þÃm»ÌÛ»;¦ÎvñŸ§•~ÖÖHÌpU'qËsÜòO^§Ô’O$š‘cDgdEVs¹ˆÜpO¯ÀS¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Þ_ X,hÎÂâ݈Q“:~€
+uÔZG´]Aog¹ŠBrþCGò+ž?w÷‡Íódqü5©kZ[GEöF02A?ʥ޼ߧøP&-®ÏIE¶¸Ý¦[EÈ10Ã,¶ìBä~óˆœü™Î¨ÏA¤yuŸ.DŠæäI˜…¨Š4$«G*Ý@鞄UÍçûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+žŠƒyþó~ŸáFóýæý?€/Qô?ÌTt¥³Ô“ÛšJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šá|Iÿ!;úíÿ´£¢¢ñD›ukÿM¿ö”TVRܵ±$já ˜ÿÓÒèô®ÒæÝ®T\M?º gó¹0ö̸ëö”ÿÑË]*2æMŠJÅìÖÿ …ïýö¿áGökÐB÷þû_ð«ôqëúؒ‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUþ=CG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÔI:=Ì°)%â
+[Ž9Î?•UþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿Gl“Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÑǯèh‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUþ=CG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþjÞt¹„KvÀ:à‘ý*Z¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþŒrqG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÑǯèh‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUçdDff¨É84È%YàŽd,Š×f€*f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€<ËÅH`Ô¥O1äÄÇæs’w7Œ:´ÿõÛÿiEEe-Ë[£rué‡ý='þJîkƒŒÿÅC0ÿ§¤ÿÑé]åT"–ÂaØýò¢ŽÇè•d…Q@Wz¬ÐÙ#µŽKkøøv˜«ðÎÅÚAùXu#œŽ:ԑêžn¡qe;æ‚UFù¸T(­½¸ãïr=+Z÷N¼‘u+xE»A¨ç|¯!V‹1¬g
+ ØòA㵐¾w™Ì³²G)•ŸÊ|0&I"8íæ³{2¡9‚OÎà—òäk˜¶\´Ë#3»±
+¦Lc'w\¯B£&³g¶ÞHn-ç‚YZ'™%cÄlä’8è¿®jür$±¤‘:¼n+)È`zk&K ›ÛËK‹Ë{$0N²F2$
+wÃ8 cŒ“œ ºm³Ú[<r,ÓÍ'Ëèò3хKwÿsÿ×6þU™ÿ »OúâŸú©.ÿãÎúæßÊ£Ó?äiÿ\SÿAjŠ( Š( Š( 
+í²ÛGpóÇ2Qݶƒ‘‘×ڞn!ˆŒÑù¤pÉ F>„ƳLYJ¿š#i6æf‰˜9V%™]Á¸#ҟ–a†DA-4 |‘ì㜟ál ž½i^]‹tèÛâþ¯þZ–£oöÃËlÞFÝí*0}:ž¾•/Ûmv#ý¦Ž«yƒ ©¸ïY¥ÜÉ¿”#¶„FŒ²0i0Ñ°Î˝‰Æ{âž4™e R/:clHò\ -ËpžÝ‡½+˱N /{úþ¿ËsNKˆb$I4h@É À``œþJߑô¦K{k
+FòÜÃH2ŒÒz^¢© ‰õî®Vßj²-Ilm¤rràçôɧwź]Ã~t—qº`+áròù‚‘ŸŸœ‘ŒuÁÍMj¡NM+ë§ü|£un²Iž!$k¹Ô¸ÊR;iñË»¼¹ö1VÚAÚGP}ë"m"YáÂÎdv™Ï.Ÿuq»¯=:sƌ6ÞUä’(EˆÃj«Æ6–íéó
+iÊú£9šâõ%š2RaÈc…?‰éëL7¶ JMÌ Bq!óÈsŒNj„:KF RB8 7Ë4 Æ:uÊ.{|ώµD±¤Hvf-UÌÎû‚º18<' Ðg·#®iv-S£üƄ·ð¥ä6«$o4µ8܃il‘×°üéë{jñy©s G’7‰$géÏÒ³î4ۉÓìى`ó&7q-ó«ŒmÆ8/ëږ-1ÍÄ3KcdªÄ4Ï1!UÀå½Ü`cäö/+ƒ§G–÷þ¿àþM?6?'ÎóÊÛ»~FÜuÎ})‰uo'•²x›ÍϗµÁߎ¸õÅU{}:KrÃy¥b3ûÝàdr; Žžõl‹!vX†øäVVw›–ØKrà ÏNÃޝå؅
+£k*ã=:·éT³.Úu’GFh×ï´ÎÞcGû¤aÙÛ8Ï|U¸í${讧ŽÝYVN$‚vr@Éžp8 {Ò¼™n(ë{ÿÃ_©5åĐÒI&“`å@ùY³œîúR[Þ+ÈÐÍåÅp®S`|î;C|¹Á<0íUƛ¾ËN·b•m¶ùŠÃ*،¯òA§\é« ò¡ÁÙå‡
+¸Ú\¯ ;w–âJ—Âß}~ÿêÖù–VöÕ iÖæ
+jEëE:T©E ÇJC֊)45u>íU!™Ú‡SYÑõ¢ŠÐD­Mh¢‘HÓÑÿä#ãüQN"‘ÿÙ
+endstream
+endobj
+27 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R10
+10 0 R>>
+endobj
+33 0 obj
+<</R7
+7 0 R>>
+endobj
+34 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R31
+31 0 R/R10
+10 0 R>>
+endobj
+40 0 obj
+<</R7
+7 0 R>>
+endobj
+41 0 obj
+<</R39
+39 0 R/R38
+38 0 R>>
+endobj
+39 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 930
+/Height 510
+/BitsPerComponent 8
+/Filter/DCTDecode/Length 43781>>stream
+ÿØÿîAdobedÿÛC
+$, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀþ¢"ÿÄ
+ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?˻Ң†ÒY’SëY¶0-Íäp¶pÝqZWšÌ7
++M‚êÑe“9rGZƒV³ŠÏËXóóg©¥ÓõT´¶XšägqPêZ‡Û™ÃÁ€ Í K›Pc4ËtººòäÎ1Úµ.´ËX­d’=۔w¬>èY܉™<Á‚6çvïY[ˆ<¤€ õÎh’—0ô±•Æà;d
+迲-C‚Äã½s„ၡÍlÅ®*šÔŸ«S’“ØZ÷±,7.‹ÀSÅ]Ò¬ ¹µó&Ÿv8=«>òçí7Jn㐠ô«~§ö(Ú31Ï^”I;h
+Z£_•yHUæ²%ÊìüÇ51R[µs£K´¡òÃ1PsšÅÔcHnÝa{
+ºšÞ-ãŒ@7¨å·u¬ë»ƒs;JÀnÔàõ 5ÐÐѬṊV•7m<f¤Õìá·¶G’ØãéT,/ÚÉX,k npƟ{ªI{ÆѬj§#§–\×jÃôh#žæA*x´oôè"²šDEkÂùìei#Ef#5ZºÖf¸·’'‰~¸¤ã.`º±š€PcpºÁ§Y?Ñ×ä÷®I[‡5¨u»¸ò㪔dރMXmºõ‰ÐUMw?ÚÆ:u«Zk=Ƭ% É5_Ä:œ‡ÐN:KQIèdŽ¶—
+Š\b€A<Ð4êîíòm!n9AŠáTý+·²%¬¡àà¨Ækš©½=‰ˆÎ7
+­—­ ⁈izÑ@ Bçš8£ùнFqFy¦RŽ™¢I´RRŠ1F3A4hhÅ¢€
+LњQ֗½% ¥Í%ZQŒr):ÑE- £斀hÅ´P(¢˜‚ŒRu¥ïŠ@è<Rž¹¤ëLaŸj(Í€â'Òî €Ë ]£ÐÕX yçX“›¦k¤Ô扬%Ù4nN:75‡¥È"Ô¢‘˜*ŒòÕÊ¥+\Ù-I_H¸U$•Àç­g8Æk¬–öØÇ ûDlÅN5Ê?qD$ÚÔÔЋG¸’5pPæª\[½´†7Æáé]…Í»Á<Ȥ&ãXºÃ«ß9F 1´æ”g&ì6‘¶-Ì^bmÚ}i—vRZ•Œžx­}î´õŽI['©ªúì±9‹Ê‘Žvš¤ä&’Fu­»]Oå!±œšµ6“,Q3³.®)º<©öùYUvã'¥k__Z½´«ÊîÀà
+të¬ÙÊÙÏÝÛJnwVJÆE‚5IÁ*qÞ«k¤›ö$`‘Í[µK¯‰cÉ ÄŠ­âIò:
+/8¤íEh@6(£¿µ(ã4 p8Œñ]Ֆ[O·ÏhÅpª~Sšî,76ŸnHÏÈ1\ÕÍ©«–O#ŸÊ¹ûË ‰/·€H'ƒé]nFx¤èrsøV ØЂÝ
+Åó1ペÏ×Oú*qü\V«®=3ÍekœÙ!#’®ŠOCSóï]všqè+ç<w®»KÁˆa]f4¨¤Í犡
+=è qE
+@
+MELÅ-Š@§Ò“µf€ŠNô¿JƒH)qÍ{ÒöÅ ü)zÐi2(<Q@ÅíIEæ€rsGãJp)ï@…<ZN3KŠJZNôt4`.)¥íIÅ ¥.3IŠ\b€ŠLS¨ê8 ´€RÐõ¢Ž( àRQŒÑÓ4R“GaŠ:S£=©ERcšS׊^ô†7¥Å)<њ&(¥Ñ@¥&’€ QKŠC@ ‚;Q@¥íš`%QœRA}%Ä(ýh¢–­Š_¥&E´P3Îl¼àþ"– c&º­QTØK…hƒ¥5HrŒõ̧¡µµ*ùmŸ¸GáHsžk´š4ò½íÖ¸¹NQݵÉfØOáM*W‚ö®¾Î1ö[|'ÌPvëXZÞ¢à :Q݃‹3–&a…¾‚†ò¤fº]Ki£
+ÁÛ6æîàWx34¹ûۈ¥ ÜMk`[i˜dDäzí¨Ý Çjì­Éû,8RÐ+›Öä#.:Q
+—v‰N(d—>Z3ãû£4²[KÜèÊ=Åkøy±ÀÎmÙ«ë«i‘Áùù4sê9èãyN#RÇÚ¥{;ˆÐ»F꣩"®hgm۞˜ZÚԎÝ>mý
+œõ¡ñÅùÏ\jÌdÂL»{Ɋ¯âOù ?€4EÞB—Âc杸Œb›“øÒ©õ®ƒ̺Ì¡D²3„\ž‚£–êYP+1*:QJ‰œK`¶ôí8çÝ|¨FiÚN˜¥MÅÑډÐõ_UÔ¾ÐÞ\,Cõ¬dÜôF‰ò›V7ÿk¹˜Æ1KÀ®Rèæg>¬MZÓõ²I•T0c>•IرÍ8Såbœ®0ñA$
+QïF3[†áEf
+Ìç±Ëƒ†?Zë4£û°}«•OÖiXò×ýÚìF&ˆâ”}h(f¨4¢Å'ҋbŠZJ,0Qô¢€µ£œæ KIKšµ©)h;Pizъ@h—4P <њ( c§Ú“4¦ˆ)MŠ{PïFh¢€
+u²ZZˆŸ… ¹98Î;S„“Øeˆµ ¸Ê„¹u Ðg¥E<Ï;—‘‹¹êMtöVÖÿb‰š$,˞Eck0¤W˜@+œB•ÞÀîŠp]\ĸŽgEô›,Ò͏2F|tÍoèQC&ŸºH•É'Õ]z(á0ùJp9Å
+i»dÃ$‘9xœ£cZ‘®®ž=<Œž„ñVtAj™C ^†¶¯`‡ìRW°æ¦SJV)­Pý9©¼û‚ó¤Àè3Q¸çÜW]$11Ú1ÅT䐬ìr.Xœ±$ÒÇ4Ñÿ«wA覭jjþa€=«KATkV,Îò9)ÊVWM³I%~ñݽ7D.¹1³ß¶µè£H"d@¬Xæ ðò#ÏpYC£ƒK›Ý¹I;™¬ò²á¤vy5ö®£VŽ?ìÙUW\Ô#ý"êàSŒ½Ý„Ó¸«$Ü$œtù1ò3»’z×kå '÷K´qŒWxvÜKŽ(ÊýӸՖãn²àvɦ9b~rI÷®ºÑTÛ'ʤ”«ŸÕ‚‹ç
+Rˆnâ⃎´}iJ r(ÔÅ(␭(ÐMéˆUs]¶–âWm뷊â‡JítßٖýÙÀ®jæôö-°ç‰wª˜/
+lÈS‚kiI-žý*½ÆŸ ²™$L·SŠÁXÐ|SoU3ÓÚ©kŸòEÇñւ ÕG\çO_@À
+pܙZÇ/üfº/î(ö®Xòƺ/ýRõZîF& ¥¦Ž´ìSZZ( Aš(ïA bŽ´QŽ(ÆhêhïJ8¢/N”œf–‰ŒQE.(˜¥
+Æ£up»f”²žÝª²9YÇÞS‘í[—úU½½£ÊŒçÞ5ˆ‹¾xñ¼âœdšºµ.kßÀNpýxEØ»NIë]*èvĀKúW?v‚ ‰tVÀ¢3LÉãÔïUP ˆ Ó Uç™ç™å•·;žMoÛèÖ­3 2äóÒ²5;dµ¼x“¢ŒòhR‹z¹Sۆ¹Lòp*K«û«¼}¢MûzqŠµ¤YCx²rvÀ©õM6ÞÒÛ̇vIÇ&—4næD3Éo'™ QSK{u2‘,ÌÊ{—H¶K«Ò’‚Ê’+VëL´ŠÎY[z®G=(rÂÎÇ6IëÐÕ¯í+͛>Ðå}*·”äWM‘e±|Èß=IÝNN=D®ci*n5X™Ï#-Ïz‰8ÔÀ*H£þ XÓ!Uð3Åidgî
+¥(ÅéÎ)OµG\ÐãoJE¥<š!äRçŠN”qš\ь
+1¡zQIJ) Í £½èáŒR
+( ‚i0iqLAž:ÒsKKHŒQތЊ\qE/jcŠ^´c
+JQ@▐€Q֓4´˜É¥  sGZJQ@ëŠaKõ¤¥ @h¢ƒí@¢“¥.3Fh¥X¡ih☠ϭ!£4
+*Œ+zÕ½+RŽÆŽXÝ÷6àEW˜ †xÔ:÷Z-lg»Vh”94IFÀ›-jz¤w¨Q†rj¾—|,&’FBÛÆ0)—VZ¨iFtæ™gg-ì†8@$ òqG,lMÙ¥y¬Gs`Öë«79&±Ñ‚ÌŒyØÀñW§Ò® …¤(TëƒTBåÕGV8F1H.ÍØõøÓ9…Î}ëâO:YÜsô­¡Ý€2þú¬ù#0¹G<©ÁÅ(¨ôlۃ^Ž8#íÜàa˜5fê+wteD(¤cäԑi¨e
+AëU®­žÖSœ0æˆÆ)è'{–4ëõ±YG”d/ïŒTڎ¬·–¢%„¡ë’ÙªÖ|×ûÌEN¥Ž)÷ZdÖ°™©ã­Á܋OºWFfRà®0*ýƸ“A$bبqŒ–¬ë;G½œÅ\Ÿš­M£ËLìêBŒñM¨Üz™Á‘Ò¶âñ@ZïÀþ÷ZÄ?ýjÖMv]ÅãÅåê‘ZÈ×zêύ ¶â=/‰ÿä!Ó ¦Ø£ÚkQFz“ƒOñ@ÿ‰^v
+#ñ
+aš^ԃ4µBQšAKŸjLšZ( c±éM4£¥‡Š)sš(Å.sIœb–XJ£—áŒÐGJ;ÐzP Ç¥€ñïTuKÙì¢G·²’ì³`ªg~ e¤ždtŽXÝӆU`JýGjËÕµ¹,/¢µŠÉ®^DÞ6~Ø>•…¦ê—PjwóG¦M3ÌÀ´kœÇ׃òÖ¶£§j7·Öº…›Åm"B$ÎTœäc֎ÌWܹ¦êwW­*˦Mk±7)œ1ôä
+]V¬s“$Mµ“vïÇ ÷ª>©~5y4ÍH¤’€JÈ ÙíÛ¾4ÏMùb¼]Ëõ<ÿ0i¡t4î5o'YƒNŽ1¤fݍƒžØô§Ò¹Í}¿X¿Ô›•ÝåF}¿ý@~uÒb…°ú•î¶iîlkùŸaX_ð“O i-´‹™mÇI2€Ö›ã#•±Ž!iÿÓúWukFÂ4:u´kybß ÈíKÌ<‰_Z„诩C:/í9Î=ét]]uhä>Q†HÎ gƒÐö¬»‹·¾ðmÅđÇ»r#|sPÆ“.™©/ó‘NcÏùô÷¦·CsOÕ~Ùy{oäìû+mÝ»;¹#¦8éYPø¢æà1ƒGšeS‚QËù-;A?ñ9Öÿë¡þmIà¯øò¹ÿ®¿Ò’ýÿSOHÖmõeahæ@ FßÓÔV§A\±Pž;A“2þéÿëWSO¥Ã­„¥Í ¥àõ¤Fh8¢€
+1IK@£u£­/Z(4PRŠ3KÛހŠ(¢À¥¤ PÒ撊\QE! Æ( RÐQÔÑޗð Ñ»Ž”u£‚–ŒbŽô´è¢€
+\ÑF;ÐÑҁK@ EP>©°L7 cŸ­sºF©xsš¨K’Äþ4Þz×*††·ÔíæòÖ9:go5ÅMÉqß&“ý㟭Ž´á‡s®±’?³@×!~õ‰¯07ìx<•˜ç GãHxsD`9\é¼<Göh”Ç«cˆÜn…wØìsX>§žÔâ:þ´”,î6î‹Ú+*êAœ€žI®†ñÔYJ^DÉN>aÍq¤sŠv1ÉÇ­…ÝÅÍ 
+÷®Æ  H‘Lу´dn®7ë@SØs…Ø»«0kù
+sq&ˆöi¦2:©Ïғ…
+)+
+¢[‘Õs‘ø×-}©"è$ÈR›9¥œòEF1¿ŒÞ¹Ñ¶‚¶Ò8õëTuÄQ¦prK ևÊF®J¡®`i­€s¸d֐܉lrL1#].”tŸJæƺ]$úWaÎl
+ZAOíTQIš^=(A£)3LëƒM£½†…´ÜÒÐ&húҎ(4 )>´´˜ BŠ  b”ûS1KIJ(:ÃLûýåȗÚ[;vão^ùç­A¨ÚjïteÓ¯’4pŽA1éÁþ•±ÒŠ@bi4¶—R^ÞÏçÝÈ0Hè¿çð¥ñ6§öy-¤H戟™‰p+jŠtkìÝ6+v*\d¹^„š½žhÅhzOTÓ¡Ôí ds•aÕO­a#][f´P…í°P•ÿ¾Iu“µbDðãé±Ì#ï`T}à}êÙӄÚ"XNFDA @ uhRzoPF£ÜéÍr×RÇ#L =3× U=]°VKKËXÕÛqyüVº²( F>¢gÊ÷3Ìn.äg=½~¿ZÙ£­'zCQH3šp ¢Š\PŠAҗ4‡š_j^””¹ ­ècšJQE- ¢ƒÅ-%-'z^ô­-% @ÇRb€yÅҁ Ž3E´(ã4){SÇ4
+)riLòh sGzö¥íڎÔ™¦¥¤¹¤E/SF(ÅsE00µ;hÆR±*²®F`iJ’jУ€c9È5j{íFæ6ŠE[ƒµ9ªÑ[]A"ȱàðqšäŠiXÕ=NšKX
+ä1›I>E)íÒ°–ÂöÎPñ¡,8ÊóS´ú´‘˜Ìm†ëòu¢Wné…ÕŒgàq]¤Ä°ÀB)¿ÍÿdÝlÝ圞ÓVƒë0À »N^÷Q­WYu
+ ¸£áµ­$2 -æc‘œ
+¡ý›}våH=Ë
+’ }J×+
+%ÄzàT”3€xcvz…¤ŒÑ#+‚G4­îÚâêoꪇM˜²·‘\Šs<]9qšÔ•ui¡òä ўب¤Ñî£Tpn»GU¢:h#§TŒ`2¦ÑþÍqºˆÛw2ŽcÓÒ´êýŸ¥@úe䅤•æ<ç¹¢*ÏVýˆd…‚(R£œV½íŒt§G¨#
+†M‰Ðg¥"i··“Ÿ;å8ûÌzÑ۵؟Ã[OÚT¨$E_וWN!”F8¬˜lõ9ƒ*OR´é­5K…Ù)gRzFœ×¸›º#ðúïÕqé5Ð_ô)ò¿Àk
+=/P·›Ìƒå|crš‘“X’6™Êž£4œ¯p1‰”ƒÜWiåUUzàc€ÚÀ\m.‡¸©<½\pd@ÕR³ê5¡ÁÄêé Š6¢GRŠ#½H–ÒÛ܋»Æ¡ÈÉÉ&².§k‰žF<±&´ŠW¹z¸£4¸â`
+ØÄè&¹æŠLgšLãŠ_¥&(héBŠS@ ÔRäAPցJ c×ÔvÙèm·I—¸Áq‹Åvž èñ’ánµÍˆØڙ¢@SŒýj7ö©6“ž¬›ÝN;YÂ4lþ¸5Ïs[šh6d“T5³9¹êFY†Q4jêô5¶?â\ÞÄg5pø…-QǶCšé´~aO¥sl?zk¥ÑŽ!O¥væÊô£¥Š^µ@QJFhÅw¤æ€ƒFN(ëց)qIғ9¦1Ԕ
+) gµ´b—Š â˜Ä R)i´Rb– .¨À3¨-ÐŒÓÏJÆÕÿãéÜÌÖÉ©R»k±ÕV‚§N¿Ä%-•G(µ¢vTFw`ª£%‰ÀÖ«Ùj6š„l֓ 7øiº·ü‚/¿ëƒÿè&¹ßÿË÷ý³ÿÙ¨×ö¤£4dÐ1zLóEZ;QE“NÆ) Ræ€
+rÅA˜Œñò×:Ð[Œf“¢ŸPUÀkÖXǘÀgºÓ¹d0Ûçåæ¹.Ô¹Æ
+8x†Ìâ\žŸ/JäwZ2}hö(~Ðë?á!³Î&Ï÷±Gü$VØ?,¸®L9õ£q£Ø¡{C¬>!´Îfã¦i?á ¶È&9 ÷®Oqõ¥ qG±AíY×GâUl•gÐSˆm™‰+(ü+”Ü}M.㎴ýŒAT:¿øHlÀʤÃÔо"¶ ˑ±í\ ã€Ô{ÐêOˆíòq¼õ4£Äv¿óÊQŽ•Êî4›¨ö(^Ðêÿá$·åŠRi¿ð‘ÛàþæLžÙ®[w4gèöH=¡ÔAÕ¡p=6o®?qÿhñ\Öx柆lõ4ý”Gí,]ÞËtå¥lûvI5rh#][éTÈæµI#6ؽ©;RöëIÛ4Phǽ!éÅhÅ‚sE
+CëŠ($àf<Ò}h'ů4t¥^3H)Ã¥8Wg ø“Ä1’~¼×µÛè:5¾2IÝü뚾Æô‹û‰^5Ÿw§%́߭hJ § cÞ¹Sf…x¢DF1ÅT×3ýœÀûZXÃagk@-ÏlŒқ÷…-ŽE¿Ö“]&rœv®m¾ù®G?¹Œv®ãlR␠S…1(ÅP¥Ï¥!ã½%-½(Ò9¥Å/Z QA旵 qHiAůî(À ô¦ÒØ£P(Í0”Pzô¤¤F¯ÿKþàþf¶qXÚ¿ü}/ûƒùšÙ¬¡ñHôq_À¥èÿ@éH:š\QZžp™¥4†Ò€)êÃþ%¿õÁÿô\÷åÿþÙÿìÕÑjßò½ÿ®è&¹ßË÷ý³ÿÙ¨֚9¥¤9íE†â—4ƒéK@”QH(Å.))h¸€Qޓ4î;PRcš\ÒÐH3KƒE.8Í%‚9õ ¸£<P:s@cŠqEP Š3Fhh ô¤¹ö “KÅ  }iqzCíK@¢Š(4”Qڀ
+1Í%( ´”f€ ÑKEya<ç֗¦ô­Ëm
+i¡I¨22*%5Ƕcm4l8®ˆxnl È£4ȯ´Èð©U"Êpg8:Òí®ŒxvFé"qKÿÛõ3/Ð
+)¢€
+(£P ¥éK‘Ú“­
+-
+9â]nßìWx®úÀÿľû€×&!lmObÃF`÷¨/|ÁdDYþÕ>Üð'­)bA<`®™£Õú_Ú<ÖÞWäõ­Vû¸ôQ“Œ`Rt8}h“¸-…à gœW=â¢Lз*k  |̶Oá\ïŠHóàÁþʪŽäÔÕ˃º›´â¯Ád÷²²¨rqL*–ò2°Þ®ôsð{яzsòÙ)4Ä~4¥(ëKÎy ‘IžqN94€cµ&)zÑÔñ@&€
+ãb€µz+¹Ÿ¢GЊ¢œŠqÈ_sI¤÷);Îömm3–y"9éõª"êŽ1!zlnõ–®v€I§n=gìÒ/Úµœ X£Lèo9j‹Vš&Ó]REoLä7äþt…Î8&¡Q³¸ÝK¡Ä‚äŠèôbL)é\Ì}y®›E?»Lt­ŒînŽ)ئƒšZ ×­8
+LsEB‘@¢– Ҋ;ÒPÐ)1J(£fŽ¿J1Ž{ÒçŠÅŠJ^ô`^Ýh(¢Šc
+(ç4ÆÕÿãé?ÜÌÖÉ5¬ÇÒ¸?™­ŠÆCü
+/zh4€óK@
+)
+3òӂûæš:úUžZàË¿¾G€¬“éWŠÙˆÆÓ.þþ”¡,ÉçÍÛց”±Þ˜sŠÐE³çwœ?*†qßÝîÈõ¦+G]6‹þ¥k›A“]&‹þ¥y&‘HÞS³šhæLíIß­^¢ŠÀ¤ïš/󤥥 aŘ¥êiˆOj\RQHaGZ(é@ƒ¥- æŒP1ii){Ð!)~”˜Í(Wÿ¥ÿp3[5«ÿÇÒÿ¸?™­Žk(|R=Wð)z?ÐZLÑEjyŽhÇ4”£ž´OVÿE÷ýp“ÿA5Îøþ_ÿíŸþÍ]¯ÿ ‹ïúá'þ‚kœð'ü¿ÿÛ?ýš€:ìRQE
+
+M,ËsÖ³äbìXÒ¸XÆ¿æCYŒqÖ´ïú±¬ÏÖ¥™ÈÔÝ´p+D¬%b{SË[Ë?ْ%ێUÒ5¨Ü¿(èjkHå…E¨àšhFdã2ÿt‘šv@©&cܞµéLc€­ý.6.áI|ñéX(@"»/ I
+[~ý>]ÙÝQ&‘qO¡——pLÆÀ?x{R_ʒظcûÁʚìï4«;Ù·Àê®FvŽ3\Ž¯jÖÉ*ºm##¥&ãÐ¥~¤~Eyåf꫑W'‚Y[yÏçU|.p×+Óå5¾@’ÔFbÎðy5Ÿ2ORí¦†d´öÓÁ9ʨ%I¬=&5—RŠ6n<}+©ò¼«w'p'&¹?Û1û£šûK›Ö‹QØ X×÷«ÿÚFî_!ðèGR]ééq–$†õ–öKj–Ïz\êÖ)&sw,Z£ÛçåÜ1zÚÔ¥{[dH¾\`+#Tu¦'®àMt·É<f7ÆÜçñ¡±-Ìèõ…XÑHŒ&ŠS¢ÇŸ¾h£ÇÎ{Ó[icHF)d×Q€ÓÖ¯éwòi×Bx±ÆnõL¡ê(Æ)×Öuí&R!¨þÜÖ1æžÇ<bšÐ@÷©( Å.@ë@žjt‘S’3P
+iëhV»åAªD“øš¹©Ì³Ù@«Ë…é֐Œ ŒÇäRHäàf­£Þ¬E¦ÝFN)‚IlؘÉF#­(Õ/1þ¹¹íU 
+Ëā½E ûPa…”Ýi¢úãvá#nõ ÞܿޕŽ:s@‡0»/ó 2}ÍE$r’L€þ4ãw6Aó#¾j7žG1'ñ “´`
+`Ò÷æœÇݧ֌cŠp4§ó @Ç4¼QŽh(íJƚ:u iÄãސʝŽh€g¥9c.p4€âï܇ €Рà Òº·†=.7çnA¬ù®d¹Ìۛץ:kÉ%·ŽÆÔ銮i¸¥¥í@
+·Î]ðjÅÒ2ò1šÍM±ê,w¨wëZ¾—̾¼n›ðkÿ µ-Íâ8Á¤RA{RzçÔÂqύp›=Ƃ;qS %—§z„ýþje$`ÍZZF¥ÿ!ŽŒšÔÐøE>õ•¨ÿÈJà´kWE8Eú×lv9™ÐNš´ñŠÑ˜Í4´
+O­/j4b ÑŽih)x ô¤íLbÑIKHBS©)G”´QÎ(( ô£µ f”1F(è~´ËÖ¿åü úUëoøô‡ýÅþUCYëü úV…¯üzÃþâÿ*Ê?=ßî”ý_æÉ3Å-ƒ;kSÎQ֊J««ø“ß×ÿÐMsžÿ—ÿûgÿ³WG«cûûþ¸Iÿ šç< ÿ/ÿöÏÿf »4w£¥€
+ uæŠZZ(£E€Z¢ŒÐ±Í­àQž(;SY°*9fTïT.® DüãŽÔ‹/{
+`ÍÀàFA8ÅQ֋K§Ë¸ç Ö­r¼úÕ-YÕ4érq¸b¹£{›èfxz@²J¼üÀWB$;O85Ìè.‚ä«n\­tJà7=M\Ñ(y}ÛA¦+–ÒÛn°œŠé¥eH™·à\•Œªš”nÄì.sN+@‘Ù#Häz
+RýKT(êNNO§4ŽÃ€ëY´WCšÕ þÖvîH®›ÌlƒŒŠå5YAԜ©Î®¢Öhä·V;…i%¡+rÆáéE7+ëúÑYØÓC„–ÒEçËp=ÔÕt‰ö¨çÐW[zš×”ÆU £ŠÆÓ-î%½/k6.íÒ»Û9eA‹‡SùTB4iIUÏ<t®ƒR‡QxÕ.c@±ä’ƒ­e[Z<ÈJœãm`µ´·’í£ dB§iéÍS‘B’cŠÖ%ÀV}ÁUFsT­lžêV9*hA˜ž4kqô …ÁIU$Ž•‘${O§¥ž9¤Ç4ù"hÆ$O¡¨y d¢š„1Å9[µ8Šµë‹_ “9ª¼Ògsíc9X0}褺³F·±èj Í¬&î[7  Jp#ùU›fK•Ã¢ «ŒV_ւ( ’K3K‚yíQœâ…<âœF9¦«‘ÒŸ´‘íRE4J 4[\æ¦ûD2?Ëlz(n”L‚;P犷4«˜’Ü/Ô滁ŠµU`€Ý}éHƒ×¡N*ȸsfÚz Òý¢"ùòÝÍ&M§Ò—jÃOýÞP ýÜÒ4ñ–BÇLÐ;ÊKå¶Üçð«‚ò»~É>¤žhŽò4RÚ93Ó'¥Q*H÷¥ŸLÕñ{Ê~ɶzÓ>؀®-`äœõ E`‡=(1¹«ßÚ’Øâ9À<‘õ1ø—Bt<äP33ilphòÏ¥\}MJ K8є`œýê•5MèØÂ[ûÜó@¥¥+'˓WÛP]Œ†Î"ÍߺÔ3]ùÈ‹Žê(›. ÎjFÓ ÄNQ[#¸ D{HëVmíä˜ey­=o¶ˆ#8õ^juÕ\n js… ¼±*Ûâ\FäÕÿ
+Çj,RŠ9Ÿífïoà´ßí%ݖ³„Š¹qáëÅÞ|¢y'=+EØåAÏj h½©GŠ ã]«0'µU¶º’ÞMÈH=ñޮݍú]ŠÈ¨ˆàðhßpW[iâòÎø7±àÖUö¡%ÙÃ𣠥ŠÂySrFÌ=…Tš7FÁíR¢‹rv&´.eó´ç¶›\NÈã&°#8?ZÜ[;X`ŒÜd´ƒ 祂–âRh©}ªËp
+ª„SéÔÖh89­‘¦)»E'19ê+6ò%†îXӐ€j”RØNMššn²#É¸BØû®:ŠKý]¹Kºz’9¬dëÁ¥“¯&£Ù«Üjm
+Ź5NÕÔð2zÕVÞÎYÁ(™Õ·u”FT†'ªqMXJM3¥͖CçéEeLÈ¢£Ù"ý£7.õȦ¶‘³¸’y¬mö+'¸waÎÍKý‚ÝDÈyúS[C9æUüê÷As^}fÒêÆHÔ¨.¤sëXþ0ù’}¦TˆíJÚٖ•qBè{¿åªP
+ñeh‘aD–#æ¸<Vù&Ï`kVX>ØâPã ûU’[•tûvX‹Ðnª×mmi7üz+£ ˜Óîà[§W‰×
+>ä,±E+m‹~XžqI‚,òOJNå'=kPÜéi i R©êזF5û›Ÿ>˜©E3UĬ=Z§šK–ùðƒPg-¸õÝZW‘=ӉbRÙ¥Y%ç
+Í´zÒÝÀÐI´÷äZ”YO¸)‡ÖŸªÈ¬Ñ(ꋃ@™D
+¥7“KŽ”‡“]'„³ö«ŒôØ3\Ø?5tžm·W9<yuo„Ö–çJ@éŠcõ8©[åÊ䑎j àŒ
+Å)R“Æ( µoùß× ?ô\ç?åÿþÙÿìÕÒjÄÿd_×¼Ÿú ®sÀƒ?oÿ¶û5ÔëzÒâŒRs@
+:QފZCÅ 5Ì¢Sü#8õ¬«mU§å'<`ÒnÈi\Ú€k9ï]N0:÷¤köA’€®qšžt>Vh杞+5¯YFí ƒ@Ô2»‚dSæB±¥IYë©)Œ0íJ5có?G2 iOJÎ’nÛ´ç·½!Õ?q©ó ±£XZ¤i ò㤋‘WWRŒœo^*Ž«:MlAOJ9Xå¤Oš¢òýêĀî#ñ¨±Ï֙#D|õ ÇŽ†¥éŠCŒúR֘UnWÌÉ^¸©<ÉeÛÓq"«Ù){Œ p*áµbXŽ”„A嚍jÔv¬ã–ÁúS¦+J wr8ì@¤Š\òG>”\¢Æä$‚Aêµ
+n9Í$—2²úÔ
+£4fÍ Ò\Rb ERÐ18ô¥Æh4™Å/JNô£šLó@ƒ½ÒÒs@3/Zÿ–?ð/éZ¿ñëû‹üª†µÿ,?à_Ò¯ÚǬ?î/ò¬£üFz5¿Ý)ú¿Í’÷£4¿ZmjyŠSE%TÕÿä}ÿ\$ÿÐMs~ÿ—ÿûgÿ³WG«ø“ß× ?ô\ç?åÿþÙÿìÔ×ҊAGzZB(ÍhÅ`ŠQë@ KKI@ F)sFhb–@Š(Å!†*†¯ng°eQÏZÑ)®2¤zӍŽÐã‘O¹ÍnIiåʄôsŠ®ÊÙ})Ëh¶¦Ò£5Y­ùÆ+hª•äT.ƒ=)
+Ædpäu« $ëÂÈÀ}jÁŒbœ¨»¹4™V*ÒƂÓãýtŸ^0EÔHµ"ŽÍ )f`I¿çH^|“æ¾O½Z*)BŠ„gȒÉ÷Éo­0ےkPGO«OQL,dfÍ4ÀTMk›˜ŒŠ«<1S@X¦ÌajÕ9‡gjÃLšúM®æôÒ%¢…4œÔ÷P=¼ÏŒ2œïP€E;„Œ
+£ )<ñYȤZ\U¸ÈQ¸óíT£>µmA#P0a–'µU»
+©“Ð
+ ëNÁíFÒE #Jì1J@$MMin&Îé1ëWOL“öˆ°;Ñ Ú¥æ¢"—>^Òx®‘´+.ª$'ëXβNƊ›g.l»(™8Ï­W16ì[Ú´2F\à‚iþµŠà\K:‡ØB¨§ít¸(;˜,
+.h)h´Rb— ¤ B`Qô¥¢
+jyÁG4¹¢”õoùß× ?ô\ç€ÿåÿþÙÿìÕÑêçþ$÷ßõÂOý×9àOùÿ¶û5êuãqš1Fh8 KHF(zRÍ{Ð(sMëK@⁀´™¥b–Ž”P 4PEu¤¥Îi?
+†ésnÙäV<¬Cd÷­×BB+
+lÛÉ5Í´‡a‰Æ6⭼ʑáE*J’B%S•#9 fJ]^ m;tÜj}*Íàó$“ïÈrjÒ^@ù!Ú2iÂæ?5P0ÜüI6)qŠ\R{ÑKÅÖ^¯Å«ŸLV¡ð¬Í`fՏ¸ g,N=©ÌÁ¡摇ÊßZ@3{P“Gp‘ؼDÌA§á3ÿR=P“XU›;™læóam¯ŒgÚ¦qº±Pvg£n˜sÒ¡/ó ü«ŒþÙ½<ùퟥ=u»Õ_õÍÁôÍì·´HëVFÆ3ÇÒ²¼O–Ó à ?QX‡W»læv9æŸu«I{h¶® Îîù¢4¤È””‘”TàÖdžâó.%€Ú¼ç½d Z"T5HÔ¤Ó®h•™q†Öö3Ž‹RÓdŠ9Œ,,{
+ü¹ˆO„y]r:š¿}âkËÛaÅcªªâ±’_8²*Ç'q=©é`µ‹£W¸JULcŠ¿dsXqIå€õ¹dÃnHÂöœ2â(U…~¸èjªž:U•ã=Fj–¡•¶v…]ûÕZùA´”7M¼Õ!2+Íh˜¶FsŽ•*ÄTŸRrj¶ãɒaÈÎkÈù˜ù“sß4÷Êתq.Bž¼sYèt¸~u’Vq؊йKxyvÇf¨f–Æ’GŒáÇÊÕ¤„Ìëû›¥CLã>áÐûS|Ý/íQä\ù?ÄN3SÍu¦Ìô•1ýÅYÛKÚ
+ ؟ï Qp&Žm%odo*å­ö ã9¨¤¹ÓvüÜÿhŒT(öAŽôŽØ4ã.žz$Àöæªä“yÚi‚>'2è?
+žÅ/kªR,t¥ÍVûCú-'ÚÑi{X‡²‘fŽµ_íè´}¡ñŒ-Ö!ì¤Y4‚«ï›ý¯ûæóz7ýóGµ]ƒÙ>åŽüRÍVß0ìß÷Íçôoû柵]ƒÙ>è´hW377åŠ6Mêß÷Õ/iÙ³îʚßü°ÿJ¿iÿ°ÿ¸¿Ê³5D,lùÀ$dŸóéV­|׶±] uôâ¡M©·c¾¬ÂÓWÙ²ø¤5[dþ­ÿ}QäÈܱçÜÕó¾Ç³]Ë4Uo³¿ªÑövõZ9åü¡Éæ«Œh÷ßõï'þ‚k›ð'ü¿ÿÛ?ýš¶õHiW„‘Äÿ šÀðTfO¶ààUJN×±.*é\ì·¯÷‡çFôþúþuÙÿÚý)~Íþ×éSÍ>Årù7˜ŸÞ_΁"wuüê³·úQöoöÿJ/>ÁËO¹7˜€}õüé¾|Þý)ŸeõҗìëêÔ^}‚Ôûó¢þ÷èi<èÿ½úoٓթE²zµ;ÔÝ÷bùñçï~”ˆÇLŸ ¦ý™=Zœ-£§êi~ð»í)èÔ¢é=—ȏû¿©£ìñÿwõ¢Õz}˜ß´§£P.Pvjw‘÷SKäEýÏÔÑjzdjð™ZCuþÇëSˆãâ(1']«ùQË>áz}Šæç*FÏÖ³̶I—“þÏÿ^¶ÌiýÅü«Ÿ¼2E;ªÈü¨åŸpæ‡aÿ`ÿ¦Ÿøïÿ^¤ûÞÌVy–aÿ-þú4Š”¹eÜ9à¶F—Øãþóþb”Z èÎ?Yê¼bœÑÉ.áÏå4M¸?òÒOΘm¢O™Ý±ßqÀ¬ó4x£’]ÃÚGùM-¶ŸßOûïÿ¯K¶Óûéÿ}ÿõë+Ê4»9éG#îÑvF²›eé"øÿ^”µ¹ë"ßu“åæž#ãŠ9pö‹²4¼ÛxÀ×ÜÔM=—ñl?TÿëU0˜*АO¥ÏÌ=¯’4_Q²òÂ4ƒË…Øqùb±Ž ñÈæ"UœnØSYÑâWw¨Ï—åA'UF"sæ=ÊΡD{Xu9ëQ¬y^zÓÝjɌ6
+ӚÐ͌Ž ¡¡©²Íå`ô5Ci’i]HPÄðOzKRh
+È#dz«wÄL}ª„:|ˆˆÚP8ç4íª_Ö£Gg@X“õ4ìÒq}Í’[ 2@Ã÷Ûp?¼xªÍs§8
+æ& ÐÎ?JKâe†qÚ©À!™K=ªÆƒø‰ëMS¾ì^Ó²Díq¤/Uƒð‹?Қnô^ëýø?áY„°3í…p¢©(°Oý’î/jû#£ûf‹ýØ?ïÁÿ
+?´ô«ožRǃåE´ãñÅsŽn”Æ]´{%Ü=³ìŽœx‚ÐÿË9¿ï‘þ4oÚçý\ß÷Èÿæ9Å)äàQì¢ÚGOý¿kýÉ¿!þ4oÚÿÏ9¿!þ5̀qR¢™Ç½Ê!í¤tÖ:¬W×ÂÝ‘J–ÞØþ_ýz×[pÄaÿJ᠒KYCÆv¾1‘V[T¾gz
+ÎT_Ù-V:MRoìè‘ö‰7œœS4«Ÿí;åòü¼wÎk˜šþâçhšF/@{V÷…W‹‚zŒ
+‰AÆ:Ž5fØ´È_jdÑG
+F[¢ÁÕ?ºøÖ$çŸÎ¯èÿ}«±B=ŒyåÜéâEeÖž"û¿­$gä\
+cþ=ýñüK¦DŽ_ó5±ÿ‹þøþF¤Ósö¿æk/ùxýB_îQÿù—;ÑIšjyâšJZ>´§«ó£ß×¼Ÿú ®sÀòÿÿlÿöjé5Ž4{ïúá'þ‚k›ðü¿ÿÛ?ýš€:ú@ih 4
+)r3@
+:Q@ š1FhPhƒH)i€v¥£( Š(4€Z;QE4œg=…sÊd™œõ'šêg^+™»ŒÃ# t8¤ÀcúСÜO£"ù‚œ$ÔM;i  Úà•
+OPÜÒpÉ&Ö£žH™0‘•8õÎj ri»1¢´žR)È9=é¥"hsžEC2æN¹¦í €(BÔºsŠt22LÔdx\{šbdÌê@4·‡#µÒjXa,ø¢Á‚WŽ9†æ©»sӚëôí*Øé—WJ@EùO½rRãqààò)rØÑÔm Éô¢™“E3#ª¿çF# *i¶'(ÏhÍ;Pÿ+g°¦Úø“噦Q‰e—õÏúÕÆ×m}ÑOéU,WäºÇ?ºþµt®u»_hÇò¤Æð9?ZqäRò҂(N&ó@Efk9y?Þ´ÇZÍÖãϟïq@ÆIb*þ–Ym®Àþçj¥ß<qÅ[Ófoތêx!iµ,µì¶ö‘•Ëds’j՞ °˜î®7”`FÕìj­ÑÚlŽ ç<Ž1Y·;mP6…ã›\È"ÚgT5í<‚¤PØéCkZy·âgÞOM•ÈlldÒª?ašÇØÅs¶u¿Û– ±w>Þ!zU][S²½±‘ bÌ1·"¹ÿ%ØШѶ{Š(ÞèNnÖÆÞGÍVl­DìàðÍH—vË´½¨fÆ=jþ%½ÝÊÆ`\€rkS$R¦=¼±À$qV/c˜-®\'< bº/ÚÚA 1[N—¨â¹ £<ò圁ù
+¦º‡©|ØÙEï;{úW-Hò—`ÀÅsiÛËãé[ö 
+5R/©Œ°8ˆïª~µ§k<0Ø‘C¶üíöª_c™91ŸÃšGÔ€Ê˟QŒÕ©'±Ï*S‡Å‹ßl¶<}—õéQ_J’º´C
+¨TcŠ³~Š†= gÌÊ+šê|"rnÃtãó®\}á]O„EÙôÇ…m©3¡,ÁqMi0™%¾• Q·æ䊊Hñ´ž¤s\W7èŽ3Mb2ƒ•8ö¦¹#¿J|{v“‚ÓÖ©-Ilóû…ÁÄÿ:ÐÑÉÜç°5F¼ÀÿxÕ톨®øìs·©Õ'ÝJ~8¨âû Ô™«@¢ŒñIŽhMbŠ` qš1GzBôQŠLÐ÷¢t¥ Áõ¥Å
+LQŸÊ–”
+J.M&)ؤ f~±ÿ«þøþF¥Óúó5±ÿ‰þøþF¥Ó?ãÂ?ÇùšÉú„¿Ü£þ/ó-GJ(­O8Ph˜¢€*êÿò¾ÿ¯y?ô\߀ÿåÿþÙÿìÕÑêßò¾ÿ¯y?ô\ç€ÿåÿþÙÿìÔëûÑECquok·íC»îùŽ?LÓC&b©SNãý>×þÿ/øÒ>¯§"3µý±d('òš@]b²‰ôqÿ/ù ÿƒâ}þ~ÿòÿ…kâ—ÏKâý69YUn%Qühƒó þ”ßøLôïùãwÿ|¯ÿ@ËÏãKE@`µžGÏIA¨ÍAÿ ¿ýCÿò7ÿc@\ì;R×!ÿ ÇýCÿò7ÿcT¿á3Ô獯ýòßüUs½½+‚ÿ„ÏQÿž6¿÷ËñTæ×<Exkh$XˆÀòm÷)ç®H?ϵ¹Ýæs\ö—Šçßþþ&•gñUê´ \¨#$˜Ä]û6ó w;£ÐŸNk™½˜Ëpç¶k'û7År÷_ø?øª¢özºÌßñ .o.?:x#+š:MËL‘’O$“Ïé@Ñ®OñEùŸð¤+ÜÁ–XБœ3GÛlÿçæûø+-FSæNªÞŠ¹ÿ
+_ìúyÿÈýzæܚ†œ‘ÓFqýÖÉü…SmVÀž&ÿÇü*’hH¤ù“³E\;ûßûòþcü( –†«aõßøã…DuËE$”àõ
+0Z‹ûß»Ëùð©ÿ²ìÿçþ<ßã@5Û.ñÜß#üi¯â uǗo$ž»˜.?žiçK³íþ>ßãRÅakà[ÆsÏÌ7:§ÿ ãþ=ýýÿëTrkû”…¶ã‚_8ý+Oì–Ãþ]áÿ¾ ·2C·bH í9‰ÎØÿ#þ5­}¦Ò)Daaž§Ö6R^:
+Fè¬ðɼ‡'µ`#¼¾‘Õ²Àµ;÷)ÚÆ>Ê*ËV#=(£C3sRÿ;ŽûEcþ$ °jÓ4S–‹!±Ô
+¡‚ ¬BÇÓ"Î{OR~×Çü²ÇëW¶Ÿí«b:SúUëhío$†Á«BüÑ @ fj<
+Jî%
+'${€Oæj„m.ôLžëUÞ £’)sŒ²‘Z ®ÎoŠ6^àd±ºŒØ’QŽªÙÿ
+b0öšcñÒº_í …eätGŸñ¦´Lß¼>PÝþÙOÓ"€9廝\3ñêr*ÌW×ä†úŠÕoڕ;d”Đ¥Ft6E&V?í.?Æ¥Æ/tmEXü2y]/_ø‘O¦*O¶ e`}¹¤}*é1´,™þëtüñUä³¹F*a‘è¹¥K¥ÐèŽcˆÚ¹kíVî7Ýy®m¦ÁwCÇ÷±Y¤aˆ`Ai@ 1旲¶ÌÓûAËã‚#Gì1g ¸öÍh賍-¥Ü ‚R2W‚?ƹÈä„Þjž>jßÐ.´óçÇ}qR ’ùÖU#$µw.8œ4¾*vôðÆúë6ŒB‘*´ËÇèiEý«É8ÿdÖ±fÔü6êw-ÏP’gõNïRђ%k[É$~êcoð‡³}™¥ðrûMNå‘ #«¨<sI —wBx
+Mq/­Z.6ù‘“…éíÉ©¡×`Xþ[‰bÏ~oéV¡%Ð^Ƅ¾«ç¡øÞßï·£ŸÞ8¨¼Û¼Ø¹ç—ÅZ¶E¶l¦OÖ·UÜÉåÕ°iú3¥ˆü€J’²?µY#ù ݁“ùϛWÖ“l¤ð ± {’FjÕH¾¦2ÁWŽñýN 
+qòx‡[‹¬ 9þê3&¨dÖüCrÃjñ…È&+rsõÎjÓOcžPœ>$Ñۊ+…þÑñ?÷.¿ðñ4©w⛓䅹]àŒ˜D}¿¼@ÇçL‹Ïnh®û;ÄÿóÒëÿ‡ÿKýâùéuÿCÿŠ ê€=k†
+j·'Ξâ•À-æHÌÝ:ƒMÿ„;PÿžÖ¿÷Óñ4íçžd<ÑĄà3°QŸNjí];þíïòÿr°x2á·}¢î(ñÓËRùúç©¿á
+J¿ð™ißóÆëþù_þ*™7ŒìÄdÃopïØ>Õñÿ*Ðÿ„gGÿŸOüŠÿãR[øJË¥”d‘œ—“(‡ÿ ·ýCÿò7ÿcGü&ßõÿÈßýtŸÙZwüøZÿߕÿ
+Oì­?þ|-ïÊÿ…Ôæ ñÆ­;Ã$QGå×nwp9篥Gqâ[Í>fµ†+vŽ>…Õ‰äg±÷®ŸYÿDÿ|#SiŸñáãüÍd¿ˆýBîQÿùœwöö¿}ûËHœF>SäA¹sõ óÈ£ûKÅóÎëÿGÿ]Õ;­O>Ç
+³ø¦ô4 \®FI1ˆ»ölçMþÍñG÷î¿ð(ñUÝќÐ87ÒüM"2;\²°ÁSt#ÓïRÿ¨ÿÏk_ûí¿øšïµ! V8OøCuùíkÿ}7ÿV ðT̄Ïyož!q©Åvy£4ŽCþŸúˆäþʟ‚c5ó¼}ÂFŸÇ'ùWW֜:P;çü!šwüöºÿ¾—ÿ‰¤ÿ„3Nÿž×÷Òÿñ5ÒRƒÍ01SÂúB¢©¶.@Áf‘²}ø8¥ÿ„cGÿŸOüŠÿã[4w¤m¾ƒ¥[îÙc݌ùƒå»8©N•§g‹ _ûò¿áWi(ªi–êéel®§*Â%^•o 
+Gæžù¦´™ï@ö+vžRˆìqžõNXÙ$!ã#\NR@P° õšC~ÿÄCÜÑq1¸_OΦF\8öª¾ag'5,X$sÞªä³ZщÜ:
+ІåU^õ™l̍ÀžµxO
+çÌZ-æÙ-„‹ßµbȤqÞµe™M¹(§gLŸZËwÉ9<ÐX>”S°h¤;´Ä1j »%E3Ybב’1Ê
+¹m®¥<¬¸VÛ¨eKÑuo8ÁÆSÒNÛö(6ýÚè;VU¬K{ö©¢ò¸ákPR)‹ŠLRÑրqJqIŠ;b+3ZÇØý÷
+$…ÇÞZÔÍ\uΫwtª³Êî«ÙÏ佅-g_!$’AµI^•%õ“&Âàªôê*™aYãhåN£Ö‡pZ”£‚fSû©1ëŒ
+رˆ,J ⠟[’HÙV@Ãb×,Š\üجäÑITòÀv¨Ü¾zñVAéRˆ€Á#5;”™4~åWÇSP^àÁ.?ºjÂýÌtª÷#tl£©¦‰g(5,æT”ÊJáˆEß¹`øŠÓtÎ"˜³)
+
+€3ùÔ×m¼“o¸‰]° ‘ŸÈՋmNR$[eb?¼KȜUÝfs’jÛÇúŒÀ¿úÕXÞgþYÿãÕÕßÙZ,­´
+qÚ0+Ÿhcÿžkù
+“ZdR§Æ {KvR¦Áô?¥³[0öøY|TíèÿáˆST¶cƒ½=Èÿ
+½=Ø…R©ÔÆX*ñÞ?©zŠ®—¶Òg(Ç÷¸þu2:H3+™Sš¤ÓØç•9ÃâM£<Š;R
+»€þÆÝÅMö‡_ºÄTFbNIÏց‘óÅ*FaH„'—ÏJQ=¸§oÁÿ
+_4Ž†€b?Ý4DŽªçnLgÿC5Ô*[#҆3挖Î8¨ cÒ¯ÇÍުɕsBŠ£µM‡u;y§E×'Ö¨–k&qÈÏÊjhYf\Ùàš¡àwƒŽÜT‹¹‰ÛҁBc²t`N^³L7}jvg˜ûÒª4ŒŽ”ŠKSI."ƒ
+’\QT–õÕؼ QLÖ̽o©¬’ìt1“Ó=ëDsYº¢½«GÃîÁ­`1ùR3¸ê3IKLÑF)HÆ)”¿J( úVn·Ÿììö+LñYšæ?³WŸãæ†2>áÏsRÛD²õ$֘±‘ 9äàÔÚ~?|¼’ËÅ$1Ò%£UqÐÕÿ
+Ûæêv FÐEV¶æ6‰H’E3KÔZÃQfûñò6ƒ€iTWZNVgu‹°ƒ£a´=+'þc‘ PO÷ÅKý·g$yy‚H;k“ÙÉs#E9É
+séTu¨ü˪Çñ,ÌU½qTõmîã ˜Èêwg4áMÞìR’hȕ
+O*{£hâ*Çá“ûÌçÒã˕—×pÏøT/¤JÉ"0ÿk#ükdRTºQ}ˆæˆý«˜ßd¿‹ä›hé¶LçG©'ˉxãîgõÇ5µŠ:Òö]™_røáò9ë›Ù.cꀟ”±g©,¤O*¹ËÏå[%C¤ä…¬í™J˜SÐ`þb—³’wL¿®Pœ=œ©Ùy?øbºj–Ìpw§»ð©’öÚLí™F?½Çó¦>—jã
+8R50ã#½s7±ùR²×K#l›û£5Ë\HÒÌÎÝIéIÆkBÍÈæª(®‹Ãö‚t2 Æj‘2¼–죑UdŒŽ1]D‰å íWR:ՏxèH
+"‹H¢® &¦,¹éG€ˆ) )'5ev÷ =¨@V1Ÿz‰ã UòaùçM™á+ò#)rzÒ`gôü*¼ÀsRÜ7Ž*;XRà9iÕGFïI„§¦‰8ç­BÃkãҜ’eÆI«.ª:jÌP°ÆÑÏcU¡s»Ô
+Ø·pñÂ8¡S1·%ºÕ•ƒåZ<’=1UÞØ¿N¸ëT;ØÏÁô¢´—O—hù{QSb¹ÉáÓßÍ<¾a^ƒÒ´@¥¢€RÒP0Å͸¢âiE6œP1I¬ím@Ò××~kB³µÃ‹ÇRô9¤'É<ñœb£Fxǘ‡U?»eíº˜[÷Æh&›QšHö«ŸîÕ Z“ha‘Ò†ɹsJ€ÇjM´g‚ì\æ—;OÂrzQž(ò;`àCJÒ''x¥ P‡rEªB@\Tq’õªz–ëLLr Áf=*í¥â(
+1óË+` =*#Ì`äV$@®Ÿ çÅlZÈ<¥9íY²·,ˆsށQ×4á2ÔÜ,gõ5 °ŒzœÌ¸ëÍE$ŠAæ¨V3Q!:DÙr%V'ÖœúÔ³9ó$ñ¸Ô8$šÑ
+ãOº­ ‘}óHy§”tÆ—8Èõ jkQp8<óJÇé‹Èô§´R$÷ëL'&Þ‚j
++¢ð’ÿ¦ÎOAk‘šè¼*ÓfUÀ%;Ö5ŸºmKs¦Á?68íYšÏœm€°9ç®ÇåÇAš)ÊðkŽ,èfŠ.Š‘1%{ëZ,
+ɏQVp»~QŠŠAŒý;ÓZ²'±Ã^.&qþÑ©ô¾'8ô¨oyžCêƦÒø•½q]ñØç:Ø?Ô©5/¿1/Ò¥éÔU€v¥À Ð)ˆ);ÒâŒRÅ(™À4
+QE&)@ .'4¹8¥¤é@\k*·ÞPqê)†Þ"s³òâ¤Ïµ:€+D9ÁaQ›6ÇÊàŸqŠ¹EQû<é÷_îœQ›”Èùÿ,Õú1@¬Qû\«Á ‘ê)âôg” {´FF1‘M0Ä˂Š>‚€#[¸ŽrHúŠzÍ¿ÓgõCQ!žî3@õ-:ŽôµDÙÉÎ
+ŸëFÛ¤ù¾n=óúP"÷J:U´NŸ|ué¹qJ/2ô8 w.ŽiUÔ«¨e=ˆÈªâñ02¬*E¸ˆñ¼gߊ;l2K+i (û#Ê¢“J¶`6†Luºþul21ùYIö4ê—¾†ñÄUŽÒy˜ú26LÊ=gü*Ñæ vI_SkjŠ—J/¡¼s D~ÕÌ1i¨F6F\(é¶LçIöI‘(UL×»GZ^ÊÛ2ÿ´¾8EüŒA«Ï‘”ŒŽøüjdÖWpß Ü†É­GEu*êOPFE@öVÒ ×åþTrÍlÃÛáeñS·£ÿ†!MZَô÷eÿ
+/m¤ í:…ô«WƦ?ºÝ<Ô£!oÝÌÊ?Úÿ
+/Q.
+¹T}¸8q\¼J2+»Ðì–-L§/(ç4‰c5ä‡VσtÙbDd}+jâÐ1$ÝU$²$\ôª$À“õ¨95®Öhcæ¢ûµLƃ84¬4T³È¥äv«V—Ë¥S ã4ðN2)$DªN=êÈEÆÍVwÇãQ3c$ô«‘ø
+ïI2_i7ç*·QPÑv5,ô-Fà1*¦Ÿ>¨${¶øÕµ^Õw}¡€=Ž9ü)¯¬Ì»wn{
+nje52Ú³c¤ÚAb®08u«-nÊy{Tr&8Å ¦"aéIJF(ô Ç"·ü*ö„„uÙÅ` “[Þ;u''û‡eî›RÜë'iɍ5ƒq‘ëR’C1ùÔʽsøW
+6b¶åûÀ`úT.»Ü(éOÜ
+òzSGÌwdü½M\^¢kC‡½ÏŸ'³‘Sig3·Ò£¾ÜÊ?Û5&—þ¼ý+º;ýN²Ûî
+urciÉ®ZïkÎÛzRéE›Ã0Ä/µq¡ÇcZÑjÚ¤Ɗíä§!Lcúâ²#@JSŠé¦‡jÆÐŒTû.Ì¿¯ó|tâþE×nD›™TƒÔ Š´¾$sâ à‚¥:„Ça
+W¸5¢4+W³ß$x9ÎTcùSåšÙ‹ëY|TíèÿáŽvK¸¥b~eúŠ¤VèÃùUùô¥,|¤lØÿR’ÉÕ¿ˆqGï@åÁOi8‘îôéëOSÈZaµ“’G­3˗8üésÉn‡õJ2ø*¯žƒ§ŒŽ½ic_Ýá˜óҚÍ+ràŸªÓØàgv{X‰åÕ¾ËOіáˆ€Ni÷ ¢«ÀòsU’p?QI$ŠêB’>µ^Ò/©„°Uã¼_çù&|­@.dIwc‘Sº°?tŸ¥V‘ʱR¼jiÜÂPœ>%bÄ·ÂT£]ø¨ä‚8¨ÁÎÎ*U|ŒcŠ£6[Œqך°ƒ*05kµUÎEXˆ±lŒï@‡Æž¼PŒ–^µ;§ËŒÔ&M„¶0zEÂÂàtÑLûKö¢‹ŽÆ£HªáI4¬Ê£$ÔO¼›ó‚:SDœ¿RÙ<ö¦;–2>´z®Ñ:¯ÊNr*HápFâM!Ü·ŽhØ3“Ö€3J(Å/N1Nc½ÃéYºÊÿı³œŽ•¦k?[bºHQÒI2
+Li’’
+Cþ§íQÎóJWýе12³žõ<.=­L
+¹ù©
+$ŒÌÍ*ß^FK‡9ÅU3ŒR‰C`t4Y
+aêº/’¦XrÉԎâkªÍk/—xœžcÑ##ÆT‚U‡5JRƒ šÐ󧌩¦àâµµ›_³^¼cîžWéYt×le̎f¬ È+wƒv¥'œÖ"¹¹á@ÇQ”ƒŒ!'Þ³­ðšSÜëíS“ÎxÅV»™- 2ÈØã½[)¸ƒŽ*Ž¥fní¼¾˜<áZ2;¨nã/ÛÁ¬ÆpÄMTÒ´Ï°ˆg늼«ûߛtíTž¢láo†.%íŸçOÓúOáLÔF.¥ÿ|Ó´Î.?µÝŒ:m·ú•©ÅCkþ©~•>+AP(æ”BhŤ֗µ—8¢“­ÒQ҃@4fŒQ@4¢’Ž”´u¤#4J@.3F)3J4À1KIޓ½)Q֊BiG"ŠQҀ
+)i0M¥š8¥ï@ E'4´( P0¢ŠA@…>”RÒf€bŒœ”ROµFm" ¤{ƒSњ¨ÖKÆ×#ê3Qµ“çå`G¿P3Ä7+–Àôj<ë…ù˜U­ Ph˜÷$l¤F2;VcY¾~VR=ø®†TV^@8îk›ººx¦tŽNúÐR‹{[BðÜÆÌ ª6zñZw†_áÇ=ªŽ–./ّB’‹’qVRžˆOҋ‹[–¬¤PùoÒº¨+ïlcƒ\¼VóɓmÇáHÞt<6åúŠX¸/H%I뚢Ò3çÓ¤-/ÞbiŠ„w•4È@ÆqQîù¸æ–Hœä® ¦~>SŸj
+˜‘¾Ó8TæÂ'›‰PñœªRB±ˆWŒÖv¸„é°–ãsœ
+¦`͐0sN¶j7H=iUÁ B¿÷ K•Ú“?8šSׄÎ=)Œˆü­ÇJš426dúS#¥tUåÙ¶…­]OL›G”,À†lô¡Ì ©ÁëGQ) 7½QƒêhiñºòIFpy47ðA;G4ÝØàq@^IcŸJ5™›‘)ðÛËp¢³l ⑉ÇN;TÖ÷÷6‰*Á&Á(ÚÀ¢†R+ZÚÊÊâ²ì,ª»™]p?YlÅØgµH˜ŽEaÁ¹#ޟ֐„¡Oc@…#ž´}hj3Åu¤éÇjržiZ¡ÏJô{›h@Œ ~ç<×}£] Ë%Pma\˜„tRØÇÖǛ®AˆºcŽ=±cŒúÖv³§ÉxË4C÷Š+<j—0)Šx2W€k7±~¡âe_³G.pû¸÷­½5ÞK·Œ6Õ®u`¹Õ§W‘vĝ‰è+¨‰
+¤R:QAôPM&(ïKF(tæ—¢Œš-%t Ræ“8<
+ â€{QڃE£¥! 1KEw Qҁ@¼f“>ô¸ µ%&)hRÒ
+(hÍ%-ƒÖŒsAë@ƒF( E]EŒvR²õÆržy®Îâ?6CüB¹™­v1œPkNI2K»‹2Æ
+Ø¡…òÌÑZBܐ?Šv̈¢yPº³:žqQ˜ßaq»hïÚ·,ÖæÃN–·2#ò3Ú³î/$šØZ"QÉ#½sò¾Æéù•bŽY‘K0^¤”›.Y ‚ûGpMhØË=¥ŒÐ,BDç­2Kénm͜P¬JN[oSE¥qÝ>¥á–e.¥ŠŽ§4†)Bo
+vúÖ朳éö’'ÙÄÈä`ÞÕíô³ÇöU-Ãá•ìþe Hîny,Ä(稦šâÞLolã®Mmibm-d) ”H¸Ç¥A¨Asur±˜—~ÝØà`UB-î)NÛ3 ÞÍ»–?0NòH3–9èkDir´›@@Þ¦ÝX¾ŸrŠàwÊr*¹lG;{›gMŠ=
+iÊåÛN:W-*²ÄsýïÖ¶®u¹¥¶X€9 1JȸWï~ ±lU$D·3˜äœÒch硧L¨ òzŠ„¶@“Ž”ÄZ‡ËØYјúŠd“6ìǕ8¦ÆÎùIæœÌŠ…GsœÐhÅd ÜAfòúâíƒÏ+JàcžÕUˆÏËJŒU²9 \†·sýM\±KWYZæFO”í
+2I¤HvȬÐ2¹•Êã¥XŠÊG9ùGæ¶"³–å÷ìX—»»l¸ó J3Վ+‚ÔÂKÜ ’ýjÒÃh.78Ì`}Ú莬tq#1<q*W³V™blc;W­K˜ìrX‰2beaT岖3ó-ww:5¾K"(þÍfϦ: ÄÌG÷XP¦˜¬q®¥3êiçÕ¹=œeˆ•LmÜU‹tŒŠ@ì}j®t;‰ÔÅ88íHxg4 †æX—9éGlУ§c>ÔÂÃ~hšyLt¦g&€ø«OCԎŸ9ÜO’ÿxVe
+}*g%bã.Vz$ r«"JqÆJWUn
+sÉÅpV·³[>ar¾Ý«Lø’ø©»ô'oZãt$¶:H³©XЪ1ŸJ£«jÉa E;ç=è+›¹Ön§ÇÊ1YÆB͖%©<֑¢ú‘)®ƒä‘¤bìIf9&š3M¹æº-cÇc½á/ù
+? Œõ¬÷­ï
+(¢“4 @æŒÒÐRS»S{Pç4
+£4†€<ÑIŽ( £9¥¤ ¬ÛÛ2Ù+ƒZt†€9¡–6åX{Š’ÚõѶ¹${Šê jF
+³2nÈ皧§ÂKo'
+=kný“ìr†ÈëéYp[ù–¥Ôœç ®šRos)é±7™m+´(ozǽ·0Kƒß‘WM“ðB{桞#•žqÆks&ÌФŸJ–5Àç“VD)Ž¢¥ò—hÉZ c-ù5¹¦?–܀ǭgEo¹rAýjÁ>ZVqÚš`vƒS1YÆ
+ϟ íMw±a=ª5@>N£9攬Àúö©H¹lˆ¯‚ÙZ½uÀ¶]Á³Óš¡¢.r1Ú­›çƒh·Q0íÖ¢NÃH ÐÁAßÁ'µ[‚XæR¬‹pI<ÕT¸Ì;˜dŽÇ¥Uó9Ü£iô–¥-Çj¶P”ِÙçÅssÂ`o&Uù*ÕÐÁ%Šä‘Žj“ »…áàS[A“$r·V¦)=Aä¬ØÙæFñ±ÉNA¬ÉWkS[ *OS֜1Ž•RG~•3¡¶œdzRÐL㥥î) êM֔t síJ~^)€ßzrõÏjB1ÍàŠ.yÅÇ¡§žM4}â/z\óL'šzs@
+q[Þ%uq”`ÖüNÿ`Ö5¾j{~sœf™ Y>VPø4ñ.á€0) ã§5™G¾ï.0¹ô¤gŽ1Rc‘žsHÊ sTž ìpz7³ŸöÍ&œÚ?
+“Uâþã÷ÍE§ŒÝí]ñØç{u¯0©éVV³ÿRµdU¢@ÐéGE½(¤£$š3š)Ã¥&3K@%(÷ QIžh{QšZJZBhí@ h\ñF)=©{P!:SI֗‚”g=hPšm¹ ç8¥£©¤ QڛÎ( £­iGJ((£¥-7ږŠAKF(€ QKҒ€a@£­¢Š(Ï41Ï4«ŠNô P4ÓO4Ò3õA˜AØ×;åyŽì1…ëšêîâ@êMsï!$äÒhD֚œP[¬o¾•:ëPqº9ÐVkˆ‚ƒ´þT‘ùMËø
+F|µà)ÅQ)äçŒÓ·°ç5iLyÆÓÉ¥qƒhžNuÍZkŸ”£²1ëQ'–ýAÅ:Gˆp¿`“dM"ôɤÝã½J d}ÓAúCh½k)hþvRv ÜÇ%Ìi»å^™ª*Fì âœÛ;y¥qX¶òI½°üfŠ¥¹Ú¢‹ŽÇÿÙ
+endstream
+endobj
+38 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 467
+/Height 224
+/BitsPerComponent 8
+/Filter/FlateDecode
+/DecodeParms<</Predictor 15
+/Columns 467
+/Colors 3>>/Length 14713>>stream
+xœí} ¸eEuf]Gä%‚4H2‰Hl¯òTðòèæ)—·™|8>F||¹$&~݈€""Jƒ¢\c†¤OF3Œ‰ŽÌL³¢@·M7 ˆ´´$£MŒ
+ÝÄ("6àãÎ>{Ÿ³w=ÖZõصw}ïúù¾æžÚµ«V­ª½ªöªUÿžXûÐwƒÁ`0ZÄÄWØò2 F»˜X·ñ{©e`0Œ……‰{¾ùÏ©e`0Œ……‰õÿKùãÈWþŽûò cã©'ŸúöÿûÞO~òdÜbwÛmçýï¥;î¼ã¼©¢€nyçææ\
+š˜˜X³fÍóvi\ù FG±a݃½êe{.Ú=n±[·üø¡oþÓÔч̛*
+LlØôýòÇÔäÌìiñ÷Ò¥K×®][^Ò~.[¶,˹ÝûƕÁ`twÞ±á´Sú÷Ÿý"n±/Úå·ÞvÏñ'M͛*
+LÜû­-¼ö¿­¬y'&ª¿Õµp±æ}þ‹_W>ƒÑQd6ëôSúql›µû./¸E2‹íW1'¦oBLäþ'£HšË²ÿæÙ憗Šÿï!U1¼é¾G~Pþ8bÉoeö4[ÞæW$³;a®\ökÞí÷ÜOºüðÿ~ߧþý’“οpé‹žÝØßÓ#¿†­k?yåæî}êyËOÜ#¬5Åc0¾üÅõ§Ÿ~L«Å[nùÊ ¯;ÒZņ5k¼ï~¬œCŽ8|jÙ2×*žxª4³#dkω{×fU|uTàk¦ŽY¶aíÚï¿¿ªbéÒA¾‘yž››ü='^ôÂË*
+LÜÿ?,þò}†kÞÂìŽÊPj/nË×¼;,Z,]{ø†‹V/zïE™…züî«®ÝxÈy+Nt3VՍÞyÿÒ§®¹uÑ[?yö+†?×n=qé+œju†‹x ÆBGf³Î8íèŸüüé¸Åî¶Óö7ߺ®4‹DŸ¼ò£_øÜuX9oxÓ»–_ü~Ç*¤5ï„­y³í§þëUÿç «Š ð†s=âð¯ßw¿œòî÷]V‘-«Ë*†å~íTþxõ/®y5?Cösôo±ì-Ö¼;Tø7¿paf¡Þ·lOío+\2ƒy¶¬™½bˉö†È¦6@<c¡ãŽÛï9ãôc~ú䶸Åî¶ó7Ýò•“N>jXÅiGÿôçπ9g¯¼’¶¼+.¾®b§çßt뺲Š3Ï8æÇ?ÛVÙ½|å[Ä{ÖÜýõ{ï»áóQÜxöÿXþûÐ×qä±ËÄÜDuCî«È
+Ú}×nºy؊|ûÑòÇaûï­¬y‡÷*–wx[¾æÝé%¿'ÉÿÍÿõÞՋ.|ß±{*ësïþŸæ×ùëÞôªü¯ÇîþÄ·çÿà·}ê?O–™³?þêE¶­wÌ^}K.Ùao½æà‡³t¡"ò<žxÍ9€á­n/ª‰tÊÞ·¯~ û±÷)XqÜ^†$øE»© zŒ…Š/®^wæéGÿäIØ,ㅻlóÍ_yÝ)G«8#3îp×^qEay3#+§—‰ç}àp™å½E«âéҗ[˜Â¹Ñâ÷ž»ï~`ýŸÿ›?—Kxã[þô°©×uì±Ò¹¸kˆÝvÞþ¦Q+†Å~ý;•?]¼—Ëš7ËPXޝ÷9@ª}ãçÏ_½×EïÏ,Ôãw~ôczÁù'½¸ºåî_þÐA<ïøEê¥wˆÏ^þØëþü“JQbÓõ×n9ù¼ã«RJl½ãÚϊ·(µ”þ•x{^T–窯4¸q˜™õ«ß|`Væ…-Îùø9¯ÈþØxÐ ÅrcQµ)Õ"½fc¡âöÕëÎ:c)¶ ]wç_Û°»÷ÕSSG<x)3‹7Þ¼öäÜfÑU|âò˯ûÔåÙïz÷ßóÁ‰ö*²•ûÄhã,7ŸùÎÙp ¼î®¬-÷Å%¿:3»Ç—]Å?[ºŠ_¸Óöe&ܼ¥üqÈ~‹ªØ2°!ûW¾1ÇÆÏ¿§÷àðïWŸó‰·Mnú|ækù_ûL¿ÿâãÄ?ñÑGO*¯o¼íїüP|é{
+[öx–çæj)~èÌÇÞ,²<‹²Ûe+û¸Y¾éoÿäáÿÛ'7J%Œþs³8U®¿Q˜R( FŽþm_yý™K±5ofK¨‰?xù¨YÜùù7Þ´vúÔcŠ*Î:séH¿üòk¯¹$ûã¼÷®”ÓËÄó‘*vÍ-oUÅKŸxê™|)¯\‡ ë¾|çW×o(Ê,‘þš#§Ž9áÙRoÍïÛuǪŠßø§­åƒ_¶'U61úYÄüîúÛKTù7~î¼[÷zÿŽS–¥™µúÑë®}û+Ė»®ùïâ­ÈíW‘"߸ê±}öùÑ^§]ó–Õ»ÈÂe~ø±“¯{“fzÕÛ¿õ7ïÚxP–G.A)mëW\}ëyçuoړ¼œÁ` Ñ¿uí™gâ ҏ\~Օb÷^tñÕï¹6‹»í”[ÞӖUœ5¨âY0çÇ?òºŠó/½¼´ëNÛÝ4ªbuVÅKŸÜöK=²![û¥Ìì®/kÉʔÿ~ÍQG.=á°Šwx^fyOÉ«(0ñÐw/´ï‹ oƒ|h¢@éa(~.[³æ¡·þ‰šå¡Ï­¸u¯‹/QŒãÃ}þí{_tÁÉ{n½ýãW>pðàꖻ>vÙ7¾ìüi7îùÅ?þâÞEz–²êÑӀ<ÇiÛ\YùŸþê¡ïü‹7½2ÿ¹õö»¶œ|Ü+·‹"qP›}û¤R‚^ÚÖ/¯ü¬øÃóOx”¼Ñ”ŠÁ` ±ú–5¿Ö±?}
+¶¼»ìÃ+?|vï%ºö‚Ë>^záŽÏÿ»ï>åôemVñĶ_›cåÊ·Xv^ué‡Ê*²?úÈû×­—S.úð‡³EïÄÜÐÛ;WOˆ]vx^YE‰ßû·òǁ/݃8=œYÞ"ó×¼ËÏùSõúC»|`¡Tççcw^}Ùm?bŸ×*~´×9ÅÕ,ç_~=¿|è;ÿòͯ*oÌ3‹³ÞwáÉ{n¹ýš+oF]öGŸø/múì}æáßJµrÎ}ò{•Äß:õâ²ÒR¼Ñß[>óžOÑy¯yÇ'ß1i½Ñ
+Óƒ±ÐÙ¬×Ÿ¹ì§OÁ Òµ_þÒWïYÝ›¯O/½pÇíþþ¦5¥Yl§Š'Ÿþ•t}èmÈþ·öŽ;î[wO‘zøÑG{ÒIk¤”#Ž>jéI'I'.*ì¼ýsË*
+L|óŸ\þxÕïî^¬j—å!ÇÕ
+‡rÀÞ{G>qôè£[xð;qjÞTQ`â[ßÿiÜ: ÆÄϟüÅ}÷~c۶ȧ‡wØaû#^{ðN;¿`ÞTQ`â‘}"n ƒÁ 1ñÈØò2 F«˜ø‡ü,µ ƒ±°0´¼vLnÆ`0ŒX¸øâ‹>±«-ïuסk ƒÁÐðÌ3Ï<þøãÏ}îs·Ûn»ç<ç9ezÔ;!±/Läxú駳[Øò2ZGÿ܉S6Í~gýòýìy»ÍŸ<rñ
+ŒVqeyÏ*,Yöoös½8çc6Ë[¾ð8Y4C±•é·z̙)¿:¥yP=ý¥¤`ñ¸þT߇ÚÝ“„eQiî8´í¤õˆ
+iÓOS–×·_œx—4‹°‰€YÞ,%ûù›ßüæ׿þu‘¾æ,—Tn^ŸDé™rY‹0ó™þY}i[<4~¹Íþ{Á·³JŔ8ûúõ§Þv¤dy«÷!éá‘<M.­R˙Á†ºæí¯ª4v=7¼«¢9rªDà¡1šd¾wºÌÍ•'}„uý¨ŽtHÈ7Ë0wš°¼¾ýBX^¯ö
+1ã °:tÛÛëAûÉà8ToÅ SsÏ*ÿ(Q'ó5oË«‹·Yˆˆ~^4öõ͕1c1`¥ôÌ5z#’I´<t¹ 3
+ۂrÔ×
+º{ç¿eœ·Ï+¿˜0cŽ,PcиÒÛ@.0R_9]ù<$O ˛†º|¡¶'´¼`ý%@s$«A6Ù+—ÌN®Xa¸«Â!™º–‘ÇÚUèâ »G,5ÛPÛòÊҀ
+Àz&6J[’©‘''Ê&‰rɈ.ŽŽöâØ4`;lXz·-o2=3cN0´×o‹1G+G&ŽÐ"Ëͯ¾ õÔºÐ6¼7•_
+;tÍÛ^ÿTiìznxWEsäT‰Í1éX4oTžôÖõ£:^Ð!!ß,#úW߃ê…‰X^¯ö
+<J0cN]ËÛ6cZŽ‹å–°Bå-sÔsã à³!&ÿXòÅSÕJåµÍ{ÍK•ì–¶æµó6ˆ€öR A‰ÀŒ9cÌA3èFu8¡(ɚ{By‘ûÈ;¶îG$cÒ±/àŸ=6±¬Âô#‹¯
+wŸE?,oP½f{á6ßöùS‚s:ǘC\·›µz§f…RY,°{Œ}ÌÅ®_hr¶Æ¤ƒh{ÂxCx¯›²¼˜~ª+Žtv:¢oCP½t{Àz‰üéÀgØ‘춙g`=0À–—;~;Öà ly £m°åeŒŽX3¸o;É>R—89ßm|ßòc÷ßc“Dãs˜1gÌÐö“`ìÔ!ÇN&ÞqN®á8¡T©Îy±åÍÁŒ9~²BZ`Ì)+×lÃ@ä'Ó½C³¼@ŠšÚðÔ#þª`l!lþ¸XÞ:q|¢oÃ@©ˆs‚¡$ê·Å˜ST¬XÉü\º·++ȏ¦ûÊã *j©-f¢ ÔùªqË I÷‹õ‡FŠœ“#¿„M·ÎŒ9˜àxC»RéI0Nυy'´†O¦t+˯”?53#z‚\B‚z¬™1§kŒ9è‚™™°üäÂßCo؞lJO詜¯È¦õrnE‚õ… ù跇GÃ[}y$dÂÖÔÕ/JÏ8uÛbÅX{ázr¨:yÍ/ëP‰~‡è1/onn3ætŒ1ØPød¨áõ‘'¥AKÌ£:ò‚܎ñµHm8ëx©>U”p9€fo¸<6ÿUMËë¨s X K™ßÔ§m¼Áã|pçòõ¿„¯Iû̘cúyCsô…^>¡•_}7™t°ü2WƒZŽŸ<µ 9lªÄæ˜qÀÞVµöV<ŽxÿÊ9fDË«:p€Wv?/ö‘uaŠa6 lœ„^tÔC°å]lNxÎ3½á˜Ó×¼èۇÓ܋Aj íçµÝ­&v˜1Çun·å_Œ•ã)OMÀ3cCÌ8(¬ÝöözÐþE28ŽÕ@1ÈÔÜÁ³Ê?JÔã Æ|Í[Çòêâm"¢Ÿ=@}s¥D̘C X)=sÞˆäGÒ-Ý_.HƌƒÂ¶à…\õõ€ë/©fg?/àT“ È·QÓòbòlî÷Åô4aŽ}'?o oƒ®ÃžÅùoç̘Ó9Æ q¥·\ `¤¾rºòy
+3
+…;t¬‡…Œ!Q#°åe0 ;/¨;
+vÀ¢ý¥®sÅF!ó<ª;gÆ(ŽØ‡éÆV/ÔªRÃÊ;†o{¡üÉÁŒ9]cÌA-£‹å…ŽELª±‰= Oج9¥?ô´Žçaêsn“åEpði“ÐOˆ·Áéì™g¿cuô&æ×^ CP"0cNÇsÅJçjlÞø´|O³Gõ ôKD”’¦aÒ±,*͇¶Ýƒ´~±@!múiÊòúö‹Óïò‚f6˜1'8$ºŸ„1G/gv蚷¼þ©ÒØõÜð®ŠæÈ©›cÒ±hÞ¨<é#¬ëGu¼ CB¾YFô¯¾Õ 5±¼^íxþ”`Ɯº–·mÆ´Ë ,a…Ê[æ¨çÆÀ3fCL:þ °ä‹§ª•Êk›÷š—*Ù-=lÍkæmí¥‚s:ǘƒfЍêpBQ’5÷„ò."÷‘wlݏ.HƤc_À>)zmbY…éG_î>‹~"XÞ zÍöÂ;l¾í%ò§3ætŽ1‡¸n7kõNÍ ¥²X`÷û˜‹]ÿ¾ÐälI'Ðö„ñ†ð^7ey1ýTW é&ìtDކ zéö:2þ€õùӁϰ1"!Øm3ÏÀz`8€-/#
+wüv¬†Øò2 FÛ`ËË34±6fpßv’}¤.qr¾Ûø¾ådžo¿Ç'‰Æ3æ0cΘ¡í'ÁØ©CŽ64L¼ãœ\ÃqB¨Rób˛ƒsüd…:´À˜SV®Ù0†ÈO¦{‡fy5%´á©Gü5T%ÀØBØüq±¼-tâøD߆R3æC;HÔo‹1§¨X±’ù¹t#nWVM÷•ÇTÔR[Ì8D¨óUã–’ïê&9'G~ ›ns 1Áñ†v¥Ò“`œž ó6Nh= ŸLé
+_“ö™1Çôó†2æè ½|B+¿ún2é`ùe®µ?yjAsØT‰Í1㠀½­jí­xñþ•s̈.–Wuà¯ìþ~^ì#ëÂÃlØ8 ½è¨‡`˻؜ðœgzÃ1)¦#®yÑ·§¹ƒÔ@ÚÏk»[Mì0cŽëÜnË¿+ÇSžš€gƆ˜qPXºííõ ý‹dpª7€b©¹ƒg•”¨ÇŒùš·ŽåÕÅÛ,DD?/{€úæJ‰˜1‡°Rzæ½ɏ¤ Zº¿\Œ…mÁ ¹êëÖ_RÍÎ~^À©&?o£¦åÅäÙÜï‹éiÂûN>~ÞÞ]‡=‹óß2Ι1§sŒ9@ãJo¹@ÀH}åtåó<1,ofèò…ÚžhÐò€õ—Í‘¬Ùd¯\2;¹b…áj¬
+‡dêZ^DkW¡‹c$ì±ÔXlCmË+K>(€~ˆqÎgØžvÏÌ3°2j÷>[^†
+wèX 5B¢F`ËË`0v^Pw>ˆÌ¶²åetè†é¼D´íC¿Æ,}„n÷Kûz‚sƉ6`lë™Ø(mI¦Fžp|œ(›$Ê%#º8:ڋcӀí°aéݶ¼Éô̌9ÁÐF\¿-Æ­™8B‹,7¿ú.ÔSëBÛðÞT~)Èû;lQ€5­Y ã
+ðiùžfê藈(%MäcYTš;m»iýbBÚôӔåõí§ÞåÍ"l"0cNpHt? cŽ^Î 6ìÐ5oxýS¥±ë¹á]͑S%6ǤcѼQyÒGX׏êxA‡„|³Œè_}ªj$by½Ú+ðü)ÁŒ9u-oی9h9.–XÂ
+•·ÌQύ$€ğ˜tü`ÉOU+•×6ï5/U²[zؚ×ÌÛ ÚK1%3ætŽ1Í Õᄢ$kî å]Dî#ïغ]ŒIǾ€|Rô<ÚIJ
+ß~5N7fÌaƜ1CÛO‚±S‡;mh˜xÇ9¹†ã„P¥:çŖ73æøÉ6
+1ã °:tÛÛëAûÉà8ToÅ SsÏ*ÿ(Q'ó5oË«‹·Yˆˆ~^4öõ͕1c1`¥ôÌ5z#’I´<t¹ 3
+ۂrÔ×
+²É^¹dvrÅ
+Óy‰hۇ~5Œ9XúÝî—öõ<3æŒmÀØÖ3±QڒL<áø8Q6I”KFtqt´ǦÛaÃÒ»my“é™s‚¡¸~[Œ9Z92q„Yn~õ]¨§Ö…¶á½©üR÷wØ¢kZ³@Ç æ;
+t?º “Ž}ø¤èy´‰e¦Y|MP¸û,ú‰`yƒê5Û ï°ù¶—ÈŸ̘Ó9Æâ:¸Ý¬Õ;5k,”ÊbÝcìc.výûB“³5&|œ@ÛÆ
+UÔvàõÓ0æ¸Îí¶ü‹±r<å© s<@í€f옳‚u<´·×ƒö/’Áq<¨ÞŠA¦æžUþQ¢O0ækÞ:–Wo³ý¼hìê›+%j›1'‚W(OëÐXµÃ˜£­þl–͏¤ Zº¿\Œ…u<.€úz@õ—T³³Ÿ ¡– È·QÓòbòlî÷Åô4aŽ}'?o oƒ®ÃžÅùoç ‘1'’÷²Ÿˆ1h\ém ©¯œ®|ž’'†åM̃ÔöDƒ–w¬¿hŽd5È&{å’ÙÉ+ WcU8Ä S×ò"òX»
+]#KÅ6Ô¶¼²4àƒè‡ç|†á‰>3Âä`=,dÔî}¶¼ /4îÐ9°2ì(V°åe0 ;/¨;
+Df[Ùò2:tÃt^"Úö¡_c–>B·û¥}=ÁŒ9̘Ö3±QڒL<áÈ8Ñ®¨—Œèâèh/ŽM¶Ã†¥wÛò&Ó33ætŽ1G+G&ŽÐ"Ëͯ¾ õÔºÐ6¼7•_
+òþ[`Mkø8Â|G„33½^£,ê櫟 «âkycÕ BÅÀDª7Nˆ©?˜1§sŒ9J9RÃ(Ë+Ÿò„bÝõ\ ‰³mÔß“Žy> ;`ÑþR ×¹b£y՝3cGìÃtc«jU©aå÷½Pþä`Ɯ:q©)sPËèby¡c“jl¢EÏÈ6kNé=­ã9E˜:Ĝ[ãdyQ|Ú$ôâmp:{æÙ/ÀX½‰ùµ×”̘c½1c Xé\Í۟–ïéaö¨ž~‰ˆRÒ4L:–E¥¹ãж{Ö (¤M?MY^ß~qzà]^Ð,Â&3棟„1?Þäºæí¯ª4v=7¼«¢9rªÄæ˜t,š7*OúëúQ/萐o–ý«ïAõBD,¯W{ž?%˜1'ý4Œ9h9.–XÂ
+Ë I÷‹õ‡FŠœ“#¿„M·ÎŒ9˜àxC»RéI0Nυy'´†O¦t+˯”?53#z‚\³z¬™1§Nüi
+ÆtýŽÌLX~2¨ÜCo؞lJO詜¯ÈæxðrnE‚5Øù跇GN}y$dÂÖÔÕ/JÏ8uÛbÅX{áz({Ð(‰7óË:T¢ßa «½¬¼¹¹U̘c½1cþ`
+ djîàYå%êñc¾æ­cyuñ6 ÑϋÆ ¾¹R"fÌ!X±´ú³Y^4?’.hyèþrA2fÖñ¸êëÖ_RÍÎ~^y7Iâq¦djZ^LžÍý¾˜ž&̱ï$àãçámÐuس8ÿ-ãœs‚ÑOĘ4®ô6 ŒÔWNW>OÉÃò¦aÆAŽj{¢AË;Ö_4G²d“½rÉì䊆«±*b©kyy¬]….Ž‘ƒˆ¥Æbj[^YðAôCŒs>ÃÆðDŸar°2j÷>[^†
+Ut•1Çun·å_Œ•ã)OM˜ãj4cǜ¬ã¡½½´‘ ŽãAõP 25wð¬òõx‚1_óÖ±¼ºx›…ˆèçEcPß\)3æ¬XZýÙ,/šI´<t¹ 3
+²É^¹dvrÅ
+…;t¬‡… {Šly àêŽÂ‘ÙV¶¼ŒŽÝ0—ˆ¶}èW#À˜ƒ¥Ðí~i_ÏC0c3æ€õLl”¶$S#O82N´+à7ÔC{ql°6,½Û–7™ž™1§sŒ9Z92q„Yn~õ]¨§Ö…¶á½©üR÷wØ¢kZ³ÀljS˜oCV
+uóÕOUñµ¼±ê…
+¡b`"Õ'ÄÔ̘Ó9Æ¥©a”å•OyB1îz.ÐÄÙ6ê‰o‹IÇ<F[ކÏø9Ö¥Ø(džGuç̘Åû0ÝØê…ZUŽ<%ÆÙ·½Pþä`Ɯ:q©)sPËèby¡c“jl¢EÏÈ6+Fé=­ãiM’έV𦠠8ø´Iè'ÄÛàtö̳_€±:zók¯…!(˜1Çz;!cÆ@±Ò¹›·>-ßÓÃìQ=ý¥¤i˜t,‹JÈãÝ.³0­Ÿ2‹å…ŦŸ¦,¯o¿8=ð./has‚ÑO˜ƒor]óö€×?U»žÞUÑ9UbsL:Í•'Ø]Òõ£:^Ð!!ß,#úW߃ê…‰X^¯ö
+t?º “Ž}ájŒZüÖúzÀńõ#Ë  ŠúÙ(ýD°¼Aõší…wØ|ÛKäO fÌ F?cqÜnÖꝚ5Je±Àî1ö1»þ}¡ÉÙ“:N°í‰†õà(§TEuÅ`À‘nB›ßÛT/Ý^GÆ°^":ð6F$ô™A&ëá¶¼Œ(Hæð3°N`ËË`0mƒ-/c̐(R+Ü·d©Kœœï6¾où±áÛï±ÆI¢ñƌ9ãßÇ¢í'Ê¥†¬‘wœ“ktVhUªs^lys0cŽŸl£P‡sÊÊ5›Æ0ùÉtïÐ,/¢¦„6b„};T „86\,o 8>Ñ·a TTÇòþ9]æ
+endstream
+endobj
+42 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+46 0 obj
+<</R7
+7 0 R>>
+endobj
+47 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R10
+10 0 R>>
+endobj
+51 0 obj
+<</R7
+7 0 R>>
+endobj
+52 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R10
+10 0 R>>
+endobj
+22 0 obj
+<</BaseFont/KPSHBO+Arial/FontDescriptor 23 0 R/Type/Font
+/FirstChar 1/LastChar 1/Widths[ 278]
+/Encoding 57 0 R/Subtype/TrueType>>
+endobj
+57 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/space]>>
+endobj
+58 0 obj
+<</Filter/FlateDecode/Length 710>>stream
+xœ]ÕMnÛ0à½O¡˜|ü‘ܤ›,Zm/ KTàEdÁq½}gæÕ]t1A^H“üHš9¾¼~yÝ.÷áøývöû°^¶åÖ?®Ÿ·¹çþvÙцå2ßÿVú9¿OûáøòuÚýÞû€}õúÛôޏ?ÊI‰þ™ùºô}šûmÚÞúá9„ö¼®íз忦'óOœ×G×Ø<ÁBC™š'¤È27O(Ʋ4O¨…eů#Ë1±<5O¨úìSó„Q§æ µ²<7O¨™åÜ<¡Î,—æ edٛ'ŒZÆÚ<!M(#´L¹³„&J”ùÙhMÁPœ7¬O,‹֕%pсE”'–°Fy«&‚5ʛÎ,aòVÍ k”wÔ"aòz#¬QÞDo„5Êk
+Ö(oÒD°FyqP
+&ân¬æ^Žl°š¼™"ƒÕäÍ KXMÞD Ájò'2XMÞÄ#3XMޢΰš¼Y­°šŸ/oŽÁjò®Z$¬æçK®„еHXMÞªUÁjä>'à’€…á&*˜W­À%Gž 
+ÖÌe$à’€™—y( ¸$ qëpɁ<£\päUIÀ%³:—Lj. hÜg£‚ÎZpŒ…ȍÅ1*˜HX´r¯2¬Ù/0÷
+ WЙ"L® •§€
+–Á¡pæ
+Z5¬Yޕ‹Ì°f?Pð…PÐY­°fy°p«"!Úå5n–¦`(ž fSÐÊ}ÆåRЪ¡`e077QA+,%G.°y+;ã¥QB˜9®ž‚C¡ßór7pAÈÇW\ÁÈ$àñP° u†µ¸WCÁʘEpl»JX‹a)*°2Œ[W`-òf­Ö¢ó5•°¿ÏE¯ðã¹åƒÌ—ýñóçíÖ·»ž=ï|Ö/[ÿ÷b¿îüԀþµ}³
+endstream
+endobj
+8 0 obj
+<</BaseFont/WACZZZ+TimesNewRoman/FontDescriptor 9 0 R/ToUnicode 58 0 R/Type/Font
+/FirstChar 1/LastChar 95/Widths[ 250 333 500 667 444 389 278 444 500 333 500 278 944 333 278
+722 722 722 278 500 444 500 500 278 500 444 611 564 564 564 250
+500 722 722 889 500 250 500 556 611 500 500 500 444 778 333 333
+722 722 500 500 722 722 408 611 500 667 500 278 333 444 722 444
+722 556 667 500 611 500 500 556 500 333 180 500 333 444 333 564
+500 278 722 500 500 722 500 500 722 713 722 500 1000 389 500 833]
+/Encoding 59 0 R/Subtype/TrueType>>
+endobj
+59 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/space/hyphen/one/R/e/s/t/a/u/f/d/l/W/r/colon/N
+/G/V/i/o/c/h/n/semicolon/g/z/T/less/plus/greater/comma/b
+/D/O/M/three/period/five/S/E/p/udieresis/k/adieresis/m/parenleft/parenright/U
+/H/y/zero/A/w/quotedbl/Z/v/B/six/slash/I/quotedblbase/X/quotedblleft/K
+/P/C/eight/L/odieresis/two/F/germandbls/quoteright/quotesingle/four/exclam/question/quotesinglbase/equal/seven
+/j/Adieresis/x/numbersign/Udieresis/nine/endash/Oslash/summation/Q/underscore/ellipsis/J/asterisk/percent]>>
+endobj
+31 0 obj
+<</BaseFont/KPSHBO+Wingdings/FontDescriptor 32 0 R/Type/Font
+/FirstChar 1/LastChar 1/Widths[ 1067]
+/Encoding 60 0 R/Subtype/TrueType>>
+endobj
+60 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/barb4right]>>
+endobj
+10 0 obj
+<</BaseFont/AKCXNM+TimesNewRoman,Bold/FontDescriptor 11 0 R/Type/Font
+/FirstChar 1/LastChar 59/Widths[ 778 556 444 444 500 556 278 444 278 333 500 250 611 1000 667
+389 444 556 333 556 944 500 722 556 722 778 722 556 333 500 250
+500 778 722 500 500 611 556 722 556 556 667 500 833 500 250 500
+333 722 278 500 667 333 500 778 722 722 500 500]
+/Encoding 61 0 R/Subtype/TrueType>>
+endobj
+61 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/K/u/r/z/a/n/l/e/i/t/g/space/F/W/T/s
+/c/h/exclam/p/M/o/C/k/N/G/V/d/hyphen/five/comma/eight
+/H/w/two/three/P/S/A/b/udieresis/B/v/m/zero
+47/four/colon/Adieresis/slash/one/E/f/adieresis/O/D/U/quotedblbase/quotedblleft]>>
+endobj
+23 0 obj
+<</Type/FontDescriptor/FontName/KPSHBO+Arial/FontBBox[0 0 625 625]/Flags 4
+/Ascent 625
+/CapHeight 625
+/Descent 0
+/ItalicAngle 0
+/StemV 93
+/MissingWidth 750
+/FontFile2 53 0 R>>
+endobj
+53 0 obj
+<</Filter/FlateDecode
+/Length1 13976/Length 4570>>stream
+xœí[y|TU–>÷ÞWK6R‰µH½J%¥¤£ L*KìˆXE£T‘€"р»P´"X‚ØŽM+.¸‹+/•HW@›(j+Š0j» ¸ô¨=D?µÝò滯*‘Ì83þ7L½“ïÜsÏ9w;ï¼[ï&bD”F!Ô<sNy×Ä·Áæµ-oíŒÕ'\KĦ¶]²R½ÇþÖ¿Cñ>‘¹å¼Î%Ë_¹<°•Èr
+Uҙt!u²î×oÔoÖ裡O¼¨ÿD)”Gm ýú¦·õ÷© -þ@·ÑavsғäÅ(!xÞIÓVqŽÂô%ú÷˜“.ÅšAûY?÷ ÷vú”å°«D=z¹O×ôçàe§s¨ƒ¶Ò.6‘MãNÓ}†¾Ÿ²0Æeèõ6ŠÐNP”ž¦wYªi@¿_ \*¥3°ž^z•õ‹ÁŸÖÖ b&DiM†eý™þB™‹=ÃW˜RM&¯é
+úŸü×Áoõ
+ý:š…|X‹ÙÿîÂÊúè½:L1Ka£@*s²¹ìJÐj¶‰Ý˶³‡Y/F9È>bŸ³¯Ø×ìN 3ÏçN^rñ‹ù¥ü~?:ÈÿÁ¿Ù¢PxÄD1UÄ
+(nÄú¾Ã«Ä ÖÄæÐ2~j¬7óhåS•½tTy
+k{=_fNe«ù1s*EñÉóyqŠâ/Ó»â0³(÷Ð{J2ËfGùC¢Yð´Rmò“SÜAOˆ‹ØÕô$÷%ÿ`݈<>‹=‚}¡…U°
+? YT)>¦kè|þ6Ås¼þÈ+KèFÏ®¢OéA<ãLšKÌcØK|©æ'°^âÊÃXÝdVĄi4]ËÎ[ÍÇø;´Š(ÉtH<†ÙàOˆʀi6ëÀp5]Gékér“_y-!ÁæQ±r»ÛU¢Bq¢\ƒ]eö´xºwa¨3 ÉA有¼˜‹b+èVì
+2h)žñ³±‹½J½æ¥%¦Q »‘òòàlš¯?H·éKèBýf*Ã~°^¿
+7u¤§žçý'OoÌÓ;ìÉlêTšZVªú\ª¶¿Á¥FÙüY~ț\U;jÈ3 ù&CNƒìt¢êËéhP5T}Zã%a_°Ýu§$×»êۓËJ©;9b
+ùZãÆbÕÁ¦à¡àT×íbfu{ن9óý}6œ6´ø#œñú`] »6ŸJä5´\j¥RVTY¡&†EF¸ÕðÏïÃi#dXCaÔÛ¢Œ uHǨ-Êc:ېŽC§Ät^C'/¹ÇÔ·øÏ㑠”ɏ;œ®ªÏ¢z}¿ãû+l†fÄ¥HMZ€¾ÂݝdÁ6|jσá1]Ç»9ï£qR;Çqð)1ŽŽ\Œ‹xÆ:úĉbl¤Êá
+WO昊ôÚ2¡¢·rƒ«à+€À@¡…¢zø ìö3¸´ªÀ
+`pDZÄXa¨[í‰"ms1Çt‘MÇä/f ÍÀ6ÀløIÍ
+Àùûà6þ–õx:Ò»ü]LíõHåäŠ>Cð”ÇGq\ÈΏ ™YQþZä»qÈ(7î42j·(¤j/
+Œü©@3:3¤7!½I!à&àn@eà6@åû€W€7éÀ 4V~0‚a¢ü@Ä]ç¨ÍÂ!à/8;ø~þ¢Q¾Â_0ʗùóFùÊ”ûø ‘Õ¦ÀNhcCiCY»‰?ÓS”éÐk3øÄÎ^Ô3…ÀfÀÌ÷ðÂÈbG&:ÙMû¬Ï}n”Ò½Vò.sxÝõH@U2÷”Ó!mS·¹¹×½å6T%sßx3$ÉÜ×n„$™ûŠµ$s_p $É܋—A’Ì=!$ÉÜ3[ Eù]*:ÑQ9ó|¦Ö¦óK¥K¥K¥KIÁDß)rn·GJJ±­^ϸGh =ÅB³Yè^jg¡Õ,´–…¦²Ð¹,äa!; °—…v³IEˆy{GT'{sXh =ÎB],äf¡b*b!•Uz£Ü9c¼QøŒ¢§V>t(O¯Æî“Νˆ¨9ïĞ°ü 5/œÔ˜sn, {Jjbõ“§T¬¨Î÷¢á^܆½tPpƒö"ö¢“½è ¼XôÇ0ûßlðtðr X¬Žfc:ÇN+âSÜaL¬<>陲Æ÷‚ä!Þɝޱ6»Íc›.6ÛYz›Y ðJÊÊ–™a͈²´ß¦ýóÛ4JªMâ7òÍ47â¦x¹9òÝXG”ÝqïvԎa¤YÇ&“›£œD]F}"Ù­²œ@vþ(ʊˆ}š¥GÜ¥Ž]l”lµÓñýÇçö(‡ø™}·ã-5ª°ˆã¯Ð<ºÓñ†ýzÇKåQ+4O¹£ Å.Õpí³Or<¾Ïp] Ãֈcµ,v:®¶Osœo7 í1ù]¨yÓ³ÝóÓÑ_ƒ}‘Ãۅ>w:jìç:¦Æ¼&Ê6;§`
+ž˜X‚ÉŽ³ƒº
+ÝEE†O¶J]†OW¶z¼Ï¾bø>Y!ÚgøìË
+;Ë3\æýìRw¹~Øåzc$Á~ö±Ç|Ҏ ù¤ç×^íuë©
+±Ÿ.\P­\%㞮ÿî‚͇ƒvƒü½~“V2§I«Áq·ÅmP.I›2¤KIñá|Sž å©bØQê¦J]RRÜñ¿ÞÿUñ²^>!¾»‡y ØJê
+­ ©…c+h‰ƒvá]J~<t°À.æa]C}ħíñP¬NrÍCX¹*.Åc±2^ÆZ¢I×PH†/,ÏpÄV¢C¹s¿d7áï÷äÌpfƒa—£UÑÿ£×D?ªôÇÎc” %(A JP‚” %(A JP‚” %(A JP‚” ÿS"âñoµ&a|Ç;0Åjÿ/…
+è#ñošå7,âÿûð¿Þ!ãO—¹[»µ»¦OýښèޏO,‘åK½´ûû?-±‘5Õ¤¡qþ ƒ"J
+endstream
+endobj
+9 0 obj
+<</Type/FontDescriptor/FontName/WACZZZ+TimesNewRoman/FontBBox[-76 -215 936 833]/Flags 4
+/Ascent 694
+/CapHeight 694
+/Descent -215
+/ItalicAngle 0
+/StemV 140
+/MissingWidth 777
+/FontFile2 54 0 R>>
+endobj
+54 0 obj
+<</Filter/FlateDecode
+/Length1 60848/Length 38607>>stream
+xœ¬¼ |TÕÙ8|–{ïì3wf2{fÏ,É$™!$Dr’°LdMÐ4 û¦$l
+B‰+T¨UÔª«¸5‹ÀVѪuk¥­Z·
+mÑ⒖ZêJf¾çÜ [ß¾ß÷ÿÿ~ßܜç¬÷ÞsŸý9çÞ ŒÒ¡nDQSãôx’Ÿ} `Ö¼«;:3õ¿C;oíj_*ññihø!Å ;]ý«GÝpe!aÔ¢åëfÆ{®Cè/^Ð1ÿãIOý ¡!¨£²ÅÐ`ú‡uBzvýœÅW¯¾.3þóZ„hÖòó:2õßørö]Ýq]gVLx
+hKúŒR£ñèè0^Ž§£8”'’|ƒ;oOE6Mÿ&ýÔDŸàœt?š¥O‘EÐ&ôdBKÑëé³ ƒh.z oÀŸ!?jGÛ¸®'½ EûÑ;¸JSÑ:þ=Õ~´ÎzÛðÑôñôßÐsF àJ7¢-0ãt”Òñ|/ò¡0º ]Ž: ÷zô>6ãQTJGÒ5éû õ1ô‰‘W¨æC“Pº=ØxDÿÆ\ŠÄ{áøþ;ÿÌ­­A끯ì=†ö¡CxElÄز¡\4ú¶£=pÿAt 7à|¿@÷ð‰TU:+mIÿ-Fy¨f¸½÷8ƒ0î@t5çáVóEÃ7ÀÎG cèw0ïÿFßâ<8þL~L6¥g§OsQ"/ƒ®@sÐ
+/ÂÛñNœÄïã÷‰@ü¤‹|Nûèô#®ŒçÓp%+òÀ}ƒh6Z ø1`ûNxÞÇÑËè5lÁa\Oô.œÿ5Kjáx˜¼E>¦·ÐíÜYþÖԉÔ©Ò=H\6ð°= Xø¶ÂrñR¼
+ÿf¾ƒ<CõT¤AZJ«é ÚB·Ð»è«ô·ÜJn/÷?‰ïà÷*:Rפ~—nHß ¸ÀH€yEP>*A£7-ƒùu±m@7 tð˝¨í…ç~½†ÞAB_öܗÀݯ®»ßÇ}x~¿Œ_ÃÆ_³ƒàˆ’2REƓz²ˆÜÇ]äy—œ¢ÙtÝD»áØEÐ÷9Äq\š/‚c"¿LxCULTÌU¾yvh8o¸eøãJ9SW¦v¦^Hý-=+½æB¨fºfyðà8žN<€^Ao¢?Êsý
+ÑÚA»è}ôôEú6ýŽ#\>ç*¹YÜ"î&î-îwÜ{ܼ—¯ãó»ø—P"Ì–
+O §„³
+žÌ向r¼4î0ö !܅:ñÝHÂGðŸpaü8} O!Z VÑáÑ`„~CýømªF-lŽ8L,¸‰œ&3é³Â1ZŠ1h‰ß£õ˜âðι_
+]p‰€N«mò\„ìèÐ÷gRÏ2Í¿Ço>{ˆæ£i(Zɨdã8šÑ­¨܂ä^´!ݍçƒÞŸ
+ú“ $^ŠâXÚÒsÛöÂJ  Ûà®ß‚þ´~þ;ºû@²Ž¢(Çznãê@3µƒþÝÇ|Ô
+µНÂ~þ¨Ûâ|©]À塁Íù+Ü߉*a~sÐC\>ÌÚš¹ Îx 5Ip܊ÞÀm„99oâ&‚æݙ^
+5Pê³;û±m– ÄVWÑOR“êskëúÁZ6ƒ>ªë˜ß×tEs]­Ëïo)ÈïÃãççö¡`MŸ!&AãåÛô ãûòm|KØÓ m¾þü£=·%E4·=¦œßqUsíha÷0Æྵ}¶õ'íªpqÓøæÍ÷ºhO}‰U{z6ûúz¯h¾¸×Ï`K \£„êÛ{êáÆ·
+æØgßL]¤%S".*_
+úÄ`Ï!ÚL›{:ëÚϑ?™>¼ÍÕW[ <Äb\¬MPMo¹¢_Â[¦Ïi>q™oˌæ‚Éøöš–þèk>ћ$·ÖÊYÅÇ*`ó@*ˆRï:$!Ô-÷rrƒ\Ÿ—ÄHnSžkÃh^’dÚÄsmÚ¸L›$·±Óãg4_̲`µÈND­þTš-¢V\”[.ù½ÌZt³ÑW`Uߛ â³Y݆ á9„fÐ/iž·ªÚBO¢vúÚM?AÇ!qH„JU:¡œ†Ä§Ò?ÖÕIIÈc…r>Í-:Ä:œÙE¿¤&ûÀ#÷BÃñ«Kîùx ¦f¤P6&SÌ+(:^­¦£@"ôcz¬«|Ö`´°ètµ0ý12€³ãE½ôO¨Aý`0'\´ûyú&ô¿N_ǂöڀÎXü5=áŠòý#=ûõÆ"T½ŠÞø8
+ð¤NCâÐ
+Às}‰‘þvH‚ÜZs®Ob璳RGäh.îËŽ¹xG.–*«ª‹¤“ÉÔl µEÛöp+‚+B+¢+öpÁÆPc´qW¬
+UE«öpñ`<Æ÷pÞ 7äz÷pÛ§<=åù)oMáÚ¦¬˜²i
+ù‘ŽXd(0ˆ¿áå2̗²üºïüºùuÿôëôëºüºËüì¼l]ɒ¡†AˆÒœ,ð¤ñê^ñêf{u£½ºjޅáî¨F†ºÄ_=c¨5 Õüª…+áÊ\/˜u9ÃéÊjÈR• ¨ÜÙ÷•?õ>‹¿Ã²IÃ_äœôV[ð<‰cõäÿē ^ôâӐ/‚üQT‰C?2Pyÿ0œÿ3¨ÿ”lüC ³|7ž$·?8rÞùsá®÷䯃»þ åËw½g ÿ$´þt +dwä/‡lû@ˆMpé@ež·Úˆ¡ÂÆÎC!Âf2eäŽáÊË!Ÿ9¹n ŸUËnÄã‚£ ‹°Y>‹ƒ¨I¾w (?¤åKd£ <i
+¾8¬±#ëÚ*{•iœ±¼¾ö¿€ö»ð³Ç.þÙÝ};¦7÷=éné+b…´»¥¡o‹~‘.²¢®öédYKó!¼žtÕMcíx}mËùa(@:aªd6ˆl
+MÍýJTÓA¬œä¡Ýåo©±Šãdáë·ÿØu˜C`¶4±–>m°¦O‰uTT³.NÖ¥g«L#]öõ»ãÇGºDh6kP Ùë–Ôžÿ[µjÕj–Ö¬‰\½Æ.·­¡õOoè«g1qe_e]ŸÔ^ۂ9֌üÆ7Kâó•oU’•›*·Wî®|º’_³¦šMÏÞ
+äðǪ«×¬b?7X)s»ØšØøæêšÞ.ϼ™!!Cš‰G¿øH…ô/Hº àO!= iµÐZPg_RËîØcJÇN‹¥Ec’w,ÌäÓçdòºË3yeu‘òªbuµoŒ|Ґ>‡ô=$žÑ"ùâk2\Û²
+­Ša˜>‚ÊjVÅVã0C÷êU±b‰18P†Æð¥|ðª5P É­«ØikX~îÇ:X¤MÀ°!>›¹ÌgOí'øy|Uy~ñ\’<÷ Ej+ìÇÈ¡ø硟 Šs‘
+/Ã?Bö˜øuåpååâ™Ê©Ã•¨
+ÊâY£~£ß€³9tÖGž•xôòqGáü“é“ø~Ò";Z|„<‰HхªlL ’¤ê%‹5²<þµó[ý¢2$啖<†Â|“tÒA‚ê$³Ê¥’!5'JÖµÄ}ë¿:3d4•Ç‡PÕP•øé¨î’ñÃõµ8HÃ¥%eÅEVK–‚2(¬/7 ããñjîšÂêêBHxÍ+uVM™Ò`MT°æ‚jÀº…ɳ0sÄ­L:^u|£¥ÚdúÛÁ`¨DÎ %8™>5SFÉô«’
+;çßh±BkÓuö-ð`:”Ä3Ô©‡| ‹"x¤gt:5§gÏfu:mFõÕܯlW##6Þâʾ˿t=X§¯[‡¿Î<æȳWV1”ÇpWëˆ\‰i䢧õ_üèD*³’1…±rsyjîhkiA~…³ŒqÎ:‡£ª¢bÔÌy©qt}¾T1vTäŽÔûì¹Cé“ôCxnˆÞñ¤«”¼Âdçm&Τ· FƒBÔÛ<:»`Ô*D»Î«v FBt©yŒJRˆXÌ4˦·ÚôÄâ¦Yv“X\êl—šfa¤"Žf!•ÚåJ҈¤Bª,„Tz›ÕàšYv»Îbµ:N'Ƅ5Úh–Ùìvggs=¨0šL×Ëóë+PˆƒV«Ñ(•
+AU«Ínw¹Z4³²,UúͶ§t›ÛívbOdSov©6»X„¢ $˜\åk~„±wWe¥X)ž:)žüºõäð™3¬ÊXeCù¾P<óßZ7󅱍âK› í,3üǶÕf–›ý¥~s1e©Ø„ä§A³ŸšýfÿªÖ½GêÒ›¯œ~%¾¢czۓ‡êÓ©Ó­W\™zªí<}bjo6þõ4<» ÿ:UÎRSê‰i™qàÙ ù&¦_æ5)2¢…ªq)¡ä áQíâ¡GóŸHh‰‡Bò%´w*)‘ñÄʯÑqe®zµ©^Ä-8Ê¡¢zð¼Z$gE}^gœbMd̸ïËÆ4b±P*$…Iò±¤«QŒñ~o£wÔ̘cò˜
+”²UP*¹qUÀè‚
+7º,
+ Ë`rcŸÀªs¹‘G ÷..(ܼó¥P+nÅ8ˆýç4 “¸2[@°dÙ¬6kqÛ ‹„q‘õÒ~…<à\7ßy6§…~tvææ»_ÛxscÓ¶úâF«1ÇâMŠFùènŸúäêI[·NH
+SWZ¦®’šW5ïiNi8-ÓT
+éT15%©µZÕÕ´[7C’!ÐC—‹u j?EUS™.Â+)æ‹Õή2[IAÁXYÕD¯vI„~´ ¸ö©Éd2£
+÷,Øñ.úúú]—û“7¦V„¦,ü îy—áô5yµ_¦v¾üîÓ=ý æPs˜%Ï¡\ÊÉåò”y
+ë
+<žIãr/#–œ„+ä±jù±ù“BÎì@"7×Õ>nlYÃõò5\V]íÜÜ©¨à¡Ú`Qc¸Àªp­.½µ&âÉϛ4*V>~m,:Úm)Ll..Š$¦YÅÂlÇh“6KçpœÜU· ÉïÊÜÎ]Éý
+•TRE©Jª*mSáݪ§UDu‹6#] þسJ„.ö4Q\’ÌeX—Øuiú$rOÑ4p|ø7¼àñb̪#4‹˜6x¾ÐÀ^)ËG´vÒ^z‚
+ô~Š¼Á%ñŠþã²>Ã
+îȈ—Á\B0Id\Ê҄¿àïø~ÿ$óæ&§Oуüb$¢tx CéKba€ç-,ÓéœIlL*'
+È™@ÉÁ>-Ö&ñh/è. ;
+z H´ïoSl‚gO’O$µT‚{KŽ–ˆ¢ñ¸ƒ’ùy31;Š™Â9už@2u†˜ap.P=±¡•UC­C,0–uPYaÜV8!àúsü!?'ð!}8¬åç
+æbJ~Md.V«
+…Ä\ìÕ¹™¶+G<ý¼à'ËØJÔNm™¬s€NV™Xþ#ފ¬}JeÝ™2Ê*WôßüðìšÃ»;ïL}±u^Üïp¯³…òÞtzc;/÷5îžxCûý‹¹É[ï^Ú8ç®]£\ßwÃãµw¾’¯4»–76ŒqG«=êÝܸhÓ£L‡û@ZuÕH‡þ(E­:l@u:É@%ÎÓb‹.¦*^ÀœV£CœVÇ ZHU¶dR(³
+¥’r
+‚¤À
+‡þ"ꪔ)T ÅOE¶BTUÏÄwâðÊJc¹Qì8°W¬(GÁh%x#]+±%h ‚O‚‹!ÃôЁ=Ã/’5×ìIåà3w¤~†vÓÏÞFncúk.ðû:~
+è™ñW5KšeÜ
+Ó|O'ßéæ[[ÀÉRøœìO ùX#ÌË<iL×]žZ܂U÷ß2ûæ+V­[¿¢0èŒÄ¦®éßµíêg1ÇOyò@dזä²ݑÑӋ²c¢¿¤ÓõïT(ˆqg3Т¸ÓŽ¢è¬”·FµV}­þFÕû¡ÏB‚@ñFºž[o½ÅÆU*£OƒŽ¨C ¾6peAwð…q8lçìöA;â™s2hÐa@®Äh$™4N”'å)¯=¯7ïD—çÈຐY4ûÌ ³dÞaî5+ÌŽÜ .ÊYp8OŽø(²ª…XmZ hÄpùŒFp DF!èüìÊäÎödÁ҅Cª hÑ5ùõPÊQ‡çâl“o.
+ß.~Ó4¡¾xÒì­[6†gó‹CºÆŸÿzë¼}OÞöäUƒØ}OL5×nžÞþçšø#÷îýÞR0%}’î)Р!.}bÐìÇË[sPp(1OóT5HÒµëzu¯ã×È{ø=rB(ÅŒt’Žžò§’“’,J Gu¼4¡”ÿ  þ‚Í“ø¾½¬qhùÃä¢äo’q"'qM\/ÇsϒO‘vï,J>)«ë3̂ÆÄ¡XÆ?ݬßøÒóªV󫅛ù›n„qÁB®<‚ÎVTÀSD~Kþ˜ªìÄw§¶u%f»ù)áïŸã^v¶kØêõà·à7
+£b¼^:Ü!{±·8/²¢x} [Ó­ívv»n u‡{ŠŸ°ïq>Ô>ã<>yYý²æ:«©± #NUĪ³9Cº¾߆oÒÝ¢éÇ¢
+܀ð¤h¾2rUñR´/!‹ÂK#‹‹¯Ç"kó7oç¶ó݊nåÆMÛ³¶[ïåv*ï2î4Ýo}4üTä©â$w@ù™æsígúÏ"Ÿå*tªH*ÇcŠøZ%Ò:#œ D›ì‹ |ËÌ:wµ
+ôº
+cFG•gè•çÊQµa1”†½:ÿ\ä6°°I %ŸÆ±“@@ºX%1BÉ6ÁÆV§Fg4ÿèg†€vŒ@
+’‚é’–^ ±<‹C`7~QF{œ‘}¾(œ6_ZûGönòãÕ5,§}™»°zØ\“)Õ0ËtGj/ÄÖý0Ÿ š'¹ü¡Œ‹Ê^1¼ ZËlUÚv-›WV’^.y=’â|ƒÊ Á}™K¬0ø½þn?õ¿êrä°P_^¼†ð@Ž¼‡a–qñ¤L'™T¸ë’ Óÿem;G&ÿ£ÿ\ä ýRfîÒ÷ßÿÏåŒ"èw%wønÿ:8šb² dD©j8¤T`I¥+Á<ŠÇcò¬\864"i>K DàI¦®B8 Qaá0<њê# |jDQä}ÐñïƒËÉáZ©Pâq¿‚ßÄwóO0æ/ñd›øvž´C3‘øNž€éæ ˆé šþ)Y‘A8&6a»@V›"\¥¦Î´‚s8t¶•ýä½oír:†‡vÈÄ¡!ðwì²x¾ÐÂ\DÜjÆ ®äì\ºë‡7ɋø÷³Sפ–ÎÁïÊ»VøCî*ù=MÚÐ/(àAð\G¸ç趑I#셔t·4¶±nDšô¢cè①ð<!"ÆÇ0N` ÷bŠ°ˆ}˜â«T
+z³š}v$*ÛÍßdÆæ$>°_]ïÂ&é4É”r5µ¢p¾¢ÿ¸Üؽ9,^mý4?‘ÄW K¾üD>É?Bt(æxô ÿ9™ÙOå¥Ô®®ó{²_W‚×Þ:²þm+GòÊ·íÜR'(q§-[©u…4v©œ
+Ãëâ«î×=Þ¿0œOy¾3|+~çþΓ¯24¸ˆ|_@r{<Ù*½Ú¥²fÛ\V%Q¸”c–ËrÇ úDOvvÀ(f;˜}§O’×$#ñdâñº÷€PɈKâý’V)¨ÅjU*UÊì$þ^Rà²G/“$1ØèÁž$ùRÒû$}“þ´žêó-ë‘%Ñáëdw²€rèžõ¶MS¹YŸ‰#7·êA 7ó_ŠÙ‘8„Å£ÿn7¾T©¨„?9°¼ðªÕJˆ(ý
+Ù©³øKÙ^ .ƙuHÙØi}bø_WÆÎM͜é(‡ÿÄNþìŠòè5Ÿ~‰_y·1â+B!ƒ=ñSîªîÝr
+q…þü6¬#9Ã1ÿ>€÷)D5CcÈF)1ÍñlE[<[‹ïs>ÙçÜùÌùyäoqí´>²®øgE÷ïÉy²ø=ç{‘÷¢j®"Iþ6hXTVÁ¸";PÂré¯[I±äÏàð”IÁ(—»¤6§6´Õù>~7çƒâOB
+.‡tE"µ.g–ÇšcZ…Eu9“KfãfǜÈNb‘X1ÏÉi¯è¬è®è­P:΢&šÆ™ã‰:âœ@¨Çæi,ޒó³œ÷‹¾
+š´:^ŒÚ=Xát9\DÂ9इ£öp1Ž+Fã '\LKð¨bqåã_XŒBî@1òÑÒbˆSÅÊXåÅ[ûòšníÂ+W®D+»Î;ˆ-ÝfÂ!è/•·íÙZ{0Xê/ÊìW†¬ÌwÎhk…q$ėxéÀíõÝÇ?î.ž²¹#S‹ÉäGæíܵaøúP[ù?½üÅÃó›Vwín֋ÛÇ5»È3žš«nYphf¨,¸’.ÿ±??dÏ9xí‡
+EՍS¯}ÜúÃ
+×Ã×5Þ9ƒãÙú×äôŸyèêL¤•'ŽÙ^cÜ»ÓpŸçaÃ憃&Ò³Çéõ–묷Óëƒt§s=BUZªçˆ{"m¡|\)s\äóû‰ ãÃ(Iø~ÆG³)N’ãû±>‹IZ½»n·Žè’4.ųTd‰ûž6b¯±ÊHŒN PUé³cƒÝk'v™=ì“BóçÉ~s¬u¥¼gôõÊ.N»˜Íì:ÓzæÓª¡/πÊañêk2y}— U„œaMØ\ª¤µP:ø¬¶é
+:O¹L„³²«›ƒ2҉%Ë$ï Ù.èc¨)‡™MF¹ÑÜï¼ÞqŸ>´ùƒk‡î½ùõuޅ©ÓGROê9€«~ùÓíy&W–SÃ/K¿u`kêíãÉÔW;ºÏÚÿø÷‡Ï¾g™h5»ÌJÁJ²•G+ÄvTjѸ4î[Å»ÅwD~­¸6k³x¯ù>Ëk®×Üo‹J»Ñ”åöP…ovnñ¨Rðº? ðºtþ ÍïðFõzqD­V¤Ì®l4áL@™0I&ޔL|€áÐ4)Èdq\U©ľ î ²LôÛdi´ÉÒh“ÑÍ^0ъ ‚Ü(8Y£°+Ð1B&‹Ã2„Øseìk™(D®üœˆe;=‹Ê
+;p­›ñ:8ƒÜ3€ñb\&UI¥‹²¯Í¾?ñ„}_âHâD©r–£SèTlRnRu ݊íÊí*UŽ×åöB^WÌTJ !J¿^ïU¹”
+†J?kQø ñ
+(ГÏÈ
+4I¾•4êʦ06„½aŽÐiId— ‹¬?<©t~Ï­@!‚œÅc2©dª”—£•Äs–jDK–øb
+¦z"¾hÚ\´ íýúß)5ˆ½`Èk½*.…p\U¥jT݆^)y}UbPiš.%ÅRÔT÷(~˜ì‘꾚ߠÐ1ü6y—~¾À§ñ¿Õ§µ_éìÖbkIIQ¢d¾Ý¥ÛYtw‰jdEØ7<•žºZ ²$ˆ>hÄnu¸ì‚]™vEÆFSÃ/ˀEÈ]2!âÕ.©\Ð)\³²þ@ÜëŠú•Õ—¹*yŽsñÙêz½®ˆ?8¶¤Â5#Ðë² ©Fˆ-LÍH”d%%ëJªùºª.á*t˜°æ¤Pè;õÏë‰>¬à
+«Õ±Ï^9vl4¹¬¢"77¼/b·Ù^YùSNŸHĹnwò˜O’1’VÒ5éH·÷é°.I¾“òãÙ£2ȶÀ [CŒ=ãÆc/Ë´gWmݳ¸R^Zpœ[Z8çZSµ’½®%/̟<÷UÁ%hœ«†Zã€+¶ÅÆ^¯Ðg>ÑÐg¾ÑY }a5l¤ÂV­!ÜA]+Ç7KªxqAu¼¦`<×ÚÒcï]¨ËìV]•Ú—U^”LŸ8 –K¢¾œ}4 /GÐ2 ׎ˆ¬v´²ó´döSñÈJZæÅ üÿ©Òe£Ñhy遵é {•l>>sý/f__Ql.MåË"S8üÜEª©¦0žïµg­Á¹ã\yE^üUþÄÅS¬ûÉé”áúpö#v{¸¿•j¸Ä Ø3š]šŸê0/Çâ•Q-Þ¥µª>ëH].øóAê|¨Or‰HÄ>äÃR`6YD®%=¾û|Oøù´8ÄwHÅúùe3ÉUºžúÖÑ.ãeµ×%úƒ>/ÛcEË6Š$;H¨Än9I’—¤¸õ¿¼*•ZfµÜª–YE½ËßÑzÁùÎh«3gä—ú@VN¶2e“?[¿ËFÿciÇ1±rŒTÆíô¯þáÓâY!‹Â.\>Û'j‹nš÷Àãk©¡1¾Õt _C8OZwvßt¯%«pMF _Vø5é”ÁŽõHiÓ;tQC®!K(L—áËâ-öx±ýêø:û=øgñ7ìØOá/ì:«mB¢>AËìe‰ vjMDìáì|Âf£1” µ±¨ÂVn/u”&ªŠ‹£õh­}cu¢mµß’¸ݓx=šè-ê+zÓöšýhÑG¶÷íNJ†lŸÛ?wœ(ú}oû&šˆ'Ùêãsp‹mV|©í:Ç+ö—ïÚßM|bÿ$¡Ï¬Bú¼.§?P(kð“”þ`f]Ò/k榳Í(»a‡ÝÎÔǸD<+a·%âö8ŽÃÜmN‡ÃFTJ%B‰D$ªL\ ¾#^ðùü½þ>?³Å'ü‚—T„‹0a—ЉŸÁÈVGÉFhÉ<§©,f°:ñtD¸3Ûp9ÿ”¼ÝÄ
+ö þXø.`ùE)W\ÌÒVá Ëívc¹]4•#¥½Ü–LÛo+·%²Ê3¯nÊ©ƒóËry©T2ã‹<‚‹º1­>ã
+5%RÑĬk–¾a:îÆ_⓸;>;ǚjŠMÌZ‡ÿÍ­9»v£7/*ñ­¤kçDݑÐrrõlÏùŽž¶K’þ"²)(‚_zLØ´c"5–n'Øä&8B
+f1ºM&#&$`
+˜ õK£î1=®xBý„È]‹×)6ã-
+n¼REÔTöJöŸ¢"eŸ"H”§“ÜŒ¾ÎªRŸ[r·±’ý7!’yebRöÈb/[Vœ*vžά/žûB »Ø—ΰ9¬×  Û p–JVJ¢ZW€€Ii)@6ÎR€.FVì`°,Fù-Pg”?0ÅH˜ a%¾)µ>õEêTꦏžÿæÀ5[ï¸zðùï¶^AïŠÔÛ©7R‹ñ¸³ÒæÇSϦž܂óp5¾jﶶËvžbr̒¯;„
+`¯Ká‚¢µøƒÈíËÏsG«‚A *,yQ«ÕB”
+¥…x-¾ï@;•¿6|‚TœAB5˜ÎRÒ{¸$9&ŕ֨H‘gŸRÉüöz‡¦)•: TzÍq3¹ð¦*ož='AQ)J¢ÎJQçӃΫ#ºI‘ÿ&A'Ù^X+ÈQeû†KF»¤
+ûBÙaV­%‚=” ‰àµ
+°[åá1¡êÏòÀS¹´©”½µMäwÞϽöžÇ¾³y­ÿ{À¸©;qXOÒèÍH£¹¤95žÑžÓžÛ㘌Lç$r9Áąpµ´±] Hã–#„v‰ ´åØ­i·ÜÝƄ”bÚ@é¶)Ùݖ¥ý–B÷ËRXp›¶)_[bû{ïi&1ýï~_HïéôFÒüîë!)4™H¤–×<8‹jVÂM’ºãʙ¯Þ5÷òܯ¯_Óp€" ¸âÞM‡w|ñîOúΧ÷¬ª=/M>*ê¶+ž¹¢»÷c ø"({æ>9wüÏswÒÿýùœ›œ;r`ïÞo€ž?<:¶³é]¹b`š¨¤y ¡"°50ðîiÊíɗâ/婕‰Çò¤õ®LP<à¤ÑGl;ȉ›ÁÍ䧣ŸÖoh¹Ñ¸ ìÑïÏ?ž2Ž$¿“ŸOxý6ðÅÄm©€o’&öç_È¿^úm~>ïPJbY[w¡»te⚢Ðʑ¡ðFƒR¬…0ÒAêáN¨#ëQÜ$sF"ÑBI‚Ä·Hd[3`ƒÝ.+³ýìKãðp"ø­Pe
+|ɔÚÓápˆ”œN¨Fr
+£ÑbiIZ@žijD@©Ԇ
+҉.r“©)_Î H¤"$:MdlÙu`É»º§ÀróDGWG€
+ÒÛÔmÚ¶À¶ cs؜Dët7}ý:ÇuΤáÈpt¸8\ÚËÝaßãØã¼Mړ}œ~¼,+Ž²£â¨†ËáJ¸Š\»yZèÑL&_^ “uº¤•"¥h)v^å¼ê
+NJÖõöŽMòÆÌÆl8
+Dý x«ÜŸõ^8óã_¾]җ¡ŸÊú„^³ïêÛÿu-ä8È\½$:2û‹ÿêë~~à¤²ëè&FgŸ^÷ãÑU×z4vë9
+Ôʾ°‹T
+%-oÛAˆÈŽ)ê?8£¤uBAù¾êòì‰Ó ˆ‚'EEŽg¯=áXšP­°ÈrÕ
+‹ÌqkÞªÇ+P>ŒžŠQÏúªÏ&cfmOhß
+y 4`cÀUŸ¥GG%(f$Ëðúÿ×%Ÿé÷òѾwJ^ÓÛïôžòÚtïwØ;楽Sä{‡õØWb(šAíôàÉABmXpâ°Uqç ´òÎýa‰j6£ˆäó‚ªÔ$S©ÑȊ ×8Î]ƒbãë‡Ý5!íF£¯?-՚ZïÊáó¢ Žêg$SQB€F_ÕöíF53—2æ蔬­\L¶^ÚUÀ,v/³‰¶5†#Övҟ¥¿´ÅÛ ƒ/$Ú?~æ¿(×uùpÕ‰¢DÁù_±» Ö¨ˆ{‡yЕIz\úƒL‘!¾¤í
+›Ǻͥõm×0ÛÙkíW®~¢|}s{ƒp£ýfñæÀÁ]¡õ닷Ó_äî
+ÝY¼³´·íöû½î{Õ÷ïK¹x_éqîIþIû“ÇƒO„ž ?V|†}†;"L–~Pú3÷gû™ðŸõUW¯(]ݶ—§»‚×FvD?•§¯`¯à®æ©ÕüšèŠôê"=ÜT¼°Dõ³ýÜ;E³„Ŭ¯ØÊDÛؚ½éΠʢî`‰Ñv—õfƒ
+¥ jòIUž=•”ììÛgõ’u´P!Ƽsn×\üߑqផ=üÇÊ=8 ¡ñé?2U@œCêI§}ŽzíôÜEUÅ^'®šÁàmi c#-ö€QҝJ%­ x¯²»ªçG<Ù¹;Òs?š;ž˜ûd^ô,[>P«]9`ÿUZ‡Zœ[ÓÜRNtUò€d.ìKž18Y‰ßöásÔågþ¾ò³þ¤a¥–øggYrÏèÖö¤Û¡p ʔwÏFÉ÷n)ùӜcµõéý«ëT®ÁQ\4«!Ndº;ÓBn9éŠ:©u‘IR㎨Ã?²ØŒ|æ,‚Ë;]À¡ñÉnp#ñ™˜M‰¢t §T+ʞšÜkfÍ^ªƾh¼rq£ë¦–áìMù[ˆ?
+•Ÿˆ=ÑòDüÑüÅçâÏÏ%Ÿí:\E~)ø’þJmº÷gÊÏô?ÛOõ†”¢¬+-z"›.‹çÉ%¥¤/Šu¤JÙ>ªé½zo©÷D/ýr\—¿¥x{vo‘^’b×â¾ÅõÞՁ%)Fñ@¢pEì‘Ø#º-t ×̸’ÒEÄ
+tÐ@¯"`zÁdW²áQ}é¥Fƒ^B“­.èEéE¹Å%·(uä•:#³A& ÃYRù4DÂzw°ftЦ)jPK¶ Y‹Á®|‹,·€¼€<¤œ
+”ú›Ðgá•°C©YƒPŠ>ß J6‡`dÉæÃEi).¦ ®ƒ$ìkbÛ³;ŠC½ØW
+ îƒ±Lº2uMي¼¦qف¬äï˜n±WíµÜâ+|µdɇƧûj-iâŒoðÕPíáÃvì¬!‘÷À®ÔòœRkѕZ2ÏKµ”Õ Ó<lt«ÉZÍ⏲׳–i?wͬ†N+‰/EfAÚCG' 8±Ûme •€Z
+â;¯ß2ûlwÈäÙÒÛs'óJǚ¹hÙX<¼˜süäý—“Ÿî_T:ñ»V·(V€_Õ[.";wÁÁmG;o¸ý~W¸dî¾î”Wo¥ Ã&6o÷=—Ã#ª2úæ~Ú:Ò^¯ìu8$ù/¸†Àµù‡\€<¨˜(÷ ¢åeî@¥K꒗ÚVIwÐ{Gx”ãÂàb¸@ØN_ƹ¯£GÙa÷ô­ì˜û â áÇ ÄxA˜rx$ÙÆ°6Šb\6…A´ð‚r&^æ@ÀQ\ºÅ4˜`»\Š¶dQn‚UJm‚¡™@Ñ]w¯sSnW».ùnNSÜ;cŸÄvèµPނâþۃ¸ôÍZá:Û#¿Ý(e•Ž°\>ÖÈ-‹D«ƒ„,"÷:². SózÚòßÁ_3†‚©XÄZ,…íÁ3·“¹±½Õ˜ùá$uåÜ×~¬ìM†lk>d†Ÿbæ0è׊7‹ 0ÿÛ¹å´2÷ Z£â(A¢BM„D6\E÷­€šæ{¬b$ðNbÕ­|øŸ[¾Y3WÎÏP{©ýD;qµ²‘Q¥×qTÝDʑ7È ÎnG6N4jbقi…ÜPö¡Sàñ/±²VFZ˜)Le|n¹Æâ–Íc‡€ÎÃK
+GÔ/Î"Ú÷ÓìqP„E¦§ßÈfÉ?=ŽB£‚æ{è®2©\Ü=Z«?Î(%«ì"v•ï ¾`ÿB• +¾n¹>V§ùÐÛf™¾¬eM·Yßæ'«-+Ája¥}euuç’î•çm²_e¿¿M¸Í.­÷Ýê#£õmurˆ+•žB&_yŠ?"!B¢À×Ä´½&bkzwU†²‰Œ!‘ÒqsƒH‹=*rÏeìµuê6u‡JÕÝ*©~6
+a>q©Çì!ác£Â4ù*|oSÔrÓEÛ Óy2ˆ²C+øâÏÀ_€ÙP~՝' ôÎaD1cÜ Mã”AŽÀÑIÆsä‚%¼PLŠÖ¼Sà*3,ÖÚXÓYÓÙ~vŒ¥dœbJ3_²xɧ,ãÕÈèheíg¡‚‹|0=³ÙfÜʃºPÝ6yf¤>ƒâ\²®:'›-ZŒí%H´f%÷°«¯º(·¹;»:ºH†çŽdb-z ÉTí5p…Ý!BqKQG´ÄÙj!¢‹«è Z±+!9œ-p×Íô„l?F­†ÆÜڊÒeÀ(*óÈ(¨]Át3K`$lƒOZ@¤ZÆÍag­Sw"*üÎ5o™vH½u{Í·‚ö€j>öZgµlØò°åÏzL›ð9f%Dˆ-“/ãõ/̓ôû¼8ÆE½{-2"˸
+a°ŒpÙæ »½U™^¢‹ÌÐî <Ñùt¾(ª~‚&y7’×\“‡§y¼DÐàí±’ÅvÎúYËЉñôì´ü2DZ(¶5¤Ÿ$œ‚‚SÀëÐ5èڈ͖4”«ÃlPI½èvþtÃÎoŽ !QL.L âO£ÞñÆ÷·Ò[ƒæN9 ¾Éf±ÿ¥mÉ%ŽÁ=y=u}µ‡~”zŠcûXÐÍyRŽ^wijTõ‹ôr œ½“¶¨mÜJ(ßo£lï‰>‚P¢(;úÎq=w“Šp wY v§'¬bÿ‘žªcÈøÞêFžŠá´b½fG- ðhÝå¯á
+j5ҚNÙÙ¤NEtÔ¡©v1ÄÁ£(Ӂf†ˆ0Ôåv¦Ï}<ŽÕ…:ù¹*/¶,WdÊ(»\¾sn,ºýÁ¿û×o|á©þG6Jºjuw¾üÉÚÖø‡íÕjšüàèïþåô—Ǻ»©C¿" LJgÓ³ÿÑ^~å…ÉçƒÈ×CZ¹G üñGƒ&ÿ IòÁ<€ñÏņc$2öàÀìXRüƒn¹vþù0â(á6
+’xH¾³ƒõc3PŽ£ ܧœcôéÖ|…ˆ£_ÏïØd#CîõôŶ‹™õìæàæ{•íÛ1;öú[ÄÙøNÐ6ªBÛâCêPèu4t—r·{Ü5®>
+5f—Rƒiý8*‚uâ>‘‹2Ž)"†‰qb’@Yí< ‰'?¸5@öÀD¦€h*§@02cÉ+6fI˒£ä—,÷Ê[™<9‚Á*›­Ï̌`Ò}Ri ˜pqøòð§ÃÔ½a€êÄAÜèêê]¸
+ðÇú%”RTd9uØ]³Ér3,P_Ùg $Y­åöfi•F¡CLÈ m£V¯ßú÷ïppÏ·Ûr‹".{<¾xûy~}ïetVÀ%‡¾˜7_Î}k“Ť÷†hdÕe_ÿæ‡K
+§|½¡Hxi^f§s^üÖ¢9ËE){”°ÇD ŠwÈ7æÛ¾qé{/ÓÏ ƒ[ºPA푾*³¤°dwö¾vfvª@("r>2$2¦„|ŽL’YšKI.£YîÒ¬¡ƒV[N'Ζ, »„£ÀäèEæJ£×­@F\=G-vì·Å«.äÞjÀ0ùƒ%c«¾ò֟¾¿s¤¬¸òRÌÌÛçN˜žË‹›—m¼vëUËÏûð¥—@ßÚ'þÊßøz_Èù!x}épmÝÕ¯üó¿CˆFÕ°.¦& ¦v5 :Íù ¿QŠ2áÄM#kË[2 €Â5H‚ÑòÁóӘV¢ŽéBÑma.eû‘È­]Íbê
+Ïc¡6ú¾vþùºÍnDŽIÐ8g921XCv\<>}Ž‡½¨ôÈ$A5#^ñMXßhe)&ˬÎN²Á±¨ÌÍÞCƒ>@Sè«Xøh“œ=žh>'꧅`ž6Nr:£‘²ðìñˆ‹̶[Շ Øc#®²MԆˆ!Ïk”MÓCPL Õ|f¨Å)áKVU¸(bQ bé
+¾¸µP 2¿Ù}©o›‹º5ÀŠgXžmޕÌ^ò‹Ìñ.ùöð?’O©‡Ü?%.ýB>Mþr+Cì7 Ÿn/ÿ"ûŠtŠ…œŽuÜFR<Ââɪ~9Ùǯ‹®'×󗑣ä^÷^í÷7ùo
+e·ÏŸ€ ÙãXxs…RCïø’ @¿ûcΗÖ$ØáÛíÛç£|§=ž1”‚2Α%n÷&GɜÉÁ'á&¹·8†{Ò饉½®¨œ©”œ¨VE8e§î¤N9Ý ߥsIdICr*ÀÚÙ$¶Œ Pö(çãbH£¤²£.øAY{‡ÊÚ¨Ú ®¥3Š )]](~|Éæƒ Hrd+ت1Šã.XømöxM4ó5ÜВÒÈé€D#­£ õYãH°ŽëˆÇG¦“¯ye­¦é®šCÇ! û)}``ÀÍøyØS3bIˏý °}ûž-·ç£Þ¾ÿ‘÷~wøÁ—g÷€Çm²vyÇÅ·’‹~|Ýu—ßèÙû+~þ`ôd÷æD—ù9(­#ê&Û‰,É5°ÛÈc~•7ÛÉc½:˜²“œ38§8Qv‹‚Ô©`Ô·Bá˜g­3SàFÄORFšÁ
+´ƒ_ü¸54AÀû@’ZJ-Wh·S·‹¶iPÌ%'¸ þkò×\“y^f ÚÖº-K†8çÁwO 8a§(ΌÆ#‘"dĕ0ü Û•ßRkFq1+ÈÀ§ÀEÏìƒ
+“D+S`.ú‚N×;×mÝÑy}rx+ªx«ÿ6u_õ®Å·.Û·úŽu_öY}`Ý}ÔvÐPýa凫§·žØúÖÖS[ƒÝ[–«žŽèVÛcܪŽzðQ±UAB[rnMuÞíöðܘهȇ ôsxÄ:jM»b¯Oû ʘ_;´9;Cîá_št®2Û{!FÅ×à^ƒçšêø*°
+Ö¥‡ÓÓéi:íDg¦›Qê°óSA#}½¾µ´ÕÜú0|維èҐ]¬luîûÊr°[q–·é> ù†}¯Bb?5ÿ{Ӆ£LD$øð=ú¦ÈçM÷uPo+QýÙO(MRèUjá
+e×ë`©º<6¤6…ÀÆMáî <=¸ˆXÓ¶J«WU;Lr ªZº˜î  Š†ˆ‹3êÄ2ÿ’Ua²=ÕØ}tÅ«V\z!?N–Á¬Í
+2„Ѫ¬ [Ó©§•F U36
+™>á€ÄéP›ë ÷5xc¸ËDˆ+ .3BAM cJ©ÈʃpBEö8¬á©N¤jqË(HÆ*ÕTÄhQ$7Ä𱼊æÈ£<S4
+;`“U¾‰c°ó¾)a¦Œç˨…õ
+Õ*p3à–†[Š¨  ‚*¶cU;ˆ”+œ£‘«XDº ÎéFF~KÄB«|ìåvùXÖ9Äc tÃÍ¡dïá7¦*pR4¥+%`ö+`–+`¶,4,]x¨aûR»:A Çðp ÇàӜÂÔv~};gŽ Ïòù®Î×ÆL»Ñ?Ž„.ø–u —…DVòb—ÙZº† Ü,Rr¬k¼‹žìšî:ÑEeÐß5Ô5Œ†Ì. sj&⚢$ÓՒÏDR«Z„LD^e"É)ÊiâÕT¡·©.zªƒÀO Å*—K45Á `R’0,L¯
+dћ®wVِü™ÙþìxöqçãᇳŒƲ” GNd©—N齩Hz©†‰Ùàð­ZPψ¬o
+8M‡L" ¿YšÀÅ<¯2{Z­ŸÙì«R…¬ß€¿¯µØô‡žîÑè¸$ uAN键cëàÔü¡ÆˆlƒZ³ÿC¿9N†jx²8ø­r¶ö4üõeœS¯[x6ÉÄð63:€Êg5Ö6P²¥Z¬Z¡ˆS
+!)gI9 ©¿@6˜¿˜.,_ù¯à&íéÉBð{å᭛Ûb ëc1µà;=ûðǭٞ9ý̕ï<?ow°›ŒM_"¿øÕl C \A‹îuR/4à'Àì_Ã{+L×eåŽY!»¢A€í¡lð†Ô1³–Ð‘*DAC<À58b 
+˜ÿ|¸
+M9¡Ð”
+ˆ’¢
+¨DN-ÈÀ¥“‚?`¤ñ!‘ý9(-$‰*„=¥K DREËOFýça^t`ð¦þóiÁK‚dBÄlvzzúœC¬Á§_†T…‹µ•ˆ&•jÑ©02€ÿïå¿,ŒÛÇҤ])F'jÏBM«¶ÉÛ\Û¢×Ê;\;¢‘ü{‘™(9ÆÎù2õ²ô.ù®4ãú­ÂÕ]uµíÒëµåÒ¨p½ÄÉVY7ôd±ÖºdÖ+oÉëu:.o›¤·å?ʶ•®ÑïñßþoÁæç}r4.#ϗ»Kr;bXŠ8£ÌÅÔúbۀ¼ÞµÞÍhR8‰^L6#›Š*†i SBª
+´øF†)Epäž ålæ“;­•8jjƒXiQVÑTôÙ1–Åu"FGËg´`HŒV~± ÑÆõ•hj^p ›ðÒr:`¯ÙQãªIVÃ[
+|Žÿ>b¹T7w"3î´ì ¸ó{üigçæ5ˆÇ£Á5M ‚?áO׬ØÜ@×Ù½ ïoðüÌÇëuD”!ôN:V¯ßü±|þb܊p+Í¿s( j*TÞ­¿ ª°'~ë£Æ ˆ m;ëãP©Ö3uŠ<s°¥3iƒÓÞ²&é[ÕâÊDüP¯>Ïf"¥)Êq0ޛ‰,‡sq|CjmïúȆ¥\¦s­Yˤ9‚5ú6nB?Œ‘;ËÐ6¶oy[Iõ Pú”]‰XIÃú$Zú TM©3SÈ&ºJ`¸s²“ìDc¾µ›zkÖD×ö¯%Ç֎¯%‰µòZr-
+Iz»—ϵ­©Ùm±ÜºŽêÅy­mõÜ¢z{˹) x²äûÛ¥dëöm7®^½¡û–¹6ê>¨àû師Ü5\0«+ìÙ¹ÕXë‡\é"8Öf†ssÞ-ÁD"¸h¸ô«¹¦<,õÿ@JV&ÏR²*¦d%,·YÅ8ÉG$¡€ŽâáD†Ã$©QsÓ·Ík<Dák’'_3„Ó‡,ÐItºã‹Ãx¢0ž"œÁÖµ œ3M9c‰h¸óA#GÒ6]‘!Bd¢„ ߆5³¶v*Ϗ
+sÜ«Í!Ã[0S'Z£™þ̪';–ÏLf("#gH\&‡‡ŸªXÆ·ìßn|STbhC£ü!`cT[ ‰ÆVs”ψ–än„©ý–7T®|Áà9!  VýžÕ×ê>§½íü¹En³,нk?sƒÝ‰ѳ¼MŠ6ñpæ{«7öÜ2·sSTÃ67iøÌ®‘Ïυ}aˆi}ÛÁúGV°åí“ÔQˆg&Ŧ… h7bqÎÒéd -h„;èCÔ1ÝhÆ§Ñ~ƒ³ËaqF+„Ͳ:œ ®àÑç輺8ˆ`*@{0ÄyDKp2ßh, .MGDÑ
+»Ló‚Ç|‡}/òÇÂ?çå×XÁ/ómòÞ¾Èï•~d£f{•ÆÁQð²÷‡Ҍ‚•\ón\T? åÿuipíûé!z˜§'i†~-T7Å ¨âœ @qÁÈ0›]=™¾xõdÿ…[ž#+ŸŽÒ+/Ú²ùy MÐp‹ÎO#¸dówˆÕNЄ‡jW~7¸àr‡sÕx:@X1œIÒ%ƒIº$N„A@>öTöÜYA
+2™5
+vë8Ü^G¾¦¼†é®~6
+W§ÒY…v2g­%PL;?
+†³c€a±}Œ'0&„NHa¡ä6ƒ îGÂr§å—!a-~$ºí(Ñ>æÄvÁ$Q„EÝðî0ܺ1tëÀ֫ߘA,¬éð¬4ãL@s›±£»A7€cte‹2‚³Ñ?'á?Y՟!h­É+å­ò^}G,ÊÕ­ÎmÍ}Üõñܧ¹®¹Û¸GØw¹?óŽÒ¢ÍåÊµÚ\Š•Î(n(Viw´¸¡p•Š©ØºT„XJ*Ù4Eä€î„dÑ=iª³½-*Œ ä0&ì(á=Ä&¼ ®÷£°Õ±@ážVˆ§-6ԍz±2ƒ“@¬X^D‘ÖÖK9Ñ
+fÔÁQ1ÑhkfJ>†£bÏrú ¹
+ÙR;Ù.™¤)}žfÍV°­D,b©þŽx*¥÷&#©¥„`ouytÐ*Z^º&‹@ (‚…rû6˜ `
+ÑVÐJ¸ÑhTcú¸Nº åøiý„nӇ2žÍÓ°$ñѓ#£¢X£3ƒ®F¶.±À10
+¹0$oގfônS6öŸuw}Ä,³æÓ;;WTñM^ś/¹ç/žË.oÑ›#ˆ¦à¥öÿä'Kr©ŽežÌ¥s+פ ‹Mø°Ô{ùÃç…›…ð²}þ$ù3/mt¥/©2†—²‰x( °G `‚.%¢ñTLBžô™„È];®ÆÚÆr))F+YØi×ڀÍ(ZYí3pyD =†Ã2 Ø‰ú±ÁAÈ©Š°…Í
+ E ¹óñŸ—jÑ»³ÐÑ“RÝê‹(ÙÚÆZÓhÊjø„ífi3ZÙ¥°=r]„ŒŠ ;ü½@Ð"IåöçIJfJAM*UnoеcV{ E7¢M>vl°.ù1|… ŸÓr¤¢L{-—¶×Tπ¸%ù|_Â&°BZÈ •‡ËceF*OÝÜIä?rK3þ=þZâç¹·é·ão'ÞÍٕzn0÷©ü®Ü>°ÜGyÑÊ£c¡½ù}ª $P¼È„„Ü+-?Œs!ÊçQB¾°– æàÒïß›°+YG:·*·®¼­|cæÆÜÎÇãûËïPo‡Ä ×!ž'#
+Šxq¨ìâù˜®V5¢=Œ¢ tøæЇÚó>ôa‹¢$â;-¥pc‹€…bkA —ø¬¦©(ÌÞã+¢KþX@A#¿Eñ@”Ç´£už‡¥q‰’¦@‡©¥Z!Ê.7‘C©áÔXŠÒS¥™zèD;П^ÝDT‹°³(Vq>jEÈýÌØE+'Oãå.q¡Þ…y ì @i:á°{{³LπU§gpô#•z`·±xoAç"k-ÞJg¢ºìbب ª·L† hÙ-‚MÛBEÖ¬…~PNê‡ìò®ÓôàT|Q1žÍ¦6&È jÂþ cÜ;Ž‡hùj|"/âÄÕ¿¿Ù´ãÅÄr%ÊِhãJëZOk5`
+5nA+l2€½­B­‡rxãk¢QêNíP¢b°†­–°‚OãV#¢ÒîZ®Q;á€bÍ%)ð+øJ-§+èšS¦$ÁÓ¤%;à÷8ЧLÅ¿Çρ›êÂÛ_'R}ôX™U¨øÐÙEAýgtEk¸¸ÊÍԖDjaá!r<–üÌ%Ë7êÑm÷üèùë×_óú±Xèk—-Ûô±¹_æóÝܱ¶ì’‘Ú?÷ʽ_•ïJg
+}—c×!ú¾x÷…µe—Žw×6Ü*¤ažùߑ=ô‹DÌ6ã<æiX;:í"V“E¯ØܸëƌÌ݌iq7½Ÿnô.¬B3v.'ù<4
+‹p6¬òÚ0´¹-%ŸÁwŠùŸ»é‡q»Ã¡*/ŽÖ®Ïžœ–ËÇ›žgø³x½bmØF’õð®´¼/ø¦´w4v" öÀ:qc›¸ÍñGê‹^5¥R>¯ª(€vžàÀò–wK•H0bÝ´ïUï›Þßz)ïžà ;òÎätÈ< Åðd˜ д-áéwƒ17@E'ÝÓîî·ÜŒ{(ôÔÞ¦×(Ã=xz…¯FùŒ³'- üè$p¡ý5¥f­u‚W„Æ‘#eo܅Wî,㬂$ŠðìÀëέzíµr:¶Ø•Š--lnýRç§óþ ýâÜ¿-ŸýöÀâLú²ËËÛ.'¯Žù®Y‘¼qFj ³Ô}„A–PåKaK×pDØõtÃnې‡ôHC8iyÎõ>1 `±Ò7¥©1ÀÎiÜ¡$š
+p “¢ŠÒïw“cp7馬ʚØA K~o÷Gå4T~/4ÛXæ
+ž( ^sÓ7n$õŸOÈÕ=óþûõ"äÅs–6UàƒÏ·Äàuv6Ñy܌«‹Û
+Câˆß:îèhžãÙsÿ­€ÐâÇeœûdòÊÅÂfu«Fi¸¤qµq¡y«Íˆó-BÌ¥+ U×ô@7_ºTŽ¼;°Š[É/–©Ë´•k¸¿çàÿ!ð`p¢å âqîþÚ7¿Ëâ ‡Õ#Ú³ç‚Ó-?S?>P? ä'xЂ#†*¸Í¶Ym$cµ}}V›JYm<nµ.nMS U¤–[ˆQ0JÛnÑ?g»Ýµ¯…ïæ*BE­_f¦c¯Ø;…½êêTV¨¤[õDÜDPŠàŠ@,¸ÃÌñMW5­dU8 žƒ=Žel4ÍA‘Ì­@±‰`š]=m€,$„ á°ðSÁ&ì⃈e“)>Ìå~±w¯]@éë:ÁÃû•”
+C,Ä
+EP,$+ª@ô ‘B8\+ºkM‚V,6ê!Š6míÑ3}# qÓïó¥*•ª`ŲŠҒ•j¥\5”}¾¢ ¸ªP,õ‰á]ZDŠÆŽøî8ßqÍ(jåüï3™T¹¾í]UPµÙXCcÙDÕðT«†èK¥JeÑS.‹ð—WyÑ_Nš½«˜TJ¬°U)BQøK èg€ ÜåB\¹@çA>‰„Š˜‡vø€¯`Lç3º4DWE¹jj“Ú[Ú)FˆkϑD™`ÁUª…¤ÏeP~Ž|‘¨ÝäÚgbÇ÷ZåêN£ØÂÁìÈÌéæ2ۃMn‹Òªe,oâªaX±Qþ‡j[@Uj»ŠêûòÉAôŽOâV&„#2>”oyöXNîqöìqÊ=»ŽCÍ1î ŽZ+á’Í3;Ä)őýé_ó#+쿃ִð"%•¹ê3(×U4
+J\¼!â§pÖ3¼ÛT1^ K¿? !i!¸Oo
+§KkXø­@ »ÐBpÛxŠßÅ¡põpö5 …O褾o[sõ™Óʕ'Pp
+ÙÿMDz8³ äi²Àª_)‚§¼ù|ìÍã.–kɂV#­òÚÜ:ö_¸hMg)VK ‘¾DïÜ)¦Éþ2„áT8µl®ü%“Vx»
+•Iª–J‹zÊmD•\›'ÐSëN06mQÏ{±GWcàF•/?X;;‹× :=8‹×PÆEF°*RkF$XÆ·ŽJ—‘õj¬ØjtòµÁ±U{9Rª"’FƗ .®#*"Ü%µtˆÈzÓ¡F
+ʁ1œgD儿І‚ݪ¼ ¤‘“òŸ—?ˆn–­n™ˆ8‘¯t‹‘…çŽ{ô±X?Õå«rrªªè?â)Ö#΅/s"÷c\bÅñ
+7µ$ĔŠãîÁT}oK¼’ã<:W ©¸fËÝ7$ªTj•'Ñ–Ts¿lԕ3X–ÎñBÀ“[7Þ5ø’Óéﯰò¼¦,;¯ag×ÈK¤gœa†¨O°ÌÐ*&+M(«Ë4J=Ìr¢ž±b¶e~Áh3N=8”û¤Æd±¾N¹Á¿£«„ƒ¡Å[Bw$K¤Î
+R   lÀƒ¨ƒLȇ\H-$AdALÂZØë@j(lè‡ȀûAX0<pÊà$ä@8Á>Ø pÁ#0 ñ`Ĕ¥ÁYH3aô†Á
+ãž@>NþG”ÌcÐO({ 4²nHC6¡?½nvØÑß@®ñyL2¸ÑŸ†÷\qÉ÷­•r㥅ãuãçvÁÞ¯ÀkR÷XÐ1Üü9ÂÊ!¦¡ÝèÖcZkÑmÁg¶¢?€ä0ÝåtéÊ úµèÈKA‹~5²?wãs˜ÆA¼¯ÇpšÄÅçrèZH\üŸ®;Î÷Ý©Š%IßÂÕt~Žô—0ýNbK£Ät5~!_ìÿ±I/܍Xæ'ÄüÕD‰é:óï|vuìý‚ƒô™öo3'Ž¿¶A(ÿLaZílG/&Ïw~®à©ë㡃Pðx©Œöµÿ¥r2
+endstream
+endobj
+32 0 obj
+<</Type/FontDescriptor/FontName/KPSHBO+Wingdings/FontBBox[62 0 983 722]/Flags 4
+/Ascent 722
+/CapHeight 722
+/Descent 0
+/ItalicAngle 0
+/StemV 147
+/MissingWidth 500
+/FontFile2 55 0 R>>
+endobj
+55 0 obj
+<</Filter/FlateDecode
+/Length1 5640/Length 2626>>stream
+ ÓǍµjG;R(–N­5ŽNE:mCzî»IJlëø§3åžýÝß½çœwî=÷ÝûÞ[ À úÖÚÂ9`•ÔiXÝÖ°.Ò&úŽ“dQCû&ýÅÂýûQq@.YÝv׺“_-4'€´ê®ÖŽÕŠ«O››"gÈŸd¼ƒý›šQ‘šfÀ¾û×5¯Û´yl¼M¬¤u}Cdìúâx§×E6·±Û”Yèÿ*õ»#ëšÆüyåj[¿q“èg˜ÜÞ¶¡©íÖ7®_…þÇ0^|ßÊ»ÿÓR„Ò@‚ôAº[¿„z¬G4"ƒÝ°›ö ˜‹0±U˃06Xú¹p?Ö^ø酟ZšEPözô>…\Š¶dbÅØMº-~¶aì/i?=AOXÖÅ·Š{¡ýò êy¼­ð"œ'ÇÑç>؅¶#ð.¿
+×£ë
+ÙIž ýä(ÎïMò>ŽY iÅìÅ,·ÒÇéaú&ý5ýÑOé— ˜­bõl#ÛÇ°·ÙÛR…Ô#í•ÎIçd"›ÖJ¥*éʝJJ·jSתÛԟ©Oª¯Ø `*敇yUÁ
+ã}K”n–J¥åҝ˜ûiiHúï$•™œ-ϓKPšå»å-r—üîèayXI´V%UIS*ە=J¿rFQ3ÔLuJZ¤Öª­j»z@R?ÖږØZlìypfëß8½/ãî~Þ©B9‹»á–Œ^:?{4QmµµÐ~>;µ–ÌÄ;õ¸ÄlNÃ
+0ú¶ýCkfW–ßXš?‘D(„0ßÄl-ÀK?åï}O"øý蒚¢y*ôzÓ¡Š9H[-"½ h¿ ^AÏ zFÐ^A{U
+ª´TP™  RA‹-¤’1AÄs+ò9ÄYÄï¿C¼Žxñ2â%Dâ ¢ñ<bâ)ēˆnÄVDb•ó%ºOÐAÏ Ú'èYAO ò
+O²ú‘Þ#Ïà¼QGÙò@áåaÇ0,þë¢ÙsSÜ)Ùîw'ƒ‘N
+—Aü{q§4ÈÏxžòóKƒ‡TE {l ¥h”1Ñ#éÜQ#Çè`$
+Ýá±k@(STM‘PŽ7<u,NYP4{»\û€ãäö'§4â&88q÷á‡bÁÈ©ô'èô‘ßòǑ —ÛG.>-Æç±ÞÒºŽƒG<cr®Ê÷TÖÀ¿£ðBÇÞé¸k±,„b½Cþ¿‹„ßô¼–øú|Að$ŒÕØǓo­T\?Š-l+Z±ÑzG“ÿ7ð‹6¹û|1:IAÆ'WqWñÝ¡Eñ†o1ñ|û–ÂϞظùÒÑUɋ.j.q(÷õíºÌùµ²?7\®¶¨a7qüLþ YÁ\Ê
+endstream
+endobj
+11 0 obj
+<</Type/FontDescriptor/FontName/AKCXNM+TimesNewRoman,Bold/FontBBox[0 -215 991 857]/Flags 4
+/Ascent 677
+/CapHeight 677
+/Descent -215
+/ItalicAngle 0
+/StemV 148
+/MissingWidth 777
+/FontFile2 56 0 R>>
+endobj
+56 0 obj
+<</Filter/FlateDecode
+/Length1 41176/Length 24354>>stream
+xcÈ=³©CóÑt_Ÿâ¸âtn=2Ãü’0Ò­è1ôSô
+Ì~æ}¶Œý"WŸ{)Q p7¢g`^¿Bï w^ãq7þ¹™Qܖ»ÆC‹a›Ðãè ú+°ë°{q×ÁÌnÀGð‡ÄCDÒËÌcö(îÊ­Ë}ù€WúÑBh¹݊6£è(úú+Å.hƒ–­¸oÌÌlæ>VbïcŸe_fÏ)LŠ—³ogOªÓ~ªP7|ûÑ"´Ö:ßWÐ{˜Án\=Ã“ §9x¾oÇ÷âGñx?þ>†?Å_àÿ¹‹|Ÿ&¯‘£äãa"L'óó&ëcßc¿VÍód_Ê~‘Ó梹Dn{îÁÜr£2Šã[Qp×2ЛÐvt/ú¬ù>ôú-ðÝ ù{
+b¬(È<N†IŽyƒõ¢ï¡“ÌxêM ŸŠqzº-yxsgƒ–¢zTçáY¨j& ’ܵ0ò'@I¹Ù¹Š>Eý
+OÁVôh/¬â}
+éc^D؅A–Þn‡5˜”\½lDw<={ȯÐiÌãÙè'è8HŽä|><Ÿƒ~&£Ë€ê«Ð oÅ#P²• ¬ÓW؀ëÉjxÕ³÷ž=cz} š#'«7áN Þ|ô/*Ëð„Zԃ÷ž¼5ÀNÙɼ‰þŒ°»¶ƒŒ>í€7 ȃa‚ʳSsõd ó"¶Ánh®š ;û8<£0Â<ƐOC5ÙK ·gA—õ(‡Ý7
+;ƒ•XÙ+—Á¸ßƒìWhe®?  Ú/›)µ¶Œknjl¨¯«I&âÕU±ÊŠòh$\V
+ÆBB§¿8±ðBœ’Ñijò¥VÓ‰!RÞù^I¯sª§ÑÂz´u~= Á§C«Ô È’”ºc`+ßHËiû”"ȋޭ_"àqôoß.™[(Qù/MR>¹ÀjP>ŠFS‘eUÐÆØ"çk*Ê×dÈCâ ïˇz`mçö5Æ`ù}>Jà;3š™ÔðôÞ|ދæ¹ÓHŠEûRd€Ö9_c½ŒÖ Ÿ¯¹Ð|@Nއ¨cMq¡ FÞVÔµ¸1…mÿ—ê…ùúÉ3ÄÉÓgõz»¶ÖvòÌoåòõõê
+©TQG/ã&…q3r-0åì È4Ó«K±AøSÊL½ £â€+åìŸâ&äã>Ï÷ÿ²Q&wš¶’Á7Í
+@]ïA/(]¹”\(¥9/́gœž&œ\å>îã°\ËÊr~~#¹Œ;_†Ñü ɗñr|¨ wÌ콘„²\ôUK[¨|Ù.t¾¾ã«¼\ò­Ì:ú+Ð?P3ìùJ°xðÀûåîÌ向½3½V7¢3Ä)LÙãV;RæŒm<kFÃ2BÜ
+aFŽ1’Xsúú„”°2–çÁÒ<˜™^ÄI(‘;šGìŽ8-ÑèâÃrjš7¥g%¤65k‚!Q<š‘‡éž„\ÝM{1¡Kò¥#]ùVíùâ–rcBh @Þ A‚0a„Ó”0zŠAØ!•so„mvC8IqåÞ¸„±ÍÍòPÃËsç‘!A¬枒c#ËÁªph„‡XbYM]#„N˜‘.y¤ÌH´R†é²p\®H»Šã/Ân»œJ
+•Àü  àëÌH/ó±#†ç=
+è2ëPªgÖ£8À§˜›Á¢h¿OòÏù}º,oÓ0O27Ê(«˜!0æfY:.x3Q~dþ6¢ÖÒñý-Í[ã/2Ÿ2ː°N–]0¾È,G1t&™µ>¾½MÇd`šXƈÑCr,1¿NCG𼧙a0»æ(s ˜×ó ³1mŽfþ%£¥½ÀóŽ¡`DoˆiS3Paþ+þùigFBõqÔbîBU,êGúˆ
+SZ!lƒð„“réåUð„ˆ·C Ðc ò<Ä„ÃvC8á4:ÊTÀs*»
+B¼ûB»9rJ€ø|[†<ߝ2’õPº^Òd³Qe6qæ 9”^b2d_ºŒ0’i
+™„P|ZŽ?•ã¥’! ÿK@ÿz@ÿh@ÿH@„üPá“\~ýŸýú?úõüúgüú{üúÙ~ýt¿~ŠŸvU†¼HO<4ÆWÉq±d÷êÏyõzõ¿ôêßðêöêû¼úF/ ãÀ~ªÇÊñ9®9Ô I½'©?D@3á+ÓF¤>L¾éM:Ò"dµ ˆ/ÝPœînàNw_
+À•î^  (Ý}Ð¦&F¼Œð^ŽB]:r Tkó€KG® HG„ Φ#"€¯Ó‹<¾J/*p6½( àK
+^ÀÿD‹tƒÿž^ôCè†Êh·ø"Ï̤»[û@þéxjÁA(׌Ž?—ŽÀàðSéH€'ӑ€'òàÑtDðpzQ%€¦ÝàéE§<.»†ö·•Éý܏B2\•îvCõPº›ö0˜îŽX‘î®°,Ýò€%é–S´éÕx/ÎƋPDéÜô¢TÏ)L¤•ÉÕ³QÜó%énº$ãi'mzÜU˜H'î 6nÇ{å^¤t¤
+ÐZґ€qù•kN/Š¨O—ÁãºtÙaåj Sú¼€0 ڑ˜Ž< HBzQ@IzQ7m ƒ**<ՌZäA™ÒŠÅ§#^á'X‹É=jP?°_ƒ~¿nÉàËÓÂWR†Ãiá_eö ëž'üµ;¯ðˆð³û…€úA $%­ð~ä”ð‡E~áÀÜÂÏ#•Â+¡uB¦ì°0Ò]"셁¥Íö,’{øqš¥…§Ê2Cë݋¦÷G¢ÂŽP†Žá{€¼…>:ÚY'l Ý"\¬°ºûaUÄ# –]%,-£² K"—
+‹a"WC›…‹®æFîjä_yK˜Q#Ïaò"yF[äŠ ‹.Æ࢕VÀš€/ãд²æ0]#°T:FÞ.«{À.Œ‡!¬”*U/ªnVÍSÍTµÃ~Sª
+Füµ»£}«P4š`4Šà™0kÙзɆ¾ViKü¶ûÏÝ_v3Gd ÿ„“²…¬ûcN‚…_Âi9Ör²…9Ò}¬û$à~p샓0G*ŽUœ¬`ê
+# êÃ0Âo¾×EW]G‹£Xž­<o:4$è¬Ï/Ã*¹bµ¼0ðɗËM£ÐQôBóè7‰UùÊëä&ùÒUßð0TÐîW_ýŸŸB)=e#¸!E±ÜCp¹Ú÷üŠR•a8©)ØW¤Q±¯`ä䔊WónCjė#G”?Û<Ö<•?ÓÜ=֌Z!͟ƒ¨ºÊgò™‚ábó2GÎI
+ô5ò²G5isÆôޏŠÑÍ/’ò ¹•ïxÔe§ä2M´k·—ì.!%v»Kg™èB’SH¢—1–]3HcÑ%¸ˆ«Ü¨tD—ÁE’ú%%V:=Ǐ:¢0¦þîÑþSýæ†hl4ʏNå»v~܏Z»Ç>n­®Âã;ÇwNìÄb¨´4T“¬MÄmV‹J¥d(TŠ~Z†¯)W•&c³'M˜¯)öw̙ÓÑ1ç*|på#ï½zY÷Us&N9öÞêìÛs:åšØÉÚ³;ñ‹8AïaH¦ÿ¬R³øeô¦y¢NÃN¶‚$iqB0bc›ãG߁Õ;ÓflµŽžŦ†UQMmmM²4$úU…QÈ#S.Z½DÃÓy¢MW,¸äòõ?Êî,?4äæT¦Ù-í 6¯ÞöÝKãxYGZ€Ž.IÞr)°“¥›ÊŸâ?F±îQxŒ¯ÆG֍$—àGi«Y¹Oð“8‰´È¿MTjºšZ¯ºJMÔN݊;hës°ž0Th}ñ¡ñsçuu͝‹“2èêš'ïë¹I+P˜Aµ’6ÞVÂXø ÆDË졃ÚCÊÙºèiÎÒ®›[›·(*£7ñ¯Â3°ˆIk¶c¿¤XöÕÅVÊ7“r§˜ç‹é›D<IrªÝJAT‡í*‡ÛêµaµŠÃk9i³¢ÀˆRo¶gDR ”DR´¢D-DMã’êA»éJU˜~ÁOüÓ°MõR‘5©w–ùw:ñ³Ñ•ÀI½’Ý/J“~ډŸv⧝¬ðã!*F}€('ºG©ÑaÝÈvªƒ_†Ð„Âç¡Õ€½Ð
+†ã
+œ’efô ̨ýE
+ÜN~Lžc˜Rݽ Ñh5ZŒnónÛ>±“FËgðÀ~s̞²{ûÓØÌQvÑê“\† ì3(°òŒäF
+æÈò?§J õû|5È\“”×Jf ªM•ØkX—`zÎý ¯øÁÆ«¸,Xûþö«Ÿ˜´0û^Óñløy\¹}ɝèdžœ¸ùŽƒÙçÍÑ.ºŽ¾ÜGÌVXÇ(:* *£Ý¸8º.ºÙºÙ¶«è^ÛÓæ'l‡Š´Å­ÅÄÂá ¾WR#D_x Ÿ|¾pA|äM0>…\ˆƒéèMIy]ÍV€äWû%ƒÂ¥Gðñ÷y1Vhá{‘»ö—ä—”ÁÓ;(̇I˜*“ÑŽí®
+e­•mî¡ëfÝñ ,LøòG°ž¤G;%G«'0fKTj‚ÓëËéõZmϖx„-@-Â*N«Ç,:ŒÏ!Ò^ÒqXÁéô|>ÂfÔб
+ÎÀ.r
+ Ç>Kà¾C;ïÎfx¢¯¥-ZÚ3w\¹Pzéªìîìw­bJ6»EÿЭ¯ÜôÅ--åõÑvog„×]?3õ>†wÐ/£˜º?–Ë©ŒÑ±E&¥¨K·8´.¤
+â:ûåñµì­d“óý®À3úgn¿E·WI_*Kv5c5Fªýn]Ёtɬ@Ͻ¨P `¯R/o±&è–bQԊ’:f†®'8_·Jw+Ruz}Ü Ñ¬ö#«;èqPšã8 ÛŠU·
+šõ&ì3ñFÖ&úLÂb»hôÊ@™b|Š—x#ª]£QsF¶Â‘ˆ+%Ñ«qV…Cáݡc¡“!eyCR¨J¶‡R!Õ¶ka†øþ3NW÷Øh?ì,Í<|[›]ԊmzÁÁã闙…Á蠉þW£tónhp ~óGòqÿÅßܬjn.pPûTÀ ï`
+Á&[…-Ÿ¡† å¢ÒR`í™Y_Cq¥{ivÜÄ«ºðŸ‹ð§ã+ü-cƒîi^›’/ýÅ1¼qS{´ÁÍsÁ vþ.¶ñë§~Á /1©Ûÿ‰ßÉV€&7TaMîMP/“¾{¿›º×5UO:ž-?Tr¨üMÕûÿ‰iÊp=ž€'º/#}î…ä6²©ê)ü³òߔ\òÿْûÿ]ešÀ…‚Ł@©ÁëQûýF¯Çâ«‚%LUz«ª#(XWm)® Ֆ@¥Õj!‘JŽSsÈË{‰÷ç̬+¨6–
+¥¤´ÂhpÆ̎øÆõ:¢Ñ©ÔÝí?EݖŽÞý¨’¯$•ÝŸö»÷VvöƒQɏÒuÒXÞé
+¶Ð:Qñ†fºÚ`ùÇ£>ÑæP¨ìAÈT†Êƒ¢ÍÃ~EU•1ìsh$B™X¡ˆÄŠòÍ[ž~n%UüæõUŸVPy´ªÁßW~[ùïTJY5@d³ËfklÛŸl«)´
+…:lmÅöÍöÛܛŠ°‡K4±Ðba­r~û¶¢CFUÁdxÐ,âÁ`0ZÀ5å{Úd6(–zÃR«ω™°É5Â!spùA—;ðüÔF !šn§ó %ôH>5
+¿©nýêƒÃ¿]³ò_ÿ>»çÀ/qßËÛšíôÆTŠeÙHæÕï­Ùqpö·;ï¸ní²ãñ™—ñì#-X‚êJ7Èߐ,Q¬•f»†aáEñ4ŠÒèê¢ÅŽ«ƒ„3eŠ«MK ³Ãt¿í±"å|ƒÊëA~?çõübq¥Ñ@ü5n7âÌÅFà!ž®J…{TXuSù¸çóš~ˆŠø`°¸<
+ñ!êFÞRea,µ°¤°ÈûCÝU,çFû
+"Æt~a¯¢ ;IŒò.s‘©ˆ(ËJÃ¥‘RFùMŽ(mV»ÕauZYe åCA¡‘肨´¨˜FQ(‹­þàEâ”÷‹ei¢Ùõë
+ñcp>ËðŠÂ–ê‡Â&JЄI¬$bÞקY&¿¯É„–Ï=€ÔTö E*Ý·¬æC!]÷¢¹EÉÆé?ùs<8îëk*š.ƒV¡q‡Ú+Ø!ϒúØìØñG~8Ö¸úû‰ìÆÁ¸7µ/;=h5ø‹˜g[E`ºìŠ{†KèíÃJ ï@ßr쓺U¬ZSÎøµ“´
+´ ˆÊ‚bå**_À ¬qXºŒVQ Oó™fºë5Ê,S”Ó¨Úœ§+ä?æ?–‘
+m¯ÖñÉs™3Yóž´ZŽO"ي¡Ö‹Q-¨‰Z¶^Ôò†=ÛÜMMê}qÀÇÀ~o£Çdù£2DqUÄqoDiÔÂòK „UA¨"ƒoÇ^ÁÈ+#Ó”êƒÈèÕ·#.,ïw n© +ïz²¾’.%·
+À¦GÎïyç) {l„&êRR×ðÈW8'©SlvdÏ<tÿ/fÎ~ë;ÕW×ÚºªErÏä&^½1ûɎŸæ^©aË[8½ü5sq•6Dÿ«o>›ýÕïdßÛjµ`WO, *„@ѤìǍMKž]¶õYÇOðÜäpµXÀ>UZ@^;p«dîðƒ–¢‡óûԛvÐu6Ô·"ïØí`¨V͐ßðǽžˆßßH«‹¯Qc£Ð¸§‘i÷zg¿_E{P]èAÅ«v«ìõ¨h¢ÉKÉ>ßCXî!,„÷„´4àHW‰ ¯§Á/ú}eˆŠn+} ‡;ilhà8'¢v¾´·Ä s@ïބººˆÔÕÓµ»+ÕÅvyó§¨-&Äcøëá1Sç¸5…ýzeaÃî:{>ƒÎ;!467€†k–y#Zˆ/Jʊ˜§ºÿŸØJ›)}ÿ£ä¿[ªÿ–lòMµø„­³¡œ¼ZÞ,BŽ¦ÇšóirWvö‹z>ÆÃßäÎmú&Cy]­ìÚ7á¹Ñ8ðòýeÉq” ò¦$‡5zmLÛ4OÔ/ׯA[Ðøýîqü¢.£?Дw™wƒ~¬´W6áýŒØ̦¥øêJššŒFcSee¬Â
+ZÏÉÚÙæ÷Wx=¡Ùþº¦zOÃn Œf-
+á#—7ùüç–-ëòf…Á^O´½E1åÜrÉúh# µâ´¯w°KÎ=rÝ¥@àY×0/jý$H/£uO+–!=*ÁÏJ‰Åüâ¢û5ïšßuw/~×ó‰Y­r¨JìÄ¡³»ìÅ¥|iQ©¥Ì¥)¡®±Fւñg¼èƒBŽŠÕjR,L#ó|Ù©ÜÉݧۡ‚<¡û™âgê×=ïâwõzª8¥Z©±c;±ëìz›G½È¹¨øzÅZÝçÏã~Ç~Ï»îӜörƒ¡1¶•Ú¬u
+Ë{ev£Nr"7,Ò-1˜qż­^â5š31ƒG­ï!jïIÆo!˜»GóU£çßISón:5ïšq ô„,!uPrº.¢4êÍAX'w[9Hٕ2é A¬/&ã"-ˆ\,DÑh3|ó®uþ¬
+Ä°×^B)E
+h¢w|õJ´«ïæ[‡V;*µZãt:\.N‹Ü …fÞùC3»Ùcò–•Ž@2uF/¸@7UGª<Õf‘6“Û4âÐj`ß¿AZitå/Âpá2K8\¦CZ<+m…Ãnq8ìjšÓ”9œv*Uª²p"vVÃòe.'ý×%åe ŠáH¸ŒþgX~Új¯¦ Ñj8•:AY¦Mƒ_&ÍH…×
+†à}Š¥ìööaSávlž´`g&óÇùs­øùZxϚ»žXÿæ­SÖ4ìò«4ÑÞ¤ÔLiJL¬®-m#hllýбÛw~ukUíBöñéEÅn{,;°AlšØøÜÉw{é~;5wŠ™ZLD—®ýR‰jܧ~¢ä5òšx†ÿDT—“ˆå
+·Ù·VܯßaÛUþ„íÙòCå†aã&B©Øß'Kw,/ݱ‚tÇ
+ҍåŸPôç… ñš¼+q^‘ʲ%ÖåÆP yók%WQŸ½î’ãGÏ\üüâŽÅMj]Uû–I˂Ž`,Ya/띪˜òõ›×Z|^Ö×ýýË[vo|qÇë“mصÌæ)ŽŒÝv·Exðá½Ï„Š¶æ¹€é³"/®‘z•æɖ~Ë
+I
+çšâ|AòdXbÎÃPURæ°Ó1°¾‚ʧÅùkoýg£QÊ,Ñhþ²æ™1ê*žé?…ùŸ叟L%ž`þø©Ø,” —ÅV‚KLîl·BT8~¢GQJä!ìËKc~Ç£4ýTÉóÂjeúÇrêY]s›çÕû§dÖ[vùØ3w¿ý¹´ŠI_þòÐ53:®°íºe÷-/}†­Ÿ>òðõ‚9Ñ·K¤¿ÉBˆiW, J³¥V bT"• äUl$Š0›x½Ng…卺€ z͏‚dÖ-¸[ÝÌ0M⡍V\a¸µP`?ÖÄè¥jcLˆˆ11°Ñ±ü¸ÊéN:JÂ~  {8öމ
+SHN}̟žùi´ðÓ·ó~$¸÷ 9©¥oÞè­Où*b>¦"._¥"UgõÑ*˜ÄšDMiò%J5êù‹ÄvkŠOX¼—ý¾µÆrûíø}7¬4.9aÞî)%[™®±µW9À `wÕrǼ®Øö#³ë+Úk}êb“Ѫ1VÕìY;þö°;;žùHR‡¦à7¥éA^kl-nQß^qOøyö :Þ_y:ðe§F“P×(”MÞ©
+Ä6¬ õÂá.nsd—úɊ';´Ò„@»OvðˆiT,-a}L'[ì.`öÉÜÐ"…J“-R‰‘Õ‘¬jÁ-òïCɖ ÃJV‹…Š¨ÅS·C§óÄ#Ū“L†)–tÀÁÕ;bª®Ç8A5s+…’F띀'Lp4frÇdÕ«očqÇJÁ+ŽÑݍQJáòv Adlµcc»ÐNÚ'øxZÈ˅<οŠÍ0
+ÉJVAW$‰I!I’’/-§Ï ´\* 'Ë©Ál,_Q¾­œé)?VNÊ×vƒ¹,[R ·§š)½ùÑ~ù=¬õ•‹£ùëægšÇ¢òŝQjClb‹$ø’ѾѨ¬
+îÜAÔÓÂòQMì’ ‡ Õ/\X§³
+/vQ”¾Õ“O.e —o 'êâöü!3½Ð!ßU¿èº*—9Éoم\ˆü7T9V¼4I¹²b\]ˏ~=mhñe·<uó±Y]Wm\ºê¶ëO¦ú'5öL«mî©ð^·È×°æÑ;2º¯e\^]VÛ´àžŠ¦p ’TJ›/»ÓW]}EUåD§´²kcUõî%wü¼åºÌ½+–?4ÒVõõßMBMbƤ§©ÄF-ªñ±õòÍ­‘2w:­m_•Æ&×$ã é¡oJU
+…Ò¦ )Y£ùQ¹ çý|¹Ò¼Ç𒁸1*
+aË©gŸ}¶>õìÌj£¾¾êTÂ܎ Ô&R[»ÎÁ|9•Jªªc¶šÇ/hžp2¢…‹†f@OÀ@­!IÑBš¡éº^2´6]g¹§@Çà®AÕ¯À’(^šJ*P—èSSIIô3ØÕ®¡6äqó0-'1pRëUÀŒfÔ0ôpÈó“ö_·3»Ûq;€•Ðbþ‘{o™(z°g8äß&Å0/ǪNŽZnÛSUÍò-•JtJ/ÐVa¼x¢è(ƪíÿ„Y”AÃø¤m,[†„~wNN<uj|êçÒ)ªƒÜ:Nµ±Ò©SÑ©“„脍8…œã3„dÄl¡Yeê3DŒýt½\ÆAT{lõ õríÅ*t¼`¡sëé.Ê´šøKýën¹ò_oøÜH¥S¥§ú[Îk¤lyýãÞïÌO$ W.ÇÎÛ³±ñ/ÏD³ÀmQä<,.ø*ųDÖòd à=  ÉDb/—ñA‹⑤q/I¼À’Ê- LŽÊ-N‰¨UÂ:ÜÉsԄŠ‘JÁ’JB&*µš`K'¡¦âyPÀûliwiòƒòA™­ÊuyŸ|L>!s2¹¾£V#ôH¥­ ÂI:׳¤“
+2涄Á²¬™µÇ%Q?ԂÐiò¸»'fhÊ$óòálÅÐZ `*ÙCë׳¢¡uÝ,ଡ&™WžÔ͸ÇÐ@Ù,éçÚ ®;³•îŒ;ÔþÎ+ꕏÉùþ-%è2Q v±š­¡¡‡r ÇûEQ±Á#ããb_½cÍؾ{-“-µUàT…žª|½òR…5+û*Lå5$öh=LOéü
+SÙÚå'˜`«°9>ÀĖ M2MdȀV¶ð8Í(ëŸjÒñ~Kâ²ý£êÄ7Zšé3¨Ã¤å9iktJeT;)ÁÇñíùd¾ƒkS1ïL q{}U¾SÅ ¯jM¬š&8º&héêMYK»Üi—Zà4w¦€Ò—SÓ²”WÆåC'†Þkxk^sè7¸†Ý#±!®—áG¼àdN°u›5"ËNSôEOH¡:?9ýÖ ²”ÂÐ s™7ghÀgJ÷EÁÚíó’}P²ÿ¸pÆ˃NÉì>dÍæÿü`Læ*¶VÕù.~aÅ-ÃëvfF?3zÅöJä¼/!+åTyM%h$ Q©&Z2Õ.8§Ò>€}d×êE«Ç֍®½cãæÍ5£¹Bâ
+|ïM‹3õzó)ž#R w¬Â÷î6¶¼áÙPçi·°™‘h·`áŐ‹2ã xñÕ'„>7+TCº¼k´‚9ÀŠ9žý!óöûq6ÄwŠd€’`dѽkYóK©|@üºè‰¤bh¢…ó€õ¬°$Ŏi‚C: ʲ®gÒiQô{bWr¬Ã™˜Ä—M'fõé'̱h¾¡2ï¡h2RœT€÷E§•—F!ÐRX©X©˜]Ý°4¨ÙPÀT¶T¶T¶”¬@)j•ƒ¦ZÙbh²b£IJ¡’Š*+6Š¬Øè²b£KúND@••¤=ì
+ùX™ÇÕü±üñ<›·aeކ•y Nµ|¬õ œ¤hRš'ËÄNp†·¨8Ú! à†­'ûgټϔi S¦›˜R$˜2ÝĔ"ÕL)L)ž‹)a
+´è8Æ· @“›ßƒ‘ßͳßÚ{áú+°d¡+"ÉåøزBW£`³çÃK6-ï{¨ñÙÍRæbðƒÛû3»ÂGzg±¡=åIàCÊàÕfô[q\ðbù—?ïÃÈÉ;Ý.!e:šÚF‡™/×DvÄuKÛHÉ‹Ô)™è[X#Ô4ZʵcúqAº©_®“"gê_ÐÝr;3 X°µM”BՄñúkBŒx³î9\èêÝJzNëãYzIû“¸*4@L?ýH´;\Œ3RŽÉijZex%
+–=;0zeoĐa&ÀçòšÀ;ýRÍD\î°¾o‡­Mî z,ÂюãL{‡Ù1Ú±¥ÃÑ!Û°Ä'›^Üî5½£ÞcÞã^Îk?ËfãµTµ^[Uë=Çfc«›é¥Ö¥ö¥³m6¶sÛë֌äY:èt¾5ªÆrå|*_ȵF‹œWaSŠW
+\ÖøòP-šË1™ÈåìÉ<f×PºúÉß{÷/weã_ÞÙ·úW¿]»à^‚±–#Ä~8 ˆ ¦GÈ }‚â•,‘‚Y Þ³ ­V¶1Ð=‡´.º›R­Ã¢D©YPÂ5©Œ÷ ÷”!æ ÔÄRQQKIªTäq(‰ ìCšJ¡jä9-E¡ªnhEÂM)ÝÓ)šj?ôxɞºøa2È "¯¦<â8òŗ!¾ìÉ{œÇ'œ,ðãQS@E1¢Á̱¤g-~ËÒÑ F}Å&iËgL‘õcY¼¥ãG¥aK‹eaU` ˜S¼þºtҚIö“¡„9œ”9¨ò²Œm\K‡íî¶iü±ËCË``ùÛ¸Æïè]4ÐÖ5ìôøRñb(Þjoù°ìòäÛÙG¾÷éË.¨/Z¶ØÁ‡³õ+v¼ÜÛ'%b,€‚¾ 7Nƹ]Û|’ù|£Næ1ó/„öTwH¾¢"¥Š^ +ÏåžËÿPú…ô¶ä,J¹R¯Ô]º]øœþ9ãQáKú¤pX8/çsCÞ%Âr/o
+¦—‘;5ô£aLÆLt„_ >r˜Aô€\…µêïÊQ-ö@B‹ÇIÇ
+—ÜÇñI|©ÆÿN–¹|Ù)«yY°åؔC5¼žx±Ÿ8ìVø‹IÁô¸æbËQ±fíe‰¦Äœý·æÇþ¸XÃÕÚHí²ÚuµÝµ5¾&»Ò¤²e.¶ü%M¸Ù*eãŖ¦m¢·4­{-±y¤Ë'=þÖ2q¥Bú…'\iFI¨3·¸L%Swõ‡t؄s° m³GV2DœÞFÌVÍ[3iKÛsÂtC™Ká~Ғ ¨‚R¨…R¨ˆÐC3u•×ž,Ó¸)1l¶Dá%'°‘°!~è¦/l‡WAõ×É?RUU¬«“Ó?ð*…+%nëôBzÝSˆÈ%õœ
+r*\Å)ÍKÈ¢ºñrÓC”j«¦'P¯šn6VLR l]Eþs®¢~|¢ÐT€¹
+56Ì'ԌÀ8f`Í8h0Uc‹ÁŠ¡’H:š ¨Øo£|¿òýVe´
+Øӏ«þcþã~ÖӇg Út” ZäٚãsôÈ0Œ¼~fõ" JŠù‰«5QIR“$€”¦„·ÌÖxouº(µÐžز°qË¢Û.ÙU*œ‡o
+Fª¥—`ó)ƒhˆn]zÅ'ÂÛ Ÿºyã|5Á§ì™aùðõ“x¯—Ä`ÉØÑ®®¬ŽªOzO¨oªN•Œâ¾.•4<ŸÔjõðHxŒg~—ætDp$Õ"ÖWÁœÆ‡¥žœ¾Ã¼ZDÉt"™%E%ŒÐ¥¢Jþ¤#/¥¡‡HoI)’èÇ\F§“ç“HHü§tc»hŠ£"+ŽûI):¥ñƒ˜!Ìôfñ(y²‰þ‘}„^¨©¦O¬IT7|BuH*>í`R€%؉ÌÓ qeëkœ"~ØS±S㧢VøGºfÉ֜Â)â h)oç,gÄgÊ₩IèǧAPB*yX•<,#’uL6À;')}”„yë Ö›kIÖr8o-%´œ²‚ÁY
+O k‘|:§åÍÉé&,³ÝíæG4Ԛ.·¶jiEÓÒAäF¼Æ K5vUëf1{© úÄ d(˒ƒeîV5(cÄ„4þeú4“.´rZSÉù9°§µF<n¾•eÐFx¾Õ2GõôZf§tÆ2;EcñZ›Iœ Ḿ6Ü‰Ä ;ÒÚ$®1/l 0¯á
+oÛj™÷hÅ,ÜXÖK—yBÌDaÕ¼ñ8Y2À³¼6“éÂd…ˆSdBØ
+Dzèßa˜ýW¬®%u6Ø`Ìc•“avµ¾b–<üÑ{Ñô´ߍÿW&Èï†;ÑÝø.¼u>Á’S>ÊÜóäÖ[áXŒñªµ‰’YN˜ž‰Õ»M҇`¼XÛÕuQoon-Եت ý#¼úšU×¢£Ìç¡®Ž3uMNÿúðà ÛMkµAfPSÏÔFq­m]ÛO Ú{‚.˜)>Ej›õX­Š
+=…:áûüšÖYïdÌNÜ CêªÇ¡Z.¡b¢
+;†™ýÜS¯ÛLò·"ùV¯¡0{«èÆî·Ä[C±èªýÖ
+µ©ÓãSÍ5ÔÌpvüæ̬2è]1ÜÓ3<ÜxÚ.pk(™•á V2/±_ᮁÿ_EŸ0§™ÓqÆéÆ-Kâo y>é}áØ7¢%(1^Œ’ˆ$øµÇ±\÷Va^Œì†’Ë+f(VÛWÁbE«0•±öwX@n&uS§NÃÕW?î:ÙÌø–+¶:7
+­A£q´­D#h]ˆ.AËàÑ|ԃÆÐ Z×]„ÚÑ*”Gè•PZ‚$E"ù%!´…PÍCÝÈ@ ›Q­E£(ˆ(‚RèCH†o҂–¢Í¨P/zMÐÿ.Ã7c ÄÃy´ú#×nڞÞô±ôªë®½â£­ç_·y#½
+á{÷[ë:{÷MôæôY,A|N63yæ1tàg„ÎÚ tӇx‰Ë ß¹rò<ÈÌÊC$ÿ©:¹o!‰Ce +!' \tü µñ}è"ÈåY™ks~
+ẔGáºÚLގ®†{—Á¹vR'¼ùƒdx¾¿€{Ëì§Ð0Р#ð\çÃñ°?í,‘ åÅ yŽÇЅä8mûvT îYΦÐJ¸/ûu8„g43œ›i»?@¦Ï÷?É3þ73´-ü¿-C[VþÙtBV¿ø'þˆlp_=~ðÀÑËÄþß»b–0=ô³®ABŸÿƼ‘wKB®.¸Öݔ¥ÿR ¦o
+endstream
+endobj
+62 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1387>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 8.61'/>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:xap='http://ns.adobe.com/xap/1.0/' xap:ModifyDate='2012-01-08T17:43:36+01:00' xap:CreateDate='2012-01-08T17:43:36+01:00'><xap:CreatorTool>PScript5.dll Version 5.2.2</xap:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='68825cfa-3c73-11e1-0000-0edcf5b7d689'/>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Microsoft Word - KurzanleitungFW.doc</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>gba</rdf:li></rdf:Seq></dc:creator></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 8.61)
+/CreationDate(D:20120108174336+01'00')
+/ModDate(D:20120108174336+01'00')
+/Creator(PScript5.dll Version 5.2.2)
+/Title(Microsoft Word - KurzanleitungFW.doc)
+/Author(gba)>>endobj
+xref
+0 63
+0000000000 65535 f
+0000033409 00000 n
+0000206698 00000 n
+0000033299 00000 n
+0000032119 00000 n
+0000000015 00000 n
+0000004816 00000 n
+0000033474 00000 n
+0000131904 00000 n
+0000138776 00000 n
+0000133243 00000 n
+0000180583 00000 n
+0000033515 00000 n
+0000033545 00000 n
+0000032279 00000 n
+0000004836 00000 n
+0000011432 00000 n
+0000033586 00000 n
+0000033616 00000 n
+0000032441 00000 n
+0000011453 00000 n
+0000016086 00000 n
+0000130894 00000 n
+0000133930 00000 n
+0000033719 00000 n
+0000033657 00000 n
+0000033687 00000 n
+0000071626 00000 n
+0000032627 00000 n
+0000016107 00000 n
+0000022062 00000 n
+0000133001 00000 n
+0000177676 00000 n
+0000071678 00000 n
+0000071708 00000 n
+0000032789 00000 n
+0000022083 00000 n
+0000025712 00000 n
+0000115773 00000 n
+0000071844 00000 n
+0000071771 00000 n
+0000071801 00000 n
+0000130689 00000 n
+0000032975 00000 n
+0000025733 00000 n
+0000027284 00000 n
+0000130730 00000 n
+0000130760 00000 n
+0000033137 00000 n
+0000027305 00000 n
+0000032098 00000 n
+0000130812 00000 n
+0000130842 00000 n
+0000134122 00000 n
+0000138984 00000 n
+0000177874 00000 n
+0000180795 00000 n
+0000131040 00000 n
+0000131126 00000 n
+0000132451 00000 n
+0000133152 00000 n
+0000133636 00000 n
+0000205234 00000 n
+trailer
+<< /Size 63 /Root 1 0 R /Info 2 0 R
+/ID [<CCECB3E9CCD91A2981C6D56996BA4DFD><CCECB3E9CCD91A2981C6D56996BA4DFD>]
+>>
+startxref
+206916
+%%EOF
/NGVideo5_8/tags/V1.30/NGVideo_5_8GHz.pnproj
0,0 → 1,0
<Project name="NGVideo_5_8GHz"><File path="config.h"></File><File path="dogm.c"></File><File path="dogm.h"></File><File path="keys.c"></File><File path="keys.h"></File><File path="lipo.c"></File><File path="lipo.h"></File><File path="main.c"></File><File path="makefile"></File><File path="menue.c"></File><File path="menue.h"></File><File path="messages.c"></File><File path="messages.h"></File><File path="mk.h"></File><File path="ngvideo.c"></File><File path="ngvideo.h"></File><File path="servo.c"></File><File path="servo.h"></File><File path="tools.c"></File><File path="tools.h"></File><File path="tracking.c"></File><File path="tracking.h"></File><File path="usart.c"></File><File path="usart.h"></File></Project>
/NGVideo5_8/tags/V1.30/NGVideo_5_8GHz.pnps
0,0 → 1,0
<pd><ViewState><e p="NGVideo_5_8GHz" x="true"></e></ViewState></pd>
/NGVideo5_8/tags/V1.30/config.h
0,0 → 1,186
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* Tabs: 2 */
/* */
/****************************************************************/
 
#ifndef CONFIG_H_
#define CONFIG_H_
 
/* PINA */
#define VBAT 7 // ADC
#define RSSI1 6 // ADC
#define RSSI0 5 // ADC
#define MUX_IN 4 // OUT
#define MUX_EN 3 // OUT
#define CHANNel_12 2 // OUT
#define CHANNel_11 1 // OUT
#define CHANNel_10 0 // OUT
 
/* PINB */
#define LCD_BACKLIGHT 7 // OUT
#define BEEPER 4 // OUT
#define POWER 3 // OUT
#define CHANNel_02 2 // OUT
#define CHANNel_01 1 // OUT
#define CHANNel_00 0 // OUT
 
/* PINC */
#define KEY_MINUS 7 // IN
#define KEY_PLUS 6 // IN
#define LCD_ENABLE 5 // OUT
#define LCD_REGSELECT 4 // OUT
#define LCD_DATA7 3 // OUT
#define LCD_DATA6 2 // OUT
#define LCD_DATA5 1 // OUT
#define LCD_DATA4 0 // OUT
 
/* PIND */
#define KEY_ENTER 7 // IN
#define HSYNC 6 // IN
#define SERVO1 5 // OUT PWM
#define SERVO2 4 // OUT PWM
#define VSYNC1 3 // IN Int1
#define VSYNC0 2 // IN Int0
#define TX 1 // OUT USART
#define RX 0 // IN USART
/* PORT - DDR */
/* LCD */
#define LCD_BACKLIGHT_PORT PORTB
#define LCD_BACKLIGHT_DDR DDRB
#define LCD_E_PORT PORTC
#define LCD_E_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS_DDR DDRC
#define LCD_DATA_PORT PORTC
#define LCD_DATA_DDR DDRC
 
#define LCD_LINES 3
#define LCD_COLS 16
 
/* SWITCH */
#define KEY_MP_DDR DDRC
#define KEY_MP_PORT PORTC
#define KEY_MP_PIN PINC
#define KEY_ENTER_DDR DDRD
#define KEY_ENTER_PORT PORTD
#define KEY_ENTER_PIN PIND
 
#define SW_MINUS 7
#define SW_PLUS 6
#define SW_ENTER 5
#define REPEAT_MASK (1<<SW_MINUS | 1<<SW_PLUS | 1<<SW_ENTER)
 
/* zusätzliche Timer in Abhängikeit vom Interrupttimer 0 - Keys */
#define TIMER0_1 50 // x * 10ms für Anzeige UBat
#define TIMER0_2 20 // x * 10ms für Bargraph und Diversity
#define TIMER0_3 2 // x * 10ms für RSSI Diversity
#define TIMER0_4 10 // x * 10ms für wi232 Nachführung Antenne
#define TIMER0_5 1000 // x * 10ms Hintergrundbeleuchtung 10 sekunden Schritte
#define BLINK_PERIOD 12 // abhängig von Tracking_GPS() in Task_0_4(void)
#define T2SECDIV 4000 // Divisor für Timer 2 - Ergebnis in Sekunden
#define M59S59 3599 // 3599 sind 59 Minuten und 59 Sekunden
#define T2PROD_M59S59 (uint32_t)T2SECDIV*M59S59
/* initiale Anfangswerte der Einstellungen */
#define EEP_INITB 75 // irgend ein Wert um beschriebenen EEPROM zu erkennen
#define VERSION "1.30"
#define CONTRAST3V 16 // 16 bei LCD 3,3V Bias 1/5 default Wert
#define CONTRAST5V 12 // 12 bei LCD 5V Bias 1/4
#define CONTRAST_MIN 0
#define CONTRAST_MAX 30
#define BACKGR_LIGHT 31 // Hintergrundbeleuchtung immer an
#define BACKGR_LIGHT_MIN 0 // Hintergrundbeleuchtung immer aus
#define BACKGR_LIGHT_MAX 31 // Hintergrundbeleuchtung immer an, z.Z.: Max = 5 Minuten
#define U_OFFSET 85 // um type float o. double zu vermeiden *100
#define U_OFFSET_MIN 0
#define U_OFFSET_MAX 200
#define U_MIN 960 // um type float o. double zu vermeiden *100
#define U_MIN_MIN 550 // auch für Lipo 2s
#define U_MIN_MAX 1400
#define CHANNEL 1 // default Wert
#define CHANNEL_MIN 1
#define CHANNEL_MAX 7
#define AV_SOURCE 0 // av1, av2, diversity
#define AV_SOURCE_MIN 0
#define AV_SOURCE_MAX 2
/* Toleranzen bei den RSSI-Spannungen ausgleichen */
#define UDBM_MIN 460 // RSSI geringste Feldstärke
#define UDBM_MAX 75 // RSSI größte Feldstärke
#define UDBM_KORR_FA 128 // Korrekturfaktor 1 * 128 RSSI1 korrigieren
/* Servo */
#define SERVO_PAN 0
#define SERVO_TILT 1
#define SERVO_NUM_CHANNELS 2 // Anzahl der angeschlossen Servos max. 2!!!
/* Servokalibrierungen derzeit zu SERVO_STEPS = 255 skaliert */
//prescaler 256
#define SERVO_I0_RIGHT 45 // default Wert, ca. 0,9ms
#define SERVO_I0_RIGHT_MIN 0 // Servokalibrierung Grenze der linken Position
#define SERVO_I0_RIGHT_MAX 100 // SERVO_MIN + SERVO_RIGHT
#define SERVO_I0_LEFT 45 // default Wert, ca. 2,1ms
#define SERVO_I0_LEFT_MIN 0 // Servokalibrierung Grenze der rechten Position
#define SERVO_I0_LEFT_MAX 100 // SERVO_MAX - SERVO_LEFT
#define SERVO_I0_MIDDLE SERVO_STEPS/2
#define SERVO_I0_MIDDLE_MIN SERVO_STEPS/2 - 25
#define SERVO_I0_MIDDLE_MAX SERVO_STEPS/2 + 25
//prescaler 64
#define SERVO_I1_RIGHT 180 // default Wert, ca. 0,9ms
#define SERVO_I1_RIGHT_MIN 0 // Servokalibrierung Grenze der linken Position
#define SERVO_I1_RIGHT_MAX 400 // SERVO_MIN + SERVO_RIGHT
#define SERVO_I1_LEFT 180 // default Wert, ca. 2,1ms
#define SERVO_I1_LEFT_MIN 0 // Servokalibrierung Grenze der rechten Position
#define SERVO_I1_LEFT_MAX 400 // SERVO_MAX - SERVO_LEFT
//#define SERVO_I1_MIDDLE ((SERVO_STEPS + 1) * 4 - 1)/2
#define SERVO_I1_MIDDLE_MIN ((SERVO_STEPS + 1) * 4 - 1)/2 - 100
#define SERVO_I1_MIDDLE_MAX ((SERVO_STEPS + 1) * 4 - 1)/2 + 100
 
#define SERVO_REV 0 // kein Reverse
/* Test Servo */
#define SERVO_PERIODE 20 // default Angabe in ms
#define SERVO_PERIODE_MIN 10 // 10ms
#define SERVO_PERIODE_MAX 30 // 30ms
#define SINGLE_STEP 0 // Einzelschritt aus
#define SINGLE_STEP_MIN 0
#define SINGLE_STEP_MAX 20 // bei prescaler 256, sonst * 4 (von links nach rechts in 9 Abschnitte)
// zwischen den Schritten muss Pause > der Servoperiode sein, sonst keine Aktualisierung
 
#define REPEAT 1
#define REPEAT_MIN 1
#define REPEAT_MAX 100
#define PAUSE 10
#define PAUSE_MIN 4 // mindestens 400ms, da mechanischer Servo-Lauf zur Position berücksichtigt werden muss
#define PAUSE_MAX 20 // Pause pro Links-, Mittel- und Rechtsposition 10*100ms
#define PAUSE_STEP 0
#define PAUSE_STEP_MIN 0 // Pause bei jeden Servoschritt in ms
#define PAUSE_STEP_MAX 200
/* Antennen-Nachführung */
#define TRACKING_MIN 0 // aus, TRACKING_RSSI, TRACKING_GPS, TRACKING_MKCOCKPIT, TRACKING_NMEA
#define TRACKING_MAX 4
/* Antennen-Nachführung per RSSI */
#define TRACKING_HYSTERESE 40 // Hysterese bevor Tracking bei Richtungswechsel anspricht
#define TRACKING_HYST_MIN 0
#define TRACKING_HYST_MAX 100
/* MK Akku-Kapazität */
#define AKKU_NR_MIN 0
#define AKKU_NR_MAX 9
#define AKKU_CAPACITY 2500 // in mAh für Ermittlung verbleibende Flugzeit
#define AKKU_CAPACITY_MIN 1000
#define AKKU_CAPACITY_MAX 6000
#define MK_I_OFFSET 8 // Standart 0.3
#define MK_I_OFFSET_MIN 0 // -0.5 (+0,5A ist auch der vom MK gesendete konstante Offset)
#define MK_I_OFFSET_MAX 20
#define MK_I_OFFSET_5 5 // entspricht -0.5
#define MK_I_FAKTOR 80
#define MK_I_FAKTOR_MIN 30 // Angabe * 100
#define MK_I_FAKTOR_MAX 200
#define MK_W_FAKTOR 80
#define MK_W_FAKTOR_MIN 30
#define MK_W_FAKTOR_MAX 200
 
#endif /* CONFIG_H_ */
/NGVideo5_8/tags/V1.30/dogm.c
0,0 → 1,299
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using DOGM-Library 1.0. */
/* Copyright (C) 2010-averyfarwaydate Luca Bertoncello */
/* Hartigstrasse, 12 - 01127 Dresden Deutschland */
/* E-Mail: lucabert@lucabert.de, lucabert@lucabert.com */
/* http://www.lucabert.de/ http://www.lucabert.com/ */
/****************************************************************/
 
#include <util/delay.h>
 
#include "config.h"
#include "dogm.h"
#include <avr/pgmspace.h>
#include <string.h>
 
// Instruktionen mit ST7036 4 Bit Mode im "Extension mode"
#define CLEAR_DISPLAY 0b00000001
#define FUNCTION_SET_INIT_0 0b00110011 // 0x30 & 0x30 als nibble
#define FUNCTION_SET_INIT_1 0b00110010 // 0x30 & 0x20 als nibble
#define FUNCTION_SET_INIT_2 0b00101001 // 0x29 4-bit, 2 Zeilen, kein DoubleHeight, InstructionTable1
#define INSTRUCTION_Table_0 0b00101000 // Instruction table 0
#define INSTRUCTION_Table_1 0b00101001 // Instruction table 1
#define SET_CGRAM 0b01000000 // für user defined Char
#define BIAS_SET 0b00010101 // table 1 DB3=Bias 1/4, DB0=3 Zeilen 0b00011101
#define FOLLOWER_CONTROL 0b01101110 // nach Datenblattbsp. 3,3V DOGM bei 5V 0b01101100
#define CONTRAST_SET 0b01110000 // Kontrastwert Bit3 bis Bit0
#define POWER_CONTRAST 0b01010100 // Bit1 und Bit0 entspricht Kontrastwert Bit5 und Bit4 3,3V 0b0101 0100 5V 0b0101 0000
#define DISPLAY_ON 0b00001100
#define ENTRY_MODE 0b00000110 // Cursor Auto-Increment
#define SET_DDRAM_ADDR 0b10000000 // Bit7 bis Bit0 Adresse
#define BS 3 // 0 - 1/5 bias // 1 - 1/4 bias
#define RAB1 1 // select follower amplified ratio
#define BON 2 // set booster circuit on/off bei Power_Contrast
 
#define lcdSetEnable() LCD_E_PORT |= (1<<LCD_ENABLE);
#define lcdClearEnable() LCD_E_PORT &= ~(1<<LCD_ENABLE);
#define lcdSetRegSelect() LCD_RS_PORT |= (1<<LCD_REGSELECT)
#define lcdClearRegSelect() LCD_RS_PORT &= ~(1<<LCD_REGSELECT)
 
uint8_t CursorPos; // ersetzt lesen der aktuellen LCD-CursorPosition
 
/************************************************************************************/
/* sendet ein Nibble (4 Bit) zum LCD-Controller */
/* Parameter: */
/* char data :Byte */
/* */
/************************************************************************************/
void lcdSendNibble(char data)
{
LCD_DATA_PORT |= (data & 0x0f);
LCD_DATA_PORT &= (data | 0xf0);
lcdSetEnable();
_delay_us(2);
lcdClearEnable();
_delay_us(30); // nach Datenblatt > 26,3µs
}
 
/************************************************************************************/
/* sendet 8 Bit (2 Nibble) zum LCD-Controller */
/* Parameter: */
/* char data :Byte */
/* */
/************************************************************************************/
void lcdSendByte(char data)
{
lcdSendNibble(data>>4);
lcdSendNibble(data);
}
 
/************************************************************************************/
/* sendet instruction zum LCD-Controller */
/* Parameter: */
/* char instruction :Byte */
/* */
/************************************************************************************/
void lcdSendInstruction(char instruction)
{
lcdClearRegSelect(); // LCD-RS für Instruktionen
lcdSendByte(instruction);
}
 
/************************************************************************************/
/* sendet ein Zeichen zum LCD-Display */
/* Parameter: */
/* char c :Zeichen */
/* */
/************************************************************************************/
void lcdSendC(char c)
{
lcdSetRegSelect(); // LCD-RS für Daten
lcdSendByte(c);
}
 
/************************************************************************************/
/* sendet ein Zeichen zum LCD-Display */
/* Parameter: */
/* char c :Zeichen */
/* */
/************************************************************************************/
void lcdPutc(char c)
{
lcdSendC(c);
CursorPos++;
if (CursorPos >= (LCD_LINES * LCD_COLS)) CursorPos = 0;
}
 
/************************************************************************************/
/* sendet einen String zum LCD-Display */
/* Parameter: */
/* char *str :Zeichenkette */
/* */
/************************************************************************************/
void lcdPuts(char *str)
{ uint8_t pos = CursorPos / LCD_COLS;
 
while (*str) {
if (*str == '\n') {
if (pos >= LCD_LINES)
pos = 0;
else
pos++;
lcdGotoXY(0, pos);
}
else
lcdPutc(*str);
str++;
}
}
 
/************************************************************************************/
/* stellt eine String mittig auf Display dar */
/* Parameter: */
/* char *str : darzustellende Zeichenkette */
/* uint8_t zle : Display-Zeile */
/* */
/************************************************************************************/
void lcdPutStrMid(char *str, uint8_t zle)
{ int8_t x;
 
lcdClearLine(zle);
x = (LCD_COLS - strlen(str))/2; // Array-String mittig schreiben
lcdGotoXY(x,zle);
lcdPuts(str);
}
 
/************************************************************************/
/* Definieren eines Sonderzeichen */
/* Parameter: */
/* uint8_t lcd_addr : Adresse, 1.Adresse 0 */
/* char *lcd_zeichen: Zeiger auf das 1. Byte der Zeichendefinition */
/* */
/************************************************************************/
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr)
{ int8_t i;
 
lcdSendInstruction(INSTRUCTION_Table_0);
for(i = 0; i < 8; i++)
{
lcdSendInstruction(SET_CGRAM | (lcd_addr * 8 + i)); // CG RAM Adresse
//lcdPutc(lcdChr[i]); // Data Write 8x Pixelzeile
lcdPutc(pgm_read_byte(&lcdChr[i])); // array im Flash
}
lcdSendInstruction(INSTRUCTION_Table_1);
}
 
/************************************************************************/
/* Definieren von n <= 8 Sonderzeichen */
/* Parameter: */
/* SpecialChr_t lcdChr : Array mit Sonderzeichen */
/* uint8_t quantity : Anzahl der zu übertragenen Sonderzeichen */
/* */
/************************************************************************/
void lcdWriteCGRAM_Array(SpecialChr_t *lcdChr, uint8_t quantity)
{
for (uint8_t i = 0; i < quantity; i++)
lcdWriteCGRAM(i, lcdChr[i]); // Sonderzeichen in CGRAM der LCD schreiben
}
 
/************************************************************************************/
/* Löscht Inhalt auf LCD-Display */
/* */
/************************************************************************************/
void lcdClear()
{
lcdSendInstruction(CLEAR_DISPLAY);
CursorPos = 0;
_delay_ms(2);
}
 
/************************************************************************************/
/* Löscht Inhalt ab Cursorposition bis Zeilenende auf LCD-Display */
/* CursorPos bleibt auf ab zu löschenden Zeichen */
/* */
/************************************************************************************/
void lcdClearEOL()
{ uint8_t cp = CursorPos % LCD_COLS;
if (cp > 0) //falls letztes Zeichen auf letzte Spalte geschrieben, nicht nächste Zeile löschen
for (; cp < LCD_COLS; cp++) lcdSendC(' ');
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* Löscht Inhalt der angegebenen Zeile auf LCD-Display */
/* CursorPos bleibt auf Zeilenanfang */
/* */
/************************************************************************************/
void lcdClearLine(uint8_t y)
{
lcdGotoXY(0, y);
for (uint8_t x = 0; x < LCD_COLS; x++) lcdSendC(' ');
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* Setzt Kontrast auf LCD-Display */
/* Parameter: */
/* uint8_t contrast :Wert vo 0 bis max 63 */
/* */
/************************************************************************************/
void lcdContrast(uint8_t dogm, uint8_t contrast)
{ uint8_t power_contrast = POWER_CONTRAST;
 
if(dogm == DOGM5V) {
power_contrast &= ~(1<<BON);
}
lcdSendInstruction(INSTRUCTION_Table_1);
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F));
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03));
}
 
//***********************************************************************************/
/* Setzt setzt den Cursor zur Position x/y */
/* Parameter: */
/* uint8_t x, :Position Spalte */
/* uint8_t y, :Position Zeile */
/* */
/************************************************************************************/
void lcdGotoXY(uint8_t x, uint8_t y)
{
if(x > LCD_COLS) x = 0;
if(y > LCD_LINES) y = 0;
CursorPos = y * LCD_COLS + x;
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* Initialisiert den LCD-Controller und der Atmega-Ausgänge */
/* Parameter: */
/* uint8_t dogm :0=3,3V oder 1=5V DOGM */
/* uint8_t contrast :Wert vo 0 bis max 63 */
/* uint8_t cursor :Darstellung des Cursors ein oder 0 aus */
/* uint8_t blink :Cursor blinken, 0 kein blinken */
/* */
/************************************************************************************/
void lcdInit(uint8_t dogm, uint8_t contrast, uint8_t cursor, uint8_t blink)
{ uint8_t bias_set = BIAS_SET;
uint8_t follower_ctrl = FOLLOWER_CONTROL;
uint8_t power_contrast = POWER_CONTRAST;
 
LCD_BACKLIGHT_DDR |= (1<<LCD_BACKLIGHT);
LCD_E_DDR |= (1<<LCD_ENABLE);
LCD_RS_DDR |= (1<<LCD_REGSELECT);
LCD_DATA_DDR |= (1<<LCD_DATA7) | (1<<LCD_DATA6) | (1<<LCD_DATA5) | (1<<LCD_DATA4);
 
lcdClearEnable();
_delay_ms(40); // lt. Datenblatt muss > 40ms nach Power On or ext. Reset
 
if(dogm == DOGM5V) {
follower_ctrl &= ~(1<<RAB1);
bias_set |= (1 << BS);
power_contrast &= ~(1<<BON);
}
 
//Initialisierung für DOGM (mit ST7036) 4 Bit Mode
lcdClearRegSelect(); // LCD-RS für Instruktionen
lcdSendNibble(FUNCTION_SET_INIT_0>>4);
_delay_ms(2); // lt. Datenblatt muss > 1,6ms Pause nach ersten Nibble
lcdSendNibble(FUNCTION_SET_INIT_0);
lcdSendInstruction(FUNCTION_SET_INIT_1);
lcdSendInstruction(FUNCTION_SET_INIT_2);
lcdSendInstruction(bias_set);
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F));
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03));
lcdSendInstruction(follower_ctrl);
lcdSendInstruction(INSTRUCTION_Table_0);
lcdSendInstruction(DISPLAY_ON | (cursor & 0x01) << 1 | (blink & 0x01));
lcdClear();
lcdSendInstruction(ENTRY_MODE);
}
/NGVideo5_8/tags/V1.30/dogm.h
0,0 → 1,44
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using DOGM-Library 1.0. */
/* Copyright (C) 2010-averyfarwaydate Luca Bertoncello */
/* Hartigstrasse, 12 - 01127 Dresden Deutschland */
/* E-Mail: lucabert@lucabert.de, lucabert@lucabert.com */
/* http://www.lucabert.de/ http://www.lucabert.com/ */
/****************************************************************/
 
#ifndef DOGM_H_
#define DOGM_H_
 
#include <avr/io.h>
 
#define DOGM3V 0 // 3,3V DOGM
#define DOGM5V 1 // 5V DOGM
 
typedef char SpecialChr_t[8];
 
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr); // write a char string to CGRAM
void lcdWriteCGRAM_Array(SpecialChr_t *lcdChr, uint8_t quantity); // write a array of char string to CGRAM
void lcdSendInstruction(char instruction);
void lcdPutc(char c);
void lcdPuts(char *str);
void lcdPutStrMid(char *str, uint8_t zle);
void lcdClear(void);
void lcdClearEOL(void);
void lcdClearLine(uint8_t y);
void lcdContrast(uint8_t dogm, uint8_t contrast);
void lcdGotoXY(uint8_t x, uint8_t y);
void lcdInit(uint8_t dogm, uint8_t contrast, uint8_t cursor, uint8_t blink);
 
#define lcdBacklightOn() LCD_BACKLIGHT_PORT |= (1<<LCD_BACKLIGHT);
#define lcdBacklightOff() LCD_BACKLIGHT_PORT &= ~(1<<LCD_BACKLIGHT);
 
#endif /* DOGM_H_ */
/NGVideo5_8/tags/V1.30/keys.c
0,0 → 1,135
 
/************************************************************************/
/* */
/* Debouncing 8 Keys */
/* Sampling 4 Times */
/* With Repeat Function */
/* */
/* Author: Peter Dannegger */
/* danni@specs.de */
/* */
/* Ergänzt: gebad, beschschleunigende Tastenwiederholung */
/* */
/************************************************************************/
 
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
 
#include "keys.h"
#include "config.h"
 
ISR( TIMER0_OVF_vect ) // every 10ms
{
static uint8_t ct0, ct1, rpt, timer0_1, timer0_2, timer0_3, timer0_4;
static uint16_t timer0_5 = TIMER0_5;
uint8_t i, key_pin;
 
TCNT0 = 256 - (F_CPU / 1024 * 10e-3) + 0.5; // preload for 10ms 8bit-Timer
 
key_pin = (KEY_MP_PIN & ( (1<<KEY_MINUS) | (1<<KEY_PLUS)));
key_pin |= (KEY_ENTER_PIN & (1<<KEY_ENTER)) >> 2;// move enter bit to sw_enter bit
i = key_state ^ ~key_pin; // key changed ?
ct0 = ~( ct0 & i ); // reset or count ct0
ct1 = ct0 ^ (ct1 & i); // reset or count ct1
i &= ct0 & ct1; // count until roll over ?
key_state ^= i; // then toggle debounced state
key_press |= key_state & i; // 0->1: key press detect
if (key_press & REPEAT_MASK) { // da bei mir alle Tasten in REPEAT_MASK
light_count = 0; // wenn keine Taste gedrückt beginnt Zähler für Hintergrundbeleuchtung aus
timer0_5 = TIMER0_5;
}
if( (key_state & REPEAT_MASK) == 0 ) { // check repeat function
rpt = REPEAT_START; // start delay
key_repeat_next = REPEAT_NEXT; // Wert bestimmt Tasten-Beschleunigung/-Wiederholrate beginnt, mit 200ms
key_counter = REPEAT_ACC_N; // wenn V_REPEAT, nach dem angegebenen Zeichen beschleunigen
}
if( --rpt == 0 ){
rpt = key_repeat_next; // repeat delay
key_rpt |= key_state & REPEAT_MASK;
}
if ( --timer0_1 == 0) {
timer0_1 = TIMER0_1;
task_timer0_1 = 1;
}
if ( --timer0_2 == 0) {
timer0_2 = TIMER0_2;
task_timer0_2 = 1;
}
if ( --timer0_3 == 0) {
timer0_3 = TIMER0_3;
task_timer0_3 = 1;
}
if ( --timer0_4 == 0) {
timer0_4 = TIMER0_4;
task_timer0_4 = 1;
}
if ( --timer0_5 == 0) {
timer0_5 = TIMER0_5;
task_timer0_5 = 1;
}
}
 
///////////////////////////////////////////////////////////////////
//
// check if a key has been pressed. Each pressed key is reported
// only once
//
uint8_t Get_Key_Press( uint8_t key_mask )
{
cli(); // read and clear atomic !
key_mask &= key_press; // read key(s)
key_press ^= key_mask; // clear key(s)
sei();
return key_mask;
}
 
///////////////////////////////////////////////////////////////////
//
// check if a key has been pressed long enough such that the
// key repeat functionality kicks in. After a small setup delay
// the key is reported beeing pressed in subsequent calls
// to this function. This simulates the user repeatedly
// pressing and releasing the key.
//
uint8_t Get_Key_Rpt( uint8_t key_mask )
{
cli(); // read and clear atomic !
key_mask &= key_rpt; // read key(s)
key_rpt ^= key_mask; // clear key(s)
sei();
return key_mask;
}
 
///////////////////////////////////////////////////////////////////
//
uint8_t Get_Key_Short( uint8_t key_mask )
{
cli(); // read key state and key press atomic !
return Get_Key_Press( ~key_state & key_mask );
}
 
///////////////////////////////////////////////////////////////////
//
uint8_t Get_Key_Long( uint8_t key_mask )
{
return Get_Key_Press( Get_Key_Rpt( key_mask ));
}
 
void Key_Speedup_rpt( uint8_t speedup )
{
if (speedup) {
if (key_counter > 0) { // nach x Zeichen wird Wiederholrate kontinuierlich erhöht
cli();
key_counter--;
sei();
}
else {
if (key_repeat_next > 3) { // jetzt beschleunigen, Wert bestimmt die max. Beschleunigung/Wiederholrate
cli(); // kann jedoch nicht kleiner 10ms sein
key_repeat_next -= 2; // noch etwas schneller
sei();
}
}
}
}
/NGVideo5_8/tags/V1.30/keys.h
0,0 → 1,43
 
/************************************************************************/
/* */
/* Debouncing 8 Keys */
/* Sampling 4 Times */
/* With Repeat Function */
/* */
/* Author: Peter Dannegger */
/* danni@specs.de */
/* */
/* Ergänzt: gebad, beschschleunigende Tastenwiederholung */
/* */
/************************************************************************/
 
#ifndef KEYS_H_
#define KEYS_H_
 
#define REPEAT_START 50 // after 500ms
#define REPEAT_NEXT 20 // every 200ms
#define REPEAT_ACC_N 6 // wenn V_REPEAT, nach dem angegebenen Zeichen beschleunigen
 
volatile uint8_t key_state; // debounced and inverted key state:
// bit = 1: key pressed
volatile uint8_t key_press; // key press detect
volatile uint8_t key_rpt; // key long press and repeat
volatile uint8_t key_repeat_next;
volatile uint8_t key_counter;
 
volatile uint8_t task_timer0_1;
volatile uint8_t task_timer0_2;
volatile uint8_t task_timer0_3;
volatile uint8_t task_timer0_4;
volatile uint8_t task_timer0_5;
 
uint8_t Get_Key_Press( uint8_t key_mask );
uint8_t Get_Key_Rpt( uint8_t key_mask );
uint8_t Get_Key_Short( uint8_t key_mask );
uint8_t Get_Key_Long( uint8_t key_mask );
void Key_Speedup_rpt( uint8_t speedup );
 
volatile uint16_t light_count; // muss bei jeden Tastendruck auf 0 gesetzt werdwn
 
#endif /* KEYS_H_ */
/NGVideo5_8/tags/V1.30/lipo.c
0,0 → 1,91
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/eeprom.h>
#include <stdlib.h>
#include <string.h>
#include "ngvideo.h"
#include "dogm.h"
#include "menue.h"
#include "mk.h"
 
uint8_t mk_UBat; // Battery Voltage in 0.1 Volts
uint16_t mk_dUsedCapacity = 0;
uint16_t mk_Ikorr;
 
uint8_t mk_akku_nr = AKKU_NR_MIN;
uint8_t mk_i_offset = MK_I_OFFSET;
uint8_t mk_i_faktor = MK_I_FAKTOR;
uint8_t mk_w_faktor = MK_W_FAKTOR;
mk_current_t mk_current = {0, 0};
mk_lipo_t mk_lipo = {0xff, AKKU_CAPACITY, 0, 0}; // Umk 255 ==> erste Inbetriebnahme keine Nachfrage Akku-Nr.
 
 
void store_LipoData(void)
{ uint32_t tmp_time_on;
 
tmp_time_on = eeprom_read_dword(&ep_mk_lipo[mk_akku_nr].time_on);
mk_timer = 0;
if (tmp_time_on != mk_lipo.time_on) {
if (!MK_Motor_run) mk_lipo.UsedCapacity = mk_dUsedCapacity;
eeprom_write_byte(&ep_mk_lipo[mk_akku_nr].Umk, mk_lipo.Umk);
eeprom_write_word(&ep_mk_lipo[mk_akku_nr].UsedCapacity, mk_lipo.UsedCapacity);
eeprom_write_dword(&ep_mk_lipo[mk_akku_nr].time_on, mk_lipo.time_on);
eeprom_write_block(&mk_current,&ep_mk_current,sizeof(mk_current_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
}
 
 
#define I_MOTOR_OFF 6 // IR=280mA gemessen; IR vom MK Akku voll 500mA; I Motoren an 1,3A; Grenzwert für Erkennung Akkuwechsel zwischen 500 und 1200mA
void MK_ProcessLipo(NaviData_t *navi_data)
{ char tmp_pmenu[sizeof(pmenu)];
mk_UBat = navi_data->UBat;
// Spannung, Strom, Leistung sofort (ohne Motorstart) lesen
if ((!MK_Motor_run) && (navi_data->Current <= I_MOTOR_OFF) && (mk_UBat > 0)) {
if (mk_UBat < mk_lipo.Umk)
mk_lipo.Umk = mk_UBat; // Bei Ruhestrom, da je nach Last mk_UBat schwankend
else
if (mk_UBat > (mk_lipo.Umk + 4)) { // Bei Ruhestrom kleiner 501mA Akku gewechselt? IR=280mA gemessen, 400mV Hysterese
// Akku des MK wurde gegen einen geladenen ausgetauscht
mk_lipo.Umk = mk_UBat;
mk_timer = 0;
mk_dUsedCapacity = 0;
mk_lipo.UsedCapacity = 0;
mk_lipo.time_on = 0;
lcdClear();
// Funktion wird innhalb Task ausgeführt, auch innerhalb eines anderen Menüpunkes oder Eingabeaufforderung
strcpy(tmp_pmenu, pmenu); // da bei Change_Value(...) ein Menüpunkt zurück
Menu_MK_BatteryChangeNr(); // eingeschobenes Menü, danach aber wieder zur ursprünglichen Anzeige! GPS ruft sich hier noch mal selbst auf!
strcpy(pmenu, tmp_pmenu); // Sonst müsste vorherige aktuelle LCD-Anzeige zwischengespeichert werden.
/* irgendeine Eingabe-While-Schleife (Menue, Change..) zum Verlassen zwingen und mit Jump_Menu(pmenu)
den gleichen Menüpunkt wieder aufrufen */
if (pmenu[0] == '\0')
Displ_Main_Disp();
else
exit_while = 1; // wird nach möglichen while, innerhalb der Fkt. wieder auf 0 gesetzt
store_LipoData();
}
}
mk_timer = 1; // MK-Timer auf on stellen
if (mk_current.Count > 18000) { // ungefär 30 Minuten Mittelwert
mk_current.Sum = (mk_current.Sum * 9)/10; // um 10% verkleinern
mk_current.Count = ((uint32_t)mk_current.Count * 9)/10;
}
if (navi_data->Current >= MK_I_OFFSET_5) { // keine negativen Zwischenergebnisse zulassen
mk_Ikorr = mk_i_offset + (uint32_t)(navi_data->Current - MK_I_OFFSET_5) * mk_i_faktor / 100;
mk_current.Sum += mk_Ikorr;
mk_current.Count++;
}
mk_dUsedCapacity = mk_lipo.UsedCapacity + (uint32_t)navi_data->UsedCapacity * mk_w_faktor / 100;
}
/NGVideo5_8/tags/V1.30/lipo.h
0,0 → 1,33
#ifndef _LIPO_H_
#define _LIPO_H_
 
#include "mk.h"
 
typedef struct {
uint8_t Umk;
uint16_t Capacity;
uint16_t UsedCapacity;
uint32_t time_on;
}mk_lipo_t;
 
typedef struct {
uint32_t Sum;
uint16_t Count;
}mk_current_t;
 
 
extern uint8_t mk_UBat; // Battery Voltage in 0.1 Volts
extern uint16_t mk_dUsedCapacity;
extern uint16_t mk_Ikorr;
 
extern mk_current_t mk_current;
extern uint8_t mk_akku_nr;
extern mk_lipo_t mk_lipo;
extern uint8_t mk_i_offset;
extern uint8_t mk_i_faktor;
extern uint8_t mk_w_faktor;
 
void store_LipoData(void);
void MK_ProcessLipo(NaviData_t *navi_data);
 
#endif
/NGVideo5_8/tags/V1.30/main.c
0,0 → 1,110
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <string.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#include "ngvideo.h"
#include "menue.h"
#include "servo.h"
#include "config.h"
#include "dogm.h"
#include "keys.h"
#include "usart.h"
#include "tracking.h"
 
int main(void)
{ uint8_t ep_reset = 1;
uint8_t val;
 
_delay_ms(100); // Einschaltstörungen unterdrücken
 
DDRB |= (1<<POWER);
PORTB &= ~(1<<POWER); //NOT(SHDN) LT1776
 
// switch init
KEY_MP_DDR &= ~((1<<KEY_MINUS) | (1<<KEY_PLUS));
KEY_ENTER_DDR &= ~((1<<KEY_ENTER));
// auf default rücksetzen - Tasten direkt lesen, da noch kein Interrupt
if( !(KEY_MP_PIN & ((1<<KEY_MINUS) | (1<<KEY_PLUS))))
--ep_reset;
 
Init_EEPROM(ep_reset);
 
// auf DOGM 5V/3,3V rück-/setzen - Tasten direkt lesen, da noch kein Interrupt
if(!((KEY_ENTER_PIN & (1<<KEY_ENTER)) || (KEY_MP_PIN & (1<<KEY_PLUS))))
Set_DOGM_Version();
 
DDRA |= (1<<CHANNel_12) | (1<<CHANNel_11) | (1<<CHANNel_10) | (1<<MUX_IN) | (1<<MUX_EN);
DDRB |= (1<<BEEPER) | (1<<CHANNel_02) | (1<<CHANNel_01) | (1<<CHANNel_00);
Set_Channel(channel);
ch_stored = channel;
PORTA &= ~(1<<MUX_EN); // MUX enable
 
ADC_Init();
// Timer 0 für Tasten und Anzeigen(Task's)
TCCR0B = (1<<CS02)|(1<<CS00); // divide by 1024
TIMSK0 |= 1<<TOIE0; // 8 bit Timer/Counter0 Overflow Interrupt aktiviert
 
// Timer 2 für Diversity vSync und GPS-Tracking MK Datensatz senden
TCCR2B = (1<<CS21) | (1<<CS20); // divide by 64
TIMSK2 |= 1<<TOIE2; // 8 bit Timer/Counter2 Overflow Interrupt aktiviert
 
// Interrupt für sync - RX-Umschaltung bei Diversity
DDRD &= ~((1<<VSYNC1) | (1<<VSYNC0));
//EICRA |= (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (1<<ISC00);// interrupt on INT0 and INT1 pin rising edge
EICRA |= (1<<ISC11) | (1<<ISC01); // interrupt on INT0 and INT1 pin falling edge
Set_AV_Source(av_source); // MUX auf av-x setzen; EIMSK Int0 und Int1 für Sync-Diversity ein
 
DDRD |= (1<<SERVO1) | (1<<SERVO2); // Servoports als Ausgang
if (tracking > TRACKING_MIN) // Servos sind nur bei Tracking und Servokalibrierung zugeschaltet
servoInit(SERVO_PERIODE);
 
// LCD init
lcdInit(dogm_vers, contrast, 0, 0);
lcd_BackgrLight_On();
lcdWriteCGRAM_Array(lcdSpecialChr, 7);
 
Displ_Version();
Double_Beep(DBEEPVERS, DBEEPVERSP);
 
sei();
 
if (language == NO_LANGUAGE) {
language = GERMAN; // Beim Einschalten pmenu[] vordefiniert mit "0"
Menu_Language();
}
 
Displ_Main_Disp();
 
while(1)
{
Task_0_1();
Task_0_2();
Tasks_invisible();
if (!bat_low) {
if (Get_Key_Short( 1<<SW_ENTER )) {
m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
Menu_Main();
}
val = Change_Value_plmi(channel, CHANNEL_MIN, CHANNEL_MAX, 0, 0, Displ_Channels, 1, C_REPEAT);
if (val != channel) { // nicht bei jeden Schleifendurchlauf Set_Channel()
channel = val;
Set_Channel(channel);
}
if (Get_Key_Long( 1<<SW_ENTER ) && tracking == TRACKING_NMEA) setNMEAdir(); // direction
}
}
}
/NGVideo5_8/tags/V1.30/makefile
0,0 → 1,412
# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al.
# Released to the Public Domain
# Please read the make user manual!
#
# Additional material for this makefile was submitted by:
# Tim Henigan
# Peter Fleury
# Reiner Patommel
# Sander Pool
# Frederik Rouleau
# Markus Pfaff
#
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
# 4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".
#
 
# MCU name
MCU = atmega644
 
## 16500000 is for attiny45/85/461/861 only (RC+PLL mode)
#CLK = 12000000UL
#CLK = 15000000UL
#CLK = 16000000UL
#CLK = 16500000UL
CLK = 20000000UL
#CLK = 18432000UL
 
#Fuse settings for ATmega644
ifeq ($(MCU), atmega644)
FUSE_BITS = -u -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0xfd:m
HEX_FILE_NAME = MEGA644
endif
 
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
 
# Target file name (without extension).
TARGET = Hexfiles/NGVideo_$(HEX_FILE_NAME)
 
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
 
# If there is more than one source file, append them above, or modify and
# uncomment the following:
SRC = main.c ngvideo.c menue.c dogm.c keys.c servo.c usart.c tools.c tracking.c lipo.c
 
 
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
 
 
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
EXTRAINCDIRS =
 
 
# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-adhlns=$(<:.c=.lst) \
$(patsubst %,-I%,$(EXTRAINCDIRS))
 
 
# Set a "language standard" compiler flag.
# Unremark just one line below to set the language standard to use.
# gnu99 = C99 + GNU extensions. See GCC manual for more information.
#CFLAGS += -std=c89
#CFLAGS += -std=gnu89
#CFLAGS += -std=c99
CFLAGS += -std=gnu99
 
 
 
# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
 
 
 
# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
 
 
 
# Additional libraries
 
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
 
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
 
# -lm = math library
LDFLAGS += -lm
 
 
 
 
# Programming support using avrdude. Settings and variables.
 
# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
 
#AVRDUDE_PROGRAMMER = AVR910
#AVRDUDE_PROGRAMMER = stk200
AVRDUDE_PROGRAMMER = USBasp
 
AVRDUDE_PORT = usb # programmer connected to USB port
#AVRDUDE_PORT = com1 # programmer connected to serial device
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port
 
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_BITS)
AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 
#AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -b 115200 -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
 
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE += -y
 
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_FLAGS += -V
 
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_FLAGS += -v -v
 
 
 
 
# ---------------------------------------------------------------------------
 
# Define directories, if needed.
DIRAVR = c:/WinAVR
#DIRAVR = C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\avr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib
 
 
# Define programs and commands.
SHELL = sh
 
CC = avr-gcc
 
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
 
 
# Programming support using avrdude.
AVRDUDE = avrdude
 
 
REMOVE = rm -f
COPY = cp
 
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
 
 
 
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
 
 
 
 
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
 
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
 
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(CLK) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
 
 
 
# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss $(TARGET).sym sizeafter finished end
 
 
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
 
finished:
@echo $(MSG_ERRORS_NONE)
 
end:
@echo $(MSG_END)
@echo
 
 
# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
 
sizeafter:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
 
 
 
# Display compiler version information.
gccversion :
@$(CC) --version
 
 
 
 
# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
 
 
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
 
 
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
 
 
 
 
# Program the device.
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
 
 
 
 
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
 
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
 
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
 
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
avr-nm -n $< > $@
 
 
 
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
 
 
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
 
 
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
 
 
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
 
 
 
 
 
 
# Target: clean project.
clean: begin clean_list finished end
 
clean_list :
@echo
@echo $(MSG_CLEANING)
# $(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
 
 
# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@
 
 
# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)
 
 
 
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program
 
/NGVideo5_8/tags/V1.30/menue.c
0,0 → 1,1787
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
 
#include "config.h"
#include "ngvideo.h"
#include "keys.h"
#include "menue.h"
#include "servo.h"
#include "tracking.h"
#include "messages.c"
#include "dogm.h"
#include "tools.h"
#include "usart.h"
#include "ngvideo.h"
 
typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX];
char pmenu[6] = {"0"}; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
uint8_t m_pkt; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt), Scroll_Menu zeigen
uint8_t servo_nr; // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden
uint8_t chrxs; // zum Laden lcdSpecialChrLs oder lcdSpecialChrRs
uint8_t exit_while = 0; // unabhängige Task (z.B: Menu_MK_BatteryChangeNr() - Aufruf) kann Eingabe while-Schleife beenden, wenn 1
 
// Menügliederung im Flash belassen
const char cmdStr0[] PROGMEM = "0";
const char cmdStr01[] PROGMEM = "01";
const char cmdStr02[] PROGMEM = "02";
const char cmdStr03[] PROGMEM = "03";
const char cmdStr031[] PROGMEM = "031";
const char cmdStr032[] PROGMEM = "032";
const char cmdStr033[] PROGMEM = "033";
const char cmdStr04[] PROGMEM = "04";
const char cmdStr05[] PROGMEM = "05";
const char cmdStr051[] PROGMEM = "051";
const char cmdStr052[] PROGMEM = "052"; // zwischen Servo 1 und 2 wird danach
const char cmdStr0521[] PROGMEM = "0521"; // mit global servo_nr unterschieden
const char cmdStr0522[] PROGMEM = "0522";
const char cmdStr0523[] PROGMEM = "0523";
const char cmdStr0524[] PROGMEM = "0524";
const char cmdStr053[] PROGMEM = "053";
const char cmdStr0531[] PROGMEM = "0531";
const char cmdStr0532[] PROGMEM = "0532";
const char cmdStr0533[] PROGMEM = "0533";
const char cmdStr0534[] PROGMEM = "0534";
const char cmdStr06[] PROGMEM = "06";
const char cmdStr061[] PROGMEM = "061";
const char cmdStr062[] PROGMEM = "062";
const char cmdStr0621[] PROGMEM = "0621";
const char cmdStr0622[] PROGMEM = "0622";
const char cmdStr0623[] PROGMEM = "0623";
const char cmdStr0624[] PROGMEM = "0624";
const char cmdStr0625[] PROGMEM = "0625";
const char cmdStr063[] PROGMEM = "063";
const char cmdStr064[] PROGMEM = "064";
const char cmdStr07[] PROGMEM = "07";
const char cmdStr071[] PROGMEM = "071";
const char cmdStr072[] PROGMEM = "072";
const char cmdStr08[] PROGMEM = "08";
const char cmdStr081[] PROGMEM = "081";
const char cmdStr082[] PROGMEM = "082";
const char cmdStr083[] PROGMEM = "083";
const char cmdStr0831[] PROGMEM = "0831";
const char cmdStr0832[] PROGMEM = "0832";
const char cmdStr0833[] PROGMEM = "0833";
const char cmdStr0834[] PROGMEM = "0834";
const char cmdStr0835[] PROGMEM = "0835";
const char cmdStr09[] PROGMEM = "09";
const char cmdStr0d[] PROGMEM = "0:"; // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
const char cmdStr0e[] PROGMEM = "0;"; // wird nur bei Tracking GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
const char cmdStr0e1[] PROGMEM = "0;1"; // nach '9' (0x39) folgt ':' (0x3a) ';' (0x3b)
const char cmdStr0e2[] PROGMEM = "0;2";
const char cmdStr0e3[] PROGMEM = "0;3";
const char cmdStr0e4[] PROGMEM = "0;4";
const char cmdStr0e5[] PROGMEM = RXTimeStr;
 
command_table_t command_table[] PROGMEM = // Befehls-Tabelle
{
{cmdStr0, Menu_Main},
{cmdStr01, Menu_AV_Source},
{cmdStr02, Menu_RX_Channel},
{cmdStr03, Menu_RSSI_Calibr},
{cmdStr031, Menu_RSSI_min},
{cmdStr032, Menu_RSSI_min_all},
{cmdStr033, Menu_RSSI_max},
{cmdStr04, Menu_Language},
{cmdStr05, Menu_Servo_Calibr},
{cmdStr051, Menu_Servo_Steps},
{cmdStr052, Menu_Servo1}, // zwischen Servo 1 und 2 wird danach
{cmdStr0521, Menu_Servo1_rev}, // mit global servo_nr unterschieden
{cmdStr0522, Menu_Servo1_left},
{cmdStr0523, Menu_Servo1_right},
{cmdStr0524, Menu_Servo1_middle},
{cmdStr053, Menu_Servo2},
{cmdStr0531, Menu_Servo2_rev},
{cmdStr0532, Menu_Servo2_left},
{cmdStr0533, Menu_Servo2_right},
{cmdStr0534, Menu_Servo2_middle},
{cmdStr06, Menu_Servo_Test},
{cmdStr061, Menu_Test_PulseWidth},
{cmdStr062, Menu_Test_Continuous},
{cmdStr0621, Menu_Test_Start},
{cmdStr0622, Menu_Test_SingleStep},
{cmdStr0623, Menu_Test_Repeat},
{cmdStr0624, Menu_Test_Pause},
{cmdStr0625, Menu_Test_Pause_Step},
{cmdStr063, Menu_Test_ServoNr},
{cmdStr064, Menu_Test_Frame},
{cmdStr07, Menu_lcd},
{cmdStr071, Menu_lcd_Contrast},
{cmdStr072, Menu_lcd_Backgr_Light},
{cmdStr08, Menu_Battery},
{cmdStr081, Menu_Low_U_Setup},
{cmdStr082, Menu_U_Offset},
{cmdStr083, Menu_MK_Battery},
{cmdStr0831, Menu_MK_BatteryNr},
{cmdStr0832, Menu_MK_BatteryCapacity},
{cmdStr0833, Menu_MK_I_Offset},
{cmdStr0834, Menu_MK_I_Faktor},
{cmdStr0835, Menu_MK_W_Faktor},
{cmdStr09, Menu_Tracking_Ant},
{cmdStr0d, Menu_Tracking_Option}, // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
{cmdStr0e, Menu_GPS_Display}, // wird nur bei Tracking GPS oder NMEA eingeblendet - SCROLL_MAIN_MAX wird geändert
{cmdStr0e1, Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a)
{cmdStr0e2, Menu_GPS_Display_FLAG},
{cmdStr0e3, Menu_GPS_Display_FLAG},
{cmdStr0e4, Menu_GPS_Display_FLAG},
{cmdStr0e5, Menu_GPS_Displ_RX_Time} // bei NMEA wird dieser Menüpunkt um 1 vorgezogen (anstelle GPS_MISC)
};
 
 
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct);
 
 
/**************************************************************/
/* */
/* Steuerung der Menüs */
/* */
/**************************************************************/
 
/************************************************************************************/
/* sucht nach übergebenen String in der Kommandotabelle und springt zum daneben */
/* stehenden Menü-Programm */
/* Parameter: */
/* char *pmenu :zu suchender String in Kommandotabelle */
/* */
/************************************************************************************/
void Jump_Menu(char *pmenu)
{ uint8_t i;
void (*func)(void);
 
if (pmenu[0] != '\0'){
for (i=0; i < sizeof(command_table) / sizeof(command_table_t); i++) {
// Ist das der gesuchte String?
if (!(strcmp_P(pmenu, (char*)pgm_read_word(&(command_table[i].menu_nr))))) {
func = (void(*)(void))pgm_read_word(&(command_table[i].fp));
func();
break;
}
}
}
}
 
/************************************************************************************/
/* */
/* Abfrage Short- oder Long-Enter */
/* verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False */
/* */
/************************************************************************************/
uint8_t Long_Enter(void)
{
Tasks_invisible(); // Dadurch ist Doppelaufruf von MK-GPS möglich!!! Nur bei Menu_MK_BatteryChangeNr()
// falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
U_Messen_cmp(DISABLE_BTIMER);
if (Get_Key_Long( 1<<SW_ENTER ) || bat_low) {
pmenu[0] ='\0'; // direkt in das Hauptprogramm
return 1;
}
else return 0;
}
 
uint8_t Short_Enter(void)
{ uint8_t ret;
 
// bis Short- oder Long-Enter, auch Akku leer
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while);
lcdClear();
if (pmenu[0] == '\0') Displ_Main_Disp(); else Beep(BEEPENTER); // bei ShortEnter Beep
ret = (pmenu[0] != '\0') && !exit_while;
exit_while = 0;
return(ret); // ShortEnter bringt 1 zurück
}
 
/************************************************************************************/
/* */
/* Unterprogramm vom Scroll_Menu(...) stellt Menüpunkte dar */
/* Parameter: */
/* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */
/* uint8_t scr_idx : ausgewählter Menüpunkt */
/* uint8_t scroll_max : scrollen bis Wert */
/* */
/************************************************************************************/
void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx)
{ uint8_t i;
if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0];
for (i = 0; i < LCD_LINES; i++) {
lcdGotoXY(2, i); // LCD Beginn x-Position, 2 Zeichen rechts eingerückt
lcdPuts(Msg(scr_menu[scr_idx + 1]));
lcdClearEOL(); // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr
if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0;
}
}
 
/************************************************************************************/
/* */
/* Unterprogramm vom Scroll_Menu(...) und Change_Value(...) */
/* bei Rücksprung auf ursprünglichen Menüpunkt zeigen */
/* Parameter: */
/* uint8_t l : Strinlänge von pmenue */
/* */
/************************************************************************************/
void return_m_pkt(uint8_t l)
{
if (l > 1) { // bei l=1 und Subtraktion 1 wird sowieso Displ_Main_Disp() ausgeführt und dort pmenu[0] = '\0' gesetzt
l--;
m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
pmenu[l] ='\0'; // auf letztes Zeichen Stringende schreiben
}
else Displ_Main_Disp();
}
 
/************************************************************************************/
/* */
/* scrollt Menü über Mehrzeilige LCD */
/* */
/* Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/
/* Taste<+> eine Zeile nach oben */
/* Taste<-> eine Zeile nach unten */
/* Parameter: */
/* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */
/* uint8_t scroll_max : scrollen bis Wert */
/* uint8_t scr_idx : Index für array von Displ_Scroll_Menu(...) */
/* */
/************************************************************************************/
void Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx)
{ uint8_t l;
 
lcdClear();
lcdGotoXY(0, 1);
lcdPutc(MARKER_SELECT); // '>>'
Displ_Scroll_Menu(scr_menu, scr_idx);
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while)
{
// >> Menueauswahl nach oben
if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )) {
if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0];
Displ_Scroll_Menu(scr_menu, scr_idx);
}
// >> Menueauswahl nach unten
if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0;
Displ_Scroll_Menu(scr_menu, scr_idx);
}
}
 
lcdClear();
if (exit_while) // wegen Aufruf Menu_MK_BatteryChangeNr() in Task
m_pkt = scr_idx; // nach Task Menu_MK_BatteryChangeNr() wieder zum ursprünlichen Anzeigepunkt
else {
l = strlen(pmenu);
if ((scr_idx == 0) || (l == 0)) // long Enter wird durch l == 0 brücksichtigt
return_m_pkt(l); // um bei Rücksprung auf ursprünglichen Menüpunkt zu zeigen oder Displ_Main_Disp()
else {
m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
pmenu[l] = scr_idx + '0'; // nächsten MenueIndex anhängen 1 oder 2 oder ...
pmenu[++l] ='\0';
Beep(BEEPENTER);
}
}
exit_while = 0;
}
 
/************************************************************************************/
/* */
/* Ändern der Werte mit Tasten +,- und Anzeige */
/* z.B. für U-Offset, Batterie leer Eingabe ... */
/* */
/* Parameter: */
/* uint16_t val :zu ändernter Wert */
/* uint16_t min_val, max_val :min, max Grenze Wert ändern darf */
/* uint8_t posX, posY :Darstellung Wert xPos, YPos auf LCD */
/* Displ_Fnct_t Displ_Fnct :Index um variable Display Funktion aufzurufen */
/* uint8_t cycle :0 begrenzt Anzeige bei man_val, bzw. max_val */
/* :1 springt nach max_val auf min_val und umgedreht */
/* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */
/* uint16_t Change_Value_plmi(...) :Rückgabe geänderter Wert */
/* */
/************************************************************************************/
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY, \
Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat)
{
// >> Menueauswahl nach oben
if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){
if (val < max_val) {
val++;
Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion
}
else
if (cycle) val = min_val;
lcdGotoXY(posX, posY); // lcd Position Wert
Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt
}
// >> Menueauswahl nach unten
if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
if (val > min_val) {
val--;
Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion
}
else
if (cycle) val = max_val;
lcdGotoXY(posX, posY); // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht
Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt
}
return(val);
}
 
/************************************************************************************/
/* */
/* Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige */
/* z.B. für U-Offset, Batterie leer Eingabe ... */
/* */
/* Parameter: */
/* uint16_t *val :zu ändernter Wert */
/* uint16_t min_val, max_val :min, max Grenze Wert ändern darf */
/* uint8_t fl_pos :Bit 7 beschleunigte Repeat-Funktion aus/ein */
/* Bit 6 zyklische Werteänderung aus/ein */
/* Bit 4-5 z.Z. ohne Funktion */
/* Bit 0-3 Wert xPos auf LCD */
/* Displ_Fnct_t Displ_Fnct :Index um variable Display Funktion aufzurufen */
/* uint8_t Change_Value(...) :Rückgabe geändert ergibt TRUE */
/* */
/************************************************************************************/
// Bei Bedarf könnte einfach innerhalp fl_pos auch noch pos_y (Bit 4-5) übergeben werden
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct)
{ uint16_t tmp_val;
 
tmp_val = *val;
lcdGotoXY(fl_pos & POSXMASK, ZLE_VAL); // Position Wert
Displ_Fnct(tmp_val); // initiale Wertdarstellung, je nach Menüpunkt
if (pmenu[0] =='\0') strcpy(pmenu, "0"); // sonst wird eventuell nachfolgende while-Schleife nicht ausgeführt
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while)
*val = Change_Value_plmi(*val, min_val, max_val, fl_pos & POSXMASK, ZLE_VAL, Displ_Fnct, fl_pos & (1<<CYCLE), fl_pos & (1<<V_REPEAT));
lcdClear();
if (exit_while) {
exit_while = 0;
*val = tmp_val;
}
else
return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
return(tmp_val != *val);
}
 
/**************************************************************/
/* */
/* LCD-Darstellungen der Menüs */
/* Zur Unterstützung der Auswahl werden einige Einstellungen */
/* sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag */
/* */
/**************************************************************/
 
/************************************************************************************/
/* zeigt Menü- * Überschrift * auf erste Zeile mittig auf Display an */
/* Parameter: */
/* uint8_t message : index (MSG_) der darzustellenden Zeichenkette */
/* */
/************************************************************************************/
void Displ_Title(uint8_t message)
{ uint8_t l;
uint8_t x = 0;
 
l = strlen(Msg(message));
if ( LCD_COLS > l) x = (LCD_COLS - l)/2;
if (x > 1) {
lcdGotoXY(x - 2, 0);
lcdPuts("* ");
lcdPuts(Msg(message));
lcdPutc(' ');
}
else {
lcdGotoXY(0, 0);
lcdPutc('*');
lcdGotoXY(x, 0);
lcdPuts(Msg(message));
lcdGotoXY(LCD_COLS - 1, 0);
}
lcdPutc('*');
}
 
/************************************************************************************/
/* zeigt bei Programmstart Firmware- und DOGM-Version auf Display an */
/* */
/************************************************************************************/
void Displ_Version(void)
{
lcdGotoXY(0, 0);
lcdPuts(Msg(MSG_VERSION1));
if (dogm_vers == DOGM3V)
lcdPuts(Msg(MSG_UHW33V));
else
lcdPuts(Msg(MSG_UHW5V));
lcdPuts(Msg(MSG_VERSION2));
delay_ms100x(30);
lcdClear();
}
 
/************************************************************************************/
/* zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an */
/* Parameter: */
/* uint16_t k :Index anzuzeigender Wert = Kanal + 0x30 als Char, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Channels(uint16_t k)
{ char *channels[] = {"5740", "5760","5780", "5800", "5820", "5840", "5860"};
 
lcdPutc(k+0x30);
lcdPuts(": ");
lcdPuts(channels[k-1]);
lcdPuts("MHz");
}
 
/************************************************************************************/
/* zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* unint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_AV_Source(uint16_t q)
{ uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY};
 
lcdPutStrMid(Msg(av_src_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Tracking-Varianten zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_sel_Tracking(uint16_t q)
{ uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT, MSG_TRACK_NMEA};
 
lcdPutStrMid(Msg(track_sel_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_track_TX(uint16_t q)
{ uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON};
 
lcdPutStrMid(Msg(track_TX_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt einen max. 3-stelligen Integerwert auf Display an */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Format_Int(uint16_t val)
{
lcdPuts(my_itoa(val, 3, 0, 0));
}
 
/************************************************************************************/
/* zeigt den Kontrastwert auf Display an mit sofortiger Änderung */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Set_Contrast(uint16_t val)
{
Displ_Format_Int(val);
lcdContrast(dogm_vers, val);
}
 
/************************************************************************************/
/* zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Backgr_Light(uint16_t val)
{ char str[5];
 
switch(val) {
case BACKGR_LIGHT_MIN : lcdPuts(Msg(MSG_LIGHT_OFF));
break;
case BACKGR_LIGHT_MAX : lcdPuts(Msg(MSG_LIGHT_ON));
break;
default : itoa (val * 10, str, 10);
lcdPutc(' ');
lcdPuts(str);
lcdPuts(Msg(MSG_SEC));
}
lcdClearEOL();
}
 
/************************************************************************************/
/* zeigt ein oder aus zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t val :0 = aus oder 1 = ein, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Off_On(uint16_t val)
{
if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON));
}
 
/************************************************************************************/
/* zeigt Servoschritte zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t val :0 = 255 oder 1 = 1023, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Steps(uint16_t val)
{ uint8_t servo_step_table[] = {MSG_STEPS_255, MSG_STEPS_1023};
 
lcdPutStrMid(Msg(servo_step_table[val]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition links auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Min(uint16_t val)
{ uint16_t steps = 0;
 
Displ_Format_Int(val);
servoSet_min(servo_nr, val); // Wert setzen damit nachfolgend die
if (servo[servo_nr].rev) steps = ServoSteps();
servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition rechts auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Max(uint16_t val)
{ uint16_t steps = ServoSteps();
 
Displ_Format_Int(val);
servoSet_max(servo_nr, val); // Wert setzen damit nachfolgend die
if (servo[servo_nr].rev) steps = 0;
servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition Mitte auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Mid(uint16_t val)
{ int16_t mid_val;
mid_val = val - ServoSteps()/2;
lcdPuts(my_itoa(mid_val, 4, 0, 0));
servoSet_mid(servo_nr, val); // Wert setzen damit nachfolgend die
servoSetPosition(servo_nr, ServoSteps()/2); // Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt zu testende Servonummer zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t val :0 = Servo 1 oder 1 = Servo 2, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_ServoNr(uint16_t val)
{
if (val == 0) lcdPuts(Msg(MSG_SERVO1)); else lcdPuts(Msg(MSG_SERVO2));
}
 
 
/************************************************************************************/
/* zeigt Servoausschlag in ms, in % und als Bargraph auf Display an */
/* Parameter: */
/* int16_t PosProzent : aktuell eingestellte Position vom 0-Punkt (Mitte) aus */
/* int16_t range : maximaler absoluter Ausschlag vom 0-Punkt aus */
/* */
/************************************************************************************/
// leerer Rahmen für Bar
char* empty_Bar(void)
{ static char tmp_empty[LCD_COLS];
uint8_t i;
tmp_empty[0] = '\0'; // '['
for (i = 1; i < 15; i++)
tmp_empty[i] = '\x07';
tmp_empty[i] = '\x06'; // ']'
return(tmp_empty);
}
 
void draw_bar(int16_t PosProzent, int16_t range, uint8_t zle)
{ int8_t i, sp_quad, sp_ch;
int8_t lz = 8;
char* bar;
bar = empty_Bar(); // leerer Rahmen für Bar
sp_quad = abs(PosProzent) * 7 / range; // Anzahl der vollen Kästchen
 
sp_ch = (abs(PosProzent) -(range * sp_quad / 7)) * 35 / range; // Unterteilung Kästchen in 6 senkrechte Striche
if (sp_ch > 4) sp_ch = 4; // bei 28 (7*4) wäre keine Korrektur erforderlich aber so kontinuierlicher
if (PosProzent < 0){
lz -= sp_quad; // Position für volles Kästchen bei Linksausschlag
if (sp_ch > 0) bar[lz-1] = sp_ch; // vor erstes volles Kästchen Kästchenunterteilung schreiben
} // Unterteilung Kästchen der 4 senkrechte Striche nach Bar (0 und 5 entfallen)
else
if (sp_ch > 0) bar[lz+sp_quad] = sp_ch;// nach lezten vollen Kästchen Kästchenunterteilung schreiben
 
for (i = 0; i < sp_quad; i++)
bar[i+lz] = '\x05'; // volle Kästchen schreiben
lcdGotoXY(0,zle);
for (uint8_t i = 0; i < LCD_COLS; i++) lcdPutc(bar[i]);// kpl. Bar zum Display
}
 
uint16_t calc_range(int16_t PosProzent, int16_t min, int16_t max, int16_t mid)
{ uint16_t range;
 
if (PosProzent < 0) {
range = mid - min;
if (chrxs == CHRRS) { // falls Richtung geändert, anderen Zeichensatz laden
chrxs = CHRLS;
lcdWriteCGRAM_Array(lcdSpecialChrLs, 5);// LCD-Char mit Rahmensymbole vom Graph
}
}
else {
range = max - mid;
if (chrxs == CHRLS) { // falls Richtung geändert, anderen Zeichensatz laden
lcdWriteCGRAM_Array(lcdSpecialChrRs, 5);// LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRRS;
}
}
return(range);
}
 
void Displ_PulseWidth(uint16_t val)
{ int16_t PosProzent, range;
uint16_t Pos_us;
char me[3] = {"ms"};
 
servoSetPositionRaw(servo_nr, val);
PosProzent = val - steps_pw[sIdxSteps].mid;
range = calc_range(PosProzent, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, steps_pw[sIdxSteps].mid);
draw_bar(PosProzent, range, 2); // auf 3. Display-Zeile
PosProzent = (int32_t)1000 * PosProzent / range;
lcdGotoXY(1, 1);
Pos_us = pw_us(val); // Zeit in µs bei x Servoschritte
if (Pos_us < 1000) {
me[0] = 'u'; // soll 'µ' => programmierbarer Zeichensatz zu klein
lcdPuts(" ");
Displ_Format_Int(Pos_us);
}
else {
lcdPuts(my_itoa(Pos_us, 5, 3, 3));
}
lcdPuts(me);
lcdGotoXY(8, 1);
lcdPuts(my_itoa(PosProzent, 6, 1, 1));
lcdPutc('%');
}
 
/************************************************************************************/
/* zeigt Pausenlänge der Links-, Mittel- und Rechtsposition auf Display an */
/* Parameter: */
/* uint16_t val : Zeit in 1ms * 100 */
/* */
/************************************************************************************/
void Displ_Pause(uint16_t val)
{
if (val > 9) {
lcdPuts(my_itoa(val, 3, 1, 1));
lcdPuts("s ");
}
else {
Displ_Format_Int(val * 100);
lcdPuts("ms");
}
}
 
/************************************************************************************/
/* zeigt aus oder Integerwert auf Display an */
/* Parameter: */
/* uint16_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Off_Format_Int(uint16_t val)
{
if (val == 0)
lcdPutStrMid(Msg(MSG_OFF), ZLE_VAL);
else {
lcdGotoXY(5,ZLE_VAL);
Displ_Format_Int(val);
lcdPutc(' ');
}
}
 
/************************************************************************************/
/* zeigt aus oder Pausenzeit zwischen 2 Servoschritte auf Display an */
/* Parameter: */
/* uint16_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Pause_Step(uint16_t val)
{
Displ_Off_Format_Int(val);
if (val > 0) {
lcdGotoXY(8,ZLE_VAL);
lcdPuts("ms");
}
}
/************************************************************************************/
/* zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Baudrate(uint16_t q)
{ char str[7];
 
ltoa(getBaud(q), str, 10);
lcdPutStrMid(str, ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt aktive Empfängerzeiten auf Display an */
/* */
/************************************************************************************/
void Displ_RX_Time(void)
{
lcdGotoXY(6, 1);
Displ_TimeHMS(rxcount0);
lcdGotoXY(6, 2);
Displ_TimeHMS(rxcount1);
}
 
/************************************************************************************/
/* zeigt eingestellte Akku-Kapazität des MK auf Display an */
/* Parameter: */
/* uint16_t val :Akku-Kapazität in 50mAh Schritte */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_MK_Capacity(uint16_t val)
{
lcdPuts(my_itoa(val * 50, 4, 0, 0));
lcdPuts("mAh");
}
 
/************************************************************************************/
/* zeigt Offset (Korrektur Ruhestrom) für Strom des MK auf Display an */
/* Parameter: */
/* uint16_t val :Korrekturfaktor */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_I_Offset(uint16_t val)
{
lcdPuts(my_itoa((int8_t)val - MK_I_OFFSET_5,4,1,1));
lcdPutc('A');
}
 
 
/************************************************************************************/
/* zeigt Korrekturfaktor für Strom und Arbeit des MK auf Display an */
/* Parameter: */
/* uint16_t val :Korrekturfaktor */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Faktor_2Nk(uint16_t val)
{
lcdPuts(my_itoa(val,4,2,2));
}
 
/************************************************************************************/
/* zeigt den Marker in Hauptdarstellung auf selektierten RX an */
/* d Diversity, << fester RX */
/* Parameter: */
/* uint8_t p :x-Position des Markers */
/* uint8_t marker :Markerzeichen z.B.:'' oder 'd' oder 's' */
/* */
/************************************************************************************/
void Displ_AV_Mark(uint8_t p, char marker)
{
if (p < 2) {
lcdGotoXY(15,2 - p); // da p immer neue Position 0 oder 1
lcdPutc(' '); // bisherigen AVx-, Diversity-Marker löschen
lcdGotoXY(15,p + 1); // an neuer Positon
lcdPutc(marker); // übergebenes Markerzeichen darstellen
}
else { // falls beim Einschalten Diversity auf aktiv, keine Marker
lcdGotoXY(15,1);
lcdPutc(' ');
lcdGotoXY(15,2);
lcdPutc(' ');
}
}
 
/************************************************************************************/
/* Hauptanzeige unter Berücksichtigung von VBat */
/* */
/************************************************************************************/
void SetAndDispl_AV_Mark(void)
{ char marker;
 
marker = av_source < DIVERSITY? MARKER_AV : MARKER_RSSI; // wird nur bei gesetzten Diversity überschrieben
Displ_AV_Mark(sw_avx, marker);
}
 
void Displ_Main_Disp(void)
{
pmenu[0] ='\0'; // bei Direktansprung z.B. von Menu_RSSI_min() erforderlich
lcdClear();
if (!bat_low) {
lcdClear();
Displ_Channels(channel);
lcdGotoXY(LCD_COLS - 1, 0);
lcdPuts("V\n1\n2");
SetAndDispl_AV_Mark();
Displ_VBat(); // muss zuletzt stehen
}
else {
lcdPutStrMid(Msg(MSG_ACCU_LOW), 0);
}
}
 
 
 
/**************************************************************/
/* */
/* Menüs */
/* */
/**************************************************************/
 
/**************************/
/* */
/* Haupmenü */
/* */
/**************************/
void Menu_Main(void)
{ scr_menu_t scr_main_menu = {SCROLL_MAIN_MAX-4, MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, \
MSG_SERVO_CALIBR, MSG_TEST_SERVO, MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY};
 
switch(tracking) {
case TRACKING_RSSI: scr_main_menu[11] = MSG_TRACK_SERVO_HYTERESE;
scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen
break;
case TRACKING_GPS: scr_main_menu[11] = MSG_TRACK_TX_OSD_DATA;
scr_main_menu[0] += 2; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS MSG_GPS_DISPLAY
break;
case TRACKING_NMEA: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS
case TRACKING_MKCOCKPIT: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen
scr_main_menu[11] = MSG_COM;
break;
}
strcpy(pmenu, "0");
Scroll_Menu(scr_main_menu, m_pkt); // pmenu global
Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return
}
 
/**************************/
/* */
/* AV-Quelle */
/* */
/**************************/
void Menu_AV_Source(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_AV_SOURCE);
tmp_val = av_source;
if (Change_Value(&tmp_val, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, Displ_AV_Source)) { // pmenu global
cli();
av_source = tmp_val;
eeprom_write_byte(&ep_av_source, av_source);
Double_Beep(DBEEPWR, DBEEPWRP);
sw_avx = Set_AV_Source(av_source);
if (pmenu[0] == '\0') // sonst ist AV-Source marker bei long Enter im Hauptdisplay nicht aktuallisiert
SetAndDispl_AV_Mark();
sei();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Kanal */
/* */
/**************************/
void Menu_RX_Channel(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_RX_CHANNEL);
tmp_val = channel;
if (Change_Value(&tmp_val, CHANNEL_MIN, CHANNEL_MAX, 3, Displ_Channels) || (tmp_val != ch_stored)) { // pmenu global
channel = tmp_val;
ch_stored = tmp_val;
eeprom_write_byte(&ep_channel, channel);
Double_Beep(DBEEPWR, DBEEPWRP);
Set_Channel(channel);
if (pmenu[0] == '\0') { // sonst ist channel im Hauptdisplay nicht aktuallisiert
lcdGotoXY(0,0);
Displ_Channels(channel); // da erst jetzt die Variable für main_display geändert ist!
}
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* RSSI */
/* */
/**************************/
void Menu_RSSI_Calibr(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5-2, MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MIN_ALL, MSG_RSSI_MAX};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void AdviceTX(uint8_t msg)
{ char str[20];
 
strcpy(str, Msg(MSG_TX));
strcat(str, Msg(msg));
lcdPutStrMid(str, 1);
lcdPutStrMid(Msg(MSG_CONTINUE), 2);
}
 
void Menu_RSSI_min(void)
{
Displ_Title(MSG_RSSI_MIN);
AdviceTX(MSG_TX_OFF);
if (Short_Enter()) { // pmenu global
RSSI_Min_Calibrate(0, bar_udbm);
Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist!
}
else
Jump_Menu(pmenu);
}
 
void Displ_RSSImin_allError(char *str_ch)
{ char str[LCD_COLS + 1];
lcdClear();
strcpy(str, Msg(MSG_CALIB));
strcat(str, "-");
strcat(str, Msg(MSG_ERROR));
lcdPutStrMid(str,0);
lcdPutStrMid(Msg(MSG_RX_CHANNEL),1);
lcdPutStrMid(str_ch, 2);
delay_ms100x(30);
}
 
void Menu_RSSI_min_all(void)
{ char not_cal[15];
uint8_t f = 0;
 
Displ_Title(MSG_RSSI_MIN_ALL);
AdviceTX(MSG_TX_OFF);
if (Short_Enter()) { // pmenu global
for ( uint8_t i = 1; i <= CHANNEL_MAX; i++) {
Set_Channel(i);
if (!RSSI_Min_Calibrate(i, bar_udbm)) {
not_cal[f++] = i + 0x30;
not_cal[f++] = ',';
}
}
Set_Channel(channel);
Double_Beep(DBEEPWR, DBEEPWRP);
if (f > 0) { // Konnten einige Kanäle nicht auf RSSI-Min kalibiert werden?
not_cal[--f] = '\0'; // letzes Komma durch Stringende ersetzen
Displ_RSSImin_allError(not_cal);
}
Displ_Main_Disp();
}
else
Jump_Menu(pmenu);
}
 
void Menu_RSSI_max(void)
{
Displ_Title(MSG_RSSI_MAX);
AdviceTX(MSG_TX_ON);
if (Short_Enter()) { // pmenu global
RSSI_Max_Calibrate(bar_udbm);
Displ_Main_Disp();
}
else
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Sprache */
/* */
/**************************/
void Displ_Language(uint16_t i)
{ uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH};
 
lcdPutStrMid(Msg(lanuage_table[i]), ZLE_VAL);
}
 
void Menu_Language(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_LANGUAGE);
tmp_val = language;
language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE
Change_Value(&tmp_val, GERMAN, LAST_LANG, 3, Displ_Language); // pmenu global
if (tmp_val != language) {
language = tmp_val;
eeprom_write_byte(&ep_language, language);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Servo-Einstellungen */
/* */
/**************************/
void Menu_Servo_Calibr(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void NoTracking_ServosOff(void)
{
if (tracking == TRACKING_MIN) {
delay_ms100x(4); // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet
servoOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
}
}
 
void Servo_NewValues(uint8_t idx_presc)
{
for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
if (idx_presc == STEPS_255) { // Werte umrechnen für Prescaler = 256
servo[i].min /= 4;
servo[i].max /= 4;
servo[i].mid /= 4;
}
else { // Werte umrechnen für Prescaler = 64
servo[i].min *= 4;
servo[i].max *= 4;
servo[i].mid = (servo[i].mid + 1) * 4 - 1;
}
servoSet_min(i, servo[i].min);
servoSet_max(i, servo[i].max);
servoSet_mid(i, servo[i].mid);
eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t));
}
// Vorberechnung von ServoChannels[channel].duty
servoSetDefaultPos(); // Ausgangsstellung beider Servos
}
 
void Menu_Servo_Steps(void)
{ uint16_t tmp_val;
Displ_Title(MSG_SERVO_STEPS);
lcdGotoXY(8, ZLE_VAL);
tmp_val = sIdxSteps;
if (Change_Value(&tmp_val, STEPS_255, STEPS_1023, 5, Displ_Servo_Steps)) { // pmenu global
cli();
sIdxSteps = tmp_val;
eeprom_write_byte(&ep_sIdxSteps, sIdxSteps);
Servo_NewValues(sIdxSteps); // hier ist der neue Index anzugeben!
servoInit(SERVO_PERIODE);
sei();
NoTracking_ServosOff();
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Servo1(void)
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE};
Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global
servo_nr = 0;
Jump_Menu(pmenu);
}
 
void Menu_Servo2(void)
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE};
Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global
servo_nr = 1;
Jump_Menu(pmenu);
}
 
uint8_t Servo_tmp_on(uint8_t servo_period)
{ uint8_t tmp_tracking = tracking;
 
tracking = 0; // Servopositionierung durch tracking abschalten
if (tracking == TRACKING_MIN) servoInit(servo_period); // falls aus, Servos einschalten
lcdGotoXY(0, 0); // lcd Cursor vorpositionieren
return(tmp_tracking);
}
 
void Servo_tmp_Original(uint8_t track)
{
servoSetDefaultPos();
tracking = track; // ursprünglicher Wert Tracking aus, RSSI oder GPS
NoTracking_ServosOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
Jump_Menu(pmenu);
}
 
void Menu_Servo_rev(void)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
tmp_val = servo[servo_nr].rev;
if (Change_Value(&tmp_val , 0, 1, 6, Displ_Off_On)) { // pmenu global; reverse gibt es nur 0=off, 1=on
servo[servo_nr].rev = tmp_val ;
servoSet_rev(servo_nr, tmp_val );
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_rev(void)
{
Displ_Title(MSG_SERVO1_REVERSE);
Menu_Servo_rev();
}
 
void Menu_Servo2_rev(void)
{
Displ_Title(MSG_SERVO2_REVERSE);
Menu_Servo_rev();
}
 
void Menu_Servo_left(void)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()); // Linkssanschlag um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].max;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6|(1<<V_REPEAT), Displ_Servo_Max)) { // pmenu global
servo[servo_nr].max = tmp_val;
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_left(void)
{
Displ_Title(MSG_CALIB1_LEFT);
Menu_Servo_left();
}
 
void Menu_Servo2_left(void)
{
Displ_Title(MSG_CALIB2_LEFT);
Menu_Servo_left();
}
 
void Menu_Servo_right(void)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, 0); // Rechtsanschlag um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].min;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6|(1<<V_REPEAT), Displ_Servo_Min)) { // pmenu global
servo[servo_nr].min = tmp_val;
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_right(void)
{
Displ_Title(MSG_CALIB1_RIGHT);
Menu_Servo_right();
}
 
void Menu_Servo2_right(void)
{
Displ_Title(MSG_CALIB2_RIGHT);
Menu_Servo_right();
}
 
void Menu_Servo_middle(void)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()/2); // Mittelposition um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].mid;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5|(1<<V_REPEAT), Displ_Servo_Mid)) { // pmenu global
servo[servo_nr].mid = tmp_val;
eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_middle(void)
{
Displ_Title(MSG_CALIB1_MIDDLE);
Menu_Servo_middle();
}
 
void Menu_Servo2_middle(void)
{
Displ_Title(MSG_CALIB2_MIDDLE);
Menu_Servo_middle();
}
 
/**************************/
/* */
/* Servos-Tests */
/* */
/**************************/
void Menu_Servo_Test(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
servo_nr = eeprom_read_byte(&ep_servo_nr);
Jump_Menu(pmenu);
}
 
void Menu_Test_Frame(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_FRAME);
lcdGotoXY(8, ZLE_VAL);
lcdPuts("ms");
tmp_val = servo_frame;
if (Change_Value(&tmp_val, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
servo_frame = tmp_val;
eeprom_write_byte(&ep_servo_frame, servo_frame);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_ServoNr(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_SERVO);
tmp_val = servo_nr;
if (Change_Value(&tmp_val, 0, 1, 4, Displ_ServoNr)) { // pmenu global; es gibt nur 0=Servo1, 1=Servo2
servo_nr = tmp_val;
eeprom_write_byte(&ep_servo_nr, servo_nr);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
// Dieser Test im raw-Modus ohne Anschlagkalibrierung (normiert) z.B.: für Modelleinstellungen ohne Empfänger
void Menu_Test_PulseWidth(void)
{ uint8_t tmp_tracking;
uint16_t tmp_val;
tmp_tracking = Servo_tmp_on(servo_frame);
lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRLS; // verhindert wiederholtes Lesen bereits geladener LCD-Char
Displ_Title(MSG_PULSE_WIDTH);
tmp_val = steps_pw[sIdxSteps].mid;
Change_Value(&tmp_val, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, 4|(1<<V_REPEAT), Displ_PulseWidth); // pmenu global
lcdWriteCGRAM_Array(lcdSpecialChr, 7); // LCD-Char für Bargraph zurückschreiben
cli();
servoInit(SERVO_PERIODE);
sei();
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Test_Continuous(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_Test_SingleStep(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_SINGLE_STEP);
tmp_val = single_step;
if (Change_Value(&tmp_val, SINGLE_STEP_MIN, SINGLE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Off_Format_Int)) { // pmenu global
single_step = tmp_val;
eeprom_write_byte(&ep_single_step, single_step);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Repeat(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_REPEAT);
tmp_val = repeat;
if (Change_Value(&tmp_val, REPEAT_MIN, REPEAT_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
repeat = tmp_val;
eeprom_write_byte(&ep_repeat, repeat);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_PAUSE);
tmp_val = pause;
if (Change_Value(&tmp_val, PAUSE_MIN, PAUSE_MAX, 5|(1<<V_REPEAT), Displ_Pause)) { // pmenu global
pause = tmp_val;
eeprom_write_byte(&ep_pause, pause);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause_Step(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_PAUSE_STEP);
tmp_val = pause_step;
if (Change_Value(&tmp_val, PAUSE_STEP_MIN, PAUSE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Pause_Step)) { // pmenu global
pause_step = tmp_val;
eeprom_write_byte(&ep_pause_step, pause_step);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
int8_t calc_dir(uint8_t idx, int16_t *Position)
{ uint8_t nextIdx;
int8_t nextDir = 1;
 
nextIdx = idx;
if ((idx + 1) < POSIDX_MAX)
nextIdx++;
else
nextIdx = 0;
if (Position[PosIdx[idx]] > Position[PosIdx[nextIdx]]) nextDir = -1;
return(nextDir);
}
 
void Displ_LoopCounter(uint8_t val)
{
lcdGotoXY(2,2);
lcdPuts(Msg(MSG_COUNTER));
lcdPuts(my_itoa(val, 4, 0, 0));
}
 
// Test über Scalierung der Servos mit Anschlagkalibrierung
void Menu_Test_Start(void)
{ uint8_t tmp_tracking, idx, rep;
int8_t dir;
int16_t sPos;
int16_t Position[3];
int16_t range;
tmp_tracking = Servo_tmp_on(servo_frame);
lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRLS; // Flag, welche Kästchensymbole geladen
Displ_Title(MSG_CONTINOUS);
Displ_LoopCounter(repeat);
Position[0] = 0; // skalierte Servoposition aber unterschiedliche Schrittanzahl möglich
Position[1] = ServoSteps()/2;
Position[2] = ServoSteps();
// init Einzelschritt
idx = 0;
dir = calc_dir(idx, Position);
sPos = Position[PosIdx[idx]];
idx++;
rep = repeat;
// Test bis Ende der Wiederholungen oder irgendein Enter
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && (rep > 0)) {
range = calc_range(sPos - Position[1], Position[0], Position[2], Position[1]);
draw_bar(sPos - Position[1], range, 1); // eingerahmter Balkengraph auf 2. Display-Zeile
servoSetPosition(servo_nr, sPos);
 
if ( sPos != Position[PosIdx[idx]]) { // Links-, Mittel- oder Rechtsposotion erreicht?
sPos += (single_step * dir); // variable Schrittweite subtrahieren oder addieren
if (((dir < 0) && (sPos < Position[PosIdx[idx]])) || ((dir > 0) && (sPos > Position[PosIdx[idx]])) || !(single_step))
sPos = Position[PosIdx[idx]]; // Überlauf bei variabler Schrittweite berücksichtigen oder Einzelschritt
_delay_ms(servo_frame + 1 + pause_step);// Bei Schrittweite um 1 würden welche übersprungen, zusätzlich pro Servoschritt verzögert
}
else {
dir = calc_dir(idx, Position); // Richtungsänderung
if (idx < (POSIDX_MAX - 1)) {
if (idx == 0) {
rep--; // bei jeden vollen Durchlauf Wiederholzähler verringern
Displ_LoopCounter(rep);
}
idx++; // Index für nächsten Positionswert ==> Array PosIdx[] bestimmt Anschlagreihenfolge
}
else
idx = 0;
delay_ms100x(pause); // variable Pause bei Links-, Mittel- und Rechtsposotion Mindestzeit 400ms (Servolauf)
}
}
 
lcdClear();
if (pmenu[0] == '\0')
Displ_Main_Disp();
else
return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
lcdWriteCGRAM_Array(lcdSpecialChr, 7); // LCD-Char für Bargraph zurückschreiben
cli();
servoInit(SERVO_PERIODE);
sei();
Servo_tmp_Original(tmp_tracking);
}
 
 
/**************************/
/* */
/* LCD */
/* */
/**************************/
void Menu_lcd(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_4] = {SCROLL_MAX_4 - 2, MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_lcd_Contrast(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_LCD);
lcdGotoXY(2, ZLE_VAL);
lcdPuts(Msg(MSG_CONTRAST));
lcdPuts(": ");
tmp_val = contrast;
if (Change_Value(&tmp_val, CONTRAST_MIN, CONTRAST_MAX, 11, Displ_Set_Contrast)) { // pmenu global
contrast = tmp_val;
eeprom_write_byte(&ep_contrast, contrast);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_lcd_Backgr_Light(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_BACKGR_LIGHT);
lcdGotoXY(0, ZLE_VAL);
lcdPuts(Msg(MSG_LIGHT));
tmp_val = light_time;
if (Change_Value(&tmp_val, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6|(1<<V_REPEAT), Displ_Backgr_Light)) { // pmenu global
light_time = tmp_val;
eeprom_write_byte(&ep_light_time, light_time);
Double_Beep(DBEEPWR, DBEEPWRP);
if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Batterie */
/* */
/**************************/
void Menu_Battery(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET, MSG_MK_BATTERY};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
/*****************/
/* NG-Video Akku */
/*****************/
void Menu_Low_U_Setup(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_U_MIN);
tmp_val = u_min;
if (Change_Value(&tmp_val, U_MIN_MIN, U_MIN_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
u_min = tmp_val;
eeprom_write_word(&ep_u_min, u_min);
hyst_u_min = u_min;
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_U_Offset(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_U_OFFSET);
tmp_val = u_offset;
if (Change_Value(&tmp_val, U_OFFSET_MIN, U_OFFSET_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
u_offset = tmp_val;
eeprom_write_byte(&ep_u_offset, u_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
/******************/
/* MK-Akku(s) */
/******************/
void Menu_MK_Battery(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_MK_BAT_NR, MSG_MK_BAT_CAPACITY, MSG_MK_I_OFFSET, MSG_MK_I_FAKTOR, MSG_MK_W_FAKTOR};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
// für Nutzung verschiedener Akku's unterschiedlicher Kapazität
// könnte auch für Statistik Ladezyklen erweitert werden aber sinnlos bei Verwendung gleicher Akku's in anderen Modellen
void Menu_MK_BatteryChangeNr(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_BAT_NR);
tmp_val = mk_akku_nr+1;
if (Change_Value(&tmp_val, AKKU_NR_MIN+1, AKKU_NR_MAX+1, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
mk_akku_nr = --tmp_val;
eeprom_write_byte(&ep_mk_akku_nr, mk_akku_nr);
eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
mk_dUsedCapacity = mk_lipo.UsedCapacity;
Double_Beep(DBEEPWR, DBEEPWRP);
}
}
 
void Menu_MK_BatteryNr(void)
{
Menu_MK_BatteryChangeNr();
Jump_Menu(pmenu);
}
 
void Menu_MK_BatteryCapacity(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_BAT_CAPACITY);
tmp_val = mk_lipo.Capacity/50;
if (Change_Value(&tmp_val, AKKU_CAPACITY_MIN/50, AKKU_CAPACITY_MAX/50, 5|(1<<V_REPEAT), Displ_MK_Capacity)) { // pmenu global
mk_lipo.Capacity = tmp_val * 50;
eeprom_write_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Offset(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_I_OFFSET);
tmp_val = mk_i_offset;
if (Change_Value(&tmp_val, MK_I_OFFSET_MIN, MK_I_OFFSET_MAX, 5|(1<<V_REPEAT), Displ_I_Offset)) { // pmenu global
mk_i_offset = tmp_val;
eeprom_write_byte(&ep_mk_i_offset, mk_i_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Faktor(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_I_FAKTOR);
tmp_val = mk_i_faktor;
if (Change_Value(&tmp_val, MK_I_FAKTOR_MIN, MK_I_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
mk_i_faktor = tmp_val;
eeprom_write_byte(&ep_mk_i_faktor, mk_i_faktor);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_W_Faktor(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_W_FAKTOR);
tmp_val = mk_w_faktor;
if (Change_Value(&tmp_val, MK_W_FAKTOR_MIN, MK_W_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
mk_w_faktor = tmp_val;
eeprom_write_byte(&ep_mk_w_faktor, mk_w_faktor);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
 
/**************************/
/* */
/* Antennennachführung */
/* */
/**************************/
void Menu_Tracking_Ant(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_TRACKING);
tmp_val = tracking;
if (Change_Value(&tmp_val, TRACKING_MIN, TRACKING_MAX, 3, Displ_sel_Tracking)) { // pmenu global
cli();
tracking = tmp_val;
sei();
eeprom_write_byte(&ep_tracking, tracking);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_RX_Mode(tracking); // Unterschied Datenempfang GPS/MKCockpit/NMEA
coldstart = 1;
rxcount0 = 0;
rxcount1 = 0;
servoSetDefaultPos(); // Ausgangsstellung beider Servos
if (tracking > TRACKING_MIN)
servoInit(SERVO_PERIODE);
NoTracking_ServosOff();
USART_Init_Baudrate();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* Optionen */
/* Antennennachführung */
/* */
/**************************/
void Menu_Tracking_HYST(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_HYSTERESE);
tmp_val = track_hyst;
if (Change_Value(&tmp_val, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu gloabal
track_hyst = tmp_val;
eeprom_write_byte(&ep_track_hyst, track_hyst);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Tracking_TXOSD(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_TRACK_TX_OSD_DATA);
tmp_val = track_tx;
if (Change_Value(&tmp_val, 0, 1, 3, Displ_track_TX)) { // pmenu global; Senden gibt es nur 0=off, 1=on
track_tx = tmp_val;
eeprom_write_byte(&ep_track_tx, track_tx);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Baudrate(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_BAUDRATE);
tmp_val = baudrate;
if (Change_Value(&tmp_val, BAUDRATE_MIN, BAUDRATE_MAX, 3, Displ_Baudrate)) { // pmenu global
baudrate = tmp_val;
eeprom_write_byte(&ep_baudrate, baudrate);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_Init(getBaud(baudrate));
}
Jump_Menu(pmenu);
}
 
void Menu_Tracking_Option(void)
{ // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl
switch(tracking) {
case TRACKING_RSSI: Menu_Tracking_HYST();
break;
case TRACKING_GPS: Menu_Tracking_TXOSD();
break;
case TRACKING_MKCOCKPIT:
case TRACKING_NMEA: Menu_Baudrate();
break;
}
}
 
/**************************/
/* */
/* Anzeige GPS */
/* */
/**************************/
void Menu_GPS_Display(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME, \
MSG_GPS_MISC, MSG_RX_TIME};
 
if (tracking == TRACKING_NMEA) { // Manipulierung der Menüanzeige/-ausführung
scr_sub_menu[0] = SCROLL_MAX_7 - 3;
scr_sub_menu[5] = MSG_RX_TIME;
}
else
if (tracking != TRACKING_GPS) scr_sub_menu[0] = SCROLL_MAX_7 - 4; // Only show MISC in GPS mode, not NMEA
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_GPS_Display_FLAG(void) // ist Flag in tracking.c Tracking_GPS(void)
{ uint8_t slen;
slen = strlen(pmenu) - 1;
gps_display = pmenu[slen] - '0'; // char to byte 1 bis 3 im String enthalten
if ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))
pmenu[slen] = RXTimeChr[0]; // Manipulierung der Menüausführung
else {
m_pkt = gps_display;
gps_disp_clear = 1; // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird
if (gps_display != GPS_MISC) lcdPuts(Msg(MSG_GPS_NO_DATA));
if (Short_Enter()) // pmenu global
pmenu[slen] = '\0'; // Menüpunkt zurück
gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
}
Jump_Menu(pmenu);
}
 
void Menu_GPS_Displ_RX_Time(void)
{
Displ_Title(MSG_RX_TIME);
lcdGotoXY(0, 1);
lcdPuts(Msg(MSG_RX1));
lcdGotoXY(0, 2);
lcdPuts(Msg(MSG_RX2));
Displ_RX_Time();
// bei Menüpunktmanipulatin TRACKING_NMEA und vorgezogen Menu_GPS_Displ_RX_Time ist Rücksprung real GPS_MISC
m_pkt = ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))? GPS_MISC: GPS_RX_COUNT;
gps_display = GPS_RX_COUNT;
if (Short_Enter()) // pmenu global
pmenu[strlen(pmenu) - 1] = '\0';// Menüpunkt zurück
gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
Jump_Menu(pmenu);
}
/NGVideo5_8/tags/V1.30/menue.h
0,0 → 1,103
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef _MENUE_H_
#define _MENUE_H_
 
#define SCROLL_MAIN_MAX 13 // index array Scroll_Menu scr_main_menu[] = {....}
#define SCROLL_MAX_4 4 // später SCROLL_MAX_N - 2, da array[0] Scrollwert und
#define SCROLL_MAX_5 5 // for-Schleifen mit Zählen 0 beginnen
#define SCROLL_MAX_6 6
#define SCROLL_MAX_7 7
 
#define SCROLL_SERVO_MAX 4 // index array Scroll_Menu scr_servo_menu[] = {....} Anzahl-1, da Beginn bei 0
 
/* bei Change_Value(....) */
#define ZLE_VAL 1 // DOGM Zeile des zu ändernten Wertes, einfache generelle bessere Gestaltung
 
#define C_REPEAT 0 // konstante repeat Geschwindigkeit
#define POSXMASK 0b00001111 // separiert pos_x für lcdGotoXY()
#define CYCLE 6 // Bit bei Erreichen Endwert wird Anfangswert dargestellt ("kreisförmige Auswahl")
#define V_REPEAT 7 // Bit sich ändernte repeat Geschwindigkeit
#define CHRLS 0 // Flag überladener Zeichensatz lcdSpecialChrLs
#define CHRRS 1 // Flag überladener Zeichensatz lcdSpecialChrRs
 
#define RXTimeChr "5"
#define RXTimeStr "0;"RXTimeChr
 
typedef void (*Displ_Fnct_t)( uint16_t );
 
extern char pmenu[6]; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
extern uint8_t m_pkt;
extern uint8_t exit_while;
 
typedef struct {
const char *menu_nr; // Stringzeiger auf Befehlsnamen
void (*fp)(void); // Zeiger auf auszuführende Funktion
}command_table_t;
void Menu_Main (void);
void Menu_AV_Source (void);
void Menu_RX_Channel (void);
void Menu_RSSI_Calibr (void);
void Menu_RSSI_min (void);
void Menu_RSSI_min_all (void);
void Menu_RSSI_max (void);
void Menu_Language (void);
void Menu_Servo_Calibr (void);
void Menu_Servo_Steps (void);
void Menu_Servo1 (void);
void Menu_Servo2 (void);
void Menu_Servo1_rev (void);
void Menu_Servo1_left (void);
void Menu_Servo1_right (void);
void Menu_Servo1_middle (void);
void Menu_Servo2_rev (void);
void Menu_Servo2_left (void);
void Menu_Servo2_right (void);
void Menu_Servo2_middle (void);
void Menu_Servo_Test (void);
void Menu_Test_Frame (void);
void Menu_Test_ServoNr (void);
void Menu_Test_PulseWidth (void);
void Menu_Test_Continuous (void);
void Menu_Test_SingleStep (void);
void Menu_Test_Repeat (void);
void Menu_Test_Pause (void);
void Menu_Test_Pause_Step (void);
void Menu_Test_Start (void);
void Menu_lcd (void);
void Menu_lcd_Contrast (void);
void Menu_lcd_Backgr_Light (void);
void Menu_Battery (void);
void Menu_Low_U_Setup (void);
void Menu_U_Offset (void);
void Menu_MK_Battery (void);
void Menu_MK_BatteryNr (void);
void Menu_MK_BatteryCapacity(void);
void Menu_MK_I_Offset (void);
void Menu_MK_I_Faktor (void);
void Menu_MK_W_Faktor (void);
void Menu_Tracking_Ant (void);
void Menu_Tracking_Option (void);
void Menu_GPS_Display (void);
void Menu_GPS_Display_FLAG (void);
void Menu_GPS_Displ_RX_Time (void);
 
void Displ_Version(void);
void Displ_Main_Disp(void);
void Displ_AV_Mark(uint8_t p, char marker);
void Displ_RX_Time(void);
void Displ_Channels(uint16_t k);
void Menu_MK_BatteryChangeNr(void);
 
#endif /* _MENUE_H */
/NGVideo5_8/tags/V1.30/messages.c
0,0 → 1,528
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/* http://www.avrfreaks.net/ */
/* index.php?name=PNphpBB2&file=viewtopic&t=71985&view=previous*/
/* */
/****************************************************************/
 
#include "messages.h"
 
#define MSG_TABLE(l,n) mt ## l ## _ ## n
#define MSG_STRING(l,n,s) \
const char mt ## l ## _ ## n [] PROGMEM = s ;
 
MSG_STRING(INTERNAT, MSG_RSSI_MIN, INTERNAT_RSSI_MIN)
MSG_STRING(INTERNAT, MSG_RSSI_MAX, INTERNAT_RSSI_MAX)
MSG_STRING(INTERNAT, MSG_DIVERSITY, INTERNAT_DIVERSITY)
MSG_STRING(INTERNAT, MSG_LCD, INTERNAT_LCD)
MSG_STRING(INTERNAT, MSG_AV1, INTERNAT_AV1)
MSG_STRING(INTERNAT, MSG_AV2, INTERNAT_AV2)
MSG_STRING(INTERNAT, MSG_RX1, INTERNAT_RX1)
MSG_STRING(INTERNAT, MSG_RX2, INTERNAT_RX2)
MSG_STRING(INTERNAT, MSG_STEPS_255, INTERNAT_STEPS_255)
MSG_STRING(INTERNAT, MSG_STEPS_1023, INTERNAT_STEPS_1023)
MSG_STRING(INTERNAT, MSG_SERVO, INTERNAT_SERVO)
MSG_STRING(INTERNAT, MSG_SERVO1, INTERNAT_SERVO1)
MSG_STRING(INTERNAT, MSG_SERVO2, INTERNAT_SERVO2)
MSG_STRING(INTERNAT, MSG_TEST_SERVO, INTERNAT_TEST_SERVO)
MSG_STRING(INTERNAT, MSG_TRACK_RSSI, INTERNAT_TRACK_RSSI)
MSG_STRING(INTERNAT, MSG_TRACK_MKCOCKPIT, INTERNAT_TRACK_MKCOCKPIT)
MSG_STRING(INTERNAT, MSG_TRACK_SERVO_HYTERESE, INTERNAT_TRACK_SERVO_HYTERESE)
MSG_STRING(INTERNAT, MSG_BAUDRATE, INTERNAT_BAUDRATE)
MSG_STRING(INTERNAT, MSG_UHW5V, INTERNAT_UHW5V)
MSG_STRING(INTERNAT, MSG_VERSION1, INTERNAT_VERSION1)
MSG_STRING(INTERNAT, MSG_VERSION2, INTERNAT_VERSION2)
 
MSG_STRING(GERMAN, MSG_LANGUAGE, GERMAN_LANGUAGE)
MSG_STRING(GERMAN, MSG_GERMAN, GERMAN_GERMAN)
MSG_STRING(GERMAN, MSG_ENGLISH, GERMAN_ENGLISH)
MSG_STRING(GERMAN, MSG_FRENCH, GERMAN_FRENCH)
MSG_STRING(GERMAN, MSG_RETURN, GERMAN_RETURN)
MSG_STRING(GERMAN, MSG_AV_SOURCE, GERMAN_AV_SOURCE)
MSG_STRING(GERMAN, MSG_RX_CHANNEL, GERMAN_RX_CHANNEL)
MSG_STRING(GERMAN, MSG_RSSI_CALIBR, GERMAN_RSSI_CALIBR)
MSG_STRING(GERMAN, MSG_RSSI_MIN_ALL, GERMAN_RSSI_MIN_ALL)
MSG_STRING(GERMAN, MSG_CALIB, GERMAN_CALIB)
MSG_STRING(GERMAN, MSG_TX, GERMAN_TX)
MSG_STRING(GERMAN, MSG_TX_OFF, GERMAN_TX_OFF)
MSG_STRING(GERMAN, MSG_TX_ON, GERMAN_TX_ON)
MSG_STRING(GERMAN, MSG_CONTINUE, GERMAN_CONTINUE)
MSG_STRING(GERMAN, MSG_CONTRAST, GERMAN_CONTRAST)
MSG_STRING(GERMAN, MSG_BACKGR_LIGHT, GERMAN_BACKGR_LIGHT)
MSG_STRING(GERMAN, MSG_LIGHT, GERMAN_LIGHT)
MSG_STRING(GERMAN, MSG_LIGHT_OFF, GERMAN_LIGHT_OFF)
MSG_STRING(GERMAN, MSG_LIGHT_ON, GERMAN_LIGHT_ON)
MSG_STRING(GERMAN, MSG_SEC, GERMAN_SEC)
MSG_STRING(GERMAN, MSG_BATTERY, GERMAN_BATTERY)
MSG_STRING(GERMAN, MSG_U_MIN, GERMAN_U_MIN)
MSG_STRING(GERMAN, MSG_U_SETUP, GERMAN_U_SETUP)
MSG_STRING(GERMAN, MSG_U_OFFSET, GERMAN_U_OFFSET)
MSG_STRING(GERMAN, MSG_MK_BATTERY, GERMAN_MSG_MK_BATTERY)
MSG_STRING(GERMAN, MSG_MK_BAT_NR, GERMAN_MSG_MK_BAT_NR)
MSG_STRING(GERMAN, MSG_MK_BAT_CAPACITY, GERMAN_MSG_MK_BAT_CAPACITY)
MSG_STRING(GERMAN, MSG_MK_I_OFFSET, GERMAN_MSG_MK_I_OFFSET)
MSG_STRING(GERMAN, MSG_MK_I_FAKTOR, GERMAN_MSG_MK_I_FAKTOR)
MSG_STRING(GERMAN, MSG_MK_W_FAKTOR, GERMAN_MSG_MK_W_FAKTOR)
MSG_STRING(GERMAN, MSG_CALIBRATION, GERMAN_CALIBRATION)
MSG_STRING(GERMAN, MSG_RUNNING, GERMAN_RUNNING)
MSG_STRING(GERMAN, MSG_ERROR, GERMAN_ERROR)
MSG_STRING(GERMAN, MSG_TX_NOT, GERMAN_TX_NOT)
MSG_STRING(GERMAN, MSG_ACCU_LOW, GERMAN_ACCU_LOW)
MSG_STRING(GERMAN, MSG_SERVO_CALIBR, GERMAN_SERVO_CALIBR)
MSG_STRING(GERMAN, MSG_SERVO_STEPS, GERMAN_SERVO_STEPS)
MSG_STRING(GERMAN, MSG_SERVO1_REVERSE, GERMAN_SERVO1_REVERSE)
MSG_STRING(GERMAN, MSG_CALIB1_LEFT, GERMAN_CALIB1_LEFT)
MSG_STRING(GERMAN, MSG_CALIB1_RIGHT, GERMAN_CALIB1_RIGHT)
MSG_STRING(GERMAN, MSG_CALIB1_MIDDLE, GERMAN_CALIB1_MIDDLE)
MSG_STRING(GERMAN, MSG_SERVO2_REVERSE, GERMAN_SERVO2_REVERSE)
MSG_STRING(GERMAN, MSG_CALIB2_LEFT, GERMAN_CALIB2_LEFT)
MSG_STRING(GERMAN, MSG_CALIB2_RIGHT, GERMAN_CALIB2_RIGHT)
MSG_STRING(GERMAN, MSG_CALIB2_MIDDLE, GERMAN_CALIB2_MIDDLE)
MSG_STRING(GERMAN, MSG_FRAME, GERMAN_FRAME)
MSG_STRING(GERMAN, MSG_PULSE_WIDTH, GERMAN_PULSE_WIDTH)
MSG_STRING(GERMAN, MSG_CONTINOUS, GERMAN_CONTINOUS)
MSG_STRING(GERMAN, MSG_SINGLE_STE, GERMAN_SINGLE_STEP)
MSG_STRING(GERMAN, MSG_REPEAT, GERMAN_REPEAT)
MSG_STRING(GERMAN, MSG_PAUSE, GERMAN_PAUSE)
MSG_STRING(GERMAN, MSG_PAUSE_STEP, GERMAN_PAUSE_STEP)
MSG_STRING(GERMAN, MSG_COUNTER, GERMAN_COUNTER)
MSG_STRING(GERMAN, MSG_START, GERMAN_START)
MSG_STRING(GERMAN, MSG_OFF, GERMAN_OFF)
MSG_STRING(GERMAN, MSG_ON, GERMAN_ON)
MSG_STRING(GERMAN, MSG_TRACKING, GERMAN_TRACKING)
MSG_STRING(GERMAN, MSG_TRACK_GPS, GERMAN_TRACK_GPS)
MSG_STRING(GERMAN, MSG_TRACK_NMEA, GERMAN_TRACK_NMEA)
MSG_STRING(GERMAN, MSG_TRACK_TX_OSD_DATA, GERMAN_TRACK_TX_OSD_DATA)
MSG_STRING(GERMAN, MSG_HYSTERESE, GERMAN_HYSTERESE)
MSG_STRING(GERMAN, MSG_TRACK_TX_ON, GERMAN_TRACK_TX_ON)
MSG_STRING(GERMAN, MSG_GPS_DISPLAY, GERMAN_GPS_DISPLAY)
MSG_STRING(GERMAN, MSG_GPS_CALCULATE, GERMAN_GPS_CALCULATE)
MSG_STRING(GERMAN, MSG_GPS_CURRENT, GERMAN_GPS_CURRENT)
MSG_STRING(GERMAN, MSG_GPS_HOME, GERMAN_GPS_HOME)
MSG_STRING(GERMAN, MSG_GPS_MISC, GERMAN_GPS_MISC)
MSG_STRING(GERMAN, MSG_GPS_NO_DATA, GERMAN_GPS_NO_DATA)
MSG_STRING(GERMAN, MSG_RX_TIME, GERMAN_RX_TIME)
MSG_STRING(GERMAN, MSG_COM, GERMAN_COM)
MSG_STRING(GERMAN, MSG_KOMMA, GERMAN_KOMMA)
MSG_STRING(GERMAN, MSG_UHW33V, GERMAN_UHW33V)
 
MSG_STRING(ENGLISH, MSG_LANGUAGE, ENGLISH_LANGUAGE)
MSG_STRING(ENGLISH, MSG_GERMAN, ENGLISH_GERMAN)
MSG_STRING(ENGLISH, MSG_ENGLISH, ENGLISH_ENGLISH)
MSG_STRING(ENGLISH, MSG_FRENCH, ENGLISH_FRENCH)
MSG_STRING(ENGLISH, MSG_RETURN, ENGLISH_RETURN)
MSG_STRING(ENGLISH, MSG_AV_SOURCE, ENGLISH_AV_SOURCE)
MSG_STRING(ENGLISH, MSG_RX_CHANNEL, ENGLISH_RX_CHANNEL)
MSG_STRING(ENGLISH, MSG_RSSI_CALIBR, ENGLISH_RSSI_CALIBR)
MSG_STRING(ENGLISH, MSG_RSSI_MIN_ALL, ENGLISH_RSSI_MIN_ALL)
MSG_STRING(ENGLISH, MSG_CALIB, ENGLISH_CALIB)
MSG_STRING(ENGLISH, MSG_TX, ENGLISH_TX)
MSG_STRING(ENGLISH, MSG_TX_OFF, ENGLISH_TX_OFF)
MSG_STRING(ENGLISH, MSG_TX_ON, ENGLISH_TX_ON)
MSG_STRING(ENGLISH, MSG_CONTINUE, ENGLISH_CONTINUE)
MSG_STRING(ENGLISH, MSG_CONTRAST, ENGLISH_CONTRAST)
MSG_STRING(ENGLISH, MSG_BACKGR_LIGHT, ENGLISH_BACKGR_LIGHT)
MSG_STRING(ENGLISH, MSG_LIGHT, ENGLISH_LIGHT)
MSG_STRING(ENGLISH, MSG_LIGHT_OFF, ENGLISH_LIGHT_OFF)
MSG_STRING(ENGLISH, MSG_LIGHT_ON, ENGLISH_LIGHT_ON)
MSG_STRING(ENGLISH, MSG_SEC, ENGLISH_SEC)
MSG_STRING(ENGLISH, MSG_BATTERY, ENGLISH_BATTERY)
MSG_STRING(ENGLISH, MSG_U_MIN, ENGLISH_U_MIN)
MSG_STRING(ENGLISH, MSG_U_SETUP, ENGLISH_U_SETUP)
MSG_STRING(ENGLISH, MSG_U_OFFSET, ENGLISH_U_OFFSET)
MSG_STRING(ENGLISH, MSG_MK_BATTERY, ENGLISH_MSG_MK_BATTERY)
MSG_STRING(ENGLISH, MSG_MK_BAT_NR, ENGLISH_MSG_MK_BAT_NR)
MSG_STRING(ENGLISH, MSG_MK_BAT_CAPACITY, ENGLISH_MSG_MK_BAT_CAPACITY)
MSG_STRING(ENGLISH, MSG_MK_I_OFFSET, ENGLISH_MSG_MK_I_OFFSET)
MSG_STRING(ENGLISH, MSG_MK_I_FAKTOR, ENGLISH_MSG_MK_I_FAKTOR)
MSG_STRING(ENGLISH, MSG_MK_W_FAKTOR, ENGLISH_MSG_MK_W_FAKTOR)
MSG_STRING(ENGLISH, MSG_CALIBRATION, ENGLISH_CALIBRATION)
MSG_STRING(ENGLISH, MSG_RUNNING, ENGLISH_RUNNING)
MSG_STRING(ENGLISH, MSG_ERROR, ENGLISH_ERROR)
MSG_STRING(ENGLISH, MSG_TX_NOT, ENGLISH_TX_NOT)
MSG_STRING(ENGLISH, MSG_ACCU_LOW, ENGLISH_ACCU_LOW)
MSG_STRING(ENGLISH, MSG_SERVO_CALIBR, ENGLISH_SERVO_CALIBR)
MSG_STRING(ENGLISH, MSG_SERVO_STEPS, ENGLISH_SERVO_STEPS)
MSG_STRING(ENGLISH, MSG_SERVO1_REVERSE, ENGLISH_SERVO1_REVERSE)
MSG_STRING(ENGLISH, MSG_CALIB1_LEFT, ENGLISH_CALIB1_LEFT)
MSG_STRING(ENGLISH, MSG_CALIB1_RIGHT, ENGLISH_CALIB1_RIGHT)
MSG_STRING(ENGLISH, MSG_CALIB1_MIDDLE, ENGLISH_CALIB1_MIDDLE)
MSG_STRING(ENGLISH, MSG_SERVO2_REVERSE, ENGLISH_SERVO2_REVERSE)
MSG_STRING(ENGLISH, MSG_CALIB2_LEFT, ENGLISH_CALIB2_LEFT)
MSG_STRING(ENGLISH, MSG_CALIB2_RIGHT, ENGLISH_CALIB2_RIGHT)
MSG_STRING(ENGLISH, MSG_CALIB2_MIDDLE, ENGLISH_CALIB2_MIDDLE)
MSG_STRING(ENGLISH, MSG_FRAME, ENGLISH_FRAME)
MSG_STRING(ENGLISH, MSG_PULSE_WIDTH, ENGLISH_PULSE_WIDTH)
MSG_STRING(ENGLISH, MSG_CONTINOUS, ENGLISH_CONTINOUS)
MSG_STRING(ENGLISH, MSG_SINGLE_STE, ENGLISH_SINGLE_STEP)
MSG_STRING(ENGLISH, MSG_REPEAT, ENGLISH_REPEAT)
MSG_STRING(ENGLISH, MSG_PAUSE, ENGLISH_PAUSE)
MSG_STRING(ENGLISH, MSG_PAUSE_STEP, ENGLISH_PAUSE_STEP)
MSG_STRING(ENGLISH, MSG_COUNTER, ENGLISH_COUNTER)
MSG_STRING(ENGLISH, MSG_START, ENGLISH_START)
MSG_STRING(ENGLISH, MSG_OFF, ENGLISH_OFF)
MSG_STRING(ENGLISH, MSG_ON, ENGLISH_ON)
MSG_STRING(ENGLISH, MSG_TRACKING, ENGLISH_TRACKING)
MSG_STRING(ENGLISH, MSG_TRACK_GPS, ENGLISH_TRACK_GPS)
MSG_STRING(ENGLISH, MSG_TRACK_NMEA, ENGLISH_TRACK_NMEA)
MSG_STRING(ENGLISH, MSG_TRACK_TX_OSD_DATA, ENGLISH_TRACK_TX_OSD_DATA)
MSG_STRING(ENGLISH, MSG_HYSTERESE, ENGLISH_HYSTERESE)
MSG_STRING(ENGLISH, MSG_TRACK_TX_ON, ENGLISH_TRACK_TX_ON)
MSG_STRING(ENGLISH, MSG_GPS_DISPLAY, ENGLISH_GPS_DISPLAY)
MSG_STRING(ENGLISH, MSG_GPS_CALCULATE, ENGLISH_GPS_CALCULATE)
MSG_STRING(ENGLISH, MSG_GPS_CURRENT, ENGLISH_GPS_CURRENT)
MSG_STRING(ENGLISH, MSG_GPS_HOME, ENGLISH_GPS_HOME)
MSG_STRING(ENGLISH, MSG_GPS_MISC, ENGLISH_GPS_MISC)
MSG_STRING(ENGLISH, MSG_GPS_NO_DATA, ENGLISH_GPS_NO_DATA)
MSG_STRING(ENGLISH, MSG_RX_TIME, ENGLISH_RX_TIME)
MSG_STRING(ENGLISH, MSG_COM, ENGLISH_COM)
MSG_STRING(ENGLISH, MSG_KOMMA, ENGLISH_KOMMA)
MSG_STRING(ENGLISH, MSG_UHW33V, ENGLISH_UHW33V)
 
MSG_STRING(FRENCH, MSG_LANGUAGE, FRENCH_LANGUAGE)
MSG_STRING(FRENCH, MSG_GERMAN, FRENCH_GERMAN)
MSG_STRING(FRENCH, MSG_ENGLISH, FRENCH_ENGLISH)
MSG_STRING(FRENCH, MSG_FRENCH, FRENCH_FRENCH)
MSG_STRING(FRENCH, MSG_RETURN, FRENCH_RETURN)
MSG_STRING(FRENCH, MSG_AV_SOURCE, FRENCH_AV_SOURCE)
MSG_STRING(FRENCH, MSG_RX_CHANNEL, FRENCH_RX_CHANNEL)
MSG_STRING(FRENCH, MSG_RSSI_CALIBR, FRENCH_RSSI_CALIBR)
MSG_STRING(FRENCH, MSG_RSSI_MIN_ALL, FRENCH_RSSI_MIN_ALL)
MSG_STRING(FRENCH, MSG_CALIB, FRENCH_CALIB)
MSG_STRING(FRENCH, MSG_TX, FRENCH_TX)
MSG_STRING(FRENCH, MSG_TX_OFF, FRENCH_TX_OFF)
MSG_STRING(FRENCH, MSG_TX_ON, FRENCH_TX_ON)
MSG_STRING(FRENCH, MSG_CONTINUE, FRENCH_CONTINUE)
MSG_STRING(FRENCH, MSG_CONTRAST, FRENCH_CONTRAST)
MSG_STRING(FRENCH, MSG_BACKGR_LIGHT, FRENCH_BACKGR_LIGHT)
MSG_STRING(FRENCH, MSG_LIGHT, FRENCH_LIGHT)
MSG_STRING(FRENCH, MSG_LIGHT_OFF, FRENCH_LIGHT_OFF)
MSG_STRING(FRENCH, MSG_LIGHT_ON, FRENCH_LIGHT_ON)
MSG_STRING(FRENCH, MSG_SEC, FRENCH_SEC)
MSG_STRING(FRENCH, MSG_BATTERY, FRENCH_BATTERY)
MSG_STRING(FRENCH, MSG_U_MIN, FRENCH_U_MIN)
MSG_STRING(FRENCH, MSG_U_SETUP, FRENCH_U_SETUP)
MSG_STRING(FRENCH, MSG_U_OFFSET, FRENCH_U_OFFSET)
MSG_STRING(FRENCH, MSG_MK_BATTERY, FRENCH_MSG_MK_BATTERY)
MSG_STRING(FRENCH, MSG_MK_BAT_NR, FRENCH_MSG_MK_BAT_NR)
MSG_STRING(FRENCH, MSG_MK_BAT_CAPACITY, FRENCH_MSG_MK_BAT_CAPACITY)
MSG_STRING(FRENCH, MSG_MK_I_OFFSET, FRENCH_MSG_MK_I_OFFSET)
MSG_STRING(FRENCH, MSG_MK_I_FAKTOR, FRENCH_MSG_MK_I_FAKTOR)
MSG_STRING(FRENCH, MSG_MK_W_FAKTOR, FRENCH_MSG_MK_W_FAKTOR)
MSG_STRING(FRENCH, MSG_CALIBRATION, FRENCH_CALIBRATION)
MSG_STRING(FRENCH, MSG_RUNNING, FRENCH_RUNNING)
MSG_STRING(FRENCH, MSG_ERROR, FRENCH_ERROR)
MSG_STRING(FRENCH, MSG_TX_NOT, FRENCH_TX_NOT)
MSG_STRING(FRENCH, MSG_ACCU_LOW, FRENCH_ACCU_LOW)
MSG_STRING(FRENCH, MSG_SERVO_CALIBR, FRENCH_SERVO_CALIBR)
MSG_STRING(FRENCH, MSG_SERVO_STEPS, FRENCH_SERVO_STEPS)
MSG_STRING(FRENCH, MSG_SERVO1_REVERSE, FRENCH_SERVO1_REVERSE)
MSG_STRING(FRENCH, MSG_CALIB1_LEFT, FRENCH_CALIB1_LEFT)
MSG_STRING(FRENCH, MSG_CALIB1_RIGHT, FRENCH_CALIB1_RIGHT)
MSG_STRING(FRENCH, MSG_CALIB1_MIDDLE, FRENCH_CALIB1_MIDDLE)
MSG_STRING(FRENCH, MSG_SERVO2_REVERSE, FRENCH_SERVO2_REVERSE)
MSG_STRING(FRENCH, MSG_CALIB2_LEFT, FRENCH_CALIB2_LEFT)
MSG_STRING(FRENCH, MSG_CALIB2_RIGHT, FRENCH_CALIB2_RIGHT)
MSG_STRING(FRENCH, MSG_CALIB2_MIDDLE, FRENCH_CALIB2_MIDDLE)
MSG_STRING(FRENCH, MSG_FRAME, FRENCH_FRAME)
MSG_STRING(FRENCH, MSG_PULSE_WIDTH, FRENCH_PULSE_WIDTH)
MSG_STRING(FRENCH, MSG_CONTINOUS, FRENCH_CONTINOUS)
MSG_STRING(FRENCH, MSG_SINGLE_STE, FRENCH_SINGLE_STEP)
MSG_STRING(FRENCH, MSG_REPEAT, FRENCH_REPEAT)
MSG_STRING(FRENCH, MSG_PAUSE, FRENCH_PAUSE)
MSG_STRING(FRENCH, MSG_PAUSE_STEP, FRENCH_PAUSE_STEP)
MSG_STRING(FRENCH, MSG_COUNTER, FRENCH_COUNTER)
MSG_STRING(FRENCH, MSG_START, FRENCH_START)
MSG_STRING(FRENCH, MSG_OFF, FRENCH_OFF)
MSG_STRING(FRENCH, MSG_ON, FRENCH_ON)
MSG_STRING(FRENCH, MSG_TRACKING, FRENCH_TRACKING)
MSG_STRING(FRENCH, MSG_TRACK_GPS, FRENCH_TRACK_GPS)
MSG_STRING(FRENCH, MSG_TRACK_NMEA, FRENCH_TRACK_NMEA)
MSG_STRING(FRENCH, MSG_TRACK_TX_OSD_DATA, FRENCH_TRACK_TX_OSD_DATA)
MSG_STRING(FRENCH, MSG_HYSTERESE, FRENCH_HYSTERESE)
MSG_STRING(FRENCH, MSG_TRACK_TX_ON, FRENCH_TRACK_TX_ON)
MSG_STRING(FRENCH, MSG_GPS_DISPLAY, FRENCH_GPS_DISPLAY)
MSG_STRING(FRENCH, MSG_GPS_CALCULATE, FRENCH_GPS_CALCULATE)
MSG_STRING(FRENCH, MSG_GPS_CURRENT, FRENCH_GPS_CURRENT)
MSG_STRING(FRENCH, MSG_GPS_HOME, FRENCH_GPS_HOME)
MSG_STRING(FRENCH, MSG_GPS_MISC, FRENCH_GPS_MISC)
MSG_STRING(FRENCH, MSG_GPS_NO_DATA, FRENCH_GPS_NO_DATA)
MSG_STRING(FRENCH, MSG_RX_TIME, FRENCH_RX_TIME)
MSG_STRING(FRENCH, MSG_COM, FRENCH_COM)
MSG_STRING(FRENCH, MSG_KOMMA, FRENCH_KOMMA)
MSG_STRING(FRENCH, MSG_UHW33V, FRENCH_UHW33V)
 
PGM_P MessageTableGerman[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(GERMAN, MSG_LANGUAGE),
MSG_TABLE(GERMAN, MSG_GERMAN),
MSG_TABLE(GERMAN, MSG_ENGLISH),
MSG_TABLE(GERMAN, MSG_FRENCH),
MSG_TABLE(GERMAN, MSG_RETURN),
MSG_TABLE(GERMAN, MSG_AV_SOURCE),
MSG_TABLE(GERMAN, MSG_RX_CHANNEL),
MSG_TABLE(GERMAN, MSG_RSSI_CALIBR),
MSG_TABLE(GERMAN, MSG_RSSI_MIN_ALL),
MSG_TABLE(GERMAN, MSG_CALIB),
MSG_TABLE(GERMAN, MSG_TX),
MSG_TABLE(GERMAN, MSG_TX_OFF),
MSG_TABLE(GERMAN, MSG_TX_ON),
MSG_TABLE(GERMAN, MSG_CONTINUE),
MSG_TABLE(GERMAN, MSG_CONTRAST),
MSG_TABLE(GERMAN, MSG_BACKGR_LIGHT),
MSG_TABLE(GERMAN, MSG_LIGHT),
MSG_TABLE(GERMAN, MSG_LIGHT_OFF),
MSG_TABLE(GERMAN, MSG_LIGHT_ON),
MSG_TABLE(GERMAN, MSG_SEC),
MSG_TABLE(GERMAN, MSG_BATTERY),
MSG_TABLE(GERMAN, MSG_U_MIN),
MSG_TABLE(GERMAN, MSG_U_SETUP),
MSG_TABLE(GERMAN, MSG_U_OFFSET),
MSG_TABLE(GERMAN, MSG_MK_BATTERY),
MSG_TABLE(GERMAN, MSG_MK_BAT_NR),
MSG_TABLE(GERMAN, MSG_MK_BAT_CAPACITY),
MSG_TABLE(GERMAN, MSG_MK_I_OFFSET),
MSG_TABLE(GERMAN, MSG_MK_I_FAKTOR),
MSG_TABLE(GERMAN, MSG_MK_W_FAKTOR),
MSG_TABLE(GERMAN, MSG_CALIBRATION),
MSG_TABLE(GERMAN, MSG_RUNNING),
MSG_TABLE(GERMAN, MSG_ERROR),
MSG_TABLE(GERMAN, MSG_TX_NOT),
MSG_TABLE(GERMAN, MSG_ACCU_LOW),
MSG_TABLE(GERMAN, MSG_SERVO_CALIBR),
MSG_TABLE(GERMAN, MSG_SERVO_STEPS),
MSG_TABLE(GERMAN, MSG_SERVO1_REVERSE),
MSG_TABLE(GERMAN, MSG_CALIB1_LEFT),
MSG_TABLE(GERMAN, MSG_CALIB1_RIGHT),
MSG_TABLE(GERMAN, MSG_CALIB1_MIDDLE),
MSG_TABLE(GERMAN, MSG_SERVO2_REVERSE),
MSG_TABLE(GERMAN, MSG_CALIB2_LEFT),
MSG_TABLE(GERMAN, MSG_CALIB2_RIGHT),
MSG_TABLE(GERMAN, MSG_CALIB2_MIDDLE),
MSG_TABLE(GERMAN, MSG_FRAME),
MSG_TABLE(GERMAN, MSG_PULSE_WIDTH),
MSG_TABLE(GERMAN, MSG_CONTINOUS),
MSG_TABLE(GERMAN, MSG_SINGLE_STE),
MSG_TABLE(GERMAN, MSG_REPEAT),
MSG_TABLE(GERMAN, MSG_PAUSE),
MSG_TABLE(GERMAN, MSG_PAUSE_STEP),
MSG_TABLE(GERMAN, MSG_COUNTER),
MSG_TABLE(GERMAN, MSG_START),
MSG_TABLE(GERMAN, MSG_OFF),
MSG_TABLE(GERMAN, MSG_ON),
MSG_TABLE(GERMAN, MSG_TRACKING),
MSG_TABLE(GERMAN, MSG_TRACK_GPS),
MSG_TABLE(GERMAN, MSG_TRACK_NMEA),
MSG_TABLE(GERMAN, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(GERMAN, MSG_HYSTERESE),
MSG_TABLE(GERMAN, MSG_TRACK_TX_ON),
MSG_TABLE(GERMAN, MSG_GPS_DISPLAY),
MSG_TABLE(GERMAN, MSG_GPS_CALCULATE),
MSG_TABLE(GERMAN, MSG_GPS_CURRENT),
MSG_TABLE(GERMAN, MSG_GPS_HOME),
MSG_TABLE(GERMAN, MSG_GPS_MISC),
MSG_TABLE(GERMAN, MSG_GPS_NO_DATA),
MSG_TABLE(GERMAN, MSG_RX_TIME),
MSG_TABLE(GERMAN, MSG_COM),
MSG_TABLE(GERMAN, MSG_KOMMA),
MSG_TABLE(GERMAN, MSG_UHW33V),
};
 
PGM_P MessageTableEnglish[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(ENGLISH, MSG_LANGUAGE),
MSG_TABLE(ENGLISH, MSG_GERMAN),
MSG_TABLE(ENGLISH, MSG_ENGLISH),
MSG_TABLE(ENGLISH, MSG_FRENCH),
MSG_TABLE(ENGLISH, MSG_RETURN),
MSG_TABLE(ENGLISH, MSG_AV_SOURCE),
MSG_TABLE(ENGLISH, MSG_RX_CHANNEL),
MSG_TABLE(ENGLISH, MSG_RSSI_CALIBR),
MSG_TABLE(ENGLISH, MSG_RSSI_MIN_ALL),
MSG_TABLE(ENGLISH, MSG_CALIB),
MSG_TABLE(ENGLISH, MSG_TX),
MSG_TABLE(ENGLISH, MSG_TX_OFF),
MSG_TABLE(ENGLISH, MSG_TX_ON),
MSG_TABLE(ENGLISH, MSG_CONTINUE),
MSG_TABLE(ENGLISH, MSG_CONTRAST),
MSG_TABLE(ENGLISH, MSG_BACKGR_LIGHT),
MSG_TABLE(ENGLISH, MSG_LIGHT),
MSG_TABLE(ENGLISH, MSG_LIGHT_OFF),
MSG_TABLE(ENGLISH, MSG_LIGHT_ON),
MSG_TABLE(ENGLISH, MSG_SEC),
MSG_TABLE(ENGLISH, MSG_BATTERY),
MSG_TABLE(ENGLISH, MSG_U_MIN),
MSG_TABLE(ENGLISH, MSG_U_SETUP),
MSG_TABLE(ENGLISH, MSG_U_OFFSET),
MSG_TABLE(ENGLISH, MSG_MK_BATTERY),
MSG_TABLE(ENGLISH, MSG_MK_BAT_NR),
MSG_TABLE(ENGLISH, MSG_MK_BAT_CAPACITY),
MSG_TABLE(ENGLISH, MSG_MK_I_OFFSET),
MSG_TABLE(ENGLISH, MSG_MK_I_FAKTOR),
MSG_TABLE(ENGLISH, MSG_MK_W_FAKTOR),
MSG_TABLE(ENGLISH, MSG_CALIBRATION),
MSG_TABLE(ENGLISH, MSG_RUNNING),
MSG_TABLE(ENGLISH, MSG_ERROR),
MSG_TABLE(ENGLISH, MSG_TX_NOT),
MSG_TABLE(ENGLISH, MSG_ACCU_LOW),
MSG_TABLE(ENGLISH, MSG_SERVO_CALIBR),
MSG_TABLE(ENGLISH, MSG_SERVO_STEPS),
MSG_TABLE(ENGLISH, MSG_SERVO1_REVERSE),
MSG_TABLE(ENGLISH, MSG_CALIB1_LEFT),
MSG_TABLE(ENGLISH, MSG_CALIB1_RIGHT),
MSG_TABLE(ENGLISH, MSG_CALIB1_MIDDLE),
MSG_TABLE(ENGLISH, MSG_SERVO2_REVERSE),
MSG_TABLE(ENGLISH, MSG_CALIB2_LEFT),
MSG_TABLE(ENGLISH, MSG_CALIB2_RIGHT),
MSG_TABLE(ENGLISH, MSG_CALIB2_MIDDLE),
MSG_TABLE(ENGLISH, MSG_FRAME),
MSG_TABLE(ENGLISH, MSG_PULSE_WIDTH),
MSG_TABLE(ENGLISH, MSG_CONTINOUS),
MSG_TABLE(ENGLISH, MSG_SINGLE_STE),
MSG_TABLE(ENGLISH, MSG_REPEAT),
MSG_TABLE(ENGLISH, MSG_PAUSE),
MSG_TABLE(ENGLISH, MSG_PAUSE_STEP),
MSG_TABLE(ENGLISH, MSG_COUNTER),
MSG_TABLE(ENGLISH, MSG_START),
MSG_TABLE(ENGLISH, MSG_OFF),
MSG_TABLE(ENGLISH, MSG_ON),
MSG_TABLE(ENGLISH, MSG_TRACKING),
MSG_TABLE(ENGLISH, MSG_TRACK_GPS),
MSG_TABLE(ENGLISH, MSG_TRACK_NMEA),
MSG_TABLE(ENGLISH, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(ENGLISH, MSG_HYSTERESE),
MSG_TABLE(ENGLISH, MSG_TRACK_TX_ON),
MSG_TABLE(ENGLISH, MSG_GPS_DISPLAY),
MSG_TABLE(ENGLISH, MSG_GPS_CALCULATE),
MSG_TABLE(ENGLISH, MSG_GPS_CURRENT),
MSG_TABLE(ENGLISH, MSG_GPS_HOME),
MSG_TABLE(ENGLISH, MSG_GPS_MISC),
MSG_TABLE(ENGLISH, MSG_GPS_NO_DATA),
MSG_TABLE(ENGLISH, MSG_RX_TIME),
MSG_TABLE(ENGLISH, MSG_COM),
MSG_TABLE(ENGLISH, MSG_KOMMA),
MSG_TABLE(ENGLISH, MSG_UHW33V),
};
 
PGM_P MessageTableFrench[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(FRENCH, MSG_LANGUAGE),
MSG_TABLE(FRENCH, MSG_GERMAN),
MSG_TABLE(FRENCH, MSG_ENGLISH),
MSG_TABLE(FRENCH, MSG_FRENCH),
MSG_TABLE(FRENCH, MSG_RETURN),
MSG_TABLE(FRENCH, MSG_AV_SOURCE),
MSG_TABLE(FRENCH, MSG_RX_CHANNEL),
MSG_TABLE(FRENCH, MSG_RSSI_CALIBR),
MSG_TABLE(FRENCH, MSG_RSSI_MIN_ALL),
MSG_TABLE(FRENCH, MSG_CALIB),
MSG_TABLE(FRENCH, MSG_TX),
MSG_TABLE(FRENCH, MSG_TX_OFF),
MSG_TABLE(FRENCH, MSG_TX_ON),
MSG_TABLE(FRENCH, MSG_CONTINUE),
MSG_TABLE(FRENCH, MSG_CONTRAST),
MSG_TABLE(FRENCH, MSG_BACKGR_LIGHT),
MSG_TABLE(FRENCH, MSG_LIGHT),
MSG_TABLE(FRENCH, MSG_LIGHT_OFF),
MSG_TABLE(FRENCH, MSG_LIGHT_ON),
MSG_TABLE(FRENCH, MSG_SEC),
MSG_TABLE(FRENCH, MSG_BATTERY),
MSG_TABLE(FRENCH, MSG_U_MIN),
MSG_TABLE(FRENCH, MSG_U_SETUP),
MSG_TABLE(FRENCH, MSG_U_OFFSET),
MSG_TABLE(FRENCH, MSG_MK_BATTERY),
MSG_TABLE(FRENCH, MSG_MK_BAT_NR),
MSG_TABLE(FRENCH, MSG_MK_BAT_CAPACITY),
MSG_TABLE(FRENCH, MSG_MK_I_OFFSET),
MSG_TABLE(FRENCH, MSG_MK_I_FAKTOR),
MSG_TABLE(FRENCH, MSG_MK_W_FAKTOR),
MSG_TABLE(FRENCH, MSG_CALIBRATION),
MSG_TABLE(FRENCH, MSG_RUNNING),
MSG_TABLE(FRENCH, MSG_ERROR),
MSG_TABLE(FRENCH, MSG_TX_NOT),
MSG_TABLE(FRENCH, MSG_ACCU_LOW),
MSG_TABLE(FRENCH, MSG_SERVO_CALIBR),
MSG_TABLE(FRENCH, MSG_SERVO_STEPS),
MSG_TABLE(FRENCH, MSG_SERVO1_REVERSE),
MSG_TABLE(FRENCH, MSG_CALIB1_LEFT),
MSG_TABLE(FRENCH, MSG_CALIB1_RIGHT),
MSG_TABLE(FRENCH, MSG_CALIB1_MIDDLE),
MSG_TABLE(FRENCH, MSG_SERVO2_REVERSE),
MSG_TABLE(FRENCH, MSG_CALIB2_LEFT),
MSG_TABLE(FRENCH, MSG_CALIB2_RIGHT),
MSG_TABLE(FRENCH, MSG_CALIB2_MIDDLE),
MSG_TABLE(FRENCH, MSG_FRAME),
MSG_TABLE(FRENCH, MSG_PULSE_WIDTH),
MSG_TABLE(FRENCH, MSG_CONTINOUS),
MSG_TABLE(FRENCH, MSG_SINGLE_STE),
MSG_TABLE(FRENCH, MSG_REPEAT),
MSG_TABLE(FRENCH, MSG_PAUSE),
MSG_TABLE(FRENCH, MSG_PAUSE_STEP),
MSG_TABLE(FRENCH, MSG_COUNTER),
MSG_TABLE(FRENCH, MSG_START),
MSG_TABLE(FRENCH, MSG_OFF),
MSG_TABLE(FRENCH, MSG_ON),
MSG_TABLE(FRENCH, MSG_TRACKING),
MSG_TABLE(FRENCH, MSG_TRACK_GPS),
MSG_TABLE(FRENCH, MSG_TRACK_NMEA),
MSG_TABLE(FRENCH, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(FRENCH, MSG_HYSTERESE),
MSG_TABLE(FRENCH, MSG_TRACK_TX_ON),
MSG_TABLE(FRENCH, MSG_GPS_DISPLAY),
MSG_TABLE(FRENCH, MSG_GPS_CALCULATE),
MSG_TABLE(FRENCH, MSG_GPS_CURRENT),
MSG_TABLE(FRENCH, MSG_GPS_HOME),
MSG_TABLE(FRENCH, MSG_GPS_MISC),
MSG_TABLE(FRENCH, MSG_GPS_NO_DATA),
MSG_TABLE(FRENCH, MSG_RX_TIME),
MSG_TABLE(FRENCH, MSG_COM),
MSG_TABLE(FRENCH, MSG_KOMMA),
MSG_TABLE(FRENCH, MSG_UHW33V),
};
 
PGM_P MessageTableInternational[MESSAGE_LAST_MESSAGE+1] PROGMEM = {
MSG_TABLE(INTERNAT, MSG_RSSI_MIN),
MSG_TABLE(INTERNAT, MSG_RSSI_MAX),
MSG_TABLE(INTERNAT, MSG_DIVERSITY),
MSG_TABLE(INTERNAT, MSG_LCD),
MSG_TABLE(INTERNAT, MSG_AV1),
MSG_TABLE(INTERNAT, MSG_AV2),
MSG_TABLE(INTERNAT, MSG_RX1),
MSG_TABLE(INTERNAT, MSG_RX2),
MSG_TABLE(INTERNAT, MSG_STEPS_255),
MSG_TABLE(INTERNAT, MSG_STEPS_1023),
MSG_TABLE(INTERNAT, MSG_SERVO),
MSG_TABLE(INTERNAT, MSG_SERVO1),
MSG_TABLE(INTERNAT, MSG_SERVO2),
MSG_TABLE(INTERNAT, MSG_TEST_SERVO),
MSG_TABLE(INTERNAT, MSG_TRACK_RSSI),
MSG_TABLE(INTERNAT, MSG_TRACK_MKCOCKPIT),
MSG_TABLE(INTERNAT, MSG_TRACK_SERVO_HYTERESE),
MSG_TABLE(INTERNAT, MSG_BAUDRATE),
MSG_TABLE(INTERNAT, MSG_UHW5V),
MSG_TABLE(INTERNAT, MSG_VERSION1),
MSG_TABLE(INTERNAT, MSG_VERSION2)
};
 
char* Msg(MessageType Message)
{ static char Str[LCD_LINES * LCD_COLS + 1];
 
if (Message > LAST_NAT_MESSAGE)
strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableInternational[Message - LAST_NAT_MESSAGE - 1]))));
else
switch (language) {
case ENGLISH: strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableEnglish[Message]))));
break;
case FRENCH : strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableFrench[Message]))));
break;
default: strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableGerman[Message]))));
}
return(Str);
}
/NGVideo5_8/tags/V1.30/messages.h
0,0 → 1,387
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/* http://www.avrfreaks.net/ */
/* index.php?name=PNphpBB2&file=viewtopic&t=71985&view=previous*/
/* */
/****************************************************************/
 
#ifndef _MESSAGES_H_
#define _MESSAGES_H_
 
#include <avr/pgmspace.h>
 
/* International */
#define INTERNAT_RSSI_MIN "RSSI-Min"
#define INTERNAT_RSSI_MAX "RSSI-Max"
#define INTERNAT_DIVERSITY "Diversity"
#define INTERNAT_LCD "LCD"
#define INTERNAT_AV1 "AV1"
#define INTERNAT_AV2 "AV2"
#define INTERNAT_RX1 "1.RX:"
#define INTERNAT_RX2 "2.RX:"
#define INTERNAT_STEPS_255 "255"
#define INTERNAT_STEPS_1023 "1023"
#define INTERNAT_SERVO "Servo"
#define INTERNAT_SERVO1 "Servo 1"
#define INTERNAT_SERVO2 "Servo 2"
#define INTERNAT_TEST_SERVO "Servo-Test"
#define INTERNAT_TRACK_RSSI "RSSI"
#define INTERNAT_TRACK_MKCOCKPIT "MK-Cockpit"
#define INTERNAT_TRACK_SERVO_HYTERESE "Servo-Hyster."
#define INTERNAT_BAUDRATE "Baudrate"
#define INTERNAT_UHW5V " 5V"
#define INTERNAT_VERSION1 "NG-Video 5.8GHz\nHW: "
#define INTERNAT_VERSION2 " M.Beck""FW: "VERSION " gebad"
 
#define GERMAN_LANGUAGE "Sprache"
#define GERMAN_GERMAN "Deutsch"
#define GERMAN_ENGLISH "Englisch"
#define GERMAN_FRENCH "Franz""\x94""sisch"
#define GERMAN_RETURN "Zur""\x81""ck"
#define GERMAN_AV_SOURCE "AV-Quelle"
#define GERMAN_RX_CHANNEL "RX-Kanal"
#define GERMAN_RSSI_CALIBR "RSSI-Kalibr."
#define GERMAN_RSSI_MIN_ALL "Min alle Kan."
#define GERMAN_TX "Bitte TX auf "
#define GERMAN_TX_OFF "AUS"
#define GERMAN_TX_ON "EIN"
#define GERMAN_CONTINUE "Weiter mit Enter"
#define GERMAN_CONTRAST "Kontrast"
#define GERMAN_BACKGR_LIGHT "LCD-Beleucht."
#define GERMAN_LIGHT "Licht:"
#define GERMAN_LIGHT_OFF " immer aus"
#define GERMAN_LIGHT_ON " immer ein"
#define GERMAN_SEC " Sek."
#define GERMAN_BATTERY "Batterie"
#define GERMAN_U_MIN "U-Min"
#define GERMAN_U_SETUP "Untersp.-Setup"
#define GERMAN_U_OFFSET "U-Offset"
#define GERMAN_MSG_MK_BATTERY "MK-Batterie"
#define GERMAN_MSG_MK_BAT_NR "Bat. Nummer"
#define GERMAN_MSG_MK_BAT_CAPACITY "Bat. Kapazit""\x84""t"
#define GERMAN_MSG_MK_I_OFFSET "I-Offset"
#define GERMAN_MSG_MK_I_FAKTOR "I-Koeffizient"
#define GERMAN_MSG_MK_W_FAKTOR "W-Koeffizient"
#define GERMAN_CALIBRATION "Kalibrierung"
#define GERMAN_RUNNING "l""\x84""uft"
#define GERMAN_ERROR "Fehler!"
#define GERMAN_TX_NOT "Sender nicht "
#define GERMAN_ACCU_LOW " Akku\n entladen!"
#define GERMAN_SERVO_CALIBR "Servo-Kalibr."
#define GERMAN_SERVO_STEPS "Servo-Schritte"
#define GERMAN_CALIB "Kalib."
#define GERMAN_LEFT "links"
#define GERMAN_RIGHT "rechts"
#define GERMAN_MIDDLE "Mitte"
#define GERMAN_REVERSE "rev."
#define GERMAN_SERVO1_REVERSE INTERNAT_SERVO1 " " GERMAN_REVERSE
#define GERMAN_CALIB1_LEFT GERMAN_CALIB "1 " GERMAN_LEFT
#define GERMAN_CALIB1_RIGHT GERMAN_CALIB "1 " GERMAN_RIGHT
#define GERMAN_CALIB1_MIDDLE GERMAN_CALIB "1 " GERMAN_MIDDLE
#define GERMAN_SERVO2_REVERSE INTERNAT_SERVO2 " " GERMAN_REVERSE
#define GERMAN_CALIB2_LEFT GERMAN_CALIB "2 " GERMAN_LEFT
#define GERMAN_CALIB2_RIGHT GERMAN_CALIB "2 " GERMAN_RIGHT
#define GERMAN_CALIB2_MIDDLE GERMAN_CALIB "2 " GERMAN_MIDDLE
#define GERMAN_FRAME "Periode"
#define GERMAN_PULSE_WIDTH "Test Pulsl""\x84""nge"
#define GERMAN_CONTINOUS "Test fortlauf."
#define GERMAN_SINGLE_STEP "Einzelschritte"
#define GERMAN_REPEAT "Anzahl Tests"
#define GERMAN_PAUSE "Pause Endpos."
#define GERMAN_PAUSE_STEP "Pause pro Inc."
#define GERMAN_COUNTER "Z""\x84""hler:"
#define GERMAN_START "Start Test"
#define GERMAN_OFF "aus"
#define GERMAN_ON "ein"
#define GERMAN_TRACKING "Antenne nachf."
#define GERMAN_TRACK_GPS "GPS mit wi232"
#define GERMAN_TRACK_NMEA "NMEA GPS"
#define GERMAN_TRACK_TX_OSD_DATA "TX OSD-Daten"
#define GERMAN_HYSTERESE "Hysterese"
#define GERMAN_TRACK_TX_ON "Sende Forderung"
#define GERMAN_GPS_DISPLAY "GPS-Anzeigen"
#define GERMAN_GPS_CALCULATE "berechn. Daten"
#define GERMAN_GPS_CURRENT "aktuelle Pos."
#define GERMAN_GPS_HOME "Startposition"
#define GERMAN_GPS_MISC "Elektr. Werte"
#define GERMAN_GPS_NO_DATA " Noch\n keine Daten\n empfangen!"
#define GERMAN_RX_TIME "RX-Zeit"
#define GERMAN_COM "Seriell COM"
#define GERMAN_KOMMA ","
#define GERMAN_UHW33V "3,3V"
 
#define ENGLISH_LANGUAGE "Language"
#define ENGLISH_GERMAN "German"
#define ENGLISH_ENGLISH "English"
#define ENGLISH_FRENCH "French"
#define ENGLISH_RETURN "Return"
#define ENGLISH_AV_SOURCE "AV-Source"
#define ENGLISH_RX_CHANNEL "RX-Channel"
#define ENGLISH_RSSI_CALIBR "RSSI-Calibr."
#define ENGLISH_RSSI_MIN_ALL "Min all Chan."
#define ENGLISH_TX "TX switch "
#define ENGLISH_TX_OFF "OFF"
#define ENGLISH_TX_ON "ON"
#define ENGLISH_CONTINUE "Continue Enter"
#define ENGLISH_CONTRAST "Contrast"
#define ENGLISH_BACKGR_LIGHT "Backgr. Light"
#define ENGLISH_LIGHT "Light:"
#define ENGLISH_LIGHT_OFF "always off"
#define ENGLISH_LIGHT_ON " always on"
#define ENGLISH_SEC " sec."
#define ENGLISH_BATTERY "Battery"
#define ENGLISH_U_MIN "U-Min"
#define ENGLISH_U_SETUP "Low voltage"
#define ENGLISH_U_OFFSET "U-Offset"
#define ENGLISH_MSG_MK_BATTERY "MK-Battery"
#define ENGLISH_MSG_MK_BAT_NR "Bat. Number"
#define ENGLISH_MSG_MK_BAT_CAPACITY "Bat. Capacity"
#define ENGLISH_MSG_MK_I_OFFSET "I-Offset"
#define ENGLISH_MSG_MK_I_FAKTOR "I-Coefficient"
#define ENGLISH_MSG_MK_W_FAKTOR "W-Coefficient"
#define ENGLISH_CALIBRATION "Calibration"
#define ENGLISH_RUNNING "running"
#define ENGLISH_ERROR "Error!"
#define ENGLISH_TX_NOT "Transmitter not "
#define ENGLISH_ACCU_LOW " Accu\n low!"
#define ENGLISH_SERVO_CALIBR "Servo-Calibr."
#define ENGLISH_SERVO_STEPS "Servo-Steps"
#define ENGLISH_CALIB "Calib."
#define ENGLISH_LEFT "left"
#define ENGLISH_RIGHT "right"
#define ENGLISH_MIDDLE "middle"
#define ENGLISH_REVERSE "rev."
#define ENGLISH_SERVO1_REVERSE INTERNAT_SERVO1 " " ENGLISH_REVERSE
#define ENGLISH_CALIB1_LEFT ENGLISH_CALIB "1 " ENGLISH_LEFT
#define ENGLISH_CALIB1_RIGHT ENGLISH_CALIB "1 " ENGLISH_RIGHT
#define ENGLISH_CALIB1_MIDDLE ENGLISH_CALIB "1 " ENGLISH_MIDDLE
#define ENGLISH_SERVO2_REVERSE INTERNAT_SERVO2 " " ENGLISH_REVERSE
#define ENGLISH_CALIB2_LEFT ENGLISH_CALIB "2 " ENGLISH_LEFT
#define ENGLISH_CALIB2_RIGHT ENGLISH_CALIB "2 " ENGLISH_RIGHT
#define ENGLISH_CALIB2_MIDDLE ENGLISH_CALIB "2 " ENGLISH_MIDDLE
#define ENGLISH_FRAME "Periode"
#define ENGLISH_PULSE_WIDTH "Test PW"
#define ENGLISH_CONTINOUS "Test contin."
#define ENGLISH_SINGLE_STEP "Single step"
#define ENGLISH_REPEAT "Number of test"
#define ENGLISH_PAUSE "Pause end pos."
#define ENGLISH_PAUSE_STEP "Pause pro inc."
#define ENGLISH_COUNTER "Counter:"
#define ENGLISH_START "Start Test"
#define ENGLISH_OFF "off"
#define ENGLISH_ON "on "
#define ENGLISH_TRACKING "Tracking"
#define ENGLISH_TRACK_GPS "GPS with wi232"
#define ENGLISH_TRACK_NMEA "NMEA GPS"
#define ENGLISH_TRACK_TX_OSD_DATA "TX OSD-Data"
#define ENGLISH_HYSTERESE "Hysterese"
#define ENGLISH_TRACK_TX_ON "Transmit demand"
#define ENGLISH_GPS_DISPLAY "Display GPS"
#define ENGLISH_GPS_CALCULATE "calc. Data"
#define ENGLISH_GPS_CURRENT "current Pos."
#define ENGLISH_GPS_HOME "Homeposition"
#define ENGLISH_GPS_MISC "Elictric Val."
#define ENGLISH_GPS_NO_DATA " Not yet\n Data\n received!"
#define ENGLISH_RX_TIME "RX-Time"
#define ENGLISH_COM "Seriell COM"
#define ENGLISH_KOMMA "."
#define ENGLISH_UHW33V "3.3V"
 
#define FRENCH_LANGUAGE "Langue"
#define FRENCH_GERMAN "Allemand"
#define FRENCH_ENGLISH "Anglais"
#define FRENCH_FRENCH "Fran""\x87""ais"
#define FRENCH_RETURN "Retour"
#define FRENCH_AV_SOURCE "AV-Source"
#define FRENCH_RX_CHANNEL "RX-Canal"
#define FRENCH_RSSI_CALIBR "RSSI-Calibr."
#define FRENCH_RSSI_MIN_ALL "Tout""\x85""z""\x82""ro"
#define FRENCH_TX ""
#define FRENCH_TX_OFF "Eteindre Tx"
#define FRENCH_TX_ON "Allumer Tx"
#define FRENCH_CONTINUE "App. Enter"
#define FRENCH_CONTRAST "Contraste"
#define FRENCH_BACKGR_LIGHT "Retr. Ecl"
#define FRENCH_LIGHT "Eclai:"
#define FRENCH_LIGHT_OFF " Eteint"
#define FRENCH_LIGHT_ON " Tjrs ON"
#define FRENCH_SEC " Sec."
#define FRENCH_BATTERY "Batterie"
#define FRENCH_U_MIN "V-Min"
#define FRENCH_U_SETUP "Seuil Alarme"
#define FRENCH_U_OFFSET "V-Offset"
#define FRENCH_MSG_MK_BATTERY "MK-Batterie"
#define FRENCH_MSG_MK_BAT_NR "Bat. num""\x82""ro"
#define FRENCH_MSG_MK_BAT_CAPACITY "Bat. capacit""\x82"
#define FRENCH_MSG_MK_I_OFFSET "I-Offset"
#define FRENCH_MSG_MK_I_FAKTOR "I-Coefficient"
#define FRENCH_MSG_MK_W_FAKTOR "W-Coefficient"
#define FRENCH_CALIBRATION "Calibration"
#define FRENCH_RUNNING "En cours"
#define FRENCH_ERROR "Erreur!"
#define FRENCH_TX_NOT "No Tx"
#define FRENCH_ACCU_LOW " Batterie\n faible!"
#define FRENCH_SERVO_CALIBR "Servo-Calibr"
#define FRENCH_SERVO_STEPS "Nbre de Pas"
#define FRENCH_CALIB "Calib."
#define FRENCH_LEFT "Gauche"
#define FRENCH_RIGHT "Droit"
#define FRENCH_MIDDLE "Milieu"
#define FRENCH_REVERSE "Inversion"
#define FRENCH_SERVO1_REVERSE "Invers. Servo1"
#define FRENCH_CALIB1_LEFT "Cal. Gauche"
#define FRENCH_CALIB1_RIGHT "Cal. Droite"
#define FRENCH_CALIB1_MIDDLE "Cal. Centre"
#define FRENCH_SERVO2_REVERSE "Invers. Servo2"
#define FRENCH_CALIB2_LEFT "Cal. Gauche"
#define FRENCH_CALIB2_RIGHT "Cal. Droite"
#define FRENCH_CALIB2_MIDDLE "Cal. Centre"
#define FRENCH_FRAME "P""\x82""riode"
#define FRENCH_PULSE_WIDTH "Largeur Imp."
#define FRENCH_CONTINOUS "Test Continu"
#define FRENCH_SINGLE_STEP "1 Pas"
#define FRENCH_REPEAT "Nombre Tests"
#define FRENCH_PAUSE "Pause finale"
#define FRENCH_PAUSE_STEP "Pause par pas"
#define FRENCH_COUNTER "Compter:"
#define FRENCH_START "D""\x82""but Test"
#define FRENCH_OFF "OFF"
#define FRENCH_ON "ON "
#define FRENCH_TRACKING "Tracking"
#define FRENCH_TRACK_GPS "GPS with wi232"
#define FRENCH_TRACK_NMEA "NMEA GPS"
#define FRENCH_TRACK_TX_OSD_DATA "TX OSD-Data"
#define FRENCH_HYSTERESE "Hysteresis"
#define FRENCH_TRACK_TX_ON "Donn""\x82""e Transmie"
#define FRENCH_GPS_DISPLAY "Affichage GPS"
#define FRENCH_GPS_CALCULATE "Calcul GPS"
#define FRENCH_GPS_CURRENT "Pos. actuelle"
#define FRENCH_GPS_HOME "Homeposition"
#define FRENCH_GPS_MISC "\x90""l""\x82""ctr. val."
#define FRENCH_GPS_NO_DATA " Aucune donn""\x82""e\n re""\x87""ue!"
#define FRENCH_RX_TIME "RX-Temps"
#define FRENCH_COM "COM. S""\x82""rie"
#define FRENCH_KOMMA "."
#define FRENCH_UHW33V "3.3V"
 
 
/* Languages */
#define GERMAN 0
#define ENGLISH 1
#define FRENCH 2
#define LAST_LANG 2
#define INTERNAT LAST_LANG + 1
#define NO_LANGUAGE 254 // für Sprachabfrage bei Erstinbetriebnahme NGVideo
 
/* Message languages */
#define MSG_LANGUAGE 0
#define MSG_GERMAN 1
#define MSG_ENGLISH 2
#define MSG_FRENCH 3
#define MSG_RETURN 4
#define MSG_AV_SOURCE 5
#define MSG_RX_CHANNEL 6
#define MSG_RSSI_CALIBR 7
#define MSG_RSSI_MIN_ALL 8
#define MSG_CALIB 9
#define MSG_TX 10
#define MSG_TX_OFF 11
#define MSG_TX_ON 12
#define MSG_CONTINUE 13
#define MSG_CONTRAST 14
#define MSG_BACKGR_LIGHT 15
#define MSG_LIGHT 16
#define MSG_LIGHT_OFF 17
#define MSG_LIGHT_ON 18
#define MSG_SEC 19
#define MSG_BATTERY 20
#define MSG_U_MIN 21
#define MSG_U_SETUP 22
#define MSG_U_OFFSET 23
#define MSG_MK_BATTERY 24
#define MSG_MK_BAT_NR 25
#define MSG_MK_BAT_CAPACITY 26
#define MSG_MK_I_OFFSET 27
#define MSG_MK_I_FAKTOR 28
#define MSG_MK_W_FAKTOR 29
#define MSG_CALIBRATION 30
#define MSG_RUNNING 31
#define MSG_ERROR 32
#define MSG_TX_NOT 33
#define MSG_ACCU_LOW 34
#define MSG_SERVO_CALIBR 35
#define MSG_SERVO_STEPS 36
#define MSG_SERVO1_REVERSE 37
#define MSG_CALIB1_LEFT 38
#define MSG_CALIB1_RIGHT 39
#define MSG_CALIB1_MIDDLE 40
#define MSG_SERVO2_REVERSE 41
#define MSG_CALIB2_LEFT 42
#define MSG_CALIB2_RIGHT 43
#define MSG_CALIB2_MIDDLE 44
#define MSG_FRAME 45
#define MSG_PULSE_WIDTH 46
#define MSG_CONTINOUS 47
#define MSG_SINGLE_STEP 48
#define MSG_REPEAT 49
#define MSG_PAUSE 50
#define MSG_PAUSE_STEP 51
#define MSG_COUNTER 52
#define MSG_START 53
#define MSG_OFF 54
#define MSG_ON 55
#define MSG_TRACKING 56
#define MSG_TRACK_GPS 57
#define MSG_TRACK_NMEA 58
#define MSG_TRACK_TX_OSD_DATA 59
#define MSG_HYSTERESE 60
#define MSG_TRACK_TX_ON 61
#define MSG_GPS_DISPLAY 62
#define MSG_GPS_CALCULATE 63
#define MSG_GPS_CURRENT 64
#define MSG_GPS_HOME 65
#define MSG_GPS_MISC 66
#define MSG_GPS_NO_DATA 67
#define MSG_RX_TIME 68
#define MSG_COM 69
#define MSG_KOMMA 70
#define MSG_UHW33V 71
#define LAST_NAT_MESSAGE 71
 
/* International */
#define MSG_RSSI_MIN 0 + LAST_NAT_MESSAGE + 1
#define MSG_RSSI_MAX 1 + LAST_NAT_MESSAGE + 1
#define MSG_DIVERSITY 2 + LAST_NAT_MESSAGE + 1
#define MSG_LCD 3 + LAST_NAT_MESSAGE + 1
#define MSG_AV1 4 + LAST_NAT_MESSAGE + 1
#define MSG_AV2 5 + LAST_NAT_MESSAGE + 1
#define MSG_RX1 6 + LAST_NAT_MESSAGE + 1
#define MSG_RX2 7 + LAST_NAT_MESSAGE + 1
#define MSG_STEPS_255 8 + LAST_NAT_MESSAGE + 1
#define MSG_STEPS_1023 9 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO 10 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO1 11 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO2 12 + LAST_NAT_MESSAGE + 1
#define MSG_TEST_SERVO 13 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_RSSI 14 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_MKCOCKPIT 15 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_SERVO_HYTERESE 16 + LAST_NAT_MESSAGE + 1
#define MSG_BAUDRATE 17 + LAST_NAT_MESSAGE + 1
#define MSG_UHW5V 18 + LAST_NAT_MESSAGE + 1
#define MSG_VERSION1 19 + LAST_NAT_MESSAGE + 1
#define MSG_VERSION2 20 + LAST_NAT_MESSAGE + 1
#define MESSAGE_LAST_MESSAGE 20
 
typedef uint16_t MessageType;
char* Msg(MessageType Message);
 
#endif /* _MESSAGES_H_ */
/NGVideo5_8/tags/V1.30/mk.h
0,0 → 1,59
#ifndef _MK_H_
#define _MK_H_
 
// Orginal H&I MK-Software
typedef struct {
int32_t Longitude; // in 1E-7 deg
int32_t Latitude; // in 1E-7 deg
int32_t Altitude; // in mm
uint8_t Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct {
uint16_t Distance; // distance to target in dm
int16_t Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
 
#define FC_FLAG_MOTOR_RUN 0x01
#define FC_FLAG_FLY 0x02
#define FC_FLAG_CALIBRATE 0x04
#define FC_FLAG_MOTOR_START 0x08
 
#define NC_FLAG_GPS_OK 0x80
 
typedef struct {
uint8_t Version; // version of the data structure
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
uint8_t WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
uint8_t WaypointNumber; // number of stored waypoints
uint8_t SatsInUse; // number of satellites used for position solution
int16_t Altimeter; // hight according to air pressure
int16_t Variometer; // climb(+) and sink(-) rate
uint16_t FlyingTime; // in seconds
uint8_t UBat; // Battery Voltage in 0.1 Volts
uint16_t GroundSpeed; // speed over ground in cm/s (2D)
int16_t Heading; // current flight direction in ° as angle to north
int16_t CompassHeading; // current compass value in °
int8_t AngleNick; // current Nick angle in 1°
int8_t AngleRoll; // current Rick angle in 1°
uint8_t RC_Quality; // RC_Quality
uint8_t FCStatusFlags; // Flags from FC
uint8_t NCFlags; // Flags from NC
uint8_t Errorcode; // 0 --> okay
uint8_t OperatingRadius; // current operation radius around the Home Position in m
int16_t TopSpeed; // velocity in vertical direction in cm/s
uint8_t TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
uint8_t RC_RSSI; // Receiver signal strength (since version 2 added)
int16_t SetpointAltitude; // setpoint for altitude
uint8_t Gas; // for future use
uint16_t Current; // actual current in 0.1A steps
uint16_t UsedCapacity; // used capacity in mAh
} __attribute__((packed)) NaviData_t;
 
#endif
/NGVideo5_8/tags/V1.30/ngvideo.avrgccproj
0,0 → 1,162
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>5.0</ProjectVersion>
<ProjectGuid>c0066cc9-6e35-4d76-9ffe-a4af66a2de41</ProjectGuid>
<avrdevice>ATmega644A</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>C</Language>
<OutputFile>ngvideo.elf</OutputFile>
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
<UseGlobalToolchain>False</UseGlobalToolchain>
<ToolchainDirPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\bin</ToolchainDirPath>
<MakeDirPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\bin</MakeDirPath>
<GlobalToolchainPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR ToolChain\bin</GlobalToolchainPath>
<AvrGccProjectExtensions>
</AvrGccProjectExtensions>
<avrtool>com.atmel.avrdbg.tool.simulator</avrtool>
<preserveEEPROM>True</preserveEEPROM>
<avrtoolinterface>JTAG</avrtoolinterface>
<com_atmel_avrdbg_tool_avrdragon>
<ToolType>com.atmel.avrdbg.tool.avrdragon</ToolType>
<ToolName>AVR Dragon</ToolName>
<ToolNumber>00A200005843</ToolNumber>
<Channel>
<host>127.0.0.1</host>
<port>9042</port>
<ssl>False</ssl>
</Channel>
<ToolOptions>
<InterfaceName>JTAG</InterfaceName>
<InterfaceProperties>
<JtagDbgClock>200000</JtagDbgClock>
<JtagProgClock>1000000</JtagProgClock>
<IspClock>150000</IspClock>
<JtagInChain>false</JtagInChain>
<JtagEnableExtResetOnStartSession>false</JtagEnableExtResetOnStartSession>
<JtagDevicesBefore>0</JtagDevicesBefore>
<JtagDevicesAfter>0</JtagDevicesAfter>
<JtagInstrBitsBefore>0</JtagInstrBitsBefore>
<JtagInstrBitsAfter>0</JtagInstrBitsAfter>
</InterfaceProperties>
</ToolOptions>
</com_atmel_avrdbg_tool_avrdragon>
<com_atmel_avrdbg_tool_simulator>
<ToolType xmlns="">com.atmel.avrdbg.tool.simulator</ToolType>
<ToolName xmlns="">AVR Simulator</ToolName>
<ToolNumber xmlns="">
</ToolNumber>
<Channel xmlns="">
<host>127.0.0.1</host>
<port>1486</port>
<ssl>False</ssl>
</Channel>
</com_atmel_avrdbg_tool_simulator>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'default' ">
<OutputPath>bin\default\</OutputPath>
<MemorySettings>
<MemorySegments>
<InitialStack IsEnabled="0">
<Address>0x1000</Address>
</InitialStack>
</MemorySegments>
</MemorySettings>
<ToolchainSettings>
<AvrGcc>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.compiler.miscellaneous.OtherFlags>-gdwarf-2 -std=gnu99 </avrgcc.compiler.miscellaneous.OtherFlags>
<avrgcc.assembler.general.AssemblerFlags>-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</avrgcc.assembler.general.AssemblerFlags>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g2)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<ExternalMakeFilePath>D:\Daten\Entwicklung\FW NGVideo-5.8GHz\tags\ngvideo\makefile</ExternalMakeFilePath>
<GenerateHexFile>True</GenerateHexFile>
<OutputDirectory>D:\Daten\Entwicklung\FW NGVideo-5.8GHz\tags\ngvideo</OutputDirectory>
</PropertyGroup>
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\AvrGCC.targets" />
<ItemGroup>
<Compile Include="config.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="dogm.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="dogm.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="keys.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="keys.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="lipo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="lipo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="main.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="menue.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="menue.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="messages.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="messages.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="mk.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="ngvideo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="ngvideo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="servo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="servo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="tools.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="tools.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="tracking.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="tracking.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="usart.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="usart.h">
<SubType>compile</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="makefile">
<SubType>compile</SubType>
</None>
</ItemGroup>
</Project>
/NGVideo5_8/tags/V1.30/ngvideo.avrsln
0,0 → 1,17

Microsoft Visual Studio Solution File, Format Version 11.00
# AvrStudio Solution File, Format Version 11.00
Project("{D1100916-62DA-4D80-A9B4-55A1E7CCEEB3}") = "ngvideo", "ngvideo.avrgccproj", "{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
default|AVR = default|AVR
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}.default|AVR.ActiveCfg = default|AVR
{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}.default|AVR.Build.0 = default|AVR
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
/NGVideo5_8/tags/V1.30/ngvideo.avrsuo
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/NGVideo5_8/tags/V1.30/ngvideo.aws
0,0 → 1,0
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA644"/><Files><File00000 Name="C:\Source\atmel4\ngvideo\tracking.c" Position="354 210 1296 580" LineCol="157 0" State="Maximized"/><File00001 Name="C:\Source\atmel4\ngvideo\usart.c" Position="262 99 1370 654" LineCol="238 0" State="Maximized"/><File00002 Name="C:\Source\atmel4\ngvideo\usart.h" Position="288 144 1212 496" LineCol="41 4" State="Maximized"/></Files></AVRWorkspace>
/NGVideo5_8/tags/V1.30/ngvideo.c
0,0 → 1,833
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
 
#include "config.h"
#include "dogm.h"
#include "messages.h"
#include "ngvideo.h"
#include "menue.h"
#include "servo.h"
#include "tools.h"
#include "keys.h"
#include "usart.h"
#include "tracking.h"
 
// LCD selbst definierte Sonderzeichen, RSSI-Balken und wi232 Empfang Daten im Flash
// deshalb in dogm.c lcdPutc(pgm_read_byte(&lcdChr[i]));
SpecialChr_t lcdSpecialChr[7] PROGMEM = {{32,32,16,16,16,16,32,32},
{32,32,24,24,24,24,32,32},
{32,32,28,28,28,28,32,32},
{32,32,30,30,30,30,32,32},
{32,32,31,31,31,31,32,32},
{6,8,20,19,20,8,6,32},
{4,10,32,14,4,4,14,32}}; // Antenne und Imax
 
SpecialChr_t lcdSpecialChrLs[8] PROGMEM = {{32,1,1,1,1,1,1,32},
{32,31,1,1,1,1,31,32},
{32,31,3,3,3,3,31,32},
{32,31,7,7,7,7,31,32},
{32,31,15,15,15,15,31,32},
{32,31,31,31,31,31,31,32},
{32,16,16,16,16,16,16,32},
{32,31,32,32,32,32,31,32}};
 
SpecialChr_t lcdSpecialChrRs[5] PROGMEM = {{32,1,1,1,1,1,1,32},
{32,31,16,16,16,16,31,32},
{32,31,24,24,24,24,31,32},
{32,31,28,28,28,28,31,32},
{32,31,30,30,30,30,31,32}};
 
/**************************************************************/
/* */
/* EEPROM */
/* */
/**************************************************************/
uint8_t ep_eep_init EEPROM;
char ep_version[sizeof(VERSION)] EEPROM;
uint8_t ep_dogm_vers EEPROM;
uint8_t ep_contrast EEPROM;
uint8_t ep_light_time EEPROM;
uint8_t ep_u_offset EEPROM;
uint16_t ep_u_min EEPROM;
uint8_t ep_channel EEPROM;
uint8_t ep_av_source EEPROM;
uint8_t ep_language EEPROM;
udbm_t ep_udbm[CHANNEL_MAX] EEPROM;
uint8_t ep_sIdxSteps EEPROM;
servo_t ep_servo[SERVO_NUM_CHANNELS] EEPROM;
uint8_t ep_servo_frame EEPROM;
uint8_t ep_servo_nr EEPROM;
uint8_t ep_single_step EEPROM;
uint8_t ep_repeat EEPROM;
uint8_t ep_pause EEPROM;
uint8_t ep_pause_step EEPROM;
uint8_t ep_tracking EEPROM;
uint8_t ep_track_hyst EEPROM;
uint8_t ep_track_tx EEPROM;
uint8_t ep_baudrate EEPROM;
mk_current_t ep_mk_current EEPROM;
uint8_t ep_mk_akku_nr EEPROM;
mk_lipo_t ep_mk_lipo[AKKU_NR_MAX+1] EEPROM;
uint8_t ep_mk_i_offset EEPROM;
uint8_t ep_mk_i_faktor EEPROM;
uint8_t ep_mk_w_faktor EEPROM;
 
/**************************************************************/
// Working variables of EEPROM contents
uint8_t dogm_vers;
uint8_t contrast;
uint8_t light_time = BACKGR_LIGHT_MAX;
uint8_t backgr_light = OFF;
uint8_t u_offset = U_OFFSET;
uint16_t u_min = U_MIN;
uint8_t channel = CHANNEL;
uint8_t av_source = AV_SOURCE;
uint8_t language = NO_LANGUAGE;
udbm_t udbm = {UDBM_MIN, UDBM_MAX, UDBM_KORR_FA, UDBM_KORR_FA};
uint16_t hyst_u_min;
servo_t servo[SERVO_NUM_CHANNELS] = {{SERVO_REV, SERVO_I0_RIGHT, SERVO_I0_LEFT, SERVO_I0_MIDDLE},\
{SERVO_REV, SERVO_I0_RIGHT, SERVO_I0_LEFT, SERVO_I0_MIDDLE}};
uint8_t servo_frame = SERVO_PERIODE;
uint8_t single_step = SINGLE_STEP;
uint8_t repeat = REPEAT;
uint8_t pause = PAUSE;
uint8_t pause_step = PAUSE_STEP;
uint8_t baudrate = BAUDRATE;
 
/**************************************************************/
uint8_t coldstart; // Flag erstmaliger MK-Start(Motore) nur nach GPS-Fix
uint8_t ch_stored; // Flag zur Speicherung, wenn Wert im Hauptdisplay geändert
 
uint8_t gps_display = 0;
uint8_t gps_disp_clear;
 
uint16_t bar_udbm[12]; // RSSI-Bargraph
uint8_t wudbm; // Differenz/Abstand benachbarter udbm[i] für differenzierteren Bargraphen
uint8_t bat_low = 0;
uint8_t sw_avx; // steuert über Set_AV_Source() oder rssi_diversity(av_source) Marker-Position und RX-Umschaltung
uint8_t mux_X; // berücksichtigt Schaltung auf Grund Synchronisation und RSSI (sw_avx meist RSSI) RX-Zählung
uint8_t MK_Motor_run = 0; // Flag für RX Time-Counter Start/Stop
uint8_t mk_timer = 0; // Zeitzähler lipo.time_on auf aus
 
const uint16_t PROGMEM baud[8] = {4800, 7200, 9600, 14400, 19200, 38400, 57600};
 
volatile uint8_t vsync0;
volatile uint8_t vsync1;
volatile uint8_t vscount0;
volatile uint8_t vscount1;
volatile uint32_t rxcount0 = 0;
volatile uint32_t rxcount1 = 0;
 
 
/************************************************************************************/
/* initialisiert den EEPROM mit default Werten, bzw. liest EEPROM gespeicherte */
/* Werte in gloabale Variablen. */
/* Parameter: */
/* uint8_t ep_reset :0 = zwangsweises Rückstetzen auf default-Werte */
/* */
/************************************************************************************/
void Init_EEPROM(uint8_t ep_reset)
{ char ver[sizeof(VERSION)];
uint8_t eep_init;
eep_init = eeprom_read_byte(&ep_eep_init);
eeprom_read_block(&ver, &ep_version, sizeof(VERSION));
_delay_ms(1);
 
if ((eep_init != EEP_INITB) || (ep_reset == 0) || strcmp(VERSION, ver))
{
// nur bei Erstinitialisierung DOGM auf default 3,3V setzen
if ((eep_init != EEP_INITB) || strcmp(VERSION, ver)){
eeprom_write_byte(&ep_eep_init, EEP_INITB);
eeprom_write_byte(&ep_dogm_vers, DOGM3V);
eeprom_write_byte(&ep_contrast, CONTRAST3V);
eeprom_write_block(&VERSION, &ep_version, sizeof(VERSION));
}
eeprom_write_byte(&ep_light_time, BACKGR_LIGHT_MAX);
eeprom_write_byte(&ep_u_offset, U_OFFSET);
eeprom_write_word(&ep_u_min, U_MIN);
eeprom_write_byte(&ep_channel, CHANNEL);
eeprom_write_byte(&ep_av_source, AV_SOURCE);
eeprom_write_byte(&ep_language, NO_LANGUAGE);
for (uint8_t i = 0; i < CHANNEL_MAX; i++)
eeprom_write_block(&udbm,&ep_udbm[i],sizeof(udbm_t));
eeprom_write_byte(&ep_sIdxSteps, STEPS_255);
eeprom_write_block(&servo[0],&ep_servo[0],sizeof(servo_t));
eeprom_write_block(&servo[1],&ep_servo[1],sizeof(servo_t));
eeprom_write_byte(&ep_servo_frame, SERVO_PERIODE);
eeprom_write_byte(&ep_servo_nr, 0); // nur bei Test-Servo
eeprom_write_byte(&ep_single_step, SINGLE_STEP); // nur bei Test-Servo
eeprom_write_byte(&ep_repeat, REPEAT); // nur bei Test-Servo
eeprom_write_byte(&ep_pause, PAUSE); // nur bei Test-Servo
eeprom_write_byte(&ep_pause_step, PAUSE_STEP); // nur bei Test-Servo
eeprom_write_byte(&ep_tracking, TRACKING_MIN);
eeprom_write_byte(&ep_track_hyst, TRACKING_HYSTERESE);
eeprom_write_byte(&ep_track_tx, 0);
eeprom_write_byte(&ep_baudrate, BAUDRATE);
eeprom_write_block(&mk_current,&ep_mk_current,sizeof(mk_current_t));
eeprom_write_byte(&ep_mk_akku_nr, AKKU_NR_MIN);
for (uint8_t i = 0; i <= AKKU_NR_MAX; i++)
eeprom_write_block(&mk_lipo,&ep_mk_lipo[i],sizeof(mk_lipo_t));
eeprom_write_byte(&ep_mk_i_offset, MK_I_OFFSET);
eeprom_write_byte(&ep_mk_i_faktor, MK_I_FAKTOR);
eeprom_write_byte(&ep_mk_w_faktor, MK_W_FAKTOR);
sIdxSteps = STEPS_255;
}
else
{
light_time = eeprom_read_byte(&ep_light_time);
u_offset = eeprom_read_byte(&ep_u_offset);
u_min = eeprom_read_word(&ep_u_min);
channel = eeprom_read_byte(&ep_channel);
av_source = eeprom_read_byte(&ep_av_source);
language = eeprom_read_byte(&ep_language);
sIdxSteps = eeprom_read_byte(&ep_sIdxSteps);
eeprom_read_block(&servo[0],&ep_servo[0],sizeof(servo_t));
eeprom_read_block(&servo[1],&ep_servo[1],sizeof(servo_t));
servo_frame = eeprom_read_byte(&ep_servo_frame); // nur bei Test-Servo
single_step = eeprom_read_byte(&ep_single_step); // nur bei Test-Servo
repeat = eeprom_read_byte(&ep_repeat); // nur bei Test-Servo
pause = eeprom_read_byte(&ep_pause); // nur bei Test-Servo
pause_step = eeprom_read_byte(&ep_pause_step); // nur bei Test-Servo
tracking = eeprom_read_byte(&ep_tracking);
track_hyst = eeprom_read_byte(&ep_track_hyst);
track_tx = eeprom_read_byte(&ep_track_tx);
baudrate = eeprom_read_byte(&ep_baudrate);
eeprom_read_block(&mk_current,&ep_mk_current,sizeof(mk_current_t));
mk_akku_nr = eeprom_read_byte(&ep_mk_akku_nr);
eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
mk_i_offset = eeprom_read_byte(&ep_mk_i_offset);
mk_i_faktor = eeprom_read_byte(&ep_mk_i_faktor);
mk_w_faktor = eeprom_read_byte(&ep_mk_w_faktor);
}
dogm_vers = eeprom_read_byte(&ep_dogm_vers);
contrast = eeprom_read_byte(&ep_contrast);
hyst_u_min = u_min;
sw_avx = av_source;
for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
servoSet_rev(i, servo[i].rev);
servoSet_min(i, servo[i].min);
servoSet_max(i, servo[i].max);
servoSet_mid(i, servo[i].mid);
}
// Vorberechnung von ServoChannels[channel].duty
servoSetDefaultPos(); // Ausgangsstellung beider Servos
coldstart = 1;
USART_Init_Baudrate();
USART_RX_Mode(tracking);
mk_dUsedCapacity = mk_lipo.UsedCapacity;
}
 
void servoSetDefaultPos(void)
{
servoSetPosition(SERVO_PAN, ServoSteps()/2); // Ausgangsstellung SERVO_PAN
servoSetPosition(SERVO_TILT, 0); // Ausgangsstellung SERVO_TILT
}
 
void USART_Init_Baudrate(void)
{
if (tracking == TRACKING_MKCOCKPIT || tracking == TRACKING_NMEA)
USART_Init(getBaud(baudrate));
else
USART_Init(57600);
}
 
/************************************************************************************/
/* setzt Flag für 3,3V oder 5V DOGM */
/* Parameter: */
/* uint8_t dogm :Version */
/* */
/************************************************************************************/
void Set_DOGM_Version(void)
{
if(dogm_vers == DOGM5V) {
dogm_vers = DOGM3V;
contrast = CONTRAST3V;
}
else {
dogm_vers = DOGM5V;
contrast = CONTRAST5V;
}
eeprom_write_byte(&ep_dogm_vers, dogm_vers);
eeprom_write_byte(&ep_contrast, contrast);
}
 
/************************************************************************************/
/* setzt den RX-Kanal von 1 bis 7 */
/* Parameter: */
/* uint8_t channel :Kanal */
/* */
/************************************************************************************/
void Set_Channel(uint8_t channel)
{ uint8_t tmp;
 
channel--;
tmp = channel & 0b00000111; // Kanal 1 bis 7 Werte 0 bis 6 setzen
PORTA |= tmp;
PORTB |= tmp;
tmp = channel | 0b11111000;
PORTA &= tmp;
PORTB &= tmp;
wudbm = RSSI_Calc_UdBm(bar_udbm); // Vergleichstabelle für dBm-Balken berechnen
}
 
/************************************************************************************/
/* schaltet den MUX auf AV1 oder AV2 ohne Darstellung und en-/disabled Interrupt */
/* wird nur in main.c (Initialisierung) und Menü Sourceumschaltung eingesetzt */
/* deswegen cli() und sei() nur in Menu_AV_Source(void) */
/* Parameter: */
/* uint8_t src :0-AV1, 1-AV2 */
/* */
/************************************************************************************/
void SetMux0(void) {
SET_MUX_0;
mux_X = 0; // für Erkennung RX Zeitzähler
}
 
void SetMux1(void) {
SET_MUX_1;
mux_X = 1; // für Erkennung RX Zeitzähler
}
 
uint8_t Set_AV_Source(uint8_t src)
{
switch(src) {
case AV1: CLEAR_INT10; // Interrupt für Sync ausschalten
SetMux0();
break;
case AV2: CLEAR_INT10; // Interrupt für Sync ausschalten
SetMux1();
break;
case DIVERSITY: SET_INT10; // External Interrupt Mask Register ein
SetMux0();
break;
}
return(src);
}
 
 
/**************************************************************/
/* */
/* LCD-Backlight */
/* */
/**************************************************************/
 
void lcdSet_BackgrLight_Off(void)
{
backgr_light = OFF;
lcdBacklightOff();
}
 
void lcd_BackgrLight_On(void)
{ // ...&& (light_count < light_time)) ==> sonst wird Beleuchtung laufend wieder eingeschaltet
if ((backgr_light == OFF) && (light_count < light_time)) {
backgr_light = ON;
lcdBacklightOn();
}
}
 
void lcd_BackgrLight(void)
{
if (backgr_light == ON) { // nur wenn Beleuchtung an
if (light_time == BACKGR_LIGHT_MIN) // Hintergrundbeleuchtung immer aus?
lcdSet_BackgrLight_Off();
else
if (light_time < BACKGR_LIGHT_MAX) { // Hintergrundbeleuchtung immer an?
cli();
light_count++;
sei();
if (light_count >= light_time) lcdSet_BackgrLight_Off();
}
}
}
 
/**************************************************************/
/* */
/* ADC */
/* */
/* http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial */
/* */
/**************************************************************/
 
void ADC_Init(void)
{
uint16_t result;
ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen, da an AREF 4,8 V
ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler Prescaler 128
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
result = ADCW;
}
 
/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
return ADCW; // ADC auslesen und zurückgeben
}
 
/* ADC Mehrfachmessung mit Mittelwertbbildung */
adc_avg_t ADC_Read_Avg(uint8_t channel0, uint8_t channel1, uint16_t average )
{ adc_avg_t result;
uint32_t u0 = 0;
uint32_t u1 = 0;
 
for (uint16_t i = 0; i < average; ++i){
u0 += ADC_Read( channel0 );
u1 += ADC_Read( channel1 );
_delay_ms(1);
}
result.u0 = u0/average;
result.u1 = u1/average;
return(result);
}
 
/**************************************************************/
/* */
/* Beeper */
/* */
/* Bei AVR-Studio 5 ist in delay.h */
/* #define __DELAY_BACKWARD_COMPATIBLE__ */
/* zu setzen */
/* */
/**************************************************************/
 
void Beep(uint8_t time)
{
PORTB |= (1<<BEEPER);
_delay_ms(time);
PORTB &= ~(1<<BEEPER);
}
 
void Double_Beep(uint8_t time, uint8_t pause)
{
Beep(time);
_delay_ms(pause);
Beep(time);
}
 
/**************************************************************/
/* */
/* U-Batterie */
/* */
/**************************************************************/
 
// uint16_t u, da bei Displ_Fnct[fu_index](val) der größte Wert UBat gleich 16 Bit
void Displ_1Nk(uint16_t u)
{
// 4 => 2 Ziffern vor Komma + 1 Komma + eine Ziffer Nachkomma darstellen, 2 Festkomma
lcdPuts(my_itoa(u,4,2,1));
}
 
void Displ_U_2Nk(uint16_t u)
{
lcdPuts(my_itoa(u,5,2,2));
lcdPutc('V');
}
 
// uint8_t beep_timer :Akku-leer-Beeper nur mit Task_0_1()-Intervalle bei Menü-Rücksprung
uint16_t U_Messen_cmp(uint8_t beep_timer)
{ uint16_t ubat;
static struct
{ uint8_t time;
uint8_t count;
} beep_low;
 
/* ubat = ((ADC_Read(VBAT) * Vref * (R104 + R103)) /(1024 * R103)) + UD10 (UD10 ist Offset)
Verhältniswert * 100 *8192 ( Verhältniswert = realer Korrekturwert;
mal 100 da alle Werte 2 Nachkommastellen berücksichtigt, aber ohne gerechnet wird
mal 8192 => ohne Bruch gerechnet aber dabei mehr Kommastellen berücksichtigt) */
ubat = (ADC_Read(VBAT) * (uint64_t)43504 + (uint64_t)u_offset * 8192)/ 8192;
if ( ubat <= hyst_u_min )
{
if (!bat_low) { // nicht laufend Display neu schreiben
hyst_u_min = u_min + 20; // 200mV Hysterese - beruhigt Anzeige
if (tracking == TRACKING_GPS)
store_LipoData(); // wenigstens von GPS-Statisik UsedCapacity, time_on usw. speichern
lcdClear();
lcdPuts(Msg(MSG_ACCU_LOW));
bat_low = 1;
Beep(BEEPBAT);
// da derzeit Fkt. aller 500ms aufgerufen, mit 2 Min Abstand beginnen
beep_low.time = BEEP_LOW_TIME;
beep_low.count = 0;
}
// Akku leer, in immer kürzeren Intervallen Beep
if ((beep_timer == 1) && (beep_low.count++ >= beep_low.time)){
Beep(BEEPBAT);
if (beep_low.time > 2)
beep_low.time /= 2;
beep_low.count = 0;
}
}
else {
if (hyst_u_min > u_min) { // falls Anzeige von Batterie leer
bat_low = 0; // und zurück geschaltet wird,
hyst_u_min = u_min; // dann Main_Disp wieder darstellen
Displ_Main_Disp();
}
}
return(ubat);
}
 
void Displ_VBat(void) // da u_offset globale Variable
{ uint16_t ubat;
ubat = U_Messen_cmp(ENABLE_BTIMER);
if (!bat_low) { // würde sonst Anzeige Akku leer überschreiben
lcdGotoXY(11, 0);
Displ_1Nk(ubat);
}
}
 
 
/**************************************************************/
/* */
/* RSSI */
/* */
/**************************************************************/
 
/* RSSI Werte Korrekturfaktor berechnen */
uint16_t RSSI_Calc_Korr(uint8_t nchannel, uint16_t u0, uint16_t u1)
{ uint16_t u_max;
 
// immer nur den kleineren Wert vergrößern
if (u0 < u1) {
udbm.korr_1 = (((uint32_t)u1 * UDBM_KORR_FA) / u0); // nur mit Integer und 2 Nachkommastellen rechnen
udbm.korr_2 = UDBM_KORR_FA;
u_max = u1;
}
else {
udbm.korr_2 = (((uint32_t)u0 * UDBM_KORR_FA) / u1); // nur mit Integer und 2 Nachkommastellen rechnen
udbm.korr_1 = UDBM_KORR_FA;
u_max = u0;
}
eeprom_write_word(&ep_udbm[nchannel - 1].korr_1, udbm.korr_1);
eeprom_write_word(&ep_udbm[nchannel - 1].korr_2, udbm.korr_2);
return(u_max);
}
 
void Displ_Calibr_Aktiv(uint8_t nchannel)
{ char str[LCD_COLS + 1];
uint8_t l;
uint8_t zle = 1;
 
// Anzeige für nur einen Kanal oder wenn in Schleife, Kanalnr. des z.Z. kalbrierenden Kanals
lcdClear();
lcdPutStrMid(Msg(MSG_CALIBRATION),0);
if (nchannel > 0) { // Anzeige aller RX-Kanäle min. kalibrieren?
strcpy(str, Msg(MSG_RX_CHANNEL));
strcat(str, ": ");
l = strlen(str);
str[l] = nchannel + 0x30; // gerade zu kalibrierender Kanal, String zusammen stellen
str[++l] = '\0';
lcdPutStrMid(str,1);
zle = 2;
}
lcdPutStrMid(Msg(MSG_RUNNING),zle);
}
 
void Displ_Error_TX(uint8_t message)
{
lcdClear();
lcdPutStrMid(Msg(MSG_ERROR), 0);
lcdPutStrMid(Msg(MSG_TX_NOT), 1);
lcdPutStrMid(Msg(message), 2);
delay_ms100x(30);
}
 
uint8_t RSSI_Min_Calibrate(uint8_t nchannel, uint16_t *pbar_udbm)
{ adc_avg_t rssi_avg;
uint16_t udbm_min;
uint8_t one_channel = !nchannel;
 
Displ_Calibr_Aktiv(nchannel);
if (one_channel) nchannel = channel;
rssi_avg = ADC_Read_Avg(RSSI0, RSSI1, 1000 ); //1000 Wiederholungen mit Mittelwertbildung
// Plausibilitätsprüfung ob Sender ausgeschaltet
if (rssi_avg.u0 + rssi_avg.u1 > 500) {
udbm_min = RSSI_Calc_Korr(nchannel, rssi_avg.u0, rssi_avg.u1); // ist real die größere Spannung, aber der kleinere dbm Wert
eeprom_write_word(&ep_udbm[nchannel - 1].min, udbm_min);
if (one_channel) {
Double_Beep(DBEEPWR, DBEEPWRP);
wudbm = RSSI_Calc_UdBm(pbar_udbm);
}
}
else
if (one_channel)
Displ_Error_TX(MSG_TX_OFF);
else
return(0); // Fehleranzeige wird in menue.c gesammelt ausgewertet
return(1); // kein Fehler, da bei einen Kanal bereits Fehler angezeigt wurde
}
 
void RSSI_Max_Calibrate(uint16_t *pbar_udbm)
{ adc_avg_t rssi_avg;
uint16_t udbm_max;
 
Displ_Calibr_Aktiv(0);
rssi_avg = ADC_Read_Avg(RSSI0, RSSI1, 1000 ); //1000 Wiederholungen mit Mittelwertbildung
// Plausibilitätsprüfung ob Sender in der Nähe eingeschaltet
if (rssi_avg.u0 + rssi_avg.u1 < 400) {
udbm_max = RSSI_Calc_Korr(channel, rssi_avg.u0, rssi_avg.u1); // ist real die kleinere Spannung, aber der größere dbm Wert
eeprom_write_word(&ep_udbm[channel - 1].max, udbm_max);
Double_Beep(DBEEPWR, DBEEPWRP);
wudbm = RSSI_Calc_UdBm(pbar_udbm);
}
else Displ_Error_TX(MSG_TX_ON);
}
 
// Vergleichstabelle für RSSI-Bargraph berechnen, vermeidet laufend gleiche Berechnung
uint8_t RSSI_Calc_UdBm(uint16_t *pbar_udbm)
{ uint8_t n;
 
eeprom_read_block(&udbm,&ep_udbm[channel - 1],sizeof(udbm_t));
// -15 um Ende dBm Skala sicher zu erreichen; ohne verfeinerten Bahrgraph war Wert -3
n = (udbm.min - udbm.max -15)/11;
for (uint8_t i = 0; i < 12; i++)
pbar_udbm[i] = (udbm.min - i * n);
return(n / 5); // da 5 Pixel Breite pro Display-Zeichen; Anzeigebalken pro Pixel differenzieren
}
 
void Displ_RSSI_Bargraph(uint16_t *pbar_udbm, uint8_t wudbm, uint16_t uadc)
{ char charBar[12];
uint8_t i;
int8_t lz = 11;
char b = 4;
// Balken zeichnen - udbm
for (i = 0; i < 12; i++) {
if ((b != ' ') && (uadc > pbar_udbm[i])) {
b = ' ';
lz = i - 1;
}
charBar[i] = b;
}
if (lz >= 0) {
charBar[lz] = (pbar_udbm[lz] - uadc) / wudbm ;// Anzeigebalken pro Pixel-"Breite" differenzieren
// bei Teilung 4 wäre richtig und keine Korr. erforderlich, so aber gleichmäßigerer Balkenverlauf
if (charBar[lz] > 4) charBar[lz] = 4;
}
for (i = 0; i < 12; i++)// lcdPuts (ist auch for) funktioniert hier nicht, da Char'\0' für Zeichen auch Stringende
lcdPutc(charBar[i]);
}
 
uint8_t RSSI_Diversity(uint8_t src, uint16_t *pbar_udbm, uint8_t visible)
{ uint16_t u0, u1;
static uint8_t div_flag, ret_div_flag;
char marker;
 
u0 = (ADC_Read(RSSI0) * (uint32_t)udbm.korr_1)/UDBM_KORR_FA;
u1 = (ADC_Read(RSSI1) * (uint32_t)udbm.korr_2)/UDBM_KORR_FA;
// falls beide RX gleich gut/schlecht synchronisieren
// Achtung! Niedrigere Spannung - größere Feldstärke
if (src == DIVERSITY) {
if (u0 < u1) {
ret_div_flag = AV1;
if ((vscount0 == 255) && (vscount1 == 255)) SetMux0(); // egal wann RSSI schaltet ==> es ist kein sync vorhanden
}
else {
ret_div_flag = AV2;
if ((vscount0 == 255) && (vscount1 == 255)) SetMux1(); // egal wann RSSI schaltet ==> es ist kein sync vorhanden
}
}
else ret_div_flag = src; // sonst leerer Returnwert
if (visible) {
if (src == DIVERSITY) {
// Synchronisation vorrangig zur Feldstärke
if ((vsync0 != vsync1) && ((vscount0 & vscount1) < 255)) {
// ist nur zur Anzeige - Sync-MUX wird über Interrupt gesteuert
div_flag = vsync0 == 0? AV1: AV2;
marker = MARKER_SYNC;
}
else {
div_flag = ret_div_flag;
marker = MARKER_RSSI;
}
}
else marker = MARKER_AV;
// wäre unschön - keine RSSI-Anzeige, aber Marker springt
if ((u0 > pbar_udbm[0]) && (u1 > pbar_udbm[0])) marker = ' ';
lcdGotoXY(2, 1);
Displ_RSSI_Bargraph(pbar_udbm, wudbm, u0);
lcdGotoXY(2, 2);
Displ_RSSI_Bargraph(pbar_udbm, wudbm, u1);
if (src == DIVERSITY) Displ_AV_Mark(div_flag, marker);
}
return(ret_div_flag);
}
 
/**************************************************************/
/* */
/* Diversity v-Synchronisation Interruptroutinen */
/* */
/**************************************************************/
 
/* Impulszähler für V-Synchronisation 0 und 1
wird durch Interrupt des jewiligen vSync einzeln zurückgesetzt. 8-bit Timer*/
ISR(TIMER2_OVF_vect)
{
TCNT2 = (int8_t)(int16_t)-(F_CPU / 64 * 500e-6); // preload
if (vscount0 < 255) ++vscount0; // Überlauf von vscount vermeiden
if (vscount1 < 255) ++vscount1; // Überlauf von vscount vermeiden
if (rx_timeout < RX_TIME_END) ++rx_timeout; // veranlasst bei GPS-Tracking MK Datensatz senden
if ((mk_timer) && (mk_lipo.time_on < T2PROD_M59S59)) ++mk_lipo.time_on; // T2PRODM59S59 = 3599 * 4000
if (((tracking == TRACKING_GPS) && (MK_Motor_run)) || ((tracking == TRACKING_NMEA) && !coldstart)) { // MK-Motoren müssen laufen
if (mux_X)
rxcount1++; // kein Test auf Überlauf ==> Counter groß genug - bis Stunden
else
rxcount0++;
}
}
 
/* Messung von Impulsabstand v-Synchronisation 0
Zur Vermeidung von Bildstörunen erfolgt MUX-Umschaltung in Bildaustastung */
ISR(INT0_vect)
{
if ((vscount0 >= 79) && (vscount0 <= 81)) {
vsync0 = 0;
if ((mux_X) && (vscount1 == 255)) {
SetMux0();
vsync1 = 1;
}
}
else {
vsync0 = 1;
if (vsync1 == 0)
SetMux1();
}
if (vsync0 == vsync1) { //nur wenn vSynchronisation gleich gut/schlecht ist greift RSSI
if (sw_avx == AV1) {
SetMux0();
}
else
SetMux1();
}
vscount0 = 0;
}
 
/* Messung von Impulsabstand v-Synchronisation 1
Zur Vermeidung von Bildstörunen erfolgt MUX-Umschaltung in Bildaustastung */
ISR(INT1_vect)
{
if ((vscount1 >= 79) && (vscount1 <= 81)) {
vsync1 = 0;
if (!(mux_X) && (vscount0 == 255)) {
SetMux1();
vsync0 = 1;
}
}
else {
vsync1 = 1;
if (vsync0 == 0)
SetMux0();
}
if (vsync0 == vsync1) { //nur wenn vSynchronisation gleich gut/schlecht ist greift RSSI
if (sw_avx == AV1) {
SetMux0();
}
else
SetMux1();
}
vscount1 = 0;
}
 
/**************************************************************/
/* */
/* Tasks */
/* ermöglicht unterschiedliche Zeiten f. UBat, Sync... */
/* */
/**************************************************************/
 
void Task_0_1(void)
{
if (task_timer0_1) {
cli();
task_timer0_1 = 0;
sei();
Displ_VBat();
}
}
 
void Task_0_2(void)
{
if (task_timer0_2) {
cli();
task_timer0_2 = 0;
sei();
sw_avx = RSSI_Diversity(av_source, bar_udbm, !bat_low);
}
}
 
void Task_0_3(void)
{
if (task_timer0_3) {
cli();
task_timer0_3 = 0;
sei();
sw_avx = RSSI_Diversity(av_source, bar_udbm, 0);
if (tracking == TRACKING_MKCOCKPIT) Tracking_MKCockpit();
}
}
 
void Task_0_4(void)
{
if (task_timer0_4) {
cli();
task_timer0_4 = 0;
sei();
if (tracking == TRACKING_GPS)
Tracking_GPS();
else if (tracking == TRACKING_NMEA)
Tracking_NMEA();
if (gps_display == GPS_RX_COUNT) Displ_RX_Time(); // aktualisieren der Empfängerzeiten
}
}
 
void Task_0_5(void) // Nur für Tasten-Beschleunigung/-Wiederholrate! Hintergrund: Rücksetzung.
{ // Hintergrund: Rücksetzung. Beginnt nach jeden Tastendruck neu zu zählen.
lcd_BackgrLight_On(); // muss bei beliebiger Taste sofort eingeschaltet werden
if (task_timer0_5) {
cli();
task_timer0_5 = 0;
sei();
lcd_BackgrLight();
}
}
 
void Tasks_invisible(void) // wird in main.c und menue.c aufgerufen
{
Task_0_3();
Task_0_4();
Task_0_5();
if (tracking == TRACKING_RSSI) Tracking_RSSI();
}
/NGVideo5_8/tags/V1.30/ngvideo.h
0,0 → 1,208
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef NGVIDEO_H_
#define NGVIDEO_H_
 
#include "config.h"
#include "messages.h"
#include "servo.h"
#include "dogm.h"
#include "menue.h"
#include "lipo.h"
 
/* Indexwerte für av_source bzw. zur Auswertung von av_source */
#define AV1 0
#define AV2 1
#define DIVERSITY 2
 
#define MARKER_SELECT 0xfc // 0xfc enspricht '>>' Menue-Marker
#define MARKER_AV 0xfb // 0xfb enspricht '<<' Diversity AV-Marker
#define MARKER_RSSI 'd' // Diversity, wenn RX umschaltet mittels RSSI-Wert
#define MARKER_SYNC 's' // Diversity, wenn RX umschaltet auf Grund der Bildsynchronisation
 
#define SET_MUX_0 PORTA &= ~(1<<MUX_IN); // MUX SxA enabled
#define SET_MUX_1 PORTA |= (1<<MUX_IN); // MUX SxB enabled
#define CLEAR_INT10 EIMSK &= ~((1<<INT1) | (1<<INT0));// Interrupt für Sync ausschalten
#define SET_INT10 EIMSK |= (1<<INT1) | (1<<INT0); // External Interrupt Mask Register ein
 
/* Beep Verzögerungszeitein */
#define DBEEPVERS 2 // Beep on nach Versionsanzeige
#define DBEEPVERSP 30 // Beep Pause nach Versionsanzeige
#define BEEPENTER 1 // Beep on nach Enter kurz Scroll_Menu() und Select_Menu()
#define DBEEPWR 4 // Beep on nach geänderten Werte ROM schreiben
#define DBEEPWRP 30 // Beep Pause nach geänderten Werte ROM schreiben
#define BEEPBAT 20 // Beep on bei Akku low
#define BEEP_LOW_TIME 240 // TIMER0_1 aller 500ms aufgerufen, BeepIntervall Akku leer mit 2 Min Abstand beginnen
#define DBEEPNMEAFIX 120 // Beep on nach NMEA SAT-FIX
#define DBEEPMEAFIXP 240 // Beep Pause nach NMEA SAT-FIX
 
#define ENABLE_BTIMER 1 // damit Intervall Beeper für Akku leer mit TIMER0_1 gesteuert wird
#define DISABLE_BTIMER 0
 
#define GPS_DISP_NONE 0 // Anzeigen bei Antennennachführung per WI232 und GPS
#define GPS_DISP_CALC 1
#define GPS_DISP_CURRENT 2
#define GPS_DISP_HOME 3
#define GPS_MISC 4
#define GPS_RX_COUNT 5
 
#define BAUDRATE 5 // für Antennennachführung mittels MKCockpit
#define BAUDRATE_MIN 0
#define BAUDRATE_MAX 6
 
#define getBaud(x) (uint16_t)pgm_read_dword(&baud[x])
extern const uint16_t PROGMEM baud[8];
 
#define POLOLU_CMD 2
 
#define OFF 0
#define ON 1
 
#define EEPROM __attribute__ ((section(".eeprom")))
 
typedef struct {
uint8_t rev;
uint16_t min;
uint16_t max;
uint16_t mid;
} servo_t;
 
typedef struct {
uint16_t min;
uint16_t max;
uint16_t korr_1;
uint16_t korr_2;
} udbm_t;
 
typedef struct {
uint16_t u0;
uint16_t u1;
} adc_avg_t;
 
/**************************************************************/
/* */
/* EEPROM */
/* */
/**************************************************************/
extern uint8_t ep_eep_init EEPROM;
extern char ep_version[sizeof(VERSION)] EEPROM;
extern uint8_t ep_dogm_vers EEPROM;
extern uint8_t ep_contrast EEPROM;
extern uint8_t ep_light_time EEPROM;
extern uint8_t ep_u_offset EEPROM;
extern uint16_t ep_u_min EEPROM;
extern uint8_t ep_channel EEPROM;
extern uint8_t ep_av_source EEPROM;
extern uint8_t ep_language EEPROM;
extern udbm_t ep_udbm[CHANNEL_MAX] EEPROM;
extern uint8_t ep_sIdxSteps EEPROM;
extern servo_t ep_servo[SERVO_NUM_CHANNELS] EEPROM;
extern uint8_t ep_servo_frame EEPROM;
extern uint8_t ep_servo_nr EEPROM;
extern uint8_t ep_single_step EEPROM;
extern uint8_t ep_repeat EEPROM;
extern uint8_t ep_pause EEPROM;
extern uint8_t ep_pause_step EEPROM;
extern uint8_t ep_tracking EEPROM;
extern uint8_t ep_track_hyst EEPROM;
extern uint8_t ep_track_tx EEPROM;
extern uint8_t ep_baudrate EEPROM;
extern mk_current_t ep_mk_current EEPROM;
extern uint8_t ep_mk_akku_nr EEPROM;
extern mk_lipo_t ep_mk_lipo[AKKU_NR_MAX+1] EEPROM;
extern uint8_t ep_mk_i_offset EEPROM;
extern uint8_t ep_mk_i_faktor EEPROM;
extern uint8_t ep_mk_w_faktor EEPROM;
 
/**************************************************************/
// Working variables of EEPROM contents
extern uint8_t eep_init;
extern char version[sizeof(VERSION)];
extern uint8_t dogm_vers;
extern uint8_t contrast;
extern uint8_t light_time;
extern uint8_t u_offset;
extern uint16_t u_min;
extern uint8_t channel;
extern uint8_t av_source;
extern uint8_t language;
extern udbm_t udbm;
extern uint8_t sIdxSteps;
extern servo_t servo[SERVO_NUM_CHANNELS];
extern uint8_t servo_frame;
extern uint8_t servo_nr;
extern uint8_t single_step;
extern uint8_t repeat;
extern uint8_t pause;
extern uint8_t pause_step;
extern uint8_t tracking;
extern uint8_t track_hyst;
extern uint8_t track_tx;
extern uint8_t baudrate;
extern uint8_t ch_stored; // Flag zur Speicherung, wenn Wert im Hauptdisplay geändert
 
/**************************************************************/
extern uint8_t coldstart; // Flag erstmaliger MK-Start(Motore) nur nach GPS-Fix
extern uint8_t bat_low;
extern uint16_t hyst_u_min;
extern uint8_t gps_display;
extern uint8_t gps_disp_clear;
extern uint8_t sw_avx;
extern uint16_t bar_udbm[12];
 
extern uint8_t MK_Motor_run; // Flag für RX Time-Counter Start/Stop
extern uint8_t mk_timer; // Zeitzähler lipo.time_on auf aus
 
extern volatile uint32_t rxcount0;
extern volatile uint32_t rxcount1;
 
extern SpecialChr_t lcdSpecialChr[7];
extern SpecialChr_t lcdSpecialChrLs[8];
extern SpecialChr_t lcdSpecialChrRs[5];
 
void Init_EEPROM(uint8_t ep_reset);
void servoSetDefaultPos(void);
void Set_DOGM_Version(void);
void Set_Channel(uint8_t channel);
uint8_t Set_AV_Source(uint8_t src);
 
void lcdSet_BackgrLight_Off(void);
void lcd_BackgrLight_On(void);
void lcd_BackgrLight(void);
 
void ADC_Init(void);
uint16_t ADC_Read( uint8_t channel );
 
void Beep(uint8_t time);
void Double_Beep(uint8_t time, uint8_t pause);
 
void Displ_VBat(void);
void Displ_U_2Nk(uint16_t u);
 
uint8_t RSSI_Calc_UdBm(uint16_t *pbar_udbm);
uint8_t RSSI_Min_Calibrate(uint8_t nchannel, uint16_t *pbar_udbm);
void RSSI_Max_Calibrate(uint16_t *pbar_udbm);
 
void USART_Init_Baudrate(void);
void Double_Beep(uint8_t time, uint8_t pause);
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY, Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat);
uint16_t U_Messen_cmp(uint8_t beep_timer);
 
void Task_0_1(void);
void Task_0_2(void);
void Task_0_3(void);
void Task_0_4(void);
void Task_0_5(void);
void Tasks_invisible(void);
 
#endif /* NGVIDEO_H_ */
/NGVideo5_8/tags/V1.30/servo.c
0,0 → 1,207
 
/********************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/*! \file servo.c \brief Interrupt-driven RC Servo function library.*/
/* */
/*File Name : 'servo.c' */
/*Title : Interrupt-driven RC Servo function library */
/*Author : Pascal Stang - Copyright (C) 2002 */
/*Created : 7/31/2002 */
/*Revised : 8/02/2002 */
/*Version : 1.0 */
/*Target MCU : Atmel AVR Series */
/*Editor Tabs : 2 */
/* */
/*This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/********************************************************************/
 
#include <avr/interrupt.h>
#include <avr/io.h>
 
#include "servo.h"
#include "config.h"
 
// Global variables
uint16_t ServoPosTics;
uint16_t ServoPeriodTics;
 
// servo channel registers
ServoChannelType ServoChannels[SERVO_NUM_CHANNELS];
 
const ServoConst_t ServoConst[2] = {{SERVO_MAX, SERVO_MIN, SERVO_STEPS, SERVO_PRESCALER},
{SERVO_MAX * 4, SERVO_MIN * 4, (SERVO_STEPS + 1) * 4 - 1, SERVO_PRESCALER / 4}};
 
// Servo limits (depend on hardware)
const servo_limit_t servo_limit[2][3] = {{{SERVO_I0_RIGHT_MIN, SERVO_I0_RIGHT_MAX},
{SERVO_I0_LEFT_MIN, SERVO_I0_LEFT_MAX},
{SERVO_I0_MIDDLE_MIN, SERVO_I0_MIDDLE_MAX}},
{{SERVO_I1_RIGHT_MIN, SERVO_I1_RIGHT_MAX},
{SERVO_I1_LEFT_MIN, SERVO_I1_LEFT_MAX},
{SERVO_I1_MIDDLE_MIN, SERVO_I1_MIDDLE_MAX}}};
 
// Servopositionen normiert für 950µs, 2,05ms und 1,5ms ==> Ergebnis Schritte. Da Zeit in µs ist F_CPU*e-1
const steps_pw_t steps_pw[2] = {{(uint64_t)950*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)2050*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)1500*F_CPU*1e-6/SERVO_PRESCALER + 0.5},
{(uint64_t)950*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)2050*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)1500*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5}};
 
// anzufahrende Servopositionen 0=MIN, 1=MID, 2=MAX
const uint8_t PosIdx[POSIDX_MAX] = {1, 0, 1, 2 };
 
// functions
 
//! initializes software PWM system 16-bit Timer
// normaler Weise wird ein Serv-PWM Signal aller 20ms wiederholt
// Werte: rev, min, max, mid vorher über servoSet...() initialisieren und einmal servoSetPosition(...) ausführen!!!
void servoInit(uint8_t servo_period)
{ uint16_t OCValue; // set initial interrupt time
 
// disble Timer/Counter1, Output Compare A Match Interrupt
TIMSK1 &= ~(1<<OCIE1A);
// set the prescaler for timer1
if (sIdxSteps == STEPS_255) {
TCCR1B &= ~((1<<CS11) | (1<<CS10));
TCCR1B |= (1<<CS12); // prescaler 256, Servo-Schritte 185 bei 180 grd Winkel
}
else {
TCCR1B &= ~(1<<CS12);
TCCR1B |= (1<<CS11) | (1<<CS10); // prescaler 64, Servo-Schritte 740 bei 180 grd Winkel
}
// attach the software PWM service routine to timer1 output compare A
// timerAttach(TIMER1OUTCOMPAREA_INT, servoService);
// enable channels
for(uint8_t channel=0; channel < SERVO_NUM_CHANNELS; channel++) {
// set default pins assignments SERVO2 Pin 4; SERVO1 Pin 5
ServoChannels[channel].pin = (1 << (SERVO2 + channel));
}
ServoPosTics = 0; // set PosTics
// set PeriodTics
ServoPeriodTics = F_CPU / ServoConst[sIdxSteps].prescaler * servo_period * 1e-3;
// read in current value of output compare register OCR1A
OCValue = OCR1AL; // read low byte of OCR1A
OCValue += (OCR1AH << 8); // read high byte of OCR1A
OCValue += ServoPeriodTics; // increment OCR1A value by nextTics
// set future output compare time to this new value
OCR1AH = OCValue >> 8; // write high byte
OCR1AL = OCValue & 0x00FF; // write low byte
TIMSK1 |= (1<<OCIE1A); // enable the timer1 output compare A interrupt
}
 
uint16_t pw_us(uint16_t Steps)
{
return(Steps * ServoConst[sIdxSteps].prescaler/(F_CPU * 1e-6) + 0.5); // Zeit pro Schritt (Wert * e-1) in µs
}
 
uint16_t ServoSteps(void)
{
return(ServoConst[sIdxSteps].steps);
}
 
void servoSet_rev(uint8_t channel, uint8_t val)
{
ServoChannels[channel].rev = val & 0x01;
}
 
void servoSet_min(uint8_t channel, uint16_t min)
{
ServoChannels[channel].min = ServoConst[sIdxSteps].min + min;
}
 
void servoSet_max(uint8_t channel, uint16_t max)
{
ServoChannels[channel].max = ServoConst[sIdxSteps].max - max;
}
 
void servoSet_mid(uint8_t channel, uint16_t mid)
{
ServoChannels[channel].mid = mid;
// Faktor 16, bzw. 16/2 um mit einer Nachkommastelle zu Rechnen
ServoChannels[channel].mid_scaled = (8 * (ServoChannels[channel].max - ServoChannels[channel].min) + \
(16 * mid - 8 * ServoConst[sIdxSteps].steps))/16 + ServoChannels[channel].min;
}
 
//! turns off software PWM system
void servoOff(void)
{
// disable the timer1 output compare A interrupt
TIMSK1 &= ~(1<<OCIE1A);
}
 
//! set servo position on channel (raw unscaled format)
void servoSetPositionRaw(uint8_t channel, uint16_t position)
{
// bind to limits
if (position < ServoChannels[channel].min) position = ServoChannels[channel].min;
if (position > ServoChannels[channel].max) position = ServoChannels[channel].max;
// set position
ServoChannels[channel].duty = position;
}
 
//! set servo position on channel
// input should be between 0 and ServoSteps() (entspricht Maximalausschlag)
void servoSetPosition(uint8_t channel, uint16_t position)
{ uint16_t pos_scaled;
// calculate scaled position
if (ServoChannels[channel].rev != 0) position = ServoConst[sIdxSteps].steps - position;
if (position < ServoConst[sIdxSteps].steps/2)
//bei Position < Servomittelstellung Position*(Mitte - Min)/(Servoschritte/2)
pos_scaled = ServoChannels[channel].min + ((int32_t)position*2*(ServoChannels[channel].mid_scaled-ServoChannels[channel].min))/ \
ServoConst[sIdxSteps].steps;
else
//bei Position >= Servomittelstellung
pos_scaled = ServoChannels[channel].mid_scaled + (uint32_t)(position - ServoConst[sIdxSteps].steps / 2) \
* 2 * (ServoChannels[channel].max-ServoChannels[channel].mid_scaled)/ServoConst[sIdxSteps].steps;
// set position
servoSetPositionRaw(channel, pos_scaled);
}
 
// Umrechnung Winkel in Servoschritte
void servoSetAngle(uint8_t servo_nr, int16_t angle)
{
servoSetPosition(servo_nr, (uint16_t)((uint32_t)angle * ServoConst[sIdxSteps].steps / 180));
}
 
//Interruptroutine
ISR(TIMER1_COMPA_vect)
{ static uint8_t ServoChannel;
uint16_t nextTics;
uint16_t OCValue; // schedule next interrupt
 
if(ServoChannel < SERVO_NUM_CHANNELS) {
PORTD &= ~ServoChannels[ServoChannel].pin; // turn off current channel
}
ServoChannel++; // next channel
if(ServoChannel != SERVO_NUM_CHANNELS) {
// loop to channel 0 if needed
if(ServoChannel > SERVO_NUM_CHANNELS) ServoChannel = 0;
// turn on new channel
PORTD |= ServoChannels[ServoChannel].pin;
// schedule turn off time
nextTics = ServoChannels[ServoChannel].duty;
}
else {
// ***we could save time by precalculating this
// schedule end-of-period
nextTics = ServoPeriodTics-ServoPosTics;
}
// read in current value of output compare register OCR1A
OCValue = OCR1AL; // read low byte of OCR1A
OCValue += (OCR1AH <<8); // read high byte of OCR1A
OCValue += nextTics; // increment OCR1A value by nextTics
// set future output compare time to this new value
OCR1AH = OCValue >> 8; // write high byte
OCR1AL = OCValue & 0x00FF; // write low byte
 
ServoPosTics += nextTics; // set our new tic position
if(ServoPosTics >= ServoPeriodTics) ServoPosTics = 0;
}
 
/NGVideo5_8/tags/V1.30/servo.h
0,0 → 1,129
/*********************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/*! \file servo.c \brief Interrupt-driven RC Servo function library. */
/* */
/*File Name : 'servo.c' */
/*Title : Interrupt-driven RC Servo function library */
/*Author : Pascal Stang - Copyright (C) 2002 */
/*Created : 7/31/2002 */
/*Revised : 8/02/2002 */
/*Version : 1.0 */
/*Target MCU : Atmel AVR Series */
/*Editor Tabs : 4 */
/* */
/*ingroup driver_sw */
/*defgroup servo Interrupt-driven RC Servo Function Library (servo.c)*/
/*code #include "servo.h" \endcode */
/*par Overview */
/* */
/*This code is distributed under the GNU Public License */
/*which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/*********************************************************************/
 
#ifndef SERVO_H
#define SERVO_H
 
// The numbers below good for parallax servos at an F_CPU of 20.000MHz.
// Da einige Servo's auch eien Winkel von 180 grd zulassen, Wertebereich
// entgegen den sonst üblichen. Einschränkung mit default Kalibrierung
// auf 0,9ms (45) bis 2,1ms(45) gesetzt. Je nach Servo, entspricht einen
// Winkel von etwa 180grd
// Periode default 20ms
 
#define SERVO_MAX 211 // 2,7 ms bei prescaler 256, bei prescaler 64 SERVO_MAX * 4
#define SERVO_MIN 26 // 0,33ms bei prescaler 256, bei prescaler 64 SERVO_MIN * 4
#define SERVO_STEPS 255 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
#define SERVO_PRESCALER 256 // bei prescaler 256, bei prescaler 64 SERVO_PRESCALER / 4
#define STEPS_255 0 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
#define STEPS_1023 1 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
 
typedef struct //Servo-Konstante je nach Prescaler
{
uint16_t max;
uint16_t min;
uint16_t steps;
uint16_t prescaler;
}ServoConst_t;
 
typedef struct //struct_ServoChannel
{
uint8_t pin; // hardware I/O port and pin for this channel
uint16_t duty; // PWM duty setting which corresponds to servo position
uint8_t rev; // Parameter, wie on/off; reverse; range
uint16_t min; // SERVO_MIN + Parameter min
uint16_t max; // SERVO_MAX - Parameter max
uint16_t mid_scaled; // skalierte Servomitte
int16_t mid; // Servomitte = SERVO_STEPS/2 +/- x Schritte; bei Pescaler 256 wird nur uint8_t benötigt aber bei 64
}ServoChannelType;
 
uint8_t sIdxSteps; // 0 für 255 und 1 für 1023 Schritte; Prescaler 256 oder 64
 
// Define servo limits (depend on hardware)
typedef struct {
uint16_t min;
uint16_t max;
}servo_limit_t;
 
extern const servo_limit_t servo_limit[2][3];
 
// Define servo positions (depend on hardware)
typedef struct {
uint16_t min;
uint16_t max;
uint16_t mid;
}steps_pw_t;
 
// Servopositionen für 950µs, 2,05ms und 1,5ms ==> Ergebnis Schritte. Da Zeit in µs ist F_CPU*e-1
extern const steps_pw_t steps_pw[2];
 
#define RIGHT 0 // Servopostionen, welche vom Einbau abhängig sind
#define LEFT 1
#define MIDDLE 2
 
#define POSIDX_MAX 4
extern const uint8_t PosIdx[POSIDX_MAX]; // anzufahrende Servopositionen 0=MIN, 1=MID, 2=MAX
 
// functions
 
// initializes servo system
// You must run this to begin servo control
void servoInit(uint8_t servo_period);
 
// turns off servo system
// This stops controlling the servos and
// returns control of the SERVOPORT to your code
void servoOff(void);
 
// set servo position on a given channel
// servoSetPosition() commands the servo on <channel> to the position you
// desire. The position input must lie between 0 and POSITION_MAX and
// will be automatically scaled to raw positions between SERVO_MIN and
// SERVO_MAX
void servoSetPosition(uint8_t channel, uint16_t position);
 
// set raw servo position on a given channel
// Works like non-raw commands but position is not scaled. Position must
// be between SERVO_MIN and SERVO_MAX
void servoSetPositionRaw(uint8_t channel, uint16_t position);
 
// set servo to a specific angle
void servoSetAngle(uint8_t servo_nr, int16_t angle);
 
// vor servoInit(), oder vor sei() ServoWerte mit servoSet...() initialisieren, einschließlich servoSetPosition(...)!
void servoSet_rev(uint8_t channel, uint8_t val);
void servoSet_min(uint8_t channel, uint16_t min);
void servoSet_max(uint8_t channel, uint16_t max);
void servoSet_mid(uint8_t channel, uint16_t mid);
uint16_t pw_us(uint16_t Steps); // gibt Zeit in µs bei x Servoschritte
uint16_t ServoSteps(void); // gibt "Konstante" derzeitiger Servoschritte zürück
 
#endif /* SERVO_H */
/NGVideo5_8/tags/V1.30/tools.c
0,0 → 1,179
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <stdlib.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
 
#include "config.h"
#include "dogm.h"
#include "tools.h"
#include "messages.h"
 
#define MAX_POWER 10
#define getPower(x) (int32_t)pgm_read_dword(&powers[x])
const int32_t PROGMEM powers[MAX_POWER] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
 
/* Funktion zur Umwandlung einer vorzeichenbehafteten Integer
32-Bit "Festkomma-Zahl"(gedachtes Komma in Integer) in einen String
vereinfacht Variablenübergabe funktion change_value(uint16_t x),
kein printf, double oder float
siehe http://www.mikrocontroller.net/articles/Festkommaarithmetik
len: max 13, Gesamtlänge des Resultats inklusive Vorzeichen und Komma, Rest wird mit ' ' aufgefüllt
fixedPoint: Position des Kommas im Integer-Wert. Bei Wert in mm und Anzeige in m ist das z.B. 3
afterPoint: Ziffern nach dem Komma = wieviele der fixedPoint Ziffern angezeigt werden sollen
 
Ist nicht genug Platz für die Zahl vorhanden werden nur '*' Zeichen ausgegeben!
makefile derzeit somit auch ohne! Minimalistic printf version*/
char *my_itoa(int32_t value, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint)
{ int8_t i;
int8_t digits, digitsNeeded;
uint8_t neg = 0;
static char str[13];
// Terminate string
str[len] = '\0';
 
// Reduce precision of value if we're not supposed to show all of the mantissa
if (fixedPoint > afterPoint) {
value /= getPower(fixedPoint - afterPoint);
fixedPoint = afterPoint;
}
 
// Handle negative values
if (value < 0) {
value = -value;
neg = 1;
}
 
// Check how many digits we've got in total and if it fits in our space
for (digits = 1; digits < MAX_POWER && value >= getPower(digits); digits++);
if (neg) digits++; // We also need space for the sign
if (fixedPoint) digits++; // Plus space for decimal point
digitsNeeded = digits - len;
if (digitsNeeded > 0) {
// Not enough space, do something
if (digitsNeeded == fixedPoint || digitsNeeded == fixedPoint + 1) { // +1 = space for decimal point that we can get rid of
// If space is just big enough for integer part then simply don't show mantissa BUT ROUND CORRECTLY
value = (value + 5 * getPower(fixedPoint - 1)) / getPower(fixedPoint);
fixedPoint = 0;
} else if (digitsNeeded < fixedPoint) {
// We can reduce precision to make it fit (round correctly)
value = (value + 5 * getPower(digitsNeeded - 1)) / getPower(digitsNeeded);
fixedPoint -= digitsNeeded;
} else {
// Error, cannot display value! Let's show stars
for (i = len - 1; i >= 0; --i) str[i] = '*';
return str;
}
}
 
for (i = len - 1; i >= neg; --i) {
if (fixedPoint && i == len - fixedPoint - 1) {
// Insert decimal point at the right location
str[i] = Msg(MSG_KOMMA)[0];
fixedPoint = 0; // Now in integer part
} else {
str[i] = (value % 10) + '0';
value /= 10;
// Break if we're in integer part and there are only zeros from this point on
if (value == 0 && fixedPoint == 0) {
--i;
break;
}
}
}
// Insert sign
if (neg) str[i--] = '-';
// Rest is blank
for (; i >= 0; --i)
str[i] = ' ';
 
return str;
}
 
 
// Trying to avoid floating point maths here. Converts a floating point string to an integer with a smaller unit
// i.e. floatStrToInt("4.5", 2) = 4.5 * 1E2 = 450
int32_t floatStrToInt(const char *s, int32_t power1)
{ char *endPtr;
int32_t v = strtol(s, &endPtr, 10);
 
if (*endPtr == '.') {
for (s = endPtr + 1; *s && power1; s++) {
v = v * 10 + (*s - '0');
--power1;
}
}
if (power1) {
// Table to avoid multiple multiplications
v = v * getPower(power1);
}
return v;
}
 
 
// Delay helper
void delay_ms100x(uint8_t delay)
{
for ( uint8_t i=0; i<delay; i++)
_delay_ms(100);
}
 
 
/************************************************************************************/
/* */
/* Zeitanzeige */
/* */
/************************************************************************************/
 
uint32_t TimeBase60(char *str, uint32_t time, uint8_t idx)
{ uint32_t tmp = time % 60;
 
str[idx] = (tmp / 10) + '0';
str[idx + 1] = (tmp % 10) + '0';
return time / 60;
}
 
void Displ_TimeMS(int32_t time)
{ char str[7];
 
str[6] = '\0';
if (time < 0) {
time = abs(time);
str[0] = '-';
}
else
str[0] = ' ';
time = TimeBase60(str, time, 4);
str[3] = ':';
TimeBase60(str, time, 1);
lcdPuts(str);
}
 
void Displ_TimeHMS(uint32_t time)
{ char str[9];
 
time /= T2SECDIV; // Zähler aller 500µs
str[8] = '\0';
time = TimeBase60(str, time, 6);
str[5] = ':';
time = TimeBase60(str, time, 3);
str[2] = ':';
TimeBase60(str, time, 0);
lcdPuts(str);
}
/NGVideo5_8/tags/V1.30/tools.h
0,0 → 1,15
#ifndef _TOOLS_H_
#define _TOOLS_H_
 
#include <avr/io.h>
 
//char *my_itoa(int32_t value, uint8_t sign, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint);
char *my_itoa(int32_t value, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint);
int32_t floatStrToInt(const char *s, int32_t power1);
 
void delay_ms100x(uint8_t delay);
 
void Displ_TimeMS(int32_t time);
void Displ_TimeHMS(uint32_t time);
 
#endif
/NGVideo5_8/tags/V1.30/tracking.c
0,0 → 1,406
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <util/delay.h>
 
#include "tracking.h"
#include "ngvideo.h"
#include "servo.h"
#include "tools.h"
#include "usart.h"
#include "config.h"
#include "mk.h"
#include "keys.h"
 
#define DLEFT 0
#define DRIGHT 1
#define DEG_TO_RAD 0.0174533 // degrees to radians = PI / 180
#define RAD_TO_DEG 57.2957795 // radians to degrees = 180 / PI
#define AltFaktor 22.5
 
HomePos_t MK_pos; // Home position of station
GPS_Pos_t currentPos; // Current position of flying object
int8_t satsInUse; // Number of satelites currently in use
 
uint8_t tracking = TRACKING_MIN;
uint8_t track_hyst = TRACKING_HYSTERESE;
uint8_t track_tx = 0;
 
geo_t geo;
int anglePan, angleTilt;
 
/**************************************************************/
/* */
/* RSSI Tracking */
/* */
/**************************************************************/
 
void Tracking_RSSI(void)
{ uint16_t u0, u1;
static uint8_t direction;
static uint16_t servo1pos;
u0 = (ADC_Read(RSSI0) * (uint32_t)udbm.korr_1)/UDBM_KORR_FA;
u1 = (ADC_Read(RSSI1) * (uint32_t)udbm.korr_2)/UDBM_KORR_FA;
 
if (direction == DLEFT) {
if (u0 < u1) {
if ( servo1pos > 0) --servo1pos; // Servo Endposition?
servoSetPosition(SERVO_PAN, servo1pos); // beibehaltene Richtung ==> sofort ausführen
}
else
if (u0 > (u1 + track_hyst)) direction = DRIGHT; // Richtungwechsel, wenn Hysterese überschritten
}
else {
if (u0 > u1) {
if ( servo1pos < ServoSteps()) ++servo1pos; // Servo Endposition?
servoSetPosition(SERVO_PAN, servo1pos); // beibehaltene Richtung ==> sofort ausführen
}
else
if ((track_hyst + u0) < u1) direction = DLEFT; // Richtungwechsel, wenn Hysterese überschritten
}
}
 
/**************************************************************/
/* */
/* GPS Tracking */
/* */
/**************************************************************/
 
// Datenempfang vom MK ==> blinkt Antennensymbol
void Displ_wiRX(void)
{ static uint8_t timer = 0;
static uint8_t picturedSats;
if (!bat_low && (pmenu[0] == '\0')) { // nicht im Menü und nicht bei Akku leer blinken
lcdGotoXY(1, 0);
if (wi232RX) { // Datensatz vom MK empfangen?
if (timer < BLINK_PERIOD/2) {
picturedSats = 0;
lcdPutc(5); // Antennensymbol darstellen
}
else {
if (!picturedSats) { // Änderung Satelittenanzahl innerhalb dieser Periode nicht anzeigen
picturedSats = 1;
// aktuell empfangene Satellitenanzahl, Anzeige einstellig, da kein Platz auf Display
lcdPutc(satsInUse > 9? 'X': satsInUse + '0');
}
}
}
else
lcdPutc(':');
wi232RX = 0;
if (++timer == BLINK_PERIOD) timer = 0;
}
}
 
// Berechnung von Distanz und Winkel aus GPS-Daten home(MK eingeschaltet)
// zur aktuellen Position(nach Motorstart)
geo_t calc_geo(HomePos_t *home, GPS_Pos_t *pos)
{ double lat1, lon1, lat2, lon2, d1, dlat;
geo_t geo;
lon1 = home->Home_Lon;
lat1 = home->Home_Lat;
lon2 = (double)pos->Longitude / 10000000.0;
lat2 = (double)pos->Latitude / 10000000.0;
 
// Formel verwendet von http://www.kompf.de/gps/distcalc.html
// 111.3 km = Abstand zweier Breitenkreise und/oder zweier Längenkreise am Äquator
// es wird jedoch in Meter weiter gerechnet
d1 = 111300 * (double)cos((double)(lat1 + lat2) / 2 * DEG_TO_RAD) * (lon1 - lon2);
dlat = 111300 * (double)(lat1 - lat2);
// returns a value in metres http://www.kompf.de/gps/distcalc.html
geo.bearing = fmod((RAD_TO_DEG * (double)atan2(d1, dlat)) + 180, 360); // +180 besserer Vergleich mit MkCockpit
if (geo.bearing > 360) geo.bearing -= 360; // bekam schon Werte über 400
geo.distance = sqrt(d1 * d1 + dlat * dlat);
return(geo);
}
 
// Anzeige eines GPS-Wertes auf LCD
void Displ_Format_Data(uint8_t x, uint8_t y, char *description, char *data, char measure)
{
lcdGotoXY(x, y);
lcdPuts(description);
lcdPuts(data);
if (measure != '\0')
lcdPutc(measure);
}
 
 
//void Displ_GPS(int anglePan, int angleTilt, geo_t *geo)
void Displ_GPS(void)
{ uint16_t dDCurrent = 0;
// int32_t time_remaining = M59S59;
int32_t time_remaining = 0;
 
if (gps_display > GPS_DISP_NONE && (!coldstart || gps_display == GPS_MISC) && !bat_low) {
if (gps_disp_clear && !coldstart) {
gps_disp_clear = 0;
lcdClear();
}
// makefile ohne! Minimalistic printf version
switch (gps_display) {
case GPS_DISP_CALC:
Displ_Format_Data(0, 0, "Dir:", my_itoa(MK_pos.direction, 3, 0, 0), '\xdf'); // '\xdf' entspricht '°'
Displ_Format_Data(8, 0, "Dis:", my_itoa((uint32_t)geo.distance, 3, 0, 0), 'm');
Displ_Format_Data(0, 1, "Bea:", my_itoa((uint32_t)geo.bearing, 3, 0, 0), '\xdf');
Displ_Format_Data(8, 1, "Alt:", my_itoa(currentPos.Altitude - MK_pos.Home_Alt, 3, 3, 1), 'm');
Displ_Format_Data(0, 2, "Pan:", my_itoa(anglePan, 3, 0, 0), '\xdf');
Displ_Format_Data(8, 2, "Til:", my_itoa(angleTilt, 3, 0, 0), '\xdf');
break;
case GPS_DISP_CURRENT:
Displ_Format_Data(0, 0, "aLon:", my_itoa(currentPos.Longitude, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "aLat:", my_itoa(currentPos.Latitude, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "aAlt:", my_itoa(currentPos.Altitude, 11, 3, 1), '\0');
break;
case GPS_DISP_HOME:
Displ_Format_Data(0, 0, "hLon:", my_itoa(MK_pos.Home_Lon7, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "hLat:", my_itoa(MK_pos.Home_Lat7, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "hAlt:", my_itoa(MK_pos.Home_Alt, 11, 3, 1), '\0');
// >> Menueauswahl nach oben
if (Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Press( 1<<SW_MINUS )) coldstart = 1;
break;
case GPS_MISC:
Displ_Format_Data(0, 0, "U:", my_itoa(mk_UBat, 4, 1, 1), 'V');
Displ_Format_Data(8, 0, "W:", my_itoa(mk_dUsedCapacity, 4, 0, 0), '\0');
Displ_Format_Data(0, 1, "I:", my_itoa(mk_Ikorr, 4, 1, 1), 'A');
if (mk_current.Count > 0) {
dDCurrent = mk_current.Sum / mk_current.Count;
if (dDCurrent > 0) {
time_remaining = ((int32_t)mk_lipo.Capacity - mk_dUsedCapacity) * 36 / dDCurrent;
if (abs(time_remaining) > M59S59)
time_remaining = time_remaining < 0? -M59S59: M59S59; // M59S59 sind 59 Minuten und 59 Sekunden
}
}
Displ_Format_Data(8, 1, "\xee:", my_itoa(dDCurrent, 4, 1, 1), 'A');// Durchschnittszeichen
lcdGotoXY(0,2);
lcdPutc('\x1a'); // Summenzeichen
Displ_TimeMS(mk_lipo.time_on / T2SECDIV);
lcdGotoXY(8,2);
lcdPuts("R");
Displ_TimeMS(time_remaining);
break;
}
}
Displ_wiRX();
}
 
void do_tracking(void)
{ static uint8_t hysteresis = 0;
 
geo = calc_geo(&MK_pos, &currentPos);
angleTilt = RAD_TO_DEG * (double)atan2((double)(currentPos.Altitude - MK_pos.Home_Alt) / 1000, geo.distance);
if (geo.distance < 4 || (geo.distance < 6 && hysteresis)) { // < 4m ==> Pan-Servo in Mittelstellung. Hysterese bis 6m, damit Servo im Grenzbereich nicht wild rumschlägt
geo.bearing = MK_pos.direction;
angleTilt = 0;
hysteresis = 1;
}
else {
hysteresis = 0;
}
 
// egal wo der Übergangspunkt 359, 360, 1grd ist => Winkelübergangspunkt auf 0 bzw. 180grd des Servos bringen
// 360 grd negative Winkelwerte als positive
anglePan = fmod(geo.bearing - MK_pos.direction + 360 + 90, 360);
if (anglePan > 360) anglePan -= 360;
 
if (angleTilt < 0) angleTilt = 0;
if (angleTilt > 180) angleTilt = 180;
 
if (anglePan >= 180) { // zwecks 360grd-Abdeckung flipt Pan-/Tilt-Servo
anglePan = anglePan - 180;
angleTilt = 180 - angleTilt;
}
 
servoSetAngle(0, anglePan);
servoSetAngle(1, angleTilt);
}
 
 
/**************************************************************/
/* */
/* MK GPS Tracking */
/* */
/**************************************************************/
 
// MK OSD-Daten lesen und verifizieren
uint8_t OSD_Data_valid(NaviData_t **navi_data)
{ uint8_t ret = 0;
char *tx_osd = {"#co?]==EH\r"};
// char interval[2] = {10, '\0'};
if (rx_line_decode('O')) { // OSD-Datensatz prüfen/dekodieren
*navi_data = (NaviData_t*)data_decode; // dekodierte Daten mit Struktur OSD-Daten versehen
if (rx_timeout < RX_TIME_OLD) { // GPS-Daten nicht zu alt und ok.
currentPos = (*navi_data)->CurrentPosition;
if ((*navi_data)->NCFlags & NC_FLAG_GPS_OK)
ret = 1;
// aus MkCockpit http://forum.mikrokopter.de/topic-post216136.html#post216136
// (4 * (........))/5 ==> Wichtung Luftdruck-Höhe zu GPS
currentPos.Altitude = MK_pos.Home_Alt + (4000 * (int32_t)((*navi_data)->Altimeter) / AltFaktor + currentPos.Altitude - MK_pos.Home_Alt) / 5;
MK_Motor_run = (*navi_data)->FCStatusFlags & FC_FLAG_MOTOR_RUN;
MK_ProcessLipo(*navi_data);
satsInUse = (*navi_data)->SatsInUse;
}
}
else
if (rx_timeout == RX_TIME_END) store_LipoData();// ca. 4 Sekunden nach Signalverlust
// ca. 210ms keine OSD-Daten empfangen ==> sende neue Anforderung an MK
// if ((track_tx) && (rx_timeout > RX_TIMEOUT)) tx_Mk(NC_ADDRESS, 'o', interval, 1); // 420 * 0.5ms interval
if ((track_tx) && (rx_timeout > RX_TIMEOUT)) USART_send_Str(tx_osd); // 420 * 0.5ms interval
return ret;
}
 
 
// MK eingeschaltet und GPS-ok, danach Motoren gestartet ==> Berechnung horizontaler/vertikaler Servowinkel
// Hauptprogramm von GPS Antennen-Nachführung
void Tracking_GPS(void)
{ NaviData_t *navi_data;
static uint8_t track_running = 0;
 
if (!track_running) {
track_running = 1; // verhindert doppelten Aufruf, wenn in Eingabeschleife Menu_MK_BatteryChangeNr() !!!
if (OSD_Data_valid(&navi_data)) {
if (coldstart) {
// erst nach Neustart NGVideo und beim Motorstart werden Daten vom MK übernommen
if (navi_data->FCStatusFlags & FC_FLAG_MOTOR_START) {
MK_pos.Home_Lon = (double)navi_data->HomePosition.Longitude / 10000000.0;
MK_pos.Home_Lat = (double)navi_data->HomePosition.Latitude / 10000000.0;
MK_pos.Home_Lon7 = navi_data->HomePosition.Longitude;
MK_pos.Home_Lat7 = navi_data->HomePosition.Latitude;
MK_pos.Home_Alt = navi_data->HomePosition.Altitude;
MK_pos.direction = navi_data->CompassHeading;
coldstart = 0;
}
}
else {
do_tracking();
}
}
Displ_GPS(); // letzte empfangene Daten auch bei ausgeschalteten MK sichtbar
track_running = 0;
}
}
 
/**************************************************************/
/* */
/* NMEA GPS Tracking */
/* */
/**************************************************************/
 
void setNMEAdir(void)
{
if (!coldstart)
MK_pos.direction = geo.bearing;
}
 
// NMEA latitudes are in the form ddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLatitude(const char *s, const char *NS)
{ int32_t deg = (s[0] - '0') * 10 + s[1] - '0'; // First 2 chars are full degrees
int32_t min = floatStrToInt(&s[2], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*NS == 'S') deg = -deg;
return deg;
}
 
 
// NMEA longitudes are in the form dddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLongitude(const char *s, const char *WE)
{ int32_t deg = ((s[0] - '0') * 10 + s[1] - '0') * 10 + s[2] - '0'; // First 3 chars are full degrees
int32_t min = floatStrToInt(&s[3], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*WE == 'W') deg = -deg;
return deg;
}
 
 
void Tracking_NMEA(void)
{ char *token;
int32_t latitude, longitude;
 
if (decodeNMEA()) {
token = strtok((char*)data_decode, ",");
// http://de.wikipedia.org/wiki/NMEA_0183
if (!strcmp(token, "GPGGA")) {
// $GPGGA,220613.400,4843.5080,N,00922.9583,E,1,7,2.23,287.1,M,48.0,M,,
// Skip time
strtok(0, ",");
// Latitude
latitude = getLatitude(strtok(0, ","), strtok(0, ","));
// Longitude
longitude = getLongitude(strtok(0, ","), strtok(0, ","));
// Signal valid? (Position Fix Indicator)
if (*strtok(0, ",") != '0') {
// Satellites in use
satsInUse = atoi(strtok(0, ","));
// Skip dilution
strtok(0, ",");
// Altitude
currentPos.Altitude = floatStrToInt(strtok(0, ","), 3);
currentPos.Latitude = latitude;
currentPos.Longitude = longitude;
 
if ((coldstart) && (satsInUse > 5)) {
// First position after reboot (or change of mode) will be the home position (facing north)
MK_pos.Home_Lon = (double)currentPos.Longitude / 10000000.0;
MK_pos.Home_Lat = (double)currentPos.Latitude / 10000000.0;
MK_pos.Home_Lon7 = currentPos.Longitude;
MK_pos.Home_Lat7 = currentPos.Latitude;
MK_pos.Home_Alt = currentPos.Altitude;
MK_pos.direction = 0;
coldstart = 0;
Double_Beep(DBEEPNMEAFIX, DBEEPMEAFIXP);
}
do_tracking();
}
}
}
Displ_GPS(); // letzte empfangene Daten auch bei ausgeschalteter NMEA sichtbar
}
 
 
/************************************************************************/
/* */
/* MKCockPit Tracking */
/* */
/* http://www.pololu.com/file/download/ssc03a_guide.pdf?file_id=0J37 */
/* */
/************************************************************************/
 
void Tracking_MKCockpit(void)
{ uint16_t ServoPos;
 
if (Get_Pololu_cmd(data_decode, POLOLU_CMD)) {
switch (data_decode[0]) {
// Command 0: Set Parameters(1 data byte)
case 0x00: ;
break;
// Command 1: Set Speed (1 data byte)
case 0x01: ;
break;
// Command 4: Set Position,Absollute(2 data bytes) - angepasst für default MKCockPit
case 0x04: ServoPos = data_decode[2];
ServoPos = ((ServoPos << 7) | data_decode[3]) / 20; // ServoPos * ServoSteps() sonst zu groß
 
if (ServoPos >= 60) ServoPos -= 60; else ServoPos = 0;
if (ServoPos > 180) ServoPos = 180;
servoSetAngle(data_decode[1], ServoPos);
}
}
}
/NGVideo5_8/tags/V1.30/tracking.h
0,0 → 1,29
#ifndef _TRACKING_H_
#define _TRACKING_H_
 
#define TRACKING_RSSI 1
#define TRACKING_GPS 2
#define TRACKING_MKCOCKPIT 3
#define TRACKING_NMEA 4
 
typedef struct {
double distance;
double bearing;
}geo_t;
 
typedef struct {
double Home_Lon; // in degrees
double Home_Lat; // in degrees
int32_t Home_Lon7; // in 1E-7 degrees
int32_t Home_Lat7; // in 1E-7 degrees
int32_t Home_Alt; // in mm
int16_t direction; // ermittelte Konstante aus Mittelposition Antenne geo.bearing - navi_data.CompassHeading
}__attribute__((packed)) HomePos_t;
 
void Tracking_MKCockpit(void);
void Tracking_GPS(void);
void Tracking_NMEA(void);
void Tracking_RSSI(void);
void setNMEAdir(void);
 
#endif
/NGVideo5_8/tags/V1.30/usart.c
0,0 → 1,292
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include "usart.h"
#include "tracking.h"
 
/********************************************************************************************************************/
/* */
/* MK Protokoll */
/* http://www.mikrokopter.de/ucwiki/en/SerialCommands?highlight=(command) */
/* http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol) */
/* */
/* Slave-Address Part */
/* 1 FC */
/* 2 NC */
/* 3 MK3MAG */
/* */
/* Auszug von Commands, nur OSD verwendet: */
/* Received by NC | ent by NC */
/* | since NC */
/* Description ID Address Data | ID Address Data Firmware */
/* Debug Request 'd' AnyAddr u8 AutoSendInterval. Value is | 'D' SlaveAddr Debug Data Struct */
/* multiplied by 10 in receiver and , | */
/* then used as milliseconds. Subsciption | */
/* needs to be renewed every 4s. | */
/* Request OSD 'o' NC-Addr 1 byte sending interval (in 10ms steps)| 'O' NC-Addr NaviDataStruct 0.12h */
/* Data | */
/* Redirect UART 'u' NC-Addr 1 byte param for uart selector (0=FC, | - - - 0.12h */
/* 1=MK3MAG, 2=MKGPS), can be switched | */
/* back to NC debug by sending the magic | */
/* packet "0x1B,0x1B,0x55,0xAA,0x00" | */
/* Set 3D-Data 'c' AnyAddr u8 Interval | 'C' NC-Addr struct Data3D 0.14a */
/* Interval */
/* */
/********************************************************************************************************************/
 
char rx_buffer[RXD_BUFFER_SIZE];
 
volatile uint8_t rx_len;
volatile uint8_t rx_ready = 0;
uint8_t rx_GPS;
static char start;
static char end;
 
/**************************************************************/
/* */
/* USART */
/* 8 Datenbits, 1 Stopbit, keine Parität */
/* */
/**************************************************************/
 
void USART_Init(unsigned int baud)
{ uint16_t ubrx;
 
ubrx = F_CPU/(baud * 16L) - 1;
/* Set baud rate */
UBRR0H = (unsigned char)(ubrx>>8);
UBRR0L = (unsigned char)ubrx;
/* RX Complete Interrupt Enable, Enable receiver and transmitter */
UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
/* Asynchronous USART, no Parity, Set frame format: 8data, 1stop bit */
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // 8data Bit
}
 
void USART_send_Chr(unsigned char data)
{
/* Wait for empty transmit Puffer */
while ( !( UCSR0A & (1<<UDRE0)) ) ;
/* Put data into Puffer, sends the data */
UDR0 = data;
}
 
void USART_send_Str(char *str )
{
while (*str) {
USART_send_Chr(*str);
str++;
}
}
 
/*
// verwendet Orginal H&I MK-Software http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
// kann auch vereinfacht werden ==> gleich kodierten String senden char *tx_osd = {"#co?]==EH\r\0"}
// Funktion getestet und funktioniert
void tx_Mk(unsigned char addr, char cmd, char *data, uint8_t len)
{ char tx_buffer[TXD_BUFFER_SIZE];
uint8_t tx_i = 0;
uint8_t i = 0;
unsigned char a,b,c;
unsigned int tmpCRC = 0;
 
tx_buffer[tx_i++] = '#'; // Start-Byte
tx_buffer[tx_i++] = 'a' + addr; // Adress
tx_buffer[tx_i++] = cmd; // Command
// code64
while (len) {
if (len) { a = data[i++]; len--;} else a = 0;
if (len) { b = data[i++]; len--;} else b = 0;
if (len) { c = data[i++]; len--;} else c = 0;
tx_buffer[tx_i++] = '=' + (a >> 2);
tx_buffer[tx_i++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
tx_buffer[tx_i++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
tx_buffer[tx_i++] = '=' + (c & 0x3f);
}
// add crc
for (i = 0; i < tx_i; i++) {
tmpCRC += tx_buffer[i];
}
tmpCRC %= 4096;
tx_buffer[i++] = '=' + tmpCRC / 64;
tx_buffer[i++] = '=' + tmpCRC % 64;
tx_buffer[i++] = '\r'; // End-Byte
 
tx_buffer[i++] = '\0'; // USART_send_Str(...) ==> End-while
USART_send_Str(tx_buffer);
} */
 
ISR(USART0_RX_vect)
{ char received;
static uint8_t line_flag = 1;
static char* ptr_write = rx_buffer;
static uint8_t frame = 6;
 
received = UDR0;
if (rx_ready == 0) {
if ((received == start) && line_flag) { // start '#', '$' or 0x80
line_flag = 0; // New line has begun
ptr_write = rx_buffer; // Begin at start of buffer
rx_len = 0;
}
if (line_flag == 0) { // Are we receiving a line?
*ptr_write = received; // Add current byte
rx_len++;
 
// GPS Datensatzende
if (rx_GPS) {
if (received == end) { // End of MK-GPS or NMEA-line?
line_flag = 1; // Yes, start new line
rx_ready = 1; // Lock buffer until line has been processed
}
}
// Pololu Micro Serial very reduced/simplified; rx_len-checks 1 higher ==> already incremented
else {
if ((rx_len == 2) && (received != 0x01)) line_flag = 1; // device
if ((rx_len == 3) && (received > 0x01)) frame = 6; else frame = 5; // command
if (rx_len == frame) {
line_flag = 1;
rx_ready = 1; // Lock buffer until line has been processed
}
}
ptr_write++;
if(rx_len == RXD_BUFFER_SIZE) line_flag = 1; // Line too long? Try again
}
}
}
 
uint8_t hexDigitToInt(uint8_t digit)
{
if (digit >= '0' && digit <= '9') return digit - '0';
if (digit >= 'a' && digit <= 'f') return digit - 'a' + 10;
if (digit >= 'A' && digit <= 'F') return digit - 'A' + 10;
return 0;
}
 
uint8_t decodeNMEA(void)
{ uint8_t ret = 0;
uint8_t crc;
uint8_t tmpCRC = 0;
uint8_t i;
 
if (rx_ready == 1 && rx_len > 0) {
// Calculate checksum
for (i = 1; i < rx_len && rx_buffer[i] != '*'; i++) {
tmpCRC ^= rx_buffer[i];
}
if (rx_len >= i + 3) {
crc = hexDigitToInt(rx_buffer[i + 1]) << 4 | hexDigitToInt(rx_buffer[i + 2]);
if (crc == tmpCRC) {
rx_buffer[i] = 0;
strcpy(data_decode, &rx_buffer[1]); // Data without $, crc
ret = 1;
wi232RX = 1; // So antenna-symbol will blink
cli();
rx_timeout = 0; // Got valid data, reset counter
sei();
}
}
}
if (rx_timeout < RX_TIME_OLD) wi232RX = 1;
rx_ready = 0; // Unlock buffer, next NMEA string can be received
return ret;
}
 
// verwendet aus Orginal H&I MK-Software http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
void Decode64(char *ptrOut, uint8_t len, uint8_t ptrIn)
{ unsigned char a,b,c,d;
unsigned char ptr = 0;
unsigned char x,y,z;
while(len)
{
a = rx_buffer[ptrIn++] - '=';
b = rx_buffer[ptrIn++] - '=';
c = rx_buffer[ptrIn++] - '=';
d = rx_buffer[ptrIn++] - '=';
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
if(len--) ptrOut[ptr++] = x; else break;
if(len--) ptrOut[ptr++] = y; else break;
if(len--) ptrOut[ptr++] = z; else break;
}
}
 
// eingearbeitet Original H&I MK-Software mkprotocol.h und mkprotocol.c
uint8_t rx_line_decode(char rx_ID)
{ uint8_t ret = 0;
uint8_t crc1,crc2;
int tmpCRC = 0;
// rx_ready gleichzeitig usart rx_buffer schreiben gesperrt
if ((rx_ready == 1) && (rx_len > 2) && (rx_buffer[2] == rx_ID)) {
// Checksumme
// verwendet http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
for(uint8_t i = 0; i < rx_len - 3;i++) {
tmpCRC += rx_buffer[i];
}
tmpCRC %= 4096;
crc1 = '=' + tmpCRC / 64;
crc2 = '=' + tmpCRC % 64;
if ((crc1 == rx_buffer[rx_len-3]) && (crc2 == rx_buffer[rx_len-2])) {
Decode64(data_decode, rx_len - 6, 3); // Daten ohne Satzzeichen, header und crc
ret = 1;
}
cli();
rx_timeout = 0; // wenn kein gültiger Datensatz rx_ID ==> Counter wird nicht mehr rückgesetzt
sei();
}
// für Blinken des Antennenzeichens, MK antwortet immer mit cmd Großbuchstaben
if ((rx_timeout < RX_TIME_OLD) && (rx_buffer[2] >= 'A') && (rx_buffer[2] <= 'Z')) wi232RX = 1;
rx_ready = 0; // Puffer Schreiben entsperren, neuer MK-Datensatz kann wieder empfangen/gepuffert werden
return(ret);
}
 
void USART_RX_Mode(uint8_t tracking)
{
switch (tracking) {
case TRACKING_GPS:
start = '#';
end = '\r';
rx_GPS = 1;
break;
case TRACKING_NMEA:
start = '$';
end = '\n';
rx_GPS = 1;
break;
default:
start = 0x80;
rx_GPS = 0;
break;
}
}
 
uint8_t Get_Pololu_cmd(char *ptrOut, uint8_t ptrIn)
{
rx_len -=2; // ohne Start-Char und device
if (rx_ready == 1) {
for (uint8_t i = 0; i < rx_len; i++)
ptrOut[i] = rx_buffer[ptrIn++]; // ab Pololu-Command
}
else
rx_len = 0;
rx_ready = 0; // Puffer Schreiben entsperren, neuer Pololu-Datensatz kann wieder empfangen/gepuffert werden
return(rx_len);
}
/NGVideo5_8/tags/V1.30/usart.h
0,0 → 1,46
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef USART_H_
#define USART_H_
 
#define RXD_BUFFER_SIZE 150 // Puffergröße in Byte
#define TXD_BUFFER_SIZE 20
 
#define RX_TIMEOUT 420 // 210ms
#define RX_TIME_OLD 3 * RX_TIMEOUT // Grenze, Datensatz viel zu alt
#define RX_TIME_END 20* RX_TIMEOUT // Zählerbegrenzung und lipo speichern
 
//volatile unsigned char buffercounter;
 
char data_decode[RXD_BUFFER_SIZE];
volatile uint16_t rx_timeout;
 
void USART_Init(unsigned int baud);
void USART_send_Str(char *str);
uint8_t rx_line_decode(char rx_ID);
 
// tx_Mk addresses
#define ANY_ADDRESS 0
#define FC_ADDRESS 1
#define NC_ADDRESS 2
 
//void tx_Mk(unsigned char addr, char cmd, char *data, uint8_t len);
 
uint8_t wi232RX; // Statusflag für Empfangszeichen auf lcd
 
void USART_RX_Mode(uint8_t tracking);
uint8_t Get_Pololu_cmd(char *ptrOut, uint8_t ptrIn);
uint8_t decodeNMEA(void);
 
#endif /* USART_H_ */
 
/NGVideo5_8/tags/V1.30
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property