diff --git a/.gitignore b/.gitignore index b268ab0d75c9..8cb44c348f35 100644 --- a/.gitignore +++ b/.gitignore @@ -24,11 +24,12 @@ # QMK-specific api_data/v1 quantum/version.h -*.bin +#*.bin *.eep -*.hex +#*.hex *.qmk *.uf2 +.lnk # Old-style QMK Makefiles /keyboards/**/Makefile diff --git a/eternal_keypad_via.hex b/eternal_keypad_via.hex new file mode 100644 index 000000000000..76f5592a1e2a --- /dev/null +++ b/eternal_keypad_via.hex @@ -0,0 +1,1185 @@ +:100000000C9412030C944A030C944A030C944A0374 +:100010000C944A030C944A030C944A030C944A032C +:100020000C944A030C944A030C94F01D0C94AC1DE0 +:100030000C94ED1E0C944A030C944A030C944A034E +:100040000C944A030C944A030C944A030C944A03FC +:100050000C944A030C94C91E0C944A030C944A0352 +:100060000C944A030C944A030C944A030C944A03DC +:100070000C944A030C944A030C944A030C944A03CC +:100080000C944A030C944A030C944A030C944A03BC +:100090000C944A030C944A030C944A030C944A03AC +:1000A0000C944A030C944A030C944A0305010980FA +:1000B000A101850319012AB700150126B700950192 +:1000C00075108100C0050C0901A101850419012AE0 +:1000D000A002150126A002950175108100C005013E +:1000E0000906A1018506050719E029E71500250184 +:1000F0009508750181020507190029EF15002501F2 +:1001000095F075018102050819012905950575010C +:100110009102950175039101C00660FF0961A1017B +:100120000962150026FF00952075088102096315F4 +:100130000026FF00952075089102C005010906A15F +:1001400001050719E029E7150025019508750181CA +:10015000029501750881010507190029FF15002680 +:10016000FF00950675088100050819012905950508 +:1001700075019102950175039101C0000000000016 +:10018000000000000000000000000000000000006F +:100190000000000000000000000000000000007EE1 +:1001A0000F00D4FFFFFFC700000078000000000030 +:1001B0000000002A2B2800000000000000000000C2 +:1001C00000000000000029000000002C1E34202147 +:1001D0002224342627252E362D3738271E1F20218E +:1001E00022232425263333362E37381F04050607ED +:1001F00008090A0B0C0D0E0F101112131415161707 +:1002000018191A1B1C1D2F3130232D350405060724 +:1002100008090A0B0C0D0E0F1011121314151617E6 +:1002200018191A1B1C1D2F3130354C00047F3F1F3D +:10023000643214643214783C1E1E140A0500010155 +:100240000101010101010102020202020202020295 +:100250000303030303030303040404040404040565 +:100260000505050506060606060707070707080829 +:100270000808090909090A0A0A0B0B0B0C0C0C0DDA +:100280000D0D0E0E0E0F0F0F101011111112121373 +:10029000131414151516161717181819191A1A1BEE +:1002A0001B1C1D1D1E1E1F2020212222232424254D +:1002B0002626272829292A2B2C2D2D2E2F30313286 +:1002C00032333435363738393A3B3C3D3E3F404196 +:1002D00042434445464748494A4C4D4E4F5051537E +:1002E00054555658595A5B5D5E5F61626465666835 +:1002F000696B6C6D6F7072737577787A7B7D7E80B9 +:1003000082838587888A8C8E8F91939596989A9C04 +:100310009EA0A2A3A5A7A9ABADAFB1B3B5B7BABC18 +:10032000BEC0C2C4C6C9CBCDCFD1D4D6D8DBDDDFE9 +:10033000E2E4E7E9EBEEF0F3F5F8FAFDFFFFAA7F60 +:1003400055402223252628292A2C2D2F30323335BB +:1003500036383A3B3D3E4042434547494A4C4E5071 +:1003600051535557595A5C5E6062646668696B6D9B +:100370006F71737577797B7D7F81838587898A8C9F +:100380008E90929496989A9C9E9FA1A3A5A7A8AAA6 +:10039000ACAEAFB1B3B4B6B8B9BBBCBEBFC1C2C3DB +:1003A000C5C6C7C9CACBCCCDCED0D1D2D2D3D4D575 +:1003B000D6D7D7D8D9D9DADADBDBDBDCDCDCDCDC9E +:1003C000DDDDDDDDDCDCDCDCDCDBDBDBDADAD9D976 +:1003D000D8D7D7D6D5D4D3D2D2D1D0CECDCCCBCA04 +:1003E000C9C7C6C5C3C2C1BFBEBCBBB9B8B6B4B32A +:1003F000B1AFAEACAAA8A7A5A3A19F9E9C9A9896C0 +:100400009492908E8C8A89878583817F7D7B797792 +:100410007573716F6D6B6968666462605E5C5A5972 +:1004200057555351504E4C4A4947454342403E3D33 +:100430003B3A3836353332302F2D2C2A29282625C1 +:100440002322000029001E001F002000210022009E +:10045000230000002B0014001A00080015001700EC +:1004600024006800E00004001600070009000A00EC +:1004700025006900E1001D001B00060019000500B1 +:1004800026006A0028000254E20000002C00000050 +:1004900027410000010001000100010001000100EE +:1004A00001000000010001005200010001000100F4 +:1004B000010001000100500051004F000100010047 +:1004C0000100010001000100010001000100010024 +:1004D00001000100010003510100000001000000C3 +:1004E0000100000001003A003B003C003D003E00DE +:1004F0003F0000000100130012000C0018001C0057 +:10050000400001002A0033000F000E000D000B0018 +:10051000410001000100E30010001100450044000B +:100520004200010001000100010000000100000084 +:100530004300000001000100010001000100010072 +:1005400001000000010001000100010001000100A4 +:100550000100010001000100010001000100010093 +:100560000100010001000100010001000100010083 +:100570000100005C0100010001000000010000001A +:10058000010009025B00030100A0FA090400000158 +:10059000030101000921110100012240000705812A +:1005A00003080001090401000203000000092111F1 +:1005B0000100012222000705820320000107050334 +:1005C00003200001090402000103000000092111B9 +:1005D000010001226D0007058403200001120100C3 +:1005E0000200000008091200DB0100010200011EE8 +:1005F0000365007400650072006E0061006C005FAE +:10060000006B006500790070006100640000000E5E +:10061000036400750063006B007900620000000451 +:100620000309040011241FBECFEFDAE0DEBFCDBF07 +:1006300004B603FE18C080919D0290919E02A09185 +:100640009F02B091A0028730904BA740B04B59F465 +:1006500010929D0210929E0210929F021092A00290 +:10066000E0E0F8E3099511E0A0E0B1E0EAE6F9E4A2 +:1006700002C005900D92AC38B107D9F722E0ACE882 +:10068000B1E001C01D92AD39B207E1F70E94141F1D +:100690000C948A240C940000E8EDF0E080818E7FB9 +:1006A00080831092E2001092DA001092E100A0EE36 +:1006B000B0E08C9181608C9380818F77808319BCAE +:1006C000A7EDB0E08C918E7F8C9380818F7E8083AC +:1006D0001092660208952091E4003091E50095E6BD +:1006E000A9012091EC00822F817020FF06C080912B +:1006F000E80080FF06C080E008952091E80022FD18 +:100700001AC080918B02882389F0853089F080910E +:10071000EB0085FD0FC02091E4003091E500421709 +:100720005307F9F29150E1F684E0089582E00895CC +:1007300083E0089581E00895EF92FF920F931F9355 +:10074000CF937C018B010E946B03C82F811117C0CE +:100750008091E80085FD0BC08091E8008E77809342 +:10076000E8000E946B03882399F3C82F08C0F701A3 +:1007700081917F018093F1000150110949F78C2F7D +:10078000CF911F910F91FF90EF90089580918D026E +:1007900087FF13C08091E80082FF06C08091E800C7 +:1007A0008B778093E80004C080918B028111F2CF97 +:1007B000089580918B028823D9F38091E80080FF0F +:1007C000F8CF8091E8008E77ECCF982F9093E900D6 +:1007D000242F762F50E0891731F07091EC00209192 +:1007E000ED005091F00021FD07C09F5F973071F739 +:1007F0008093E90081E008953091EB003E7F3093D3 +:10080000EB003091ED003D7F3093ED003091EB0037 +:1008100031603093EB007093EC002093ED00509327 +:10082000F0002091EE0027FDE0CF80E00895B0E0D9 +:10083000A0E0EDE1F4E00C94FB23C8EDD0E088816A +:100840008F7E8883E7EDF0E080818160808384E0A3 +:1008500082BF81E08093660288818E7F888302EE6A +:1008600010E0F80110821092DA0081EEC82ED12C2F +:10087000F601108288818F778883888180688883D9 +:1008800088818F7D888319BC10928B0210928C0214 +:1008900010928A021092890290EEE92EF12CF70153 +:1008A00080818B7F808388818160888342E060E0E3 +:1008B00080E00E94E503F60180818E7F8083F8014D +:1008C000808181608083808188608083F70180815E +:1008D0008E7F8083888180618883CDB7DEB7E8E032 +:1008E0000C941724FC018091930290919402861736 +:1008F0009707A0F06115710529F49091E8009E77A3 +:100900009093E80090E06115710551F4911108C0D1 +:100910008091E80082FF34C080E00895BC01F2CFEE +:1009200080918B028823C1F18530C1F18091E8006C +:1009300083FD30C08091E80082FDEACF8091E8001D +:1009400080FFE1CF8091F3002091F200382F6115F4 +:10095000710519F02830310558F091E02830310543 +:1009600009F090E02091E8002E772093E800CBCFAB +:1009700081918093F100615071092F5F3F4FE7CF64 +:1009800080918B02882341F0853041F08091E8000E +:1009900083FFBECF81E0089582E0089583E008954B +:1009A0000895089508958091680208952FB7F894E6 +:1009B0008091950290919602A0919702B091980231 +:1009C0002FBF089520915E0230915F0228173907EA +:1009D00081F090935F0280935E02E0915C02F0915F +:1009E0005D02309731F00680F781E02DBC0184E094 +:1009F0000995089520915A0230915B022817390712 +:100A000081F090935B0280935A02E0915C02F09136 +:100A10005D02309731F00680F781E02DBC0183E064 +:100A200009950895E0915C02F0915D02309729F0FC +:100A30000190F081E02D0995089580E00895FA0174 +:100A4000811101C0FB010995089580915502982FED +:100A50009E7F29F4817082608093550208958A34C4 +:100A6000E8F381708864F8CFAF92BF92DF92EF9283 +:100A7000FF920F931F93CF93DF93082F162FE90157 +:100A8000E42FF0E0E35CFD4F611110C0E4915E2FB4 +:100A90004E2F4983E8835A83DF91CF911F910F91A5 +:100AA000FF90EF90DF90BF90AF900895E62EF12C6D +:100AB0004491D42EE42FF0E026E0829FC00111245F +:100AC0002FEF30E0B9010E946923802F90E0880F5A +:100AD000991F55E5569FD001579FB00D11248A1BD1 +:100AE0009B0B982F990F890F5901AE18BF08AE9E26 +:100AF000D001AF9EB00DBE9EB00D11245B2F189F8C +:100B000080011124012F11275901A01AB10AAE9EAC +:100B10008001AF9E100DBE9E100D11245901A81A20 +:100B2000B108AE9CC001AF9C900DBE9C900D1124ED +:100B3000892F9927281B390B2E9FC0012F9F900DBD +:100B40003E9F900D1124E92F62307105A1F050F401 +:100B50006115710509F49DCF6130710581F0EB2FAE +:100B6000512F97CF6430710569F080F066307105C0 +:100B700009F48FCFF4CFE42F4B2F592F8ACFE42FD6 +:100B8000412F87CFEB2F542F492F83CF4B2F5D2D34 +:100B9000E12F7FCF80E00895F894E82FE295EF7081 +:100BA000F0E031A1282F2F7081E090E001C0880F84 +:100BB0002A95EAF7982F9095932391A392A1892BD8 +:100BC00082A3789408959091610292FF06C0282F25 +:100BD00028712830F9F4877F846093FF06C0282F9E +:100BE00028712831F1F4877E84612091620220FF10 +:100BF00006C0382F38713830D9F4877F816021FFE3 +:100C000006C0282F28712831D1F4877E816194FD98 +:100C1000877E0895282F24712430F9F68B7F886011 +:100C2000DCCF282F2471243101F78B7E8861DDCF42 +:100C3000382F3171313019F78E7F8860E0CF282F3F +:100C40002171213121F78E7E8861E1CFCF93DF932F +:100C5000EC0182389105B1F108F040C08133910573 +:100C600009F49DC048F58932910509F48DC08A9731 +:100C700009F49CC0C11522E5D20708F0BDC0C1151A +:100C800031E5D30708F024C1C83ED10508F0A3C060 +:100C9000C13ED10588F5C83AD10508F08EC0C53AE5 +:100CA000D10508F0F6C0C130D10531F1209721F10E +:100CB000C430D10508F545C08533910509F45FC0FE +:100CC000C997C1F680916102837009F036C18091A5 +:100CD000620283FF11C0C9E2D0E00EC0833E9105DD +:100CE00099F170F4803E910501F1823E910511F673 +:100CF0008091610282FD21C0CE01DF91CF910895E4 +:100D0000863E910561F1873E910571F1843E910522 +:100D100009F0B0CF8091620281FFEECF8091610235 +:100D2000C7EED0E084FD0DC0E7CF8091610280FD69 +:100D300033C09091620290FFDFCFC3EED0E084FF1A +:100D4000DBCFD0E0C0E0D8CF8091610282FDF2C05D +:100D50009091620290FDF1C084FFCECFF2CF8091DE +:100D6000610283FDDDCFC8CF8091610283FDE8C0C1 +:100D70009091620291FFF0CFC4EED0E0BDCF8091A0 +:100D8000610285FFB9CFA7CF8091610285FDDBC0ED +:100D90008091620283FFB0CFC9E3D0E0ADCF8091F4 +:100DA000610286FFA9CFCAE2D0E0A6CF809161029E +:100DB00086FFA2CFC1E3D0E09FCFCF3BD10508F69D +:100DC000C85AD0E0CC0FDD1FC45EDE4F0990D88139 +:100DD000C02DD46491CFC11540E5D40708F064C09C +:100DE000C11580E4D80708F05CC0CE019A95811542 +:100DF0009F4108F481CFA5CFC11536E5D30718F57B +:100E0000C11545E5D40708F07CC0C11584E5D807B5 +:100E100008F072C09E01237033279C2F96959695FB +:100E2000C115D34508F459C0C1E0D0E002C0CC0FD1 +:100E3000DD1F2A95E2F730E2939FC0011124C82BF1 +:100E4000D92BDA6859CFC1158AE5D80778F4C115CE +:100E500029E5D20708F060C0C11538E5D30708F4CA +:100E600070CFDC2FCC27C06FD06A46CFCE01905612 +:100E70008115904208F065CF8D2F8F710E94E30598 +:100E800090E0982F882788279F719C012C2BE901DF +:100E900041C0C55AD0E0C75EDE4FC881D0E0D06403 +:100EA0002BCFDF70D06A28CFCE018370992721E045 +:100EB00030E002C0220F331F8A95E2F7C695C6952F +:100EC00080E2C89FE0011124C22BD32BDD6814CF30 +:100ED000DC2FCC27C16FD06A0FCFC1E0D0E002C0B9 +:100EE000CC0FDD1F2A95E2F720E2929FC00111246A +:100EF000C82BD92BDC6800CFDC2FCC27C46FD06A7D +:100F0000FBCE8C2F0E94E305C82FD0E0DC2FCC272E +:100F1000CC27DF71D062F0CE8C2F8F700E94E3055A +:100F200034E0D695C7953A95E1F7CF709C2FEC0148 +:100F3000D069E2CEC2EED0E0DFCEC0EED0E0DCCEB3 +:100F4000C6EED0E0D9CEC5E3D0E0D6CE809119026E +:100F5000811110921902089580959091180298239A +:100F6000909318020895909118019923D1F09091CF +:100F7000610297FF16C0E82FE695E695E695EE31FB +:100F8000E0F4F0E0E257FE4F282F277081E090E078 +:100F900001C0880F2A95EAF7809592818923828380 +:100FA0000895E0E9F1E09191891303C0DF01119701 +:100FB0001C9291E0E639F907B1F708959091180174 +:100FC0009923C1F09091610297FF14C0E82FE69534 +:100FD000E695E695EE31F8F4F0E0E257FE4F8770C3 +:100FE00021E030E001C0220F8A95EAF78281822B4E +:100FF00082830895A0E9B1E0EFEF90E02D91821790 +:1010000051F0EF3F19F4211101C0E92F9F5F963095 +:10101000A9F7EF3F09F408950E2E000CFF0BE257DD +:10102000FE4FE6CF8091F5019091C401981301C065 +:1010300008958F5F8770FACF953080F5883070F50E +:1010400048E0949F90011124820F932F911D682FE7 +:10105000677023E0969587952A95E1F7FC01EE0FDE +:10106000FF1FE80FF91FE155FE4F50E040E080E020 +:10107000219130E0062E02C0369527950A94E2F7BA +:1010800021703327042E01C0220F0A94EAF7822B25 +:101090004F5F5F4F4330510559F7089580E0089541 +:1010A000953098F5883088F548E0949F9001112498 +:1010B000820F932F911D282F277041E001C0440F0C +:1010C0002A95EAF723E0969587952A95E1F7FC01A2 +:1010D000EE0FFF1FE80FF91FE155FE4F90E080E093 +:1010E00070E05191DF0111979B01082E02C03695E7 +:1010F00027950A94E2F72170219525272423252797 +:101100002C9301968330910561F7089580936302D3 +:10111000709365026093640280918B028430F9F4CD +:101120008093E9008FEF9091E800815095FD06C013 +:1011300095ED9A95F1F700008111F5CF8091E800C7 +:1011400085FF0DC050E040E063E070E083E692E090 +:101150000E949C038091E8008E778093E8000895B8 +:10116000CF93DF93EC01809118018823B1F1809136 +:10117000610287FF32C060E284E08093E9008FEF74 +:101180009091E800815095FD06C095ED9A95F1F794 +:1011900000008111F5CF8091E80085FF1BC0809190 +:1011A000180170E050E040E0811104C050E040E0E0 +:1011B00068E070E0CE010E949C038091E8008E7789 +:1011C0008093E80080E2FE01A9E6B2E001900D9272 +:1011D0008A95E1F7DF91CF91089568E081E0CDCF66 +:1011E00081E08093E00080E28093D8001092C900F3 +:1011F0008FE19EE40197F1F700C0000087E090EBDB +:10120000DC0180939D0290939E02A0939F02B09375 +:10121000A00288E19CE00FB6F894A8958093600046 +:101220000FBE90936000FFCF8091550280FD0AC0F1 +:10123000EDE3F2E0118210821282339652E0E5353E +:10124000F507C1F7539A3BB1377F2BB128604FB7F1 +:10125000F8948DE392E0FC015191CF0168E02BB945 +:10126000000000C057FF3BB9550F000000C000C090 +:1012700000C03BB900C06A9591F7F2E085359F0741 +:1012800051F74FBF8FE594E00197F1F700C00000E0 +:101290000895EF92FF920F931F93CF93DF938C01EA +:1012A000CDE3D2E0F12CE12CF8019481609157025A +:1012B00080915602F4E0EF16F104ECF49923E9F082 +:1012C0009E01409158020E9434052FEFE21AF20A63 +:1012D000239688E0E816F10439F70E941409F80112 +:1012E000848190E00196817099278483CDB7DEB721 +:1012F000E6E00C941924992319F39E0140E0E3CF12 +:10130000B0E0A0E0E6E8F9E00C94F723EC014C81B2 +:10131000042F10E09801D8010E94C8239B01AC0162 +:101320000E94DE234B015C01E0E2F0E0E01BF10BE8 +:10133000A5E5B0E0AC019B010E94DE236B017C01BE +:101340009F01DF010E94C0239B01AC010E94E923A1 +:101350009B01AC01280D391D4A1D5B1DC701B6015B +:101360000E949123F22E822F90E039E23F1598F1EE +:1013700043E0249F9001112435952795122F109555 +:101380009DE3C92E92E0D92E00E085E5E82EEF1806 +:101390008E2D01FD8F2D9601412F609157020E94E5 +:1013A00034050F5F53E0C50ED11C083089F70E9449 +:1013B00014099C8181E0992319F0903219F48FEF80 +:1013C0008093170180911701890F8C83CDB7DEB709 +:1013D000ECE00C94132425E530E0A901481B590BDF +:1013E000CA019A01220F331F280F391F37FFC4CFBC +:1013F0002F5F3F4FC1CF0F931F93CF93DF93CDE369 +:10140000D2E0FE01118210821282339682E0E5352D +:10141000F807C1F710E000E080913B02082E000CB5 +:10142000990B081719078CF180911601082E000CF2 +:10143000990B801791074CF19E01409158026091E1 +:101440005702809156020E9434050F5F1F4F23966A +:101450000830110509F70E94140980911501909137 +:101460003B02980F90933B0220911601280F209386 +:101470001601121614F497301CF081958093150113 +:10148000DF91CF911F910F910895198218821A82CE +:10149000DCCFB0E0A0E0EFE4FAE00C94FB23FC0129 +:1014A0008281DD24DA9480FD02C0DD24D394CDE373 +:1014B000D2E010E000E0198218821A8294E0E92E4E +:1014C000F12CC12C80913A028C0D8930ACF18770DF +:1014D000082E000C990B8017910791F48091580207 +:1014E0008E9DA0018F9D500D1124559547955595C2 +:1014F00047959E0160915702809156020E943405E3 +:10150000CD0CF1E0EF1AF108E9F60F5F1F4F2396BB +:101510000830110581F60E94140980913A0291E089 +:10152000D91210C081110CC087E080933A02CDB768 +:10153000DEB7E8E00C94172487FFCACF885FC8CFD6 +:101540008150F3CF90E0019687709927EECFEF920C +:10155000FF921F93CF93DF93EC018DE3E82E82E09F +:10156000F82E10E08C81970140915802609157024B +:10157000810F0E943405115E83E0E80EF11C183FD4 +:1015800089F70E9414099A818C8190FF08C08F5FAF +:101590008C83DF91CF911F91FF90EF900895815040 +:1015A000F7CF9091550290FF0CC0EDE3F2E08183FC +:1015B00060834283339692E0E535F907C1F70E94D4 +:1015C00014090895A3E0B0E0E8EEFAE00C94FF23DC +:1015D0008C0180913C0281110AC09E012F5F3F4F18 +:1015E0004FEF6FEF0E9434058A8180933C02F8012F +:1015F0006481613069F080913C0240E0662361F0D3 +:1016000040E0623011F440913C0280E060E004C0B0 +:1016100060913C0240E080E00E94D10AF8018481A0 +:1016200090E0019663E070E00E947D23848323961E +:10163000E4E00C941B24A3E0B0E0E1E2FBE00C94B6 +:1016400001249091550290FF0AC09E012F5F3F4FE9 +:101650000E9434054B8169818A810E94D10A2396B8 +:10166000E2E00C941D24CF93DF93EC01E5E5F2E07A +:10167000438162818C810E941B0B8C818F5F8C83E4 +:10168000DF91CF910895CF93DF93EC01EC81F0E0EF +:10169000EE5BFC4F4491E5E5F2E0628181810E94BE +:1016A0001B0B8C818F5F8C83DF91CF910895CF933B +:1016B000DF93C7E6D1E060E0CE010E943C24219692 +:1016C000C11584E0D807B9F7DF91CF9108951F9332 +:1016D000CF93DF93122F8430E0F46530D0F448309C +:1016E000C0F490E1699FE001112450E0440F551FC0 +:1016F000C40FD51F90E5899FC00DD11D1124632F04 +:10170000CE0187960E943C24612FCE0188960E94CC +:101710003C24DF91CF911F910895AF92BF92CF9259 +:10172000DF92EF92FF921F93CF93DF9382E4C82E54 +:1017300084E0D82ED0E07601C0E014C0F5012591F8 +:101740003491412F6C2F8D2F0E94670B82E0A80EE1 +:10175000B11C1F5F183091F780E1E80EF11CCF5FDC +:10176000C53019F0570110E0E9CFDF5F80E5C80E02 +:10177000D11CD43001F7DF91CF911F91FF90EF90F2 +:10178000DF90CF90BF90AF900895CF93C82F6FEFA9 +:10179000811162E283E290E00E943C246FEFC1116C +:1017A00069E084E290E00E943C246FEFC11169E19E +:1017B00085E290E00E943C24CF91089580E00E9451 +:1017C000C50B60E086E290E00E943C240E948D0BF5 +:1017D0000E94570B81E00E94C50B08950F931F9341 +:1017E000CF93DF93843030F5653020F5483010F525 +:1017F00020E1629F8001112450E0440F551F040F27 +:10180000151F30E5839F000D111D1124C801879617 +:101810000E942824C82FD0E0DC2FCC27C80188964E +:101820000E9428249E01282BC901DF91CF911F918E +:101830000F91089590E080E0F8CF462F843040F477 +:10184000753030F4683020F4672F0E94EE0B089555 +:1018500090E080E00895CF92DF92FF920F931F9364 +:10186000CF93DF936C0100919C0280911A02082BA8 +:10187000C7E0D0E010E0FC2EC8010C2E02C0959508 +:1018800087950A94E2F780FD0CC02197A0F7F12C10 +:101890008F2DDF91CF911F910F91FF90DF90CF900F +:1018A0000895B6018C2F0E941D0C0E9426060197F8 +:1018B00061F3EECFCF93DF93EC010E942B0CBE01BE +:1018C0000E941D0C0E942606DF91CF910895FC0115 +:1018D00083819481892B29F08081918189238F3F95 +:1018E00051F480E00895843FE1F717C0883EA8F0E6 +:1018F000813FB9F712C0808191810E945A0C929564 +:101900009F70963099F358F4925F9F70923048F729 +:10191000803F19F040F7883E20F781E008959A5FF4 +:10192000F4CF83E290E00E942824823289F484E29A +:1019300090E00E942824893059F485E290E00E94CA +:10194000282491E0893109F090E0892F8170089571 +:1019500080E0FCCFCF9384E090E00E942824C82F41 +:1019600082E290E00E942824982F8C2FCF91089536 +:10197000CF92DF92EF92FF926B017C010E942505CE +:10198000B701A60188E090E00E944E24FF90EF90FE +:10199000DF90CF900895A3E0B0E0E1EDFCE00C947F +:1019A000F623F82EB62EE42EA22E9091550290FF2B +:1019B00029C0E92FE695AE2FB0E0A95ABE4F8C9111 +:1019C000809338029E7F923009F59E012F5F3F4F32 +:1019D0008F2D0E9434054B8169818A810E94D10A32 +:1019E000F0925602B0925702E0925802AA2051F0AB +:1019F0006091550270915602809157029091580261 +:101A00000E94B80C2396EDE00C941224823019F455 +:101A1000E0905802E5CF863019F4F0905602E0CFFE +:101A20008930D9F38931E1F6E9512E2F2170722ED8 +:101A3000E695F0E0E35CFC4FE4910E2F10E03DE30F +:101A4000C32E32E0D32E912C812CC40123E0969535 +:101A500087952A95E1F7711013C08F0D96014E2DD1 +:101A60006B2D0E943405800E911E83E0C80ED11CA0 +:101A700025E5C21622E0D20641F70E941409B0CF34 +:101A80002F2D281B822FEACFE5E5F2E0438121E1EB +:101A9000421B08F440E021E0628181810E94CB0C6E +:101AA0000895E5E5F2E0438121E1420F08F44FEFAC +:101AB00021E0628181810E94CB0C0895E5E5F2E08E +:101AC000628121E1621B08F460E021E043818181B1 +:101AD0000E94CB0C0895E5E5F2E0628121E1620FFE +:101AE00008F46FEF21E0438181810E94CB0C0895BF +:101AF000E5E5F2E0818121E04381628188500E9426 +:101B0000CB0C0895E5E5F2E0818121E0438162811B +:101B1000885F0E94CB0C089580915902882319F0A8 +:101B200081508093590260915502709156028091C4 +:101B30005702909158020E94B80C08958091590262 +:101B4000833018F48F5F8093590260915502709131 +:101B5000560280915702909158020E94B80C089545 +:101B60009091550290FF2CC0917081112AC0926013 +:101B700090935502662351F0609155027091560280 +:101B800080915702909158020E94B80C60915502C2 +:101B9000669570E04BE050E08AE091E00E9470248E +:101BA000892BB1F01092390281E08093350220E058 +:101BB0004091580260915702809156020E94CB0CCE +:101BC0000895853210F09864D3CF880F982BD0CF2A +:101BD00081E0809339020E94D6049093330280936F +:101BE0003202E2CF809155028695815009F484E259 +:101BF00061E00E94B00D08958091550286958F5F37 +:101C0000853208F081E061E00E94B00D0895909166 +:101C1000550290FF08C09695981728F0961718F46B +:101C20000E94FC0D089561E00E94B00D0895E5E565 +:101C3000F2E083E0808311828FEF828383831482BA +:101C400060817181828193810E94B80C089568EE51 +:101C50007EEF90E080E00E945A2460E082E090E015 +:101C60000E943C2460E083E090E00E943C241092BB +:101C70001A0260E084E090E00E943C2464E082E28A +:101C800090E00E943C2460E085E090E00E943C24CB +:101C900060E086E090E00E943C246FEF87E090E0F7 +:101CA0000E943C2440E050E0BA0188E090E00E94AD +:101CB0004E2460E08DE090E00E943C2440E050E043 +:101CC000BA0188E190E00E944E2460E087E190E054 +:101CD0000E943C2440E050E0BA018CE190E00E9478 +:101CE0004E2470E060E080E290E00E945A2440E0E0 +:101CF00050E0BA0188E190E00E944E2480E00E940A +:101D0000C50B0E94DE0B40E050E0BA018FE090E08E +:101D10000E944E2440E050E0BA0183E190E00E942E +:101D20004E2408958091180290911702892B809378 +:101D30008E01909119029923A1F0892B80938E0135 +:101D4000809118018823E1F18091610287FF38C0FA +:101D50008EE1E0E9F1E090E08150A0F591110E9460 +:101D6000A60740E250E067EF71E08EE891E00E9444 +:101D70007D24892B21F180E2EEE8F1E0A7EFB1E0CC +:101D800001900D928A95E1F7E0915C02F0915D027D +:101D90003097A9F080911801882359F08091610251 +:101DA00087FF07C080918E0180938F0186E080932A +:101DB0008E010280F381E02D8EE891E0099508956F +:101DC00086E0C7CF2191222339F29F5FC5CF90E0F3 +:101DD00080E00E94FA0490E080E00E94E204109209 +:101DE00017020E94920E089580939C020E94E70EB3 +:101DF000089580919C02982F9670963021F4886007 +:101E00000E94F40E0895877FFBCF21E030E001C0EF +:101E1000220F8A95EAF7209580919C0282230E94E6 +:101E2000F40E08959091F601809589238093F60130 +:101E3000282F277091F4282F082E000C330B9217AF +:101E4000130659F09091620292FF07C0859585951F +:101E500085950E94050F1092F6010895CF93C091C9 +:101E60006202C2FB992790F9981791F080FBC2F9A2 +:101E7000C09362026091610284E090E00E943C2481 +:101E80006C2F82E290E00E943C2482E00E94120FBC +:101E9000CF91089521E030E001C0220F8A95EAF742 +:101EA00080919C02822B0E94F40E089580931A0266 +:101EB0000E94E70E08951092180280911801E0E93F +:101EC000F1E0882361F08091610287FF08C08EE114 +:101ED000DF011D928A95E9F70E94E70E089586E0DA +:101EE000F7CFAAE2B0E0E7E7FFE00C9400248DE82A +:101EF00092E02091F100DC012D93CD01B2E0853913 +:101F00009B07B9F780918E02833009F472C0B8F450 +:101F1000813009F449C0823009F4B3C08091E800EF +:101F200083FF8BC280918D0290918E029A3008F0CF +:101F300084C2E92FF0E0E457FB4D0C94B3238A30C0 +:101F400009F48EC08B3009F471C0893039F7809163 +:101F50008D02813219F7809191029091920200973F +:101F600011F00297D9F68091E800877F8093E8000E +:101F70008091E80082FF38C09091F3008091F200D8 +:101F8000029731F48091F100813011F0863021F414 +:101F90008091F100809368028091E8008B778093B4 +:101FA000E8000E94C603BACF80918D02813A09F001 +:101FB000B5CF8091E800877F8093E80080919102FF +:101FC00090919202892B61F460E289E692E070E0E0 +:101FD0000E9472048091E8008B778093E8009ECF86 +:101FE00060E090E080E0F3CF80918B028111C0CF60 +:101FF00095CF80918D02813A09F090CF8091910226 +:1020000090919202892B09F089CF8091E800877F17 +:102010008093E8008091E80080FFFCCF8091180158 +:102020008093F1008091E8008E77B9CF80918D0286 +:10203000813209F073CF8091910290919202892BA5 +:1020400009F06CCF8091E800877F8093E8000E94C0 +:10205000C60380918F02809318010E945B0F5ECFB0 +:1020600080918D02813209F059CF8091E800877FFD +:102070008093E8000E94C6038091900280936702DB +:102080004DCF80918D02813A09F048CF8091E800D0 +:10209000877F8093E8008091E80080FFFCCF8091EB +:1020A0006702BECF803899F0823809F0C6C18091AE +:1020B00091028F70873008F0C0C18093E900809151 +:1020C000EB0085FB882780F91092E90006C080911B +:1020D000890290918A02911182609091E800977F25 +:1020E0009093E8008093F1001092F1008091E80055 +:1020F0008E779FC1882309F48DC1823009F09DC17C +:1021000080918F02811190C1809191028F702FEF89 +:10211000280F263008F091C18093E9002091EB0050 +:1021200020FF82C1933031F48091EB008062809374 +:10213000EB007AC19091EB0090619093EB0021E06D +:1021400030E001C0220F8A95EAF72093EA0010924E +:10215000EA008091EB008860EACF81116EC1109196 +:102160008F021F778091E3008078812B8093E300BA +:102170008091E800877F8093E8000E94C6038091E9 +:10218000E80080FFFCCF8091E30080688093E3004B +:1021900082E0111183E080938B024FC1805882301E +:1021A00008F04BC120918F02309190022C3DE3E06A +:1021B0003E07A1F583E08A838AE289834FB7F894CA +:1021C000DE01139620E03EE051E2E32FF0E0509371 +:1021D0005700E49120FF03C0E295EF703F5FEF707E +:1021E0008E2F90E0EA30C0F0C7968D939D932F5FBD +:1021F000243159F74FBF8091E800877F8093E80032 +:102200006AE270E0CE0101960E9472048091E800BB +:102210008B778093E80011C1C096E7CF809191023F +:1022200090919202432F55274330510509F44AC03B +:1022300078F54130510509F47AC08BE590E0E2E889 +:10224000F5E04230510509F0F8C02091E800277F01 +:102250002093E80020919302309194028217930713 +:1022600008F49C0140E02115310509F065C04111D9 +:1022700063C08091E80082FDC9CF80918B028823E2 +:1022800029F2853019F28091E80083FFF2CFBECFAA +:102290004132510509F43CC04232510509F0CDC02C +:1022A0008330910508F0C9C0FC01EE0FFF1FE15813 +:1022B000FE4F0190F081E02D84589E4FDC018C91FF +:1022C00090E01AC0332721303105D1F021153105B6 +:1022D00061F02230310509F0B0C0EFEEF5E0E49195 +:1022E0008E2F90E0EFEEF5E007C0EFE1F6E0E4912D +:1022F0008E2F90E0EFE1F6E0009709F49EC0A5CFA5 +:10230000EFE0F6E0E4918E2F90E0EFE0F6E0F4CF1E +:102310008330910508F091C0880F991FFC01EB579D +:10232000FE4F0190F081E02D89E090E08ECF82E1B8 +:1023300090E0EDEDF5E089CF80918B02882309F4E0 +:1023400065CF853009F462CF8091E80083FD5ECFD0 +:102350008091E80082FD8DCF8091E80080FF83CFDF +:102360009091F3008091F2002115310519F0883029 +:10237000910550F041E0089709F040E08091E800B5 +:102380008E778093E8006FCF44914093F1003196AF +:10239000215031090196E8CF803809F04EC0809174 +:1023A000E800877F8093E80080918C028093F100A1 +:1023B0009DCE811142C010918F021230F0F58091B4 +:1023C000E800877F8093E80010938C020E94C60388 +:1023D000112311F084E005C08091E30087FDFACF5E +:1023E00081E080938B0242E061EC81E00E94E50392 +:1023F00042E261EC84E00E94E50342E261EC82E0AB +:102400000E94E50342E260EC83E00E94E5038091D4 +:102410008B0213C080918F02813079F481E0933078 +:1024200009F080E080938A021092E9008091E80030 +:10243000877F8093E8000E94C6038091E80083FFB5 +:102440000AC08091E800877F8093E8008091EB00CC +:1024500080628093EB00AA96E3E00C941C240E9417 +:102460005B0F2FEF84E39CE0215080409040E1F728 +:1024700000C0000088E19CE00FB6F894A895809316 +:1024800060000FBE90936000FFCF882321F00E9470 +:10249000AC070E94920E0895882339F0909118029B +:1024A000982B909318020E94920E0895882309F4A5 +:1024B0004DC0823879F40E94120581FF47C089E33C +:1024C0000E94DE070E94920E89E30E94B3070E94D9 +:1024D000920E0895833859F40E94120580FF36C089 +:1024E00083E50E94DE070E94920E83E5EECF8438DA +:1024F00059F40E94120582FF29C087E40E94DE077A +:102500000E94920E87E4E1CF9CEF980F913AE8F297 +:1025100090E2980F983050F4877091E001C0990FC5 +:102520008A95EAF7892F0E94AC07D1CF9BE5980FD7 +:10253000933028F490E080E00E94FA040895885ACD +:10254000873120F490E080E00E94E2040895CF9368 +:10255000C82F8823C9F08238C9F40E94120581FD72 +:1025600013C089E30E94DE070E94920E2FEF87EED0 +:1025700093E0215080409040E1F700C0000089E3E3 +:102580000E94B3070E94920ECF9108958338A1F460 +:102590000E94120580FDF8CF83E50E94DE070E94AD +:1025A000920E2FEF81EE94E0215080409040E1F7B1 +:1025B00000C0000083E5E4CF8438A1F40E94120536 +:1025C00082FDE2CF87E40E94DE070E94920E2FEF89 +:1025D00081EE94E0215080409040E1F700C000007F +:1025E00087E4CECF8CEF8C0F813A88F5809118016B +:1025F000882301F18091610287FF1CC0EC2FE695D2 +:10260000E695E695F0E0E257FE4F828190E04C2F90 +:10261000477021E030E002C0220F331F4A95E2F7F5 +:1026200082239323892B79F08C2F0E94B3070E9479 +:10263000920E09C0E0E9F1E08191C817A9F321E009 +:10264000E639F207C9F78C2F0E94DE079BCF80E2A4 +:102650008C0F883068F4C77021E030E001C0220F91 +:10266000CA95EAF780911802822B809318028ACFCC +:10267000EBE5EC0FE33040F4F0E0E75EFE4F8081E5 +:1026800090E00E94FA0480CFC85AC73108F07CCF8E +:10269000EC2FF0E0EE0FFF1FE45EFE4F8081918192 +:1026A0000E94E20471CF1F93CF93DF93182FD0E0E5 +:1026B000C0E0893311F4C0E5D0E0812F0E94A71259 +:1026C000209739F4812F0E945612DF91CF911F91EC +:1026D00008958FE99FE00197F1F700C0000021976E +:1026E000EFCF0F931F93CF93DF93C62FD42F022FDB +:1026F000FC0182818823A9F060939B020E94D6048A +:1027000090939A0280939902C77081E001C0880F6C +:10271000CA95EAF70E944C12DF91CF911F910F9159 +:10272000089580919B0268133DC0209199023091D9 +:102730009A024FB7F8948091950290919602A091D9 +:102740009702B09198024FBF821B930B883C910572 +:1027500048F510E21D0F6D17B9F080E2860F883042 +:1027600040F4C77081E001C0880FCA95EAF70E9463 +:102770004512183048F481E09D2F977001C0880FF2 +:102780009A95EAF70E944C12802F0E94531318303A +:1027900018F6D77081E001C0880FDA95EAF70E9439 +:1027A0004512BACFC77081E001C0880FCA95EAF719 +:1027B000F6CFA5E0B0E0EFEDF3E10C94F2238C014D +:1027C000FC0183819481892B31F08081918189235F +:1027D0008F3F09F0C3C52596E1E10C940E240E94B9 +:1027E0002B0CF82E682F89819A810E9450086981EC +:1027F0007A818F2D0E941D0C7C01F8018281882333 +:1028000009F49FC5970122513F452031310508F059 +:102810006BC58FEF93E00E942824811128C0FEEE43 +:10282000EF0E57E6852E99249394E11032C01C8256 +:102830001B82442443944AE0342E74018FEFE81A3B +:10284000F80AC4010E94282489831A82882379F017 +:102850009FEF980F933058F58A83498292E0890E52 +:10286000911CC7010E9428248B83811121C0809173 +:10287000F601877009F4AFCFF8018281882309F44B +:10288000AACF8091620282FFA6CF82E00E94120F3F +:10289000A2CF811424E0920651F3C4010E9428249F +:1028A000811101C0EA943FEF831A930ABECF47011A +:1028B000FE0131967F01F7012081222309F4BDCF6B +:1028C000213009F047C091818281913031F4F2E0EA +:1028D000EF0EF11C0E94531307C0923049F422E01E +:1028E000E20EF11C0E94A7123FEFE31AF30AE3CFB6 +:1028F000933031F432E0E30EF11C0E945612F4CF13 +:10290000943021F08FEFE81AF80AEECF92E0E90E4A +:10291000F11C30E020E0B7016F5F7F4FF70141818C +:102920008053990B8A30910550F021503109E0F223 +:102930008FE99FE00197F1F700C00000F6CF329ECB +:10294000F001339EF00D11249C012E0F3F1F842FA8 +:102950007B01E1CFE22FF0E0E555FE4F5490822F4E +:1029600086958695869590E0FC01E556FE4F64902D +:102970002770712C022E02C0759467940A94E2F7B6 +:10298000E1E06E227724FC01E557FE4FA490B12CC4 +:10299000022E02C0B594A7940A94E2F7F1E0AF22A8 +:1029A000BB24FC01E558FE4FC490D12C02C0D59445 +:1029B000C7942A95E2F721E0C222DD246114710454 +:1029C00019F081EE0E94A712A114B10419F086EE4D +:1029D0000E94A712852D0E945313A114B10419F06F +:1029E00086EE0E9456126114710419F081EE0E9465 +:1029F0005612C114D10409F477CF8CE26BCF81E079 +:102A00000E944A0F0E94F90E32CF81E00E94050F0A +:102A1000F9CF82E0F5CF95EFE9169CE5F90609F4C8 +:102A20006CC008F466C027E245EE66EEF6EFEF16DE +:102A3000FCE5FF0609F481C4882309F4A0C41092C0 +:102A40009B0223E0E2162DE5F20608F05DC03AEFA6 +:102A5000E3163CE5F30630F4C70182509C454497E9 +:102A600008F05FC00E94AA0C9093620280936102FA +:102A7000F2E1EF16FCE5FF0609F476C108F0B4C0F8 +:102A800039E0E3163CE5F30609F44CC108F077C0E1 +:102A900095E0E9169CE5F90609F434C108F05DC03B +:102AA000F3E0EF16FCE5FF0609F424C108F026C1A7 +:102AB00080916102816032E0E3163CE5F30609F49F +:102AC00090C060916102F090620284E090E00E9408 +:102AD0003C246F2D82E290E00E943C240E945B0F18 +:102AE000C6CE27E245EE65EE28C426E241EE60EE52 +:102AF00024C427E245EE64EE20C426E241EE62EEF5 +:102B00001CC428E241E0EFCF85EAE8168DE5F8061F +:102B100009F4A8CFE0F4E1E6EE16EDE5FE0609F4CF +:102B2000A1CF96E1E9169CE5F90609F035C480913C +:102B300018028A7A91E009F490E09093AE01811135 +:102B40003DC189E20E94DE070E94920E90CEC7012D +:102B50008D5A9D45039728F785CF87E0E8168CE5C9 +:102B6000F80609F4DBC080916102806198E0E91603 +:102B70009CE5F906B0F180916102806432C0EDE01D +:102B8000EE16ECE5FE0609F4D7C0A0F480916102D0 +:102B90008E7F2BE0E2162CE5F20619F1809161029E +:102BA0008C603CE0E3163CE5F306D8F080916102CE +:102BB0008D7F17C08FE0E8168CE5F80609F4CCC0CD +:102BC00008F4BEC0E0E1EE16ECE5FE0609F4C8C06C +:102BD000809161028F7BF1E1EF16FCE5FF0609F0C1 +:102BE00070CF809361026DCF2FEFE2162CE5F206D5 +:102BF00009F4C4C0D8F58AEFE8168CE5F80609F4A4 +:102C000085C0D0F4E4E1EE16ECE5FE0609F4C4C09C +:102C100008F4B0C025E1E2162CE5F20609F051CF28 +:102C20008091610282FB992790F921E0922790FB25 +:102C300082F990FB83F9D5CF3CEFE3163CE5F30630 +:102C400009F482C008F466C09DEFE9169CE5F90618 +:102C500009F47EC0809162028360EEEFEE16ECE52F +:102C6000FE0609F02ECF809362022BCFF1E6EF161D +:102C7000FDE5FF0609F49BC0A0F431E0E3163DE555 +:102C8000F30609F492C008F47DC060E092E0E91612 +:102C90009DE5F90609F015CF8EE090E00E943C24F6 +:102CA00010CFEDEAEE16EDE5FE0601F168F4909125 +:102CB0006102892F8E7F90FF816025EAE2162DE563 +:102CC000F20609F48ECFFDCE3EEAE3163DE5F306AB +:102CD00079F18FEAE8168DE5F80609F0F2CE9091C9 +:102CE0006202892F877F93FF8860BDCF8091620247 +:102CF0008860B9CF80916102826073CF8091610258 +:102D000084606FCF8091610288606BCF8091620296 +:102D10008160A9CF809162028260A5CF809161021B +:102D200080625FCF0E945B0F80916102806859CF03 +:102D300080916202877F97CF809161028B7F51CF14 +:102D400080916102877F4DCF809162028E7F8BCF11 +:102D5000809162028D7F87CF809161028F7E41CF0B +:102D6000809161028F7D3DCF0E945B0F8091610257 +:102D70008F7737CF80916102837F33CF809162025A +:102D80008C7F71CF80916202982F909591708E7F89 +:102D9000892B90FB81F967CF0E945B0F90916102B4 +:102DA000892F97FB87F980581CCF61E075CF9091F0 +:102DB0006102892F8F7E94FF806113CF85E3C2CE9D +:102DC00085E3E7C281608093550261E086950E94A9 +:102DD000B00D4DCD42EF5DE06CEF7DE00E941F0530 +:102DE00046CD4CEF5DE062EF7DE0F8CF42E85DE07C +:102DF00068E77DE0F3CF4EE55DE06BE67DE0EECF8A +:102E000044E45DE061E57DE0E9CF41E55DE064E457 +:102E10007DE0E4CF4EE95DE06CE87DE0DFCF61E08E +:102E200081E0D5CF65E082E00E94070E20CD68E00A +:102E300086E0FACF64E18FE0F7CF67E185E1F4CF78 +:102E400062E289E1F1CF61E083E2C1CF0E945B0FD2 +:102E50003FEF84E39CE0315080409040E1F700C0B8 +:102E600000000E94F0088091620282FB882780F9AE +:102E700091E089270E942E0FF8018281E080F18085 +:102E8000882309F445C0C7010E942B0CD82E682F57 +:102E9000C7010E945008B7018D2D0E941D0C0E9491 +:102EA00026067C01882EF801D280B580B2943FE0DE +:102EB000B3228091F6018770C1F0AD2CDD20B1F016 +:102EC0008F2D807F803421F080E28E0D883068F075 +:102ED0008091620282FF09C082E00E94120F8091FD +:102EE000F6018770AA24A3948111A12C9F2C92949F +:102EF0002FE09222FBE0F91508F479C0E92DF0E00B +:102F0000EA56FB4D0C94B32381E0B4CF80E0B2CFFE +:102F1000C7010E941C08D82EBECF2F2D2F70C22EA5 +:102F20008F2D807F19F0C29490EFC922DD20B9F077 +:102F3000CC2069F080E28E0D883010F0811009C03D +:102F400080911802C82AC09218020E94920E8E2DFB +:102F50004CC080911702C82AC0921702F6CF8E2D5E +:102F60000E945612CC2009F442C080E28E0D8830B7 +:102F700010F0811004C08C2D0E94AC0706C0C094D4 +:102F800080911702C822C09217020E94920E2FC091 +:102F90003F2D3F70C32E8F2D807F803219F0C29459 +:102FA00080EFC822882089F081E0881609F468C083 +:102FB000DD2009F472C0BB2009F468C0F8018581E6 +:102FC00080FFC5CF8F70858361C02091620222FD92 +:102FD00035C0DD2069F1CC2039F080911802C82A73 +:102FE000C09218020E94920E80E00E94A712292D22 +:102FF0002850330B2430310510F40E941205AA200A +:1030000009F4E9CB8091F60180FDE5CBF80112824D +:103010008595859585950E944A0FC8010E94D91310 +:103020008091F6018595859585950E94050FD3CBF6 +:1030300080E00E945612CC20D1F29DCFDD2099F085 +:10304000909119028C2D892BB11003C00E944C1253 +:10305000CECFE1E0BE12FACF22FFC9CF981739F2E6 +:1030600080931902C4CFB11006C00E94A6078C2D10 +:103070000E944512BCCFF1E0BF1609F4B8CFF5CFDE +:10308000DD2031F025E02B1508F4B1CF8C2DDECFFB +:1030900034E03B1508F4ABCFEACFBB2041F3F9E3B2 +:1030A0008F1209C02FEF37EE83E02150304080406F +:1030B000E1F700C000008E2D0E94561298CF8F2D90 +:1030C00086958695837061F0813009F090CFC701B5 +:1030D0009370D11002C090E080E00E94E20487CF9C +:1030E000C7019370D11002C090E080E00E94FA0402 +:1030F0007ECF8F2D837091F5D11079CF4E2D4295D3 +:1031000046954770440F440F8E2D8F70042E01C0DA +:10311000880F0A94EAF72E2D2071E4FE07C02FE0F5 +:1031200030E001C0220F4A95EAF720953F2D3695F1 +:1031300036953370323069F050F440911A023130D4 +:1031400029F0822B84230E94560F51CF842B822B8F +:10315000FACF282B80911A028227F5CF8695DD20A1 +:1031600011F08F2D8170882309F441CF4E2D4295A7 +:1031700046954770440F440F8E2D8F70042E01C06A +:10318000880F0A94EAF72E2D2071E4FE07C02FE085 +:1031900030E001C0220F4A95EAF720953F2D369581 +:1031A00036953370323069F050F440919C023130E2 +:1031B00029F0822B84230E94F40E19CF842B822BBA +:1031C000FACF282B80919C028227F5CF9F2D9F70EC +:1031D000F92EDD2029F0892F0E944A0F8E2D36CF3F +:1031E0008E2D0E9445128F2D0E94050F00CF8E2D2F +:1031F000E2EF8E16B1F1E81570F0F0EF8F16D1F016 +:1032000021EF821691F0DD2009F45EC0B1109FCE4F +:103210008F2D8F712AC033EF831651F194EF8912ED +:10322000F2CF8091620282FD2FC08F2D8F71DD2041 +:10323000D9F21BC0DD2081F0E4E0EB1508F4D7CE15 +:103240002F2D2F7181E090E001C0880F2A95EAF7B9 +:1032500090919C028927AFCFF5E0FB1508F4C7CE0B +:10326000EFCF8F2D8F71D110BFCF0E944A0FBFCEED +:1032700080E0DD2009F49FCF9F2D9F7181E001C088 +:10328000880F9A95EAF797CFDD2099F02F2D2F71AF +:10329000F22E822F0E944A0F8091620282FF07C0A5 +:1032A00038E0F39EC001112483608093F6018F2DD6 +:1032B000DCCF81E00E94120F81E08B1508F097CEE1 +:1032C00082E00E94120F93CEBB2059F0893309F09F +:1032D000F2CE9FEFE7EEF3E09150E040F040E1F7EF +:1032E000E8CE8F2D8F7180CFF0E1EF16FFE5FF065E +:1032F00009F485CB21E1E2162FE5F20609F489CB2A +:1033000093EFE9169CE5F90609F4EFCB08F083CBBF +:10331000F8EDEF16FCE5FF0609F4E3CB29EDE21624 +:103320002CE5F20609F4EDCB37EDE3163CE5F306A8 +:1033300009F082CB26E241EE61EEC8010E947113D2 +:1033400096CA30E1E3163FE5F30609F45ECB91E15E +:10335000E9169FE5F906A1F682E058CB85E0DE018B +:10336000119601900D928A95E1F7F80122818981E9 +:103370009A81211134CA0E941C08F82E38CAF6E13D +:10338000EF16FCE5FF0681F58091AE01811118CDA5 +:1033900089E20E94B307D8CB2AE5E2162DE5F206B2 +:1033A00009F4B2CD98F4E1148CE5F80609F44ECD99 +:1033B0009EEDE9169CE5F90609F05ECD6FEF7FEF13 +:1033C00090E080E00E945A240E942F12ECE5EE1655 +:1033D000EDE5FE0609F447CD08F498CD27EAE2169C +:1033E0002DE5F20689F348CD8091180282723CECFB +:1033F000E3163CE5F30609F40DCD08F06DC0E6ECEC +:10340000EE16ECE5FE0609F4F1CCE8F523ECE21645 +:103410002CE5F20609F4DECC28F582ECE8168CE502 +:10342000F80609F029CD8091550280FFCBCC8E7F24 +:103430008093550260915502709156028091570217 +:10344000909158020E94B80C10923902EFEFF0E709 +:1034500022E0E150F0402040E1F700C000000E946F +:10346000140905CA94ECE9169CE5F90609F4B9CCEF +:1034700048E75DE062E87DE0E5ECEE16ECE5FE068F +:1034800009F4ACCCF9CCF9ECEF16FCE5FF0609F435 +:10349000B7CC88F437ECE3163CE5F30609F4ABCC83 +:1034A0004BE65DE06EE57DE098ECE9169CE5F906FB +:1034B00009F494CCE1CCEAECEE16ECE5FE0609F456 +:1034C000A4CC4CE85DE06EE97DE0FBECEF16FCE59A +:1034D000FF0609F483CCD0CC21EDE2162CE5F206F0 +:1034E00009F4A8CCB8F48EECE8168CE5F80609F4DB +:1034F00099CC08F494CCEFECEE16ECE5FE0609F45A +:1035000096CC6EE089E0F0EDEF16FCE5FF0609F4DD +:103510008BCCB2CC24EDE2162CE5F20609F490CC6B +:1035200078F482EDE8168CE5F80609F486CC61E0C3 +:1035300088E193EDE9169CE5F90609F448CC9CCCAA +:10354000E5EDEE16ECE5FE0609F47DCCFDE5EF16A3 +:10355000FF0609F48CC990CC1F93CF93DF93809121 +:10356000C301807F09F049C08091C001882309F41C +:1035700044C08091F501D091C4016091BE01709169 +:10358000BF01A091C101B091C201C62FC72316E0AF +:10359000D81799F190E0109711F0CF3F19F40196E8 +:1035A0008770F6CF189F9001199F300D1124F901F3 +:1035B000EB53FE4F41814713F2CF40814613EFCFCB +:1035C00042814111ECCF438154814A1B5B0B483C43 +:1035D000510528F78091C3018F7080618093C301EA +:1035E000F901E653FE4F80818F70806180838EEBFE +:1035F00091E00E94D9130E941208DF91CF911F9190 +:103600000895A1E1B0E0E7E0FBE10C94F9238C011F +:1036100085E0F801DE011D9601900D928A95E1F793 +:10362000F801E2808EEBA82E81E0B82E6091C101F6 +:103630007091C2016115710509F426C19091BE0116 +:103640004091BF01892F84238F3F09F41DC1208140 +:103650003181C380D480F090C001F601E61BF70BE6 +:10366000FF2009F4DCC08091C301582F507FE83C53 +:10367000F10508F09FC051116BC0FE2C431314C01C +:10368000921312C0E11010C08F7080618093C3014B +:10369000C5010E94D9138091C301F80185838F2D44 +:1036A0006196EAE00C941524C114D10429F0822F0C +:1036B00083238F3F09F003C180E0F82FF170DF2EE4 +:1036C00080FF3CC08091F5014091C40156E0841315 +:1036D00015C02D873E878D859E850E945A0C292F07 +:1036E00022952F702230F0F0243018F59F70F1F001 +:1036F000F8019581907FD1F4D12C1EC090E0589FA5 +:10370000F001599FF00D1124EB53FE4F61813613E8 +:1037100006C06081261303C06281E6120FC00196C5 +:103720008770D5CF9F7011F0882331F3805E883089 +:1037300018F3C8010E94D913FD2CB1CFEE2009F473 +:10374000AECF8091C30181608093C301F12CA7CFDC +:10375000431306C0921304C0F801EE2009F479C0A7 +:10376000C8010E94670C882309F1EE20F9F08091CE +:10377000C301803270F02091BE013091BF013887C3 +:103780002F831986DB86CA868C87CE0107960E9416 +:10379000D91386E0F801AEEBB1E001900D928A9565 +:1037A000E1F70E94AC1AFF24F39479CFC8010E947C +:1037B000D913F9CF51110AC08EEB91E00E94D913B1 +:1037C00086E0F50111928A95E9F7C0CF43130FC047 +:1037D00092130DC0E1100BC0F8018583C8010E944F +:1037E000D91386E0F50111928A95E9F758CFC801FF +:1037F0000E94670C8823D1F2EE20C1F28091C301B0 +:10380000803238F22091BE013091BF013A83298382 +:103810001B82DD82CC828E83CE010196B8CFE83C3C +:10382000F105F8F6FE2CEE2009F243131FC09213A7 +:103830001DC08091C30180FD10C0982F907F69F05A +:10384000F8018583903F31F0982F907F905F8F70C3 +:10385000892B8583C8010E94D91386E0F801AEEB5D +:10386000B1E001900D928A95E1F719CFC8010E944D +:10387000670C81118ECF8091C30181608093C30159 +:10388000C8010E94D9130BCFEE2009F48FCFC801D5 +:103890000E94670CF82E882309F488CF86E0F8018F +:1038A000AEEBB1E001900D928A95E1F78091BE01F7 +:1038B0009091BF010E945A0C0E94AC1AF0CE81E098 +:1038C0008E25FBCEA7E1B0E0E8E6FCE10C940024F5 +:1038D0004B8B5C8B6D8B7E8B8F8B611110921702E3 +:1038E0001A8A198A85E0FE017396DE011D96019001 +:1038F0000D928A95E1F786E0FE013D96DE0117966E +:1039000001900D928A95E1F7CE0107960E94011B66 +:10391000882359F016E08091F5019091C401891334 +:1039200043C06796E3E00C941C2486E0FE013796C2 +:10393000DE01119601900D928A95E1F78A859B85AB +:10394000892B41F38F81988589238F3F19F320912B +:10395000C40130E0C9010196877099274091F501B3 +:103960004817190671F40E945B0F1092C40110925F +:10397000F50186E0EEEBF1E0DF011D928A95E9F7B3 +:10398000C9CF96E0929FD001939FB00D1124AB5305 +:10399000BE4FFE01319601900D929A95E1F780930A +:1039A000C4010E941208B6CF819FC00111248B531D +:1039B0009E4F0E94011B882309F4B3CF8091F5012B +:1039C00090E00196877099278093F501A4CFA5E038 +:1039D000B0E0EDEEFCE10C94F8238E010F5F1F4F79 +:1039E00085E0F80111928A95E9F78AE4C82E81E012 +:1039F000D82EF12CE12CAA24A394B12CF6018191AC +:103A00006F018F3F09F443C0F894E82FE295EF70FF +:103A1000F0E021A18F70A50102C0440F551F8A95C7 +:103A2000E2F7CA01922F982B91A392A18095892346 +:103A300082A3789400C0EFE4F1E0912C31E0219171 +:103A40002F3F09F470C0A22FA295AF70B0E09096FE +:103A50008C9190E02F7002C0959587952A95E2F79A +:103A600080FD61C0832F982A330F51E0E735F507B9 +:103A700031F7F601319780818F3F11F00E94CC051C +:103A800080EA8A95F1F7F801EE0DFF1D9082EFEFC5 +:103A9000EE1AFE0AF5E0EF16F10409F0AFCF45E0AB +:103AA00050E0B8018EE192E00E947D24892BE9F17B +:103AB00085E0F801AEE1B2E001900D928A95E1F760 +:103AC00081E080931D020E94D60490931C02809393 +:103AD0001B0220911B0230911C024FB7F894809179 +:103AE000950290919602A0919702B09198024FBFD3 +:103AF000821B930B0597E8F045E050E06EE172E021 +:103B00008DE292E00E947D24892BC1F085E0EEE1F8 +:103B1000F2E0ADE2B2E001900D928A95E1F781E02A +:103B200010921D0207C080E09ECF80911D0281117E +:103B3000D0CF80E02596EBE00C94142480E0F0CF09 +:103B400090E080E00E943624883E9E4F19F40E9447 +:103B5000910C089580E008951F920F920FB60F9276 +:103B600011242F933F934F935F936F937F938F9382 +:103B70009F93AF93BF93CF93DF93EF93FF93D09136 +:103B8000E900DF708091EC00C82FC17080FDC0E8B3 +:103B90001092E9008091F000877F8093F000789484 +:103BA0000E94710F1092E9008091F000886080936C +:103BB000F000CD2BCF70C093E900FF91EF91DF9122 +:103BC000CF91BF91AF919F918F917F916F915F91B5 +:103BD0004F913F912F910F900FBE0F901F9018950E +:103BE0001F920F920FB60F9211242F933F934F9372 +:103BF0005F936F937F938F939F93AF93BF93EF9355 +:103C0000FF938091E10082FF09C08091E20082FF72 +:103C100005C08091E1008B7F8093E1008091DA0004 +:103C200080FF24C08091D80080FF20C08091DA00FE +:103C30008E7F8093DA008091D90080FF9DC080E163 +:103C400089BD82E189BD09B400FEFDCF81E080938A +:103C50008B0280916602811109C00E944C030E9470 +:103C600017048091E20084608093E2008091E1007B +:103C700080FF17C08091E20080FF13C08091E200B6 +:103C80008E7F8093E2008091E20080618093E20069 +:103C90008091D80080628093D80019BC85E0809321 +:103CA0008B028091E10084FF2BC08091E20084FFB1 +:103CB00027C080E189BD82E189BD89B5982F9170C7 +:103CC00080FFFBCF8091D8008F7D8093D8008091BA +:103CD000E1008F7E8093E1008091E2008F7E8093EF +:103CE000E2008091E20081608093E20080918C028A +:103CF000882309F447C084E080938B0280918B0273 +:103D00008091E10083FF27C08091E20083FF23C000 +:103D10008091E100877F8093E10082E080938B02B5 +:103D200010928C028091E1008E7F8093E10080915F +:103D3000E2008E7F8093E2008091E20080618093B8 +:103D4000E20042E060E080E00E94E5038091F00044 +:103D500088608093F000FF91EF91BF91AF919F91A8 +:103D60008F917F916F915F914F913F912F910F9024 +:103D70000FBE0F901F90189519BC10928B021092D5 +:103D8000660274CF8091E30087FD93E090938B02ED +:103D9000B5CF78941F921FB61F9211248F939F93D3 +:103DA000AF93BF938091950290919602A091970254 +:103DB000B09198020196A11DB11D80939502909338 +:103DC0009602A0939702B0939802BF91AF919F91F2 +:103DD0008F911F901FBE1F9018951F921FB61F92A4 +:103DE00011248F939F93AF93BF93809160028111B1 +:103DF00013C08091950290919602A0919702B09184 +:103E000098024196A11DB11D809395029093960250 +:103E1000A0939702B0939802BF91AF919F918F9119 +:103E20001F901FBE1F901895CDB7DEB7AA970FB68B +:103E3000F894DEBF0FBECDBF85B7806885BF85B75C +:103E4000806885BF84B7877F84BF0FB6F894A89534 +:103E500080916000886180936000109260000FBEC6 +:103E600080E890E00FB6F894809361009093610031 +:103E70000FBE8AEC95E090938D0180938C010E9497 +:103E80004C030E9417048091E20084608093E2005A +:103E9000789480918B028823A1F01091E9001F7023 +:103EA0009091EC00892F817090FD80E8182B109282 +:103EB000E9008091E80083FD0E94710F1F7010934C +:103EC000E90082E084BD93E095BD9AEF97BD8093B1 +:103ED0006E000E94910C811102C00E94DE0B0AE468 +:103EE00011E0D8018D918D018F3F11F00E94CC051A +:103EF000B1E00F341B07A9F70FE411E087E5E82EC6 +:103F000081E0F82EF80181918F018F3F11F00E941E +:103F1000CC05E016F106B1F785E0EDE2F2E0DF0155 +:103F2000282F1D922A95E9F7EEE1F2E0DF011D92BC +:103F30008A95E9F70E94A01D811102C00E94270EF8 +:103F400082E090E00E942824809326020E94AA0C1E +:103F500090936202809361020E94E71CEFE3FCE908 +:103F60003197F1F700C000000E94E71C80912D02FC +:103F700081FF08C06FEF7FEF90E080E00E945A243D +:103F80000E94F00883E090E00E9428240E94560FCF +:103F900080912302811133C00E94A01D811104C0B1 +:103FA0000E94270E0E94170E88E090E00E943024A5 +:103FB0006093550270935602809357029093580273 +:103FC0006E7F71F40E94170E88E090E00E9430240A +:103FD0006093550270935602809357029093580253 +:103FE0000E942505109239028091550280FF04C07D +:103FF00060E086950E94B00D81E08093230280E00E +:1040000091E090935D0280935C0218E1E12EF12C27 +:104010008DE292E005E0D02ED80E80918B02B0E4C4 +:10402000BB2E00E112E1853009F483C00E94E71C39 +:10403000F7E26F2EF2E07F2EADE28A2EA2E09A2EFA +:10404000D401F30191918D9122E0EC32F20709F451 +:104050007AC09817B9F310E0D4010D914D01F30126 +:1040600081913F01801721F1C82EC026B12CAA24CE +:10407000A3948C2D8A21A1F0BEA21FA391E0802FD2 +:104080008A2109F490E098A70E94D6048160782FD5 +:104090009AA789A74EA15FA168A58AA50E94621C64 +:1040A000B394AA0CF8E0BF12E4CFF3013197008378 +:1040B0001F5F153089F68FB7F894409195025091A3 +:1040C000960260919702709198028FBF5CC08091B8 +:1040D0008B02843009F1109260020FB6F894A89513 +:1040E000E09260000FBEB092600083B7817F846071 +:1040F00083BF83B7816083BF7894889583B78E7FB1 +:1041000083BF0FB6F894A895809160008861809372 +:104110006000109260000FBE80918A02882349F0EF +:104120000E94E71CEDE2F2E081918111B3C2DE1240 +:10413000FBCF80918B02853009F4C9CF0E945B0FC1 +:104140000E94120573CF981386CF0E94D6048C016B +:10415000809124029091250208171907A1F08FEF92 +:1041600089A38AA31BA20E94D6048160782F9DA3F5 +:104170008CA349A15AA16BA18DA10E94621C10932E +:10418000250200932402809139028823D1F1809185 +:104190003802E0915502E695E81BE0933402823044 +:1041A00009F06BC0F0E0E75CFD4FE4910E2F10E0EA +:1041B000E3E4AE2EEBE0BE2E80913502882361F061 +:1041C000109235020E94D6049093330280933202FB +:1041D00010923702109236020E94D604E091320209 +:1041E000F09133028E1B9F0B8F3F9F4750F4E00FDF +:1041F000F11FF0933302E093320282E392E0F50183 +:1042000009950E94120590912C02891769F08093FC +:104210002C028FB7F89440919502509196026091CC +:104220009702709198028FBF80918B02843009F0C1 +:10423000F4CE83E08093E9008091E80082FFEDCE28 +:104240008091E80090E085FF06C00E946B03882300 +:1042500009F46DC091E08091E8008B778093E800CD +:10426000992309F4DACEE981E150E33108F0DEC0A8 +:10427000F0E0EE55FB4D0C94B323863059F4F0E09A +:10428000EA5CFD4FE4910E2F10E073E3A72E7BE074 +:10429000B72E92CF893061F4E695F0E0ED5CFD4FEA +:1042A000E4910E2F10E067EAA62E6AE0B62E84CFC6 +:1042B0008F3061F4E695F0E0E05DFD4FE4910E2F64 +:1042C00010E059E4A52E5AE0B52E76CF853159F489 +:1042D000F0E0E35DFD4FE4910E2F10E04BEFA42ED4 +:1042E00049E0B42E69CF08E210E090E8A92E99E0E9 +:1042F000B92E883109F460CF833249F4EBE2F2E061 +:104300000591149132EEA32E3AE0B32E55CF04EF6F +:1043100011E029E4A22E29E0B22E843209F44CCF18 +:1043200000ED17E081EDA82E84E0B82E45CF00E225 +:1043300010E0CE0101965C018091E80085FD0AC085 +:104340008091E8008B778093E8000E946B038823BC +:1043500099F380CF8091F100D5018D935D010150DB +:10436000110951F777CF1A828AE08B832AC08A819C +:10437000823009F4A5C18330A9F0813009F056C01C +:104380002FB7F894609195027091960280919702F0 +:10439000909198022FBF0E94B9236B837C838D83F9 +:1043A0009E830FC080912D028B8380912E028C837F +:1043B00080912F028D83809130028E838091310213 +:1043C0008F8380918B02843009F027CE1091E90011 +:1043D0001F709091EC00892F817090FD80E8182B60 +:1043E00082E08093E9008091E80080FF0DC050E0FA +:1043F00040E060E270E0CE0101960E949C03809153 +:10440000E8008E778093E8001F701093E90005CED6 +:104410008A81823059F46B817C818D819E810E94DA +:10442000B92386E290E00E943C24CBCF8FEF8983B2 +:10443000C8CF4C816B818A810E94EE0B9827892717 +:1044400098279E838D83BDCF2D813E8132272327E0 +:1044500032274C816B818A810E94670BB2CF0E9408 +:104460008D0BAFCF8A81813809F1A8F4803809F02B +:10447000A8CF8B81BFEF8B9FC00111246FEF70E03D +:104480000E946923462F20E06091570280915602D6 +:104490000E94CB0C96CF823859F1833809F091CF26 +:1044A00020E0409158026C818B81F2CF60E08B81DB +:1044B0000E94B00D9B8180915502911111C08E7F99 +:1044C0008093550210923902EFEFF0E722E0E150BD +:1044D000F0402040E1F700C000000E94140971CFB5 +:1044E00081608093550260E086950E94B00D69CF8F +:1044F0008B818093590265CF8A818138E1F078F40D +:10450000803809F05ECF80915802AFEF8A9FC001DA +:1045100011246FEF70E00E9469236B8352CF8238C1 +:1045200091F0833809F04DCF809156028B838091B2 +:1045300057028C8346CF8091550280FF02C086953A +:1045400014CF80E012CF809159020FCF60915502B5 +:104550007091560280915702909158020E94B80CB7 +:1045600030CF80E18A832DCF82E08A8389E9FDCE36 +:10457000AA80BB80BA24AB24BA248E010F5F1F4FE0 +:104580008C80800E912E911CC50189599E4F081573 +:10459000190509F416CFB9E9AB16B2E0BB0650F421 +:1045A0000E942824F8018483BFEFAB1ABB0A0F5F77 +:1045B0001F4FEACFD80114961C92F6CF0A811B81B7 +:1045C000102701271027FE0131964F01AC80A00E65 +:1045D000B12EB11CC80189599E4F0A151B0509F45B +:1045E000F0CE0939F2E01F0728F4D40114966C913B +:1045F0000E943C24BFEF8B1A9B0A0F5F1F4FEACF2C +:104600000E94570BDECE84E0ADCFAA80BB80BA24D7 +:10461000AB24BA248E010F5F1F4F8C80800E912E29 +:10462000911CC50187960815190509F4CACEE0E466 +:10463000AE16E1E0BE0658F40E942824D801149674 +:104640008C93FFEFAF1ABF0A0F5F1F4FEACFF8013D +:104650001482F7CF0A811B81102701271027CE0172 +:1046600001964C01AC80A00EB12EB11CC8018796FA +:10467000A016B10609F4A5CE0034A1E01A0720F473 +:10468000F40164810E943C24FFEF8F1A9F0A0F5FA0 +:104690001F4FECCF09BD19BD09B400FEFDCF8091BD +:1046A000D8008F7D8093D8008091E0008260809355 +:1046B000E0008091E00081FDFCCF0E945B0F39CDCE +:1046C00086E290E00E9428241B821C821D828E8339 +:1046D00078CEAA1BBB1B51E107C0AA1FBB1FA617A0 +:1046E000B70710F0A61BB70B881F991F5A95A9F79B +:1046F00080959095BC01CD01089597FB072E16F487 +:10470000009407D077FD09D00E94692307FC05D0EB +:104710003EF4909581959F4F0895709561957F4FD8 +:104720000895A1E21A2EAA1BBB1BFD010DC0AA1FF2 +:10473000BB1FEE1FFF1FA217B307E407F50720F00A +:10474000A21BB30BE40BF50B661F771F881F991F85 +:104750001A9469F760957095809590959B01AC01CE +:10476000BD01CF010895EE0FFF1F0590F491E02DDC +:104770000994692796276927782787277827089536 +:104780000E94C823332312F48A1B9B0B0C94D92359 +:10479000A29FB001B39FC001A39F700D811D112482 +:1047A000911DB29F700D811D1124911D08950E94CD +:1047B000C823B7FF0895821B930B08950E94C82356 +:1047C000A59F900DB49F900DA49F800D911D112465 +:1047D0000895B7FF0C94DE230E94DE23821B930B07 +:1047E00008952F923F924F925F926F927F928F9295 +:1047F0009F92AF92BF92CF92DF92EF92FF920F9370 +:104800001F93CF93DF93CDB7DEB7CA1BDB0B0FB679 +:10481000F894DEBF0FBECDBF09942A883988488836 +:104820005F846E847D848C849B84AA84B984C884CC +:10483000DF80EE80FD800C811B81AA81B981CE0FC3 +:10484000D11D0FB6F894DEBF0FBECDBFED010895A8 +:10485000F999FECF92BD81BDF89A992780B5089548 +:10486000A6E1B0E044E050E00C946224A8E1B0E09E +:1048700042E050E00C946224262FF999FECF92BDBD +:1048800081BDF89A019700B4021639F01FBA20BD15 +:104890000FB6F894FA9AF99A0FBE08950396272F47 +:1048A0000E943D240E943C24252F0E943D24242F59 +:1048B0000C943D240196272F0E943D240C943C2407 +:1048C000DC01CB01FC01F999FECF06C0F2BDE1BDD0 +:1048D000F89A319600B40D9241505040B8F70895BF +:1048E000FC014150504030F001900616D1F731974D +:1048F000CF010895882799270895FB01DC0104C0A2 +:104900008D910190801921F441505040C8F7881BC7 +:10491000990B0895F894FFCF52107A101D127A1057 +:104920001D12AD10CE101D12CC11D9118D178D177F +:10493000C817C8175F18F717F717F7177918E61889 +:10494000F718F718B321B7210822192224222F22A1 +:1049500032227C22A62216221622B122B422B822AA +:0A496000DE220023032305232A238F +:10496A00D304B008D2048608D00401191A1B1C1DEE +:10497A001E1F20212201020101818283E200E90037 +:10498A00EA00B500B600B700CD008301CC008A0169 +:10499A0092019401210223022402250226022702FF +:1049AA002A02B300B4006F0070003534C697663629 +:1049BA00323331F7F6F5F400010202020206060666 +:1049CA000909090909090F0F0F0F0F0F15151518F6 +:1049DA0019191919191919191919232440226D3B82 +:0C49EA00011901AC009405AD05CD0500DD +:00000001FF diff --git a/keyboards/aleblazer/zodiark/config.h b/keyboards/aleblazer/zodiark/config.h index b681bbeab7cd..1d1eb5cb6bc6 100644 --- a/keyboards/aleblazer/zodiark/config.h +++ b/keyboards/aleblazer/zodiark/config.h @@ -18,6 +18,13 @@ along with this program. If not, see . #include "config_common.h" +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xF901 +//#define PRODUCT_ID 0xF902 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Aleblazer +#define PRODUCT Zodiark + #define SOFT_SERIAL_PIN D3 #define SELECT_SOFT_SERIAL_SPEED 1 diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/aleblazer_zodiark_solartempest.hex b/keyboards/aleblazer/zodiark/keymaps/solartempest/aleblazer_zodiark_solartempest.hex new file mode 100644 index 000000000000..9d2471689c5c --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/aleblazer_zodiark_solartempest.hex @@ -0,0 +1,1709 @@ +:100000000C941E060C9465060C9465060C9465060B +:100010000C942D310C9465060C9465060C946506C1 +:100020000C9465060C9465060C949F190C945B194E +:100030000C94DB270C9465060C9465060C946506FD +:100040000C9465060C9465060C9465060C94650684 +:100050000C9465060C94781A0C9465060C9465064D +:100060000C9465060C9465060C9465060C94650664 +:100070000C9465060C9465060C9465060C94650654 +:100080000C9465060C9465060C9465060C94650644 +:100090000C9465060C9465060C9465060C94650634 +:1000A0000C9465060C9465060C946506050109021E +:1000B000A10185020901A1000509190129081500FE +:1000C0002501950875018102050109300931158165 +:1000D000257F95027508810609381581257F9501D0 +:1000E00075088106050C0A38021581257F95017572 +:1000F000088106C0C005010980A101850319012AF4 +:10010000B700150126B700950175108100C0050CD8 +:100110000901A101850419012AA002150126A002E6 +:10012000950175108100C00660FF0961A101096297 +:10013000150026FF00952075088102096315002629 +:10014000FF00952075089102C005010906A101056F +:100150000719E029E7150025019508750181029529 +:1001600001750881010507190029FF150026FF0008 +:100170009506750881000508190129059505750181 +:100180009102950175039101C0000000000000007C +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000007E0F00C2 +:1001B000D4FFFFFFC700000078000000000000002F +:1001C000002A2B28000000000000000000000000B2 +:1001D0000000000029000000002C1E3420212224F1 +:1001E000342627252E362D3738271E1F202122237F +:1001F0002425263333362E37381F04050607080911 +:100200000A0B0C0D0E0F10111213141516171819D6 +:100210001A1B1C1D2F3130232D3504050607080934 +:100220000A0B0C0D0E0F10111213141516171819B6 +:100230001A1B1C1D2F3130354C00DA1281FFD9F109 +:10024000DB20A4A62EAF00A0C000A1C800AED580C0 +:10025000A83FD300408D14200000000000000000E3 +:10026000000000000000000000000000000000008E +:10027000000000000080C0606060606060606060DE +:10028000C0C080000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A00000000000F8FC060652DACA5206EC1810EC +:1002B000101010909E436020231210121013312052 +:1002C00060C39F1E101C121212121C10F0E080005E +:1002D000000000000000000000000000000000001E +:1002E00000000000FFFF0000000000F0F707E0C082 +:1002F00000F8CF0100000000000000010303060E1B +:10030000080001C6FC00387000000000FFFFFF007D +:1003100000000000000000000000000000000000DD +:1003200000000000FFFF000000000001FDFC0001D4 +:100330001831630F1C38307366646460606070301D +:10034000381C0F0701000000A0E04000FFFFFF0085 +:10035000000000000000000000000000000000009D +:100360000000000001070C0C1C1C1C1C1D1D1C1C8B +:100370001C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1CBD +:100380001C1C1C1C1C1C1C1C1C1C1C1C0F0F0300FC +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000008080D +:1003E0000CCFF0F0F0F0F06060E0C0C080000000E2 +:1003F000000000000000000000808080C0C0C0C07D +:10040000C0C0C0C08080800000000000000000006C +:1004100000000000000000000000000000000000DC +:100420000E7F7FF3F3FFFFFEFEFFFFFFFFFE3800AE +:10043000000080E0F8F8FEFEFFFF7F3F3F1F1F1F18 +:100440001F1F1F3F7F7FFFFFFEF8F8E080000000C6 +:10045000000000000000000000000000000000009C +:1004600000000080C1C1E1F7FFFF7F3F07030000EC +:1004700000C0FFFFFFFFFFFF0301000000000000BE +:10048000000000000000E0F1FFFFFFFF3F00000060 +:1004900000000000000080F0C0000000C0F0F8FC88 +:1004A000FCFE7F3F1F0F070703010000000080C014 +:1004B000F8FFFFFFFFFF0300000000000000000046 +:1004C000C0E0F0F8FEFFFFFF3F0703000000000060 +:1004D00000C0E0F8FC3E0F070100000F3F7FFFFF68 +:1004E000FFFFFCF0E0C0C0E0E0F0F0F8F8FEFFFF36 +:1004F0007F3F0F0F01000000000000000000000718 +:100500001F7FFFFFFFFFFDF0E0E0F0F0F8F8FC7E5A +:100510003F0F070300000000000000000000000182 +:100520000303070F0F0F0F0F0F0703030301000053 +:1005300000000000000000000000000000000000BB +:100540000000000103030707070F07030301000072 +:100550000000000000000000000001010101010195 +:10056000010101020202020202020202030303036A +:10057000030303030404040404040405050505053A +:1005800006060606060707070707080808080909F8 +:1005900009090A0A0A0B0B0B0C0C0C0D0D0D0E0EA3 +:1005A0000E0F0F0F10101111111212131314141536 +:1005B0001516161717181819191A1A1B1B1C1D1DAA +:1005C0001E1E1F2020212222232424252626272800 +:1005D00029292A2B2C2D2D2E2F3031323233343530 +:1005E000363738393A3B3C3D3E3F40414243444533 +:1005F000464748494A4C4D4E4F5051535455565812 +:10060000595A5B5D5E5F616264656668696B6C6DBB +:100610006F7072737577787A7B7D7E808283858731 +:10062000888A8C8E8F91939596989A9C9EA0A2A36F +:10063000A5A7A9ABADAFB1B3B5B7BABCBEC0C2C474 +:10064000C6C9CBCDCFD1D4D6D8DBDDDFE2E4E7E934 +:10065000EBEEF0F3F5F8FAFDFFFFAA7F554007082F +:100660007F0807003E5B4F5B3E003E6B4F6B3E00DA +:100670001C3E7C3E1C00183C7E3C18001C577D57DD +:100680001C001C5E7F5E1C0000183C180000FFE789 +:10069000C3E7FF00001824180000FFE7DBE7FF00B6 +:1006A00030483A060E00262979292600407F0505A4 +:1006B0000700407F05253F005A3CE73C5A007F3E3B +:1006C0001C1C0800081C1C3E7F0014227F22140002 +:1006D0005F5F005F5F0006097F017F00006689950C +:1006E0006A0060606060600094A2FFA29400080449 +:1006F0007E04080010207E20100008082A1C080034 +:10070000081C2A0808001E10101010000C1E0C1ED9 +:100710000C0030383E383000060E3E0E0600000059 +:100720000000000000005F0000000007000700005C +:10073000147F147F1400242A7F2A120023130864D4 +:100740006200364956205000000807030000001CD4 +:10075000224100000041221C00002A1C7F1C2A00AC +:1007600008083E08080000807030000008080808EB +:1007700008000000606000002010080402003E51E4 +:1007800049453E0000427F40000072494949460009 +:100790002141494D33001814127F1000274545456B +:1007A00039003C4A494931004121110907003649C5 +:1007B00049493600464949291E000000140000003E +:1007C00000403400000000081422410014141414E6 +:1007D00014000041221408000201590906003E419C +:1007E0005D594E007C1211127C007F494949360048 +:1007F0003E41414122007F4141413E007F494949FC +:1008000041007F09090901003E41415173007F0801 +:1008100008087F0000417F4100002040413F010067 +:100820007F08142241007F40404040007F021C02AC +:100830007F007F0408107F003E4141413E007F0958 +:10084000090906003E4151215E007F091929460031 +:1008500026494949320003017F0103003F404040DF +:100860003F001F2040201F003F4038403F006314DE +:10087000081463000304780403006159494D4300E0 +:10088000007F414141000204081020000041414125 +:100890007F00040201020400404040404000000389 +:1008A000070800002054547840007F284444380052 +:1008B000384444442800384444287F003854545471 +:1008C000180000087E09020018A4A49C78007F0884 +:1008D0000404780000447D4000002040403D0000BA +:1008E0007F102844000000417F4000007C04780411 +:1008F00078007C0804047800384444443800FC182C +:100900002424180018242418FC007C08040408007F +:1009100048545454240004043F4424003C404020E4 +:100920007C001C2040201C003C4030403C004428FF +:10093000102844004C9090907C004464544C440037 +:100940000008364100000000770000000041360832 +:1009500000000201020402003C2623263C000000A5 +:1009600000000000404040F0F8F8FF38FFF8F83F82 +:10097000F8F8FF38FFF8F8F04040400000000000B1 +:100980000080C0C0C0800000C0C08000000080C0E7 +:10099000C000C0C0000080C0C00000000000C0C097 +:1009A000C0C0C000C0C00000000000000000000087 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D00000000000000000000000000000C0F0F86F +:1009E000FC3E1E06010000007F4141417F007F4127 +:1009F00041417F000080C0E07E5B4F5BFEC0000095 +:100A0000C000DCD7DEDEDED7DC00C0000000000066 +:100A100000000000000000000000000000000000D6 +:100A200000000000494949FFFFFFFFE0DFBFBF00B2 +:100A3000BFBFDFE0FFFFFFFF4949490000000000A2 +:100A40001F3F6060E0BF1F007F7F071E381E077FCB +:100A50007F007F7F0E1F3B716000000000007F7FE2 +:100A60000C0C0C007E7E007F7E0303007F7E030360 +:100A70007E7E03037F7E000F3E703C063C703E0F7F +:100A800000327B49493F7E007F7E0303001E3F69A1 +:100A9000696F2600000000000000000000030F1F27 +:100AA0003F3C7870600000007F4141417F007F4102 +:100AB00041417F00307B7F7830202030787F3B00C1 +:100AC00003000F7F0F0F0F7F0F00030000000000D7 +:100AD0000000000000000000000000000000000016 +:100AE00000000000010101070F0F7F0F7F0F0F7E35 +:100AF0000F0F7F0F7F0F0F070101010000000000A3 +:100B000000000000000101000000000000000000E3 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B9000000000000000000000000000000000AFA6 +:100BA00000AE09025B00030100A0FA090400000185 +:100BB0000301010009211101000122400007058104 +:100BC0000308000A090401000203000000092111C2 +:100BD000010001222200070582032000010705030E +:100BE0000320000109040200010300000009211193 +:100BF000010001227B000705840320000A12010086 +:100C0000020000000801F902FF01000102000110CA +:100C1000035A006F0064006900610072006B0000FD +:100C200000140341006C00650062006C0061007AF2 +:100C300000650072000000040309040011241FBEB7 +:100C4000CFEFDAE0DEBFCDBF04B603FE27C0809150 +:100C50007F0890918008A0918108B0918208873028 +:100C6000904BA740B04BD1F410927F0810928008AF +:100C7000109281081092820814BE84B7877F84BFC7 +:100C80000FB6F894A8958091600088618093600009 +:100C9000109260000FBEE0E0F8E3099512E0A0E0DA +:100CA000B1E0E2E7F9E602C005900D92AC33B1077E +:100CB000D9F728E0ACE3B2E001C01D92AF37B2072C +:100CC000E1F70E9402280C9480340C940000CF932A +:100CD000DF9340917D0850917E084D5754409A0112 +:100CE00020583E4F21303440C0F020E034E0241B37 +:100CF000350B60917B0470917C04FC01CA01240FC8 +:100D0000351FC1E0D0E08217930750F070937C0448 +:100D100060937B04DF91CF91089520E831E0E9CF23 +:100D20004491DC01A358BB4F5C91451781F04C9373 +:100D3000AC01A6E056954795AA95E1F7DE0102C001 +:100D4000AA0FBB1F4A95E2F7AD016A2B752B0196DE +:100D50003196D9CFE8EDF0E080818E7F80831092CC +:100D6000E2001092DA001092E100A0EEB0E08C9167 +:100D700081608C9380818F77808319BCA7EDB0E070 +:100D80008C918E7F8C9380818F7E808310929203D2 +:100D900008952091E4003091E50095E6A9012091A5 +:100DA000EC00822F817020FF06C08091E80080FF58 +:100DB00006C080E008952091E80022FD1AC08091CD +:100DC0009F03882389F0853089F08091EB0085FDB1 +:100DD0000FC02091E4003091E50042175307F9F26B +:100DE0009150E1F684E0089582E0089583E008954B +:100DF00081E00895EF92FF920F931F93CF937C01B0 +:100E00008B010E94C906C82F811117C08091E8008C +:100E100085FD0BC08091E8008E778093E8000E94EA +:100E2000C906882399F3C82F08C0F70181917F0173 +:100E30008093F1000150110949F78C2FCF911F9138 +:100E40000F91FF90EF9008958091A10387FF13C049 +:100E50008091E80082FF06C08091E8008B77809344 +:100E6000E80004C080919F038111F2CF0895809122 +:100E70009F038823D9F38091E80080FFF8CF809109 +:100E8000E8008E77ECCF982F9093E900242F762FEF +:100E900050E0891731F07091EC002091ED005091F5 +:100EA000F00021FD07C09F5F973071F78093E90044 +:100EB00081E008953091EB003E7F3093EB0030915C +:100EC000ED003D7F3093ED003091EB0031603093C9 +:100ED000EB007093EC002093ED005093F000209114 +:100EE000EE0027FDE0CF80E00895CF92DF92EF92F1 +:100EF000FF920F931F93CF93DF93C8EDD0E08881CB +:100F00008F7E8883E7EDF0E080818160808384E0DC +:100F100082BF81E08093920388818E7F888302EE76 +:100F200010E0F80110821092DA0081EEC82ED12C68 +:100F3000F601108288818F77888388818068888312 +:100F400088818F7D888319BC10929F031092A00323 +:100F500010929E0310929D0390EEE92EF12CF70162 +:100F600080818B7F808388818160888342E060E01C +:100F700080E00E944307F60180818E7F8083F80124 +:100F8000808181608083808188608083F701808197 +:100F90008E7F8083888180618883DF91CF911F91CC +:100FA0000F91FF90EF90DF90CF900895FC0180911A +:100FB000A7039091A80386179707A0F06115710504 +:100FC00029F49091E8009E779093E80090E06115F5 +:100FD000710551F4911108C08091E80082FF34C07E +:100FE00080E00895BC01F2CF80919F038823C1F176 +:100FF0008530C1F18091E80083FD30C08091E80028 +:1010000082FDEACF8091E80080FFE1CF8091F3007C +:101010002091F200382F6115710519F02830310543 +:1010200058F091E02830310509F090E02091E80077 +:101030002E772093E800CBCF81918093F10061500F +:1010400071092F5F3F4FE7CF80919F03882341F0C5 +:10105000853041F08091E80083FFBECF81E00895A4 +:1010600082E0089583E0089508958091940308959F +:101070002FB7F89460918B0370918C0380918D034E +:1010800090918E032FBF089520918803309189039A +:101090002817390771F09093890380938803E091B2 +:1010A0008603F0918703309721F00084F185E02DCD +:1010B00009940895209184033091850328173907F6 +:1010C00071F09093850380938403E0918603F091FF +:1010D0008703309721F00680F781E02D0994089569 +:1010E0002091770336E0839FC0011124629F800D19 +:1010F000911D1124811524E0920714F090E080E006 +:1011000083589B4F90937E0880937D080895FC013F +:10111000680F791F8FEF91E32191822728E030E05B +:1011200087FF09C0880F892721503109C9F7E617C1 +:10113000F70791F70895880FF7CFFA01811101C0E1 +:10114000FB01099480917604982F9E7F61F4817051 +:10115000826080937604809179048B3A18F08AEA51 +:101160008093790408958831B0F381708661F1CF5E +:10117000AF92BF92DF92EF92FF920F931F93CF93A4 +:10118000DF93082F162FE901E42FF0E0E75AFA4F1A +:10119000611110C0E4915E2F4E2F4983E8835A837A +:1011A000DF91CF911F910F91FF90EF90DF90BF9053 +:1011B000AF900895E62EF12C4491D42EE42FF0E068 +:1011C00026E0829FC00111242FEF30E0B9010E9478 +:1011D000A732802F90E0880F991F55E5569FD001C8 +:1011E000579FB00D11248A1B9B0B982F990F890FC5 +:1011F0005901AE18BF08AE9ED001AF9EB00DBE9E85 +:10120000B00D11245B2F189F80011124012F11278D +:101210005901A01AB10AAE9E8001AF9E100DBE9E6C +:10122000100D11245901A81AB108AE9CC001AF9C41 +:10123000900DBE9C900D1124892F9927281B390BE6 +:101240002E9FC0012F9F900D3E9F900D1124E92FDE +:1012500062307105A1F050F46115710509F49DCF5C +:101260006130710581F0EB2F512F97CF64307105FC +:1012700069F080F06630710509F48FCFF4CFE42F68 +:101280004B2F592F8ACFE42F412F87CFEB2F542F8D +:10129000492F83CF4B2F5D2DE12F7FCF80E0089525 +:1012A00078940895F894E82FE295EF70F0E031A17A +:1012B000282F2F7081E090E001C0880F2A95EAF76F +:1012C000982F9095932391A392A1892B82A30C949C +:1012D00050099091E90292FF06C0282F287128300A +:1012E000F9F4877F846093FF06C0282F2871283186 +:1012F000F1F4877E84612091EA0220FF06C0382F36 +:1013000038713830D9F4877F816021FF06C0282FDB +:1013100028712831D1F4877E816194FD877E0895FC +:10132000282F24712430F9F68B7F8860DCCF282F9A +:101330002471243101F78B7E8861DDCF382F317124 +:10134000313019F78E7F8860E0CF282F217121314D +:1013500021F78E7E8861E1CFCF93DF93EC01823855 +:10136000910581F1B0F58133910509F491C020F523 +:101370008932910509F485C08A9709F490C0C11596 +:1013800021E5D20708F0AAC0C11530E5D30708F05F +:10139000F2C0CF3BD10508F089C0C83AD10508F0AA +:1013A000DFC0C53AD10508F0D3C0C430D105F8F488 +:1013B000C130D105E1F040C08533910509F45AC030 +:1013C000C997E9F68091E902837089F0C0EED0E018 +:1013D0000EC0833E910599F170F4803E910501F1B4 +:1013E000823E910561F68091E90282FD21C0CE0125 +:1013F000DF91CF910895863E910561F1873E910579 +:1014000071F1843E910509F0BACF8091EA0281FF23 +:10141000EECF8091E902C7EED0E084FD0DC0E7CFAA +:101420008091E90280FDF7C09091EA0290FFDFCF42 +:10143000C3EED0E084FFDBCFD0E0C0E0D8CF809116 +:10144000E90282FDEBC09091EA0290FDBFCF84FFDC +:10145000CECFF2CF8091E90283FDDDCFC8CF80915E +:10146000E90283FDDEC09091EA0291FFF0CFC4EE65 +:10147000D0E0BDCF8091E90285FFB9CFC9E2D0E0CD +:10148000B6CF8091E90285FFB2CFC5E3D0E0AFCF00 +:101490008091E90286FFABCFCAE2D0E0A8CF80916D +:1014A000E90286FFA4CFC1E3D0E0A1CFC11540E29D +:1014B000D40760F4C11581E0D80708F098CFCE01B9 +:1014C000815E9109079708F492CFB6CFC11590E4D9 +:1014D000D90708F4B1CFDF70D06A89CFC11524E5F0 +:1014E000D20778F4C11533E5D30708F072C0C115EF +:1014F00042E5D40708F05CC0DC2FCC27C16FD06A6E +:1015000076CFC1158AE5D80778F4C11599E5D907D2 +:1015100008F073C0C11528E5D20708F48DCFDC2F81 +:10152000CC27C06FD06A63CFCE0190568115904210 +:1015300008F082CF8D2F8F710E94690990E0982F5B +:10154000882788279F719C012C2BE901D0624FCFFF +:10155000C55AD0E0C454DE4FC881D0E0D06447CF34 +:10156000C85AD0E0CC0FDD1FC154DE4F0990D8819E +:10157000C02DD4643CCFCE0164E0969587956A95E2 +:10158000E1F783702C2F26952695237040E2249F47 +:1015900090011124382B8C2F8370C1E0D0E002C061 +:1015A000CC0FDD1F8A95E2F7C22BD32BDC681FCF4F +:1015B000CE018370992721E030E002C0220F331F53 +:1015C0008A95E2F7C695C69580E2C89FE00111248E +:1015D000EBCFCE018370992721E030E002C0220FCB +:1015E000331F8A95E2F7C695C69590E2C99FE00140 +:1015F0001124C22BD32BDA68FACE8C2F8F700E9465 +:10160000690934E0D695C7953A95E1F7CF709C2FDC +:10161000EC01D069ECCEC9E3D0E0E9CEC2EED0E077 +:10162000E6CEC6EED0E0E3CE0C9438088091A70257 +:101630009091A602892B9091A502892B80933E025E +:10164000E0918603F0918703309731F00280F381B7 +:10165000E02D8EE392E0099408958091A402909188 +:101660007302981301C008958F5F8770FACF990FA6 +:10167000990F990F890F982F977086958695869563 +:1016800023E0829FF0011124E15BFD4F50E040E038 +:1016900080E0219130E0092E02C0369527950A940A +:1016A000E2F721703327042E01C0220F0A94EAF7D3 +:1016B000822B4F5F5F4F4330510559F70895990FC3 +:1016C000990F990F890F982F977041E001C0440F2F +:1016D0009A95EAF786958695869593E0899FF0011D +:1016E0001124E15BFD4F30E020E070E05191DF011B +:1016F0001197CB01022E02C0969587950A94E2F7C6 +:10170000817081958527842385278C932F5F3F4F98 +:101710002330310559F7089590E080E00E945A087F +:1017200090E080E00E9444081092A6021092A50268 +:101730000C94160B8093A8020C948C0B882341F018 +:1017400080959091A70289238093A7020C94160B91 +:101750000895882339F09091A702982B9093A702BF +:101760000C94160B08958823B1F19CEF980F913AD1 +:1017700070F4E0E4F2E09191891303C0DF01119766 +:101780001C9242E0E634F407B1F70C94160B90E299 +:10179000980F983088F4877021E030E0A90102C0EA +:1017A000440F551F8A95E2F7CA0180959091A702D0 +:1017B00089238093A702E9CF9BE5980F933020F40B +:1017C00090E080E00C945A08885A873120F490E029 +:1017D00080E00C94440808950F931F93CF93C82F73 +:1017E000882309F469C08CEF8C0F813AB0F500E4CE +:1017F00012E086E492E0F8012191C21701F122E0A3 +:10180000E634F207C9F7EFEF80E0D8019D918D0132 +:10181000C91781F0EF3F19F4911101C0E82F8F5FD4 +:10182000863099F7EF3F31F00E2E000CFF0BE25C93 +:10183000FD4FC283CF911F910F910C94160BE0E4E2 +:10184000F2E02191C21303C0DF0111971C928E17A1 +:101850009F07B9F70E94160BD6CF80E28C0F883015 +:1018600068F4C77021E030E001C0220FCA95EAF7A2 +:101870008091A702822B8093A702DCCFEBE5EC0FCF +:10188000E33050F4F0E0E454FE4F808190E0CF91DB +:101890001F910F910C945A08C85AC73168F4EC2F65 +:1018A000F0E0EE0FFF1FE154FE4F80819181CF9158 +:1018B0001F910F910C944408CF911F910F9108959F +:1018C000982F92959F7011F0892F94E0282F2695DC +:1018D000269511F09E5F822F869509F09F5F892FD4 +:1018E0000895CF93DF93CDB7DEB762970FB6F89424 +:1018F000DEBF0FBECDBF96E0E5E6F3E0DE01179652 +:1019000001900D929A95E1F796E0FE013796DE017F +:101910001D9601900D929A95E1F798858823E9F03C +:10192000962B9E8786E0FE013D96DE011196019082 +:101930000D928A95E1F786E0FE013196A5E6B3E0C7 +:1019400001900D928A95E1F762960FB6F894DEBF8A +:101950000FBECDBFDF91CF91089560959623E1CF63 +:10196000CF92DF92EF92FF920F931F93CF93DF936B +:101970006C017B0164E670E088E70E94ED2EEC01CB +:1019800097FD12C010E000E0F601E00FF11F849116 +:1019900064E670E00E94672FEC01892B29F40F5F49 +:1019A0001F4F0E151F0581F70E948130CE01DF9178 +:1019B000CF911F910F91FF90EF90DF90CF900895FE +:1019C0008091820390918303911103C091E0892754 +:1019D0000895882369F062E070E080EA9BE00E944D +:1019E000B00C892B19F08091820308951092820324 +:1019F00080918203EBCFCF93C091820380918303C8 +:101A00008823D1F00E9438086058774C8E4F9F4F42 +:101A100060937E0370937F03809380039093810390 +:101A2000C11108C062E070E08EE99BE00E94B00C3A +:101A3000892B29F0C09182038C2FCF91089581E0EA +:101A400080938203F7CF80938F0370939103609309 +:101A5000900380919F038430F9F48093E9008FEF25 +:101A60009091E800815095FD06C095ED9A95F1F7AB +:101A700000008111F5CF8091E80085FF0DC050E096 +:101A800040E063E070E08FE893E00E94FA06809106 +:101A9000E8008E778093E8000895BC0184E00C9400 +:101AA000230DBC0183E00C94230D9C0184E0809302 +:101AB000E9009FEF8091E800915085FD06C085ED1B +:101AC0008A95F1F700009111F5CF8091E80085FF2C +:101AD0000CC050E040E066E070E0C9010E94FA06E8 +:101AE0008091E8008E778093E8000895CF93DF938C +:101AF000EC0181E08093E9008FEF9091E800815044 +:101B000095FD06C095ED9A95F1F700008111F5CF8E +:101B10008091E80085FF14C050E040E068E070E08C +:101B2000CE010E94FA068091E8008E778093E8004B +:101B300088E0FE01A5E9B3E001900D928A95E1F7F6 +:101B4000DF91CF910895609162018091760480FFCA +:101B500020C08091610143E0849FC001112486551B +:101B60009C4F259A25B12F7D35B130625FB7F8942F +:101B7000FC01649FE00DF11D1124BF016817790776 +:101B8000D1F45FBF8FE594E00197F1F700C000004A +:101B90000895809163019091640123E0829FF00198 +:101BA0001124E655FC4F8917A0F61182108212828B +:101BB0008F5F3396F8CFFC014191CF01E8E035B952 +:101BC000000000C047FF25B9440F000000C000C05E +:101BD00000C025B900C0EA9591F7D0CF0F931F93AD +:101BE000CF93DF9300D00F92CDB7DEB7182F062F1B +:101BF0008091760480FF22C09E012F5F3F4F4AEA0A +:101C000064E68BE20E94B8081017C0F48B819981BA +:101C10002A8133E0139FF0011124E655FC4F218304 +:101C2000908382831F5F33960113F9CF0E94A30D27 +:101C30008FE99FE00197F1F700C000000F900F902F +:101C40000F90DF91CF911F910F910895CF93DF9364 +:101C5000C82FD82FD17081FF04C068E084E00E94B3 +:101C6000EE0DD11108C062E080E00E94EE0D6CE044 +:101C70008AE00E94EE0DC2FF0AC064E082E00E948A +:101C8000EE0D6AE088E0DF91CF910C94EE0DDF91CC +:101C9000CF910895E6E7F4E080818E7F8083E4E7CA +:101CA000F3E08281816082832FEF80E792E0215010 +:101CB00080409040E1F700C000000C94A30D9F927B +:101CC000AF92BF92CF92DF92EF92FF920F931F934A +:101CD000CF93DF937C015B016A018091E40201E014 +:101CE00010E08A3010F40AE010E0C1E0D0E0F8948F +:101CF000B501C701F6010995982E0E94500991106F +:101D000004C021960C171D076CF4892DDF91CF912B +:101D10001F910F91FF90EF90DF90CF90BF90AF9009 +:101D20009F900895CC9F9001CD9F300D300D1124D0 +:101D300090E080E045E34A95F1F7000001968217B4 +:101D40009307C1F7D4CF8091B502811110C0809163 +:101D5000D80080618093D8008AE18A95F1F700C0AD +:101D60008091D90080FF0AC081E08093B50281E0B4 +:101D70009091B502913009F080E0089582E080935F +:101D8000B5020E94AA0610929F03F1CF0E94A30EF3 +:101D9000882351F0E0918603F0918703309721F07A +:101DA0000190F081E02D099480E008951F93CF9376 +:101DB000DF93182FEB010E94EC0B8FE99FE0019756 +:101DC000F1F700C000002197C1F7812FDF91CF917B +:101DD0001F910C94B30B0F931F93CF93DF9300D0FD +:101DE00000D0CDB7DEB789836A834B831C8204E6BB +:101DF00010E024E030E0AE014F5F5F4F60E084E12F +:101E00000E9405300F900F900F900F90DF91CF91AF +:101E10001F910F91089580915E01882329F041E27E +:101E200065EA89ED0C94EB0E8091490247EC6BE179 +:101E30008823C1F347E669E98BE2F4CFCF93DF93C0 +:101E4000C7E4D3E060E0CE010E941B332196C115A8 +:101E500084E0D807B9F7DF91CF9108956F927F9210 +:101E60008F929F92AF92BF92CF92DF92EF92FF92AA +:101E70000F931F93CF93DF9382EAC82E8BE0D82E67 +:101E800007ED10E0E801C05AD10936011CC0F50188 +:101E900085909490692DC7010E941B33682DC7015E +:101EA00001960E941B3382E0A80EB11C82E0E80E6E +:101EB000F11CCE15DF0559F780E1680E711C6096A4 +:101EC0000C171D0731F07E0180E1E81AF10853017B +:101ED000DECF00561F4F80EAC80ED11C073F83E0BB +:101EE000180781F6DF91CF911F910F91FF90EF902E +:101EF000DF90CF90BF90AF909F908F907F906F902A +:101F00000895CF93C82F6FEF811162E283E290E0D2 +:101F10000E941B336FEFC11162E084E290E00E94E7 +:101F20001B336FEFC11169E185E290E0CF910C9412 +:101F30001B3380E00E94810F60E086E290E00E9407 +:101F40001B330E942E0F0E941E0F81E00C94810F04 +:101F50000F931F93CF93DF9320E1629FE001112441 +:101F600050E0440F551FC40FD51F30EA839FC00DAA +:101F7000D11D1124CE0187960E940733082F10E04F +:101F8000102F0027CE0188960E9407339801282B36 +:101F9000C901DF91CF911F910F910895462F853090 +:101FA00038F47A3028F4683018F4672F0C94A80FAE +:101FB00090E080E00895CF92DF92FF920F931F93FD +:101FC000CF93DF936C010091A9038091A802082BA5 +:101FD000C7E0D0E010E0FC2EC8010C2E02C09595A1 +:101FE00087950A94E2F780FD0CC02197A0F7F12CA9 +:101FF0008F2DDF91CF911F910F91FF90DF90CF90A8 +:102000000895B6018C2F0E94CE0F0E94AC09019753 +:1020100061F3EECFCF93DF93EC010E94DB0FBE01A3 +:102020000E94CE0FDF91CF910C94AC09FC0180810E +:1020300091810E940A10292F2F7092959F709250C3 +:102040009E3078F4E92FF0E0EE57FB4C0C94DB3235 +:10205000803F19F020F4883E20F481E00895843F09 +:10206000E1F380E00895883EC0F3813FD1F7F5CFDA +:10207000822F869586958695089583E290E00E944A +:102080000733823289F484E290E00E940733823081 +:1020900059F485E290E00E94073391E0893109F01C +:1020A00090E0892F8170089580E0FCCFCF9384E089 +:1020B00090E00E940733C82F82E290E00E9407332D +:1020C000982F8C2FCF9108951F93CF93DF93CDB787 +:1020D000DEB768970FB6F894DEBF0FBECDBF409154 +:1020E0006503509166036091670370916803809166 +:1020F000690390916A030E94B71A20936503309395 +:1021000066036093690370936A03642F152F11951A +:10211000109367034093680386E0E5E6F3E0DE0191 +:10212000179601900D928A95E1F786E0FE013796A9 +:10213000DE01119601900D928A95E1F79B858C85C1 +:1021400020915E012223B1F0772761950CF4709500 +:10215000072E000C880B990B0E9487332DEC3CEC6A +:102160004CE45EE30E94EB330E944F33962F812FA5 +:1021700060E010E01B836C839D838E8386E0FE010C +:102180003196DE011D9601900D928A95E1F786E069 +:10219000FE013D96DE01539601900D928A95E1F77E +:1021A00086E0FE017396DE01119601900D928A95EC +:1021B000E1F786E0FE013196A5E6B3E001900D92CD +:1021C0008A95E1F786E0E5E6F3E0DE0117960190F7 +:1021D0000D928A95E1F786E0EFE5F3E0DE011196D6 +:1021E00001900D928A95E1F746E050E0BE016F5FE5 +:1021F0007F4FCE0107960E94F132892B79F0E09152 +:102200008603F0918703309749F082E0809365035D +:102210000480F581E02D85E693E00995109267032F +:10222000109268031092690310926A0386E0E5E653 +:10223000F3E0AFE5B3E001900D928A95E1F768967F +:102240000FB6F894DEBF0FBECDBFDF91CF911F91C7 +:1022500008951092A702E0E4F2E086E0DF011D920B +:102260008A95E9F70C948C0B1F93CF93DF93CDB72E +:10227000DEB7AA970FB6F894DEBF0FBECDBF81EAD6 +:1022800093E02091F100DC012D93CD01B3E0893A78 +:102290009B07B9F78091A203833009F472C0B8F4A8 +:1022A000813009F449C0823009F4B3C08091E8005C +:1022B00083FF8BC28091A1039091A2039A3008F012 +:1022C00084C2E92FF0E0E057FB4C0C94DB328A30FB +:1022D00009F48EC08B3009F471C0893039F78091D0 +:1022E000A103813219F78091A5039091A60300976D +:1022F00011F00297D9F68091E800877F8093E8007B +:102300008091E80082FF38C09091F3008091F20044 +:10231000029731F48091F100813011F0863021F480 +:102320008091F100809394038091E8008B778093F3 +:10233000E8000E942407BACF8091A103813A09F0F6 +:10234000B5CF8091E800877F8093E8008091A50356 +:102350009091A603892B61F468E085E993E070E031 +:102360000E94D6078091E8008B778093E8009ECF8B +:1023700060E090E080E0F3CF80919F038111C0CFB7 +:1023800095CF8091A103813A09F090CF8091A50368 +:102390009091A603892B09F089CF8091E800877F6F +:1023A0008093E8008091E80080FFFCCF8091660177 +:1023B0008093F1008091E8008E77B9CF8091A103DE +:1023C000813209F073CF8091A5039091A603892BE8 +:1023D00009F06CCF8091E800877F8093E8000E942D +:1023E00024078091A303809366010E9429115ECF88 +:1023F0008091A103813209F059CF8091E800877F55 +:102400008093E8000E9424078091A40380939303A3 +:102410004DCF8091A103813A09F048CF8091E80027 +:10242000877F8093E8008091E80080FFFCCF809157 +:102430009303BECF803899F0823809F0C6C18091ED +:10244000A5038F70873008F0C0C18093E9008091A8 +:10245000EB0085FB882780F91092E90006C0809187 +:102460009D0390919E03911182609091E800977F67 +:102470009093E8008093F1001092F1008091E800C1 +:102480008E779FC1882309F48DC1823009F09DC1E8 +:102490008091A303811190C18091A5038F702FEFCC +:1024A000280F263008F091C18093E9002091EB00BD +:1024B00020FF82C1933031F48091EB0080628093E1 +:1024C000EB007AC19091EB0090619093EB0021E0DA +:1024D00030E001C0220F8A95EAF72093EA001092BB +:1024E000EA008091EB008860EACF81116EC1109103 +:1024F000A3031F778091E3008078812B8093E30012 +:102500008091E800877F8093E8000E9424078091F3 +:10251000E80080FFFCCF8091E30080688093E300B7 +:1025200082E0111183E080939F034FC18058823075 +:1025300008F04BC12091A3033091A4032C3DE3E0AC +:102540003E07A1F583E08A838AE289834FB7F89436 +:10255000DE01139620E03EE051E2E32FF0E05093DD +:102560005700E49120FF03C0E295EF703F5FEF70EA +:102570008E2F90E0EA30C0F0C7968D939D932F5F29 +:10258000243159F74FBF8091E800877F8093E8009E +:102590006AE270E0CE0101960E94D6078091E800C1 +:1025A0008B778093E80011C1C096E7CF8091A50397 +:1025B0009091A603432F55274330510509F44AC093 +:1025C00078F54130510509F47AC08BE590E0E2EAF4 +:1025D000FBE04230510509F0F8C02091E800277F68 +:1025E0002093E8002091A7033091A8038217930756 +:1025F00008F49C0140E02115310509F065C0411146 +:1026000063C08091E80082FDC9CF80919F03882339 +:1026100029F2853019F28091E80083FFF2CFBECF16 +:102620004132510509F43CC04232510509F0CDC098 +:102630008330910508F0C9C0FC01EE0FFF1FE05D7B +:10264000FD4F0190F081E02D835D9D4FDC018C9169 +:1026500090E01AC0332721303105D1F02115310522 +:1026600061F02230310509F0B0C0EFE0FCE0E49108 +:102670008E2F90E0EFE0FCE007C0E7E3FCE0E491A0 +:102680008E2F90E0E7E3FCE0009709F49EC0A5CF11 +:10269000E1E2FCE0E4918E2F90E0E1E2FCE0F4CF97 +:1026A0008330910508F091C0880F991FFC01EA5C06 +:1026B000FD4F0190F081E02D89E090E08ECF82E126 +:1026C00090E0EDEFFBE089CF80919F03882309F430 +:1026D00065CF853009F462CF8091E80083FD5ECF3D +:1026E0008091E80082FD8DCF8091E80080FF83CF4C +:1026F0009091F3008091F2002115310519F0883096 +:10270000910550F041E0089709F040E08091E80021 +:102710008E778093E8006FCF44914093F10031961B +:10272000215031090196E8CF803809F04EC08091E0 +:10273000E800877F8093E8008091A0038093F100F8 +:102740009DCE811142C01091A3031230F0F580910B +:10275000E800877F8093E8001093A0030E9424077D +:10276000112311F084E005C08091E30087FDFACFCA +:1027700081E080939F0342E061EC81E00E94430787 +:1027800042E261EC84E00E94430742E261EC82E0B5 +:102790000E94430742E260EC83E00E94430780917D +:1027A0009F0313C08091A303813079F481E09330BB +:1027B00009F080E080939E031092E9008091E80088 +:1027C000877F8093E8000E9424078091E80083FFC0 +:1027D0000AC08091E800877F8093E8008091EB0039 +:1027E00080628093EB00AA960FB6F894DEBF0FBE0E +:1027F000CDBFDF91CF911F9108951F93CF93DF93AA +:10280000162FC0917D08D0917E088A30D1F4209196 +:102810007703CE018D579440622F70E00E94A7325B +:10282000281B822F66E00E94BB32C82FC15020F4C3 +:10283000DF91CF911F91089560E080E20E94FD1327 +:10284000F5CF8D30E9F4CD57D44020917703622F36 +:1028500070E0CE010E94A732281B822F9E01280F14 +:10286000311D2115344018F080E0D0E0C0E0C80FE1 +:10287000D11DC358DB4FD0937E08C0937D08D8CFBD +:1028800096E0FE01A8E7B3E001900D929A95E1F77A +:10289000803E90F186E0FE0111928A95E9F7C091A1 +:1028A0007D08D0917E08111133C046E050E0BE0192 +:1028B00088E793E00E94F1329E012D573440892B26 +:1028C00091F52A5F3F4F40917703642F70E0C90173 +:1028D0000E94A732481B463010F4240F311D2115E9 +:1028E00074E0370710F030E020E023583B4F30937E +:1028F0007E0820937D089CCFF6E08F9FB0011124C5 +:10290000625A794F46E050E0CE010E94E832C7CFCC +:102910009E012A5F3F4FFE012E173F0731F2808153 +:1029200080958193F9CFC90146E0969587954A95A0 +:10293000E1F741E050E0BA0102C0660F771F8A95C7 +:10294000E2F7CB0160917B0470917C04862B972B7E +:10295000B9016B5F7F4FE6E076956795EA95E1F701 +:1029600002C0440F551F6A95E2F7842B952B909374 +:102970007C0480937B04A5CFFF920F931F93CF938A +:10298000DF93EC01F62EFC0101900020E9F78F01A6 +:1029900001501109C017D10730F0DF91CF911F917D +:1029A0000F91FF9008956F2D89910E94FD13F2CF32 +:1029B000CF92DF92EF92FF926B017C010E94A208FE +:1029C000B701A60188E090E0FF90EF90DF90CF90F4 +:1029D0000C942D33AF92BF92CF92DF92EF92FF9281 +:1029E0000F931F93CF93DF9300D00F92CDB7DEB735 +:1029F000082FF62E142FE22E8091760480FF4FC010 +:102A0000E82FE695AE2FB0E0AF5DBD4F9C9190935F +:102A100074038E7F823009F056C04B3A08F04AEAC0 +:102A20009E012F5F3F4F6F2D802F0E94B80880912D +:102A3000760480FF11C02B8139814A818091630126 +:102A40009091640153E0859FF0011124E655FC4FFD +:102A5000891798F10E94A30D80917704801308C014 +:102A6000809178048F1104C080917904811729F036 +:102A70008091760382608093760300937704F092CE +:102A8000780410937904EE2051F0609176047091EF +:102A9000770480917804909179040E94D8140F9063 +:102AA0000F900F90DF91CF911F910F91FF90EF90BA +:102AB000DF90CF90BF90AF90089541833083228301 +:102AC0008F5F3396C5CF923039F6E2508E2F8170EA +:102AD000D82EE695F0E0E75AF94FA590B490C12CB6 +:102AE000BB2460916501C61608F0B4CF2C2D30E0F0 +:102AF000A29EC001A39E900DB29E900D112470E085 +:102B00000E94A732802FD11016C0860F409163011A +:102B1000420F532F511D9A01220F331F240F351FCF +:102B200026553C4F412F1B3A08F04AEA6F2D0E9470 +:102B3000B808C394D6CF861BE9CF20E00C94EA14E2 +:102B4000CF93C82F0E94600C823069F138F488233B +:102B5000A9F0813011F18C2FCF910895833039F194 +:102B60008430C9F740E56FEF8AED0E949D15809192 +:102B70000001882381F310925E010CC04CE36CEDE0 +:102B800080E00E949D15809100018823A1F381E0DF +:102B900080935E010E940B0FDECF40E56FEF8CEF5C +:102BA0000E949D15D8CF40E56FEF80E5F9CF40E555 +:102BB0006FEF80EAF5CF0E94A0158093A9030C94D3 +:102BC0008C0B8091A903982F9670963019F4886029 +:102BD0000C94DB15877FFCCF21E030E001C0220F91 +:102BE0008A95EAF720958091A90382230C94DB153E +:102BF00021E030E001C0220F8A95EAF78091A90315 +:102C0000822B0C94DB15E6E7F4E0438128E0421BBD +:102C100008F440E021E0628181810C94EA14E6E747 +:102C2000F4E0438128E0420F08F44FEF21E0628195 +:102C300081810C94EA14E6E7F4E0628128E0621BEB +:102C400008F460E021E0438181810C94EA14E6E716 +:102C5000F4E0628128E0620F08F46FEF21E0438125 +:102C600081810C94EA14E6E7F4E0818121E043815C +:102C7000628188500C94EA14E6E7F4E0818121E057 +:102C800043816281885F0C94EA1480917A048823DE +:102C900019F0815080937A046091760470917704E2 +:102CA00080917804909179040C94D81480917A04DE +:102CB000833018F48F5F80937A046091760470916A +:102CC000770480917804909179040C94D8149091B1 +:102CD000760490FF26C0917081111CC09260909381 +:102CE000760480917603816080937603662351F0A9 +:102CF00060917604709177048091780490917904C2 +:102D00000E94D814409179046091780480917704EE +:102D10000C949D158C3010F09661E1CF880F982BA4 +:102D2000DECF0895809176048695815009F48BE07A +:102D300061E00C9467168091760486958F5F8C30E5 +:102D400008F081E061E00C9467168091760480FFC2 +:102D500007C0869582588F77893010F40C949B16A3 +:102D600061E082E00C946716E6E7F4E083E080839C +:102D700011828FEF82838AEA83831482A4E7B3E00F +:102D800012968C911297836012968C936081718158 +:102D9000828193810C94D8140E94E72E40E060E079 +:102DA00080E00C94EB0E69EE7EEF90E080E00E94F4 +:102DB000393360E082E090E00E941B3360E083E002 +:102DC00090E00E941B331092A80260E084E090E043 +:102DD0000E941B3360E082E290E00E941B3360E0BF +:102DE00085E090E00E941B3360E086E090E00E9466 +:102DF0001B336FEF87E090E00E941B3340E050E010 +:102E0000BA0188E090E00E942D3360E08DE090E010 +:102E10000E941B3340E050E0BA0188E190E00E943C +:102E20002D3360E087E190E00E941B3340E050E0EA +:102E3000BA018CE190E00E942D3370E060E080E206 +:102E400090E00E94393340E050E0BA0188E190E020 +:102E50000E942D3380E00E94810F0E94990F40E074 +:102E600050E0BA018FE090E00E942D3340E050E046 +:102E7000BA0183E190E00C942D330F931F93CF930D +:102E8000DF9300D000D0CDB7DEB74091D80250918B +:102E9000D9026091DA027091DB022FB7F894809129 +:102EA0008B0390918C03A0918D03B0918E032FBF63 +:102EB000841B950BA60BB70B84369105A105B105B4 +:102EC00088F10E94A30E882379F10E9438086E5F72 +:102ED0007F4F8F4F9F4F69837A838B839C83809131 +:102EE0002D0190912E018D539D4F40912C0150E06A +:102EF0004530510510F044E050E0BE016F5F7F4F58 +:102F00000E94FE3284E090E00E94F331892BD9F4D4 +:102F10000E9438086093D8027093D9028093DA0235 +:102F20009093DB0281E010C00E9438080091E50216 +:102F30001091E6022091E7023091E802600F711FC4 +:102F4000821F931FC4CF80E00F900F900F900F90BF +:102F5000DF91CF911F910F9108958F929F92AF9221 +:102F6000BF92CF92DF92EF92FF920F931F93CF9376 +:102F7000DF93EB0188809980AA80BB809FB7F8948B +:102F8000C0908B03D0908C03E0908D03F0908E0363 +:102F90009FBFC818D908EA08FB0894E6C916D104EF +:102FA000E104F10410F4442311F1E82E082E000C82 +:102FB000FF089AE08902F0011124EE5FFE4F838141 +:102FC00094818D539D4F428150E00417150708F4FA +:102FD000A801B9010E94FE32C7010E94F331892B7A +:102FE000A1F40E943808688379838A839B8381E0F7 +:102FF000DF91CF911F910F91FF90EF90DF90CF90D5 +:10300000BF90AF909F908F90089580E0F1CF0F9385 +:103010001F93CF93DF930F92CDB7DEB780918203DA +:1030200089832091D70290E041E02817190609F41E +:1030300040E001E010E09E012F5F3F4F60EE72E044 +:1030400086E00E94AD170F90DF91CF911F910F91F5 +:1030500008950F931F93CF93DF93CDB7DEB72897D3 +:103060000FB6F894DEBF0FBECDBF85E0E6E7F4E013 +:10307000DE01119601900D928A95E1F7809174031B +:1030800090917503A09176038E839F83A88741E07A +:103090008885811101C040E008E010E09E012F5FAB +:1030A0003F4F6CED72E085E00E94AD1781111092E8 +:1030B000760328960FB6F894DEBF0FBECDBFDF9122 +:1030C000CF911F910F9108956F927F928F929F924F +:1030D000AF92BF92CF92DF92EF92FF920F931F9326 +:1030E000CF93DF930F92CDB7DEB7862E5A016901D9 +:1030F000682E880F7708C3010E94F331892B09F0ED +:1031000088C08AE0869DF001879DF00D1124EE5F56 +:10311000FE4F458150E04115510511F041E050E06E +:103120008AE0869DF001879DF00D1124EE5FFE4F31 +:10313000668177816D537D4FCE0101960E94FE32EC +:10314000F50140815181628173812FB7F89480919C +:103150008B0390918C03A0918D03B0918E032FBFB0 +:10316000841B950BA60BB70B84369105A105B10501 +:1031700040F4B701C8010E9487089981891709F4B2 +:103180004FC0082C000C9908C4010E94F331892B10 +:1031900091F0B12C8B2D0F90DF91CF911F910F915A +:1031A000FF90EF90DF90CF90BF90AF909F908F9067 +:1031B0007F906F9008958AE0889DF001899DF00DC1 +:1031C0001124EE5FFE4F458150E0E416F50608F449 +:1031D000A7018AE0889DF001899DF00D1124EE5F22 +:1031E000FE4F668177816D537D4FC6010E94FE328E +:1031F000B701C8010E94870899818913CACF0E942C +:103200003808F5016083718382839383BB24B39470 +:10321000C1CFB12CA701B801C6010E94FE32BACFBE +:10322000BB24B394F7CFCF92DF92EF92FF920F932C +:103230001F93CF93DF9300D000D00F92CDB7DEB7AE +:103240006B0185E0E82EF12C04EC12E09E012F5F6B +:103250003F4F4BEB52E061E080E00E94641888230E +:1032600049F095E0FE013196A6EBB2E001900D9297 +:103270009A95E1F795E0E6EBF2E0D60101900D9228 +:103280009A95E1F70F900F900F900F900F90DF91AC +:10329000CF911F910F91FF90EF90DF90CF90089505 +:1032A00090E080E00E941533893E9E4F11F40C940B +:1032B0003D1080E008951F920F920FB60F921124D7 +:1032C0002F933F934F935F936F937F938F939F932E +:1032D000AF93BF93CF93DF93EF93FF93D091E90028 +:1032E000DF708091EC00C82FC17080FDC0E81092A3 +:1032F000E9008091F000877F8093F00078940E942D +:1033000034111092E9008091F00088608093F00001 +:10331000CD2BCF70C093E900FF91EF91DF91CF915A +:10332000BF91AF919F918F917F916F915F914F91DD +:103330003F912F910F900FBE0F901F9018951F92E5 +:103340000F920FB60F9211242F933F934F935F93D9 +:103350006F937F938F939F93AF93BF93EF93FF935D +:103360008091E10082FF09C08091E20082FF05C0E8 +:103370008091E1008B7F8093E1008091DA0080FFF3 +:1033800024C08091D80080FF20C08091DA008E7F19 +:103390008093DA008091D90080FF9DC080E189BDD3 +:1033A00082E189BD09B400FEFDCF81E080939F03D7 +:1033B00080919203811109C00E94AA060E9475079C +:1033C0008091E20084608093E2008091E10080FFC0 +:1033D00017C08091E20080FF13C08091E2008E7FD1 +:1033E0008093E2008091E20080618093E20080910E +:1033F000D80080628093D80019BC85E080939F0339 +:103400008091E10084FF2BC08091E20084FF27C0FF +:1034100080E189BD82E189BD89B5982F917080FFD7 +:10342000FBCF8091D8008F7D8093D8008091E10000 +:103430008F7E8093E1008091E2008F7E8093E20096 +:103440008091E20081608093E2008091A003882354 +:1034500009F447C084E080939F0380919F0380918B +:10346000E10083FF27C08091E20083FF23C08091A9 +:10347000E100877F8093E10082E080939F031092B8 +:10348000A0038091E1008E7F8093E1008091E200B3 +:103490008E7F8093E2008091E20080618093E20061 +:1034A00042E060E080E00E9443078091F000886085 +:1034B0008093F000FF91EF91BF91AF919F918F9119 +:1034C0007F916F915F914F913F912F910F900FBE20 +:1034D0000F901F90189519BC10929F0310929203A1 +:1034E00074CF8091E30087FD93E090939F03B5CF65 +:1034F00078941F921FB61F9211248F939F93AF93BE +:10350000BF9380918B0390918C03A0918D03B09118 +:103510008E030196A11DB11D80938B0390938C03A4 +:10352000A0938D03B0938E03BF91AF919F918F9124 +:103530001F901FBE1F9018959C014FB7F894809163 +:103540008B0390918C03A0918D03B0918E034FBF9C +:10355000821B930B08952FB7F89480918B03909161 +:103560008C03A0918D03B0918E032FBF0895AF926D +:10357000BF92DF92EF92FF920F931F93CF93DF934F +:10358000CDB7DEB761970FB6F894DEBF0FBECDBFE3 +:103590004C87888B998BE52ED62EF72E5E0127E07F +:1035A000A20EB11C85E0F50111928A95E9F7809190 +:1035B00073038A3008F095C0809171039091720373 +:1035C0000E949C1A089708F48CC004E610E025E0DD +:1035D00030E0A50164E084E10E943230892B09F0DB +:1035E000DBC0109273038B8587FDD1C0E894E0F8AF +:1035F00080916F0390917003009709F0C2C08F8192 +:103600009885891708F091C0981B892F41E0209177 +:103610005F0130916001889FC001112455E0589FDF +:10362000F001599FF00D1124E29FB001E39F700D4E +:10363000F29F700D1124660F672F661F770B71952F +:10364000442319F071956195710980916D039091F2 +:103650006E03680F791F89859A85891708F068C0FD +:10366000981B892F41E0889FC001112455E0589F85 +:10367000F001599FF00D1124E29FC001E39F900DCE +:10368000F29F900D1124880F892F881F990B919517 +:10369000442319F091958195910920916B03309104 +:1036A0006C03820F931F603871050CF444C06F5790 +:1036B000710970936E0360936D033FE7D32E8038DA +:1036C00091050CF44BC08F57910990936C03809334 +:1036D0006B039FE7F92E0E94AB1A909372038093BD +:1036E0007103ED86DE86FF8686E0FE013C96DE01F4 +:1036F000119601900D928A95E1F729813A814B81CB +:103700005C816D817E8180E090E061960FB6F894D7 +:10371000DEBF0FBECDBFDF91CF911F910F91FF9004 +:10372000EF90DF90BF90AF900895891B40E06FCF7E +:10373000891B40E098CF6138FFEF7F074CF4615858 +:103740007F4F70936E0360936D0321E8D22EB7CF45 +:10375000D62E10926E0310926D03B1CF81382FEFE9 +:1037600092074CF481589F4F90936C0380936B03A6 +:1037700081E8F82EB0CFF82E10926C0310926B03F4 +:10378000AACF01979093700380936F03A4CF68949E +:10379000E0F884E190E0F6CF809173038F5F80932F +:1037A000730399CF5F926F927F928F929F92AF92A5 +:1037B000BF92CF92DF92EF92FF920F931F93CF931E +:1037C000DF9300D000D00F92CDB7DEB76C01FC01C3 +:1037D00083819481892B31F08081918189238F3F6E +:1037E00009F080C60F900F900F900F900F90DF910F +:1037F000CF911F910F91FF90EF90DF90CF90BF90EE +:10380000AF909F908F907F906F905F9008950E94EF +:10381000DB0F182F682F89819A810E945F0B6981C5 +:103820007A81812F0E94CE0F8C01F601828188233C +:1038300009F44CC6C80182519F45409708F0BEC5A7 +:103840008FEF93E00E940733025197E4A92E93E093 +:10385000B92E8111C7CF01113AC01C821B82662488 +:1038600063948AE0582E85010F5F1F4FC5010E94A7 +:10387000073389831A82882309F4B4CF9FEF980F06 +:103880009330A0F58A83698232E0A30EB11CC8018F +:103890000E9407338B83882309F4A4CF8E010F5F26 +:1038A0001F4FF80120812223F1F2213009F058C086 +:1038B000918182819130E1F40E5F1F4F6AE070E0E8 +:1038C000893311F460E570E00E94D60E17C0A11490 +:1038D000F4E0BF0609F486CFC5010E9407338111C9 +:1038E00001C001502FEFA21AB20AB5CF5801D6CFAE +:1038F000923039F40E5F1F4F0E94EC0B0F5F1F4F89 +:10390000D0CF933029F40E5F1F4F0E94B30BF6CF38 +:10391000943019F00F5F1F4FF1CF0E5F1F4F30E053 +:1039200020E0B8016F5F7F4FF80141818053990B10 +:103930008A30910550F02150310900F38FE99FE062 +:103940000197F1F700C00000F6CF529EF001539EA0 +:10395000F00D11249C012E0F3F1F842F8B01E1CF0E +:10396000E22FF0E0E754FE4F7490822F8695869503 +:10397000869590E0FC01E755FE4FE4902770F12C0E +:10398000022E02C0F594E7940A94E2F7E1E0EE22F9 +:10399000FF24FC01E756FE4FC490D12C022E02C03A +:1039A000D594C7940A94E2F7F1E0CF22DD24FC011C +:1039B000E757FE4F8490912C02C0959487942A95E6 +:1039C000E2F721E082229924E114F10419F081EE5A +:1039D0000E94EC0BC114D10419F086EE0E94EC0B8E +:1039E00039E36AE070E0731202C060E570E0872D91 +:1039F0000E94D60ECD2819F086EE0E94B30BEF2858 +:103A000019F081EE0E94B30B892809F477CF6AE0A0 +:103A100070E08CE259CF81E00E94F81503C081E08C +:103A20000E94EC150F900F900F900F900F90DF9168 +:103A3000CF911F910F91FF90EF90DF90CF90BF90AB +:103A4000AF909F908F907F906F905F900C94E11556 +:103A500082E0E2CF043F110509F409C108F00BC16F +:103A6000053E110509F0D3C480934E0210934D0218 +:103A700000934C02CCC40438FFE51F0709F46EC064 +:103A8000C0F402383FE5130709F44FC003384FE58F +:103A9000140709F0BCC4882309F4B9C481EE0E945C +:103AA000EC0B83EE0E94EC0B80E50E94EC0B80E5B2 +:103AB00049C006385FE5150709F4C0C008F4A7C07F +:103AC0000738EFE51E0709F0A2C4882309F48ACE5F +:103AD00087E20E94EC0BFFEF28EA31E0F150204032 +:103AE0003040E1F700C000008CE20E94EC0B87E25E +:103AF0000E94B30B8BE10E94EC0B4FEF50EE80E085 +:103B0000415050408040E1F700C000008CE20E942C +:103B1000B30B8BE10E94B30B40E56FEF84EB0E9487 +:103B20009D1581E080934A025DCE882309F46FC41D +:103B300081EE0E94EC0B83EE0E94EC0B8FE40E945E +:103B4000EC0B8FE40E94B30B83EE0E94B30B81EE6B +:103B50000E94B30B5CC480934B0288CF882379F119 +:103B600080914B02882349F080914C020E94B30B54 +:103B700080EE0E94EC0B8AE20CC080914E028823FA +:103B8000D1F380914C020E94B30B80EE0E94EC0BAB +:103B90008CE40F900F900F900F900F90DF91CF91CA +:103BA0001F910F91FF90EF90DF90CF90BF90AF905B +:103BB0009F908F907F906F905F900C94EC0B8AE2B7 +:103BC0000E94B30B8CE40E94B30B80EE0E94B30BF7 +:103BD00080914B02811105C080914E02882309F427 +:103BE00001CE80914C02D5CF882309F410C4809176 +:103BF0004A02882309F40BC40E94AB1A9093AF02C7 +:103C00008093AE0210924A021092010100C48823F0 +:103C100071F180915E01811104C0809100018823BF +:103C200039F010925E01109200010E940B0FEFC359 +:103C300081E080935E0180930001F7CF8823B9F083 +:103C400080914902882349F080EE90E090936001D2 +:103C500080935F0110924902E8CF86E690E090934E +:103C6000600180935F0181E080934902DECF61E0D3 +:103C70000E94710CCCC362E0FBCF64E0F9CF013647 +:103C80003DE5130709F4D8C30E3D1C4509F012C1E8 +:103C90000F900F900F900F900F90DF91CF911F9189 +:103CA0000F91FF90EF90DF90CF90BF90AF909F90DB +:103CB0008F907F906F905F900C94D3168091E90263 +:103CC000806106304CE5140709F491C08091E90247 +:103CD000886007301C4508F48AC08091E902806240 +:103CE00086C00C308CE5180709F49CC070F48091F4 +:103CF000E9028C600A30ECE51E0709F478C008F48C +:103D00008BC08091E9028E7F72C08091E902877F2B +:103D10000E302CE5120709F46AC08091E9028B7F0E +:103D20000F301C4508F463C08091E9028F7E5FC0AC +:103D30000C3F4CE5140709F479C068F504318CE5B3 +:103D4000180709F48BC080F40231ECE51E0709F472 +:103D500075C08091E9028F7B03311C4508F447C090 +:103D60008091E902837F43C00A3F2CE5120709F4E2 +:103D700045C008F049C005311C4509F084C3809155 +:103D8000E90282FB992790F921E0922790FB82F9C2 +:103D900090FB83F92CC001155DE5150709F454C0AB +:103DA00088F48091EA0283600E3F9CE5190749F18F +:103DB0008091EA028D7F0F3F1C4518F18091EA0245 +:103DC0008C7F1FC00230FDE51F0709F456C008F4C0 +:103DD0004EC001361D4509F056C39091E902892F66 +:103DE0008F7E94FF806103C08091E902816080939F +:103DF000E90249C38091E9028460F9CF8091EA0227 +:103E000081608093EA023FC38091EA028260F9CF29 +:103E10008091E9028064EBCF0E9429118091E90230 +:103E20008068E5CF8091E9028D7FE1CF8091EA0241 +:103E30008E7FE7CF8091E9028F7DD9CF0E94291133 +:103E40008091E9028F77D3CF8091EA02982F9095E5 +:103E500091708E7F892B90FB81F9D3CF0E9429111D +:103E60009091E902892F97FB87F98058C0CF61E0D4 +:103E70008EE090E00E941B3306C360E0F9CF809192 +:103E8000A70282720A3C4CE5140709F4F7C008F057 +:103E900063C0053CECE51E0709F4DCC0A0F5033C5B +:103EA0002CE5120709F4CCC008F0CFC0023C1C4539 +:103EB00009F476C0F60100811181992309F4FEC04E +:103EC000C8010E94DB0FF82E682FC8010E945F0B0B +:103ED000B8018F2D0E94CE0F0E94AC09182FB82E6A +:103EE000F60122814581342F32953F70892F8295CA +:103EF0008F70E82EF12C8C3008F018C1F701E656CF +:103F0000FB4C0C94DB32073C5CE5150709F4ACC0B4 +:103F100008F4A5C0083CFCE51F0709F4AAC043E06B +:103F200056E16FE076E1093C1C4521F60F900F90B9 +:103F30000F900F900F90DF91CF911F910F91FF90F5 +:103F4000EF90DF90CF90BF90AF909F908F907F9039 +:103F50006F905F900C949D08043D3CE51307A0F41E +:103F60000E3C4CE5140708F03DCC0C3C5CE5150715 +:103F700009F489C045E456E166E576E10D3C1C454F +:103F8000A8F261E081E046C0053DECE51E0709F4BA +:103F900029CC08F47DC00D351D4509F423CC8ACF0A +:103FA0008091760480FF31C08E7F8093760460918B +:103FB00076047091770480917804909179040E943E +:103FC000D814809176038160809376033FEF40E7B9 +:103FD00052E0315040405040E1F700C000000F90E7 +:103FE0000F900F900F900F90DF91CF911F910F9135 +:103FF000FF90EF90DF90CF90BF90AF909F908F9009 +:104000007F906F905F900C94A30D816080937604F5 +:1040100061E086950F900F900F900F900F90DF91B9 +:10402000CF911F910F91FF90EF90DF90CF90BF90B5 +:10403000AF909F908F907F906F905F900C946716D9 +:1040400042E956E16BE976E171CF4BE956E162E96D +:1040500076E16CCF43E356E16CE376E167CF4CE366 +:1040600056E163E376E162CF4BE156E167E276E148 +:104070005DCF47E256E16BE176E158CF4FE056E184 +:1040800063E076E153CF46E556E165E476E14ECF55 +:104090000F900F900F900F900F90DF91CF911F9185 +:1040A0000F91FF90EF90DF90CF90BF90AF909F90D7 +:1040B0008F907F906F905F900C94A516C8010E941E +:1040C000370BF82E05CF092F0F70907F11F0029556 +:1040D000007F812F2223C9F0002369F090E2910F25 +:1040E000983010F011110BC08091A702082B00939B +:1040F000A7020E94160B812F0E94EC0B17C0809123 +:10410000A602082B0093A602F4CF0E94B30B002353 +:1041100069F00095105E183010F0B11027C0809142 +:10412000A70208230093A7020E94160B98E0E91A41 +:10413000F108E4E0EE16F10408F054CB0E94C60E3C +:104140000F900F900F900F900F90DF91CF911F91D4 +:104150000F91FF90EF90DF90CF90BF90AF909F9026 +:104160008F907F906F905F900C94260E8091A602A6 +:1041700008230093A602D8CF892F8F70907F9032AA +:1041800011F08295807FF1E0BF120CC0222329F04C +:10419000333060F60E94A90BC9CF323038F60E9446 +:1041A0009E0BC4CF222341F03323A1F340FFA3CFC2 +:1041B0004F70F6014583EECF332389F3193309F0AD +:1041C000F5C0FFEF27EE33E0F15020403040E1F73B +:1041D00000C00000812F0E94B30BA8CF892F8695C5 +:1041E0008695837061F0813009F0A0CF812F9370A4 +:1041F000211102C090E080E00E94440897CF812FF7 +:104200009370211102C090E080E00E945A088ECF86 +:10421000892F8370A1F5211189CF812F82958695F1 +:104220008770880F880F412F4F70082E01C0440FF0 +:104230000A94EAF7212F207114FF07C02FE030E025 +:1042400001C0220F8A95EAF720959695969593706E +:10425000923081F0822F842B933030F48091A80229 +:10426000913029F0242B82230E949A0B5FCF842B5C +:10427000822BFACF242B8091A8028227F5CF869536 +:10428000222311F0892F8170882309F44FCF812FC9 +:10429000829586958770880F880F412F4F70082E62 +:1042A00001C0440F0A94EAF7212F207114FF07C0C0 +:1042B0002FE030E001C0220F8A95EAF7209596950D +:1042C00096959370923081F0822F842B933030F446 +:1042D0008091A903913029F0242B82230E94DB15C1 +:1042E00025CF842B822BFACF242B8091A903822700 +:1042F000F5CF092F0F70222329F0802F0E94F81587 +:10430000812F48CF812F0E949E0B802F0E94EC1599 +:104310000DCF812FE1EF1E1789F1E11750F0F0EF7B +:104320001F17B9F02223B1F13111E5CE892F8F711A +:1043300029C042EF141749F153EF1513F3CF80E072 +:10434000222361F29F7181E001C0880F9A95EAF7FC +:10435000C5CF222379F0323008F0E8CE292F2F7113 +:1043600081E090E001C0880F2A95EAF79091A903B7 +:104370008927B4CF333008F0D9CEF0CF892F8F7191 +:10438000222321F20E94F815D1CE892F8F7122238A +:10439000C9F3BCCF332379F0893341F48FEF97EE23 +:1043A000E3E081509040E040E1F712CF8FE39CE9D9 +:1043B0000197F1F70DCF892F8F71A8CF0031FFE55D +:1043C0001F0709F428CB01312FE5120709F440CB70 +:1043D0000E943808609300037093010380930203E6 +:1043E00090930303F6018281063F110509F445CC41 +:1043F00008F041CB013E110509F4ADCB08F02ACB02 +:1044000098012E5131092330310508F4EDCBF60126 +:104410009281992309F433CD0330FDE51F0708F09D +:104420002ECC0A3F2CE5120738F4980122503C4567 +:104430002431310508F028CC0E9456109093EA02EE +:104440008093E90200314CE5140709F4F3CC08F03D +:104450006FCC08308CE5180709F4DACC08F041CCB1 +:104460000430ECE51E0709F4C5CC08F027CC023077 +:104470002CE5120709F4B8CC8091E9028260033080 +:104480001C4509F4B4CC6091E9021091EA0284E081 +:1044900090E00E941B33612F82E290E00E941B3368 +:1044A0000F900F900F900F900F90DF91CF911F9171 +:1044B0000F91FF90EF90DF90CF90BF90AF909F90C3 +:1044C0008F907F906F905F900C94291100313FE5A1 +:1044D000130709F4A4CA01314FE5140709F082CF8C +:1044E00082E09ECA85E0DE01119601900D928A95C8 +:1044F000E1F7F601228189819A81211188C90E9400 +:10450000370B182F8CC91F93CF93DF9380917202C2 +:10451000807FA9F480916F02882389F08091A402A2 +:10452000D091730260916D0270916E02A091700241 +:10453000B0917102C62FC72316E0D81304C0DF91D3 +:10454000CF911F91089590E0109711F0CF3F19F48B +:1045500001968770F2CF189F9001199F300D11249A +:10456000F901EC58FD4F41814713F2CF40814613CA +:10457000EFCF42814111ECCF438154814A1B5B0B49 +:10458000403A510528F7809172028F7080618093C4 +:104590007202F901E758FD4F80818F70806180833E +:1045A0008DE692E00E94D21BDF91CF911F910C9477 +:1045B0002D0BAF92BF92CF92DF92EF92FF920F93AB +:1045C0001F93CF93DF93CDB7DEB761970FB6F89403 +:1045D000DEBF0FBECDBF8C0185E0F801DE011D9668 +:1045E00001900D928A95E1F7F801E2808DE6A82E00 +:1045F00082E0B82E609170027091710261157105B0 +:1046000009F432C190916D0240916E02892F84238A +:104610008F3F09F429C120813181C380D480F0907B +:104620006F02F601E61BF70BFF2009F4E8C080914A +:104630007202582F507FE03AF10508F0ABC05111DB +:1046400077C0FE2C431321C092131FC0E1101DC080 +:104650008F70806180937202C5010E94D21B80918D +:104660007202F80185838F2D61960FB6F894DEBF34 +:104670000FBECDBFDF91CF911F910F91FF90EF90B3 +:10468000DF90CF90BF90AF900895CD2829F0822F72 +:1046900083238F3F09F003C180E0F82FF170DF2EF4 +:1046A00080FF3CC08091A4024091730256E08413C5 +:1046B00015C02D873E878D859E850E940A10292F63 +:1046C00022952F702230F0F0243018F59F70F1F011 +:1046D000F8019581907FD1F4D12C1EC090E0589FB5 +:1046E000F001599FF00D1124EC58FD4F61813613F4 +:1046F00006C06081261303C06281E6120FC00196D6 +:104700008770D5CF9F7011F0882331F3805E883099 +:1047100018F3C8010E94D21BFD2CA5CFEE2009F48E +:10472000A2CF80917202816080937202F12C9BCFA4 +:10473000431306C0921304C0F801EE2009F479C0B7 +:10474000C8010E941610882309F1EE20F9F080912B +:104750007202803270F020916D0230916E023887C3 +:104760002F831986DB86CA868C87CE0107960E9426 +:10477000D21B86E0F801ADE6B2E001900D928A9579 +:10478000E1F70E948322FF24F3946DCFC8010E94B9 +:10479000D21BF9CF51110AC08DE692E00E94D21BC4 +:1047A00086E0F50111928A95E9F7C0CF43130FC057 +:1047B00092130DC0E1100BC0F8018583C8010E945F +:1047C000D21B86E0F50111928A95E9F74CCFC8011A +:1047D0000E9416108823D1F2EE20C1F2809172025D +:1047E000803238F220916D0230916E023A83298333 +:1047F0001B82DD82CC828E83CE010196B8CFE03A57 +:10480000F105F8F6FE2CEE2009F243131FC09213B7 +:104810001DC08091720280FD10C0982F907F69F0BA +:10482000F8018583903F31F0982F907F905F8F70D3 +:10483000892B8583C8010E94D21B86E0F801ADE672 +:10484000B2E001900D928A95E1F70DCFC8010E9468 +:10485000161081118ECF8091720281608093720256 +:10486000C8010E94D21BFFCEEE2009F48FCFC801F1 +:104870000E941610F82E882309F488CF86E0F801EC +:10488000ADE6B2E001900D928A95E1F780916D025C +:1048900090916E020E940A100E948322E4CE81E071 +:1048A0008E25FBCE1F93CF93DF93CDB7DEB76797EF +:1048B0000FB6F894DEBF0FBECDBF4B8B5C8B6D8BFC +:1048C0007E8B8F8B61111092A6021A8A198A85E05D +:1048D000FE017396DE011D9601900D928A95E1F717 +:1048E00086E0FE013D96DE01179601900D928A95B5 +:1048F000E1F7CE0107960E94D922882389F016E0BD +:104900008091A40290917302891349C067960FB6F3 +:10491000F894DEBF0FBECDBFDF91CF911F910895F8 +:1049200086E0FE013796DE01119601900D928A9580 +:10493000E1F78A859B85892B11F38F8198858923DF +:104940008F3FE9F22091730230E0C9010196877030 +:1049500099274091A4024817190671F40E94291161 +:10496000109273021092A40286E0EDE6F2E0DF01FD +:104970001D928A95E9F7C3CF96E0929FD001939F4D +:10498000B00D1124AC58BD4FFE01319601900D922F +:104990009A95E1F7809373020E942D0BB0CF819F0F +:1049A000C00111248C589D4F0E94D922882309F4FC +:1049B000ADCF8091A40290E00196877099278093F3 +:1049C000A4029ECFEF92FF920F931F93CF93DF939A +:1049D00000D000D00F92CDB7DEB7162FE82EF12C05 +:1049E000C701880F991F662339F188549E4FFC0137 +:1049F000808191819A83898301E00B830E94AB1AA5 +:104A00008160782F9D838C83F701E95BFD4F01273F +:104A1000110F102B108349815A816B818D810F906A +:104A20000F900F900F900F90DF91CF911F910F91EA +:104A3000FF90EF900C9452248C549E4FD8CFCF927D +:104A4000DF92EF92FF920F931F93CF93DF930F921A +:104A5000CDB7DEB7EE24E394F12C0AEC12E09E0110 +:104A60002F5F3F4F4FEB52E063E082E00E946418FB +:104A7000082F882321F1C090F8028C2D90E09C0132 +:104A800025503D4F79011981F9018081181BD12EE4 +:104A900080E00AC0DA94F70180818F5F808360E054 +:104AA0008C2D0E94E224802F1D14A4F3912F17FD5A +:104AB00090E0191B11110EC081110E94140B802F60 +:104AC0000F90DF91CF911F910F91FF90EF90DF90AA +:104AD000CF9008951F5FF70180818150808361E04E +:104AE0008C2D0E94E224802FE5CFEF92FF920F934E +:104AF0001F93CF93DF9300D000D00F92CDB7DEB7D6 +:104B000087E4E82E82E0F82E10E000E0F7018191C2 +:104B10007F018823C9F08695F80139F1E854FE4FEA +:104B2000808191819A8389831B820E94AB1A816064 +:104B3000782F9D838C83F7013197108249815A81A8 +:104B40006B818D810E9452240E5F1F4F043011052E +:104B5000E9F60F900F900F900F900F90DF91CF918B +:104B60001F910F91FF90EF900895EC54FE4FD8CF16 +:104B70009F92AF92BF92CF92DF92EF92FF920F93EC +:104B80001F93CF93DF93CDB7DEB72F970FB6F8946F +:104B9000DEBF0FBECDBF8E010F5F1F4F8AE0D80171 +:104BA0001D928A95E9F78FEEC82E81E0D82EF12C60 +:104BB000E12CAA24A394B12CF60181916F018F3FBF +:104BC00009F444C0F894E82FE295EF70F0E021A1D9 +:104BD0008F70A50102C0440F551F8A95E2F7CA01E4 +:104BE000922F982B91A392A18095892382A30E9452 +:104BF000500900C0E9EFF1E0912C31E021912F3F05 +:104C000009F479C0A22FA295AF70B0E090968C9174 +:104C100090E02F7002C0959587952A95E2F780FD68 +:104C20006AC0832F982A330F52E0E130F50731F73D +:104C3000F601319780818F3F11F00E94520980EA7E +:104C40008A95F1F7F801EE0DFF1D90829FEFE91AAA +:104C5000F90AA5E0EA16F10409F0AECF4AE050E007 +:104C6000B8018BEE92E00E94F1327C01892B41F079 +:104C70008AE0F801ABEEB2E001900D928A95E1F77F +:104C80001091F602E114F104C1F181E08093AB02CE +:104C90000E94AB1A9093AA028093A9028091A90264 +:104CA0009091AA020E949C1A069778F0ABEEB2E0AF +:104CB000E12FF0E0EB5AFC4F80EF92E02D91219331 +:104CC0008A179B07D9F71092AB0281E090E0EF289A +:104CD000C1F02F960FB6F894DEBF0FBECDBFDF91A7 +:104CE000CF911F910F91FF90EF90DF90CF90BF90E9 +:104CF000AF909F90089580E095CF8091AB02811195 +:104D0000CDCF0E94A30ED82EE091F602AE01455FF2 +:104D10005F4F7A01882309F4BEC085E0DA011D9255 +:104D20008A95E9F70E2F10E00B5A1C4F8091E40290 +:104D30008A3008F07CC043E159E1B701C8010E9404 +:104D40005F0E882309F496C04FE155E2B701C80110 +:104D50000E945F0E882309F48DC04DE357E1B7012F +:104D6000C8010E945F0E882309F484C049E258E11B +:104D7000B701C8010E945F0E882309F47BC047E099 +:104D800058E1B701C8010E945F0E882309F472C080 +:104D90001092E4028091F50290E045E050E0B70106 +:104DA0008B5A9C4F0E94F13221E02093B402892B50 +:104DB00009F053C0D12C0E94752580910101811109 +:104DC00011C08091AE029091AF020E949C1A813A6C +:104DD0009F4040F040E56FEF8CEF0E949D1581E011 +:104DE000809301010E9475254091000350910103B9 +:104DF00060910203709103032FB7F89480918B03A5 +:104E000090918C03A0918D03B0918E032FBF841BD2 +:104E1000950BA60BB70B81369A4EA105B10528F06C +:104E200040E060E080E00E94EB0E8D2D52CF80913B +:104E3000AC029091AD020E949C1A843F914008F010 +:104E40007ACF8091B402882309F4B4CF85E0F701CA +:104E500011928A95E9F71092B402A091F502B0E0A0 +:104E6000AB5ABC4F85E0FE013B9601900D928A95AE +:104E7000E1F7A1CF8091E4028F3F31F08F5F809303 +:104E8000E4028A3008F486CF0E94AB1A9093AD02F8 +:104E90008093AC02D6CFF0E0EB5AFC4FF89485E05B +:104EA000A4ECB2E001900D928A95E1F765E070E024 +:104EB00084EC92E00E9487088093C3020E9450090C +:104EC000F894E091FE02F0E0E550FD4F80818B8781 +:104ED0008093CA0261E070E0C7010E948708809356 +:104EE000C9020E945009F894C090CB02D090CC0225 +:104EF000E090CD02F090CE028091B0029091B1028C +:104F0000A091B202B091B302C816D906EA06FB0618 +:104F1000D1F0C092B002D092B102E092B202F0920F +:104F2000B3020E94A30E81110EC00E943808C61A57 +:104F3000D70AE80AF90AC092E502D092E602E092A6 +:104F4000E702F092E8020E945009F8948091D6029C +:104F50008823F1F080FF0DC08091CF0280FF25C033 +:104F60009091760491609093760460E086950E941B +:104F700067168091D60281FF09C020E04091D202DD +:104F80006091D1028091D0020E94EA141092D60260 +:104F90000E945009F8948091D702882349F00E941A +:104FA000FB0C0E94500980E094CE0E944A0EE1CF93 +:104FB0000E94E00CF6CF1F921FB61F9211248F9310 +:104FC0009F93AF93BF9380918A03811113C0809107 +:104FD0008B0390918C03A0918D03B0918E03419629 +:104FE000A11DB11D80938B0390938C03A0938D031F +:104FF000B0938E03BF91AF919F918F911F901FBE71 +:105000001F901895CDB7DEB7AE970FB6F894DEBFF8 +:105010000FBECDBF84B7877F84BF0FB6F894A89525 +:1050200080916000886180936000109260000FBEE4 +:1050300080E890E00FB6F89480936100909361004F +:105040000FBE85B7806885BF85B7806885BF8EE451 +:1050500099E090933D0280933C020E94AA060E9430 +:1050600075078091E20084608093E20078948091DB +:105070009F038823A1F01091E9001F709091EC002C +:10508000892F817090FD80E8182B1092E9008091A3 +:10509000E80083FD0E9434111F701093E90082E044 +:1050A00084BD93E095BD9AEF97BD80936E001092FA +:1050B000E5021092E6021092E7021092E8020E94C6 +:1050C0003D10811102C00E94990F0E94A30E80938F +:1050D000480180914801882309F47CC01092610145 +:1050E00082E2809362010E94A30E81110E94E63049 +:1050F000809148018091480195E0811190E0909362 +:10510000F60285E0891B8093F5020FEE11E094EF23 +:10511000E92E91E0F92ED8018D918D018F3F11F08C +:105120000E945209E016F106B1F709EF11E081E0A3 +:10513000E82E82E0F82EF80181918F018F3F11F067 +:105140000E945209E016F106B1F78AE0E5E5F3E0C6 +:10515000DF01282F1D922A95E9F7EBEEF2E0DF013F +:105160001D928A95E9F70E945019811102C00E9490 +:10517000D31682E090E00E94073380934A030E9496 +:1051800056109093EA028093E9020E94B825EFE757 +:10519000FBEB3197F1F700C000000E94B825809129 +:1051A000550380FF1BC06FEF7FEF90E080E00E940F +:1051B000393387E797E7909301088093000888E1E7 +:1051C0009AE00FB6F894A895809360000FBE909374 +:1051D0006000FFCF82E28093610183CF83E090E0A3 +:1051E0000E9407330E949A0B8091A9030E94A01588 +:1051F0000E94A30E811102C00E94E9300E94A30EFA +:1052000081111EC283E08093450380E4809377037D +:105210000E94E72E6DE070E08CE492E00E94B00CFA +:10522000892BE9F58091450363E070E081FD0AC2B6 +:1052300089E492E00E94B00C892B89F56DE070E062 +:1052400089E392E00E94B00C892B49F50E9438084E +:105250006058774C8E4F9F4F60937E0370937F030F +:105260008093800390938103EDE7F4E080E094E085 +:10527000DF019C011D9221503040E1F7F0937E0840 +:10528000E0937D088FEF9FEF90937C0480937B04E5 +:1052900081E0809383038093820310924603809180 +:1052A000F702811136C00E945019811104C00E947A +:1052B000D3160E94B41688E090E00E940F336093EA +:1052C00076047093770480937804909379048091A6 +:1052D00076038360809376036E7F71F40E94B41628 +:1052E00088E090E00E940F33609376047093770417 +:1052F00080937804909379040E94A20880917604A8 +:1053000080FF04C060E086950E94671681E080936C +:10531000F70280914801811106C084E9809356010B +:1053200082E98093550120915601A22FA295AF707A +:10533000B0E091963C9191972F7081E090E0BC0194 +:10534000022E01C0660F0A94EAF7462F40954323C8 +:1053500091964C93919792963C919297362B929678 +:105360003C93929740915501E42FE295EF70F0E065 +:1053700031A14F70042E01C0880F0A94EAF7982FCC +:105380009095932391A392A1892B82A390968C91BF +:1053900090E002C0959587952A95E2F7817020A14B +:1053A00030E002C0359527954A95E2F792E020FF5C +:1053B00090E0892B8093FF029091480181E098272B +:1053C0009093FE02891B8093F8020E94CC1660E045 +:1053D0008AE00E94671681E00E94DB1580EE90E073 +:1053E0009093600180935F010E940B0F89E491E02C +:1053F0009093870380938603A8E18A2E912CB0E4D2 +:10540000EB2E80919F03FF24F39400E112E185309D +:1054100009F465C10E94B825D82E81110E94380870 +:10542000F5E52F2EF3E03F2EEBE4F3E0D10110E0A1 +:1054300000E0A02ECD9081918C1509F472C18C25CD +:10544000B12CFF24F3949F2D982309F465C10E9489 +:10545000A30E882399F0B9A2AAA2CF2081E009F473 +:1054600080E08BA30E94AB1A8160782F9DA38CA350 +:1054700049A15AA16BA18DA10E945224F801E55BBC +:10548000FC4F8081F826F0828091FF02E82FEE0F1A +:10549000EE0F90915601A92FA295AF70B0E09096B3 +:1054A0002C9130E09F7002C0359527959A95E2F7D0 +:1054B0002170332790915501A92FA295AF70B0E0CC +:1054C00090964C9150E09F7002C0559547959A95E3 +:1054D000E2F7CA018170992740FF02C082E090E0A4 +:1054E000822B8E2B8093FF021091FE028F70E82F8B +:1054F000F0E0EF5FFD4F80819091FD02890F809376 +:10550000FD02F12C84306CF0E12FF0E0E550FD4F0E +:1055100080818F5F808360E0812F0E94E224FF24DE +:10552000F3948091FD028D3F6CF4E12FF0E0E550A3 +:10553000FD4F80818150808361E0812F0E94E224B1 +:10554000FF24F3948091FD02082E000C990B64E077 +:1055500070E00E94C7328093FD02F1100E94140B8C +:1055600080918303882351F18091470390914803F0 +:105570000E949C1AC29708F0EBC020917B043091E6 +:105580007C042115310509F09DC180918203882397 +:10559000A9F00E94380800917E0310917F032091AA +:1055A000800330918103601B710B820B930B6F3F63 +:1055B0007F4F8F4F9F4710F40E94E00CD11001C025 +:1055C000F1100E94FB0C0E9464100E94C60E909184 +:1055D0004903891731F00E94C60E809349030E9447 +:1055E000260E80919F03843009F00BCF83E08093D7 +:1055F000E9008091E80082FF04CF8091E80090E00C +:1056000085FF0CC00E94C90630E2C32ED12C8E014A +:105610000F5F1F4F882309F431C291E08091E800A9 +:105620008B778093E800992309F4EBCEE981E15070 +:10563000E33108F087C2F0E0EA55FB4C0C94DB3212 +:1056400081E0E1CD86E492E0F5CD80919F03843046 +:1056500009F435C080E00E94260E8091FA02811183 +:1056600009C0F092FA028091760481708093F90269 +:105670000E944A0E0E94E00C0E94641010928A035D +:105680000FB6F894A895809260000FBEE09260007B +:1056900083B7817F846083BF83B7816083BF789441 +:1056A000889583B78E7F83BF0FB6F894A8958091B5 +:1056B0006000886180936000109260000FBE80914E +:1056C0009E03882361F00E94B825E5E5F3E081910F +:1056D00081115EC38FE593E08E179F07C1F780911C +:1056E0009F03853009F4B1CF0E9429110E94C60E94 +:1056F0000E94260E1092FA028091F902882349F046 +:105700008091760481608093760460E086950E94A3 +:1057100067160E940B0F7ECEB394FF0C98E0B9126F +:1057200092CE0F5F1F4F0A30110509F082CE8FEF26 +:105730008EA38FA318A60E94AB1A8160782F9AA718 +:1057400089A74EA15FA168A58AA50E9452249CCE7C +:105750000E94AB1A909348038093470360E080E077 +:105760000E9470080E94C60E809304030E94A30E3C +:10577000882309F48EC04091000350910103609189 +:105780000203709103032FB7F89480918B039091DB +:105790008C03A0918D03B0918E032FBF841B950BBA +:1057A000A60BB70B81339547A105B10540F00E94C8 +:1057B000E00C80918303882309F4E7CEDECE0E94BB +:1057C000FB0C61E080E00E94700860E087E691E0F9 +:1057D0000E94BC1462E080E00E9470088091A903DE +:1057E0000E94600C823009F446C0E8F5882309F471 +:1057F00042C0813009F445C065E080E00E94700835 +:1058000060E08AE891E00E94BC1466E080E00E94BB +:105810007008609104036695617085E991E00E94CB +:10582000BC1467E080E00E947008609104036095FA +:1058300061708AE991E00E94BC1468E080E00E94F7 +:1058400070086091040362FB662760F98EE991E0BD +:105850000E94BC146BE080E00E94700889E592E031 +:105860000E946706A6CF833081F0843029F660E07D +:105870008EE791E003C060E082E791E00E94BC14F3 +:10588000BBCF60E088E791E0F9CF60E084E891E089 +:10589000F5CF63E080E00E94700860E083EA91E069 +:1058A0000E94BC1464E080E00E94700860E08BEA13 +:1058B00091E00E94BC1467E080E00E94700889EDCE +:1058C00093E0CECF8091460361E070E081115DCE20 +:1058D000082F10E02B01082E02C0440C551C0A941E +:1058E000E2F7A90144215521452B09F447C09091C5 +:1058F000450390FD45C08295880F880F8074809382 +:10590000590198013695279520935C01815C80931D +:105910005A0110925D0124E630E047E050E067E56F +:1059200071E088E70E94DE2F892B09F02ECEA801B6 +:1059300076E0440F551F7A95E1F78091450380FD8D +:105940002DC043585B4F04E610E020E430E060E4F3 +:1059500088E70E940530892B09F017CE0E94FB0CC6 +:10596000C2018095909540907B0450907C04482221 +:10597000592250927C0440927B0407CE8F5FA8CFBF +:10598000880F880F880F8093590110925C01895FFE +:1059900080935A0187E080935D01BDCFE5E0F3E09D +:1059A000DF012E2D1D922A95E9F789E192E09EA74D +:1059B0008DA701E112E0ADA5BEA56D91BEA7ADA773 +:1059C000F80181918F01840F952F911D9C0123581F +:1059D0003B4F3CA72BA7E62FF0E0EB5FFC4F30E0FE +:1059E00020E067E0662E621ACC24C394022E01C028 +:1059F000CC0C0A94EAF7ABA4BCA490E0D5018D913D +:105A00005D018C21662D691B6770762E062E000CB9 +:105A1000770BB82F01C0BB0F7A94EAF77B2E7195F4 +:105A2000619571096770772701C086956A95EAF7D5 +:105A3000782A8081782A70829F5F9830F9F62F5FEC +:105A40003F4F31962830310561F6E1E2F2E02DA5B5 +:105A50003EA5E217F30709F0AECF04E610E020E41C +:105A600030E045E053E073CF8091F100D8018D9391 +:105A70008D01B1E0CB1AD10809F4CFCD8091E800B7 +:105A800085FDF2CF8091E8008B778093E8000E943B +:105A9000C906882399F3C1CD1A8289E08B8311C08E +:105AA0008A81823009F48AC1833091F1813009F012 +:105AB00049C00E9438080E94E1326B837C838D8349 +:105AC0009E8380919F03843009F09BCC1091E90064 +:105AD0001F709091EC00892F817090FD80E8182B49 +:105AE00082E08093E9008091E80080FF0DC050E0E3 +:105AF00040E060E270E0CE0101960E94FA068091DB +:105B0000E8008E778093E8001F701093E90079CC4D +:105B1000FE013396D1018D911D018193BFE52B16B6 +:105B2000B3E03B06B9F7CDCF8A81823059F46B815F +:105B30007C818D819E810E94E13286E290E00E940C +:105B40001B33BFCF8FEF8983BCCF4C816B818A81A0 +:105B50000E94A80F9827892798279E838D83B1CF0D +:105B6000CD80DE80DC24CD24DC248A810B81E0E141 +:105B70000E9F80011124F0EA8F9F000D111D11244A +:105B80008C8190E0880F991F080F191F6D2DC80197 +:105B900087960E941B336C2DC8018896D0CF0E9437 +:105BA0002E0F8FCF8A818138B1F058F4803809F0F8 +:105BB00088CF4B8160917804809177040E949D1575 +:105BC00080CF8238E1F0833809F07BCF40917904AF +:105BD0006C818B81F3CF60E08B810E9467168B8193 +:105BE000811103C00E944A0E6CCF809176048160BF +:105BF0008093760460E086950E94671662CF8B8161 +:105C000080937A045ECF8A81813899F030F48038AD +:105C100009F057CF8091790441CF823891F08338D1 +:105C200009F04FCF809177048B83809178048C8327 +:105C300048CF8091760480FF02C086952FCF80E008 +:105C40002DCF80917A042ACF6091760470917704E9 +:105C500080917804909179040E94D81432CF80E129 +:105C60008A832FCF1A8289EB19CFAA80BB80BA24EE +:105C7000AB24BA248E010F5F1F4FCC80C00ED12EF3 +:105C8000D11CC501895B9C4F0C151D0509F419CF6A +:105C900029EBA216B10458F40E940733D8011496D8 +:105CA0008C93FFEFAF1ABF0A0F5F1F4FEACFF801C7 +:105CB0001482F7CF0A811B811027012710279E012C +:105CC0002F5F3F4F5901CC80C00ED12ED11CC8018F +:105CD000895B9C4FC016D10609F4F3CE093B110530 +:105CE00028F4D50114966C910E941B33BFEFAB1AB8 +:105CF000BB0A0F5F1F4FEBCF0E941E0FE2CE85E065 +:105D0000AFCFAA80BB80BA24AB24BA248E010F5F28 +:105D10001F4FCC80C00ED12ED11CC5018796C01656 +:105D2000D10609F4CECEE0E2AE16E3E0BE0658F4AA +:105D30000E940733D80114968C93FFEFAF1ABF0A65 +:105D40000F5F1F4FEACFF8011482F7CF0A811B8142 +:105D50001027012710279E012F5F3F4F5901CC804C +:105D6000C00ED12ED11CC8018796C016D10609F4E9 +:105D7000A8CE003233E0130728F4D50114966C91B5 +:105D80000E941B33BFEFAB1ABB0A0F5F1F4FEBCF55 +:105D900009BD19BD09B400FEFDCF8091D8008F7DEB +:105DA0008093D8008091E00082608093E000809131 +:105DB000E00081FDFCCF0E94291191CC86E290E0A9 +:105DC0000E9407331B821C821D828E837ACE109222 +:105DD000B9008CE08093B80008959F92AF92BF9273 +:105DE000CF92DF92EF92FF920F931F93CF93DF93A7 +:105DF000B82EEB010E94AB1A6C01EE24E394F12C57 +:105E0000C431D10560F025E0E22EF12CCF3FDC0754 +:105E100031F0CE0164E170E00E94A7327B0184EA98 +:105E2000A82E94E8992E1092BC00A092BC000E946B +:105E3000AB1A8C018091BC0087FF0DC08091B90026 +:105E4000887F883039F18091B900887F803111F1E5 +:105E50000FEF1FEF09C00E94AB1A801B910B8E152C +:105E60009F0540F30EEF1FEFCF3FDC07E1F2C601C5 +:105E70000E949C1A8C179D07B0F2C801DF91CF9148 +:105E80001F910F91FF90EF90DF90CF90BF90AF9058 +:105E90009F900895B092BB009092BC000E94AB1AF4 +:105EA0008C018091BC0087FF0AC08091B900887F77 +:105EB000883111F0803461F610E000E0DECF0E94FE +:105EC000AB1A801B910B8E159F0558F3CBCF0F9308 +:105ED0001F93CF93DF93EB018093BB0084E8809303 +:105EE000BC000E94AB1A8C018091BC0087FF11C0DE +:105EF0002091B900287F81E090E0283211F490E0F1 +:105F000080E0919581959109DF91CF911F910F913B +:105F10000895CF3FDC0741F30E94AB1A801B910B21 +:105F20008C179D0708F38EEF9FEFEECF0F931F9313 +:105F3000CF93DF93EC0184EC8093BC000E94AB1AFA +:105F40008C018091BC0087FF08C08091BB0090E06D +:105F5000DF91CF911F910F910895CF3FDC0789F317 +:105F60000E94AB1A801B910B8C179D0750F38EEF8C +:105F70009FEFEECF0F931F93CF93DF93EC0184E855 +:105F80008093BC000E94AB1A8C018091BC0087FFFB +:105F900008C08091BB0090E0DF91CF911F910F91DD +:105FA0000895CF3FDC0789F30E94AB1A801B910B49 +:105FB0008C179D0750F38EEF9FEFEECFCF92DF92BD +:105FC000EF92FF920F931F93CF93DF936B018A01A0 +:105FD0007901B9010E94ED2EE6010C0D1D1DC017BF +:105FE000D10761F424E92093BC00DF91CF911F9188 +:105FF0000F91FF90EF90DF90CF90089597FDF2CF33 +:10600000B70189910E94672FEACFCF92DF92EF927A +:10601000FF920F931F93CF93DF93C62F6A017901ED +:10602000B8010E94ED2E97FD0CC0B8018C2F0E9484 +:10603000672FE601EC0CFD1CCE15DF0511F097FF74 +:106040000CC024E92093BC00DF91CF911F910F91E8 +:10605000FF90EF90DF90CF900895B80189910E9452 +:10606000672FEACFCF92DF92EF92FF920F931F93A9 +:10607000CF93DF93F82EE62EEA016901B8010E9462 +:10608000ED2E97FD15C0B8018E2D0E94672F97FD4C +:106090000FC0B8018F2D81600E94ED2EF12CE12CF4 +:1060A00021E0C21AD108EC14FD0400F597FF11C0DD +:1060B00024E92093BC001816190614F490E080E03F +:1060C000DF91CF911F910F91FF90EF90DF90CF90D4 +:1060D0000895C8010E94962F97FD04C0FE01EE0DA1 +:1060E000FF1D80832FEFE21AF20ADDCF97FDE0CF8C +:1060F000C8010E94BA2F97FDDBCFCC0DDD1D888330 +:10610000D7CF84E98093BC0008958EE14B9B02C0F9 +:106110008150E1F74B9BFECF08955B9880E28A9512 +:10612000F1F75B9A0895FC013BE03A95F1F798E0AE +:1061300020E080E031E040E14A95F1F7880F4B9B89 +:1061400002C08160232742E04A95F1F7000040E158 +:106150004A95F1F7915079F790E19A95F1F799B155 +:1061600032E03A95F1F7000040E14A95F1F793FBF0 +:10617000992790F992272081920F90830895EF92AA +:10618000FF920F931F93CF93DF930F92CDB7DEB79C +:1061900019828C017C01E60EF11C0E151F0561F4BD +:1061A00081E09981911180E00F90DF91CF911F9153 +:1061B0000F91FF90EF9008950E948530CE010196D7 +:1061C0000E949330F80181938F01E7CF539A5B9A35 +:1061D000089553985B9AEB9AE9E6F0E080818F731B +:1061E000808308956150770B91E001C0990F6A9503 +:1061F000EAF720E031E0911108C0222391F05B9A88 +:1062000080E28A95F1F75B980895492F482339F089 +:106210005B9A232740E24A95F1F79695ECCF5B987D +:10622000F9CF5B98EDCFFF920F931F93CF93DF933E +:10623000EC018C01060F111DC017D10731F4DF915D +:10624000CF911F910F91FF900895F9900E948D308A +:1062500068E08F2D0E94F230EFCF1F920F920FB6A1 +:106260000F921124EF92FF920F931F932F933F935E +:106270004F935F936F937F938F939F93AF93BF934E +:10628000EF93FF93CF93DF930F92CDB7DEB71982D1 +:106290000E948530CE0101960E949330A82FA695CA +:1062A000A695A695282F229525709A2F9570290FCF +:1062B000922F937026952695920F98279770898133 +:1062C000982B09F075C0A83008F072C080E18A955B +:1062D000F1F75B9A539AB2E0BA95F1F700C05B9878 +:1062E000EA2EF12CEAE0AE9FD0011124AE5FBE4F42 +:1062F0001896ED91FC9119973097B1F06091ED01EE +:106300007091EE0116962D913C911797260F371F2D +:1063100013968D919C911497680F791F15964C9147 +:10632000159712968C9109958AE08E9DF0018F9DAC +:10633000F00D1124EE5FFE4F6581662351F0209130 +:10634000ED013091EE0186819781820F931F0E94AB +:1063500013310E948D30F0E1FA95F1F75B98539874 +:106360005B9A80E18A95F1F78AE08E9D80018F9D8E +:10637000100D11240E5F1E4FD80112966C911297CA +:10638000662371F12091ED013091EE0113968D910C +:106390009C91820F931F0E94BF30D801ED91FC9118 +:1063A000882311F088E001C082E080830E9485305C +:1063B0000F90DF91CF91FF91EF91BF91AF919F919E +:1063C0008F917F916F915F914F913F912F911F918D +:1063D0000F91FF90EF900F900FBE0F901F901895A8 +:1063E000ED91FC91DFCF0F931F93CF93DF93EC01DF +:1063F00008970CF0A9C08AE08C9FF0018D9FF00DEA +:106400001124EE5FFE4F80819181892B09F49CC09D +:10641000F894539A5B9885E08A95F1F700008C2FE9 +:10642000869585709C2F9570890F982F937086950F +:106430008695890F8E0193E0000F111F9A95E1F761 +:10644000082B0E948D3000C068E0802F0E94F2303F +:10645000A0E1AA95F1F753985B9A4B9B27C087E080 +:1064600090E04B9925C08AE08C9F80018D9F100D94 +:1064700011240E5F1E4FF80165816623A1F1209162 +:10648000ED013091EE0186819781820F931F0E946A +:10649000BF30811128C0539A5B9AD801ED91FC91CD +:1064A00082E08083789482E090E016C000C0D5CF6F +:1064B0000197B9F4539A5B9A8AE08C9FF0018D9F03 +:1064C000F00D1124EE5FFE4F0190F081E02D81E090 +:1064D0008083789481E090E0DF91CF911F910F91BC +:1064E000089500C0BECF0E948530B0E2BA95F1F7A2 +:1064F0005B98539AE0E1EA95F1F78AE08C9FF0010E +:106500008D9FF00D1124EE5FFE4F6281662351F0E6 +:106510002091ED013091EE0183819481820F931FD0 +:106520000E9413310E948D308AE08C9FF0018D9F74 +:10653000F00D1124EE5FFE4F0190F081E02D1082EE +:10654000789490E080E0C8CF84E090E0C5CFAA1BAB +:10655000BB1B51E107C0AA1FBB1FA617B70710F04E +:10656000A61BB70B881F991F5A95A9F78095909580 +:10657000BC01CD010895991B79E004C0991F9617BD +:1065800008F0961B881F7A95C9F78095089597FBA8 +:10659000072E16F4009407D077FD09D00E94A73289 +:1065A00007FC05D03EF4909581959F4F0895709516 +:1065B00061957F4F0895EE0FFF1F0590F491E02D38 +:1065C00009946927962769277827872778270895C8 +:1065D000FB01DC0102C005900D9241505040D8F7FC +:1065E0000895FB01DC0104C08D910190801921F414 +:1065F00041505040C8F7881B990B0895FB01DC01FE +:1066000002C001900D9241505040D8F70895F99979 +:10661000FECF92BD81BDF89A992780B50895A6E175 +:10662000B0E044E050E00C944133A8E1B0E042E037 +:1066300050E00C944133262FF999FECF92BD81BDD5 +:10664000F89A019700B4021639F01FBA20BD0FB6B0 +:10665000F894FA9AF99A0FBE08950396272F0E948C +:106660001C330E941B33252F0E941C33242F0C94B3 +:106670001C330196272F0E941C330C941B33DC0122 +:10668000CB01FC01F999FECF06C0F2BDE1BDF89A3D +:10669000319600B40D9241505040B8F708950E94D1 +:1066A00056336894B1110C94E53308950E94CA33AF +:1066B00088F09F5798F0B92F9927B751B0F0E1F0C3 +:1066C000660F771F881F991F1AF0BA95C9F714C073 +:1066D000B13091F00E94E433B1E008950C94E433BA +:1066E000672F782F8827B85F39F0B93FCCF38695AC +:1066F00077956795B395D9F73EF490958095709509 +:1067000061957F4F8F4F9F4F0895E89409C097FB85 +:106710003EF490958095709561957F4F8F4F9F4F78 +:106720009923A9F0F92F96E9BB279395F6958795BC +:1067300077956795B795F111F8CFFAF4BB0F11F47F +:1067400060FF1BC06F5F7F4F8F4F9F4F16C0882326 +:1067500011F096E911C0772321F09EE8872F762F5C +:1067600005C0662371F096E8862F70E060E02AF09D +:106770009A95660F771F881FDAF7880F9695879589 +:1067800097F9089557FD9058440F551F59F05F3FF2 +:1067900071F04795880F97FB991F61F09F3F79F043 +:1067A00087950895121613061406551FF2CF4695C5 +:1067B000F1DF08C0161617061806991FF1CF869547 +:1067C0007105610508940895E894BB27662777272B +:1067D000CB0197F908950E94FE330C946F340E9408 +:1067E000613438F00E94683420F0952311F00C9445 +:1067F00058340C945E3411240C94E5330E94C23357 +:1068000070F3959FC1F3950F50E0551F629FF00103 +:10681000729FBB27F00DB11D639FAA27F00DB11D1C +:10682000AA1F649F6627B00DA11D661F829F2227A5 +:10683000B00DA11D621F739FB00DA11D621F839F2C +:10684000A00D611D221F749F3327A00D611D231F02 +:10685000849F600D211D822F762F6A2F11249F5750 +:1068600050409AF0F1F088234AF0EE0FFF1FBB1F53 +:10687000661F771F881F91505040A9F79E3F510512 +:1068800080F00C9458340C94E5335F3FE4F3983E69 +:10689000D4F3869577956795B795F795E7959F5FBC +:1068A000C1F7FE2B880F911D9695879597F908954E +:1068B00097F99F6780E870E060E008959FEF80ECB3 +:1068C000089500240A941616170618060906089556 +:1068D00000240A9412161306140605060895092EBC +:1068E0000394000C11F4882352F0BB0F40F4BF2B2B +:1068F00011F460FF04C06F5F7F4F8F4F9F4F08956B +:10690000F894FFCF281028103110311033103110B7 +:106910003110311028102810381031103110381073 +:106920001A124212E5134212E51375129612E5137C +:106930009413A11363206320BC20BC20EE2096207A +:106940009620962008217921892189214C2D502DCE +:10695000942DA52DB02DCF2DD22D032E242EA22D7A +:10696000A22D2F2E322E352E5A2E7C2E7F2E812EAA +:02697000A62E51 +:106972000101460200000001000000004602000082 +:1069820000050100000046020000000106000000B0 +:106992004602000000010700000046020408000051 +:1069A200000000004602080C000000000000460241 +:1069B2000114000000000000013508760D550D514C +:1069C2000D4D0D340894920021007F2200070180B2 +:1069D200000044004444012D2D2D4C415945522DB7 +:1069E2002D0042617365200047616D652000526190 +:1069F200697365004C6F776572002D2D2D4C4F43E6 +:106A02004B2D2D2D0043617073004E756D00536345 +:106A1200726C002020534F4C4152002054454D507F +:106A2200455354000704070907030708818283E2DC +:106A320000E900EA00B500B600B700CD008301CC42 +:106A4200008A0192019401210223022402250226D6 +:106A52000227022A02B300B4006F007000C302666C +:106A620097C634F40000000000F5F6F731333236F1 +:106A7200FF00FF0100010000FFFF0000010001FF15 +:106A82000000081018202830383830282018100844 +:106A92000000010202020202020202020240227B02 +:0C6AA20049012701AC00B40BCD0BED0B3B +:00000001FF diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/config.h b/keyboards/aleblazer/zodiark/keymaps/solartempest/config.h new file mode 100644 index 000000000000..5c897d91d659 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/config.h @@ -0,0 +1,80 @@ +/* +Copyright 2021 Spencer Deven +Copyright 2021 solartempest + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#pragma once + +#define MASTER_LEFT + +#undef PRODUCT_ID +#define PRODUCT_ID 0xFF02 //Original was 0xF902. If the same ID is used, VIA will fail to reload saved layouts. + +#undef MATRIX_ROWS +#undef MATRIX_COLS +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#undef ENCODER_RESOLUTION +#define MATRIX_ROWS 10 +#define MATRIX_COLS 8 //Added extra column for rotary encoder VIA mapping. +#define MATRIX_ROW_PINS { C6, D7, E6, B4, F4 } +#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6, NO_PIN } //A virtual pin is needed for the encoder key matrix in via. +#define ENCODER_RESOLUTION 4 //Reduce encoder double-input issue. + +#undef DEBOUNCE +#define DEBOUNCE 6 //Default is 5 + +// Tapping settings +#define TAP_CODE_DELAY 10 +#define TAPPING_TOGGLE 2 //Tap TT twice to toggle layer +#define TAPPING_TERM 160 //Tapping duration in ms + +// Disabled to save space +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define NO_ACTION_ONESHOT //Save 244 bytes (-244). +#define NO_RESET //Save 40 bytes (-40). +#define LAYER_STATE_8BIT //For less than 8 bits worth of layers. +#undef LOCKING_SUPPORT_ENABLE //For MX lock keys only. +#undef LOCKING_RESYNC_ENABLE //For MX lock keys only. + +#ifdef OLED_ENABLE + #define OLED_DISPLAY_128X64 + #define OLED_TIMEOUT 80000 //80000 = 80secs, 120000 = 2mins in ms. + #define SPLIT_OLED_ENABLE //Synx on/off OLED state between halves (+100). + #define OLED_LOGO //Enable to print snakey custom logo on slave side (+108). +#endif + +#ifdef RGBLIGHT_ENABLE + #undef RGBLIGHT_ANIMATIONS // Very memory intensive (+2604) + #define RGBLIGHT_EFFECT_STATIC_GRADIENT //Preferred RGB effect (+262) + //#define RGBLIGHT_EFFECT_BREATHING //Testing + //#define RGBLIGHT_EFFECT_SNAKE //For testing LED order + #define RGBLIGHT_SLEEP //Turn off LEDs when computer sleeping (+72) +#endif + +// Pimoroni trackball settings +#ifdef POINTING_DEVICE_ENABLE + //#define PIMORONI_TRACKBALL_INTERVAL_MS 6 //Default is 8ms + #define POINTING_DEVICE_ROTATION_90 + #define PIMORONI_TRACKBALL_INVERT_Y + #define PIMORONI_TRACKBALL_INVERT_X +#endif + +#ifdef VIA_ENABLE + #define DYNAMIC_KEYMAP_LAYER_COUNT 5 +#endif + +#define D2SKATE_MACRO_ENABLE //Enable Destiny 2 hunter skate macro (+224) diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/encoder.c b/keyboards/aleblazer/zodiark/keymaps/solartempest/encoder.c new file mode 100644 index 000000000000..908437d6181a --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/encoder.c @@ -0,0 +1,48 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#ifdef ENCODER_ENABLE + static uint8_t encoder_state[2] = {0}; + static keypos_t encoder_ccw[2] = {{7, 4}, {7, 9}}; //Use these keymap positions to specify the encoder functions on rotate. + static keypos_t encoder_cw[2] = {{7, 3}, {7, 8}}; + + void encoder_action_unregister(void) { + for (int index = 0; index < 2; ++index) { + if (encoder_state[index]) { + keyevent_t encoder_event = (keyevent_t){.key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index], .pressed = false, .time = (timer_read() | 1)}; + encoder_state[index] = 0; + action_exec(encoder_event); + } + } + } + + void encoder_action_register(uint8_t index, bool clockwise) { + keyevent_t encoder_event = (keyevent_t){.key = clockwise ? encoder_cw[index] : encoder_ccw[index], .pressed = true, .time = (timer_read() | 1)}; + encoder_state[index] = (clockwise ^ 1) | (clockwise << 1); + action_exec(encoder_event); + } + + //void matrix_scan_user(void) { encoder_action_unregister(); } //Included in keymap.c instead + + bool encoder_update_user(uint8_t index, bool clockwise) { + encoder_action_register(index, clockwise); + return false; + }; +#endif + diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/keymap.c b/keyboards/aleblazer/zodiark/keymaps/solartempest/keymap.c new file mode 100644 index 000000000000..e2c4c94cbf8c --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/keymap.c @@ -0,0 +1,531 @@ +/* +Copyright 2021 Spencer Deven +Copyright 2021 solartempest +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include QMK_KEYBOARD_H +#ifdef OLED_ENABLE + #include "snake_photo.c" +#endif +#include "encoder.c" + +#ifdef POINTING_DEVICE_ENABLE + bool trackball_is_scrolling = true; //Default mode is scrolling + bool trackball_is_precision = false; //Default mode is less precise + bool was_scrolling = true; //Remember preferred state of trackball scrolling +#endif + +#ifdef HAPTIC_ENABLE + #include "drivers/haptic/DRV2605L.h" +#endif + +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_LAYERS) + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT +#endif + +//Variables for custom keycodes +#ifdef SUPER_ALT_TAB_ENABLE + bool is_alt_tab_active = false; // Super Alt Tab Code + uint16_t alt_tab_timer = 0; +#endif +bool lshift_held = false; // LShift Backspace Delete whole Word Code +bool rshift_held = false; // RShift Backspace Delete whole Word Code +static uint16_t held_shift = 0; + +#ifdef D2SKATE_MACRO_ENABLE + uint16_t D2SKATE_TIMER = 0; + bool D2SKATE_skated = false; //Has skated + bool D2SKATE_reset = true; //Has skated +#endif + +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SBS, //Shift backspace to delete whole word (Swap KC_BPSC with this) + PM_SCROLL, //Toggle trackball scrolling mode + PM_PRECISION, //Toggle trackball precision mode + D2SKATE //Destiny 2 hunter sword skate + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SBS, //Shift backspace to delete whole word (Swap KC_BPSC with this) + PM_SCROLL, //Toggle trackball scrolling mode + PM_PRECISION, //Toggle trackball precision mode + D2SKATE //Destiny 2 hunter sword skate + }; +#endif + +#ifdef VIA_ENABLE + // Extra keys are added for rotary encoder support in VIA + #define LAYOUT_via( \ + L00, L01, L02, L03, L04, L05, R05, R04, R03, R02, R01, R00, \ + L10, L11, L12, L13, L14, L15, L06, R06, R15, R14, R13, R12, R11, R10, \ + L20, L21, L22, L23, L24, L25, L16, R16, R25, R24, R23, R22, R21, R20, \ + L30, L31, L32, L33, L34, L35, L26, L36, L37, R37, R36, R26, R35, R34, R33, R32, R31, R30, \ + L40, L41, L42, L43, L44, L45, L46, L47, R47, R46, R45, R44, R43, R42, R41, R40 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05, L06, KC_NO }, \ + { L10, L11, L12, L13, L14, L15, L16, KC_NO }, \ + { L20, L21, L22, L23, L24, L25, L26, KC_NO }, \ + { L30, L31, L32, L33, L34, L35, L36, L37 }, \ + { L40, L41, L42, L43, L44, L45, L46, L47 }, \ + { R00, R01, R02, R03, R04, R05, R06, KC_NO }, \ + { R10, R11, R12, R13, R14, R15, R16, KC_NO }, \ + { R20, R21, R22, R23, R24, R25, R26, KC_NO }, \ + { R30, R31, R32, R33, R34, R35, R36, R37 }, \ + { R40, R41, R42, R43, R44, R45, R46, R47 } \ + } +#endif + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +#ifndef VIA_ENABLE //This will bypass the layout when VIA is enabled to save space. Requires loading layout in VIA otherwise random keys may be occur. + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_MINS, KC_EQL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_MUTE, _______, _______, RGB_TOG, KC_DEL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + KC_LCTL, KC_LALT, KC_LGUI, KC_APP, MO(1), KC_SPC, KC_ENT, _______, _______, KC_ENT, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + [1] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_PSLS, KC_P7, KC_P8, KC_P9, KC_NLCK, _______, _______, _______, _______, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_F12, + KC_CAPS, KC_P4, KC_P5, KC_P6, KC_NLCK, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_NLCK, + _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, + _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT, _______ + ), + + [2] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_PSLS, KC_P7, KC_P8, KC_P9, KC_NLCK, _______, _______, _______, _______, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_F12, + KC_CAPS, KC_P4, KC_P5, KC_P6, KC_NLCK, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_NLCK, + _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, + _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT, _______ + ), + + [3] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +#endif +}; + +#ifdef POINTING_DEVICE_ENABLE + void run_trackball_cleanup(void) { //Set colour of trackball LED. Does not require RGBLIGHT_ENABLE if colour shorthands are not used. + if (trackball_is_scrolling) { + pimoroni_trackball_set_rgbw(217, 165, 33, 0x00); //RGB_GOLDENROD in number form. + //pimoroni_trackball_set_rgbw(43, 153, 103, 0x00); + } else if (!trackball_is_precision) { + pimoroni_trackball_set_rgbw(0, 27, 199, 0x00); + } else { + //pimoroni_trackball_set_rgbw(217, 165, 33, 0x00); //RGB_GOLDENROD in number form. + pimoroni_trackball_set_rgbw(43, 153, 103, 0x00); + } + } + + uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button) { + if (pressed) { + buttons |= 1 << (button); + #ifdef HAPTIC_ENABLE //Haptic feedback when trackball button is pressed + DRV_pulse(4); //sharp_click + #endif + } else { + buttons &= ~(1 << (button)); + } + return buttons; + } + + report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { + if (trackball_is_scrolling) { + mouse_report.h = mouse_report.x; + #ifndef PIMORONI_TRACKBALL_INVERT_X + mouse_report.v = 0.2*mouse_report.y; //Multiplier to lower scrolling sensitivity + #else + mouse_report.v = 0.2*-mouse_report.y; //invert vertical scroll direction + #endif + mouse_report.x = mouse_report.y = 0; + } + return mouse_report; + } + + #if !defined(MOUSEKEY_ENABLE) //Allows for button clicks on keymap even though mousekeys is not defined. + static bool mouse_button_one, trackball_button_one; + #endif + + void trackball_register_button(bool pressed, enum mouse_buttons button) { + report_mouse_t currentReport = pointing_device_get_report(); + if (pressed) { + currentReport.buttons |= button; + } else { + currentReport.buttons &= ~button; + } + pointing_device_set_report(currentReport); + } +#endif + + + +void matrix_scan_user(void) { + #ifdef ENCODER_ENABLE + encoder_action_unregister(); + #endif + + #ifdef SUPER_ALT_TAB_ENABLE + if (is_alt_tab_active) { //Allows for use of super alt tab. + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } + #endif + #ifdef D2SKATE_MACRO_ENABLE + if (D2SKATE_reset == false) { //Check if Destiny 2 skate timer is activated + if (timer_elapsed(D2SKATE_TIMER) > 4000) { + rgblight_sethsv_noeeprom(252,255,80); //Set regular game layer colour + D2SKATE_reset = true; + #ifdef HAPTIC_ENABLE + DRV_pulse(12); //trp_click + #endif + } + } + #endif + #ifdef ENCODER_ENABLE + encoder_action_unregister(); + #endif + + #ifdef POINTING_DEVICE_ENABLE + if (timer_elapsed32(oled_timer) > 60000) { //60000ms = 60s + pimoroni_trackball_set_rgbw(0,0,0, 0x00); //Turn off Pimoroni trackball LED when computer is idle for 1 minute. Would use suspend_power_down_user but the code is not working. + } + #endif +} + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + #if defined(KEYBOARD_PET) || defined(OLED_LOGO) + if (record->event.pressed) { //OLED timeout code + oled_timer = timer_read32(); + } + #endif + + switch (keycode) { //For keycode overrides + #ifdef SUPER_ALT_TAB_ENABLE + case ATABF: //Alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + return true; + case ATABR: //Alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + return true; + #endif + + case NMR: //Move window to next monitor on right + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + case NML: //Move window to next monitor on left + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + + case KC_RSFT: //Shift Backspace to Delete Whole Word. Inspired by Hellsingcoder. + rshift_held = record->event.pressed; + held_shift = keycode; + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + if (record->event.pressed) { + isBarking = true; + } else { + isBarking = false; + } + #endif + return true; + case KC_LSFT: + lshift_held = record->event.pressed; + held_shift = keycode; + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + if (record->event.pressed) { + isBarking = true; + } else { + isBarking = false; + } + #endif + return true; + case SBS: + if (record->event.pressed) { //When left shift is held and backspace pressed, one whole word will be deleted (left). + if (lshift_held) { + unregister_code(held_shift); + register_code(KC_LCTL); + register_code(KC_BSPC); + } else if (rshift_held) { //When left shift is held and backspace pressed, one whole word will be deleted (right). + unregister_code(held_shift); + register_code(KC_LCTL); + register_code(KC_DEL); + } else { + register_code(KC_BSPC); + } + } else { + unregister_code(KC_BSPC); + unregister_code(KC_DEL); + unregister_code(KC_LCTL); + if (lshift_held || rshift_held) { + register_code(held_shift); + } + } + return false; + #ifdef D2SKATE_MACRO_ENABLE + case D2SKATE: + if (record->event.pressed) { + register_code(KC_0); + wait_ms(34); + register_code(KC_SPC); + unregister_code(KC_0); + register_code(KC_X); + wait_ms(18); + unregister_code(KC_SPC); + unregister_code(KC_X); + rgblight_sethsv_noeeprom(180,255,80); + D2SKATE_skated = true; + } + return false; + case KC_1: + case KC_2: + case KC_3: + if (record->event.pressed) { + if(D2SKATE_skated){ //Start the cooldown timer + D2SKATE_TIMER = timer_read(); + D2SKATE_skated = false; + D2SKATE_reset = false; + } + } + return true; + #endif + + #ifdef POINTING_DEVICE_ENABLE //Allow modes when trackball is enabled. + case PM_SCROLL: + if (record->event.pressed) { + if (trackball_is_scrolling || was_scrolling){ //Enable toggling for trackball scrolling + trackball_is_scrolling=false; + was_scrolling=false; //Tracks status of scrolling setting. Works with holding of layer key for mouse mode. + } else{ + trackball_is_scrolling=true; + was_scrolling=true; + } + run_trackball_cleanup(); + break; + } + case PM_PRECISION: + if (record->event.pressed) { + if (trackball_is_precision){ //Enable toggling for trackball precision + pimoroni_trackball_set_precision(1.75); + trackball_is_precision=false; + } else{ + pimoroni_trackball_set_precision(0.8); + trackball_is_precision=true; + } + run_trackball_cleanup(); + break; + } + #ifndef MOUSEKEY_ENABLE //Allow for using mouse buttons in the keymap when mouse keys is not enabled. + case KC_MS_BTN1: + mouse_button_one = record->event.pressed; + trackball_register_button(mouse_button_one | trackball_button_one, MOUSE_BTN1); + break; + case KC_MS_BTN2: + trackball_register_button(record->event.pressed, MOUSE_BTN2); + break; + case KC_MS_BTN3: + trackball_register_button(record->event.pressed, MOUSE_BTN3); + break; + #endif + #endif + + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + case KC_LCTL: + case KC_RCTL: + #ifndef SNEAK_DISABLE + if (record->event.pressed) { //Pet sneaks when control held. + isSneaking = true; + } else { + isSneaking = false; + } + #endif + #ifdef HAPTIC_ENABLE //Set different patterns for keys on certain layers. In this case it is for gaming feedback. + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(51); //buzz_20 + } + #endif + return true; + case KC_SPC: + if (record->event.pressed) { //Pet jumps when enter is pressed. + isJumping = true; + showedJump = false; + } else { + isJumping = false; + } + return true; + #endif + + #ifdef HAPTIC_ENABLE //Set different patterns for keys on certain layers. In this case it is for gaming feedback. + case KC_G: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(50); //buzz_40 + } + case KC_R: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(52); //pulsing_strong + } + case KC_F: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(49); //buzz_60 + } + #endif + } + return true; +} + + +#ifdef RGBLIGHT_ENABLE + layer_state_t layer_state_set_user(layer_state_t state) //Use for layer lighting. This method uses less space than RGBLIGHT_LAYER_SEGMENTS. + { + switch (get_highest_layer(state)) { // Change all other LEDs based on layer state as well + case 0: + //rgblight_sethsv_noeeprom(50,255,80); //green-blue gradient + //rgblight_sethsv_noeeprom(115,170,80); //pale blue gradient + rgblight_sethsv_noeeprom(0,220,60); //yellow gradient + #ifdef POINTING_DEVICE_ENABLE + if (was_scrolling==true){ //Check if was scrolling when layer was left + trackball_is_scrolling=true; + run_trackball_cleanup(); + } else{ + trackball_is_scrolling=false; + run_trackball_cleanup(); + } + #endif + break; + case 1: + rgblight_sethsv_noeeprom(252,255,80); + #ifdef HAPTIC_ENABLE //Set different patterns for haptic feedback layer indication + DRV_pulse(69); //transition_hum_10 + #endif + break; + case 2: + rgblight_sethsv_noeeprom(80,255,80); + #ifdef HAPTIC_ENABLE + DRV_pulse(37); //lg_dblclick_str + #endif + break; + case 3: + //rgblight_sethsv_noeeprom(118,255,80); //blue-purple gradient + rgblight_sethsv_noeeprom(160,255,80); //blue-magenta gradient + #ifdef HAPTIC_ENABLE + DRV_pulse(31); //sh_dblclick_med + #endif + break; + case 4: + rgblight_sethsv_noeeprom(218,255,80); + #ifdef HAPTIC_ENABLE + DRV_pulse(7); //soft_bump + #endif + #ifdef POINTING_DEVICE_ENABLE //Set trackball mouse mode when layer 4 is activated + if (was_scrolling==true){ //Check if in scrolling mode when layer was activated + trackball_is_scrolling=false; + run_trackball_cleanup(); + } + #endif + } + return state; + } + + bool led_update_user(led_t led_state) //Lock key status indicators + { + if(led_state.caps_lock){ + rgblight_sethsv_range(43,100,170, 4,8); //White-left caps lock indication + } + if(!(led_state.num_lock)){ + rgblight_sethsv_range(43,100,170, 0,2); //White-right num lock indication. Since this indicator is inverted, it must be on the master side of the keyboard to shut off properly when the computer is sleeping. + rgblight_sethsv_range(43,100,170, 10,12); + } + if(led_state.scroll_lock){ + rgblight_sethsv_range(43,100,170, 2,4); //White-middle scroll lock indication + rgblight_sethsv_range(43,100,170, 8,10); + } + return true; + } +#endif + + +void keyboard_post_init_user(void) +{ + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9 + //rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING); //Test + #endif + layer_move(0); //Start on layer0 by default to set LED colours. Can remove to save a very small amount of space. + #ifdef POINTING_DEVICE_ENABLE + pimoroni_trackball_set_precision(1.75); //Start trackball with lower precision mode + run_trackball_cleanup(); + #endif +} + +#ifdef POINTING_DEVICE_ENABLE + void suspend_power_down_user(void) { //Code does not work, need to confirm why + pimoroni_trackball_set_rgbw(0,0,0, 0x00); //Turn off Pimoroni trackball LED when computer is sleeping + } +#endif + +#ifdef POINTING_DEVICE_ENABLE + void suspend_wakeup_init_user(void) { //turn on Pimoroni LED when awoken + run_trackball_cleanup(); + } +#endif diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/oled.c b/keyboards/aleblazer/zodiark/keymaps/solartempest/oled.c new file mode 100644 index 000000000000..20ed75e40580 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/oled.c @@ -0,0 +1,83 @@ +/* +Copyright 2021 Spencer Deven +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifdef OLED_ENABLE +uint32_t oled_timer = 0; //OLED timeout +led_t led_usb_state; + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0 + }; + + oled_write_P(qmk_logo, false); +} + +static void print_status_narrow(void) { + // Print current mode + oled_write_P(PSTR("\n\n"), false); + + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_ln_P(PSTR("Qwrt"), false); + break; + default: + oled_write_P(PSTR("Mod\n"), false); + break; + } + oled_write_P(PSTR("\n\n"), false); + // Print current layer + oled_write_ln_P(PSTR("LAYER"), false); + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_P(PSTR("Base\n"), false); + break; + case 1: + oled_write_P(PSTR("Raise"), false); + break; + case 2: + oled_write_P(PSTR("Lower"), false); + break; + case 3: + oled_write_P(PSTR("Adjust"), false); + break; + default: + oled_write_ln_P(PSTR("Undef"), false); + } + oled_write_P(PSTR("\n\n"), false); + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); +} + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_90; + } + else{ + return OLED_ROTATION_270; + } +} + +bool oled_task_user(void) { + if (is_keyboard_master()) { + print_status_narrow(); + } else { + render_logo(); + } + return false; +} + +#endif diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/readme.md b/keyboards/aleblazer/zodiark/keymaps/solartempest/readme.md new file mode 100644 index 000000000000..6678f496448b --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/readme.md @@ -0,0 +1,88 @@ +### --- Note: When flashing this firmware, be sure to load the VIA keymap and layout files otherwise your keys won't work! Please refer to the VIA section below. --- + +# Zodiark Keyboard + +![Zodiark](https://i.imgur.com/B7bDYeE.jpg) + +Zodiark is a 68-key column-staggered split keyboard with per key RGB, rotary encoders, and 2x I2C headers per side. Created by Aleblazer. + +Build guide is available here: [Zodiark build log/guide](https://www.splitlogic.xyz/buildguides/zodiark-build-guide) + +* Keyboard Maintainer: [Solartempest] +* Hardware Supported: Zodiark, ProMicro / Elite-C, 1.3" 128x64 SSD1306 OLEDs, Pimoroni Trackball, Pimoroni Haptic Buzz! +* Hardware Availability: [Split Logic Group Buy - Discord Link](https://discord.gg/BCSbXwskVt) + +# Custom Features: +### OLED Features: +- OLED displays current layer, lock key status, WPM, custom pixel art, and custom name. +- OLED shuts off on idle and when computer is sleeping. + +### Trackball Features: +- Supports Pimoroni Trackball installed on master side. +- Default action is scrolling. Hold Raise layer for mouse mode. +- Mouse mode and precision mode are toggleable with trackball LED indication. +- Trackball LED shuts off when computer is sleeping (currently bugged). +- Clicking and dragging is enabled using mouse keys on keymap. + +### RGB Features: +- Adds custom layer lighting with custom gradients for each layer. +- Adds white caps lock, scroll lock, and num lock key indicators using the top row LEDs. + +### Rotary Encoder and VIA Features: +- Fully emappable left encoder controls volume up/down/mute. Right encoder left/right arrow keys. +- Allows for live remapping of per-layer rotary encoder functions in VIA. +- VIA support included by default. +- Custom macro key in VIA for Super Alt Tab, which is fully compatible with rotary encoders. +- Custom macro key in VIA for moving windows to other monitors in Windows, which is fully compatible with rotary encoders. + +### Haptic Feedback Features: +- Supports Pimoroni Haptic Bzzz installed on master side. +- Different vibrations when layers are activated. +- Provides tactile feedback when trackball is clicked or mouse keys are used. +- Tactile feedback for specific keys on gaming layer. + +### Tap and Other Features: +- Push left-shift + backspace to delete whole words. Right-shift + backspace to delete whole words in the opposite direction. +- Double tap layers to stay on a layer instead of momentary push. + +### Acknowledgements +- Thanks Aleblazer for creating this great keyboard! Also thanks for sharing the VIA json which made addition of the rotary encoders in VIA much faster. +- Thanks Drashna for the OLED timeout and extensible rotary encoder code. +- Thanks Dasky for helping me resolve prior trackball code issues. +- Thanks to Hellsingcoder for creating Luna and Jackasaur for optimizing the code for less space. This was the base code I used for my pixel art. + +## Using with VIA (Important! Please Read.) + +- After flashing, in VIA make sure to Import Keymap, which is "zodiark VIA keymap.json". This will alow VIA to recognize the updated layout and custom functions. VIA will auto-recognize the default keyboard but that does not match this firmware because of the necessary customization. +- Go to Save+Load to Load Saved Layout. You can import my own layout "zodiark VIA layout.json" or just use the Keymap tab to assign your own keys. Having another keyboard connected can be handy for doing this step. +- It is a good idea to Save Current Layout after you decide on your mapping. + + +# Compiling + +Compile with the command below: + +```sh +# for Elite C with Left Side Master builds +qmk compile -kb aleblazer/zodiark -km solartempest +``` + +## Flashing + +Flash using the correct command below or use QMK Toolbox. Specifying side during compile is unnecessary as Master Left is defined by default: + +```sh +# for pro micro-based builds +qmk flash -kb aleblazer/zodiark -km solartempest + +# for Elite C or dfu bootloader builds +qmk flash -kb aleblazer/zodiark -km solartempest +``` + +These commands can be mixed if, for example, you have an Elite C on the left and a pro micro on the right. +Press reset button on he keyboard when asked. + +Disconnect the first half, connect the second one and repeat the process. + + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/rules.mk b/keyboards/aleblazer/zodiark/keymaps/solartempest/rules.mk new file mode 100644 index 000000000000..2d23c52fce08 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/rules.mk @@ -0,0 +1,8 @@ +VIA_ENABLE = yes +BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite +GRAVE_ESC_ENABLE = no # Save space by not using KC_GESC (+127) +SPACE_CADET_ENABLE = no # Save space by not using space cadet left/right shift (+350) +MOUSEKEY_ENABLE = no # Mouse keys (+1482). Not required for trackball usage. + +POINTING_DEVICE_ENABLE = yes # Enable Pimoroni Trackball on master (+2304) +POINTING_DEVICE_DRIVER = pimoroni_trackball \ No newline at end of file diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/snake_photo.c b/keyboards/aleblazer/zodiark/keymaps/solartempest/snake_photo.c new file mode 100644 index 000000000000..61685f8a8db9 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/snake_photo.c @@ -0,0 +1,325 @@ +/* Copyright + * 2021 solartempest + * 2021 Luna code adapted from HellSingCoder and Jackasaur + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty o + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//SSD1306 OLED update loop +#ifdef OLED_ENABLE + uint32_t oled_timer = 0; //OLED timeout + led_t led_usb_state; + + #define KEYBOARD_PET + // KEYBOARD PET START + + // advanced settings + #define ANIM_FRAME_DURATION 300 // how long each frame lasts in ms. Default is 200. + #define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024 + + // timers + uint32_t anim_timer = 0; + uint32_t text_timer = 0; + + // current frame + uint8_t current_frame = 0; + + // status variables + #ifndef SNEAK_DISABLE + bool isSneaking = false; + #endif + bool isJumping = false; + bool showedJump = true; + bool isBarking = false; + + #if defined(OLED_LOGO) && !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void render_logo_slave(int LUNA_X, int LUNA_Y) { + static const char PROGMEM luna_logo[] = { // 'snake-logo', 64x44px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0c, 0xcf, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x60, 0x60, + 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x7f, 0x7f, 0xf3, 0xf3, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x38, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xf8, 0xfe, 0xfe, 0xff, + 0xff, 0x7f, 0x3f, 0x3f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xfe, + 0xf8, 0xf8, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xc1, 0xe1, 0xf7, 0xff, + 0xff, 0x7f, 0x3f, 0x07, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xc0, + 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xfe, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x07, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x3f, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf8, 0xfc, 0x3e, 0x0f, 0x07, 0x01, + 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, + 0xf0, 0xf0, 0xf8, 0xf8, 0xfe, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0, 0xe0, + 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0x7e, 0x3f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, + 0x0f, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + oled_set_cursor(LUNA_X,LUNA_Y); + oled_write_raw_P(luna_logo, sizeof(luna_logo)); + } + #endif + + #if defined(OLED_LOGO) && !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void render_logo_master(int LUNA_X, int LUNA_Y) { + static const char PROGMEM luna_logo[] = { // 'photo-logo', 64x44px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfc, 0x06, 0x06, 0x52, + 0xda, 0xca, 0x52, 0x06, 0xec, 0x18, 0x10, 0x10, 0x10, 0x10, 0x90, 0x9e, 0x43, 0x60, 0x20, 0x23, + 0x12, 0x10, 0x12, 0x10, 0x13, 0x31, 0x20, 0x60, 0xc3, 0x9f, 0x1e, 0x10, 0x1c, 0x12, 0x12, 0x12, + 0x12, 0x1c, 0x10, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xf7, 0x07, 0xe0, 0xc0, 0x00, 0xf8, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x03, 0x06, 0x0e, 0x08, 0x00, 0x01, 0xc6, 0xfc, 0x00, 0x38, 0x70, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xfd, 0xfc, 0x00, 0x01, 0x18, 0x31, 0x63, 0x0f, 0x1c, 0x38, 0x30, 0x73, 0x66, + 0x64, 0x64, 0x60, 0x60, 0x60, 0x70, 0x30, 0x38, 0x1c, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0xa0, + 0xe0, 0x40, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0c, 0x0c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x0f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + oled_set_cursor(LUNA_X,LUNA_Y); + oled_write_raw_P(luna_logo, sizeof(luna_logo)); + } + #endif + + /*// logic + static void render_luna(int LUNA_X, int LUNA_Y) { + + // Sit + static const char PROGMEM sit[2][ANIM_SIZE] = { + // 'sit1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x70, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'sit2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + //Walk and run animations have been removed to save space. + + // Bark + static const char PROGMEM bark[2][ANIM_SIZE] = { + // 'bark1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x30, 0x70, 0xe0, 0xe0, 0xc0, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0xff, 0xff, 0xe7, 0xe7, 0xef, 0xef, 0xcf, 0xcb, 0x83, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x1c, 0x38, 0x78, 0xf1, 0xe3, 0xe3, 0xe7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'bark2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0x60, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x9f, + 0x0f, 0x0e, 0x1f, 0x1f, 0x3f, 0x3f, 0x7e, 0xe6, 0x83, 0x03, 0x0f, 0x43, 0x43, 0x90, 0x88, 0x08, + 0x00, 0x00, 0x03, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, 0xe0, 0xf0, 0xf0, 0xfb, 0xff, 0xff, 0xff, 0x7f, + 0x7f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Sneak + #ifndef SNEAK_DISABLE + static const char PROGMEM sneak[2][ANIM_SIZE] = { + // 'sneak1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf1, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x01, 0x03, 0x06, 0x02, 0x00, 0x00, 0x00, + }, + // 'sneak2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0xf8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf0, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + #endif + + // animation + void animate_luna(void) { + // jump + if (isJumping || !showedJump) { + // clear + oled_set_cursor(LUNA_X,LUNA_Y +2); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y -1); + showedJump = true; + } else { + // clear + oled_set_cursor(LUNA_X,LUNA_Y -1); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y); + } + + // switch frame + current_frame = (current_frame + 1) % 2; + + // current status + if(isBarking) { + oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE); + #ifndef SNEAK_DISABLE + } else if(isSneaking) { + oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE); + #endif + } else { + oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE); + } + } + + // animation timer + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animate_luna(); + } + } + // KEYBOARD PET END + */ + + + #if !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void print_logo_narrow(void) { + //oled_set_cursor(0,1); + //oled_write("----------", false); + + oled_set_cursor(0,3); + oled_write(" SOLAR", false); + oled_set_cursor(0,4); + oled_write(" TEMPEST", false); + + //oled_set_cursor(0,15); //Last line on the display + //oled_write("----------", false); + + #ifdef OLED_LOGO + render_logo_slave(0,7); //Not defining this in config.h will save space (+112). + #endif + } + #endif + + static void print_status_narrow(void) { + // Print current layer + oled_set_cursor(0,1); + oled_write("---LAYER--", false); + + oled_set_cursor(0,2); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + // lock status + oled_set_cursor(0,5); + oled_write("---LOCK---", false); + oled_set_cursor(0,6); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,7); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,8); + oled_write("Scrl", led_usb_state.scroll_lock); + + /* KEYBOARD PET RENDER START */ + //render_luna(0,11); + /* KEYBOARD PET RENDER END */ + #ifdef OLED_LOGO + render_logo_master(0,11-0); //Not defining this in config.h will save space (+112). + #endif + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_90; + } + else{ + return OLED_ROTATION_270; + } + } + + bool oled_task_user(void) { + led_usb_state = host_keyboard_led_state(); + + + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 30000) {//OLED timeout 30000ms = 30s + oled_off(); + return false; + } else { + oled_on(); + } + #ifndef OLED_NO_MASTER + print_status_narrow(); + #endif + } else { + #ifdef OLED_NO_SLAVE //do not render slave + #else + #if !defined(OLED_NO_MASTER) //render as normal + print_logo_narrow(); + #else //render status on slave + print_status_narrow(); + #endif + #endif + } + return false; + } +#endif diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/snakey_minimal.c b/keyboards/aleblazer/zodiark/keymaps/solartempest/snakey_minimal.c new file mode 100644 index 000000000000..abdf1609bbc9 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/snakey_minimal.c @@ -0,0 +1,295 @@ +/* Copyright + * 2021 solartempest + * 2021 Luna code adapted from HellSingCoder and Jackasaur + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty o + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//SSD1306 OLED update loop +#ifdef OLED_ENABLE + uint32_t oled_timer = 0; //OLED timeout + led_t led_usb_state; + + #define KEYBOARD_PET + // KEYBOARD PET START + + // advanced settings + #define ANIM_FRAME_DURATION 300 // how long each frame lasts in ms. Default is 200. + #define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024 + + // timers + uint32_t anim_timer = 0; + uint32_t text_timer = 0; + + // current frame + uint8_t current_frame = 0; + + // status variables + #ifndef SNEAK_DISABLE + bool isSneaking = false; + #endif + bool isJumping = false; + bool showedJump = true; + bool isBarking = false; + + #if defined(OLED_LOGO) && !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void render_logo(int LUNA_X, int LUNA_Y) { + /*static const char PROGMEM luna_logo[] = { + 0x00, 0x00, 0x04, 0xf6, 0xb8, 0xf8, 0xd8, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, + 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe1, 0xf3, 0xfb, 0x7f, 0x1f, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x3f, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xf3, 0xff, 0x7f, 0x1f, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x30, + 0x1e, 0x3f, 0x3f, 0x7f, 0xf9, 0xf0, 0xf0, 0x70, 0x78, 0x3c, 0x3f, 0x1f, 0x0f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x3f, 0x7f, 0x7f, 0xfb, 0xf1, 0xf0, 0x78, 0x3c, 0x1e, 0x0f, 0x03, 0x00, 0x00, + };*/ + static const char PROGMEM luna_logo[] = { // 'snakey-logo-64x44', 64x44px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0c, 0xcf, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x60, 0x60, + 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x7f, 0x7f, 0xf3, 0xf3, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x38, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xf8, 0xfe, 0xfe, 0xff, + 0xff, 0x7f, 0x3f, 0x3f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xfe, + 0xf8, 0xf8, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xc1, 0xe1, 0xf7, 0xff, + 0xff, 0x7f, 0x3f, 0x07, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xc0, + 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xfe, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x07, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x3f, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf8, 0xfc, 0x3e, 0x0f, 0x07, 0x01, + 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, + 0xf0, 0xf0, 0xf8, 0xf8, 0xfe, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0, 0xe0, + 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0x7e, 0x3f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, + 0x0f, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + oled_set_cursor(LUNA_X,LUNA_Y); + oled_write_raw_P(luna_logo, sizeof(luna_logo)); + } + #endif + + // logic + static void render_luna(int LUNA_X, int LUNA_Y) { + + // Sit + static const char PROGMEM sit[2][ANIM_SIZE] = { + // 'sit1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x70, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'sit2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + //Walk and run animations have been removed to save space. + + // Bark + static const char PROGMEM bark[2][ANIM_SIZE] = { + // 'bark1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x30, 0x70, 0xe0, 0xe0, 0xc0, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0xff, 0xff, 0xe7, 0xe7, 0xef, 0xef, 0xcf, 0xcb, 0x83, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x1c, 0x38, 0x78, 0xf1, 0xe3, 0xe3, 0xe7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'bark2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0x60, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x9f, + 0x0f, 0x0e, 0x1f, 0x1f, 0x3f, 0x3f, 0x7e, 0xe6, 0x83, 0x03, 0x0f, 0x43, 0x43, 0x90, 0x88, 0x08, + 0x00, 0x00, 0x03, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, 0xe0, 0xf0, 0xf0, 0xfb, 0xff, 0xff, 0xff, 0x7f, + 0x7f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Sneak + #ifndef SNEAK_DISABLE + static const char PROGMEM sneak[2][ANIM_SIZE] = { + // 'sneak1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf1, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x01, 0x03, 0x06, 0x02, 0x00, 0x00, 0x00, + }, + // 'sneak2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0xf8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf0, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + #endif + + // animation + void animate_luna(void) { + // jump + if (isJumping || !showedJump) { + // clear + oled_set_cursor(LUNA_X,LUNA_Y +2); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y -1); + showedJump = true; + } else { + // clear + oled_set_cursor(LUNA_X,LUNA_Y -1); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y); + } + + // switch frame + current_frame = (current_frame + 1) % 2; + + // current status + if(isBarking) { + oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE); + #ifndef SNEAK_DISABLE + } else if(isSneaking) { + oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE); + #endif + } else { + oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE); + } + } + + // animation timer + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animate_luna(); + } + } + // KEYBOARD PET END + + + #if !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void print_logo_narrow(void) { + //oled_set_cursor(0,1); + //oled_write("----------", false); + + oled_set_cursor(0,3); + oled_write(" SOLAR", false); + oled_set_cursor(0,4); + oled_write(" TEMPEST", false); + + //oled_set_cursor(0,15); //Last line on the display + //oled_write("----------", false); + + #ifdef OLED_LOGO + render_logo(0,7); //Not defining this in config.h will save space (+112). + #endif + } + #endif + + static void print_status_narrow(void) { + // Print current layer + oled_set_cursor(0,1); + oled_write("---LAYER--", false); + + oled_set_cursor(0,2); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + // lock status + oled_set_cursor(0,5); + oled_write("---LOCK---", false); + oled_set_cursor(0,6); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,7); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,8); + oled_write("Scrl", led_usb_state.scroll_lock); + + /* KEYBOARD PET RENDER START */ + render_luna(0,11); + /* KEYBOARD PET RENDER END */ + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_90; + } + else{ + return OLED_ROTATION_270; + } + } + + bool oled_task_user(void) { + led_usb_state = host_keyboard_led_state(); + + + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 30000) {//OLED timeout 30000ms = 30s + oled_off(); + return false; + } else { + oled_on(); + } + #ifndef OLED_NO_MASTER + print_status_narrow(); + #endif + } else { + #ifdef OLED_NO_SLAVE //do not render slave + #else + #if !defined(OLED_NO_MASTER) //render as normal + print_logo_narrow(); + #else //render status on slave + print_status_narrow(); + #endif + #endif + } + return false; + } +#endif diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA keymap.json b/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA keymap.json new file mode 100644 index 000000000000..aacda97a9951 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA keymap.json @@ -0,0 +1,82 @@ +{ + "name":"Zodiark", + "vendorId":"0xF901", + "productId":"0xFF02", + "lighting": "qmk_rgblight", + "matrix": { "rows": 10, "cols": 8 }, + "customKeycodes": [ + { + "name": "Super Alt Tab FWD", + "title": "Alt Tab Forwards in Windows", + "shortName": "ATABF" + }, + { + "name": "Super Alt Tab REV", + "title": "Alt Tab Reverse in Windows", + "shortName": "ATABR" + }, + { + "name": "Move Window Right", + "title": "Move Window Right in Windows", + "shortName": "MWR" + }, + { + "name": "Move Window Left", + "title": "Move Window Left in Windows", + "shortName": "MWL" + }, + { + "name": "Shift-BSPC", + "title": "Shift-Backspace to Delete Whole Words", + "shortName": "SBS" + }, + { + "name": "Trackball Scroll", + "title": "Pimoroni Trackball Scroll Mode", + "shortName": "PM_SCROLL" + }, + { + "name": "Trackball Precision", + "title": "Pimoroni Trackball Precision Mode", + "shortName": "PM_PRECISION" + }, + { + "name": "D2 Hunter Skate", + "title": "Destiny 2 Hunter Sword Skate", + "shortName": "D2SKATE" + } + ], + "layouts": + { + "keymap": + [ + [{"y":1,"x":3},"0,3",{"x":11},"5,3"], + [{"y":-0.87,"x":2},"0,2",{"x":1},"0,4",{"x":9},"5,4",{"x":1},"5,2"], + [{"y":-0.88,"x":5},"0,5",{"x":7},"5,5"], + [{"y":-0.72},"0,0","0,1",{"x":15},"5,1","5,0"], + [{"y":-0.53,"x":3},"1,3",{"x":11},"6,3"], + [{"y":-0.87,"x":2},"1,2",{"x":1},"1,4",{"x":9},"6,4",{"x":1},"6,2"], + [{"y":-0.88,"x":5},"1,5",{"x":7},"6,5"], + [{"y":-0.72},"1,0","1,1",{"x":15},"6,1","6,0"], + [{"y":-0.83,"x":6},"0,6",{"x":5},"5,6"], + [{"y":-0.7,"x":3},"2,3",{"x":11},"7,3"], + [{"y":-0.87,"x":2},"2,2",{"x":1},"2,4",{"x":9},"7,4",{"x":1},"7,2"], + [{"y":-0.88,"x":5},"2,5",{"x":7},"7,5"], + [{"y":-0.72},"2,0","2,1",{"x":15},"7,1","7,0"], + [{"y":-0.83,"x":6},"1,6",{"x":5},"6,6"], + [{"y":-0.7,"x":3},"3,3",{"x":11},"8,3"], + [{"y":-0.87,"x":2},"3,2",{"x":1},"3,4",{"x":9},"8,4",{"x":1},"8,2"], + [{"y":-0.88,"x":5},"3,5",{"x":7},"8,5"], + [{"y":-0.72},"3,0","3,1",{"x":15},"8,1","8,0"], + [{"y":-0.53,"x":3},"4,3",{"x":11},"9,3"], + [{"y":-0.87,"x":2},"4,2",{"x":1},"4,4",{"x":9},"9,4",{"x":1},"9,2"], + [{"y":-0.6},"4,0","4,1",{"x":15},"9,1","9,0"], + [{"r":30,"rx":6.5,"ry":4.25,"y":-0.6,"x":0.8,"c":"#aaaaaa"},"3,7","4,7"], + [{"r":30,"rx":6.5,"ry":4.25,"y":0.6,"x":0.17,"c":"#777777"},"2,6","3,6"], + [{"x":-0.33,"w":1.5},"4,5","4,6"], + [{"r":-30,"rx":13,"y":-0.8,"x":-3.2,"c":"#aaaaaa"},"8,7","9,7"], + [{"r":-30,"rx":13,"y":0.35,"x":-2.6,"c":"#777777"},"8,6","7,6"], + [{"x":-2.6},"9,6",{"w":1.5},"9,5"] + ] + } +} diff --git a/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA layout.json b/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA layout.json new file mode 100644 index 000000000000..cc01d354cdb2 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/solartempest/zodiark VIA layout.json @@ -0,0 +1,417 @@ +{ + "name": "Zodiark", + "vendorProductId": 4177657602, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_MS_BTN1", + "KC_ESC", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_MS_BTN2", + "KC_A", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "USER05", + "KC_VOLD", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_MUTE", + "KC_VOLD", + "KC_UP", + "KC_DOWN", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "KC_ENT", + "TT(3)", + "KC_VOLU", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "USER02", + "KC_Y", + "USER04", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "USER03", + "KC_RBRC", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "USER06", + "KC_MSTP", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "C(KC_W)", + "KC_LEFT", + "KC_RGHT", + "KC_LEFT", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "KC_SPC", + "TT(4)", + "KC_RGHT" + ], + [ + "KC_PSCR", + "KC_4", + "KC_1", + "KC_2", + "KC_3", + "KC_G", + "KC_MS_BTN1", + "KC_S", + "KC_F12", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_MS_BTN2", + "KC_C", + "KC_TAB", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_B", + "KC_SPC", + "KC_LSFT", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_TRNS", + "KC_TRNS", + "KC_LCTL", + "KC_LCTL", + "KC_TRNS", + "KC_LALT", + "USER07", + "KC_SPC", + "KC_F22", + "KC_TRNS", + "KC_F4", + "KC_F11", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_F12", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_3", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_RALT", + "KC_TRNS", + "TO(0)", + "KC_RALT", + "MO(4)", + "KC_ENT", + "MO(2)", + "KC_TRNS" + ], + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_BSLS", + "KC_TRNS", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_BSPC", + "KC_MINS", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "KC_LBRC", + "KC_P", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_TRNS", + "KC_TRNS", + "KC_UP", + "KC_DOWN", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "KC_SPC", + "TT(2)", + "KC_TRNS", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "KC_DEL", + "KC_RCTL", + "KC_BSPC", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "KC_BSLS", + "KC_F5", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "KC_RBRC", + "KC_TRNS", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "KC_TRNS", + "KC_TRNS", + "KC_RGHT", + "KC_LEFT", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "KC_ENT", + "TT(3)", + "KC_TRNS" + ], + [ + "KC_GRV", + "KC_F1", + "KC_F2", + "KC_F3", + "KC_F4", + "KC_F5", + "KC_F14", + "KC_F9", + "KC_ESC", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_F13", + "KC_8", + "KC_TRNS", + "KC_EXLM", + "KC_AT", + "KC_HASH", + "KC_DLR", + "KC_PERC", + "KC_DEL", + "KC_AMPR", + "KC_TRNS", + "KC_EQL", + "KC_MINS", + "KC_PLUS", + "KC_LCBR", + "KC_RCBR", + "KC_TRNS", + "C(S(KC_TAB))", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(KC_TAB)", + "KC_F11", + "KC_F10", + "KC_F9", + "KC_F8", + "KC_F7", + "KC_F6", + "USER02", + "KC_TRNS", + "KC_F12", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "USER03", + "KC_TRNS", + "KC_UNDS", + "KC_RPRN", + "KC_LPRN", + "KC_ASTR", + "KC_AMPR", + "KC_CIRC", + "KC_TRNS", + "C(KC_X)", + "KC_TRNS", + "KC_BSLS", + "KC_SCLN", + "KC_DOT", + "KC_RBRC", + "KC_LBRC", + "KC_TRNS", + "C(KC_MINS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(KC_PPLS)" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(KC_PPLS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(KC_UP)", + "C(KC_DOWN)", + "C(KC_MINS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(KC_LEFT)", + "C(KC_RGHT)", + "KC_PSCR", + "KC_TRNS", + "KC_TRNS", + "C(KC_Z)", + "C(KC_X)", + "C(KC_C)", + "C(KC_V)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_SLCK", + "KC_NO", + "KC_DEL", + "KC_INS", + "KC_END", + "KC_UP", + "KC_HOME", + "KC_TRNS", + "KC_NLCK", + "KC_NO", + "KC_BSPC", + "KC_TRNS", + "KC_RGHT", + "KC_DOWN", + "KC_LEFT", + "KC_TRNS", + "KC_CAPS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_PGDN", + "KC_PGUP", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_WWW_REFRESH", + "KC_TRNS", + "KC_TRNS" + ] + ] +} \ No newline at end of file diff --git a/keyboards/aleblazer/zodiark/keymaps/via/aleblazer_zodiark_via.hex b/keyboards/aleblazer/zodiark/keymaps/via/aleblazer_zodiark_via.hex new file mode 100644 index 000000000000..3415b408cfd9 --- /dev/null +++ b/keyboards/aleblazer/zodiark/keymaps/via/aleblazer_zodiark_via.hex @@ -0,0 +1,1517 @@ +:100000000C948D030C94D4030C94D4030C94D4035B +:100010000C94242C0C94D4030C94D4030C94D4038B +:100020000C94D4030C94D4030C942B240C94E72349 +:100030000C9428250C94D4030C94D4030C94D4036E +:100040000C94D4030C94D4030C94D4030C94D403D4 +:100050000C94D4030C9404250C94D4030C94D40372 +:100060000C94D4030C94D4030C94D4030C94D403B4 +:100070000C94D4030C94D4030C94D4030C94D403A4 +:100080000C94D4030C94D4030C94D4030C94D40394 +:100090000C94D4030C94D4030C94D4030C94D40384 +:1000A0000C94D4030C94D4030C94D40305010902DA +:1000B000A10185020901A1000509190129081500FE +:1000C0002501950875018102050109300931158165 +:1000D000257F95027508810609381581257F9501D0 +:1000E00075088106050C0A38021581257F95017572 +:1000F000088106C0C005010980A101850319012AF4 +:10010000B700150126B700950175108100C0050CD8 +:100110000901A101850419012AA002150126A002E6 +:10012000950175108100C00660FF0961A101096297 +:10013000150026FF00952075088102096315002629 +:10014000FF00952075089102C005010906A101056F +:100150000719E029E7150025019508750181029529 +:1001600001750881010507190029FF150026FF0008 +:100170009506750881000508190129059505750181 +:100180009102950175039101C0000000000000007C +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000007E0F00C2 +:1001B000D4FFFFFFC700000078000000000000002F +:1001C000002A2B28000000000000000000000000B2 +:1001D0000000000029000000002C1E3420212224F1 +:1001E000342627252E362D3738271E1F202122237F +:1001F0002425263333362E37381F04050607080911 +:100200000A0B0C0D0E0F10111213141516171819D6 +:100210001A1B1C1D2F3130232D3504050607080934 +:100220000A0B0C0D0E0F10111213141516171819B6 +:100230001A1B1C1D2F3130354C00047F3F1F6432C8 +:1002400014643214783C1E1E140A050001010101D9 +:100250000101010101020202020202020202030381 +:100260000303030303030404040404040405050551 +:100270000505060606060607070707070808080813 +:10028000090909090A0A0A0B0B0B0C0C0C0D0D0DC0 +:100290000E0E0E0F0F0F1010111111121213131456 +:1002A00014151516161717181819191A1A1B1B1CCE +:1002B0001D1D1E1E1F202021222223242425262628 +:1002C000272829292A2B2C2D2D2E2F30313232335D +:1002D0003435363738393A3B3C3D3E3F4041424366 +:1002E0004445464748494A4C4D4E4F50515354554A +:1002F0005658595A5B5D5E5F616264656668696BFA +:100300006C6D6F7072737577787A7B7D7E80828377 +:100310008587888A8C8E8F91939596989A9C9EA0BB +:10032000A2A3A5A7A9ABADAFB1B3B5B7BABCBEC0C8 +:10033000C2C4C6C9CBCDCFD1D4D6D8DBDDDFE2E491 +:10034000E7E9EBEEF0F3F5F8FAFDFFFFAA7F554081 +:100350002223252628292A2C2D2F303233353638D2 +:100360003A3B3D3E4042434547494A4C4E5051532B +:100370005557595A5C5E6062646668696B6D6F714F +:10038000737577797B7D7F81838587898A8C8E9051 +:10039000929496989A9C9E9FA1A3A5A7A8AAACAE5A +:1003A000AFB1B3B4B6B8B9BBBCBEBFC1C2C3C5C69A +:1003B000C7C9CACBCCCDCED0D1D2D2D3D4D5D6D743 +:1003C000D7D8D9D9DADADBDBDBDCDCDCDCDCDDDD81 +:1003D000DDDDDCDCDCDCDCDBDBDBDADAD9D9D8D771 +:1003E000D7D6D5D4D3D2D2D1D0CECDCCCBCAC9C713 +:1003F000C6C5C3C2C1BFBEBCBBB9B8B6B4B3B1AF4A +:10040000AEACAAA8A7A5A3A19F9E9C9A98969492E9 +:10041000908E8C8A89878583817F7D7B79777573C0 +:10042000716F6D6B6968666462605E5C5A5957559E +:100430005351504E4C4A4947454342403E3D3B3A5A +:100440003836353332302F2D2C2A292826252322E1 +:1004500029001E001F002000210022002F002B0079 +:1004600014001A000800150017002D0003510400A5 +:100470001600070009000A003500E1001D001B00FE +:10048000060019000500A800E000E200E300650096 +:1004900001512C0028002A002700260025002400F6 +:1004A000230030003100130012000C0018001C0063 +:1004B0002E00340033000F000E000D000B004C0026 +:1004C000280038003700360010001100C25C4F00D1 +:1004D00052005100500002512C00280001003A0047 +:1004E0003B003C003D003E00010054005F00600006 +:1004F000610053000100010039005C005D005E00F6 +:10050000530001000100010059005A005B00010086 +:1005100001000100010062006300580001000100B9 +:100520000100440043004200410040003F00010040 +:100530004500610060005F005400010001005300AD +:100540005E005D005C0001000100010001005B0035 +:100550005A00590001000100010001005800630029 +:10056000620001000100010001003A003B003C0074 +:100570003D003E00010054005F0060006100530038 +:100580000100010039005C005D005E0053000100C5 +:100590000100010059005A005B0001000100010048 +:1005A00001006200630058000100010001004400E6 +:1005B00043004200410040003F000100450061004F +:1005C00060005F0054000100010053005E005D0008 +:1005D0005C0001000100010001005B005A005900AD +:1005E00001000100010001005800630062000100E9 +:1005F0000100010001003A003B003C003D003E00CC +:1006000001000100010001000100010001000100E2 +:1006100001000100010001000100010001000100D2 +:1006200001000100010001000100010001000100C2 +:1006300001000100010001000100440043004200EC +:10064000410040003F0001004500010001000100A1 +:10065000DE5C010001000100010001000100C25C3C +:1006600001000100C95CC75CC55CCB5CC35C0100D8 +:100670000100CA5CC85CC65CCC5CC45C01000100C3 +:1006800009025B00030100A0FA0904000001030154 +:100690000100092111010001224000070581030822 +:1006A000000A0904010002030000000921110100F1 +:1006B0000122220007058203200001070503032011 +:1006C00000010904020001030000000921110100DA +:1006D00001227B000705840320000A1201000200AA +:1006E00000000801F902F901000102000110035A9B +:1006F000006F0064006900610072006B000000146C +:100700000341006C00650062006C0061007A0065C6 +:100710000072000000040309040011241FBECFEF83 +:10072000DAE0DEBFCDBF04B603FE27C08091C70369 +:100730009091C803A091C903B091CA038730904B30 +:10074000A740B04BD1F41092C7031092C803109287 +:10075000C9031092CA0314BE84B7877F84BF0FB643 +:10076000F894A89580916000886180936000109251 +:1007700060000FBEE0E0F8E3099511E0A0E0B1E011 +:10078000E8ECFDE502C005900D92A83EB107D9F74F +:1007900023E0A8EEB1E001C01D92A73CB207E1F74B +:1007A0000E944F250C94AB2E0C940000E8EDF0E075 +:1007B00080818E7F80831092E2001092DA00109286 +:1007C000E100A0EEB0E08C9181608C9380818F7706 +:1007D000808319BCA7EDB0E08C918E7F8C938081D3 +:1007E0008F7E80831092AC0308952091E4003091B5 +:1007F000E50095E6A9012091EC00822F817020FF91 +:1008000006C08091E80080FF06C080E00895209136 +:10081000E80022FD1AC08091B903882389F0853051 +:1008200089F08091EB0085FD0FC02091E4003091AC +:10083000E50042175307F9F29150E1F684E008957C +:1008400082E0089583E0089581E00895EF92FF9299 +:100850000F931F93CF937C018B010E94F503C82F48 +:10086000811117C08091E80085FD0BC08091E800E0 +:100870008E778093E8000E94F503882399F3C82FB0 +:1008800008C0F70181917F018093F10001501109A7 +:1008900049F78C2FCF911F910F91FF90EF90089502 +:1008A0008091BB0387FF13C08091E80082FF06C0E0 +:1008B0008091E8008B778093E80004C08091B903B1 +:1008C0008111F2CF08958091B9038823D9F38091E3 +:1008D000E80080FFF8CF8091E8008E77ECCF982F6A +:1008E0009093E900242F762F50E0891731F0709112 +:1008F000EC002091ED005091F00021FD07C09F5FBA +:10090000973071F78093E90081E008953091EB0012 +:100910003E7F3093EB003091ED003D7F3093ED0052 +:100920003091EB0031603093EB007093EC0020933A +:10093000ED005093F0002091EE0027FDE0CF80E025 +:100940000895CF92DF92EF92FF920F931F93CF9370 +:10095000DF93C8EDD0E088818F7E8883E7EDF0E0FB +:1009600080818160808384E082BF81E08093AC03DA +:1009700088818E7F888302EE10E0F8011082109249 +:10098000DA0081EEC82ED12CF601108288818F7793 +:10099000888388818068888388818F7D888319BC5B +:1009A0001092B9031092BA031092B8031092B703D1 +:1009B00090EEE92EF12CF70180818B7F8083888176 +:1009C0008160888342E060E080E00E946F04F6016D +:1009D00080818E7F8083F801808181608083808127 +:1009E00088608083F70180818E7F80838881806129 +:1009F0008883DF91CF911F910F91FF90EF90DF904F +:100A0000CF900895FC018091C1039091C203861795 +:100A10009707A0F06115710529F49091E8009E7781 +:100A20009093E80090E06115710551F4911108C0B0 +:100A30008091E80082FF34C080E00895BC01F2CFCD +:100A40008091B9038823C1F18530C1F18091E8001C +:100A500083FD30C08091E80082FDEACF8091E800FC +:100A600080FFE1CF8091F3002091F200382F6115D3 +:100A7000710519F02830310558F091E02830310522 +:100A800009F090E02091E8002E772093E800CBCF8A +:100A900081918093F100615071092F5F3F4FE7CF43 +:100AA0008091B903882341F0853041F08091E800BE +:100AB00083FFBECF81E0089582E0089583E008952A +:100AC00008958091AE03089587E797E79093010812 +:100AD0008093000888E19AE00FB6F894A895809377 +:100AE00060000FBE90936000FFCF9C014FB7F89459 +:100AF0008091A5039091A603A091A703B091A803AC +:100B00004FBF821B930B08952FB7F8946091A503F4 +:100B10007091A6038091A7039091A8032FBF089519 +:100B20002FB7F8948091A5039091A603A091A703F5 +:100B3000B091A8032FBF08959C01FC0132969FEF4E +:100B400080E04191461751F09F3F19F4411101C0D7 +:100B5000982F8F5F8630A9F79F3F09F40895290FDA +:100B6000311D97FD3A95F901628308952091A20302 +:100B70003091A3032817390771F09093A303809352 +:100B8000A203E091A003F091A103309721F000842B +:100B9000F185E02D0994089520919E0330919F03E3 +:100BA0002817390771F090939F0380939E03E0917B +:100BB000A003F091A103309721F00680F781E02D8A +:100BC00009940895FC01680F791F8FEF91E321913B +:100BD000822728E030E087FF09C0880F892721504D +:100BE0003109C9F7E617F70791F70895880FF7CF8E +:100BF000FA01811101C0FB0109940895E7ECF2E0CC +:100C00001182828184608283089580919903982F54 +:100C10009E7F61F4817082608093990380919C0330 +:100C20008B3A18F08AEA80939C0308958A34B0F3D3 +:100C300081708864F1CFAF92BF92DF92EF92FF9202 +:100C40000F931F93CF93DF93082F162FE901E42F03 +:100C5000F0E0E55BFD4F611110C0E4915E2F4E2F77 +:100C60004983E8835A83DF91CF911F910F91FF90C1 +:100C7000EF90DF90BF90AF900895E62EF12C449155 +:100C8000D42EE42FF0E026E0829FC00111242FEF44 +:100C900030E0B9010E94AC2D802F90E0880F991FA1 +:100CA00055E5569FD001579FB00D11248A1B9B0B11 +:100CB000982F990F890F5901AE18BF08AE9ED00129 +:100CC000AF9EB00DBE9EB00D11245B2F189F80010A +:100CD0001124012F11275901A01AB10AAE9E8001DB +:100CE000AF9E100DBE9E100D11245901A81AB10817 +:100CF000AE9CC001AF9C900DBE9C900D1124892F1D +:100D00009927281B390B2E9FC0012F9F900D3E9FC6 +:100D1000900D1124E92F62307105A1F050F4611596 +:100D2000710509F49DCF6130710581F0EB2F512FD2 +:100D300097CF6430710569F080F06630710509F471 +:100D40008FCFF4CFE42F4B2F592F8ACFE42F412F91 +:100D500087CFEB2F542F492F83CF4B2F5D2DE12FC2 +:100D60007FCF0E9490059C019091BD028091BE02B0 +:100D7000982B21F03093BA022093B9029091BF02D0 +:100D80008091C002982B21F03093B8022093B702D3 +:100D9000E091A003F091A103309749F082E08093A5 +:100DA000BB020480F581E02D8BEB92E0099408955D +:100DB0004091BD02803F59F48091BE0287FF0DC073 +:100DC0001092BE0241110BC01092B50208C0813FC3 +:100DD00081F48091BE0218169CF3442381F0809127 +:100DE000BF029091C002892B09F05AC01092B40240 +:100DF0000895823F49F447FFF0CF1092BD028091E1 +:100E0000BE028111ECCFE0CF833F19F41416ACF38E +:100E1000E4CF9091BF02893F29F41916F4F610929D +:100E2000BF02DBCF8A3F19F497FFD7CFF8CF90915D +:100E3000C0028B3F29F497FFD0CF1092C002CDCFD4 +:100E40008C3F19F41916CCF3C8CF9CE0980F95305D +:100E500090F4845F990B21E030E0B90102C0660F85 +:100E6000771F8A95E2F7CB0180959091BC02892388 +:100E70008093BC02B2CF8D3F31F48091B6028E7F59 +:100E80008093B602AACF8E3F21F48091B6028D7F67 +:100E9000F7CF8F3F09F0A1CF8091B6028B7FF0CFC3 +:100EA00008958091B60280FD16C081FD16C082FDB6 +:100EB00016C08091B4028823A1F0883280F428E023 +:100EC000829FC001112468E270E00E94C02D862F2D +:100ED000672B39F0089582E0089584E0089588E052 +:100EE000089581E008958091B60280FD14C081FDCF +:100EF00014C082FD16C08091B502882381F0843130 +:100F000080F422E3829FC001112464E170E00E941A +:100F1000C02D862F08958CE0089589E1089585E01D +:100F2000089582E30895803F31F40E94730781950C +:100F30008093BE020895813F19F40E947307F8CF91 +:100F4000823F31F40E94730781958093BD0208951A +:100F5000833F19F40E947307F8CF893F29F40E9458 +:100F600051078093BF0208958A3F21F40E945107E0 +:100F70008195F7CF8B3F31F40E9451078195809383 +:100F8000C00208958C3F19F40E945107F8CF9CE0ED +:100F9000980F953070F4845F990B21E030E001C028 +:100FA000220F8A95EAF78091BC02822B8093BC02C3 +:100FB00008958D3F31F48091B60281608093B6022E +:100FC00008958E3F21F48091B6028260F7CF8F3F63 +:100FD000B9F78091B6028460F1CF80E008957894EB +:100FE0000895F894E82FE295EF70F0E031A1282FF2 +:100FF0002F7081E090E001C0880F2A95EAF7982FC2 +:101000009095932391A392A1892B82A30C94EF072F +:101010009091860292FF06C0282F28712830F9F49B +:10102000877F846093FF06C0282F28712831F1F450 +:10103000877E84612091870220FF06C0382F387197 +:101040003830D9F4877F816021FF06C0282F2871AE +:101050002831D1F4877E816194FD877E0895282F01 +:1010600024712430F9F68B7F8860DCCF282F24711F +:10107000243101F78B7E8861DDCF382F317131301B +:1010800019F78E7F8860E0CF282F2171213121F759 +:101090008E7E8861E1CFCF93DF93EC01823891059A +:1010A000A9F1D8F58133910509F496C048F5893244 +:1010B000910509F48AC08A9709F495C0C11521E504 +:1010C000D20708F0BCC0C11530E5D30708F014C141 +:1010D000C83ED10508F09CC0C03ED10560F5C83AB5 +:1010E000D10508F087C0C53AD10508F0FDC0C13070 +:1010F000D10509F12097F9F0C430D105E0F440C0E2 +:101100008533910509F45AC0C997C1F680918602CA +:10111000837089F0C0EED0E00EC0833E910599F156 +:1011200070F4803E910501F1823E910539F680917F +:10113000860282FD21C0CE01DF91CF910895863EC7 +:10114000910561F1873E910571F1843E910509F0A9 +:10115000B5CF8091870281FFEECF80918602C7EEE6 +:10116000D0E084FD0DC0E7CF8091860280FD12C1E2 +:101170009091870290FFDFCFC3EED0E084FFDBCFFA +:10118000D0E0C0E0D8CF8091860282FD06C1909168 +:10119000870290FDBFCF84FFCECFF2CF8091860231 +:1011A00083FDDDCFC8CF8091860283FDF9C0909189 +:1011B000870291FFF0CFC4EED0E0BDCF80918602D0 +:1011C00085FFB9CFC9E2D0E0B6CF8091860285FF16 +:1011D000B2CFC5E3D0E0AFCF8091860286FFABCF20 +:1011E000CAE2D0E0A8CF8091860286FFA4CFC1E3F7 +:1011F000D0E0A1CFCF3BD10518F6C85AD0E0CC0F34 +:10120000DD1FCE59DE4F0990D881C02DD46493CF15 +:10121000C11540E2D40758F4C11581E0D80708F0A1 +:101220008ACFC03FD10508F4ABCFD06584CFC115BC +:1012300090E4D90708F4A4CFDF70D06A7CCFC11541 +:1012400025E5D20700F5C11534E5D30708F08AC0BB +:10125000C11543E5D40708F071C0C11582E5D80770 +:1012600008F467C0CE018370992721E030E002C006 +:10127000220F331F8A95E2F7C695C69580E2C89F74 +:10128000E001112452C0C11599E5D907A8F4C11590 +:1012900028E5D20708F06BC0C11536E5D30708F082 +:1012A0006FCF8C2F0E940808C82FD0E0DC2FCC27EE +:1012B000CC27DF71D0623FCFC1154AE5D40708F4CF +:1012C0005BC0CE0190568115904208F059CF8D2F0A +:1012D0008F710E94080890E0982F882788279F71B7 +:1012E0009C012C2BE901E6CFC55AD0E0C15ADE4F54 +:1012F000C881D0E0D0641FCFCE01E4E096958795F9 +:10130000EA95E1F783702C2F26952695237040E20D +:10131000249F90011124382B8C2F8370C1E0D0E0E2 +:1013200002C0CC0FDD1F8A95E2F7C22BD32BDC68FD +:1013300002CFDC2FCC27C16FD06AFDCECE018370E7 +:10134000992721E030E002C0220F331F8A95E2F78F +:10135000C695C69590E2C99FE0011124C22BD32BFC +:10136000DA68E9CEDC2FCC27C46FD06AE4CEDC2F5C +:10137000CC27C06FD06ADFCE8C2F8F700E940808F8 +:1013800034E0D695C7953A95E1F7CF709C2FEC01E4 +:10139000D069D1CEC9E3D0E0CECEC2EED0E0CBCE84 +:1013A000C6EED0E0C8CE0C94840580914B0281112A +:1013B00010924B020895809590914A029823909341 +:1013C0004A02089580914A0290914902892B909196 +:1013D0004802892B8093EA0190914B02992391F066 +:1013E000892B8093EA0120E08CEE91E0FC013191A1 +:1013F000CF0131112F5FF1E0823F9F07B9F7211133 +:101400000E94D509E091A003F091A103309731F03B +:101410000280F381E02D8AEE91E009940895809195 +:10142000460290911502981301C008958F5F87704E +:10143000FACF27E0929F800D1124982F9770869500 +:101440008695869523E0829FF0011124EC50FE4F93 +:1014500050E040E080E0219130E0092E02C0369556 +:1014600027950A94E2F721703327042E01C0220F3A +:101470000A94EAF7822B4F5F5F4F4330510559F7CB +:10148000089527E0929F800D1124982F977041E0D6 +:1014900001C0440F9A95EAF786958695869593E064 +:1014A000899FF0011124EC50FE4F90E080E070E045 +:1014B0005191DF0111979B01082E02C036952795A7 +:1014C0000A94E2F7217021952527242325272C93C0 +:1014D00001968330910561F7089590E080E00E94C5 +:1014E000CC0590E080E00E94B6051092490210926F +:1014F00048020E94E20986E0EBEBF2E0DF011D9278 +:101500008A95E9F71092B5021092B4021092B602D1 +:101510000C94B1068093C6030C946D0A8091C603A7 +:10152000982F9670963019F488600C948A0A877FF9 +:10153000FCCF21E030E001C0220F8A95EAF7209528 +:101540008091C60382230C948A0A90914702809569 +:10155000892380934702282F277091F4282F082E83 +:10156000000C330B9217130659F09091870292FDED +:1015700007C08595859585950E94990A1092470226 +:10158000089521E030E001C0220F8A95EAF78091AA +:10159000C603822B0C948A0A80934C020C946D0A29 +:1015A000882321F00E94DB090C94E2090895882326 +:1015B00039F090914A02982B90934A020C94E209D8 +:1015C00008958823B1F19CEF980F913A70F4ECEEF6 +:1015D000F1E09191891303C0DF0111971C9291E012 +:1015E000E23FF907B1F70C94E20990E2980F9830C6 +:1015F00050F4877091E001C0990F8A95EAF7892F1E +:101600000E94DB09F0CF9BE5980F933020F490E027 +:1016100080E00C94CC0598E5980F973120F490E089 +:1016200080E00C94B605803F20F00E94D8060C9410 +:10163000B1060895CF93C82F882309F456C08CEFC4 +:101640008C0F813AF8F4ECEEF1E082EF91E0DF01EB +:101650002D91C21759F08A179B07D1F76C2F8AEE8C +:1016600091E00E949C05CF910C94E2092191C21354 +:1016700003C0DF0111971C928E179F07B9F70E94D4 +:10168000E209ECCF80E28C0F883068F4C77021E06B +:1016900030E001C0220FCA95EAF780914A02822BFE +:1016A00080934A02E0CFEBE5EC0FE33040F4F0E04A +:1016B000E15AFE4F808190E0CF910C94CC05E8E593 +:1016C000EC0FE73150F4F0E0EE0FFF1FEE59FE4F44 +:1016D00080819181CF910C94B605C03F30F08C2F62 +:1016E0000E949307CF910C94B106CF9108958093F7 +:1016F000A9037093AB036093AA038091B90384306C +:10170000F9F48093E9008FEF9091E800815095FD06 +:1017100006C095ED9A95F1F700008111F5CF809103 +:10172000E80085FF0DC050E040E063E070E089EA2A +:1017300093E00E9426048091E8008E778093E80071 +:101740000895BC0184E00C94770BBC0183E00C94F9 +:10175000770B9C0184E08093E9009FEF8091E80083 +:10176000915085FD06C085ED8A95F1F70000911135 +:10177000F5CF8091E80085FF0CC050E040E066E0C6 +:1017800070E0C9010E9426048091E8008E77809362 +:10179000E8000895CF93DF93EC0181E08093E900A6 +:1017A0008FEF9091E800815095FD06C095ED9A95D8 +:1017B000F1F700008111F5CF8091E80085FF14C09A +:1017C00050E040E068E070E0CE010E942604809185 +:1017D000E8008E778093E80088E0FE01AFEAB3E08E +:1017E00001900D928A95E1F7DF91CF910895609174 +:1017F0005A018091990380FF20C08091590143E0F4 +:10180000849FC001112483539D4F259A25B12F7DBC +:1018100035B130625FB7F894FC01649FE00DF11DB3 +:101820001124BF0168177907D1F45FBF8FE594E0F9 +:101830000197F1F700C00000089580915B0190913D +:101840005C0123E0829FF0011124E353FD4F8917CF +:10185000A0F61182108212828F5F3396F8CFFC01BE +:101860004191CF01E8E035B9000000C047FF25B93C +:10187000440F000000C000C000C025B900C0EA95B8 +:1018800091F7D0CF0F931F93CF93DF93EC0110E02C +:1018900000E090915D019017110609F06CF40E9430 +:1018A000F70B8C8190E00196817099278C83DF91F2 +:1018B000CF911F910F91089520915B01A801420FD4 +:1018C000511D9A01220F331F240F351F23533D4F03 +:1018D0004C8160919B0380919A0396959017110615 +:1018E00069F064F0442361F040919C034B3A08F0A6 +:1018F0004AEA0E941B060F5F1F4FCBCF4423A1F380 +:1019000040E0F7CF8F929F92AF92BF92CF92DF923B +:10191000EF92FF920F931F93CF93DF93EC014C81D3 +:10192000042F10E09801D8010E940B2E9B01AC01FE +:101930000E94212E4B015C01E0E2F0E0E01BF10B84 +:10194000A5E5B0E0AC019B010E94212E6B017C015A +:101950009F01DF010E94032E9B01AC010E942C2EEF +:101960009B01AC01280D391D4A1D5B1DC701B60145 +:101970000E94D42DF22E822F90E039E23F1560F1C3 +:1019800043E0249F9001112435952795122F10953F +:1019900000E085E5E82EEF1880915D01081758F109 +:1019A0000E94F70B9C8181E0992319F0903219F481 +:1019B0008FEF8093580180915801890F8C83DF91BC +:1019C000CF911F910F91FF90EF90DF90CF90BF903C +:1019D000AF909F908F90089525E530E0B901681B86 +:1019E000790B9B01220F331F260F371F37FFCCCFF8 +:1019F0002F5F3F4FC9CF8E2D01FD8F2D20915B01B1 +:101A0000622F600F7727771F9B01220F331F260F4E +:101A1000371F23533D4F412F1B3A08F04AEA60918C +:101A20009B030E941B060F5FB7CFEF92FF920F93AD +:101A30001F93CF93DF93EC018C81811109C081E06A +:101A40008C831092CB0292E09093570180935601C1 +:101A500080915B0190915C0123E0829FF001112451 +:101A6000E353FD4F891768F110E003E060915D01D9 +:101A7000161768F10E94F70B809156012091CB0256 +:101A8000280F2093CB0290915701980F9093570104 +:101A9000191654F4022E000C330B40915D01415095 +:101AA000550B2417350734F081958093560181300A +:101AB00009F41C82DF91CF911F910F91FF90EF905D +:101AC00008951182108212828F5F3396CBCFE12E60 +:101AD000F12C70E0C7010E94C02D20915B01820FA4 +:101AE000482F50E02091CB02022E000C330BE2165F +:101AF000F306D4F020915701022E000C330B2E1563 +:101B00003F0594F0809F9001112423533D4F409155 +:101B10009C034B3A08F04AEA60919B0380919A0338 +:101B20000E941B061F5FA2CFFA01EE0FFF1FE40FFA +:101B3000F51FE353FD4F118210821282F3CF8F9273 +:101B40009F92AF92BF92CF92DF92EF92FF920F934C +:101B50001F93CF93DF93EC018A81BB24BA9480FD5D +:101B600002C0BB24B394A0905D018C81811109C097 +:101B700081E0B81228C08FEF8A0D8093CA0281E0FD +:101B80008C83F12CE12C44E4842EEA14F8F00E94BA +:101B9000F70B8091CA0291E0B91262C081115BC05B +:101BA00080915D0181508093CA021C82DF91CF91A8 +:101BB0001F910F91FF90EF90DF90CF90BF90AF906B +:101BC0009F908F9008951092CA02D9CF00915B0127 +:101BD0000E0D1F2D111DC801880F991F080F191F09 +:101BE00003531D4FF80111821082128234E0C32E7C +:101BF000D12C912C8091CA02890D853444F1682D35 +:101C00000E949E2D892F082E000C990B8E159F0582 +:101C1000A9F480919C038C9DA0018D9D500D1124F1 +:101C200055954795559547954B3A08F04AEA9801DE +:101C300060919B0380919A030E941B069B0CF1E02C +:101C4000CF1AD108B9F68FEFE81AF80A9ECF87FFAE +:101C5000DACF8A0DD8CF81508093CA02BC82A6CF3A +:101C600090E0019660915D0170E00E94C02D80932C +:101C7000CA028C839BCFEF92FF921F93CF93DF9387 +:101C8000EC0110E0EE24EA94F12C60915D0116174E +:101C900070F00E94F70B9A818C8190FF2AC08F5FB1 +:101CA0008C83DF91CF911F91FF90EF900895209149 +:101CB0005B01422F410F5527551FCA019A01220F80 +:101CC000331F280F391F23533D4F40919C034B3A3C +:101CD00008F04AEA70E0C7010E94C02D962F8C815F +:101CE00060919B03199F800D11240E941B061F5FAA +:101CF000CCCF8150D5CF9091990390FF14C0909193 +:101D00005B0120915C0133E0939FF0011124E353C8 +:101D1000FD4F921710F00C94F70B81836083428380 +:101D20009F5F3396F6CF08950F931F93CF93DF9362 +:101D300000D00F92CDB7DEB78C018091CC0281111B +:101D40000AC09E012F5F3F4F4AEA6FEF0E941B06B9 +:101D50008A818093CC02F8016481613069F08091BE +:101D6000CC0240E0662361F040E0623011F4409123 +:101D7000CC0280E060E004C06091CC0240E080E0F2 +:101D80000E947B0EF801848190E0019663E070E090 +:101D90000E94C02D84830F900F900F90DF91CF9100 +:101DA0001F910F910895CF93DF9300D00F92CDB77D +:101DB000DEB79091990390FF0DC04B3A08F04AEAC4 +:101DC0009E012F5F3F4F0E941B064B8169818A81D4 +:101DD0000E947B0E0F900F900F90DF91CF9108958E +:101DE000CF93DF93EC01E9E9F3E0438162818C81D9 +:101DF0000E94D30E8C818F5F8C83DF91CF910895E9 +:101E0000CF93DF93EC01EC81F0E0E05BFC4F449179 +:101E1000E9E9F3E0628181810E94D30E8C818F5FBA +:101E20008C83DF91CF910895E9E9F3E080818E7F83 +:101E300080830E94FE05E7ECF2E08281816082836C +:101E40002FEF80E792E0215080409040E1F700C002 +:101E500000000C94F70B9F92AF92BF92CF92DF924B +:101E6000EF92FF920F931F93CF93DF937C015B015F +:101E70006A018091810201E010E08A3010F40AE0EA +:101E800010E0C1E0D0E0F894B501C701F601099572 +:101E9000982E0E94EF07911004C021960C171D0781 +:101EA0006CF4892DDF91CF911F910F91FF90EF90EE +:101EB000DF90CF90BF90AF909F900895CC9F9001FE +:101EC000CD9F300D300D112490E080E045E34A9520 +:101ED000F1F70000019682179307C1F7D4CF8091E4 +:101EE0005702811110C08091D80080618093D80082 +:101EF0008AE18A95F1F700C08091D90080FF0AC07D +:101F000081E08093570281E090915702913009F06F +:101F100080E0089582E0809357020E94D6031092D9 +:101F2000B903F1CF0E946F0F882351F0E091A00315 +:101F3000F091A103309721F00190F081E02D0994F8 +:101F400080E008950F931F930E946F0F882321F064 +:101F50001F910F910C9484050E94840500918202C8 +:101F6000109183022091840230918502600F711FCD +:101F7000821F931F1F910F9108950E946F0F81116F +:101F80000C9490050E94A20FCB0108951F93CF934C +:101F9000DF93182FD0E0C0E0893311F4C0E5D0E022 +:101FA000812F0E941A0B209731F4812FDF91CF915E +:101FB0001F910C94E10A8FE99FE00197F1F700C0AF +:101FC00000002197F0CF0F931F93CF93DF93C62F7D +:101FD000D42F022FFC0182818823A1F06093C503D6 +:101FE0000E9490059093C4038093C303C77081E05F +:101FF00001C0880FCA95EAF7DF91CF911F910F9129 +:102000000C94D70A8091C503681335C08091C3032F +:102010009091C4030E947505883C910560F510E21B +:102020001D0FCD17B9F080E28C0F883040F4C770D7 +:1020300081E001C0880FCA95EAF70E94D00A1830E3 +:1020400048F481E09D2F977001C0880F9A95EAF7B8 +:102050000E94D70A802F0E94C60F183098F4D770BC +:1020600081E001C0880FDA95EAF7DF91CF911F91E7 +:102070000F910C94D00AC77081E001C0880FCA95F7 +:10208000EAF7F3CFDF91CF911F910F910895CF938E +:10209000DF93C7E5D2E060E0CE010E94542E219686 +:1020A000C11584E0D807B9F7DF91CF9108956F92F9 +:1020B0007F928F929F92AF92BF92CF92DF92EF92D8 +:1020C000FF920F931F93CF93DF9380E5C82E84E098 +:1020D000D82E91ECE92EF12CE701CC58D10936012C +:1020E0001BC0F50185909490692DC8010E94542E63 +:1020F000682DC80101960E94542E82E0A80EB11CE2 +:102100000E5F1F4FC017D10761F78EE0680E711C7C +:102110002E96CE15DF0529F08E010E5011095301C0 +:10212000E0CF7E018CE8E80EF11C8CE8C80ED11CD3 +:1021300081EFE81682E0F80679F6DF91CF911F91E2 +:102140000F91FF90EF90DF90CF90BF90AF909F9056 +:102150008F907F906F900895CF93C82F6FEF81116C +:1021600061E283E290E00E94542E6FEFC11161E1C1 +:1021700084E290E00E94542E6FEFC11160E385E28B +:1021800090E0CF910C94542E80E00E94AC1060E05F +:1021900086E290E00E94542E0E9457100E94471041 +:1021A00081E00C94AC10CF93C0918702C2FB9927B9 +:1021B00090F9981799F080FBC2F9C093870260915B +:1021C000860284E090E00E94542E6C2F82E290E020 +:1021D0000E94542E82E0CF910C94A50ACF910895CD +:1021E0000F931F93CF93DF93C42FD0E0CC0FDD1F4D +:1021F0002EE0629FC00DD11D11243CE8839FC00DCD +:10220000D11D1124CE0187960E94402E082F10E088 +:10221000102F0027CE0188960E94402E9801282B6F +:10222000C901DF91CF911F910F910895462F8430FE +:1022300038F47A3028F4673018F4672F0C94F010D3 +:1022400090E080E00895CF92DF92FF920F931F936A +:10225000CF93DF936C010091C60380914C02082B51 +:10226000C7E0D0E010E0FC2EC8010C2E02C095950E +:1022700087950A94E2F780FD0CC02197A0F7F12C16 +:102280008F2DDF91CF911F910F91FF90DF90CF9015 +:102290000895B6018C2F0E9416110E944B080197D9 +:1022A00061F3EECFCF93DF93EC010E942311BE01C7 +:1022B0000E941611DF91CF910C944B08FC01808194 +:1022C00091810E945211292F2F7092959F709250E8 +:1022D0009E3078F4E92FF0E0E355F14D0C94F62DA3 +:1022E000803F19F020F4883E20F481E00895843F77 +:1022F000E1F380E00895883EC0F3813FD1F7F5CF48 +:10230000822F869586958695089583E290E00E94B7 +:10231000402E813289F484E290E00E94402E813187 +:1023200059F485E290E00E94402E91E0803309F05C +:1023300090E0892F8170089580E0FCCFCF9384E0F6 +:1023400090E00E94402EC82F82E290E00E94402E32 +:10235000982F8C2FCF91089560919903669570E026 +:102360004BE050E08BE491E00E94882E892B19F419 +:1023700081E08093C8020E94BD0F9093C2028093B7 +:10238000C1028091C90284608093C9020895CF92EE +:10239000DF92EF92FF926B017C010E940506B7016C +:1023A000A60188E090E0FF90EF90DF90CF900C9432 +:1023B000662EAF92BF92CF92DF92EF92FF920F9371 +:1023C0001F93CF93DF9300D00F92CDB7DEB7082FC6 +:1023D000F62E142FE22E9091990390FF3FC0E92F23 +:1023E000E695AE2FB0E0AD54BE4F8C918093C702FE +:1023F0009E7F923009F040C04B3A08F04AEA9E01B5 +:102400002F5F3F4F6F2D802F0E941B064B816981EC +:102410008A810E947B0E80919A03801308C080916C +:102420009B038F1104C080919C03811729F0809138 +:10243000C90282608093C90200939A03F0929B03C1 +:1024400010939C03EE2051F06091990370919A03D0 +:1024500080919B0390919C030E94C7110F900F9055 +:102460000F90DF91CF911F910F91FF90EF90DF9030 +:10247000CF90BF90AF900895823019F410919C03D3 +:10248000CACF863019F400919A03C5CF8930D9F3A9 +:10249000893109F6E9518E2F8170D82EE695F0E04A +:1024A000E55BFC4FA590B490C12CBB2460915D010D +:1024B000C61618F00E94F70BAECF2C2D30E0A29E6E +:1024C000C001A39E900DB29E900D112470E00E9459 +:1024D000AC2D802FD11016C0860F40915B01420FAA +:1024E000532F511D9A01220F331F240F351F2353E1 +:1024F0003D4F412F1B3A08F04AEA6F2D0E941B0600 +:10250000C394D4CF861BE9CFE9E9F3E0438128E007 +:10251000421B08F440E021E0628181810C94D911D2 +:10252000E9E9F3E0438128E0420F08F44FEF21E0AE +:10253000628181810C94D911E9E9F3E0628128E09C +:10254000621B08F460E021E0438181810C94D91181 +:10255000E9E9F3E0628128E0620F08F46FEF21E01F +:10256000438181810C94D911E9E9F3E0818121E073 +:102570004381628188500C94D911E9E9F3E08181AB +:1025800021E043816281885F0C94D91180919D0381 +:10259000882319F0815080939D0360919903709175 +:1025A0009A0380919B0390919C030C94C711809196 +:1025B0009D03833018F48F5F80939D03609199038E +:1025C00070919A0380919B0390919C030C94C71186 +:1025D0009091990390FF3BC0917081112EC0926041 +:1025E000909399038091C90281608093C902662308 +:1025F00051F06091990370919A0380919B0390919F +:102600009C030E94C71160919903669570E04BE0AE +:1026100050E08BE491E00E94882E892BA9F00E9463 +:10262000FE0581E08093C40220E040919C0360910C +:102630009B0380919A030C94D911853210F0986411 +:10264000CFCF880F982BCCCF0E94AC11EACF089542 +:10265000809199038695815009F484E261E00C949D +:10266000E8128091990386958F5F853208F081E0AA +:1026700061E00C94E8129091990390FF07C0969541 +:10268000981720F0961710F40C94311361E00C9415 +:10269000E812E9E9F3E083E0808311828FEF82831F +:1026A0008AEA83831482A7ECB2E012968C91129787 +:1026B000836012968C9360817181828193810C94E6 +:1026C000C71110924A02ECEEF1E086E0DF011D92A4 +:1026D0008A95E9F70C946D0A1F93CF93DF93CDB7DA +:1026E000DEB7AA970FB6F894DEBF0FBECDBF8BEB57 +:1026F00093E02091F100DC012D93CD01B3E0833C08 +:102700009B07B9F78091BC03833009F472C0B8F419 +:10271000813009F449C0823009F4B3C08091E800E7 +:1027200083FF8BC28091BB039091BC039A3008F069 +:1027300084C2E92FF0E0E554F14D0C94F62D8A3077 +:1027400009F48EC08B3009F471C0893039F780915B +:10275000BB03813219F78091BF039091C0030097AA +:1027600011F00297D9F68091E800877F8093E80006 +:102770008091E80082FF38C09091F3008091F200D0 +:10278000029731F48091F100813011F0863021F40C +:102790008091F1008093AE038091E8008B77809365 +:1027A000E8000E945004BACF8091BB03813A09F03F +:1027B000B5CF8091E800877F8093E8008091BF03C8 +:1027C0009091C003892B61F468E08FEA93E070E098 +:1027D0000E9402058091E8008B778093E8009ECFED +:1027E00060E090E080E0F3CF8091B9038111C0CF29 +:1027F00095CF8091BB03813A09F090CF8091BF03C0 +:102800009091C003892B09F089CF8091E800877FE0 +:102810008093E8008091E80080FFFCCF80915E010A +:102820008093F1008091E8008E77B9CF8091BB034F +:10283000813209F073CF8091BF039091C003892B3F +:1028400009F06CCF8091E800877F8093E8000E94B8 +:1028500050048091BD0380935E010E9461135ECF9E +:102860008091BB03813209F059CF8091E800877FC6 +:102870008093E8000E9450048091BE038093AD03D2 +:102880004DCF8091BB03813A09F048CF8091E80099 +:10289000877F8093E8008091E80080FFFCCF8091E3 +:1028A000AD03BECF803899F0823809F0C6C180915F +:1028B000BF038F70873008F0C0C18093E90080911A +:1028C000EB0085FB882780F91092E90006C0809113 +:1028D000B7039091B803911182609091E800977FBF +:1028E0009093E8008093F1001092F1008091E8004D +:1028F0008E779FC1882309F48DC1823009F09DC174 +:102900008091BD03811190C18091BF038F702FEF23 +:10291000280F263008F091C18093E9002091EB0048 +:1029200020FF82C1933031F48091EB00806280936C +:10293000EB007AC19091EB0090619093EB0021E065 +:1029400030E001C0220F8A95EAF72093EA00109246 +:10295000EA008091EB008860EACF81116EC110918E +:10296000BD031F778091E3008078812B8093E30083 +:102970008091E800877F8093E8000E945004809156 +:10298000E80080FFFCCF8091E30080688093E30043 +:1029900082E0111183E08093B9034FC180588230E7 +:1029A00008F04BC12091BD033091BE032C3DE3E004 +:1029B0003E07A1F583E08A838AE289834FB7F894C2 +:1029C000DE01139620E03EE051E2E32FF0E0509369 +:1029D0005700E49120FF03C0E295EF703F5FEF7076 +:1029E0008E2F90E0EA30C0F0C7968D939D932F5FB5 +:1029F000243159F74FBF8091E800877F8093E8002A +:102A00006AE270E0CE0101960E9402058091E80022 +:102A10008B778093E80011C1C096E7CF8091BF0308 +:102A20009091C003432F55274330510509F44AC004 +:102A300078F54130510509F47AC08BE590E0E0E883 +:102A4000F6E04230510509F0F8C02091E800277FF8 +:102A50002093E8002091C1033091C20382179307AD +:102A600008F49C0140E02115310509F065C04111D1 +:102A700063C08091E80082FDC9CF8091B9038823AB +:102A800029F2853019F28091E80083FFF2CFBECFA2 +:102A90004132510509F43CC04232510509F0CDC024 +:102AA0008330910508F0C9C0FC01EE0FFF1FE5520D +:102AB000FE4F0190F081E02D88529E4FDC018C91F9 +:102AC00090E01AC0332721303105D1F021153105AE +:102AD00061F02230310509F0B0C0EDEEF6E0E4918E +:102AE0008E2F90E0EDEEF6E007C0E5E1F7E0E4912F +:102AF0008E2F90E0E5E1F7E0009709F49EC0A5CFA6 +:102B0000EFEFF6E0E4918E2F90E0EFEFF6E0F4CFF8 +:102B10008330910508F091C0880F991FFC01EF5197 +:102B2000FE4F0190F081E02D89E090E08ECF82E1B0 +:102B300090E0EBEDF6E089CF8091B903882309F4AA +:102B400065CF853009F462CF8091E80083FD5ECFC8 +:102B50008091E80082FD8DCF8091E80080FF83CFD7 +:102B60009091F3008091F2002115310519F0883021 +:102B7000910550F041E0089709F040E08091E800AD +:102B80008E778093E8006FCF44914093F1003196A7 +:102B9000215031090196E8CF803809F04EC080916C +:102BA000E800877F8093E8008091BA038093F1006A +:102BB0009DCE811142C01091BD031230F0F580917D +:102BC000E800877F8093E8001093BA030E945004C6 +:102BD000112311F084E005C08091E30087FDFACF56 +:102BE00081E08093B90342E061EC81E00E946F04D0 +:102BF00042E261EC84E00E946F0442E261EC82E018 +:102C00000E946F0442E260EC83E00E946F048091B6 +:102C1000B90313C08091BD03813079F481E0933012 +:102C200009F080E08093B8031092E9008091E800F9 +:102C3000877F8093E8000E9450048091E80083FF22 +:102C40000AC08091E800877F8093E8008091EB00C4 +:102C500080628093EB00AA960FB6F894DEBF0FBE99 +:102C6000CDBFDF91CF911F91089569EE7EEF90E087 +:102C700080E00E94722E60E082E090E00E94542E7C +:102C800060E083E090E00E94542E10924C0260E0DD +:102C900084E090E00E94542E60E082E290E00E9486 +:102CA000542E60E085E090E00E94542E60E086E0C3 +:102CB00090E00E94542E6FEF87E090E00E94542E27 +:102CC00040E050E0BA0188E090E00E94662E60E0AB +:102CD0008DE090E00E94542E40E050E0BA0188E17F +:102CE00090E00E94662E60E087E190E00E94542E02 +:102CF00040E050E0BA018CE190E00E94662E70E066 +:102D000060E080E290E00E94722E40E050E0BA0164 +:102D100088E190E00E94662E80E00E94AC100E9444 +:102D2000C41040E050E0BA018FE090E00E94662EAF +:102D300040E050E0BA0183E190E00C94662E3F92AF +:102D40004F925F926F927F928F929F92AF92BF92BB +:102D5000CF92DF92EF92FF920F931F93CF93DF9367 +:102D600000D000D00F92CDB7DEB78C01FC0183817B +:102D70009481892B31F08081918189238F3F09F0E3 +:102D800070C50F900F900F900F900F90DF91CF9123 +:102D90001F910F91FF90EF90DF90CF90BF90AF9079 +:102DA0009F908F907F906F905F904F903F9008958D +:102DB0000E942311F82E682F89819A810E94410A6E +:102DC00069817A818F2D0E9416117C01F801828120 +:102DD000882309F439C5970122513F452031310537 +:102DE00008F005C58FEF93E00E94402EFEEEEF0E37 +:102DF00057E5852E52E0952E8823A1F18091470258 +:102E0000877009F4BECFF8018281882309F4B9CF15 +:102E10008091870282FDB5CF82E00F900F900F90D6 +:102E20000F900F90DF91CF911F910F91FF90EF9036 +:102E3000DF90CF90BF90AF909F908F907F906F90DA +:102E40005F904F903F900C94A50A811424E0920665 +:102E5000A9F2C4010E94402E811101C0EA943FEF03 +:102E6000831A930AE110F1CF1C821B8244244394FD +:102E70004AE0342E74018FEFE81AF80AC4010E9468 +:102E8000402E89831A82882309F4B8CF9FEF980FC8 +:102E9000933000F58A83498292E0890E911CC70124 +:102EA0000E94402E8B83882309F4A8CFFE0131961F +:102EB0007F01F70120812223E9F2213009F049C086 +:102EC00091818281913041F4F2E0EF0EF11C0E9479 +:102ED000C60F09C04701EACF923049F422E0E20E62 +:102EE000F11C0E941A0B3FEFE31AF30AE2CF933072 +:102EF00031F432E0E30EF11C0E94E10AF4CF943089 +:102F000021F08FEFE81AF80AEECF92E0E90EF11CFB +:102F100030E020E0B7016F5F7F4FF70141818053C0 +:102F2000990B8A30910550F021503109E0F28FE978 +:102F30009FE00197F1F700C00000F6CF329EF0014C +:102F4000339EF00D11249C012E0F3F1F842F7B0117 +:102F5000E1CFE22FF0E0E754FE4F5490822F8695A8 +:102F60008695869590E0FC01E755FE4F64902770AA +:102F7000712C022E02C0759467940A94E2F7E1E086 +:102F80006E227724FC01E756FE4FA490B12C022E4E +:102F900002C0B594A7940A94E2F7F1E0AF22BB24F3 +:102FA000FC01E757FE4FC490D12C02C0D594C794C2 +:102FB0002A95E2F721E0C222DD246114710419F0A0 +:102FC00081EE0E941A0BA114B10419F086EE0E9442 +:102FD0001A0B852D0E94C60FAB2819F086EE0E94B1 +:102FE000E10A672819F081EE0E94E10ACD2809F470 +:102FF0007ACF8CE26CCF81E00E94C10A0E948E0AD7 +:10300000FDCE81E00E94990AF9CF82E0F5CF95EFDD +:10301000E9169CE5F90609F46AC008F464C027E2E1 +:1030200045EE66EEF6EFEF16FCE5FF0609F408C480 +:10303000882309F427C41092C50323E0E2162DE586 +:10304000F20608F05BC03AEFE3163CE5F30630F415 +:10305000C70182509C45449708F056C00E949E11BB +:10306000909387028093860290E1E9169CE5F90629 +:1030700009F433C108F0A5C0F8E0EF16FCE5FF063F +:1030800009F41DC108F06EC034E0E3163CE5F30618 +:1030900009F407C108F050C092E0E9169CE5F90672 +:1030A00009F4F9C0809186028260E3E0EE16ECE557 +:1030B000FE0609F4F3C060918602F090870284E076 +:1030C00090E00E94542E6F2D82E290E00E94542ED8 +:1030D0000E94611393CE27E245EE65EEB1C326E26E +:1030E00041EE60EEADC327E245EE64EEA9C326E2F1 +:1030F00041EE62EEA5C328E241E0EFCF81E6E8169B +:103100008DE5F80609F4AACFF6E1EF16FCE5FF0617 +:1031100009F0D1C380914A028A7A91E009F490E0E3 +:103120009093F30169E2811165E38AEE91E00E94D8 +:103130009C050E94E20962CE809186028061F6E0E1 +:10314000EF16FCE5FF0609F4A9C0809186028860AD +:1031500027E0E2162CE5F20608F4A0C08091860272 +:1031600080629CC0809186028D7F3CE0E3163CE546 +:10317000F30609F493C078F4809186028C609AE09B +:10318000E9169CE5F90609F489C008F49CC0809111 +:1031900086028E7F83C080918602877FFEE0EF16D5 +:1031A000FCE5FF0609F47AC0809186028B7F2FE050 +:1031B000E2162CE5F20608F471C0809186028F7E3B +:1031C0006DC03CEFE3163CE5F30609F482C0A0F5C0 +:1031D00094E1E9169CE5F90609F493C098F4F2E14C +:1031E000EF16FCE5FF0609F47CC0809186028F7B18 +:1031F00023E1E2162CE5F20608F450C08091860225 +:10320000837F4CC03AEFE3163CE5F30609F44DC06A +:1032100008F051C095E1E9169CE5F90609F04BCF9D +:103220008091860282FB992790F921E0922790FBFA +:1032300082F990FB83F932C0E114EDE5FE0609F452 +:1032400056C0A0F48091870283602EEFE2162CE531 +:10325000F20671F1809187028D7F3FEFE3163CE526 +:10326000F30630F1809187028C7F22C082E0E8165D +:103270008DE5F80609F454C008F44CC0E1E6EE16FA +:10328000EDE5FE0609F017CF90918602892F8F7E1B +:1032900094FF806103C080918602816080938602E2 +:1032A0000ACF809186028460F9CF80918702816085 +:1032B0008093870200CF809187028260F9CF80914E +:1032C00086028064EBCF0E94611380918602806841 +:1032D000E5CF809187028E7FEBCF809186028F7D34 +:1032E000DDCF0E946113809186028F77D7CF8091C6 +:1032F0008702982F909591708E7F892B90FB81F992 +:10330000D7CF0E94611390918602892F97FB87F98E +:103310008058C4CF61E08EE090E00E94542ECBCE66 +:1033200060E0F9CF85E3B9C281608093990361E0E1 +:1033300086950E94E81262CD48E253E161E373E1B1 +:103340000E94F8055BCD41E353E168E273E1F8CFF9 +:103350004DEB52E164EB72E1F3CF4CE952E168EAE4 +:1033600072E1EECF44E852E160E972E1E9CF40E971 +:1033700052E164E872E1E4CF47ED52E166EC72E1BC +:10338000DFCF61E081E0D5CF65E082E00E943B13B2 +:1033900035CD68E086E0FACF64E18FE0F7CF67E1F2 +:1033A00085E1F4CF62E289E1F1CF61E083E2C1CF50 +:1033B0000E9461139FEFE4E3FCE09150E040F04095 +:1033C000E1F700C000000E94640581E09AC280E03D +:1033D00098C2C7010E94190AD82EA4C22F2D2F709F +:1033E000C22E8F2D807F19F0C29490EFC922DD206C +:1033F000B9F0CC2069F080E28E0D883010F0811099 +:1034000009C080914A02C82AC0924A020E94E20979 +:103410008E2D4DC080914902C82AC0924902F6CF34 +:103420008E2D0E94E10ACC2009F443C080E28E0D6B +:10343000883010F0811004C08C2D0E94DB0906C07A +:10344000C09480914902C822C09249020E94E209B8 +:1034500030C03F2D3F70C32E8F2D807F803219F0FA +:10346000C29480EFC822882089F081E0881609F490 +:103470007FC0DD2009F489C0BB2009F47FC0F801BA +:10348000858180FFC5CF8F70858378C020918702AA +:1034900022FF4BC0DD2009F442C0CC2039F08091DE +:1034A0004A02C82AC0924A020E94E20980E00E94B1 +:1034B0001A0B292D2850330B2430310510F40E94AB +:1034C000920FAA2009F45DCC8091470280FD59CC6F +:1034D000F80112828595859585950E94C10AC801DB +:1034E0000E949F16809147028595859585950F903E +:1034F0000F900F900F900F90DF91CF911F910F9130 +:10350000FF90EF90DF90CF90BF90AF909F908F9003 +:103510007F906F905F904F903F900C94990A80E05D +:103520000E94E10ACC2029F287CFDD20A1F0909102 +:103530004B028C2D892BB11003C00E94D70AB9CF42 +:10354000E1E0BE12FACF22FDB4CF981709F4B1CF53 +:1035500080934B02AECFB11006C00E94D5098C2DCE +:103560000E94D00AA6CFF1E0BF1609F4A2CFF5CF92 +:10357000DD2031F025E02B1508F49BCF8C2DDDCF1D +:1035800034E03B1508F495CFEACFBB2041F3F9E3D3 +:103590008F1209C02FEF37EE83E02150304080407A +:1035A000E1F700C000008E2D0E94E10A82CF8F2D2E +:1035B00086958695837061F0813009F07ACFC701D6 +:1035C0009370D11002C090E080E00E94B60571CFE8 +:1035D000C7019370D11002C090E080E00E94CC053A +:1035E00068CF8E2DDD2029F00E9493070E94B1063E +:1035F00060CF0E94D806FACF8F2D837091F5D1103D +:1036000058CF4E2D429546954770440F440F8E2D4E +:103610008F70042E01C0880F0A94EAF72E2D2071B6 +:10362000E4FE07C02FE030E001C0220F4A95EAF720 +:1036300020953F2D369536953370323069F050F431 +:1036400040914C02313029F0822B84230E94CC0A15 +:1036500030CF842B822BFACF282B80914C028227EB +:10366000F5CF8695DD2011F08F2D8170882309F428 +:1036700020CF4E2D429546954770440F440F8E2D16 +:103680008F70042E01C0880F0A94EAF72E2D207146 +:10369000E4FE07C02FE030E001C0220F4A95EAF7B0 +:1036A00020953F2D369536953370323069F050F4C1 +:1036B0004091C603313029F0822B84230E948A0A6C +:1036C000F8CE842B822BFACF282B8091C603822739 +:1036D000F5CF9F2D9F70F92EDD2029F0892F0E94B4 +:1036E000C10A8E2D2ACF8E2D0E94D00A8F2D0E94C6 +:1036F000990ADFCE8E2DE2EF8E16B1F1E81570F04B +:10370000F0EF8F16D1F021EF821691F0DD2009F451 +:103710005EC0B1107DCE8F2D8F712AC033EF83161E +:1037200051F194EF8912F2CF8091870282FF2FC06E +:103730008F2D8F71DD20D9F21BC0DD2081F0E4E0F8 +:10374000EB1508F4B6CE2F2D2F7181E090E001C06B +:10375000880F2A95EAF79091C6038927AFCFF5E045 +:10376000FB1508F4A6CEEFCF8F2D8F71D110BFCFF0 +:103770000E94C10A9ECE80E0DD2009F49FCF9F2DDC +:103780009F7181E001C0880F9A95EAF797CFDD20FD +:1037900099F02F2D2F71F22E822F0E94C10A809155 +:1037A000870282FD07C038E0F39EC00111248360C8 +:1037B000809347028F2DDCCF81E00E94A50A81E033 +:1037C0008B1508F076CE82E00E94A50A72CEBB204F +:1037D00059F0893309F0E7CE9FEFE7EEF3E091501F +:1037E000E040F040E1F7DDCE8F2D8F7180CFF0E12A +:1037F000EF16FFE5FF0609F4FECB21E1E2162FE507 +:10380000F20609F402CC93EFE9169CE5F90609F4F7 +:1038100066CC08F0FCCBF8EDEF16FCE5FF0609F4EA +:103820005ACC29EDE2162CE5F20609F464CC37ED0A +:10383000E3163CE5F30609F0FBCB26E241EE61EE30 +:10384000C8010E94E30FDACA30E1E3163FE5F30650 +:1038500009F4D7CB91E1E9169FE5F906A1F682E0DC +:10386000D1CB85E0DE01119601900D928A95E1F7AA +:10387000F801228189819A8121119ACA0E94190A2C +:10388000F82E9ECAF6E1EF16FCE5FF0609F083C0AC +:103890008091F301811146CD89E2ECEEF1E022EF57 +:1038A00031E09191891303C0DF0111971C922E170B +:1038B0003F07B9F73ECC2AE5E2162DE5F20609F4FA +:1038C00084CD68F4E1148CE5F80609F471CD9EED21 +:1038D000E9169CE5F906B9F40E9435168FCAEBE5A6 +:1038E000EE16EDE5FE0609F472CDFCE5EF16FDE5FA +:1038F000FF0649F48091870282FB882780F991E0D6 +:1039000089270E94D310F8018281E080F18088230A +:1039100009F45FCDC7010E942311D82E682FC7017B +:103920000E94410AB7018D2D0E9416110E944B087A +:103930007C01882EF801D280B580B2943FE0B3229A +:10394000809147028770C1F0AD2CDD20B1F08F2D42 +:10395000807F803421F080E28E0D883068F0809185 +:10396000870282FD09C082E00E94A50A8091470279 +:103970008770AA24A3948111A12C9F2C92942FE0EC +:103980009222FBE0F91508F494CDE92DF0E0EB5319 +:10399000F14D0C94F62D80914A0282722CECE216C5 +:1039A0002CE5F20609F4E8CC08F073C096ECE916B1 +:1039B0009CE5F90609F4CCCC08F042C0F3ECEF1614 +:1039C000FCE5FF0609F4B8CC50F532ECE3163CE513 +:1039D000F30609F098CF8091990380FFA5CC8E7FE4 +:1039E000809399036091990370919A0380919B034E +:1039F00090919C030E94C7110E94FE058091C9020C +:103A000081608093C9022FEF30E782E0215030407F +:103A10008040E1F700C000000E94F70BEFC994EC72 +:103A2000E9169CE5F90609F48ECC44EB52E16DEB06 +:103A300072E1E5ECEE16ECE5FE0609F481CC63CF0D +:103A4000F9ECEF16FCE5FF0609F48CCC88F437ECB2 +:103A5000E3163CE5F30609F480CC48EA52E16CE950 +:103A600072E198ECE9169CE5F90609F469CC4BCFB4 +:103A7000EAECEE16ECE5FE0609F479CC46EC52E1F0 +:103A800067ED72E1FBECEF16FCE5FF0609F458CC9C +:103A90003ACF21EDE2162CE5F20609F47DCCB8F41C +:103AA0008EECE8168CE5F80609F46ECC08F469CCC7 +:103AB000EFECEE16ECE5FE0609F46BCC6EE089E067 +:103AC000F0EDEF16FCE5FF0609F460CC1CCF24ED09 +:103AD000E2162CE5F20609F465CC78F482EDE816DE +:103AE0008CE5F80609F45BCC61E088E193EDE9161A +:103AF0009CE5F90609F41DCC06CFE5EDEE16ECE5E4 +:103B0000FE0609F452CCFDE5EF16FF0609F476C96E +:103B1000FACE1F93CF93DF9380911402807FA9F494 +:103B200080911102882389F080914602D09115027C +:103B300060910F0270911002A0911202B0911302D5 +:103B4000C62FC72316E0D81304C0DF91CF911F9171 +:103B5000089590E0109711F0CF3F19F40196877007 +:103B6000F2CF189F9001199F300D1124F901EA5EE0 +:103B7000FD4F41814713F2CF40814613EFCF428181 +:103B80004111ECCF438154814A1B5B0B483C5105EA +:103B900028F7809114028F70806180931402F901DC +:103BA000E55EFD4F80818F70806180838FE092E0C1 +:103BB0000E949F16DF91CF911F910C940F0AAF9234 +:103BC000BF92CF92DF92EF92FF920F931F93CF930A +:103BD000DF93CDB7DEB761970FB6F894DEBF0FBEA7 +:103BE000CDBF8C0185E0F801DE011D9601900D929C +:103BF0008A95E1F7F801E2808FE0A82E82E0B82EE6 +:103C000060911202709113026115710509F432C1BD +:103C100090910F0240911002892F84238F3F09F465 +:103C200029C120813181C380D480F0901102F60136 +:103C3000E61BF70BFF2009F4E8C080911402582F0F +:103C4000507FE83CF10508F0ABC0511177C0FE2C65 +:103C5000431321C092131FC0E1101DC08F708061FB +:103C600080931402C5010E949F1680911402F801EE +:103C700085838F2D61960FB6F894DEBF0FBECDBF42 +:103C8000DF91CF911F910F91FF90EF90DF90CF9038 +:103C9000BF90AF900895CD2829F0822F83238F3FC6 +:103CA00009F003C180E0F82FF170DF2E80FF3CC0E7 +:103CB000809146024091150256E0841315C02D876D +:103CC0003E878D859E850E945211292F22952F7047 +:103CD0002230F0F0243018F59F70F1F0F801958152 +:103CE000907FD1F4D12C1EC090E0589FF001599FD5 +:103CF000F00D1124EA5EFD4F6181361306C060812C +:103D0000261303C06281E6120FC001968770D5CFDB +:103D10009F7011F0882331F3805E883018F3C8015A +:103D20000E949F16FD2CA5CFEE2009F4A2CF809112 +:103D30001402816080931402F12C9BCF431306C0C0 +:103D4000921304C0F801EE2009F479C0C8010E9462 +:103D50005E11882309F1EE20F9F08091140280327F +:103D600070F020910F023091100238872F8319864E +:103D7000DB86CA868C87CE0107960E949F1686E056 +:103D8000F801AFE0B2E001900D928A95E1F70E9450 +:103D9000891DFF24F3946DCFC8010E949F16F9CFAF +:103DA00051110AC08FE092E00E949F1686E0F50153 +:103DB00011928A95E9F7C0CF43130FC092130DC03B +:103DC000E1100BC0F8018583C8010E949F1686E0B0 +:103DD000F50111928A95E9F74CCFC8010E945E1156 +:103DE0008823D1F2EE20C1F280911402803238F2A1 +:103DF00020910F02309110023A8329831B82DD82C9 +:103E0000CC828E83CE010196B8CFE83CF105F8F65E +:103E1000FE2CEE2009F243131FC092131DC08091A7 +:103E2000140280FD10C0982F907F69F0F8018583FF +:103E3000903F31F0982F907F905F8F70892B858312 +:103E4000C8010E949F1686E0F801AFE0B2E0019041 +:103E50000D928A95E1F70DCFC8010E945E11811184 +:103E60008ECF80911402816080931402C8010E9459 +:103E70009F16FFCEEE2009F48FCFC8010E945E117D +:103E8000F82E882309F488CF86E0F801AFE0B2E08D +:103E900001900D928A95E1F780910F0290911002A6 +:103EA0000E9452110E94891DE4CE81E08E25FBCE36 +:103EB0001F93CF93DF93CDB7DEB767970FB6F89414 +:103EC000DEBF0FBECDBF4B8B5C8B6D8B7E8B8F8B24 +:103ED0006111109249021A8A198A85E0FE017396CF +:103EE000DE011D9601900D928A95E1F786E0FE01B4 +:103EF0003D96DE01179601900D928A95E1F7CE016D +:103F000007960E94DF1D882389F016E08091460203 +:103F100090911502891349C067960FB6F894DEBFD9 +:103F20000FBECDBFDF91CF911F91089586E0FE01B6 +:103F30003796DE01119601900D928A95E1F78A85F8 +:103F40009B85892B11F38F81988589238F3FE9F217 +:103F50002091150230E0C9010196877099274091A0 +:103F600046024817190671F40E9461131092150257 +:103F70001092460286E0EFE0F2E0DF011D928A95A2 +:103F8000E9F7C3CF96E0929FD001939FB00D112423 +:103F9000AA5EBD4FFE01319601900D929A95E1F710 +:103FA000809315020E940F0AB0CF819FC001112497 +:103FB0008A5E9D4F0E94DF1D882309F4ADCF80915A +:103FC000460290E0019687709927809346029ECF23 +:103FD000CF93DF93CDB7DEB728970FB6F894DEBF47 +:103FE0000FBECDBF85E0E9E9F3E0DE011196019057 +:103FF0000D928A95E1F78091C7029091C802A09135 +:10400000C9028E839F83A887288540917D025091A5 +:104010007E0260917F02709180023FB7F894809198 +:10402000A5039091A603A091A703B091A8033FBF59 +:10403000841B950BA60BB70B84369105A105B10522 +:1040400010F4222319F1809135019091360187599E +:104050009D4F4091340150E04930510510F048E047 +:1040600050E0BE016F5F7F4F0E94A22E85E090E07E +:104070000E94EA2C892BB1F40E94840560937D0292 +:1040800070937E0280937F02909380021092C90207 +:1040900081E028960FB6F894DEBF0FBECDBFDF914A +:1040A000CF91089580E0F5CFCF93DF9300D000D07B +:1040B000CDB7DEB74091650250916602609167020C +:1040C000709168022FB7F8948091A5039091A60390 +:1040D000A091A703B091A8032FBF841B950BA60B3B +:1040E000B70B84369105A105B10568F10E94A20FB6 +:1040F0006E5F7F4F8F4F9F4F69837A838B839C8343 +:1041000080912B0190912C0187599D4F40912A015C +:1041100050E04530510510F044E050E0BE016F5FC3 +:104120007F4F0E94A22E84E090E00E94EA2C892B0F +:1041300061F40E9484056093650270936602809327 +:1041400067029093680281E001C080E00F900F90B9 +:104150000F900F90DF91CF9108956F927F928F9281 +:104160009F92AF92BF92CF92DF92EF92FF920F9306 +:104170001F93CF93DF930F92CDB7DEB7862E5A01F0 +:104180006901682E880F7708C3010E94EA2C892BE9 +:1041900009F088C08AE0869DF001879DF00D11240A +:1041A000E050FF4F458150E04115510511F041E0CD +:1041B00050E08AE0869DF001879DF00D1124E050CB +:1041C000FF4F6681778167597D4FCE0101960E942E +:1041D000A22EF50140815181628173812FB7F8943D +:1041E0008091A5039091A603A091A703B091A80385 +:1041F0002FBF841B950BA60BB70B84369105A10529 +:10420000B10540F4B701C8010E94E2059981891700 +:1042100009F44FC0082C000C9908C4010E94EA2C34 +:10422000892B91F0B12C8B2D0F90DF91CF911F91A5 +:104230000F91FF90EF90DF90CF90BF90AF909F9045 +:104240008F907F906F9008958AE0889DF001899DFE +:10425000F00D1124E050FF4F458150E0E416F506C3 +:1042600008F4A7018AE0889DF001899DF00D1124D2 +:10427000E050FF4F6681778167597D4FC6010E94EC +:10428000A22EB701C8010E94E20599818913CACF05 +:104290000E948405F5016083718382839383BB242C +:1042A000B394C1CFB12CA701B801C6010E94A22EC0 +:1042B000BACFBB24B394F7CFCF92DF92EF92FF92A5 +:1042C0000F931F93CF93DF930F92CDB7DEB7EE24FA +:1042D000E394F12C00E712E09E012F5F3F4F41E68F +:1042E00052E063E082E00E94AD20D82E882341F1A5 +:1042F00000919502802F90E09C0127563D4F790157 +:104300001981F9018081181BC12E80E00EC0CA946A +:10431000F70180818F5F80838AEA002319F00130E2 +:1043200019F48BE40E94C60F8D2D1C1484F3912F79 +:1043300017FD90E0191B11110EC081110E94D309C5 +:104340008D2D0F90DF91CF911F910F91FF90EF90E6 +:10435000DF90CF9008951F5FF701808181508083A7 +:1043600089EA002319F0013019F48EE40E94C60F87 +:104370008D2DE1CFCF92DF92EF92FF920F931F939B +:10438000CF93DF9300D000D00F92CDB7DEB76B0193 +:1043900085E0E82EF12C0AE612E09E012F5F3F4FE8 +:1043A0004DE552E061E080E00E94AD20882349F0B5 +:1043B00095E0FE013196A8E5B2E001900D929A9544 +:1043C000E1F795E0E8E5F2E0D60101900D929A95CB +:1043D000E1F70F900F900F900F900F90DF91CF911A +:1043E0001F910F91FF90EF90DF90CF9008957F92F3 +:1043F0008F929F92AF92BF92CF92DF92EF92FF92F5 +:104400000F931F93CF93DF93CDB7DEB72F970FB6E0 +:10441000F894DEBF0FBECDBF8E010F5F1F4F8AE045 +:10442000D8011D928A95E9F782E9C82E81E0D82E3D +:10443000F12CE12CAA24A394B12C23EA822E21E0B2 +:10444000922EF60181916F018F3F09F443C0F894D9 +:10445000E82FE295EF70F0E021A18F70A50102C076 +:10446000440F551F8A95E2F7CA01922F982B91A30A +:1044700092A18095892382A30E94EF0700C0ECE9F6 +:10448000F1E0712C31E021912F3F09F47AC0A22F85 +:10449000A295AF70B0E090968C9190E02F7002C022 +:1044A000959587952A95E2F780FD6BC0832F782A32 +:1044B000330F8E169F0639F7F601319780818F3FB3 +:1044C00011F00E94F10750EA5A95F1F7F801EE0D4C +:1044D000FF1D70828FEFE81AF80A95E0E916F104E3 +:1044E00009F0AFCF4AE050E0B80188E892E00E94BE +:1044F000952E7C01892B41F08AE0F801A8E8B2E012 +:1045000001900D928A95E1F710919302E114F10464 +:10451000D1F181E080934F020E94900590934E026A +:1045200080934D0280914D0290914E020E9475053C +:10453000059778F0A8E8B2E0E12FF0E0E655FD4FEE +:104540008DE892E02D9121938A179B07D9F710925D +:104550004F0281E090E0EF28D1F02F960FB6F8944B +:10456000DEBF0FBECDBFDF91CF911F910F91FF90A6 +:10457000EF90DF90CF90BF90AF909F908F907F9003 +:10458000089580E094CF80914F028111CBCF0E949B +:104590006F0FD82EE0919302DE011B967D018823D8 +:1045A00009F473C085E01D928A95E9F70E2F10E09B +:1045B00006551D4F809181028A30A0F54AEB51E2E9 +:1045C000B701C8010E942B0F8823D9F14CE551E2B5 +:1045D000B701C8010E942B0F882399F144E550E2EE +:1045E000B701C8010E942B0F882359F148EE5FE103 +:1045F000B701C8010E942B0F882319F11092810284 +:104600008091920290E045E050E0B70186559D4FC1 +:104610000E94952E21E020935602892B49F5D12C3A +:104620008D2D9BCF80915002909151020E94750573 +:10463000843F914018F680915602811112C080E0AB +:104640008CCF809181028F3F29F08F5F8093810210 +:104650008A30B0F20E9490059093510280935002EC +:10466000EACF85E0F70111928A95E9F71092560298 +:10467000A0919202B0E0A655BD4F85E0FE013B96A9 +:1046800001900D928A95E1F7CBCFF0E0E655FD4F12 +:10469000F89485E0AAE6B2E001900D928A95E1F7E0 +:1046A00065E070E08AE692E00E94E205809369028C +:1046B0000E94EF07F894E0919C02F0E0E756FD4F6E +:1046C00080818B878093700261E070E0C7010E9457 +:1046D000E20580936F020E94EF07F894C090710288 +:1046E000D0907202E0907302F090740280915202B6 +:1046F00090915302A0915402B0915502C816D90668 +:10470000EA06FB06D1F0C0925202D0925302E09228 +:104710005402F09255020E946F0F81110EC00E9448 +:104720008405C61AD70AE80AF90AC0928202D09212 +:104730008302E0928402F09285020E94EF07F894CF +:1047400080917C02882379F180FF0DC080917502F1 +:1047500080FF2CC09091990391609093990360E041 +:1047600086950E94E81280917C0281FF09C020E0BA +:104770004091780260917702809176020E94D9116F +:1047800080917C0282FF06C080917B02882389F0A1 +:104790000E94AC1180917C0283FF03C081E0809372 +:1047A000C40210927C020E94EF0749CF0E94140FAE +:1047B000DACF0E94FE05EECF90E080E00E944E2E00 +:1047C000893E9E4F11F40C94851180E008951F924C +:1047D0000F920FB60F9211242F933F934F935F9335 +:1047E0006F937F938F939F93AF93BF93CF93DF93F9 +:1047F000EF93FF93D091E900DF708091EC00C82F18 +:10480000C17080FDC0E81092E9008091F000877FC0 +:104810008093F00078940E946C131092E9008091CC +:10482000F00088608093F000CD2BCF70C093E9003A +:10483000FF91EF91DF91CF91BF91AF919F918F91B8 +:104840007F916F915F914F913F912F910F900FBE8C +:104850000F901F9018951F920F920FB60F92112470 +:104860002F933F934F935F936F937F938F939F9378 +:10487000AF93BF93EF93FF938091E10082FF09C054 +:104880008091E20082FF05C08091E1008B7F8093E0 +:10489000E1008091DA0080FF24C08091D80080FF81 +:1048A00020C08091DA008E7F8093DA008091D90059 +:1048B00080FF9DC080E189BD82E189BD09B400FE11 +:1048C000FDCF81E08093B9038091AC03811109C0D1 +:1048D0000E94D6030E94A1048091E200846080932C +:1048E000E2008091E10080FF17C08091E20080FF2C +:1048F00013C08091E2008E7F8093E2008091E200FD +:1049000080618093E2008091D80080628093D8001B +:1049100019BC85E08093B9038091E10084FF2BC02E +:104920008091E20084FF27C080E189BD82E189BDDA +:1049300089B5982F917080FFFBCF8091D8008F7D33 +:104940008093D8008091E1008F7E8093E100809178 +:10495000E2008F7E8093E2008091E200816080938C +:10496000E2008091BA03882309F447C084E0809371 +:10497000B9038091B9038091E10083FF27C0809142 +:10498000E20083FF23C08091E100877F8093E100F4 +:1049900082E08093B9031092BA038091E1008E7F88 +:1049A0008093E1008091E2008E7F8093E20080910D +:1049B000E20080618093E20042E060E080E00E94DB +:1049C0006F048091F00088608093F000FF91EF9178 +:1049D000BF91AF919F918F917F916F915F914F9117 +:1049E0003F912F910F900FBE0F901F90189519BCFB +:1049F0001092B9031092AC0374CF8091E30087FD4D +:104A000093E09093B903B5CF78941F921FB61F928D +:104A100011248F939F93AF93BF938091A50390919F +:104A2000A603A091A703B091A8030196A11DB11DF3 +:104A30008093A5039093A603A093A703B093A80324 +:104A4000BF91AF919F918F911F901FBE1F9018959E +:104A50001F921FB61F9211248F939F93AF93BF9302 +:104A60008091A403811113C08091A5039091A603A6 +:104A7000A091A703B091A8034196A11DB11D8093F9 +:104A8000A5039093A603A093A703B093A803BF9197 +:104A9000AF919F918F911F901FBE1F901895CDB71A +:104AA000DEB7AA970FB6F894DEBF0FBECDBF84B7AE +:104AB000877F84BF0FB6F894A895809160008861C5 +:104AC00080936000109260000FBE80E890E00FB607 +:104AD000F89480936100909361000FBE85B7806861 +:104AE00085BF85B7806885BF8DEE97E09093E9011B +:104AF0008093E8010E94D6030E94A1048091E20005 +:104B000084608093E20078948091B9038823A1F0B7 +:104B10001091E9001F709091EC00892F817090FD39 +:104B200080E8182B1092E9008091E80083FD0E9434 +:104B30006C131F701093E90082E084BD93E095BD73 +:104B40009AEF97BD80936E001092820210928302BA +:104B500010928402109285020E948511811102C078 +:104B60000E94C4100E946F0F80933C0180913C0111 +:104B7000882309F46DC01092590182E280935A0192 +:104B80000E946F0F81110E94DD2B80913C0180916A +:104B90003C0195E0811190E09093930285E0891BA0 +:104BA0008093920202E911E067E9E62E61E0F62EB9 +:104BB000D8018D918D018F3F11F00E94F107E01611 +:104BC000F106B1F70CE911E053EAE52E51E0F52EBC +:104BD000F80181918F018F3F11F00E94F107E016DB +:104BE000F106B1F78AE0EAEAF2E0DF01282F1D9230 +:104BF0002A95E9F7E8E8F2E0DF011D928A95E9F7E6 +:104C00000E94DC23811102C00E94351682E090E0F0 +:104C10000E94402E80939F020E949E1190938702D3 +:104C2000809386020E94F721EFE3FCE93197F1F7C8 +:104C300000C000000E94F7218091AA0280FF0CC0F2 +:104C40006FEF7FEF90E080E00E94722E0E9464057B +:104C500082E28093590192CF83E090E00E94402E3F +:104C60000E94CC0A0E946F0F811102C00E94E02BAB +:104C700080919402811138C00E94DC23811104C00C +:104C80000E9435160E94491388E090E00E94482E49 +:104C90006093990370939A0380939B0390939C0372 +:104CA0008091C90283608093C9026E7F71F40E9473 +:104CB000491388E090E00E94482E60939903709316 +:104CC0009A0380939B0390939C030E9405060E9485 +:104CD000FE058091990380FF04C060E086950E94E4 +:104CE000E81281E08093940280913C01811106C01A +:104CF00084E980934A0182E98093490120914A0125 +:104D0000A22FA295AF70B0E091963C9191972F7031 +:104D100081E090E0BC01022E01C0660F0A94EAF720 +:104D2000462F4095432391964C93919792963C91B0 +:104D30009297362B92963C93929740914901E42F9B +:104D4000E295EF70F0E031A14F70042E01C0880FA2 +:104D50000A94EAF7982F9095932391A392A1892B17 +:104D600082A390968C9190E002C0959587952A95A4 +:104D7000E2F7817020A130E002C0359527954A9571 +:104D8000E2F792E020FF90E0892B80939D029091C2 +:104D90003C0181E0982790939C02891B80939502A7 +:104DA0008DE391E09093A1038093A00328E1622E0C +:104DB000712C30E4532E44EBA42E42E0B42E8091AB +:104DC000B90300E112E1853009F448C20E94F721DD +:104DD00081110E9484059AEAC92E92E0D92EE0EA58 +:104DE000F2E0D60110E000E0802EED9081918E156A +:104DF00009F443C28E25912CFF24F394982F9F2110 +:104E000009F436C20E946F0F882399F099A28AA2F2 +:104E1000EF2081E009F480E08BA30E94900581607F +:104E2000782F9DA38CA349A15AA16BA18DA10E94AB +:104E3000581FF801E056FD4F8081F826F0828091DE +:104E4000C802882309F464C08091C702E0919903E5 +:104E5000E695E81BE093C302823009F025C2F0E03A +:104E6000E95BFD4FE4910E2F10E080E0E82E8FE02B +:104E7000F82E8091C402882361F01092C4020E942F +:104E8000BD0F9093C2028093C1021092C60210928D +:104E9000C5020E94BD0FE091C102F091C2029C01C7 +:104EA0002E1B3F0B2F3F3F4798F52091980222235E +:104EB000B1F0109298022091960230919702821BD5 +:104EC000930B8F3F9F4758F4205D3A4830939702E9 +:104ED000209396028091C90288608093C9028090D5 +:104EE000C5029090C602E00FF11FF093C202E0935A +:104EF000C10281EC92E0F70109958091C502909181 +:104F0000C602892B29F4892819F081E08093980240 +:104F100080919D02E82FEE0FEE0F90914A01A92F8C +:104F2000A295AF70B0E090962C9130E09F7002C0D7 +:104F3000359527959A95E2F721703327909149018D +:104F4000A92FA295AF70B0E090964C9150E09F7061 +:104F500002C0559547959A95E2F7CA018170992745 +:104F600040FF02C082E090E0822B8E2B80939D0256 +:104F700010919C028F70E82FF0E0ED55FE4F80817C +:104F800090919B02890F80939B0220E0833084F0F4 +:104F9000E12FF0E0E756FD4F80818F5F80838AEA42 +:104FA000112319F0113019F48BE40E94C60F21E08F +:104FB00080919B028E3F84F4E12FF0E0E756FD4F95 +:104FC00080818150808389EA112319F0113019F40E +:104FD0008EE40E94C60F21E080919B02082E000CF7 +:104FE000990B63E070E00E94C02D80939B02211119 +:104FF0000E94D30986E0EBEBF2E0DE01119601900E +:105000000D928A95E1F7F090BD02E090BE021091FA +:10501000BF020091C0021092BD021092BE02109217 +:10502000BF021092C0028F2D8E2909F448C08091D2 +:10503000B9029091BA020E9475059C019091B50247 +:10504000992309F454C323333105C8F19F3F19F064 +:105050009F5F9093B502FF2059F00E9473079FEF66 +:105060001F140CF491E0899F802D11248093BD02C0 +:10507000EE2059F00E9473079FEF1E140CF491E08C +:10508000899F802D11248093BE023091BD0233236D +:10509000B1F02091BE02222391F045EB3403C00110 +:1050A0001124992309F45AC19093BD0245EB2403BE +:1050B00090011124332309F455C13093BE02812F8E +:1050C000802B09F448C08091B7029091B8020E94E9 +:1050D00075059C019091B402992309F403C3253608 +:1050E0003105C8F19F3F19F09F5F9093B4021123DF +:1050F00059F00E9451079FEF11160CF491E0899F1F +:10510000802D11248093BF02002359F00E94510783 +:105110009FEF10160CF491E0899F802D112480934D +:10512000C0023091BF023323B1F02091C00222238C +:1051300091F045EB3403C0011124992309F416C101 +:105140009093BF0245EB240390011124332309F40B +:1051500011C13093C0028091BD029091BE02892B93 +:105160009091BF02892B9091C002892B11F00E946F +:10517000B10686E0FE013196ABEBB2E001900D92F4 +:105180008A95E1F70E94920F90919E02891721F073 +:105190000E94920F80939E028091B903843009F09F +:1051A0000ECE83E08093E9008091E80082FF07CE75 +:1051B0008091E80090E085FF0CC00E94F50330E28A +:1051C000E32EF12C8E010F5F1F4F882309F4E0C0FE +:1051D00091E08091E8008B778093E800992309F4AF +:1051E000EECDE981E150E33108F034C1F0E0EF5257 +:1051F000F14D0C94F62D8091B903843009F1109291 +:10520000A4030FB6F894A895609260000FBE509268 +:10521000600083B7817F846083BF83B7816083BF71 +:105220007894889583B78E7F83BF0FB6F894A8953E +:1052300080916000886180936000109260000FBED2 +:105240008091B803882351F00E94F721EAEAF2E046 +:105250008191811128C2AE16BF06D1F78091B903A2 +:10526000853009F4C8CF0E9461130E94920FAECD21 +:105270009394FF0C27E09212C1CD0F5F1F4F0A30AD +:10528000110509F0B1CD8FEF8EA38FA318A60E9450 +:1052900090058160782F9AA789A74EA15FA168A584 +:1052A0008AA50E94581FCBCD863059F4F0E0EC5B04 +:1052B000FD4FE4910E2F10E0B0EFEB2EBEE0FB2E81 +:1052C000D8CD893061F4E695F0E0EF5BFD4FE491D5 +:1052D0000E2F10E0ABE3EA2EAEE0FA2ECACD8F30EF +:1052E00061F4E695F0E0E25CFD4FE4910E2F10E0F2 +:1052F000FFE9EF2EFDE0FF2EBCCD853159F4F0E043 +:10530000E55CFD4FE4910E2F10E0E5E1EE2EEDE0BF +:10531000FE2EAFCD08E210E052E8E52E5CE0F52E5F +:10532000883109F4A6CD833249F4E9E3F2E005912E +:10533000149174E9E72E7EE0F72E9BCD04EF11E087 +:1053400062E4E62E6CE0F62E843209F492CD00ED94 +:1053500017E04DEFE42E45E0F42E8BCD81E08093F5 +:10536000BD02A4CE81E08093BE02A9CE81E08093ED +:10537000BF02E8CE81E08093C002EDCE8091F100C3 +:10538000D8018D938D01B1E0EB1AF10809F420CF1B +:105390008091E80085FDF2CF8091E8008B778093C3 +:1053A000E8000E94F503882399F312CF1A8289E05E +:1053B0008B8311C08A81823009F48BC1833091F1D3 +:1053C000813009F047C00E9484050E94FC2D6B8348 +:1053D0007C838D839E838091B903843009F0EFCC68 +:1053E0001091E9001F709091EC00892F817090FD61 +:1053F00080E8182B82E08093E9008091E80080FF2C +:105400000DC050E040E060E270E0CE0101960E94E5 +:1054100026048091E8008E778093E8001F70109337 +:10542000E900CDCCFE013396D6018D916D018193BB +:10543000AA16BB06C9F7CFCF8A81823059F46B8197 +:105440007C818D819E810E94FC2D86E290E00E94ED +:10545000542EC1CF8FEF8983BECF4C816B818A815F +:105460000E94F0109827892798279E838D83B3CFB9 +:10547000ED80FE80FE24EF24FE248A810B81BEE0B5 +:105480000B9F80011124ECE88E9F000D111D11244B +:105490008C8190E0880F991F080F191F6F2DC8018C +:1054A00087960E94542E6E2DC8018896D0CF0E94F8 +:1054B000571091CF8A818138C1F060F4803809F0AB +:1054C0008ACF20E04B8160919B0380919A030E94D8 +:1054D000D91181CF8238E9F0833809F07CCF20E000 +:1054E00040919C036C818B81F2CF60E08B810E94A4 +:1054F000E8128B81811103C00E94140F6CCF809140 +:10550000990381608093990360E086950E94E81278 +:1055100062CF8B8180939D035ECF8A81813899F021 +:1055200030F4803809F057CF80919C0341CF823806 +:1055300091F0833809F04FCF80919A038B8380914B +:105540009B038C8348CF8091990380FF02C086958E +:105550002FCF80E02DCF80919D032ACF60919903BA +:1055600070919A0380919B0390919C030E94C711B4 +:1055700032CF80E18A832FCF81E08A8389EA18CFF6 +:105580000A811B81102701271027CE0101966C018B +:10559000EC80DC01AE0DB11D7D01C801895A9D4F23 +:1055A000EC14FD0409F417CF093AB1E01B0750F4DD +:1055B0000E94402EF60184830F5F1F4FBFEFCB1A6E +:1055C000DB0AEBCFD60114961C92F6CF0A811B8121 +:1055D000102701271027FE0131966F01EC80E00EA5 +:1055E000F12EF11CC801895A9D4F0E151F0509F4B3 +:1055F000F2CE093AF1E01F0728F4D60114966C9117 +:105600000E94542EBFEFCB1ADB0A0F5F1F4FEACF69 +:105610000E944710E0CE84E0ADCF0A811B811027A5 +:1056200001271027FE0131966F01EC80CF018E0D0E +:10563000911D7C01C8018796EC14FD0409F4CBCEC2 +:105640000033A2E01A0750F40E94402EF601848332 +:105650000F5F1F4FBFEFCB1ADB0AECCFD6011496BA +:105660001C92F6CF0A811B81102701271027FE010B +:1056700031966F01EC80E00EF12EF11CC801879687 +:10568000E016F10609F4A7CE0033F2E01F0728F474 +:10569000D60114966C910E94542EBFEFCB1ADB0AF0 +:1056A0000F5F1F4FEBCF09BD19BD09B400FEFDCF41 +:1056B0008091D8008F7D8093D8008091E000826037 +:1056C0008093E0008091E00081FDFCCF0E94611397 +:1056D000C5CD86E290E00E94402E1B821C821D8276 +:1056E0008E8379CE2D32314008F0FECC34CD2D3270 +:1056F000314008F0ADCCE3CC8EE14B9B02C0815031 +:10570000E1F74B9BFECF08955B9880E28A95F1F715 +:105710005B9A0895FC013BE03A95F1F798E020E0B0 +:1057200080E031E040E14A95F1F7880F4B9B02C0E1 +:105730008160232742E04A95F1F7000040E14A9555 +:10574000F1F7915079F790E19A95F1F799B132E03C +:105750003A95F1F7000040E14A95F1F793FB99275C +:1057600090F992272081920F90830895EF92FF92F3 +:105770000F931F93CF93DF930F92CDB7DEB71982AC +:105780008C017C01E60EF11C0E151F0561F481E011 +:105790009981911180E00F90DF91CF911F910F912E +:1057A000FF90EF9008950E947C2BCE0101960E94FD +:1057B0008A2BF80181938F01E7CF539A5B9A089562 +:1057C00053985B9AEB9AE9E6F0E080818F738083CF +:1057D00008956150770B91E001C0990F6A95EAF73F +:1057E00020E031E0911108C0222391F05B9A80E221 +:1057F0008A95F1F75B980895492F482339F05B9A11 +:10580000232740E24A95F1F79695ECCF5B98F9CFC4 +:105810005B98EDCFFF920F931F93CF93DF93EC0133 +:105820008C01060F111DC017D10731F4DF91CF9104 +:105830001F910F91FF900895F9900E94842B68E0CA +:105840008F2D0E94E92BEFCF1F920F920FB60F9270 +:105850001124EF92FF920F931F932F933F934F9337 +:105860005F936F937F938F939F93AF93BF93EF93C8 +:10587000FF93CF93DF930F92CDB7DEB719820E94CB +:105880007C2BCE0101960E948A2BA82FA695A69567 +:10589000A695282F229525709A2F9570290F922F63 +:1058A000937026952695920F982797708981982B4B +:1058B00009F075C0A73008F072C080E18A95F1F751 +:1058C0005B9A539AB2E0BA95F1F700C05B98EA2E62 +:1058D000F12CEAE0AE9FD0011124A050BF4F1896E2 +:1058E000ED91FC9119973097B1F060919001709112 +:1058F000910116962D913C911797260F371F1396FD +:105900008D919C911497680F791F15964C9115975E +:1059100012968C9109958AE08E9DF0018F9DF00D75 +:105920001124E050FF4F6581662351F020919001D2 +:105930003091910186819781820F931F0E940A2CDA +:105940000E94842BF0E1FA95F1F75B9853985B9AEB +:1059500080E18A95F1F78AE08E9D80018F9D100D80 +:10596000112400501F4FD80112966C911297662394 +:1059700071F1209190013091910113968D919C913C +:10598000820F931F0E94B62BD801ED91FC918823C2 +:1059900011F088E001C082E080830E947C2B0F9090 +:1059A000DF91CF91FF91EF91BF91AF919F918F9137 +:1059B0007F916F915F914F913F912F911F910F9127 +:1059C000FF90EF900F900FBE0F901F901895ED91E4 +:1059D000FC91DFCF0F931F93CF93DF93EC010797D9 +:1059E0000CF0A9C08AE08C9FF0018D9FF00D11246E +:1059F000E050FF4F80819181892B09F49CC0F8947D +:105A0000539A5B9885E08A95F1F700008C2F869574 +:105A100085709C2F9570890F982F93708695869529 +:105A2000890F8E0193E0000F111F9A95E1F7082B63 +:105A30000E94842B00C068E0802F0E94E92BA0E127 +:105A4000AA95F1F753985B9A4B9B27C087E090E0AB +:105A50004B9925C08AE08C9F80018D9F100D1124E9 +:105A600000501F4FF80165816623A1F1209190013C +:105A70003091910186819781820F931F0E94B62BEE +:105A8000811128C0539A5B9AD801ED91FC9182E074 +:105A90008083789482E090E016C000C0D5CF019753 +:105AA000B9F4539A5B9A8AE08C9FF0018D9FF00DB8 +:105AB0001124E050FF4F0190F081E02D81E08083C0 +:105AC000789481E090E0DF91CF911F910F9108953C +:105AD00000C0BECF0E947C2BB0E2BA95F1F75B9874 +:105AE000539AE0E1EA95F1F78AE08C9FF0018D9FEF +:105AF000F00D1124E050FF4F6281662351F0209198 +:105B000090013091910183819481820F931F0E94B3 +:105B10000A2C0E94842B8AE08C9FF0018D9FF00D4F +:105B20001124E050FF4F0190F081E02D1082789415 +:105B300090E080E0C8CF84E090E0C5CF87FB082EDE +:105B4000062687FD819567FD61950E94342E0EF42F +:105B5000919507FC81950895AA1BBB1B51E107C0D5 +:105B6000AA1FBB1FA617B70710F0A61BB70B881FED +:105B7000991F5A95A9F780959095BC01CD0108957C +:105B800097FB072E16F4009407D077FD09D00E94EA +:105B9000AC2D07FC05D03EF4909581959F4F08955C +:105BA000709561957F4F0895A1E21A2EAA1BBB1B29 +:105BB000FD010DC0AA1FBB1FEE1FFF1FA217B307D9 +:105BC000E407F50720F0A21BB30BE40BF50B661FEF +:105BD000771F881F991F1A9469F7609570958095B3 +:105BE00090959B01AC01BD01CF010895EE0FFF1F01 +:105BF0000590F491E02D0994692796276927782765 +:105C00008727782708950E940B2E332312F48A1BCE +:105C10009B0B0C941C2EA29FB001B39FC001A39FAD +:105C2000700D811D1124911DB29F700D811D1124D5 +:105C3000911D08950E940B2EB7FF0895821B930BB0 +:105C400008950E940B2EA59F900DB49F900DA49FC8 +:105C5000800D911D11240895B7FF0C94212E0E94F0 +:105C6000212E821B930B0895991B79E004C0991F84 +:105C7000961708F0961B881F7A95C9F780950895A6 +:105C8000F999FECF92BD81BDF89A992780B5089504 +:105C9000A6E1B0E044E050E00C947A2EA8E1B0E038 +:105CA00042E050E00C947A2E262FF999FECF92BD57 +:105CB00081BDF89A019700B4021639F01FBA20BDD1 +:105CC0000FB6F894FA9AF99A0FBE08950396272F03 +:105CD0000E94552E0E94542E252F0E94552E242FAF +:105CE0000C94552E0196272F0E94552E0C94542E5D +:105CF000DC01CB01FC01F999FECF06C0F2BDE1BD8C +:105D0000F89A319600B40D9241505040B8F708957A +:105D1000FC014150504030F001900616D1F7319708 +:105D2000CF010895882799270895FB01DC0104C05D +:105D30008D910190801921F441505040C8F7881B83 +:105D4000990B0895FB01DC0102C001900D924150B6 +:105D50005040D8F70895F894FFCF70117011791161 +:105D600079117B11791179117911701170118011EC +:105D700079117911801152147A141D167A141D1696 +:105D8000AD14CE141D16CC15D915EE19EE19291A1D +:105D9000291AD71AF11A591A591AFC1A691B7A1BAF +:105DA0007A1BD629DA291C2A2D2A382A572A5A2A58 +:105DB0008D2AAE2A2A2A2A2AB92ABC2AC02AE62AE9 +:085DC000082B0B2B0D2B322BDD +:105DC800F2010000000100000000F20100000005DF +:105DD80001000000F2010000000106000000F201CD +:105DE8000000000107000000F201040800000000A4 +:105DF8000000F201080C000000000000016105CA63 +:105E08000BA90BA50BA10B6005949201191A1B1C79 +:105E18001D1E1F202122010201004400444401816B +:105E28008283E200E900EA00B500B600B700CD00C1 +:105E38008301CC008A0192019401210223022402E9 +:105E48002502260227022A02B300B4006F00700060 +:105E580069026697C634F40000000000F5F6F731D1 +:105E680033323600FF0100010000FFFF000001008F +:105E780001FF0000010202020206060609090909DB +:105E880009090F0F0F0F0F0F1515151819191919E3 +:105E9800191919191919232440227B49012701AC22 +:085EA800009206AB06CB0600D8 +:00000001FF diff --git a/keyboards/aleblazer/zodiark/keymaps/via/keymap.c b/keyboards/aleblazer/zodiark/keymaps/via/keymap.c index 3829bcc9684a..087815ea23f2 100644 --- a/keyboards/aleblazer/zodiark/keymaps/via/keymap.c +++ b/keyboards/aleblazer/zodiark/keymaps/via/keymap.c @@ -12,7 +12,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include QMK_KEYBOARD_H -#include "oled.c" +#ifdef OLED_ENABLE + #include "oled.c" +#endif #include "encoder.c" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/aleblazer/zodiark/keymaps/via/rules.mk b/keyboards/aleblazer/zodiark/keymaps/via/rules.mk index 76d3c49ffd61..1e5b99807cb7 100644 --- a/keyboards/aleblazer/zodiark/keymaps/via/rules.mk +++ b/keyboards/aleblazer/zodiark/keymaps/via/rules.mk @@ -1,2 +1 @@ -RGBLIGHT_ENABLE = yes VIA_ENABLE = yes diff --git a/keyboards/aleblazer/zodiark/rules.mk b/keyboards/aleblazer/zodiark/rules.mk index 5f68f998d3df..118c42bbeb19 100644 --- a/keyboards/aleblazer/zodiark/rules.mk +++ b/keyboards/aleblazer/zodiark/rules.mk @@ -14,11 +14,12 @@ CONSOLE_ENABLE = no # Console for debug COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = no # Enable N-Key Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow AUDIO_ENABLE = no # Audio output OLED_ENABLE = yes OLED_DRIVER = SSD1306 # Enable Support for SSD1306 or SH1106 OLED Displays; Communicating over I2C ENCODER_ENABLE = yes SPLIT_KEYBOARD = yes LTO_ENABLE = yes +RGB_MATRIX_ENABLE = no RGB_MATRIX_DRIVER = WS2812 diff --git a/keyboards/crkbd/keymaps/harvester/README.md b/keyboards/crkbd/keymaps/harvester/README.md new file mode 100644 index 000000000000..a7995a4f6571 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/README.md @@ -0,0 +1,63 @@ +# KidBrazil's custom CRKBD Layout + +![Loose Transistor Crkbd](https://user-images.githubusercontent.com/4823043/71268460-0862c000-231b-11ea-8f32-2fe8da4d348a.jpg) + +This is a simple layout that I use for both programming and gaming. It is very +closely based on the original CRKBD layout with some modifications to the +position of CTRL and SHIFT. + +## Layers +This keymap includes a total of 4 Layers: +- QWERTY +- NUMBERS +- SYMBOLS +- GAMING +- WEAPONS + +The first three layers are pretty self explanatory and follow closely the +default keymap for this keyboard. The magic really starts to happen with the +gaming layer. + +### Gaming Layer +The gaming layer can be toggled on/off from the SYMBOLS layer. Once on the +gaming layer it will stay there until you toggle it off again. The gaming layer +includes normal WASD and most of the keys FPS games use on the left hand. On the +right hand we have F1-F12 and a few other special keys for games that require +it. + +### Weapon +The weapon layer is a momentary layer that can only be reached from the gaming +layer. This layer preserves the left hand almost unchanged, except for when the +layer is activated the top row becomes NUM 1 - 6 for wepon selection. The right +hand is KC_TRNS the whole way so basically it is still the gaming layer. + +## Custom Font +This keymap includes a custom font for my LooseTransistor logo. It is fine if +you want to use it I certainly don't mind but if you want your own, just replace +the glcdfont file here and you should be fine. + +Alternatively you could remove the font config line from the config.h file so it +will use the default QMK one. + +## OLED +This Keymap is setup to use the newer OLED API. Some work has been done to +customize this with showing layer and USB information. I also tried my best to +get a dormant / sleep state going but it is hit or miss and often only works on +the master hand. + +## OLED & RGB Matrix timeout +This keymap will set a automated timeout system for the OLED screen and the RGB +matrix. After 3 minutes or so the LED screen will display the logo on both +halves and 5 minutes after that both the LED and the Matrix will be switched +off. + +Once a user hits the keys again, the LED matrix will turn back on unless the +user has disabled it via RGB_TOG. + +## Flashing +To flash this on your CRKBD simply use the `make crkbd:kidbrazil:flash` +command. + +### TODO +- Wait for Spit_common to be implemented in CRKBD and revisit the special color + layers and animations diff --git a/keyboards/crkbd/keymaps/harvester/config.h b/keyboards/crkbd/keymaps/harvester/config.h new file mode 100644 index 000000000000..bf952bccce65 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/config.h @@ -0,0 +1,131 @@ +/* +Copyright 2019 @foostan +Copyright 2020 Drashna Jaelre <@drashna> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +/* Select hand configuration */ + +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +#define SPLIT_TRANSPORT_MIRROR +#define SPLIT_LAYER_STATE_ENABLE +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_MODS_ENABLE + +//#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 200 + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur. +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED_MASK 0U // Specify a optional status led which blinks when entering the bootloader + +//#define SERIAL_USART_TX_PIN D2 +#define SPLIT_USB_DETECT +#define SERIAL_PIO_USE_PIO1 + +#ifdef RGBLIGHT_ENABLE + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT +// #define RGBLIGHT_EFFECT_RGB_TEST +// #define RGBLIGHT_EFFECT_ALTERNATING +// #define RGBLIGHT_EFFECT_TWINKLE + #define RGBLIGHT_LIMIT_VAL 120 + #define RGBLIGHT_HUE_STEP 10 + #define RGBLIGHT_SAT_STEP 17 + #define RGBLIGHT_VAL_STEP 17 +#endif + +#ifdef RGB_MATRIX_ENABLE +# define RGB_MATRIX_KEYPRESSES // reacts to keypresses +// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) +// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects +# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS +// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) +// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) +# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash. +# define RGB_MATRIX_HUE_STEP 8 +# define RGB_MATRIX_SAT_STEP 8 +# define RGB_MATRIX_VAL_STEP 8 +# define RGB_MATRIX_SPD_STEP 10 + +/* Enable the animations you want/need. You may need to enable only a small number of these because * + * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */ +// RGB Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects +# define ENABLE_RGB_MATRIX_ALPHAS_MODS +# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_BREATHING +# define ENABLE_RGB_MATRIX_BAND_SAT +# define ENABLE_RGB_MATRIX_BAND_VAL +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +# define ENABLE_RGB_MATRIX_CYCLE_ALL +# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +# define ENABLE_RGB_MATRIX_DUAL_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +# define ENABLE_RGB_MATRIX_RAINDROPS +# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +# define ENABLE_RGB_MATRIX_HUE_BREATHING +# define ENABLE_RGB_MATRIX_HUE_PENDULUM +# define ENABLE_RGB_MATRIX_HUE_WAVE +# define ENABLE_RGB_MATRIX_PIXEL_RAIN +# define ENABLE_RGB_MATRIX_PIXEL_FLOW +# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined +# define ENABLE_RGB_MATRIX_TYPING_HEATMAP +# define ENABLE_RGB_MATRIX_DIGITAL_RAIN +// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +# define ENABLE_RGB_MATRIX_SPLASH +# define ENABLE_RGB_MATRIX_MULTISPLASH +# define ENABLE_RGB_MATRIX_SOLID_SPLASH +# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +#endif + +#define OLED_FONT_H "keyboards/crkbd/lib/glcdfont.c" + +#define USB_POLLING_INTERVAL_MS 1 +#define QMK_KEYS_PER_SCAN 12 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 10 diff --git a/keyboards/crkbd/keymaps/harvester/enums.h b/keyboards/crkbd/keymaps/harvester/enums.h new file mode 100644 index 000000000000..6bf5926b7c49 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/enums.h @@ -0,0 +1,29 @@ +// [CRKBD layers Init] -------------------------------------------------------// +typedef enum { + _BASE, + _NUM, + _FUN, + _MEDIA, + _GAME, + _MOD, + _NAV, + _MSE, + _SYM +}CRKBD_LAYERS; + +extern enum CRKBD_LAYERS crkbd_layers; + +typedef enum { + _RGB_INDICATORS, + _RGB_DANGER, + _RGB_NUM, + _RGB_FUNC, + _RGB_MEDIA, + _RGB_GAME, + _RGB_MOD, + _RGB_DEFAULT, + _RGB_TRANS, + _RGB_DISABLED +}CRKBD_RGB; + +extern enum CRKBD_RGB crkbd_rgb; diff --git a/keyboards/crkbd/keymaps/harvester/keymap.c b/keyboards/crkbd/keymaps/harvester/keymap.c new file mode 100644 index 000000000000..e06ecb2a7f81 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/keymap.c @@ -0,0 +1,132 @@ +/* +Copyright 2019 @foostan +Copyright 2020 Drashna Jaelre <@drashna> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include +#include "oled.c" + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE]= LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT), + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RALT, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + LT(_MEDIA,KC_ESC), LT(_NAV,KC_TAB), LT(_MSE,KC_SPC), LT(_SYM,KC_ENT), LT(_NUM,KC_BSPC), LT(_FUN,KC_DEL) + //`--------------------------' `--------------------------' + ), + + [_GAME] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + KC_ESC, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_F, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + MO(_NUM), MO(_MOD), KC_SPC, KC_ENT, KC_BSPC , KC_DEL + //`--------------------------' `--------------------------' + ), + + [_NAV] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, C(KC_A), C(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + XXXXXXX, _______, XXXXXXX, KC_ENT, KC_BSPC, KC_DEL + //`--------------------------' `--------------------------' + ), + + [_MSE] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + QK_BOOT, XXXXXXX, XXXXXXX, LGUI(KC_E), LGUI(KC_R), XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, LGUI(LSFT(KC_S)), XXXXXXX, XXXXXXX, TO(_GAME), XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN3, KC_BTN2 + //`--------------------------' `--------------------------' + ), + + [_MEDIA] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NK_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE + //`--------------------------' `--------------------------' + ), + + [_NUM] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_DOT, KC_0, KC_MINS, XXXXXXX, _______, XXXXXXX + //`--------------------------' `--------------------------' + ), + + [_SYM] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_LPRN, KC_RPRN, KC_UNDS, _______, XXXXXXX, XXXXXXX + //`--------------------------' `--------------------------' + ), + + [_FUN] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______ + //`--------------------------' `--------------------------' + ), + + [_MOD] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------. ,-----------------------------------------------------. + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TO(_BASE), + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + MO(_FUN), _______, KC_ENT, XXXXXXX, _______, XXXXXXX + //`--------------------------' `--------------------------' + ) +}; diff --git a/keyboards/crkbd/keymaps/harvester/oled.c b/keyboards/crkbd/keymaps/harvester/oled.c new file mode 100644 index 000000000000..038cd0307717 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/oled.c @@ -0,0 +1,128 @@ +#include QMK_KEYBOARD_H +#include "enums.h" + +#ifdef OLED_ENABLE +#include + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (!is_keyboard_master()) { + return OLED_ROTATION_180; // flips the display 180 degrees if offhand + } else { + return OLED_ROTATION_270; + } + return rotation; +} + +void oled_render_layer_state(void) { + oled_write_P(PSTR("Layer \n-----\n"), false); + switch (get_highest_layer(layer_state)) { + case _BASE: + oled_write_ln_P(PSTR("BASE"), false); + break; + case _NUM: + oled_write_ln_P(PSTR("NUM"), false); + break; + case _FUN: + oled_write_ln_P(PSTR("FUNC"), false); + break; + case _MEDIA: + oled_write_ln_P(PSTR("MDIA"), false); + break; + case _GAME: + oled_write_ln_P(PSTR("GAME"), false); + break; + case _MOD: + oled_write_ln_P(PSTR("MOD"), false); + break; + case _MSE: + oled_write_ln_P(PSTR("MSE"), false); + break; + case _SYM: + oled_write_ln_P(PSTR("SYM"), false); + break; + case _NAV: + oled_write_ln_P(PSTR("NAV"), false); + break; + default: + oled_write_ln_P(PSTR("NFI"), false); + } + oled_write_ln_P(PSTR("\n\n----\n\n"), false); + // Host Keyboard LED Status + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); + oled_write_ln_P(PSTR("NUMLK"), led_usb_state.num_lock); + oled_write_ln_P(PSTR("SCRLK"), led_usb_state.scroll_lock); + oled_write_ln_P(PSTR("NKRO"), keymap_config.nkro); +} + + +char keylog_str[24] = {}; + +const char code_to_name[60] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', + '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; + +void set_keylog(uint16_t keycode, keyrecord_t *record) { + char name = ' '; + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || + (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; } + if (keycode < 60) { + name = code_to_name[keycode]; + } + + // update keylog + snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c", + record->event.key.row, record->event.key.col, + keycode, name); +} + +void oled_render_keylog(void) { + oled_write(keylog_str, false); +} + +void render_bootmagic_status(bool status) { + /* Show Ctrl-Gui Swap options */ + static const char PROGMEM logo[][2][3] = { + {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, + {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, + }; + if (status) { + + oled_write_ln_P(logo[0][0], false); + oled_write_ln_P(logo[0][1], false); + } else { + oled_write_ln_P(logo[1][0], false); + oled_write_ln_P(logo[1][1], false); + } +} + +void oled_render_logo(void) { + static const char PROGMEM crkbd_logo[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, + 0}; + oled_write_P(crkbd_logo, false); +} + +bool oled_task_user(void) { + if (is_keyboard_master()) { + oled_render_layer_state(); + oled_render_keylog(); + } else { + oled_render_logo(); + } + return false; +} + +/*bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + set_keylog(keycode, record); + } + return true; +*/ +#endif // OLED_ENABLE diff --git a/keyboards/crkbd/keymaps/harvester/rgb.c b/keyboards/crkbd/keymaps/harvester/rgb.c new file mode 100644 index 000000000000..1c5f64cb7546 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/rgb.c @@ -0,0 +1,66 @@ +#include QMK_KEYBOARD_H +#include "enums.h" +#include "rgb.h" + +#ifdef RGB_MATRIX_ENABLE + +__attribute__ ((weak)) + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + + if (host_keyboard_led_state().caps_lock) { + for (uint8_t i = led_min; i <= led_max; i++) { + if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) { + rgb_matrix_set_color(i, RGB_INDICATORS); + } + } + } + + if (get_highest_layer(layer_state) > 0) { + uint8_t layer = get_highest_layer(layer_state); + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + if (index >= led_min && index <= led_max && index != NO_LED && (keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_BOOTLOADER || keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_CLEAR_EEPROM)) { + rgb_matrix_set_color(index, RGB_DANGER); + } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) > KC_TRNS) { + switch (layer) { + case _GAME: { + switch (keymap_key_to_keycode(layer, (keypos_t){col, row})) { + case KC_W: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_A: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_S: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_D: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + default: { + rgb_matrix_set_color(index, RGB_DISABLED); + break; + } + } + break; + }; + default: { // for any other layers, or the default layer + rgb_matrix_set_color(index, RGB_DEFAULT); + } + } + } /*else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_TRNS) { + rgb_matrix_set_color(index, RGB_TRANS); + } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_NO) { + rgb_matrix_set_color(index, RGB_DISABLED); + }*/ + } + } + } +} +#endif diff --git a/keyboards/crkbd/keymaps/harvester/rgb.h b/keyboards/crkbd/keymaps/harvester/rgb.h new file mode 100644 index 000000000000..b9fe33b09ee0 --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/rgb.h @@ -0,0 +1,11 @@ +#define RGB_INDICATORS 255,255,255 +#define RGB_DANGER 255,0,0 +#define RGB_NUM 0,255,255 +#define RGB_FUNC 255,255,0 +#define RGB_MEDIA 255,0,255 +#define RGB_GAME 255,0,0 +#define RGB_MODS 0,0,255 +#define RGB_MODS2 0,255,0 +#define RGB_DEFAULT 255,255,255 +#define RGB_TRANS 10,10,10 +#define RGB_DISABLED 0,0,0 diff --git a/keyboards/crkbd/keymaps/harvester/rules.mk b/keyboards/crkbd/keymaps/harvester/rules.mk new file mode 100644 index 000000000000..ea14c9784dcd --- /dev/null +++ b/keyboards/crkbd/keymaps/harvester/rules.mk @@ -0,0 +1,30 @@ +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +VIA_ENABLE = yes # Enable VIA +OLED_ENABLE = yes +OLED_DRIVER = SSD1306 +LTO_ENABLE = yes +MOUSEKEY_ENABLE = yes +RGB_MATRIX_DRIVER = WS2812 +RGB_MATRIX_ENABLE = yes +GRAVE_ESC_ENABLE = yes +TAP_DANCE_ENABLE = no +AUTO_SHIFT_ENABLE = no +COMBO_ENABLE = no +KEY_LOCK_ENABLE = no +KEY_OVERRIDE_ENABLE = no +SEQUENCER_ENABLE = no +SERIAL_DRIVER = vendor +DEBOUNCE_TYPE = asym_eager_defer_pk +NKRO_ENABLE = yes + +MAGIC_ENABLE = yes +BACKLIGHT_ENABLE = no +EXTRAKEY_ENABLE = yes +BOOTMAGIC_ENABLE = lite +TERMINAL_ENABLE = no +RGBLIGHT_ENABLE = no + + +SPLIT_KEYBOARD = yes + +SRC += ./rgb.c diff --git a/keyboards/crkbd/keymaps/kidbrazil/config.h b/keyboards/crkbd/keymaps/kidbrazil/config.h index 74f8a0823b32..6f74e2436e28 100644 --- a/keyboards/crkbd/keymaps/kidbrazil/config.h +++ b/keyboards/crkbd/keymaps/kidbrazil/config.h @@ -34,6 +34,10 @@ along with this program. If not, see . #undef PRODUCT #define PRODUCT "CRKBD Loose Transistor Ed." +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur. +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED_MASK 0U // Specify a optional status led which blinks when entering the bootloader + #ifdef RGBLIGHT_ENABLE //#undef RGBLED_NUM #define RGBLIGHT_EFFECT_BREATHING diff --git a/keyboards/crkbd/keymaps/miryoku-harvester/keymap.json b/keyboards/crkbd/keymaps/miryoku-harvester/keymap.json new file mode 100644 index 000000000000..1b38bc2370d0 --- /dev/null +++ b/keyboards/crkbd/keymaps/miryoku-harvester/keymap.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "author": "", + "notes": "", + "keyboard": "crkbd/r2g", + "keymap": "miryoku-harvester", + "layout": "LAYOUT_split_3x6_3", + "layers": [ + [ + "KC_GRV", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSLS", "KC_LSFT", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "LSFT_T(KC_QUOT)", "KC_LCTL", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RALT", "LT(3,KC_ESC)", "LT(2,KC_TAB)", "LT(1,KC_SPC)", "LT(4,KC_ENT)", "LT(5,KC_BSPC)", "LT(6,KC_DEL)" + ], + [ + "QK_BOOT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_AGIN", "KC_PSTE", "KC_COPY", "KC_CUT", "KC_UNDO", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_NO", "KC_MS_L", "KC_MS_D", "KC_MS_U", "KC_MS_R", "KC_NO", "EE_CLR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_BTN1", "KC_BTN3", "KC_BTN2" + ], + [ + "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_AGIN", "KC_PSTE", "KC_COPY", "KC_CUT", "KC_UNDO", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_CAPS", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_INS", "KC_HOME", "KC_PGDN", "KC_PGUP", "KC_END", "KC_NO", "KC_NO", "KC_TRNS", "KC_NO", "KC_ENT", "KC_BSPC", "KC_DEL" + ], + [ + "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "RGB_TOG", "RGB_MOD", "RGB_HUI", "RGB_SAI", "RGB_VAI", "KC_NO", "KC_NO", "KC_LGUI", "KC_LALT", "KC_LCTL", "KC_LSFT", "KC_NO", "KC_NO", "KC_MPRV", "KC_VOLD", "KC_VOLU", "KC_MNXT", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "NK_TOGG", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_NO", "KC_NO", "KC_MSTP", "KC_MPLY", "KC_MUTE" + ], + [ + "KC_NO", "KC_LCBR", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RCBR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_COLN", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_PLUS", "KC_NO", "KC_RSFT", "KC_RCTL", "KC_RALT", "KC_RGUI", "KC_NO", "KC_NO", "KC_TILD", "KC_EXLM", "KC_AT", "KC_HASH", "KC_PIPE", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_LPRN", "KC_RPRN", "KC_UNDS", "KC_TRNS", "KC_NO", "KC_NO" + ], + [ + "KC_NO", "KC_LBRC", "KC_7", "KC_8", "KC_9", "KC_RBRC", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_SCLN", "KC_4", "KC_5", "KC_6", "KC_EQL", "KC_NO", "KC_RSFT", "KC_RCTL", "KC_RALT", "KC_RGUI", "KC_NO", "KC_NO", "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_BSLS", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_0", "KC_MINS", "KC_NO", "KC_TRNS", "KC_NO" + ], + [ + "KC_NO", "KC_F12", "KC_F7", "KC_F8", "KC_F9", "KC_PSCR", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_F11", "KC_F4", "KC_F5", "KC_F6", "KC_SCRL", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_F10", "KC_F1", "KC_F2", "KC_F3", "KC_PAUS", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_TAB", "KC_SPC", "KC_NO", "KC_NO", "KC_TRNS" + ], + [ + "KC_ESC", "KC_T", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSLS", "KC_LSFT", "KC_G", "KC_A", "KC_S", "KC_D", "KC_F", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_RSFT", "KC_LCTL", "KC_B", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RALT", "MO(6)", "MO(8)", "KC_SPC", "KC_ENT", "KC_BSPC", "KC_DEL" + ], + [ + "KC_NO", "KC_1", "KC_2", "KC_TRNS", "KC_3", "KC_4", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "TO(0)", "KC_NO", "KC_5", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_6", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_7", "KC_8", "KC_9", "KC_0", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_TRNS", "KC_TRNS", "KC_NO", "KC_NO", "KC_NO", "KC_NO" + ] + ], + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n" +} \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/config.h b/keyboards/gmmk/pro/ansi/keymaps/railgun/config.h new file mode 100644 index 000000000000..c50c9704403a --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/config.h @@ -0,0 +1,69 @@ +/* Copyright 2021 Jonavin Eng + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define TAPPING_TOGGLE 2 // TT set to two taps + +/* Handle GRAVESC combo keys */ +//#define GRAVE_ESC_ALT_OVERRIDE //Always send Escape if Alt is pressed +//#define GRAVE_ESC_CTRL_OVERRIDE //Always send Escape if Control is pressed + +#define TAPPING_TERM 180 + +#ifdef RGB_MATRIX_ENABLE + #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_HUE_WAVE + #define RGB_DISABLE_WHEN_USB_SUSPENDED + + /*#define RGB_MATRIX_KEYPRESSES + #define DISABLE_RGB_MATRIX_SOLID_COLOR + #define DISABLE_RGB_MATRIX_BREATHING + #define DISABLE_RGB_MATRIX_ALPHAS_MODS //Remove effects not desired + #define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN + #define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT + #define DISABLE_RGB_MATRIX_BAND_SAT + #define DISABLE_RGB_MATRIX_BAND_VAL + #define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT + #define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL + #define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT + #define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL + #define DISABLE_RGB_MATRIX_CYCLE_ALL + #define DISABLE_ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + #define DISABLE_ENABLE_RGB_MATRIX_CYCLE_UP_DOWN + #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN + #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL + #define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + #define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL + #define DISABLE_RGB_MATRIX_CYCLE_SPIRAL + #define DISABLE_RGB_MATRIX_DUAL_BEACON + #define DISABLE_RGB_MATRIX_RAINBOW_BEACON + #define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS + #define DISABLE_RGB_MATRIX_RAINDROPS + #define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + #define DISABLE_RGB_MATRIX_HUE_BREATHING + #define DISABLE_RGB_MATRIX_HUE_PENDULUM + //#define DISABLE_RGB_MATRIX_HUE_WAVE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS + #define DISABLE_RGB_MATRIX_SPLASH + #define DISABLE_RGB_MATRIX_MULTISPLASH + #define DISABLE_RGB_MATRIX_SOLID_SPLASH + #define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH*/ +#endif diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro VIA layout.json b/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro VIA layout.json new file mode 100644 index 000000000000..40a86c5ba5c4 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro VIA layout.json @@ -0,0 +1,367 @@ +{ + "name": "GMMK Pro", + "vendorProductId": 839864388, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_LSFT", + "KC_MUTE", + "KC_NO", + "KC_LEFT", + "KC_RCTL", + "KC_RGHT", + "KC_LCTL", + "KC_F5", + "KC_Q", + "KC_TAB", + "KC_A", + "KC_ESC", + "KC_Z", + "KC_PGUP", + "KC_GRV", + "KC_1", + "KC_W", + "TT(2)", + "KC_S", + "KC_NO", + "KC_X", + "KC_PGDN", + "KC_F1", + "KC_2", + "KC_E", + "KC_F3", + "KC_D", + "KC_F4", + "KC_C", + "KC_UP", + "KC_F2", + "KC_3", + "KC_R", + "KC_T", + "KC_F", + "KC_G", + "KC_V", + "KC_B", + "KC_5", + "KC_4", + "KC_U", + "KC_Y", + "KC_J", + "KC_H", + "KC_M", + "KC_N", + "KC_6", + "KC_7", + "KC_I", + "KC_RBRC", + "KC_K", + "KC_F6", + "KC_COMM", + "KC_HOME", + "KC_EQL", + "KC_8", + "KC_O", + "KC_F7", + "KC_L", + "KC_DOWN", + "KC_DOT", + "KC_END", + "KC_F8", + "KC_9", + "KC_P", + "KC_LBRC", + "KC_SCLN", + "KC_QUOT", + "KC_NO", + "KC_SLSH", + "KC_MINS", + "KC_0", + "KC_LGUI", + "KC_RSFT", + "MO(1)", + "KC_LALT", + "KC_SPC", + "KC_RALT", + "KC_NO", + "KC_DEL", + "KC_NO", + "KC_BSPC", + "KC_BSLS", + "KC_F11", + "KC_ENT", + "KC_F12", + "KC_F9", + "KC_F10" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "RGB_SPD", + "TO(3)", + "RGB_SPI", + "KC_TRNS", + "KC_MPRV", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_HOME", + "KC_TRNS", + "KC_TRNS", + "RGB_VAI", + "KC_CAPS", + "RGB_VAD", + "KC_NO", + "RGB_HUI", + "KC_END", + "KC_MYCM", + "KC_TRNS", + "KC_TRNS", + "KC_CALC", + "KC_TRNS", + "KC_MSEL", + "KC_TRNS", + "RGB_MOD", + "KC_WWW_HOME", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_PSCR", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NLCK", + "KC_TRNS", + "KC_TRNS", + "KC_SLCK", + "KC_TRNS", + "KC_TRNS", + "KC_MNXT", + "KC_NO", + "RGB_TOG", + "KC_TRNS", + "KC_TRNS", + "KC_PAUS", + "KC_MPLY", + "KC_TRNS", + "RGB_RMOD", + "KC_NO", + "KC_TRNS", + "KC_MSTP", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F14", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F13", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_CAPS", + "KC_NO", + "KC_CALC", + "KC_NO", + "KC_TRNS", + "RESET", + "KC_VOLU", + "KC_TRNS", + "KC_TRNS", + "KC_MUTE", + "KC_VOLD" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "C(RCTL(KC_LEFT))", + "KC_TRNS", + "C(RCTL(KC_RGHT))", + "KC_TRNS", + "KC_TRNS", + "KC_HOME", + "KC_TRNS", + "KC_LEFT", + "KC_TRNS", + "KC_CAPS", + "KC_HOME", + "C(S(KC_M))", + "C(S(KC_B))", + "KC_UP", + "TO(0)", + "KC_DOWN", + "KC_NO", + "KC_DEL", + "KC_END", + "KC_TRNS", + "KC_TRNS", + "KC_END", + "KC_TRNS", + "KC_RGHT", + "KC_TRNS", + "KC_INS", + "C(RCTL(KC_PGUP))", + "KC_TRNS", + "KC_TRNS", + "KC_PGUP", + "KC_TRNS", + "KC_PGDN", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_P4", + "KC_TAB", + "KC_P1", + "KC_TRNS", + "KC_P0", + "KC_NO", + "KC_TRNS", + "KC_P7", + "KC_P5", + "KC_TRNS", + "KC_P2", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_PPLS", + "KC_P8", + "KC_P6", + "KC_TRNS", + "KC_P3", + "C(RCTL(KC_PGDN))", + "KC_PDOT", + "KC_TRNS", + "KC_TRNS", + "KC_P9", + "KC_PPLS", + "KC_TRNS", + "KC_PENT", + "KC_PAST", + "KC_NO", + "KC_PSLS", + "KC_PMNS", + "KC_P0", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_BSPC", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_PENT", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_F22", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ] + ] +} \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro_ansi_railgun.bin b/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro_ansi_railgun.bin new file mode 100644 index 000000000000..11b834b81259 Binary files /dev/null and b/keyboards/gmmk/pro/ansi/keymaps/railgun/gmmk_pro_ansi_railgun.bin differ diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.c b/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.c new file mode 100644 index 000000000000..2348148f6208 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.c @@ -0,0 +1,253 @@ + +/* Copyright 2021 Jonavin Eng @Jonavin + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#include QMK_KEYBOARD_H +#include "jonavin.h" + + +#ifdef TD_LSFT_CAPSLOCK_ENABLE + // Tap once for shift, twice for Caps Lock but only if Win Key in not disabled + void dance_LSFT_finished(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1 || keymap_config.no_gui) { + register_code16(KC_LSFT); + } else { + register_code(KC_CAPS); + } + } + + void dance_LSFT_reset(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1 || keymap_config.no_gui) { + unregister_code16(KC_LSFT); + } else { + unregister_code(KC_CAPS); + } + } + + qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for shift, twice for Caps Lock + [TD_LSFT_CAPSLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), + [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_LSFT_finished, dance_LSFT_reset), + }; +#endif // TD_LSFT_CAPSLOCK_ENABLE + +// RGB NIGHT MODE +#ifdef RGB_MATRIX_ENABLE + static bool rgb_nightmode = false; + + // Turn on/off NUM LOCK if current state is different + void activate_rgb_nightmode (bool turn_on) { + if (rgb_nightmode != turn_on) { + rgb_nightmode = !rgb_nightmode; + } + } + + bool get_rgb_nightmode(void) { + return rgb_nightmode; + } +#endif // RGB_MATRIX_ENABLE + +// TIMEOUTS +#ifdef IDLE_TIMEOUT_ENABLE + static uint16_t timeout_timer = 0; + static uint16_t timeout_counter = 0; //in minute intervals + static uint16_t timeout_threshold = TIMEOUT_THRESHOLD_DEFAULT; + + uint16_t get_timeout_threshold(void) { + return timeout_threshold; + } + + void timeout_reset_timer(void) { + timeout_timer = timer_read(); + timeout_counter = 0; + }; + + void timeout_update_threshold(bool increase) { + if (increase && timeout_threshold < TIMEOUT_THRESHOLD_MAX) timeout_threshold++; + if (!increase && timeout_threshold > 0) timeout_threshold--; + }; + + void timeout_tick_timer(void) { + if (timeout_threshold > 0) { + if (timer_elapsed(timeout_timer) >= 60000) { // 1 minute tick + timeout_counter++; + timeout_timer = timer_read(); + } + #ifdef RGB_MATRIX_ENABLE + if (timeout_threshold > 0 && timeout_counter >= timeout_threshold) { + rgb_matrix_disable_noeeprom(); + } + #endif + } // timeout_threshold = 0 will disable timeout + } + + __attribute__((weak)) void matrix_scan_keymap(void) {} + + void matrix_scan_user(void) { + timeout_tick_timer(); + matrix_scan_keymap(); + } +#endif // IDLE_TIMEOUT_ENABLE + + +#if defined(ENCODER_ENABLE) && defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality + #ifndef DYNAMIC_KEYMAP_LAYER_COUNT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 //default in case this is not already defined elsewhere + #endif + #ifndef ENCODER_DEFAULTACTIONS_INDEX + #define ENCODER_DEFAULTACTIONS_INDEX 0 // can select encoder index if there are multiple encoders + #endif + +uint8_t selected_layer = 0; + +__attribute__((weak)) bool encoder_update_keymap(uint8_t index, bool clockwise) { return true; } + +bool encoder_update_user(uint8_t index, bool clockwise) { + if (!encoder_update_keymap(index, clockwise)) { return false; } //This is to override the default kb function and go to userspace + if (index != ENCODER_DEFAULTACTIONS_INDEX) {return true;} // exit if the index doesn't match + if ( clockwise ) { + if (get_mods() & MOD_BIT(KC_LSFT) ) { // If you are holding L shift, encoder changes layers + if(selected_layer < (DYNAMIC_KEYMAP_LAYER_COUNT - 1)) { + selected_layer ++; + layer_move(selected_layer); + } + } else if (get_mods() & MOD_BIT(KC_RSFT) ) { // If you are holding R shift, Page up + unregister_mods(MOD_BIT(KC_RSFT)); + register_code(KC_PGDN); + register_mods(MOD_BIT(KC_RSFT)); + } else if (get_mods() & MOD_BIT(KC_LCTL)) { // if holding Left Ctrl, navigate next word + tap_code16(LCTL(KC_RGHT)); + } else if (get_mods() & MOD_BIT(KC_LALT)) { // if holding Left Alt, change media next track + tap_code(KC_MEDIA_NEXT_TRACK); + } else { + switch (selected_layer) { + case _FN1: + #ifdef IDLE_TIMEOUT_ENABLE + timeout_update_threshold(true); + #endif + break; + default: + tap_code(KC_VOLU); // Otherwise it just changes volume + break; + } + } + } else { + if (get_mods() & MOD_BIT(KC_LSFT) ) { + if (selected_layer > 0) { + selected_layer --; + layer_move(selected_layer); + } + } else if (get_mods() & MOD_BIT(KC_RSFT) ) { + unregister_mods(MOD_BIT(KC_RSFT)); + register_code(KC_PGUP); + register_mods(MOD_BIT(KC_RSFT)); + } else if (get_mods() & MOD_BIT(KC_LCTL)) { // if holding Left Ctrl, navigate previous word + tap_code16(LCTL(KC_LEFT)); + } else if (get_mods() & MOD_BIT(KC_LALT)) { // if holding Left Alt, change media previous track + tap_code(KC_MEDIA_PREV_TRACK); + } else { + switch (selected_layer) { + case _FN1: + #ifdef IDLE_TIMEOUT_ENABLE + timeout_update_threshold(false); + #endif + break; + default: + tap_code(KC_VOLD); + break; + } + } + } + + return true; + } +#endif // ENCODER_ENABLE + + +// PROCESS KEY CODES +__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keymap(keycode, record)) { return false; } + switch (keycode) { + case KC_00: + if (record->event.pressed) { + // when keycode KC_00 is pressed + SEND_STRING("00"); + } else unregister_code16(keycode); + break; + case KC_WINLCK: + if (record->event.pressed) { + keymap_config.no_gui = !keymap_config.no_gui; //toggle status + } else unregister_code16(keycode); + break; + +#ifdef IDLE_TIMEOUT_ENABLE + case RGB_TOI: + if(record->event.pressed) { + timeout_update_threshold(true); + } else unregister_code16(keycode); + break; + case RGB_TOD: + if(record->event.pressed) { + timeout_update_threshold(false); //decrease timeout + } else unregister_code16(keycode); + break; +#endif // IDLE_TIMEOUT_ENABLE +#ifdef RGB_MATRIX_ENABLE + case RGB_NITE: + if(record->event.pressed) { + rgb_nightmode = !rgb_nightmode; + } else unregister_code16(keycode); + break; +#endif // RGB_MATRIX_ENABLE + default: + if (record->event.pressed) { + #ifdef RGB_MATRIX_ENABLE + rgb_matrix_enable_noeeprom(); + #endif + #ifdef IDLE_TIMEOUT_ENABLE + timeout_reset_timer(); //reset activity timer + #endif + } + break; + } + return true; +}; + + +// Turn on/off NUM LOCK if current state is different +void activate_numlock(bool turn_on) { + if (IS_HOST_LED_ON(USB_LED_NUM_LOCK) != turn_on) { + tap_code(KC_NUMLOCK); + } +} + + +// INITIAL STARTUP + +__attribute__ ((weak)) void keyboard_post_init_keymap(void) {} + +void keyboard_post_init_user(void) { + keyboard_post_init_keymap(); + #ifdef STARTUP_NUMLOCK_ON + activate_numlock(true); // turn on Num lock by default so that the numpad layer always has predictable results + #endif // STARTUP_NUMLOC_ON + #ifdef IDLE_TIMEOUT_ENABLE + timeout_timer = timer_read(); // set inital time for ide timeout + #endif +} \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.h b/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.h new file mode 100644 index 000000000000..e2b53eee128d --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/jonavin.h @@ -0,0 +1,85 @@ + +/* Copyright 2021 Jonavin Eng @Jonavin + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +// DEFINE MACROS +#define ARRAYSIZE(arr) sizeof(arr)/sizeof(arr[0]) + + +// LAYERS +enum custom_user_layers { + _BASE, + _FN1, + _LOWER, + _RAISE, +}; + +// KEYCODES +enum custom_user_keycodes { + KC_00 = SAFE_RANGE, + ENCFUNC, + KC_WINLCK, //Toggles Win key on and off + RGB_TOI, // Timeout idle time up + RGB_TOD, // Timeout idle time down + RGB_NITE // Turns off all rgb but allow rgb indicators to work +}; + +#define KC_CAD LALT(LCTL(KC_DEL)) +#define KC_AF4 LALT(KC_F4) +#define KC_TASK LCTL(LSFT(KC_ESC)) + + +#ifdef TD_LSFT_CAPSLOCK_ENABLE + // Tap Dance Definitions + enum custom_tapdance { + TD_LSFT_CAPSLOCK, + TD_LSFT_CAPS_WIN + }; + + #define KC_LSFTCAPS TD(TD_LSFT_CAPSLOCK) + #define KC_LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) +#else // regular Shift + #define KC_LSFTCAPS KC_LSFT +#endif // TD_LSFT_CAPSLOCK_ENABLE + + +#ifdef RGB_MATRIX_ENABLE +//RGB custom colours + #define RGB_GODSPEED 0x00, 0xE4, 0xFF // colour for matching keycaps + #define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Nautilus Font colours + + void activate_rgb_nightmode (bool turn_on); + bool get_rgb_nightmode(void); +#endif + + +// IDLE TIMEOUTS +#ifdef IDLE_TIMEOUT_ENABLE + #define TIMEOUT_THRESHOLD_DEFAULT 5 // default timeout minutes + #define TIMEOUT_THRESHOLD_MAX 140 // upper limits (2 hours and 10 minutes -- no rgb indicators above this value) + + //prototype functions + uint16_t get_timeout_threshold(void); + void timeout_reset_timer(void); + void timeout_update_threshold(bool increase); + void timeout_tick_timer(void); +#endif //IDLE_TIMEOUT_ENABLE + + +// OTHER FUNCTION PROTOTYPE +void activate_numlock(bool turn_on); \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/railgun/keymap.c new file mode 100644 index 000000000000..020087532d60 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/keymap.c @@ -0,0 +1,194 @@ +/* Copyright 2021 Glorious, LLC + Copyright 2021 Jonavin + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_map.h" +#include "jonavin.h" + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Ins Rotary(Mute) +// ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Del +// Tab Q W E R T Y U I O P [ ] \ PgUp +// Caps A S D F G H J K L ; " Enter PgDn +// Sh_L Z X C V B N M , . ? Sh_R Up End +// Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right + + + [_BASE] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_MUTE, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + TT(_LOWER), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFTCAPSWIN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FN1] = LAYOUT( + _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_CALC, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, + _______, _______, RGB_VAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, RESET, KC_HOME, + KC_CAPS, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, _______, RGB_HUI, _______, _______, _______, KC_NLCK, _______, RGB_TOD, RGB_TOI, _______, _______, RGB_MOD, _______, + _______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + ), + + [_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______, + _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, KC_TAB, KC_P4, KC_P5, KC_P6, KC_PDOT, _______, _______, _______, KC_HOME, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, KC_P1, KC_P2, KC_P3, KC_NO, KC_PAST, KC_PENT, KC_END, + _______, KC_NO, KC_DEL, KC_INS, KC_NO, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, _______, RCTL(KC_PGUP), _______, + _______, _______, _______, KC_BSPC, _______, _______, _______, RCTL(KC_LEFT), RCTL(KC_PGDN), RCTL(KC_RIGHT) + ), + + [_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + + +#ifdef RGB_MATRIX_ENABLE + // Capslock, Scroll lock and Numlock indicator on Left side lights. + void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + if (IS_HOST_LED_ON(USB_LED_SCROLL_LOCK)) { + rgb_matrix_set_color(LED_L7, RGB_GOLD); + rgb_matrix_set_color(LED_L8, RGB_GOLD); + rgb_matrix_set_color(LED_R7, RGB_GOLD); + rgb_matrix_set_color(LED_R8, RGB_GOLD); + } + if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF + rgb_matrix_set_color(LED_L1, RGB_GOLD); + rgb_matrix_set_color(LED_L2, RGB_GOLD); + rgb_matrix_set_color(LED_R1, RGB_GOLD); + rgb_matrix_set_color(LED_R2, RGB_GOLD); + } + if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { + rgb_matrix_set_color(LED_L3, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L4, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L5, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L6, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R3, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R4, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R5, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R6, RGB_GOLDENROD); + } + if (keymap_config.no_gui) { + rgb_matrix_set_color(LED_LWIN, RGB_RED); //light up Win key when disabled + } + switch(get_highest_layer(layer_state)){ // special handling per layer + case _FN1: // on Fn layer select what the encoder does when pressed + /*rgb_matrix_set_color(LED_R2, RGB_RED); + rgb_matrix_set_color(LED_R3, RGB_RED); + rgb_matrix_set_color(LED_R4, RGB_RED); + rgb_matrix_set_color(LED_FN, RGB_RED); //FN key*/ + for (uint8_t i=0; i= 140 minutes, just show these 3 lights + rgb_matrix_set_color(LED_LIST_NUMROW[10], RGB_RED); + rgb_matrix_set_color(LED_LIST_NUMROW[11], RGB_RED); + rgb_matrix_set_color(LED_LIST_NUMROW[12], RGB_RED); + }*/ + break; + case _LOWER: + for (uint8_t i=0; i or encoder + - setting to zero disables timeout + - indicators in FN layer using RGB in FN and number rows to show the timeout in minutes + - LED address location map as enum definition + - LED group lists for arrows, numpad, F row, num row, left and right side LEDs + - default startuo in single mode with default colour + - Capslock, Scroll Lock, and Num Lock (not set) indicator on left side LED + - Layer indicator on right side LED + - Fn key light up red when Fn layer activate + - Win Key light up red when Win Lock mode enabled + - Layer 2 activation lights up Numpad area + +rules.mk OPTIONS - Active features from userspace +STARTUP_NUMLOCK_ON = yes + - turns on NUMLOCK by default + +ENCODER_DEFAULTACTIONS_ENABLE = yes + - Enabled default encoder funtions + +TD_LSFT_CAPSLOCK_ENABLE = yes + - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS + +IDLE_TIMEOUT_ENABLE = yes + - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically + +## All layers diagram +Default layer +![image](https://user-images.githubusercontent.com/71780717/124177658-82324880-da7e-11eb-9421-b69100131062.png) + +Fn Layer +![image](https://user-images.githubusercontent.com/71780717/126086069-bc539ffc-3ab6-4ebb-9bef-5005f8add294.png) + +Layer 2 (Caps Lock Mod) +![image](https://user-images.githubusercontent.com/71780717/124177683-8b231a00-da7e-11eb-9434-e2475f679a54.png) diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/rgb_matrix_map.h b/keyboards/gmmk/pro/ansi/keymaps/railgun/rgb_matrix_map.h new file mode 100644 index 000000000000..4be00d3f03f0 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/rgb_matrix_map.h @@ -0,0 +1,148 @@ +/* Copyright 2021 Jonavin Eng + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef RGB_MATRIX_ENABLE + + // Custom RGB Colours + #define RGB_GODSPEED 0x00, 0xE4, 0xFF // colour for matching keycaps + #define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Naurilus Font colours + + // RGB LED locations + enum led_location_map { + LED_ESC, // 0, ESC, k13 + LED_GRV, // 1, ~, k16 + LEB_TAB, // 2, Tab, k11 + LED_CAPS, // 3, Caps, k21 + LED_LSFT, // 4, Sh_L, k00 + LED_LCTL, // 5, Ct_L, k06 + LED_F1, // 6, F1, k26 + LED_1, // 7, 1, k17 + LED_Q, // 8, Q, k10 + LED_A, // 9, A, k12 + LED_Z, // 10, Z, k14 + LED_LWIN, // 11, Win_L, k90 + LED_F2, // 12, F2, k36 + LED_2, // 13, 2, k27 + LED_W, // 14, W, k20 + LED_S, // 15, S, k22 + LED_X, // 16, X, k24 + LED_LALT, // 17, Alt_L, k93 + LED_F3, // 18, F3, k31 + LED_3, // 19, 3, k37 + LED_E, // 20, E, k30 + LED_D, // 21, D, k32 + LED_C, // 22, C, k34 + LED_F4, // 23, F4, k33 + LED_4, // 24, 4, k47 + LED_R, // 25, R, k40 + LED_F, // 26, F, k42 + LED_V, // 27, V, k44 + LED_F5, // 28, F5, k07 + LED_5, // 29, 5, k46 + LED_T, // 30, T, k41 + LED_G, // 31, G, k43 + LED_B, // 32, B, k45 + LED_SPC, // 33, SPACE, k94 + LED_F6, // 34, F6, k63 + LED_6, // 35, 6, k56 + LED_Y, // 36, Y, k51 + LED_H, // 37, H, k53 + LED_N, // 38, N, k55 + LED_F7, // 39, F7, k71 + LED_7, // 40, 7, k57 + LED_U, // 41, U, k50 + LED_J, // 42, J, k52 + LED_M, // 43, M, k54 + LED_F8, // 44, F8, k76 + LED_8, // 45, 8, k67 + LED_I, // 46, I, k60 + LED_K, // 47, K, k62 + LED_COMM, // 48, ,, k64 + LED_RALT, // 49, Alt_R, k95 + LED_F9, // 50, F9, ka6 + LED_9, // 51, 9, k77 + LED_O, // 52, O, k70 + LED_L, // 53, L, k72 + LED_DOT, // 54, ., k74 + LED_FN, // 55, FN, k92 + LED_F10, // 56, F10, ka7 + LED_0, // 57, 0, k87 + LED_P, // 58, P, k80 + LED_SCLN, // 59, ;, k82 + LED_SLSH, // 60, ?, k85 + LED_F11, // 61, F11, ka3 + LED_MINS, // 62, -, k86 + LED_LBRC, // 63, [, k81 + LED_QUOT, // 64, ", k83 + LED_RCTL, // 65, Ct_R, k04 + LED_F12, // 66, F12, ka5 + LED_L1, // 67, LED, l01 + LED_R1, // 68, LED, l11 + LED_INS, // 69, Prt, k97 -- remapped to INS + LED_L2, // 70, LED, l02 + LED_R2, // 71, LED, l12 + LED_HOME, // 72, Del, k65 + LED_L3, // 73, LED, l03 + LED_R3, // 74, LED, l13 + LED_PGUP, // 75, PgUp, k15 + LED_L4, // 76, LED, l04 + LED_R4, // 77, LED, l14 + LED_EQL, // 78, =, k66 + LED_RIGHT, // 79, Right, k05 + LED_L5, // 80, LED, l05 + LED_R5, // 81, LED, l15 + LED_END, // 82, End, k75 + LED_L6, // 83, LED, l06 + LED_R6, // 84, LED, l16 + LED_BSPC, // 85, BSpc, ka1 + LED_PGDN, // 86, PgDn, k25 + LED_L7, // 87, LED, l07 + LED_R7, // 88, LED, l17 + LED_RBRC, // 89, ], k61 + LED_RSFT, // 90, Sh_R, k91 + LED_L8, // 91, LED, l08 + LED_R8, // 92, LED, l18 + LED_BSLS, // 93, \, ka2 + LED_UP, // 94, Up, k35 + LED_LEFT, // 95, Left, k03 + LED_ENT, // 96, Enter, ka4 + LED_DOWN // 97, Down, k73 + }; + + const uint8_t LED_LIST_WASD[] = { LED_W, LED_A, LED_S, LED_D }; + + const uint8_t LED_LIST_ARROWS[] = { LED_LEFT, LED_RIGHT, LED_UP, LED_DOWN }; + + const uint8_t LED_LIST_FUNCROW[] = { LED_ESC, LED_F1, LED_F2, LED_F3, LED_F4, LED_F5, LED_F6, LED_F7, LED_F8, LED_F9, LED_F10, LED_F11, LED_F12, LED_INS}; + + const uint8_t LED_LIST_NUMROW[] = { LED_GRV, LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL, LED_BSPC, LED_HOME}; + + const uint8_t LED_LIST_NAV[] = { LED_HOME, LED_PGUP, LED_PGDN, LED_END}; + + const uint8_t LED_LIST_MODS[] = { LEB_TAB, LED_CAPS, LED_LSFT, LED_LCTL, LED_LWIN, LED_LALT, LED_RALT, LED_FN, LED_RCTL}; + + const uint8_t LED_LIST_NUMPAD[] = { + LED_7, LED_8, LED_9, + LED_U, LED_I, LED_O, + LED_J, LED_K, LED_L, + LED_M, LED_COMM, LED_DOT + }; + + const uint8_t LED_SIDE_LEFT[] = { LED_L1, LED_L2, LED_L3, LED_L4, LED_L5, LED_L6, LED_L7, LED_L8}; + + const uint8_t LED_SIDE_RIGHT[] = { LED_R1, LED_R2, LED_R3, LED_R4, LED_R5, LED_R6, LED_R7, LED_R8}; + +#endif diff --git a/keyboards/gmmk/pro/ansi/keymaps/railgun/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/railgun/rules.mk new file mode 100644 index 000000000000..a6b64334558d --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/railgun/rules.mk @@ -0,0 +1,32 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = lite # Enable Bootmagic Lite + +TD_LSFT_CAPSLOCK_ENABLE = yes +IDLE_TIMEOUT_ENABLE = yes +STARTUP_NUMLOCK_ON = yes +ENCODER_DEFAULTACTIONS_ENABLE = yes + +LEADER_ENABLE = no # Leader keys +COMBO_ENABLE = no # Combo keys +TAP_DANCE_ENABLE = yes + +LTO_ENABLE = no # MCU has 256kB space - 4kB for the EEPROM. + + +SRC += jonavin.c +ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes) + OPT_DEFS += -DENCODER_DEFAULTACTIONS_ENABLE +endif +ifeq ($(strip $(TD_LSFT_CAPSLOCK_ENABLE)), yes) + OPT_DEFS += -DTD_LSFT_CAPSLOCK_ENABLE +endif +ifeq ($(strip $(IDLE_TIMEOUT_ENABLE)), yes) + OPT_DEFS += -DIDLE_TIMEOUT_ENABLE +endif +ifeq ($(strip $(STARTUP_NUMLOCK_ON)), yes) + OPT_DEFS += -DSTARTUP_NUMLOCK_ON +endif +ifeq ($(strip $(COLEMAK_LAYER_ENABLE)), yes) + OPT_DEFS += -DCOLEMAK_LAYER_ENABLE +endif \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/config.h b/keyboards/gmmk/pro/ansi/keymaps/solartempest/config.h new file mode 100644 index 000000000000..202a321f7689 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/config.h @@ -0,0 +1,83 @@ +/* Copyright 2021 Jonavin Eng + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define TAPPING_TOGGLE 2 // TT set to two taps +#define TAPPING_TERM 180 + +// Handle GRAVESC combo keys +//#define GRAVE_ESC_ALT_OVERRIDE //Always send Escape if Alt is pressed +//#define GRAVE_ESC_CTRL_OVERRIDE //Always send Escape if Control is pressed + +// NKRO Settings +#ifdef NKRO_ENABLE + #define FORCE_NKRO //Force NKRO if enabled. +#endif + +//RGB Settings +#ifdef RGB_MATRIX_ENABLE + #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_HUE_WAVE + #define RGB_DISABLE_WHEN_USB_SUSPENDED + #define RGB_DISABLE_TIMEOUT 300000 //300000ms = 5 minutes (Suspect the max timer is <5mins). + + #define RGB_MATRIX_KEYPRESSES //Remove or keep effects not desired + #undef ENABLE_RGB_MATRIX_SOLID_COLOR + #undef ENABLE_RGB_MATRIX_ALPHAS_MODS + #undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN + #undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT + #undef ENABLE_RGB_MATRIX_BREATHING + #undef ENABLE_RGB_MATRIX_BAND_SAT + #undef ENABLE_RGB_MATRIX_BAND_VAL + #undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT + #undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL + #undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT + #undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL + #undef ENABLE_RGB_MATRIX_CYCLE_ALL + #undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + #undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN + #undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + #undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN + #undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL + #undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL + #undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL + #undef ENABLE_RGB_MATRIX_DUAL_BEACON + #undef ENABLE_RGB_MATRIX_RAINBOW_BEACON + #undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS + #undef ENABLE_RGB_MATRIX_RAINDROPS + #undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + #undef ENABLE_RGB_MATRIX_HUE_BREATHING + #undef ENABLE_RGB_MATRIX_HUE_PENDULUM + #define ENABLE_RGB_MATRIX_HUE_WAVE //Enabled + #undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL + #undef ENABLE_RGB_MATRIX_PIXEL_RAIN + #undef ENABLE_RGB_MATRIX_PIXEL_FLOW + #undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL + #undef ENABLE_RGB_MATRIX_TYPING_HEATMAP + #undef ENABLE_RGB_MATRIX_DIGITAL_RAIN + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS + #undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS + #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS //Enabled + #undef ENABLE_RGB_MATRIX_SPLASH + #undef ENABLE_RGB_MATRIX_MULTISPLASH + #undef ENABLE_RGB_MATRIX_SOLID_SPLASH + #undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +#endif diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro VIA layout.json b/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro VIA layout.json new file mode 100644 index 000000000000..50c89c1494a0 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro VIA layout.json @@ -0,0 +1,367 @@ +{ + "name": "GMMK Pro", + "vendorProductId": 839864388, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_LSFT", + "KC_MUTE", + "KC_NO", + "KC_LEFT", + "KC_RCTL", + "KC_RGHT", + "KC_LCTL", + "KC_F5", + "KC_Q", + "KC_TAB", + "KC_A", + "KC_ESC", + "KC_Z", + "KC_PGUP", + "KC_GRV", + "KC_1", + "KC_W", + "TT(2)", + "KC_S", + "KC_NO", + "KC_X", + "KC_PGDN", + "KC_F1", + "KC_2", + "KC_E", + "KC_F3", + "KC_D", + "KC_F4", + "KC_C", + "KC_UP", + "KC_F2", + "KC_3", + "KC_R", + "KC_T", + "KC_F", + "KC_G", + "KC_V", + "KC_B", + "KC_5", + "KC_4", + "KC_U", + "KC_Y", + "KC_J", + "KC_H", + "KC_M", + "KC_N", + "KC_6", + "KC_7", + "KC_I", + "KC_RBRC", + "KC_K", + "KC_F6", + "KC_COMM", + "KC_HOME", + "KC_EQL", + "KC_8", + "KC_O", + "KC_F7", + "KC_L", + "KC_DOWN", + "KC_DOT", + "KC_END", + "KC_F8", + "KC_9", + "KC_P", + "KC_LBRC", + "KC_SCLN", + "KC_QUOT", + "KC_NO", + "KC_SLSH", + "KC_MINS", + "KC_0", + "KC_LGUI", + "KC_RSFT", + "MO(1)", + "KC_LALT", + "KC_SPC", + "KC_RALT", + "KC_NO", + "KC_DEL", + "KC_NO", + "KC_BSPC", + "KC_BSLS", + "KC_F11", + "KC_ENT", + "KC_F12", + "KC_F9", + "KC_F10" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "RGB_SPD", + "TO(3)", + "RGB_SPI", + "KC_TRNS", + "KC_MPRV", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_HOME", + "KC_TRNS", + "KC_TRNS", + "RGB_VAI", + "KC_CAPS", + "RGB_VAD", + "KC_NO", + "KC_TRNS", + "KC_END", + "KC_MYCM", + "KC_TRNS", + "RGB_HUI", + "KC_CALC", + "RGB_HUD", + "KC_MSEL", + "KC_TRNS", + "RGB_MOD", + "KC_WWW_HOME", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_PSCR", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NLCK", + "KC_TRNS", + "KC_TRNS", + "KC_SLCK", + "KC_TRNS", + "KC_TRNS", + "KC_MNXT", + "KC_NLCK", + "RGB_TOG", + "KC_TRNS", + "KC_TRNS", + "KC_PAUS", + "KC_MPLY", + "KC_TRNS", + "RGB_RMOD", + "KC_SLCK", + "KC_TRNS", + "KC_MSTP", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F14", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F13", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_CAPS", + "KC_NO", + "KC_CALC", + "KC_NO", + "KC_TRNS", + "RESET", + "KC_VOLU", + "KC_TRNS", + "KC_TRNS", + "KC_MUTE", + "KC_VOLD" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "C(RCTL(KC_LEFT))", + "KC_TRNS", + "C(RCTL(KC_RGHT))", + "KC_TRNS", + "KC_TRNS", + "KC_HOME", + "KC_TRNS", + "KC_LEFT", + "KC_TRNS", + "KC_CAPS", + "KC_HOME", + "C(S(KC_M))", + "C(S(KC_B))", + "KC_UP", + "TO(0)", + "KC_DOWN", + "KC_NO", + "KC_DEL", + "KC_END", + "KC_TRNS", + "KC_TRNS", + "KC_END", + "KC_TRNS", + "KC_RGHT", + "KC_TRNS", + "KC_INS", + "C(RCTL(KC_PGUP))", + "KC_TRNS", + "KC_TRNS", + "KC_PGUP", + "KC_TRNS", + "KC_PGDN", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_P4", + "KC_TAB", + "KC_P1", + "KC_TRNS", + "KC_P0", + "KC_NO", + "KC_TRNS", + "KC_P7", + "KC_P5", + "KC_TRNS", + "KC_P2", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_PPLS", + "KC_P8", + "KC_P6", + "KC_TRNS", + "KC_P3", + "C(RCTL(KC_PGDN))", + "KC_PDOT", + "KC_TRNS", + "KC_TRNS", + "KC_P9", + "KC_PPLS", + "KC_TRNS", + "KC_PENT", + "KC_PAST", + "KC_NO", + "KC_PSLS", + "KC_PMNS", + "KC_P0", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_BSPC", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_PENT", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_F22", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ] + ] +} \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro_ansi_solartempest.bin b/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro_ansi_solartempest.bin new file mode 100644 index 000000000000..543666052026 Binary files /dev/null and b/keyboards/gmmk/pro/ansi/keymaps/solartempest/gmmk_pro_ansi_solartempest.bin differ diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.c b/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.c new file mode 100644 index 000000000000..90c46f69d6aa --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.c @@ -0,0 +1,219 @@ + +/* Copyright 2021 Jonavin Eng @Jonavin + Copyright 2021 solartempest + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#include QMK_KEYBOARD_H +#include "jonavin.h" + + +#ifdef TD_LSFT_CAPSLOCK_ENABLE + // Tap once for shift, twice for Caps Lock but only if Win Key in not disabled + void dance_LSFT_finished(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1 || keymap_config.no_gui) { + register_code16(KC_LSFT); + } else { + register_code(KC_CAPS); + } + } + + void dance_LSFT_reset(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1 || keymap_config.no_gui) { + unregister_code16(KC_LSFT); + } else { + unregister_code(KC_CAPS); + } + } + + qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for shift, twice for Caps Lock + [TD_LSFT_CAPSLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), + [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_LSFT_finished, dance_LSFT_reset), + }; +#endif // TD_LSFT_CAPSLOCK_ENABLE + +// RGB NIGHT MODE +#ifdef RGB_MATRIX_ENABLE + static bool rgb_nightmode = false; + + // Turn on/off NUM LOCK if current state is different + void activate_rgb_nightmode (bool turn_on) { + if (rgb_nightmode != turn_on) { + rgb_nightmode = !rgb_nightmode; + } + } + + bool get_rgb_nightmode(void) { + return rgb_nightmode; + } +#endif // RGB_MATRIX_ENABLE + + +#if defined(ENCODER_ENABLE) && defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality + #ifndef DYNAMIC_KEYMAP_LAYER_COUNT + #define DYNAMIC_KEYMAP_LAYER_COUNT 4 //default in case this is not already defined elsewhere + #endif + #ifndef ENCODER_DEFAULTACTIONS_INDEX + #define ENCODER_DEFAULTACTIONS_INDEX 0 // can select encoder index if there are multiple encoders + #endif + +uint8_t selected_layer = 0; + +__attribute__((weak)) bool encoder_update_keymap(uint8_t index, bool clockwise) { return true; } + +bool encoder_update_user(uint8_t index, bool clockwise) { + if (!encoder_update_keymap(index, clockwise)) { return false; } //This is to override the default kb function and go to userspace + if (index != ENCODER_DEFAULTACTIONS_INDEX) {return true;} // exit if the index doesn't match + if ( clockwise ) { + if (get_mods() & MOD_BIT(KC_LSFT) ) { // If you are holding L shift, encoder changes layers + if(selected_layer < (DYNAMIC_KEYMAP_LAYER_COUNT - 1)) { + selected_layer ++; + layer_move(selected_layer); + } + } else if (get_mods() & MOD_BIT(KC_RSFT) ) { // If you are holding R shift, Page up + unregister_mods(MOD_BIT(KC_RSFT)); + register_code(KC_PGDN); + register_mods(MOD_BIT(KC_RSFT)); + } else if (get_mods() & MOD_BIT(KC_LCTL)) { // if holding Left Ctrl, navigate next word + tap_code16(LCTL(KC_RGHT)); + } else if (get_mods() & MOD_BIT(KC_LALT)) { // if holding Left Alt, move window to right monitor + unregister_mods(MOD_BIT(KC_LALT)); + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + register_mods(MOD_BIT(KC_LALT)); + } else { + switch (selected_layer) { + default: + tap_code(KC_VOLU); // Otherwise it just changes volume + break; + } + } + } else { + if (get_mods() & MOD_BIT(KC_LSFT) ) { + if (selected_layer > 0) { + selected_layer --; + layer_move(selected_layer); + } + } else if (get_mods() & MOD_BIT(KC_RSFT) ) { + unregister_mods(MOD_BIT(KC_RSFT)); + register_code(KC_PGUP); + register_mods(MOD_BIT(KC_RSFT)); + } else if (get_mods() & MOD_BIT(KC_LCTL)) { // if holding Left Ctrl, navigate previous word + tap_code16(LCTL(KC_LEFT)); + } else if (get_mods() & MOD_BIT(KC_LALT)) { // if holding Left Alt, move window to left monitor + unregister_mods(MOD_BIT(KC_LALT)); + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + register_mods(MOD_BIT(KC_LALT)); + } else { + switch (selected_layer) { + default: + tap_code(KC_VOLD); + break; + } + } + } + + return true; + } +#endif // ENCODER_ENABLE + + +// PROCESS KEY CODES +__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keymap(keycode, record)) { return false; } + switch (keycode) { + case KC_00: + if (record->event.pressed) { + // when keycode KC_00 is pressed + SEND_STRING("00"); + } else unregister_code16(keycode); + break; + case KC_WINLCK: + if (record->event.pressed) { + keymap_config.no_gui = !keymap_config.no_gui; //toggle status + } else unregister_code16(keycode); + break; + + #ifdef RGB_MATRIX_ENABLE + case RGB_NITE: + if(record->event.pressed) { + rgb_nightmode = !rgb_nightmode; + } else unregister_code16(keycode); + break; + #endif // RGB_MATRIX_ENABLE + + case NMR: //Move window to next monitor on right + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + case NML: //Move window to next monitor on left + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + + default: + if (record->event.pressed) { + #ifdef RGB_MATRIX_ENABLE + rgb_matrix_enable_noeeprom(); + #endif + } + break; + } + return true; +}; + + +// Turn on/off NUM LOCK if current state is different +void activate_numlock(bool turn_on) { + if (IS_HOST_LED_ON(USB_LED_NUM_LOCK) != turn_on) { + tap_code(KC_NUMLOCK); + } +} + + +// INITIAL STARTUP +__attribute__ ((weak)) void keyboard_post_init_keymap(void) {} + +void keyboard_post_init_user(void) { + keyboard_post_init_keymap(); + #ifdef STARTUP_NUMLOCK_ON + activate_numlock(true); // turn on Num lock by default so that the numpad layer always has predictable results + #endif // STARTUP_NUMLOC_ON +} \ No newline at end of file diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.h b/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.h new file mode 100644 index 000000000000..49e79054cb90 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/jonavin.h @@ -0,0 +1,68 @@ + +/* Copyright 2021 Jonavin Eng @Jonavin + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +// DEFINE MACROS +#define ARRAYSIZE(arr) sizeof(arr)/sizeof(arr[0]) + + +// LAYERS +enum custom_user_layers { + _BASE, + _FN1, + _LOWER, + _RAISE, +}; + +// KEYCODES +enum custom_user_keycodes { + KC_00 = SAFE_RANGE, + ENCFUNC, //Encoder functions + KC_WINLCK, //Toggles Win key on and off + RGB_NITE, //Turns off all rgb but allow rgb indicators to work + NMR, //Move window to monitor on right + NML //Move window to monitor on left +}; + +#define KC_CAD LALT(LCTL(KC_DEL)) +#define KC_AF4 LALT(KC_F4) +#define KC_TASK LCTL(LSFT(KC_ESC)) + + +#ifdef TD_LSFT_CAPSLOCK_ENABLE + // Tap Dance Definitions + enum custom_tapdance { + TD_LSFT_CAPSLOCK, + TD_LSFT_CAPS_WIN + }; + + #define KC_LSFTCAPS TD(TD_LSFT_CAPSLOCK) + #define KC_LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) +#else // regular Shift + #define KC_LSFTCAPS KC_LSFT +#endif // TD_LSFT_CAPSLOCK_ENABLE + + +#ifdef RGB_MATRIX_ENABLE + void activate_rgb_nightmode (bool turn_on); + bool get_rgb_nightmode(void); +#endif + + +// OTHER FUNCTION PROTOTYPE +void activate_numlock(bool turn_on); diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/solartempest/keymap.c new file mode 100644 index 000000000000..97d30b0cf9c2 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/keymap.c @@ -0,0 +1,173 @@ +/* Copyright 2021 Glorious, LLC + Copyright 2021 Jonavin + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_map.h" +#include "jonavin.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Ins Rotary(Mute) +// ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Del +// Tab Q W E R T Y U I O P [ ] \ PgUp +// Caps A S D F G H J K L ; " Enter PgDn +// Sh_L Z X C V B N M , . ? Sh_R Up End +// Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right + + + [_BASE] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_MUTE, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + TT(_LOWER), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFTCAPSWIN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FN1] = LAYOUT( + _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_CALC, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, + _______, _______, RGB_VAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, RESET, KC_HOME, + KC_CAPS, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, _______, RGB_HUI, _______, _______, _______, KC_NLCK, _______, _______, _______, _______, _______, RGB_MOD, _______, + _______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + ), + + [_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______, + _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, KC_TAB, KC_P4, KC_P5, KC_P6, KC_PDOT, _______, _______, _______, KC_HOME, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, KC_P1, KC_P2, KC_P3, KC_NO, KC_PAST, KC_PENT, KC_END, + _______, KC_NO, KC_DEL, KC_INS, KC_NO, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, _______, RCTL(KC_PGUP), _______, + _______, _______, _______, KC_BSPC, _______, _______, _______, RCTL(KC_LEFT), RCTL(KC_PGDN), RCTL(KC_RIGHT) + ), + + [_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + + +#ifdef RGB_MATRIX_ENABLE + // Capslock, Scroll lock and Numlock indicator on Left side lights. + void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + if (IS_HOST_LED_ON(USB_LED_SCROLL_LOCK)) { + rgb_matrix_set_color(LED_L7, RGB_GOLD); + rgb_matrix_set_color(LED_L8, RGB_GOLD); + rgb_matrix_set_color(LED_R7, RGB_GOLD); + rgb_matrix_set_color(LED_R8, RGB_GOLD); + } + if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF + rgb_matrix_set_color(LED_L1, RGB_GOLD); + rgb_matrix_set_color(LED_L2, RGB_GOLD); + rgb_matrix_set_color(LED_R1, RGB_GOLD); + rgb_matrix_set_color(LED_R2, RGB_GOLD); + } + if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { + rgb_matrix_set_color(LED_L3, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L4, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L5, RGB_GOLDENROD); + rgb_matrix_set_color(LED_L6, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R3, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R4, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R5, RGB_GOLDENROD); + rgb_matrix_set_color(LED_R6, RGB_GOLDENROD); + } + if (keymap_config.no_gui) { + rgb_matrix_set_color(LED_LWIN, RGB_RED); //light up Win key when disabled + } + switch(get_highest_layer(layer_state)){ // special handling per layer + case _FN1: // on Fn layer select what the encoder does when pressed + /*rgb_matrix_set_color(LED_R2, RGB_RED); //Show the active layer as red + rgb_matrix_set_color(LED_R3, RGB_RED); + rgb_matrix_set_color(LED_R4, RGB_RED); + rgb_matrix_set_color(LED_FN, RGB_RED); //FN key*/ + for (uint8_t i=0; i or encoder + - setting to zero disables timeout + - indicators in FN layer using RGB in FN and number rows to show the timeout in minutes + - LED address location map as enum definition + - LED group lists for arrows, numpad, F row, num row, left and right side LEDs + - default startuo in single mode with default colour + - Capslock, Scroll Lock, and Num Lock (not set) indicator on left side LED + - Layer indicator on right side LED + - Fn key light up red when Fn layer activate + - Win Key light up red when Win Lock mode enabled + - Layer 2 activation lights up Numpad area + +rules.mk OPTIONS - Active features from userspace +STARTUP_NUMLOCK_ON = yes + - turns on NUMLOCK by default + +ENCODER_DEFAULTACTIONS_ENABLE = yes + - Enabled default encoder funtions + +TD_LSFT_CAPSLOCK_ENABLE = yes + - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS + +IDLE_TIMEOUT_ENABLE = yes + - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically + +## All layers diagram +Default layer +![image](https://user-images.githubusercontent.com/71780717/124177658-82324880-da7e-11eb-9421-b69100131062.png) + +Fn Layer +![image](https://user-images.githubusercontent.com/71780717/126086069-bc539ffc-3ab6-4ebb-9bef-5005f8add294.png) + +Layer 2 (Caps Lock Mod) +![image](https://user-images.githubusercontent.com/71780717/124177683-8b231a00-da7e-11eb-9434-e2475f679a54.png) diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/rgb_matrix_map.h b/keyboards/gmmk/pro/ansi/keymaps/solartempest/rgb_matrix_map.h new file mode 100644 index 000000000000..8b5acea0ca3a --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/rgb_matrix_map.h @@ -0,0 +1,148 @@ +/* Copyright 2021 Jonavin Eng + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef RGB_MATRIX_ENABLE + + // Custom RGB Colours + //#define RGB_GODSPEED 0x00, 0xE4, 0xFF // colour for matching keycaps + //#define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Naurilus Font colours + + // RGB LED locations + enum led_location_map { + LED_ESC, // 0, ESC, k13 + LED_GRV, // 1, ~, k16 + LEB_TAB, // 2, Tab, k11 + LED_CAPS, // 3, Caps, k21 + LED_LSFT, // 4, Sh_L, k00 + LED_LCTL, // 5, Ct_L, k06 + LED_F1, // 6, F1, k26 + LED_1, // 7, 1, k17 + LED_Q, // 8, Q, k10 + LED_A, // 9, A, k12 + LED_Z, // 10, Z, k14 + LED_LWIN, // 11, Win_L, k90 + LED_F2, // 12, F2, k36 + LED_2, // 13, 2, k27 + LED_W, // 14, W, k20 + LED_S, // 15, S, k22 + LED_X, // 16, X, k24 + LED_LALT, // 17, Alt_L, k93 + LED_F3, // 18, F3, k31 + LED_3, // 19, 3, k37 + LED_E, // 20, E, k30 + LED_D, // 21, D, k32 + LED_C, // 22, C, k34 + LED_F4, // 23, F4, k33 + LED_4, // 24, 4, k47 + LED_R, // 25, R, k40 + LED_F, // 26, F, k42 + LED_V, // 27, V, k44 + LED_F5, // 28, F5, k07 + LED_5, // 29, 5, k46 + LED_T, // 30, T, k41 + LED_G, // 31, G, k43 + LED_B, // 32, B, k45 + LED_SPC, // 33, SPACE, k94 + LED_F6, // 34, F6, k63 + LED_6, // 35, 6, k56 + LED_Y, // 36, Y, k51 + LED_H, // 37, H, k53 + LED_N, // 38, N, k55 + LED_F7, // 39, F7, k71 + LED_7, // 40, 7, k57 + LED_U, // 41, U, k50 + LED_J, // 42, J, k52 + LED_M, // 43, M, k54 + LED_F8, // 44, F8, k76 + LED_8, // 45, 8, k67 + LED_I, // 46, I, k60 + LED_K, // 47, K, k62 + LED_COMM, // 48, ,, k64 + LED_RALT, // 49, Alt_R, k95 + LED_F9, // 50, F9, ka6 + LED_9, // 51, 9, k77 + LED_O, // 52, O, k70 + LED_L, // 53, L, k72 + LED_DOT, // 54, ., k74 + LED_FN, // 55, FN, k92 + LED_F10, // 56, F10, ka7 + LED_0, // 57, 0, k87 + LED_P, // 58, P, k80 + LED_SCLN, // 59, ;, k82 + LED_SLSH, // 60, ?, k85 + LED_F11, // 61, F11, ka3 + LED_MINS, // 62, -, k86 + LED_LBRC, // 63, [, k81 + LED_QUOT, // 64, ", k83 + LED_RCTL, // 65, Ct_R, k04 + LED_F12, // 66, F12, ka5 + LED_L1, // 67, LED, l01 + LED_R1, // 68, LED, l11 + LED_INS, // 69, Prt, k97 -- remapped to INS + LED_L2, // 70, LED, l02 + LED_R2, // 71, LED, l12 + LED_HOME, // 72, Del, k65 + LED_L3, // 73, LED, l03 + LED_R3, // 74, LED, l13 + LED_PGUP, // 75, PgUp, k15 + LED_L4, // 76, LED, l04 + LED_R4, // 77, LED, l14 + LED_EQL, // 78, =, k66 + LED_RIGHT, // 79, Right, k05 + LED_L5, // 80, LED, l05 + LED_R5, // 81, LED, l15 + LED_END, // 82, End, k75 + LED_L6, // 83, LED, l06 + LED_R6, // 84, LED, l16 + LED_BSPC, // 85, BSpc, ka1 + LED_PGDN, // 86, PgDn, k25 + LED_L7, // 87, LED, l07 + LED_R7, // 88, LED, l17 + LED_RBRC, // 89, ], k61 + LED_RSFT, // 90, Sh_R, k91 + LED_L8, // 91, LED, l08 + LED_R8, // 92, LED, l18 + LED_BSLS, // 93, \, ka2 + LED_UP, // 94, Up, k35 + LED_LEFT, // 95, Left, k03 + LED_ENT, // 96, Enter, ka4 + LED_DOWN // 97, Down, k73 + }; + + const uint8_t LED_LIST_WASD[] = { LED_W, LED_A, LED_S, LED_D }; + + const uint8_t LED_LIST_ARROWS[] = { LED_LEFT, LED_RIGHT, LED_UP, LED_DOWN }; + + const uint8_t LED_LIST_FUNCROW[] = { LED_ESC, LED_F1, LED_F2, LED_F3, LED_F4, LED_F5, LED_F6, LED_F7, LED_F8, LED_F9, LED_F10, LED_F11, LED_F12, LED_INS}; + + const uint8_t LED_LIST_NUMROW[] = { LED_GRV, LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL, LED_BSPC, LED_HOME}; + + const uint8_t LED_LIST_NAV[] = { LED_HOME, LED_PGUP, LED_PGDN, LED_END}; + + const uint8_t LED_LIST_MODS[] = { LEB_TAB, LED_CAPS, LED_LSFT, LED_LCTL, LED_LWIN, LED_LALT, LED_RALT, LED_FN, LED_RCTL}; + + const uint8_t LED_LIST_NUMPAD[] = { + LED_7, LED_8, LED_9, + LED_U, LED_I, LED_O, + LED_J, LED_K, LED_L, + LED_M, LED_COMM, LED_DOT + }; + + const uint8_t LED_SIDE_LEFT[] = { LED_L1, LED_L2, LED_L3, LED_L4, LED_L5, LED_L6, LED_L7, LED_L8}; + + const uint8_t LED_SIDE_RIGHT[] = { LED_R1, LED_R2, LED_R3, LED_R4, LED_R5, LED_R6, LED_R7, LED_R8}; + +#endif diff --git a/keyboards/gmmk/pro/ansi/keymaps/solartempest/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/solartempest/rules.mk new file mode 100644 index 000000000000..084c4a9a1957 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/solartempest/rules.mk @@ -0,0 +1,26 @@ +VIA_ENABLE = yes # VIA + +MOUSEKEY_ENABLE = yes # Mouse keys for keymap +BOOTMAGIC_ENABLE = lite # Enable Bootmagic Lite +LTO_ENABLE = no # MCU has 256kB space - 4kB for the EEPROM + +TD_LSFT_CAPSLOCK_ENABLE = yes # Enable Jonavin's custom left shift keycode. Requires Tap Dance. +TAP_DANCE_ENABLE = yes # Tap Dance +STARTUP_NUMLOCK_ON = yes # Turns numlock on by default +ENCODER_DEFAULTACTIONS_ENABLE = yes # Enable Jonavin's custom encoder actions + +LEADER_ENABLE = no # Leader keys +COMBO_ENABLE = no # Combo keys +NKRO_ENABLE = yes # NKRO + + +SRC += jonavin.c # Includes code for Jonavin's custom functions +ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes) + OPT_DEFS += -DENCODER_DEFAULTACTIONS_ENABLE +endif +ifeq ($(strip $(TD_LSFT_CAPSLOCK_ENABLE)), yes) + OPT_DEFS += -DTD_LSFT_CAPSLOCK_ENABLE +endif +ifeq ($(strip $(STARTUP_NUMLOCK_ON)), yes) + OPT_DEFS += -DSTARTUP_NUMLOCK_ON +endif diff --git a/keyboards/keychron/q1/chconf.h b/keyboards/keychron/q1/chconf.h new file mode 100644 index 000000000000..cbbae31079fb --- /dev/null +++ b/keyboards/keychron/q1/chconf.h @@ -0,0 +1,25 @@ +/* Copyright 2020 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define CH_CFG_ST_FREQUENCY 10000 + +#define CH_CFG_OPTIMIZE_SPEED FALSE + +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +#include_next diff --git a/keyboards/keychron/q1/config.h b/keyboards/keychron/q1/config.h index 669e9ef7ba00..4915f7a8fcfe 100644 --- a/keyboards/keychron/q1/config.h +++ b/keyboards/keychron/q1/config.h @@ -16,6 +16,10 @@ #pragma once +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x3434 +#define MANUFACTURER Keychron +#define PRODUCT Keychron Q1 /* key matrix size */ #define MATRIX_ROWS 6 #define MATRIX_COLS 15 @@ -26,14 +30,6 @@ /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 -/* RGB Matrix Driver Configuration */ -#define DRIVER_COUNT 2 -#define DRIVER_ADDR_1 0b1010000 -#define DRIVER_ADDR_2 0b1011111 - -/* DIP switch */ -#define DIP_SWITCH_MATRIX_GRID { {0,1} } - /* Disable DIP switch in matrix data */ #define MATRIX_MASKED diff --git a/keyboards/keychron/q1/halconf.h b/keyboards/keychron/q1/halconf.h new file mode 100644 index 000000000000..41bddcb2799b --- /dev/null +++ b/keyboards/keychron/q1/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2020 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next diff --git a/keyboards/keychron/q1/matrix.c b/keyboards/keychron/q1/matrix.c new file mode 100644 index 000000000000..1bcd4b5d0c94 --- /dev/null +++ b/keyboards/keychron/q1/matrix.c @@ -0,0 +1,172 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include "util.h" +#include "matrix.h" +#include "debounce.h" +#include "quantum.h" + +#define DS A7 +#define STCP B0 +#define SHCP B1 + +#ifdef MATRIX_ROW_PINS +static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +#endif // MATRIX_ROW_PINS +#ifdef MATRIX_COL_PINS +static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#endif // MATRIX_COL_PINS + +/* matrix state(1:on, 0:off) */ +extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values +extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values + +static inline void setPinOutput_writeLow(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinOutput(pin); + writePinLow(pin); + } +} + +static inline void setPinOutput_writeHigh(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinOutput(pin); + writePinHigh(pin); + } +} + +static inline void setPinInputHigh_atomic(pin_t pin) { + ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); } +} + +static inline uint8_t readMatrixPin(pin_t pin) { + if (pin != NO_PIN) { + return readPin(pin); + } else { + return 1; + } +} + +static void delay_nTime(uint8_t time) { + while(time--); +} + +static void SendTo595(uint8_t byteData) { + uint8_t i = 0; + + for (; i < 8; i++) { + if (byteData & 0x1) { + setPinOutput_writeHigh(DS); + } else { + setPinOutput_writeLow(DS); + } + byteData = byteData>>1; + + setPinOutput_writeHigh(SHCP); + delay_nTime(10); + setPinOutput_writeLow(SHCP); + } + setPinOutput_writeHigh(STCP); + delay_nTime(10); + setPinOutput_writeLow(STCP); +} + +static bool select_col(uint8_t col) { + pin_t pin = col_pins[col]; + + if (pin != NO_PIN) { + setPinOutput_writeLow(pin); + return true; + } else { + SendTo595(~(0x1<<(MATRIX_COLS - col -1))); + return true; + } + return false; +} + +static void unselect_col(uint8_t col) { + pin_t pin = col_pins[col]; + + if (pin != NO_PIN) { + setPinInputHigh_atomic(pin); + } else { + SendTo595(0xFF); + } +} + +static void unselect_cols(void) { + for (uint8_t x = 0; x < MATRIX_COLS; x++) { + unselect_col(x); + } +} + +static void matrix_init_pins(void) { + unselect_cols(); + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + if (row_pins[x] != NO_PIN) { + setPinInputHigh_atomic(row_pins[x]); + } + } +} + +void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { + bool key_pressed = false; + + // Select col + if (!select_col(current_col)) { + return; // skip NO_PIN col + } + matrix_output_select_delay(); + + // For each row... + for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { + // Check row pin state + if (readMatrixPin(row_pins[row_index]) == 0) { + // Pin LO, set col bit + current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col); + key_pressed = true; + } else { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col); + } + } + + // Unselect col + unselect_col(current_col); + matrix_output_unselect_delay(current_col, key_pressed); // wait for all Row signals to go HIGH +} + +void matrix_init_custom(void) { + // initialize key pins + matrix_init_pins(); +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + matrix_row_t curr_matrix[MATRIX_ROWS] = {0}; + + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { + matrix_read_rows_on_col(curr_matrix, current_col); + } + + bool changed = memcmp(current_matrix, curr_matrix, sizeof(curr_matrix)) != 0; + if (changed) memcpy(current_matrix, curr_matrix, sizeof(curr_matrix)); + + return changed; +} diff --git a/keyboards/keychron/q1/mcuconf.h b/keyboards/keychron/q1/mcuconf.h new file mode 100644 index 000000000000..0ca8c64850f4 --- /dev/null +++ b/keyboards/keychron/q1/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2020 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/q1/q1.c b/keyboards/keychron/q1/q1.c index a316c1fdcfa1..2767fa4f3a1c 100644 --- a/keyboards/keychron/q1/q1.c +++ b/keyboards/keychron/q1/q1.c @@ -16,16 +16,6 @@ #include "q1.h" - -const matrix_row_t matrix_mask[] = { - 0b0111111111111101, - 0b0111111111111111, - 0b0111111111111111, - 0b0111111111111111, - 0b0111111111111111, - 0b0111111111111111, -}; - bool dip_switch_update_kb(uint8_t index, bool active) { if (!dip_switch_update_user(index, active)) { return false;} if (index == 0) { diff --git a/keyboards/keychron/q1/rev_0100/config.h b/keyboards/keychron/q1/rev_0100/config.h index 0a30f7d82d4d..506e4075d56f 100644 --- a/keyboards/keychron/q1/rev_0100/config.h +++ b/keyboards/keychron/q1/rev_0100/config.h @@ -16,11 +16,27 @@ #pragma once +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0100 +#define DEVICE_VER 0x0100 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 15 + /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } +/* DIP switch */ +#define DIP_SWITCH_MATRIX_GRID { {0,1} } + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 2 +#define DRIVER_ADDR_1 0b1010000 +#define DRIVER_ADDR_2 0b1011111 + /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 59 #define DRIVER_2_LED_TOTAL 23 -#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) \ No newline at end of file +#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) diff --git a/keyboards/keychron/q1/rev_0100/rev_0100.c b/keyboards/keychron/q1/rev_0100/rev_0100.c index 2c87a8241e63..1bdb848bae7a 100644 --- a/keyboards/keychron/q1/rev_0100/rev_0100.c +++ b/keyboards/keychron/q1/rev_0100/rev_0100.c @@ -16,6 +16,16 @@ #include "quantum.h" +const matrix_row_t matrix_mask[] = { + 0b0111111111111101, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, +}; + +#ifdef RGB_MATRIX_ENABLE const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { /* Refer to IS31 manual for these locations @@ -111,33 +121,38 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { {1, F_14, D_14, E_14}, {1, F_15, D_15, E_15}, {1, F_16, D_16, E_16} - }; -led_config_t g_led_config = { - { - { 0, NO_LED, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, - { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }, - { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 }, - { 59, NO_LED, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 }, - { 72, 73, 74, NO_LED, NO_LED, NO_LED, 75, NO_LED, NO_LED, NO_LED, 76, 77, 78, 79, 81 } - }, - { - {0,0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, {90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {195, 0}, {210, 0}, {224, 0}, - {0,13}, {15,13}, {30,13}, {45,13}, {60,13}, {75,13}, {90,13}, {105,13}, {120,13}, {135,13}, {150,13}, {165,13}, {180,13}, {195,13}, {224,13}, - {0,26}, {15,26}, {30,26}, {45,26}, {60,26}, {75,26}, {90,26}, {105,26}, {120,26}, {135,26}, {150,26}, {165,26}, {180,26}, {195,26}, {224,26}, - {0,39}, {15,39}, {30,39}, {45,39}, {60,39}, {75,39}, {90,39}, {105,39}, {120,39}, {135,39}, {150,39}, {165,39}, {195,39}, {224,39}, - {0,52}, {30,52}, {45,52}, {60,52}, {75,52}, {90,52}, {105,52}, {120,52}, {135,52}, {150,52}, {165,52}, {195,52}, {210,52}, - {0,64}, {15,64}, {30,64}, {90,64}, {150,64}, {165,64}, {180,64}, {195,64}, {210,64}, {224,64}, - }, - { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +#define __ NO_LED - } +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, __, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }, + { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 }, + { 59, __, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 }, + { 72, 73, 74, __, __, __, 75, __, __, __, 76, 77, 78, 79, 81 }, + }, + { + // LED Index to Physical Position + {0,0}, {18,0}, {33,0}, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {172,0}, {187,0}, {205,0}, {224,0}, + {0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {117,15}, {132,15}, {146,15}, {161,15}, {176,15}, {198,15}, {224,15}, + {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {139,26}, {154,26}, {168,26}, {183,26}, {201,26}, {224,26}, + {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {128,38}, {143,38}, {158,38}, {172,38}, {196,38}, {224,38}, + {9,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {150,49}, {165,49}, {185,49}, {209,52}, + {2,61}, {20,61}, {38,61}, {94,61}, {147,61}, {161,61}, {176,61}, {195,64}, {209,64}, {224,64}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, + } }; + +#endif diff --git a/keyboards/keychron/q1/rev_0101/config.h b/keyboards/keychron/q1/rev_0101/config.h index b38261abf6b2..08d581d80da1 100644 --- a/keyboards/keychron/q1/rev_0101/config.h +++ b/keyboards/keychron/q1/rev_0101/config.h @@ -16,10 +16,26 @@ #pragma once +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0101 +#define DEVICE_VER 0x0100 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 15 + /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } +/* DIP switch */ +#define DIP_SWITCH_MATRIX_GRID { {0,1} } + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 2 +#define DRIVER_ADDR_1 0b1010000 +#define DRIVER_ADDR_2 0b1011111 + /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 59 #define DRIVER_2_LED_TOTAL 23 diff --git a/keyboards/keychron/q1/rev_0101/rev_0101.c b/keyboards/keychron/q1/rev_0101/rev_0101.c index 4edd2c761f84..318eb8a31c73 100644 --- a/keyboards/keychron/q1/rev_0101/rev_0101.c +++ b/keyboards/keychron/q1/rev_0101/rev_0101.c @@ -16,6 +16,15 @@ #include "quantum.h" +const matrix_row_t matrix_mask[] = { + 0b0111111111111101, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, +}; + #ifdef RGB_MATRIX_ENABLE const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { /* Refer to IS31 manual for these locations @@ -113,35 +122,42 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { {1, F_16, D_16, E_16} }; +#define __ NO_LED + led_config_t g_led_config = { { - { 0, NO_LED, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, - { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }, - { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 }, - { 59, NO_LED, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 }, - { 72, 73, 74, NO_LED, NO_LED, NO_LED, 75, NO_LED, NO_LED, NO_LED, 76, 77, 78, 79, 81 } + // Key Matrix to LED Index + { 0, __, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }, + { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 }, + { 59, __, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 }, + { 72, 73, 74, __, __, __, 75, __, __, __, 76, 77, 78, 79, 81 }, }, { - {0, 0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, {90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {195, 0}, {210, 0}, {224, 0}, - {0,13}, {15,13}, {30,13}, {45,13}, {60,13}, {75,13}, {90,13}, {105,13}, {120,13}, {135,13}, {150,13}, {165,13}, {180,13}, {195,13}, {224,13}, - {0,26}, {15,26}, {30,26}, {45,26}, {60,26}, {75,26}, {90,26}, {105,26}, {120,26}, {135,26}, {150,26}, {165,26}, {180,26}, {195,26}, {224,26}, - {0,39}, {15,39}, {30,39}, {45,39}, {60,39}, {75,39}, {90,39}, {105,39}, {120,39}, {135,39}, {150,39}, {165,39}, {195,39}, {224,39}, - {0,52}, {30,52}, {45,52}, {60,52}, {75,52}, {90,52}, {105,52}, {120,52}, {135,52}, {150,52}, {165,52}, {195,52}, {210,52}, - {0,64}, {15,64}, {30,64}, {90,64}, {150,64}, {165,64}, {180,64}, {195,64}, {210,64}, {224,64} + // LED Index to Physical Position + {0,0}, {18,0}, {33,0}, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {172,0}, {187,0}, {205,0}, {224,0}, + {0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {117,15}, {132,15}, {146,15}, {161,15}, {176,15}, {198,15}, {224,15}, + {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {139,26}, {154,26}, {168,26}, {183,26}, {201,26}, {224,26}, + {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {128,38}, {143,38}, {158,38}, {172,38}, {196,38}, {224,38}, + {9,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {150,49}, {165,49}, {185,49}, {209,52}, + {2,61}, {20,61}, {38,61}, {94,61}, {147,61}, {161,61}, {176,61}, {195,64}, {209,64}, {224,64}, }, { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, } }; + #endif #ifdef ENCODER_ENABLE + bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 0) { @@ -153,4 +169,5 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } return true; } + #endif diff --git a/keyboards/keychron/q1/rev_0102/config.h b/keyboards/keychron/q1/rev_0102/config.h index b9b33cf32061..2c93bacf612b 100644 --- a/keyboards/keychron/q1/rev_0102/config.h +++ b/keyboards/keychron/q1/rev_0102/config.h @@ -16,11 +16,28 @@ #pragma once + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0102 +#define DEVICE_VER 0x0100 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 15 + /* key matrix pins */ #define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } #define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } +/* DIP switch */ +#define DIP_SWITCH_MATRIX_GRID { {0,1} } + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 2 +#define DRIVER_ADDR_1 0b1010000 +#define DRIVER_ADDR_2 0b1011111 + /* RGB Matrix Configuration */ #define DRIVER_1_LED_TOTAL 59 #define DRIVER_2_LED_TOTAL 24 -#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) \ No newline at end of file +#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) diff --git a/keyboards/keychron/q1/rev_0102/rev_0102.c b/keyboards/keychron/q1/rev_0102/rev_0102.c index 5304a602c3e9..238a7ac2df76 100644 --- a/keyboards/keychron/q1/rev_0102/rev_0102.c +++ b/keyboards/keychron/q1/rev_0102/rev_0102.c @@ -16,6 +16,15 @@ #include "quantum.h" +const matrix_row_t matrix_mask[] = { + 0b0111111111111101, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, + 0b0111111111111111, +}; + #ifdef RGB_MATRIX_ENABLE const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { /* Refer to IS31 manual for these locations @@ -83,8 +92,8 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { {0, L_10, J_10, K_10}, {0, L_11, J_11, K_11}, {0, L_12, J_12, K_12}, - {0, L_14, J_14, K_14}, - {0, I_14, G_14, H_14}, + {0, L_14, J_14, K_14}, + {0, I_14, G_14, H_14}, {0, L_16, J_16, K_16}, {1, C_1, A_1, B_1}, @@ -114,31 +123,36 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { {1, F_16, D_16, E_16} }; -led_config_t g_led_config = { - { - { 0, NO_LED, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, - { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 57, 43 }, - { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 72, 56, 58 }, - { 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 81, 71, 13 }, - { 73, 74, 75, NO_LED, NO_LED, NO_LED, 76, NO_LED, NO_LED, NO_LED, 77, 78, 79, 80, 82 } - }, - { - {0,0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, {90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {195, 0}, {210, 0}, {224, 0}, - {0,13}, {15,13}, {30,13}, {45,13}, {60,13}, {75,13}, {90,13}, {105,13}, {120,13}, {135,13}, {150,13}, {165,13}, {180,13}, {195,13}, {224,13}, - {0,26}, {15,26}, {30,26}, {45,26}, {60,26}, {75,26}, {90,26}, {105,26}, {120,26}, {135,26}, {150,26}, {165,26}, {180,26}, {224,26}, - {0,39}, {15,39}, {30,39}, {45,39}, {60,39}, {75,39}, {90,39}, {105,39}, {120,39}, {135,39}, {150,39}, {165,39}, {180,39}, {195,26}, {224,39}, - {0,52}, {15,52}, {30,52}, {45,52}, {60,52}, {75,52}, {90,52}, {105,52}, {120,52}, {135,52}, {150,52}, {165,52}, {180,52}, {210,52}, - {0,64}, {15,64}, {30,64}, {90,64}, {150,64}, {165,64}, {180,64}, {195,64}, {210,64}, {224,64}, - }, - { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +#define __ NO_LED - } +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, __, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 57, 43 }, + { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 72, 56, 58 }, + { 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 81, 71, 13 }, + { 73, 74, 75, __, __, __, 76, __, __, __, 77, 78, 79, 80, 82 }, + }, + { + // LED Index to Physical Position + {0,0}, {18,0}, {33,0 }, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {172,0}, {187,0}, {205,0}, {224,0}, + {0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {117,15}, {132,15}, {146,15}, {161,15}, {176,15}, {198,15}, {224,15}, + {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {139,26}, {154,26}, {168,26}, {183,26}, {224,26}, + {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {128,38}, {143,38}, {158,38}, {172,38}, {187,38}, {205,33}, {224,38}, + {2,49}, {18,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {150,49}, {165,49}, {185,49}, {209,52}, + {2,61}, {20,61}, {38,61}, {94,61}, {147,61}, {161,61}, {176,61}, {195,64}, {209,64}, {224,64}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, + } }; + #endif diff --git a/keyboards/keychron/q1/rev_0106/config.h b/keyboards/keychron/q1/rev_0106/config.h new file mode 100644 index 000000000000..68590be8c02d --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/config.h @@ -0,0 +1,57 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0106 +#define DEVICE_VER 0x0200 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B5, B4, B3, A15, A14, A13 } +#define MATRIX_COL_PINS { C14, C15, A0, A1, A2, A3, A4, A5, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN } + +/* DIP switch */ +#define DIP_SWITCH_MATRIX_GRID { {5,4} } + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 2 +#define DRIVER_ADDR_1 0b1110111 +#define DRIVER_ADDR_2 0b1110100 + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 45 +#define DRIVER_2_LED_TOTAL 37 +#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */ +#define PHASE_CHANNEL MSKPHASE_9CHANNEL + +/* Set the maxium brightness as 192 in order to limit the current to 450mA */ +#define RGB_MATRIX_MAXIMUM_BRIGHTNESS (24 * 8) // 8 = RGB_MATRIX_VAL_STEP + +/* We have 2KB EEPROM size on STM32L432 */ +#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 + +/* Enable caps-lock LED */ +#define CAPS_LOCK_LED_INDEX 45 + +/* Total size of the EEPROM storage in bytes */ +#define TRANSIENT_EEPROM_SIZE 1024 diff --git a/keyboards/keychron/q1/rev_0106/info.json b/keyboards/keychron/q1/rev_0106/info.json new file mode 100644 index 000000000000..05f26eb3870f --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/info.json @@ -0,0 +1,98 @@ +{ + "keyboard_name": "Keychron Q1", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "layouts": { + "LAYOUT_ansi_82": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"Delete", "x":14, "y":0}, + {"label":"Insert", "x":15.25, "y":0}, + + {"label":"`~", "x":0, "y":1}, + {"label":"1!", "x":1, "y":1}, + {"label":"2@", "x":2, "y":1}, + {"label":"3#", "x":3, "y":1}, + {"label":"4$", "x":4, "y":1}, + {"label":"5%", "x":5, "y":1}, + {"label":"6^", "x":6, "y":1}, + {"label":"7&", "x":7, "y":1}, + {"label":"8*", "x":8, "y":1}, + {"label":"9(", "x":9, "y":1}, + {"label":"0)", "x":10, "y":1}, + {"label":"-_", "x":11, "y":1}, + {"label":"=+", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Page Up", "x":15.25, "y":1}, + + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[{", "x":11.5, "y":2}, + {"label":"]}", "x":12.5, "y":2}, + {"label":"\\|", "x":13.5, "y":2, "w":1.5}, + {"label":"Page Down", "x":15.25, "y":2}, + + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";:", "x":10.75, "y":3}, + {"label":"'\"", "x":11.75, "y":3}, + {"label":"Enter", "x":12.75, "y":3, "w":2.25}, + {"label":"Home", "x":15.25, "y":3}, + + {"label":"Shift", "x":0, "y":4, "w":2.25}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",<", "x":9.25, "y":4}, + {"label":".>", "x":10.25, "y":4}, + {"label":"/?", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14.25, "y":4.25}, + + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space","x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"Left", "x":13.25, "y":5.25}, + {"label":"Down", "x":14.25, "y":5.25}, + {"label":"Right", "x":15.25, "y":5.25} + ] + } + } +} diff --git a/keyboards/keychron/q1/rev_0106/keymaps/default/keymap.c b/keyboards/keychron/q1/rev_0106/keymaps/default/keymap.c new file mode 100644 index 000000000000..da98a2d76cf2 --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/keymaps/default/keymap.c @@ -0,0 +1,129 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[2]; +} key_combination_t; + +key_combination_t key_comb_list[2] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}} +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0106/keymaps/via/keymap.c b/keyboards/keychron/q1/rev_0106/keymaps/via/keymap.c new file mode 100644 index 000000000000..a94680dc6188 --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/keymaps/via/keymap.c @@ -0,0 +1,129 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[2]; +} key_combination_t; + +key_combination_t key_comb_list[2] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}} +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0106/keymaps/via/rules.mk b/keyboards/keychron/q1/rev_0106/keymaps/via/rules.mk new file mode 100644 index 000000000000..eb5b445ddf1a --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/keymaps/via/rules.mk @@ -0,0 +1,2 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = yes diff --git a/keyboards/keychron/q1/rev_0106/readme.md b/keyboards/keychron/q1/rev_0106/readme.md new file mode 100644 index 000000000000..99a9193d2bf8 --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/readme.md @@ -0,0 +1,3 @@ +# The ANSI variant of the Keychron Q1 + +- Which was based on stm32l432 and compile with stm32l433 temporarily. diff --git a/keyboards/keychron/q1/rev_0106/rev_0106.c b/keyboards/keychron/q1/rev_0106/rev_0106.c new file mode 100644 index 000000000000..a38b76ce893f --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/rev_0106.c @@ -0,0 +1,158 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +const matrix_row_t matrix_mask[] = { + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111101111, +}; + +#ifdef RGB_MATRIX_ENABLE + +const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C_1, A_1, B_1}, + {0, C_2, A_2, B_2}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_13, A_13, B_13}, + {0, C_14, A_14, B_14}, + {0, C_16, A_16, B_16}, + + {0, I_1, G_1, H_1}, + {0, I_2, G_2, H_2}, + {0, I_3, G_3, H_3}, + {0, I_4, G_4, H_4}, + {0, I_5, G_5, H_5}, + {0, I_6, G_6, H_6}, + {0, I_7, G_7, H_7}, + {0, I_8, G_8, H_8}, + {0, I_9, G_9, H_9}, + {0, I_10, G_10, H_10}, + {0, I_11, G_11, H_11}, + {0, I_12, G_12, H_12}, + {0, I_13, G_13, H_13}, + {0, I_14, G_14, H_14}, + {0, I_16, G_16, H_16}, + + {0, F_1, D_1, E_1}, + {0, F_2, D_2, E_2}, + {0, F_3, D_3, E_3}, + {0, F_4, D_4, E_4}, + {0, F_5, D_5, E_5}, + {0, F_6, D_6, E_6}, + {0, F_7, D_7, E_7}, + {0, F_8, D_8, E_8}, + {0, F_9, D_9, E_9}, + {0, F_10, D_10, E_10}, + {0, F_11, D_11, E_11}, + {0, F_12, D_12, E_12}, + {0, F_13, D_13, E_13}, + {0, F_14, D_14, E_14}, + {0, F_16, D_16, E_16}, + + {1, I_1, G_1, H_1}, + {1, I_2, G_2, H_2}, + {1, I_3, G_3, H_3}, + {1, I_4, G_4, H_4}, + {1, I_5, G_5, H_5}, + {1, I_6, G_6, H_6}, + {1, I_7, G_7, H_7}, + {1, I_8, G_8, H_8}, + {1, I_9, G_9, H_9}, + {1, I_10, G_10, H_10}, + {1, I_11, G_11, H_11}, + {1, I_12, G_12, H_12}, + {1, I_14, G_14, H_14}, + {1, I_16, G_16, H_16}, + + {1, F_1, D_1, E_1}, + {1, F_3, D_3, E_3}, + {1, F_4, D_4, E_4}, + {1, F_5, D_5, E_5}, + {1, F_6, D_6, E_6}, + {1, F_7, D_7, E_7}, + {1, F_8, D_8, E_8}, + {1, F_9, D_9, E_9}, + {1, F_10, D_10, E_10}, + {1, F_11, D_11, E_11}, + {1, F_12, D_12, E_12}, + {1, F_14, D_14, E_14}, + {1, F_15, D_15, E_15}, + + {1, C_1, A_1, B_1}, + {1, C_2, A_2, B_2}, + {1, C_3, A_3, B_3}, + {1, C_7, A_7, B_7}, + {1, C_11, A_11, B_11}, + {1, C_12, A_12, B_12}, + {1, C_13, A_13, B_13}, + {1, C_14, A_14, B_14}, + {1, C_15, A_15, B_15}, + {1, C_16, A_16, B_16}, +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, __, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, __, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, __, 44 }, + { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, __, 57, __, 58 }, + { 59, __, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, __, 70, 71, __ }, + { 72, 73, 74, __, __, __, 75, __, __, __, 76, 77, 78, 79, 80, 81 } + }, + { + // LED Index to Physical Position + {0,0}, {18,0}, {33,0}, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {173,0}, {187,0}, {206,0}, {224,0}, + {0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {118,15}, {132,15}, {147,15}, {162,15}, {176,15}, {198,15}, {224,15}, + {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {140,26}, {154,26}, {169,26}, {184,26}, {202,26}, {224,26}, + {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {129,38}, {143,38}, {158,38}, {173,38}, {196,38}, {224,38}, + {9,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {151,49}, {165,49}, {185,49}, {209,52}, + {2,61}, {20,61}, {39,61}, {94,61}, {147,61}, {162,61}, {176,61}, {195,64}, {209,64}, {224,64} + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1 + } +}; + +#endif diff --git a/keyboards/keychron/q1/rev_0106/rev_0106.h b/keyboards/keychron/q1/rev_0106/rev_0106.h new file mode 100644 index 000000000000..6a1787f8bca7 --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/rev_0106.h @@ -0,0 +1,37 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "quantum.h" + +#define XXX KC_NO + +#define LAYOUT_ansi_82( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3F, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, \ + K50, K51, K52, K56, K5A, K5B, K5C, K5D, K5E, K5F \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, XXX, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, XXX, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, XXX, K3F }, \ + { K40, XXX, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, XXX, K4D, K4E, XXX }, \ + { K50, K51, K52, XXX, XXX, XXX, K56, XXX, XXX, XXX, K5A, K5B, K5C, K5D, K5E, K5F } \ +} diff --git a/keyboards/keychron/q1/rev_0106/rules.mk b/keyboards/keychron/q1/rev_0106/rules.mk new file mode 100644 index 000000000000..ab4ab62dc878 --- /dev/null +++ b/keyboards/keychron/q1/rev_0106/rules.mk @@ -0,0 +1,31 @@ +# MCU name +MCU = STM32L433 + +# Bootloader selection +BOOTLOADER = stm32-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable N-key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +ENCODER_ENABLE = no # Enable Encoder +DIP_SWITCH_ENABLE = yes +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = CKLED2001 +EEPROM_DRIVER = transient + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE + +# custom matrix setup +CUSTOM_MATRIX = lite + +SRC += matrix.c diff --git a/keyboards/keychron/q1/rev_0107/config.h b/keyboards/keychron/q1/rev_0107/config.h new file mode 100644 index 000000000000..11b9b47d0da2 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/config.h @@ -0,0 +1,64 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0107 +#define DEVICE_VER 0x0200 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B5, B4, B3, A15, A14, A13 } +#define MATRIX_COL_PINS { C14, C15, A0, A1, A2, A3, A4, A5, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN } + +/* DIP switch */ +#define DIP_SWITCH_MATRIX_GRID { {5,4} } + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 2 +#define DRIVER_ADDR_1 0b1110111 +#define DRIVER_ADDR_2 0b1110100 + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 45 +#define DRIVER_2_LED_TOTAL 37 +#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */ +#define PHASE_CHANNEL MSKPHASE_9CHANNEL + +/* Set the maxium brightness as 192 in order to limit the current to 450mA */ +#define RGB_MATRIX_MAXIMUM_BRIGHTNESS (24 * 8) // 8 = RGB_MATRIX_VAL_STEP + +/* We have 2KB EEPROM size on STM32L432 */ +#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 + +/* Encoder used pins */ +#define ENCODERS_PAD_A { A10 } +#define ENCODERS_PAD_B { A8 } + +/* Specifies the number of pulses the encoder registers between each detent */ +#define ENCODER_RESOLUTION 4 + +/* Enable caps-lock LED */ +#define CAPS_LOCK_LED_INDEX 45 + +/* Total size of the EEPROM storage in bytes */ +#define TRANSIENT_EEPROM_SIZE 1024 diff --git a/keyboards/keychron/q1/rev_0107/info.json b/keyboards/keychron/q1/rev_0107/info.json new file mode 100644 index 000000000000..75fb2d04e8f7 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/info.json @@ -0,0 +1,191 @@ +{ + "keyboard_name": "Keychron Q1", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "layouts": { + "LAYOUT_ansi_82": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"Delete", "x":14, "y":0}, + {"label":"Mute", "x":15.25, "y":0}, + + {"label":"`~", "x":0, "y":1.25}, + {"label":"1!", "x":1, "y":1.25}, + {"label":"2@", "x":2, "y":1.25}, + {"label":"3#", "x":3, "y":1.25}, + {"label":"4$", "x":4, "y":1.25}, + {"label":"5%", "x":5, "y":1.25}, + {"label":"6^", "x":6, "y":1.25}, + {"label":"7&", "x":7, "y":1.25}, + {"label":"8*", "x":8, "y":1.25}, + {"label":"9(", "x":9, "y":1.25}, + {"label":"0)", "x":10, "y":1.25}, + {"label":"-_", "x":11, "y":1.25}, + {"label":"=+", "x":12, "y":1.25}, + {"label":"Backspace", "x":13, "y":1.25, "w":2}, + {"label":"Page Up", "x":15.25, "y":1.25}, + + {"label":"Tab", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"[{", "x":11.5, "y":2.25}, + {"label":"]}", "x":12.5, "y":2.25}, + {"label":"\\|", "x":13.5, "y":2.25, "w":1.5}, + {"label":"Page Down", "x":15.25, "y":2.25}, + + {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":";:", "x":10.75, "y":3.25}, + {"label":"'\"", "x":11.75, "y":3.25}, + {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, + {"label":"Home", "x":15.25, "y":3.25}, + + {"label":"Shift", "x":0, "y":4.25, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":",<", "x":9.25, "y":4.25}, + {"label":".>", "x":10.25, "y":4.25}, + {"label":"/?", "x":11.25, "y":4.25}, + {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, + {"label":"Up", "x":14.25, "y":4.5}, + + {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.25, "w":6.25}, + {"label":"Alt", "x":10, "y":5.25}, + {"label":"Fn", "x":11, "y":5.25}, + {"label":"Ctrl", "x":12, "y":5.25}, + {"label":"Left", "x":13.25, "y":5.5}, + {"label":"Down", "x":14.25, "y":5.5}, + {"label":"Right", "x":15.25, "y":5.5} + ] + }, + "LAYOUT_all": { + "layout": [ + {"label":"Esc", "x":0, "y":0.5}, + {"label":"F1", "x":1.25, "y":0.5}, + {"label":"F2", "x":2.25, "y":0.5}, + {"label":"F3", "x":3.25, "y":0.5}, + {"label":"F4", "x":4.25, "y":0.5}, + {"label":"F5", "x":5.5, "y":0.5}, + {"label":"F6", "x":6.5, "y":0.5}, + {"label":"F7", "x":7.5, "y":0.5}, + {"label":"F8", "x":8.5, "y":0.5}, + {"label":"F9", "x":9.75, "y":0.5}, + {"label":"F10", "x":10.75, "y":0.5}, + {"label":"F11", "x":11.75, "y":0.5}, + {"label":"F12", "x":12.75, "y":0.5}, + {"label":"Delete", "x":14, "y":0.5}, + {"label":"CCW", "x":15.15, "y":0, "w":0.6, "h":0.5}, + {"label":"Mute", "x":15.25, "y":0.5}, + {"label":"CW", "x":15.75, "y":0, "w":0.6, "h":0.5}, + + {"label":"`~", "x":0, "y":1.75}, + {"label":"1!", "x":1, "y":1.75}, + {"label":"2@", "x":2, "y":1.75}, + {"label":"3#", "x":3, "y":1.75}, + {"label":"4$", "x":4, "y":1.75}, + {"label":"5%", "x":5, "y":1.75}, + {"label":"6^", "x":6, "y":1.75}, + {"label":"7&", "x":7, "y":1.75}, + {"label":"8*", "x":8, "y":1.75}, + {"label":"9(", "x":9, "y":1.75}, + {"label":"0)", "x":10, "y":1.75}, + {"label":"-_", "x":11, "y":1.75}, + {"label":"=+", "x":12, "y":1.75}, + {"label":"Backspace", "x":13, "y":1.75, "w":2}, + {"label":"Page Up", "x":15.25, "y":1.75}, + + {"label":"Tab", "x":0, "y":2.75, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.75}, + {"label":"W", "x":2.5, "y":2.75}, + {"label":"E", "x":3.5, "y":2.75}, + {"label":"R", "x":4.5, "y":2.75}, + {"label":"T", "x":5.5, "y":2.75}, + {"label":"Y", "x":6.5, "y":2.75}, + {"label":"U", "x":7.5, "y":2.75}, + {"label":"I", "x":8.5, "y":2.75}, + {"label":"O", "x":9.5, "y":2.75}, + {"label":"P", "x":10.5, "y":2.75}, + {"label":"[{", "x":11.5, "y":2.75}, + {"label":"]}", "x":12.5, "y":2.75}, + {"label":"\\|", "x":13.5, "y":2.75, "w":1.5}, + {"label":"Page Down", "x":15.25, "y":2.75}, + + {"label":"Caps Lock", "x":0, "y":3.75, "w":1.75}, + {"label":"A", "x":1.75, "y":3.75}, + {"label":"S", "x":2.75, "y":3.75}, + {"label":"D", "x":3.75, "y":3.75}, + {"label":"F", "x":4.75, "y":3.75}, + {"label":"G", "x":5.75, "y":3.75}, + {"label":"H", "x":6.75, "y":3.75}, + {"label":"J", "x":7.75, "y":3.75}, + {"label":"K", "x":8.75, "y":3.75}, + {"label":"L", "x":9.75, "y":3.75}, + {"label":";:", "x":10.75, "y":3.75}, + {"label":"'\"", "x":11.75, "y":3.75}, + {"label":"Enter", "x":12.75, "y":3.75, "w":2.25}, + {"label":"Home", "x":15.25, "y":3.75}, + + {"label":"Shift", "x":0, "y":4.75, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.75}, + {"label":"X", "x":3.25, "y":4.75}, + {"label":"C", "x":4.25, "y":4.75}, + {"label":"V", "x":5.25, "y":4.75}, + {"label":"B", "x":6.25, "y":4.75}, + {"label":"N", "x":7.25, "y":4.75}, + {"label":"M", "x":8.25, "y":4.75}, + {"label":",<", "x":9.25, "y":4.75}, + {"label":".>", "x":10.25, "y":4.75}, + {"label":"/?", "x":11.25, "y":4.75}, + {"label":"Shift", "x":12.25, "y":4.75, "w":1.75}, + {"label":"Up", "x":14.25, "y":5}, + + {"label":"Ctrl", "x":0, "y":5.75, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.75, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.75, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.75, "w":6.25}, + {"label":"Alt", "x":10, "y":5.75}, + {"label":"Fn", "x":11, "y":5.75}, + {"label":"Ctrl", "x":12, "y":5.75}, + {"label":"Left", "x":13.25, "y":6}, + {"label":"Down", "x":14.25, "y":6}, + {"label":"Right", "x":15.25, "y":6} + ] + } + } +} diff --git a/keyboards/keychron/q1/rev_0107/keymaps/default/keymap.c b/keyboards/keychron/q1/rev_0107/keymaps/default/keymap.c new file mode 100644 index 000000000000..321edc4d368c --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/keymaps/default/keymap.c @@ -0,0 +1,129 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[2]; +} key_combination_t; + +key_combination_t key_comb_list[2] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}} +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_MUTE, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_MUTE, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0107/keymaps/via/keymap.c b/keyboards/keychron/q1/rev_0107/keymaps/via/keymap.c new file mode 100644 index 000000000000..3bcadadd20f1 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/keymaps/via/keymap.c @@ -0,0 +1,171 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[2]; +} key_combination_t; + +key_combination_t key_comb_list[2] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_all( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_VOLD, KC_MUTE, KC_VOLU, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, KC_RCMMD,MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_all( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RGB_VAD, RGB_TOG, RGB_VAI, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_all( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_VOLD, KC_MUTE, KC_VOLU, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_all( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RGB_VAD, RGB_TOG, RGB_VAI, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +#if defined(VIA_ENABLE) && defined(ENCODER_ENABLE) + +#define ENCODERS 1 +static uint8_t encoder_state[ENCODERS] = {0}; +static keypos_t encoder_cw[ENCODERS] = {{ 8, 5 }}; +static keypos_t encoder_ccw[ENCODERS] = {{ 7, 5 }}; + +void encoder_action_unregister(void) { + for (int index = 0; index < ENCODERS; ++index) { + if (encoder_state[index]) { + keyevent_t encoder_event = (keyevent_t) { + .key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index], + .pressed = false, + .time = (timer_read() | 1) + }; + encoder_state[index] = 0; + action_exec(encoder_event); + } + } +} + +void encoder_action_register(uint8_t index, bool clockwise) { + keyevent_t encoder_event = (keyevent_t) { + .key = clockwise ? encoder_cw[index] : encoder_ccw[index], + .pressed = true, + .time = (timer_read() | 1) + }; + encoder_state[index] = (clockwise ^ 1) | (clockwise << 1); + action_exec(encoder_event); +} + +void matrix_scan_user(void) { + encoder_action_unregister(); +} + +bool encoder_update_user(uint8_t index, bool clockwise) { + encoder_action_register(index, clockwise); + return false; +}; + +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0107/keymaps/via/rules.mk b/keyboards/keychron/q1/rev_0107/keymaps/via/rules.mk new file mode 100644 index 000000000000..ea7d10f812b3 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/keymaps/via/rules.mk @@ -0,0 +1,2 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = yes \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0107/readme.md b/keyboards/keychron/q1/rev_0107/readme.md new file mode 100644 index 000000000000..d4114fa800f1 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/readme.md @@ -0,0 +1,5 @@ +# The ANSI variant of the Keychron Q1 + +- Enable EC11 rotary encoder. +- Turn colckwise to increase volume and turn anti-colckwise to decrease volume. +- Press top right key pushbutton to mute. diff --git a/keyboards/keychron/q1/rev_0107/rev_0107.c b/keyboards/keychron/q1/rev_0107/rev_0107.c new file mode 100644 index 000000000000..44feddc9ad7b --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/rev_0107.c @@ -0,0 +1,174 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +const matrix_row_t matrix_mask[] = { + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111111111, + 0b1111111111101111, +}; + +#ifdef RGB_MATRIX_ENABLE + +const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C_1, A_1, B_1}, + {0, C_2, A_2, B_2}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_13, A_13, B_13}, + {0, C_14, A_14, B_14}, + {0, C_16, A_16, B_16}, + + {0, I_1, G_1, H_1}, + {0, I_2, G_2, H_2}, + {0, I_3, G_3, H_3}, + {0, I_4, G_4, H_4}, + {0, I_5, G_5, H_5}, + {0, I_6, G_6, H_6}, + {0, I_7, G_7, H_7}, + {0, I_8, G_8, H_8}, + {0, I_9, G_9, H_9}, + {0, I_10, G_10, H_10}, + {0, I_11, G_11, H_11}, + {0, I_12, G_12, H_12}, + {0, I_13, G_13, H_13}, + {0, I_14, G_14, H_14}, + {0, I_16, G_16, H_16}, + + {0, F_1, D_1, E_1}, + {0, F_2, D_2, E_2}, + {0, F_3, D_3, E_3}, + {0, F_4, D_4, E_4}, + {0, F_5, D_5, E_5}, + {0, F_6, D_6, E_6}, + {0, F_7, D_7, E_7}, + {0, F_8, D_8, E_8}, + {0, F_9, D_9, E_9}, + {0, F_10, D_10, E_10}, + {0, F_11, D_11, E_11}, + {0, F_12, D_12, E_12}, + {0, F_13, D_13, E_13}, + {0, F_14, D_14, E_14}, + {0, F_16, D_16, E_16}, + + {1, I_1, G_1, H_1}, + {1, I_2, G_2, H_2}, + {1, I_3, G_3, H_3}, + {1, I_4, G_4, H_4}, + {1, I_5, G_5, H_5}, + {1, I_6, G_6, H_6}, + {1, I_7, G_7, H_7}, + {1, I_8, G_8, H_8}, + {1, I_9, G_9, H_9}, + {1, I_10, G_10, H_10}, + {1, I_11, G_11, H_11}, + {1, I_12, G_12, H_12}, + {1, I_14, G_14, H_14}, + {1, I_16, G_16, H_16}, + + {1, F_1, D_1, E_1}, + {1, F_3, D_3, E_3}, + {1, F_4, D_4, E_4}, + {1, F_5, D_5, E_5}, + {1, F_6, D_6, E_6}, + {1, F_7, D_7, E_7}, + {1, F_8, D_8, E_8}, + {1, F_9, D_9, E_9}, + {1, F_10, D_10, E_10}, + {1, F_11, D_11, E_11}, + {1, F_12, D_12, E_12}, + {1, F_14, D_14, E_14}, + {1, F_15, D_15, E_15}, + + {1, C_1, A_1, B_1}, + {1, C_2, A_2, B_2}, + {1, C_3, A_3, B_3}, + {1, C_7, A_7, B_7}, + {1, C_11, A_11, B_11}, + {1, C_12, A_12, B_12}, + {1, C_13, A_13, B_13}, + {1, C_14, A_14, B_14}, + {1, C_15, A_15, B_15}, + {1, C_16, A_16, B_16}, +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, __, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, __, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, __, 44 }, + { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, __, 57, __, 58 }, + { 59, __, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, __, 70, 71, __ }, + { 72, 73, 74, __, __, __, 75, __, __, __, 76, 77, 78, 79, 80, 81 } + }, + { + // LED Index to Physical Position + {0,0}, {18,0}, {33,0}, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {173,0}, {187,0}, {206,0}, {224,0}, + {0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {118,15}, {132,15}, {147,15}, {162,15}, {176,15}, {198,15}, {224,15}, + {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {140,26}, {154,26}, {169,26}, {184,26}, {202,26}, {224,26}, + {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {129,38}, {143,38}, {158,38}, {173,38}, {196,38}, {224,38}, + {9,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {151,49}, {165,49}, {185,49}, {209,52}, + {2,61}, {20,61}, {39,61}, {94,61}, {147,61}, {162,61}, {176,61}, {195,64}, {209,64}, {224,64} + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1 + } +}; + +#endif + +#ifdef ENCODER_ENABLE + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { return false; } + if (index == 0) { + if (clockwise) { + tap_code_delay(KC_VOLU, 10); + } else { + tap_code_delay(KC_VOLD, 10); + } + } + return true; +} + +#endif diff --git a/keyboards/keychron/q1/rev_0107/rev_0107.h b/keyboards/keychron/q1/rev_0107/rev_0107.h new file mode 100644 index 000000000000..19c4e7dff612 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/rev_0107.h @@ -0,0 +1,52 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "quantum.h" + +#define XXX KC_NO + +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K57, K0F, K58, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3F, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, \ + K50, K51, K52, K56, K5A, K5B, K5C, K5D, K5E, K5F \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, XXX, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, XXX, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, XXX, K3F }, \ + { K40, XXX, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, XXX, K4D, K4E, XXX }, \ + { K50, K51, K52, XXX, XXX, XXX, K56, K57, K58, XXX, K5A, K5B, K5C, K5D, K5E, K5F } \ +} +#define LAYOUT_ansi_82( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3F, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, \ + K50, K51, K52, K56, K5A, K5B, K5C, K5D, K5E, K5F \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, XXX, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, XXX, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, XXX, K3F }, \ + { K40, XXX, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, XXX, K4D, K4E, XXX }, \ + { K50, K51, K52, XXX, XXX, XXX, K56, XXX, XXX, XXX, K5A, K5B, K5C, K5D, K5E, K5F } \ +} diff --git a/keyboards/keychron/q1/rev_0107/rules.mk b/keyboards/keychron/q1/rev_0107/rules.mk new file mode 100644 index 000000000000..5a6d5c921455 --- /dev/null +++ b/keyboards/keychron/q1/rev_0107/rules.mk @@ -0,0 +1,31 @@ +# MCU name +MCU = STM32L433 + +# Bootloader selection +BOOTLOADER = stm32-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable N-key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +ENCODER_ENABLE = yes # Enable Encoder +DIP_SWITCH_ENABLE = yes +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = CKLED2001 +EEPROM_DRIVER = transient + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE + +# custom matrix setup +CUSTOM_MATRIX = lite + +SRC += matrix.c diff --git a/keyboards/reviung/reviung41/keymaps/harvester/config.h b/keyboards/reviung/reviung41/keymaps/harvester/config.h new file mode 100644 index 000000000000..cc1ad8194e4d --- /dev/null +++ b/keyboards/reviung/reviung41/keymaps/harvester/config.h @@ -0,0 +1,41 @@ +/* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* The way how "handedness" is decided (which half is which), +see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness +for more options. +*/ + +//#define TAPPING_FORCE_HOLD +#ifdef TAPPING_TERM + #undef TAPPING_TERM + #define TAPPING_TERM 200 +#endif + +#define BOOTMAGIC_LITE_ROW 0 +#define BOOTMAGIC_LITE_COLUMN 1 + +#define USB_POLLING_INTERVAL_MS 1 +#define QMK_KEYS_PER_SCAN 12 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 9 + +#define RGBLIGHT_LAYERS +#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF +#define DRIVER_LED_TOTAL 11 diff --git a/keyboards/reviung/reviung41/keymaps/harvester/enums.h b/keyboards/reviung/reviung41/keymaps/harvester/enums.h new file mode 100644 index 000000000000..769ad41bf68e --- /dev/null +++ b/keyboards/reviung/reviung41/keymaps/harvester/enums.h @@ -0,0 +1,15 @@ +// [Reviung41 layers Init] -------------------------------------------------------// +typedef enum { + _BASE, + _GAME, + _NAV, + _MEDIA, + _NUM, + _SYM, + _FUN, + _MOD +}REVIUNG41_LAYERS; + +extern enum REVIUNG41_LAYERS reviung41_layers; + + diff --git a/keyboards/reviung/reviung41/keymaps/harvester/keymap.c b/keyboards/reviung/reviung41/keymaps/harvester/keymap.c new file mode 100644 index 000000000000..6001dd234d3e --- /dev/null +++ b/keyboards/reviung/reviung41/keymaps/harvester/keymap.c @@ -0,0 +1,269 @@ +/* Copyright 2020 @toastedmangoes + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include QMK_KEYBOARD_H +#include "enums.h" + +// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore! +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_RED} // Light 4 LEDs, starting with LED 12 +); +// Light LEDs 9 & 10 in cyan when keyboard layer 1 is active +const rgblight_segment_t PROGMEM my_layer0_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_WHITE} +); +// Light LEDs 11 & 12 in purple when keyboard layer 2 is active +const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_RED} +); +// Light LEDs 13 & 14 in green when keyboard layer 3 is active +const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_GREEN} +); +const rgblight_segment_t PROGMEM my_layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_MAGENTA} +); +const rgblight_segment_t PROGMEM my_layer4_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_BLUE} +); +const rgblight_segment_t PROGMEM my_layer5_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_ORANGE} +); +const rgblight_segment_t PROGMEM my_layer6_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_PURPLE} +); +const rgblight_segment_t PROGMEM my_layer7_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 1, HSV_CYAN} +); + +// Now define the array of layers. Later layers take precedence +const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST( + my_capslock_layer, + my_layer0_layer, // Overrides caps lock layer + my_layer1_layer, // Overrides caps lock layer + my_layer2_layer, // Overrides other layers + my_layer3_layer, + my_layer4_layer, + my_layer5_layer, + my_layer6_layer, + my_layer7_layer // Overrides other layers +); + +void keyboard_post_init_user(void) { + // Enable the LED layers + rgblight_layers = my_rgb_layers; +} + + +// Tap Dance keycodes +enum td_keycodes { + CTL_LPRN, // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance. + ALT_RPRN, + +}; + +// Define a type containing as many tapdance states as you need +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_SINGLE_TAP +} td_state_t; + +// Create a global instance of the tapdance state type +static td_state_t td_state; + +// Declare your tapdance functions: + +// Function to determine the current tapdance state +td_state_t cur_dance(qk_tap_dance_state_t *state); + +// `finished` and `reset` functions for each tapdance keycode +void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data); +void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data); +void alt_rprn_finished(qk_tap_dance_state_t *state, void *user_data); +void alt_rprn_reset(qk_tap_dance_state_t *state, void *user_data); + +// Aliases for readability +#define BASE TO(_BASE) +#define GAME TO(_GAME) +#define SYM LT(_SYM,KC_ENT) +#define NAV LT(_NAV,KC_DEL) +#define FUN LT(_FUN,KC_SPC) +#define MEDIA LT(_MEDIA,KC_RGUI) +#define NUM LT(_NUM,KC_BSPC) +#define MOD MO(_MOD) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_reviung41( + QK_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + LSFT_T(KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT), + TD(CTL_LPRN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD(ALT_RPRN), + MEDIA, NAV, FUN, NUM, SYM + ), + + [_GAME] = LAYOUT_reviung41( + KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LCTL , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL, + KC_ESC, MOD, KC_SPC, KC_ENT, KC_RALT + ), + + [_NAV] = LAYOUT_reviung41( + KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, GAME, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + _______, C(KC_A), C(KC_S), XXXXXXX, C(KC_F), XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, + KC_LCBR, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_RCBR, + KC_LGUI, _______, KC_ENT, KC_DEL, XXXXXXX + ), + + [_MEDIA] = LAYOUT_reviung41( + XXXXXXX , XXXXXXX , XXXXXXX , G(KC_E) , G(KC_R) , XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, + _______, XXXXXXX, LSG(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE + ), + [_NUM] = LAYOUT_reviung41( + XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, KC_NUM, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + KC_LBRC, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RBRC, + KC_DOT, KC_0, KC_MINS, _______, XXXXXXX + ), + [_SYM] = LAYOUT_reviung41( + XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LPRN, KC_RPRN, KC_UNDS, XXXXXXX, _______ + ), + [_FUN] = LAYOUT_reviung41( + XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, + XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, + KC_MENU, KC_TAB, _______, XXXXXXX, XXXXXXX + ), + [_MOD] = LAYOUT_reviung41( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,BASE, + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, KC_ENT, XXXXXXX, XXXXXXX + ) +}; + +// Determine the tapdance state to return +td_state_t cur_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return TD_SINGLE_TAP; + else return TD_SINGLE_HOLD; + } + + if (state->count == 2) return TD_DOUBLE_SINGLE_TAP; + else return TD_UNKNOWN; // Any number higher than the maximum state value you return above +} + +// Handle the possible states for each tapdance keycode you define: + +void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + register_code16(LSFT(KC_9)); + break; + case TD_SINGLE_HOLD: + register_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term + tap_code16(LSFT(KC_9)); + register_code16(LSFT(KC_9)); + break; + default: + break; + } +} + +void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (td_state) { + case TD_SINGLE_TAP: + unregister_code16(LSFT(KC_9)); + break; + case TD_SINGLE_HOLD: + unregister_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: + unregister_code16(LSFT(KC_9)); + break; + default: + break; + } +} + +void atl_rprn_finished(qk_tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + register_code16(LSFT(KC_0)); + break; + case TD_SINGLE_HOLD: + register_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term + tap_code16(LSFT(KC_0)); + register_code16(LSFT(KC_0)); + break; + default: + break; + } +} + +void alt_rprn_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (td_state) { + case TD_SINGLE_TAP: + unregister_code16(LSFT(KC_0)); + break; + case TD_SINGLE_HOLD: + unregister_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: + unregister_code16(LSFT(KC_0)); + break; + default: + break; + } +} + +// Define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions +qk_tap_dance_action_t tap_dance_actions[] = { + [CTL_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_lprn_finished, ctl_lprn_reset), + [ALT_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, atl_rprn_finished, alt_rprn_reset) +}; + +bool led_update_user(led_t led_state) { + rgblight_set_layer_state(0, led_state.caps_lock); + return true; +} + +layer_state_t default_layer_state_set_user(layer_state_t state) { + rgblight_set_layer_state(1, layer_state_cmp(state, _BASE)); + return state; +} + +layer_state_t layer_state_set_user(layer_state_t state) { + rgblight_set_layer_state(2, layer_state_cmp(state, _GAME)); + rgblight_set_layer_state(3, layer_state_cmp(state, _NAV)); + rgblight_set_layer_state(4, layer_state_cmp(state, _MEDIA)); + rgblight_set_layer_state(5, layer_state_cmp(state, _NUM)); + rgblight_set_layer_state(6, layer_state_cmp(state, _SYM)); + rgblight_set_layer_state(7, layer_state_cmp(state, _FUN)); + return state; +} diff --git a/keyboards/reviung/reviung41/keymaps/harvester/rules.mk b/keyboards/reviung/reviung41/keymaps/harvester/rules.mk new file mode 100644 index 000000000000..124458dbacc1 --- /dev/null +++ b/keyboards/reviung/reviung41/keymaps/harvester/rules.mk @@ -0,0 +1,28 @@ +LTO_ENABLE = yes +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +MAGIC_ENABLE = yes +BACKLIGHT_ENABLE = no +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +BOOTMAGIC_ENABLE = yes +TERMINAL_ENABLE = no +RGBLIGHT_ENABLE = yes +RGB_MATRIX_ENABLE = no +RGB_MATRIX_DRIVER = WS2812 +OLED_ENABLE = no +OLED_DRIVER = SSD1306 +VIA_ENABLE = yes +GRAVE_ESC_ENABLE = yes +SPACE_CADET_ENABLE = no +NKRO_ENABLE = yes +SPLIT_KEYBOARD = no +ENCODER_ENABLE = no +DEBOUNCE_TYPE = asym_eager_defer_pk +ENCODER_MAP_ENABLE = no +TAP_DANCE_ENABLE = yes + +BOOTLOADER = qmk-dfu +MCU = atmega32u4 diff --git a/keyboards/reviung/reviung41/rules.mk b/keyboards/reviung/reviung41/rules.mk index e4e00e627419..171296984460 100644 --- a/keyboards/reviung/reviung41/rules.mk +++ b/keyboards/reviung/reviung41/rules.mk @@ -7,12 +7,12 @@ BOOTLOADER = caterina # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite MOUSEKEY_ENABLE = no # Mouse keys EXTRAKEY_ENABLE = yes # Audio control and System control CONSOLE_ENABLE = yes # Console for debug COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = no # Enable N-Key Rollover +NKRO_ENABLE = yes # Enable N-Key Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow AUDIO_ENABLE = no # Audio output diff --git a/keyboards/sofle/keymaps/foureight84/README.md b/keyboards/sofle/keymaps/foureight84/README.md new file mode 100644 index 000000000000..e350d93f1ea5 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/README.md @@ -0,0 +1,5 @@ +![SofleKeyboard with Pimoroni Trackball](https://raw.githubusercontent.com/foureight84/sofle-keyboard-pimoroni/master/images/full_view.jpg) + +# Build Guide + +[https://github.com/foureight84/sofle-keyboard-pimoroni](https://github.com/foureight84/sofle-keyboard-pimoroni) diff --git a/keyboards/sofle/keymaps/foureight84/config.h b/keyboards/sofle/keymaps/foureight84/config.h index 2104124f3a6e..35d1e1ddf671 100644 --- a/keyboards/sofle/keymaps/foureight84/config.h +++ b/keyboards/sofle/keymaps/foureight84/config.h @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #pragma once #define EE_HANDS @@ -30,4 +30,4 @@ #define POINTING_DEVICE_ROTATION_90 #define SPLIT_POINTING_ENABLE #define POINTING_DEVICE_RIGHT -#define POINTING_DEVICE_TASK_THROTTLE_MS 8 \ No newline at end of file +#define POINTING_DEVICE_TASK_THROTTLE_MS 8 diff --git a/keyboards/sofle/keymaps/foureight84/keymap.c b/keyboards/sofle/keymaps/foureight84/keymap.c index bd0c50ffa48a..4be5092c9a0a 100644 --- a/keyboards/sofle/keymaps/foureight84/keymap.c +++ b/keyboards/sofle/keymaps/foureight84/keymap.c @@ -18,7 +18,6 @@ #include #include "lib/lib8tion/lib8tion.h" - enum sofle_layers { /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */ _QWERTY, @@ -613,4 +612,4 @@ report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { } return smooth_mouse_movement(mouse_report); -} \ No newline at end of file +} diff --git a/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.c b/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.c new file mode 100644 index 000000000000..1287aeada31f --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.c @@ -0,0 +1,322 @@ +#include "pimoroni_trackball.h" +#include "i2c_master.h" + +#ifndef TRACKBALL_NO_MATH +#include "math.h" +# ifndef TRACKBALL_ANGLE_OFFSET +# define TRACKBALL_ANGLE_OFFSET 0 +# endif +#endif + +#ifndef TRACKBALL_ORIENTATION +# define TRACKBALL_ORIENTATION 2 +#endif + +#ifndef TRACKBALL_REVERSE_VSCROLL +# define TRACKBALL_REVERSE_VSCROLL false +#endif + +#ifndef TRACKBALL_REVERSE_HSCROLL +# define TRACKBALL_REVERSE_HSCROLL false +#endif + +#ifndef TRACKBALL_LED_TIMEOUT +# define TRACKBALL_LED_TIMEOUT 3000 // 0 to ignore timeout +#endif + +#ifndef TRACKBALL_ACCELERATION_WINDOW +# define TRACKBALL_ACCELERATION_WINDOW 5000 // ms window to increase acceleration factor +#endif + +bool scrolling = false; +bool trackball_idle = true; +uint16_t trackball_led_timer; + +void trackball_init(void) { + i2c_init(); +#ifdef TRACKBALL_INTERRUPT_PIN + setPinInput(TRACKBALL_INTERRUPT_PIN); + writePinLow(TRACKBALL_INTERRUPT_PIN); + uint8_t data[] = {REG_INTERRUPT_PIN, MASK_INTERRUPT_PIN_ENABLE}; + i2c_transmit(TRACKBALL_WRITE, data, 2, TB_I2C_TIMEOUT); +#endif +} + +bool trackball_get_interrupt(void) { +#ifndef TRACKBALL_INTERRUPT_PIN + uint8_t data[1] = {}; + i2c_readReg(TRACKBALL_WRITE, REG_INTERRUPT_PIN, data, 1, TB_I2C_TIMEOUT); + + return data[0] & MASK_INTERRUPT_TRIGGERED; +#else + return !readPin(TRACKBALL_INTERRUPT_PIN); +#endif +} + +void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) { + uint8_t data[] = {0x00, red, green, blue, white}; + i2c_transmit(TRACKBALL_WRITE, data, 5, TB_I2C_TIMEOUT); +} + +void trackball_read_state(uint8_t* data, uint16_t size_of_data) { + i2c_readReg(TRACKBALL_WRITE, REG_LEFT, data, size_of_data, TB_I2C_TIMEOUT); +} + +void trackball_set_scrolling(bool scroll) { + scrolling = scroll; +} + +bool trackball_led_timedout(uint16_t elapsed) { + return timer_elapsed(elapsed) > TRACKBALL_LED_TIMEOUT; +} + +trackball_state_t trackball_get_state(void) { + // up down left right button + uint8_t s[5] = {}; + trackball_read_state(s, 5); + + trackball_state_t state = { +#if TRACKBALL_ORIENTATION == 0 + // Pimoroni text is up + .y = s[0] - s[1], + .x = s[3] - s[2], + .v = s[0] - s[1], + .h = s[3] - s[2], +#elif TRACKBALL_ORIENTATION == 1 + // Pimoroni text is right + .y = s[3] - s[2], + .x = s[1] - s[0], + .v = s[3] - s[2], + .h = s[1] - s[0], +#elif TRACKBALL_ORIENTATION == 2 + // Pimoroni text is down + .y = s[1] - s[0], + .x = s[2] - s[3], + .v = s[1] - s[0], + .h = s[2] - s[3], +#else + // Pimoroni text is left + .y = s[2] - s[3], + .x = s[0] - s[1], + .v = s[2] - s[3], + .h = s[0] - s[1], +#endif + .button_down = s[4] & 0x80, + .button_triggered = s[4] & 0x01, + }; + +#ifndef TRACKBALL_NO_MATH + state.angle_rad = atan2(state.y, state.x) + TRACKBALL_ANGLE_OFFSET; + state.vector_length = sqrt(pow(state.x, 2) + pow(state.y, 2)); + state.raw_x = state.x; + state.raw_y = state.y; + state.raw_h = state.h; + state.raw_v = state.v; + state.x = (int16_t)(state.vector_length * cos(state.angle_rad)); + state.y = (int16_t)(state.vector_length * sin(state.angle_rad)); + state.h = (int16_t)(state.vector_length * cos(state.angle_rad)); + state.v = (int16_t)(state.vector_length * sin(state.angle_rad)); +#endif + + return state; +} + +void trackball_sleep(void) { + /* not sure how this is supposed to work */ + uint8_t data[] = {REG_CTRL, MSK_CTRL_FWRITE | MSK_CTRL_SLEEP}; + i2c_transmit(TRACKBALL_WRITE, data, 2, TB_I2C_TIMEOUT); +} + +void trackball_set_brightness(uint8_t brightness) { + uint8_t data[4] = {}; + i2c_readReg(TRACKBALL_WRITE, REG_RED, data, 4, TB_I2C_TIMEOUT); + for (int i=0; i<4; i++) { + if (data[i]) { + data[i] = brightness; + } + } + i2c_writeReg(TRACKBALL_WRITE, REG_RED, data, 4, TB_I2C_TIMEOUT); +} + +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +void trackball_set_hsv(uint8_t hue, uint8_t sat, uint8_t brightness) { + RGB rgb = hsv_to_rgb((HSV){hue, sat, brightness}); + uint8_t white = MIN(rgb.r, MIN(rgb.g, rgb.b)); + rgb.r -= white; + rgb.g -= white; + rgb.b -= white; + + trackball_set_rgbw(rgb.r, rgb.g, rgb.b, white); +} + +void trackball_set_timed_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) { + if (TRACKBALL_LED_TIMEOUT == 0) { + return trackball_set_rgbw(red,green,blue,white); + } else if (timer_elapsed(trackball_led_timer) > 0 && !trackball_led_timedout(trackball_led_timer)) { + trackball_led_timer = timer_read(); + trackball_set_rgbw(red,green,blue,white); + } else if (!trackball_idle) { + trackball_set_rgbw(red,green,blue,white); + trackball_led_timer = timer_read(); + } else if (trackball_idle && trackball_led_timedout(trackball_led_timer)) { + trackball_set_rgbw(0,0,0,0); + } +} + +__attribute__((weak)) void pointing_device_init(void) { + trackball_set_rgbw(0,0,0,70); +} + +__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y, int16_t h, int16_t v) { + mouse_report->x = x; + mouse_report->y = y; + mouse_report->h = h; + mouse_report->v = v; +} +__attribute__((weak)) void update_member(int8_t* member, int16_t* offset) { + if (*offset > 127) { + *member = 127; + *offset -= 127; + } else if (*offset < -127) { + *member = -127; + *offset += 127; + } else { + *member = *offset; + *offset = 0; + } +} + +__attribute__((weak)) bool has_report_changed(report_mouse_t new, report_mouse_t old) { + return (new.buttons != old.buttons) || + (new.x && new.x != old.x) || + (new.y && new.y != old.y) || + (new.h && new.h != old.h) || + (new.v && new.v != old.v); +} + +static int16_t x_offset = 0; +static int16_t y_offset = 0; +static int16_t v_offset = 0; +static int16_t h_offset = 0; +static int16_t tb_timer = 0; +uint16_t acceleration_timer = 0; + +__attribute__((weak)) void process_mouse(report_mouse_t* mouse) { + static int8_t new_x_offset = 0; + static int8_t new_y_offset = 0; + static int8_t new_v_offset = 0; + static int8_t new_h_offset = 0; + if (trackball_get_interrupt() && (!tb_timer || timer_elapsed(tb_timer) > TRACKBALL_TIMEOUT)) { + tb_timer = timer_read() | 1; + // trigger_tapping(); + // uint8_t mods = get_mods(); + + trackball_state_t state = trackball_get_state(); + + if (state.button_triggered) { + if(state.button_down) { + mouse->buttons |= MOUSE_BTN1; + } else { + mouse->buttons &= ~MOUSE_BTN1; + } + } else { + float power = 1.5; + float var_accel = 2; //acceleration factor + double newlen = pow(state.vector_length, power); + + if (state.vector_length > 2 && (timer_elapsed(acceleration_timer) == 0 || timer_elapsed(acceleration_timer) < TRACKBALL_ACCELERATION_WINDOW)) { + acceleration_timer = timer_read(); + newlen += pow(state.vector_length*var_accel, power); + } else { + acceleration_timer = timer_read(); + newlen += pow(state.vector_length, power); + } + + //newlen = pow(state.vector_length, power); + + x_offset += (newlen * cos(state.angle_rad)); + y_offset += (newlen * sin(state.angle_rad)); + #if TRACKBALL_REVERSE_VSCROLL == true + v_offset += (newlen * sin(state.angle_rad)); + #else + v_offset -= (newlen * sin(state.angle_rad)); + #endif + #if TRACKBALL_REVERSE_HSCROLL == true + h_offset -= (newlen * cos(state.angle_rad)); + #else + h_offset += (newlen * cos(state.angle_rad)); + #endif + } + + } + + while (x_offset || y_offset || h_offset || v_offset) { + update_member(&new_x_offset, &x_offset); + update_member(&new_y_offset, &y_offset); + + update_member(&new_v_offset, &v_offset); + update_member(&new_h_offset, &h_offset); + + mouse->x = new_x_offset; + mouse->y = new_y_offset; + mouse->v = new_v_offset; + mouse->h = new_h_offset; + } +} + +__attribute__((weak)) void pointing_device_task(void) { + report_mouse_t mouse_report = pointing_device_get_report(); + + trackball_set_timed_rgbw(0,0,0,70); + + if (!is_keyboard_left() || !is_keyboard_master()) { + process_mouse(&mouse_report); + } + + pointing_device_set_report(mouse_report); + pointing_device_send(); +} + +__attribute__((weak)) void pointing_device_send(void) { + static report_mouse_t old_report = {}; + report_mouse_t mouseReport = pointing_device_get_report(); + if (is_keyboard_left() || is_keyboard_master()) { + int8_t x = mouseReport.x, y = mouseReport.y, h = mouseReport.h, v = mouseReport.v; + mouseReport.x = 0; + mouseReport.y = 0; + mouseReport.h = 0; + mouseReport.v = 0; + if (!scrolling) { + process_mouse_user(&mouseReport, x, y, 0, 0); + } else { + process_mouse_user(&mouseReport, 0, 0, h, v); + } + + if (has_report_changed(mouseReport, old_report)) { + trackball_idle = false; + host_mouse_send(&mouseReport); + } else { + trackball_idle = true; + } + } else { + if (has_report_changed(mouseReport, old_report)) { + trackball_idle = false; + } else { + trackball_idle = true; + } + + if (!scrolling) { + master_mouse_send(mouseReport.x, mouseReport.y, 0, 0 , mouseReport.buttons); + } else { + master_mouse_send(0, 0, mouseReport.h, mouseReport.v , 0); + } + } + mouseReport.x = 0; + mouseReport.y = 0; + mouseReport.v = 0; + mouseReport.h = 0; + old_report = mouseReport; + pointing_device_set_report(mouseReport); +} diff --git a/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.h b/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.h new file mode 100644 index 000000000000..c98e0a4eb905 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/pimoroni_trackball.h @@ -0,0 +1,79 @@ +#pragma once + +#include +#include "color.h" +#include "pointing_device.h" + +#ifndef TRACKBALL_ADDRESS +# define TRACKBALL_ADDRESS 0x0A +#endif + +#ifndef TRACKBALL_ANGLE_OFFSET +# define TRACKBALL_ANGLE_OFFSET 0 +#endif + +#ifndef TRACKBALL_TIMEOUT +# define TRACKBALL_TIMEOUT 5 +#endif + +#define TRACKBALL_WRITE ((TRACKBALL_ADDRESS << 1) | I2C_WRITE) +#define TRACKBALL_READ ((TRACKBALL_ADDRESS << 1) | I2C_READ) + +#define TB_I2C_TIMEOUT 100 + +#define REG_RED 0x00 +#define REG_GREEN 0x01 +#define REG_BLUE 0x02 +#define REG_WHITE 0x03 + +#define REG_LEFT 0x04 + +#define REG_INTERRUPT_PIN 0xF9 +#define MASK_INTERRUPT_TRIGGERED 0x01 +#define MASK_INTERRUPT_PIN_ENABLE 0x02 + +#define REG_CTRL 0xFE +#define MSK_CTRL_SLEEP 0b00000001 +#define MSK_CTRL_RESET 0b00000010 +#define MSK_CTRL_FREAD 0b00000100 +#define MSK_CTRL_FWRITE 0b00001000 + + +typedef struct { + int16_t x; + int16_t y; + int16_t h; + int16_t v; + bool button_down; + bool button_triggered; +#ifndef TRACKBALL_NO_MATH + double vector_length; + double angle_rad; + int8_t raw_x; + int8_t raw_y; + int8_t raw_h; + int8_t raw_v; +#endif +} trackball_state_t; + +void trackball_init(void); +bool trackball_get_interrupt(void); +void trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w); +void trackball_set_timed_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w); +void trackball_read_state(uint8_t* data, uint16_t size_of_data); +void trackball_sleep(void); +void trackball_set_brightness(uint8_t brightness); +void trackball_set_hsv(uint8_t hue, uint8_t sat, uint8_t brightness); +void trackball_set_scrolling (bool scroll); + +trackball_state_t trackball_get_state(void); + +void pointing_device_init(void); +void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y, int16_t h, int16_t v); +void update_member(int8_t* member, int16_t* offset); +bool has_report_changed(report_mouse_t new, report_mouse_t old); +void process_mouse(report_mouse_t* mouse); +void pointing_device_task(void); +void pointing_device_send(void); + +void master_mouse_send(int8_t x, int8_t y, int8_t h, int8_t v, uint8_t mouse_buttons); diff --git a/keyboards/sofle/keymaps/foureight84/readme.md b/keyboards/sofle/keymaps/foureight84/readme.md index e88b0e04f668..e350d93f1ea5 100644 --- a/keyboards/sofle/keymaps/foureight84/readme.md +++ b/keyboards/sofle/keymaps/foureight84/readme.md @@ -1 +1,5 @@ -For more information on integrating the Pimoroni Trackball, please see: https://github.com/foureight84/sofle-keyboard-pimoroni +![SofleKeyboard with Pimoroni Trackball](https://raw.githubusercontent.com/foureight84/sofle-keyboard-pimoroni/master/images/full_view.jpg) + +# Build Guide + +[https://github.com/foureight84/sofle-keyboard-pimoroni](https://github.com/foureight84/sofle-keyboard-pimoroni) diff --git a/keyboards/sofle/keymaps/foureight84/rules.mk b/keyboards/sofle/keymaps/foureight84/rules.mk index 102742ab1ce7..23a2c468da62 100644 --- a/keyboards/sofle/keymaps/foureight84/rules.mk +++ b/keyboards/sofle/keymaps/foureight84/rules.mk @@ -19,6 +19,6 @@ POINTING_DEVICE_ENABLE = yes POINTING_DEVICE_DRIVER = pimoroni_trackball SPACE_CADET_ENABLE = no -GRAVE_ESC_ENABLE = no +GRAVE_ESC_ENABLE = no MAGIC_ENABLE = no -MUSIC_ENABLE = no \ No newline at end of file +MUSIC_ENABLE = no diff --git a/keyboards/sofle/keymaps/foureight84/transport.c b/keyboards/sofle/keymaps/foureight84/transport.c new file mode 100644 index 000000000000..b86bd4c98b4e --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/transport.c @@ -0,0 +1,344 @@ +#include +#include + +#include "config.h" +#include "matrix.h" +#include "quantum.h" + +#define ROWS_PER_HAND (MATRIX_ROWS / 2) + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif + +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + +#ifdef ENCODER_ENABLE +# include "encoder.h" +static pin_t encoders_pad[] = ENCODERS_PAD_A; +# define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t)) +#endif + +#ifdef POINTING_DEVICE_ENABLE +# include "pointing_device.h" +static int8_t split_mouse_x = 0, split_mouse_y = 0, split_mouse_h = 0, split_mouse_v = 0; +static uint8_t split_mouse_buttons; +#endif + +#ifdef OLED_DRIVER_ENABLE +# include "oled_driver.h" +#endif + +#if defined(USE_I2C) + +# include "i2c_master.h" +# include "i2c_slave.h" + +typedef struct _I2C_slave_buffer_t { + matrix_row_t smatrix[ROWS_PER_HAND]; + uint8_t backlight_level; +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + rgblight_syncinfo_t rgblight_sync; +# endif +# ifdef ENCODER_ENABLE + uint8_t encoder_state[NUMBER_OF_ENCODERS]; +# endif +# ifdef WPM_ENABLE + uint8_t current_wpm; +# endif +} I2C_slave_buffer_t; + +static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; + +# define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level) +# define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync) +# define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix) +# define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state) +# define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm) + +# define TIMEOUT 100 + +# ifndef SLAVE_I2C_ADDRESS +# define SLAVE_I2C_ADDRESS 0x32 +# endif + +// Get rows from other half over i2c +bool transport_master(matrix_row_t matrix[]) { + i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT); + + // write backlight info +# ifdef BACKLIGHT_ENABLE + uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0; + if (level != i2c_buffer->backlight_level) { + if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) { + i2c_buffer->backlight_level = level; + } + } +# endif + +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + if (rgblight_get_change_flags()) { + rgblight_syncinfo_t rgblight_sync; + rgblight_get_syncinfo(&rgblight_sync); + if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START, (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) { + rgblight_clear_change_flags(); + } + } +# endif + +# ifdef ENCODER_ENABLE + i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT); + encoder_update_raw(i2c_buffer->encoder_state); +# endif + +# ifdef WPM_ENABLE + uint8_t current_wpm = get_current_wpm(); + if (current_wpm != i2c_buffer->current_wpm) { + if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WPM_START, (void *)¤t_wpm, sizeof(current_wpm), TIMEOUT) >= 0) { + i2c_buffer->current_wpm = current_wpm; + } + } +# endif + return true; +} + +void transport_slave(matrix_row_t matrix[]) { + // Copy matrix to I2C buffer + memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix)); + +// Read Backlight Info +# ifdef BACKLIGHT_ENABLE + backlight_set(i2c_buffer->backlight_level); +# endif + +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + // Update the RGB with the new data + if (i2c_buffer->rgblight_sync.status.change_flags != 0) { + rgblight_update_sync(&i2c_buffer->rgblight_sync, false); + i2c_buffer->rgblight_sync.status.change_flags = 0; + } +# endif + +# ifdef ENCODER_ENABLE + encoder_state_raw(i2c_buffer->encoder_state); +# endif + +# ifdef WPM_ENABLE + set_current_wpm(i2c_buffer->current_wpm); +# endif +} + +void transport_master_init(void) { i2c_init(); } + +void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); } + +#else // USE_SERIAL + +# include "serial.h" + +typedef struct _Serial_s2m_buffer_t { + // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack + matrix_row_t smatrix[ROWS_PER_HAND]; + +# ifdef ENCODER_ENABLE + uint8_t encoder_state[NUMBER_OF_ENCODERS]; +# endif + int8_t mouse_x; + int8_t mouse_y; + int8_t mouse_h; + int8_t mouse_v; + uint8_t mouse_buttons; +} Serial_s2m_buffer_t; + +typedef struct _Serial_m2s_buffer_t { +# ifdef BACKLIGHT_ENABLE + uint8_t backlight_level; +# endif +# ifdef WPM_ENABLE + uint8_t current_wpm; +# endif +# ifdef OLED_DRIVER_ENABLE + bool oled_on; +# endif + layer_state_t t_layer_state; + layer_state_t t_default_layer_state; +} Serial_m2s_buffer_t; + +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) +// When MCUs on both sides drive their respective RGB LED chains, +// it is necessary to synchronize, so it is necessary to communicate RGB +// information. In that case, define RGBLIGHT_SPLIT with info on the number +// of LEDs on each half. +// +// Otherwise, if the master side MCU drives both sides RGB LED chains, +// there is no need to communicate. + +typedef struct _Serial_rgblight_t { + rgblight_syncinfo_t rgblight_sync; +} Serial_rgblight_t; + +volatile Serial_rgblight_t serial_rgblight = {}; +uint8_t volatile status_rgblight = 0; +# endif + +volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; +volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; +uint8_t volatile status0 = 0; + +enum serial_transaction_id { + GET_SLAVE_MATRIX = 0, +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + PUT_RGBLIGHT, +# endif +}; + +SSTD_t transactions[] = { + [GET_SLAVE_MATRIX] = + { + (uint8_t *)&status0, + sizeof(serial_m2s_buffer), + (uint8_t *)&serial_m2s_buffer, + sizeof(serial_s2m_buffer), + (uint8_t *)&serial_s2m_buffer, + }, +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + [PUT_RGBLIGHT] = + { + (uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL // no slave to master transfer + }, +# endif +}; + +void transport_master_init(void) { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } + +void transport_slave_init(void) { soft_serial_target_init(transactions, TID_LIMIT(transactions)); } + +# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) + +// rgblight synchronization information communication. + +void transport_rgblight_master(void) { + if (rgblight_get_change_flags()) { + rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync); + if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) { + rgblight_clear_change_flags(); + } + } +} + +void transport_rgblight_slave(void) { + if (status_rgblight == TRANSACTION_ACCEPTED) { + rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync, false); + status_rgblight = TRANSACTION_END; + } +} + +# else +# define transport_rgblight_master() +# define transport_rgblight_slave() +# endif + +bool transport_master(matrix_row_t matrix[]) { +# ifndef SERIAL_USE_MULTI_TRANSACTION + if (soft_serial_transaction() != TRANSACTION_END) { + return false; + } +# else + transport_rgblight_master(); + if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) { + return false; + } +# endif + + // TODO: if MATRIX_COLS > 8 change to unpack() + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[i] = serial_s2m_buffer.smatrix[i]; + } + +# ifdef BACKLIGHT_ENABLE + // Write backlight level for slave to read + serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0; +# endif + +# ifdef ENCODER_ENABLE + encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state); +# endif + +# ifdef WPM_ENABLE + // Write wpm to slave + serial_m2s_buffer.current_wpm = get_current_wpm(); +# endif +# ifdef POINTING_DEVICE_ENABLE + if (is_keyboard_left()) { + report_mouse_t temp_report = pointing_device_get_report(); + temp_report.x = serial_s2m_buffer.mouse_x; + temp_report.y = serial_s2m_buffer.mouse_y; + temp_report.h = serial_s2m_buffer.mouse_h; + temp_report.v = serial_s2m_buffer.mouse_v; + temp_report.buttons = serial_s2m_buffer.mouse_buttons; + pointing_device_set_report(temp_report); + } +# endif +# ifdef OLED_DRIVER_ENABLE + serial_m2s_buffer.oled_on = is_oled_on(); +# endif + serial_m2s_buffer.t_layer_state = layer_state; + serial_m2s_buffer.t_default_layer_state = default_layer_state; + return true; +} + +void transport_slave(matrix_row_t matrix[]) { + transport_rgblight_slave(); + // TODO: if MATRIX_COLS > 8 change to pack() + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_s2m_buffer.smatrix[i] = matrix[i]; + } +# ifdef BACKLIGHT_ENABLE + backlight_set(serial_m2s_buffer.backlight_level); +# endif + +# ifdef ENCODER_ENABLE + encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state); +# endif + +# ifdef WPM_ENABLE + set_current_wpm(serial_m2s_buffer.current_wpm); +# endif +# ifdef POINTING_DEVICE_ENABLE + if (!is_keyboard_left()) { + serial_s2m_buffer.mouse_x = split_mouse_x; + serial_s2m_buffer.mouse_y = split_mouse_y; + serial_s2m_buffer.mouse_h = split_mouse_h; + serial_s2m_buffer.mouse_v = split_mouse_v; + serial_s2m_buffer.mouse_buttons = split_mouse_buttons; + } +# endif +# ifdef OLED_DRIVER_ENABLE + if (serial_m2s_buffer.oled_on) { + oled_on(); + } else { + oled_off(); + } +# endif + + if (layer_state != serial_m2s_buffer.t_layer_state) { + layer_state = serial_m2s_buffer.t_layer_state; + } + if (default_layer_state != serial_m2s_buffer.t_default_layer_state) { + default_layer_state = serial_m2s_buffer.t_default_layer_state; + } +} + +#endif + +#ifdef POINTING_DEVICE_ENABLE +void master_mouse_send(int8_t x, int8_t y, int8_t h, int8_t v, uint8_t buttons) { + split_mouse_x = x; + split_mouse_y = y; + split_mouse_h = h; + split_mouse_v = v; + split_mouse_buttons = buttons; +} +#endif diff --git a/keyboards/sofle/keymaps/foureight84/transport.h b/keyboards/sofle/keymaps/foureight84/transport.h new file mode 100644 index 000000000000..c667bfab8537 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/transport.h @@ -0,0 +1,10 @@ +#pragma once + +#include "matrix.h" + +void transport_master_init(void); +void transport_slave_init(void); + +// returns false if valid data not received from slave +bool transport_master(matrix_row_t matrix[]); +void transport_slave(matrix_row_t matrix[]); diff --git a/keyboards/sofle/keymaps/harvester/config.h b/keyboards/sofle/keymaps/harvester/config.h new file mode 100644 index 000000000000..701de623451e --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/config.h @@ -0,0 +1,130 @@ +/* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* The way how "handedness" is decided (which half is which), +see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness +for more options. +*/ + +#if defined(KEYBOARD_sofle_rev1) + +#define SPLIT_TRANSPORT_MIRROR +#define SPLIT_LAYER_STATE_ENABLE +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_MODS_ENABLE + +//#define TAPPING_FORCE_HOLD +#ifdef TAPPING_TERM + #undef TAPPING_TERM + #define TAPPING_TERM 200 +#endif + +#ifdef ENCODER_RESOLUTION + #undef ENCODER_RESOLUTION + #define ENCODER_RESOLUTION 4 +#endif + +// Add RGB underglow and top facing lighting +# define RGB_DI_PIN D3 +# define RGBLED_NUM 72 +# define RGBLED_SPLIT { 36, 36 } +# ifdef RGB_MATRIX_ENABLE +# define DRIVER_LED_TOTAL RGBLED_NUM +# define RGB_MATRIX_SPLIT RGBLED_SPLIT +# define RGB_MATRIX_LED_COUNT RGBLED_NUM + +# define RGB_MATRIX_KEYPRESSES // reacts to keypresses +// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) +// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects +# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended +//# define RGB_MATRIX_FRAMEBUFFER_EFFECTS +// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) +// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) +# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 120 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash. +# define RGB_MATRIX_HUE_STEP 2 +# define RGB_MATRIX_SAT_STEP 8 +# define RGB_MATRIX_VAL_STEP 8 +# define RGB_MATRIX_SPD_STEP 10 + +/* Enable the animations you want/need. You may need to enable only a small number of these because * + * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */ +// RGB Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects +# define ENABLE_RGB_MATRIX_ALPHAS_MODS +# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_BREATHING +# define ENABLE_RGB_MATRIX_BAND_SAT +# define ENABLE_RGB_MATRIX_BAND_VAL +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +# define ENABLE_RGB_MATRIX_CYCLE_ALL +# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +# define ENABLE_RGB_MATRIX_DUAL_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +# define ENABLE_RGB_MATRIX_RAINDROPS +# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +# define ENABLE_RGB_MATRIX_HUE_BREATHING +# define ENABLE_RGB_MATRIX_HUE_PENDULUM +# define ENABLE_RGB_MATRIX_HUE_WAVE +# define ENABLE_RGB_MATRIX_PIXEL_RAIN +# define ENABLE_RGB_MATRIX_PIXEL_FLOW +# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined +# define ENABLE_RGB_MATRIX_TYPING_HEATMAP +# define ENABLE_RGB_MATRIX_DIGITAL_RAIN +// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +# define ENABLE_RGB_MATRIX_SPLASH +# define ENABLE_RGB_MATRIX_MULTISPLASH +# define ENABLE_RGB_MATRIX_SOLID_SPLASH +# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH + +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_BREATHING + +# else +# define RGBLIGHT_ANIMATIONS +# define RGBLIGHT_LIMIT_VAL 120 +# define RGBLIGHT_HUE_STEP 10 +# define RGBLIGHT_SAT_STEP 17 +# define RGBLIGHT_VAL_STEP 17 +# endif +#endif + +#define USB_POLLING_INTERVAL_MS 1 +#define QMK_KEYS_PER_SCAN 12 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 9 diff --git a/keyboards/sofle/keymaps/harvester/encoder.c b/keyboards/sofle/keymaps/harvester/encoder.c new file mode 100644 index 000000000000..131576fa97ad --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/encoder.c @@ -0,0 +1,53 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//Setting up what encoder rotation does. If your encoder can be pressed as a button, that function can be set in Via. + +#ifdef ENCODER_ENABLE + +bool encoder_update_user(uint8_t index, bool clockwise) { + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return true; +} + +#endif + +#if defined(ENCODER_MAP_ENABLE) + const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [_BASE] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_GAME] = { ENCODER_CCW_CW(KC_PSLS, KC_PAST), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_FUN] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_HOME, KC_END) }, + [_MEDIA] = { ENCODER_CCW_CW(RGB_HUI, RGB_SAI), ENCODER_CCW_CW(RGB_VAI, RGB_SPI) }, + [_NUM] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, + [_MOD] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_SYM] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_MSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_NAV] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, +}; +#endif diff --git a/keyboards/sofle/keymaps/harvester/enums.h b/keyboards/sofle/keymaps/harvester/enums.h new file mode 100644 index 000000000000..dfd098b8fc7f --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/enums.h @@ -0,0 +1,30 @@ +// [SOFLE layers Init] -------------------------------------------------------// +typedef enum { + _BASE, + _GAME, + _NAV, + _MSE, + _MEDIA, + _NUM, + _SYM, + _FUN, + _MOD +}SOFLE_LAYERS; + +extern enum SOFLE_LAYERS sofle_layers; + +typedef enum { + _RGB_INDICATORS, + _RGB_DANGER, + _RGB_NUM, + _RGB_FUN, + _RGB_MEDIA, + _RGB_GAME, + _RGB_MODS, + _RGB_NAV, + _RGB_DEFAULT, + _RGB_TRANS, + _RGB_DISABLED +}SOFLE_RGB; + +extern enum SOFLE_RGB sofle_rgb; diff --git a/keyboards/sofle/keymaps/harvester/keymap.c b/keyboards/sofle/keymaps/harvester/keymap.c new file mode 100644 index 000000000000..b901f4e2058e --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/keymap.c @@ -0,0 +1,278 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "enums.h" +#include "rgb.c" +#include "oled.c" +#include "encoder.c" + +// Aliases for readability +#define BASE TO(_BASE) +#define GAME TO(_GAME) +#define SYM LT(_SYM,KC_ENT) +#define NAV LT(_NAV,KC_TAB) +#define FUN LT(_FUN,KC_DEL) +#define MEDIA LT(_MEDIA,KC_ESC) +#define NUM LT(_NUM,KC_BSPC) +#define MOD MO(_MOD) +#define MSE LT(_MSE,KC_SPC) + +// Tap Dance keycodes +enum td_keycodes { + CTL_LPRN, // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance. + CTL_RPRN, + +}; + +// Define a type containing as many tapdance states as you need +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_SINGLE_TAP +} td_state_t; + +// Create a global instance of the tapdance state type +static td_state_t td_state; + +// Declare your tapdance functions: + +// Function to determine the current tapdance state +td_state_t cur_dance(qk_tap_dance_state_t *state); + +// `finished` and `reset` functions for each tapdance keycode +void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data); +void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data); +void ctl_rprn_finished(qk_tap_dance_state_t *state, void *user_data); +void ctl_rprn_reset(qk_tap_dance_state_t *state, void *user_data); + +//Default keymap. This can be changed in Via. Use oled.c and encoder.c to change beavior that Via cannot change. + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| | | |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ + +[_BASE] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT), + TD(CTL_LPRN), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_CAPS, KC_MUTE, KC_N, KC_M, KC_COMM, KC_DOT,KC_SLSH, TD(CTL_RPRN), + KC_LGUI,KC_LALT,MEDIA, NAV, MSE, SYM, NUM, FUN, KC_RALT, KC_MENU +), +/* + * COLEMAK + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `-----------------------------------' '------''---------------------------' + */ + +[_GAME] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F13, KC_MUTE,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + XXXXXXX,XXXXXXX,MO(_NUM), MO(_MOD), KC_SPC, KC_ENT, KC_BSPC , KC_DEL, XXXXXXX, XXXXXXX +), +/* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ +[_NAV] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + _______, C(KC_A), C(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, + _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, + _______, _______, XXXXXXX, _______, XXXXXXX, KC_ENT, KC_BSPC, KC_DEL, _______, _______ +), +/* RAISE + * ,----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * |Shift | Undo | Cut | Copy | Paste| |--------| |-------| | LStr | | LEnd | | Shift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ +[_MSE] = LAYOUT( + QK_BOOT, XXXXXXX, XXXXXXX, LGUI_T(KC_E), XXXXXXX, TO(_GAME), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + XXXXXXX, XXXXXXX, LSG_T(KC_S), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, + EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX +), +[_MEDIA] = LAYOUT( + _______, XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,_______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, + _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MUTE, XXXXXXX, XXXXXXX +), +[_NUM] = LAYOUT( + XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, + XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_DOT, KC_0, KC_MINS, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX +), +[_SYM] = LAYOUT( + XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, + XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, KC_UNDS, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX +), +[_FUN] = LAYOUT( + XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,XXXXXXX, + XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX +), +[_MOD] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX ,TO(_BASE), + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX +) +}; + +// Determine the tapdance state to return +td_state_t cur_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return TD_SINGLE_TAP; + else return TD_SINGLE_HOLD; + } + + if (state->count == 2) return TD_DOUBLE_SINGLE_TAP; + else return TD_UNKNOWN; // Any number higher than the maximum state value you return above +} + +// Handle the possible states for each tapdance keycode you define: + +void ctl_lprn_finished(qk_tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + register_code16(LSFT(KC_9)); + break; + case TD_SINGLE_HOLD: + register_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term + tap_code16(LSFT(KC_9)); + register_code16(LSFT(KC_9)); + break; + default: + break; + } +} + +void ctl_lprn_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (td_state) { + case TD_SINGLE_TAP: + unregister_code16(LSFT(KC_9)); + break; + case TD_SINGLE_HOLD: + unregister_mods(MOD_BIT(KC_LCTL)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: + unregister_code16(LSFT(KC_9)); + break; + default: + break; + } +} + +void ctl_rprn_finished(qk_tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + register_code16(LSFT(KC_0)); + break; + case TD_SINGLE_HOLD: + register_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term + tap_code16(LSFT(KC_0)); + register_code16(LSFT(KC_0)); + break; + default: + break; + } +} + +void ctl_rprn_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (td_state) { + case TD_SINGLE_TAP: + unregister_code16(LSFT(KC_0)); + break; + case TD_SINGLE_HOLD: + unregister_mods(MOD_BIT(KC_RALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: + unregister_code16(LSFT(KC_0)); + break; + default: + break; + } +} + +// Define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions +qk_tap_dance_action_t tap_dance_actions[] = { + [CTL_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_lprn_finished, ctl_lprn_reset), + [CTL_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_rprn_finished, ctl_rprn_reset) +}; diff --git a/keyboards/sofle/keymaps/harvester/oled.c b/keyboards/sofle/keymaps/harvester/oled.c new file mode 100644 index 000000000000..cf9012671c6c --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/oled.c @@ -0,0 +1,91 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//Sets up what the OLED screens display. + +#ifdef OLED_ENABLE + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0 + }; + + oled_write_P(qmk_logo, false); +} + +static void print_status_narrow(void) { + + oled_write_P(PSTR("\n\n"), false); + // Print current layer + oled_write_ln_P(PSTR("LAYER"), false); + switch (get_highest_layer(layer_state)) { + case _BASE: + oled_write_P(PSTR("Base\n"), false); + break; + case _GAME: + oled_write_P(PSTR("Game\n"), false); + break; + case _NUM: + oled_write_P(PSTR("Num\n"), false); + break; + case _FUN: + oled_write_P(PSTR("Func\n"), false); + break; + case _MEDIA: + oled_write_P(PSTR("Media"), false); + break; + case _MOD: + oled_write_P(PSTR("Game+"), false); + break; + case _NAV: + oled_write_P(PSTR("Nav\n"), false); + break; + case _SYM: + oled_write_P(PSTR("Sym\n"), false); + break; + case _MSE: + oled_write_P(PSTR("Mouse"), false); + break; + default: + oled_write_ln_P(PSTR("NFI\n"), false); + } + oled_write_P(PSTR("\n\n"), false); + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); + oled_write_ln_P(PSTR("NUMLK"), led_usb_state.num_lock); + oled_write_ln_P(PSTR("SCRLK"), led_usb_state.scroll_lock); +} + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_270; + } + return rotation; +} + +bool oled_task_user(void) { + if (is_keyboard_master()) { + print_status_narrow(); + } else { + render_logo(); + } + return false; +} + +#endif diff --git a/keyboards/sofle/keymaps/harvester/readme.md b/keyboards/sofle/keymaps/harvester/readme.md new file mode 100644 index 000000000000..8470c69bcfbc --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/readme.md @@ -0,0 +1,14 @@ +# VIA keymap for Sofle + +Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff) and [adjust layer](http://www.keyboard-layout-editor.com/#/gists/4bcf66f922cfd54da20ba04905d56bd4) + + +Features: + +- Symmetric modifiers (CMD/Super, Alt/Opt, Ctrl, Shift) +- Modes for Qwerty and Colemak support +- The OLED on master half shows selected mode and caps lock state and is rotated. +- Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN. +- Via support +- RGB underglow support + diff --git a/keyboards/sofle/keymaps/harvester/rgb.c b/keyboards/sofle/keymaps/harvester/rgb.c new file mode 100644 index 000000000000..ad7cf3933d01 --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/rgb.c @@ -0,0 +1,82 @@ +#include QMK_KEYBOARD_H +#include "rgb.h" + +#ifdef RGB_MATRIX_ENABLE + +__attribute__ ((weak)) + +bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + + if (host_keyboard_led_state().caps_lock) { + for (uint8_t i = led_min; i <= led_max; i++) { + if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) { + rgb_matrix_set_color(i, RGB_INDICATORS); + } + } + } + + if (get_highest_layer(layer_state) > 0) { + uint8_t layer = get_highest_layer(layer_state); + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + if (index >= led_min && index <= led_max && index != NO_LED && (keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_BOOTLOADER || keymap_key_to_keycode(layer, (keypos_t){col, row}) == QK_CLEAR_EEPROM)) { + rgb_matrix_set_color(index, RGB_DANGER); + } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) > KC_TRNS) { + switch (layer) { + /*case _NUM: { + rgb_matrix_set_color(index, RGB_NUM); + break; + } + case _FUN: { + rgb_matrix_set_color(index, RGB_FUNC); + break; + } + case _MEDIA: { + rgb_matrix_set_color(index, RGB_MEDIA); + break; + }*/ + case _GAME: { + switch (keymap_key_to_keycode(layer, (keypos_t){col, row})) { + case KC_W: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_A: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_S: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + case KC_D: { + rgb_matrix_set_color(index, RGB_GAME); + break; + } + default: { + rgb_matrix_set_color(index, RGB_DISABLED); + break; + } + } + break; + }; + /*case _MOD: { + rgb_matrix_set_color(index, RGB_MODS); + break; + };*/ + default: { // for any other layers, or the default layer + rgb_matrix_set_color(index, RGB_DEFAULT); + } + } + } /*else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_TRNS) { + rgb_matrix_set_color(index, RGB_TRANS); + } else if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col, row}) == KC_NO) { + rgb_matrix_set_color(index, RGB_DISABLED); + }*/ + } + } + } + return false; +} +#endif diff --git a/keyboards/sofle/keymaps/harvester/rgb.h b/keyboards/sofle/keymaps/harvester/rgb.h new file mode 100644 index 000000000000..b5fc2b5f33cf --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/rgb.h @@ -0,0 +1,11 @@ +#define RGB_INDICATORS 70,70,70 +#define RGB_DANGER 120,0,0 +#define RGB_NUM 0,120,120 +#define RGB_FUNC 120,120,0 +#define RGB_MEDIA 120,0,120 +#define RGB_GAME 120,0,0 +#define RGB_MODS 0,0,120 +#define RGB_MODS2 0,120,0 +#define RGB_DEFAULT 255,255,255 +#define RGB_TRANS 10,10,10 +#define RGB_DISABLED 0,0,0 diff --git a/keyboards/sofle/keymaps/harvester/rules.mk b/keyboards/sofle/keymaps/harvester/rules.mk new file mode 100644 index 000000000000..4e98ca0d65b1 --- /dev/null +++ b/keyboards/sofle/keymaps/harvester/rules.mk @@ -0,0 +1,25 @@ +LTO_ENABLE = yes +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +MAGIC_ENABLE = yes +BACKLIGHT_ENABLE = no +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +BOOTMAGIC_ENABLE = lite +TERMINAL_ENABLE = no +RGBLIGHT_ENABLE = no +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = WS2812 +OLED_ENABLE = yes +OLED_DRIVER = SSD1306 +VIA_ENABLE = yes +GRAVE_ESC_ENABLE = yes +SPACE_CADET_ENABLE = no +NKRO_ENABLE = yes +SPLIT_KEYBOARD = yes +ENCODER_ENABLE = yes +TAP_DANCE_ENABLE = yes +DEBOUNCE_TYPE = asym_eager_defer_pk +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/solartempest/9e/9e VIA keymap.json b/keyboards/solartempest/9e/9e VIA keymap.json new file mode 100644 index 000000000000..4e0b8486d73f --- /dev/null +++ b/keyboards/solartempest/9e/9e VIA keymap.json @@ -0,0 +1,44 @@ +{ + "name": "A9e" , + "vendorId": "0x414B", + "productId": "0x0009", + "lighting": "qmk_rgblight", + "matrix": { "rows": 4, "cols": 12 }, + "customKeycodes": [ + { + "name": "Super Alt Tab FWD", + "title": "Alt Tab Forwards in Windows", + "shortName": "ATABF" + }, + { + "name": "Super Alt Tab REV", + "title": "Alt Tab Reverse in Windows", + "shortName": "ATABR" + }, + { + "name": "Move Window Right", + "title": "Move Window Right in Windows", + "shortName": "MWR" + }, + { + "name": "Move Window Left", + "title": "Move Window Left in Windows", + "shortName": "MWL" + }, + { + "name": "Stretch Timer", + "title": "Activate Stretch Timer", + "shortName": "STRT" + } + ], + "layouts": + { + "keymap": + [ + [{"x": 0.25},"0,0", {"x": 1}, "1,0",{"h": 1.5},"1,1","1,2", {"x": 1}, "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", {"x": 1}, "0,9", {"h": 1.5},"0,10","0,11", {"x": 1}, "1,9",{"h": 1.5},"1,10","1,11"], + [{"w": 1.5},"0,1",{"x": 4.75}, "1,3", "1,4", "1,5", "1,6", "1,7", "1,8"], + [{"x": 0.25},"0,2", {"x": 1}, "2,0",{"h": 1.5},"2,1","2,2", {"x": 1}, "2,3", "2,4", "2,5", "2,6", "2,7", "2,8", {"x": 3}, "2,9",{"h": 1.5},"2,10","2,11"], + [{"x": 6.25, "y": 0.5}, "3,3",{"h": 1.5},"3,4","3,5", "3,6",{"h": 1.5},"3,7", "3,8", {"x": 3,"y": 1},"3,9",{"h": 1.5},"3,10","3,11"] + ] + } +} \ No newline at end of file diff --git a/keyboards/solartempest/9e/9e VIA layout.json b/keyboards/solartempest/9e/9e VIA layout.json new file mode 100644 index 000000000000..51cd2f2e6925 --- /dev/null +++ b/keyboards/solartempest/9e/9e VIA layout.json @@ -0,0 +1,507 @@ +{ + "name": "A9e", + "vendorProductId": 1095434249, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_RGHT", + "KC_MUTE", + "KC_LEFT", + "TO(1)", + "TO(2)", + "TO(3)", + "KC_P7", + "KC_P8", + "KC_P9", + "KC_WWW_BACK", + "KC_MSTP", + "KC_WWW_FORWARD", + "KC_VOLD", + "KC_F14", + "KC_VOLU", + "KC_CAPS", + "KC_NLCK", + "KC_MINS", + "KC_P4", + "KC_P5", + "KC_P6", + "USER01", + "RGB_TOG", + "USER00", + "USER03", + "KC_F13", + "USER02", + "KC_WWW_REFRESH", + "USER04", + "KC_P0", + "KC_P1", + "KC_P2", + "KC_P3", + "C(S(KC_TAB))", + "C(KC_W)", + "C(KC_TAB)", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_PGDN", + "KC_HOME", + "KC_PGUP", + "C(KC_PMNS)", + "C(KC_0)", + "C(KC_PPLS)", + "KC_MS_WH_UP", + "C(KC_T)", + "KC_MS_WH_DOWN" + ], + [ + "KC_RBRC", + "KC_I", + "KC_LBRC", + "TO(0)", + "KC_T", + "KC_M", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_LEFT", + "C(S(KC_B))", + "KC_RGHT", + "KC_LCBR", + "C(KC_I)", + "KC_RCBR", + "KC_B", + "KC_J", + "KC_S", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "C(S(KC_TAB))", + "C(KC_S)", + "C(KC_TAB)", + "C(KC_Z)", + "KC_X", + "C(S(KC_Z))", + "KC_LALT", + "KC_SPC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_DOWN", + "KC_TRNS", + "KC_UP", + "KC_NO", + "KC_NO", + "KC_NO", + "C(KC_LBRC)", + "KC_DEL", + "C(KC_RBRC)", + "A(KC_LBRC)", + "C(KC_F10)", + "A(KC_RBRC)", + "C(KC_MINS)", + "C(KC_0)", + "C(KC_PPLS)" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_UP", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_LEFT", + "KC_DOWN", + "KC_RGHT", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_MS_BTN2", + "KC_PAUS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_NO", + "KC_NO", + "KC_NO", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ] + ] +} \ No newline at end of file diff --git a/keyboards/solartempest/9e/A9e.c b/keyboards/solartempest/9e/A9e.c new file mode 100644 index 000000000000..584df4ba0beb --- /dev/null +++ b/keyboards/solartempest/9e/A9e.c @@ -0,0 +1,19 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#include "A9e.h" diff --git a/keyboards/solartempest/9e/A9e.h b/keyboards/solartempest/9e/A9e.h new file mode 100644 index 000000000000..e70c429d6179 --- /dev/null +++ b/keyboards/solartempest/9e/A9e.h @@ -0,0 +1,33 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include "quantum.h" + + #define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K303, K304, K305, K306, K307, K308, K309, K310, K311 \ + ) \ + { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { KC_NO, KC_NO, KC_NO, K303, K304, K305, K306, K307, K308, K309, K310, K311 } \ + } diff --git a/keyboards/solartempest/9e/config.h b/keyboards/solartempest/9e/config.h new file mode 100644 index 000000000000..f75c47f25a93 --- /dev/null +++ b/keyboards/solartempest/9e/config.h @@ -0,0 +1,90 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#pragma once +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x414B // AK +#define PRODUCT_ID 0x0009 // 9e +#define DEVICE_VER 0x0001 +#define MANUFACTURER Atlantis +#define PRODUCT A9e +#define DESCRIPTION Keyboard + +// key matrix settings +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 +#define MATRIX_ROW_PINS { F0, F1, F2, F3 } +#define MATRIX_COL_PINS { F5, F6, F7, A0, A1, A2, A3, A4, A5, B7, B6, B5 } //F5, F7, B7, B5 are unused on the MCU. Necessary for encoder key matrix. +#define DIODE_DIRECTION COL2ROW +#define DEBOUNCE 6 //Default is 5 + +// NKRO Settings +#ifdef NKRO_ENABLE + #define FORCE_NKRO //Force NKRO if enabled. +#endif + +#define LOCKING_SUPPORT_ENABLE //Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap +#define LOCKING_RESYNC_ENABLE //Locking resynchronize hack + +/* encoder pins */ +#define ENCODERS_PAD_A { C0, C3, C5, C7, D1, D3, D5, D6, A7 } //Encoder pads ordered so on VIA mapping it is cw/ccw and up/down rotation orientation. +#define ENCODERS_PAD_B { C1, C2, C4, C6, D0, D2, D4, D7, A6 } +#define ENCODER_RESOLUTIONS { 4, 4, 4, 4, 4, 4, 4, 2, 2 } //Better control of individual encoders and encoder types. + +//RGB Settings +#define RGB_DI_PIN E6 +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 1 //Default 4 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_LAYERS +#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF +#define RGBLIGHT_SLEEP // 18 keys, 9*3 encoders = 45 keys +#define RGBLED_NUM 42 // 18 keys + 12 encoders + 12 underglow for RGBLIGHT +#define RGBLIGHT_LIMIT_VAL 180 + +//RGB LED Conversion macro from physical array to electric array +//First section is the LED matrix, second section is the electrical wiring order, and the third section is the desired mapping +#define LED_LAYOUT( \ + L01, L03, L05, L07, L08, \ + L10, L11, L12, L13, L14, L15, L16, L17, \ + L20, L21, L22, L23, L24, L25, L26, L27, \ + L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, \ + L41, L46, L47, L49, \ + L58, \ + L67, L68, L69, \ + L77, L79, \ + L88 )\ + { \ + L17,L16,L15,L14,L13,L12,L27,L26,L25,L24,L23,L22,L37,L36,L35,L34,L33,L32,L10,L20,L30,L21,L38,L47,L58,L49,L68,L77,L88,L79,L69,L39,L08,L07,L05,L03,L11,L31,L41,L46,L67, \ + } +//RGB LED logical order map +//Left encoder -> keys -> right encoders -> backlight +#define RGBLIGHT_LED_MAP LED_LAYOUT( \ + 31, 32, 33, 34, 35, \ +3, 30, 4, 5, 6, 7, 8, 9, \ +0, 2, 10, 11, 12, 13, 14, 15, \ +1, 41, 16, 17, 18, 19, 20, 21, 25, 36, \ + 40, 39, 22, 24, \ + 23, \ + 38, 29, 37, \ + 26, 28, \ + 27 ) diff --git a/keyboards/solartempest/9e/info.json b/keyboards/solartempest/9e/info.json new file mode 100644 index 000000000000..82c46121d321 --- /dev/null +++ b/keyboards/solartempest/9e/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "A9e", + "url": "", + "maintainer": "solartempest", + "width": 20.25, + "height": 5.5, + "layouts": { + "LAYOUT": { + "layout": [{"label":"0,0", "x":0.25, "y":0}, {"label":"1,0", "x":2.25, "y":0}, {"label":"1,1", "x":3.25, "y":0, "h":1.5}, {"label":"1,2", "x":4.25, "y":0}, {"label":"0,3", "x":6.25, "y":0}, {"label":"0,4", "x":7.25, "y":0}, {"label":"0,5", "x":8.25, "y":0}, {"label":"0,6", "x":9.25, "y":0}, {"label":"0,7", "x":10.25, "y":0}, {"label":"0,8", "x":11.25, "y":0}, {"label":"0,9", "x":13.25, "y":0}, {"label":"0,10", "x":14.25, "y":0, "h":1.5}, {"label":"0,11", "x":15.25, "y":0}, {"label":"1,9", "x":17.25, "y":0}, {"label":"1,10", "x":18.25, "y":0, "h":1.5}, {"label":"1,11", "x":19.25, "y":0}, {"label":"0,1", "x":0, "y":1, "w":1.5}, {"label":"1,3", "x":6.25, "y":1}, {"label":"1,4", "x":7.25, "y":1}, {"label":"1,5", "x":8.25, "y":1}, {"label":"1,6", "x":9.25, "y":1}, {"label":"1,7", "x":10.25, "y":1}, {"label":"1,8", "x":11.25, "y":1}, {"label":"0,2", "x":0.25, "y":2}, {"label":"2,0", "x":2.25, "y":2}, {"label":"2,1", "x":3.25, "y":2, "h":1.5}, {"label":"2,2", "x":4.25, "y":2}, {"label":"2,3", "x":6.25, "y":2}, {"label":"2,4", "x":7.25, "y":2}, {"label":"2,5", "x":8.25, "y":2}, {"label":"2,6", "x":9.25, "y":2}, {"label":"2,7", "x":10.25, "y":2}, {"label":"2,8", "x":11.25, "y":2}, {"label":"2,9", "x":15.25, "y":2}, {"label":"2,10", "x":16.25, "y":2, "h":1.5}, {"label":"2,11", "x":17.25, "y":2}, {"label":"3,3", "x":6.25, "y":3.5}, {"label":"3,4", "x":7.25, "y":3.5, "h":1.5}, {"label":"3,5", "x":8.25, "y":3.5}, {"label":"3,6", "x":9.25, "y":3.5}, {"label":"3,7", "x":10.25, "y":3.5, "h":1.5}, {"label":"3,8", "x":11.25, "y":3.5}, {"label":"3,9", "x":15.25, "y":4.5}, {"label":"3,10", "x":16.25, "y":4.5, "h":1.5}, {"label":"3,11", "x":17.25, "y":4.5}] + } + } +} diff --git a/keyboards/solartempest/9e/keymaps/default/keymap.c b/keyboards/solartempest/9e/keymaps/default/keymap.c new file mode 100644 index 000000000000..916fa70260df --- /dev/null +++ b/keyboards/solartempest/9e/keymaps/default/keymap.c @@ -0,0 +1,208 @@ +#include "A9e.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + KEYMAP( + KC_L, KC_1, KC_R, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_L, KC_4, KC_R, + KC_L, KC_2, KC_R, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_L, KC_5, KC_R, + KC_L, KC_3, KC_R, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_L, KC_6, KC_R, + KC_UP, KC_8, KC_DOWN, RGB_VAI, KC_9, RGB_VAD, KC_L, KC_7, KC_R), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + + + switch (id) { + + } + return MACRO_NONE; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void encoder_update_user(uint8_t index, bool clockwise) +{ + if (index == 0) { /* First encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 0, 0)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 0, 2)); + } + } else if (index == 1) { /* Second encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 1, 0)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 1, 2)); + }} else if (index == 2) { /* 3 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 2, 0)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 2, 2)); + }} else if (index == 3) { /* 4 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 0, 9)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 0, 11)); + }} else if (index == 4) { /* 5 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 1, 9)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 1, 11)); + }} else if (index == 5) { /* 6 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 2, 9)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 2, 11)); + }} else if (index == 6) { /* 7 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 9)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 11)); + }} else if (index == 7) { /* 8 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 3)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 5)); + }} else if (index == 8) { /* 9 encoder */ + if (clockwise) { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 6)); + } else { + tap_code(dynamic_keymap_get_keycode(biton32(layer_state), 3, 8)); + } + } +} + + + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} \ No newline at end of file diff --git a/keyboards/solartempest/9e/keymaps/via/config.h b/keyboards/solartempest/9e/keymaps/via/config.h new file mode 100644 index 000000000000..8c2aeca25c0e --- /dev/null +++ b/keyboards/solartempest/9e/keymaps/via/config.h @@ -0,0 +1,22 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#pragma once + +// Set 10 layers for VIA +#define DYNAMIC_KEYMAP_LAYER_COUNT 10 diff --git a/keyboards/solartempest/9e/keymaps/via/keymap.c b/keyboards/solartempest/9e/keymaps/via/keymap.c new file mode 100644 index 000000000000..a5ffab6ecef9 --- /dev/null +++ b/keyboards/solartempest/9e/keymaps/via/keymap.c @@ -0,0 +1,461 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#include "A9e.h" + +#ifdef RGBLIGHT_ENABLE + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT + + bool is_encoder1_rotate = false; // For encoder animated LEDs + bool is_encoder6_rotate = false; + bool is_encoder7_rotate = false; + bool encoder_effect = false; + uint16_t encoder_timer = 0; + uint16_t encoder_interval = 500; +#endif + + +bool is_alt_tab_active = false; // Super Alt Tab Code +uint16_t alt_tab_timer = 0; + +bool is_stretch_active = false; // Stretch Timer Code +bool is_stretch_time = false; +uint16_t stretch_timer = 0; +uint16_t stretch_minutes = 0; + + +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + STRT //Stretch Timer + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + STRT //Stretch Timer + }; +#endif + + +//Keymap physical layout as follows: +// E2 Keys Row 1 E4 E5 +// E1 Keys Row 2 E6 +// E3 Keys Row 3 +// E8 E9 E7 +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_LEFT, KC__MUTE, KC_RIGHT, //Rotary Encoder 1 + TO(1), TO(2), TO(3), KC_P7, KC_P8, KC_P9, //Keys Row 1 + RGB_VAD, KC_SPACE, RGB_VAI, //Rotary Encoder 4 + RGB_MODE_REVERSE, RGB_TOG, RGB_MODE_FORWARD, //Rotary Encoder 2 + KC_CAPS, KC_SLCK, KC_NLCK, KC_P4, KC_P5, KC_P6, //Keys Row 2 + RGB_HUD, A(KC_F4), RGB_HUI, //Rotary Encoder 5 + ATABR, KC_MSTP, ATABF, //Rotary Encoder 3 + KC_WREF, STRT, KC_P0, KC_P1, KC_P2, KC_P3, //Keys Row 3 + KC_MS_WH_UP, C(KC_W), KC_MS_WH_DOWN, //Rotary Encoder 6 + C(S(KC_TAB)), KC_HOME, C(KC_TAB), //Rotary Encoder 8 + C(KC_PMNS), KC__MUTE, C(KC_PPLS), //Rotary Encoder 9 + C(S(KC_TAB)), C(KC_T), C(KC_TAB) //Rotary Encoder 7 + ), + [1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [2] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [3] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [6] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [7] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), + [9] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 1 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 1 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 4 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 2 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 2 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 5 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 3 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //Keys Row 3 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 6 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 8 + KC_TRNS, KC_TRNS, KC_TRNS, //Rotary Encoder 9 + KC_TRNS, KC_TRNS, KC_TRNS //Rotary Encoder 7 + ), +}; + + +#ifdef ENCODER_ENABLE + static uint8_t encoder_state[9] = {0}; + static keypos_t encoder_ccw[9] = {{2, 0}, {2, 1}, {2, 2}, {11, 0}, {11, 1}, {11, 2}, {11, 3}, {5, 3}, {8, 3}}; + static keypos_t encoder_cw[9] = {{0, 0}, {0, 1}, {0, 2}, {9, 0}, {9, 1}, {9, 2}, {9, 3}, {3, 3}, {6, 3}}; + + void encoder_action_unregister(void) { + for (int index = 0; index < 9; ++index) { + if (encoder_state[index]) { + if(index==0){ //Add rotating effect + is_encoder1_rotate = true; + encoder_timer = timer_read(); + } + else if (index==5){ + is_encoder6_rotate = true; + encoder_timer = timer_read(); + } + else if(index==6){ + is_encoder7_rotate = true; + encoder_timer = timer_read(); + } + keyevent_t encoder_event = (keyevent_t){.key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index], .pressed = false, .time = (timer_read() | 1)}; + encoder_state[index] = 0; + action_exec(encoder_event); + } + } + } + + void encoder_action_register(uint8_t index, bool clockwise) { + keyevent_t encoder_event = (keyevent_t){.key = clockwise ? encoder_cw[index] : encoder_ccw[index], .pressed = true, .time = (timer_read() | 1)}; + encoder_state[index] = (clockwise ^ 1) | (clockwise << 1); + action_exec(encoder_event); + } + + bool encoder_update_user(uint8_t index, bool clockwise) { + encoder_action_register(index, clockwise); + return false; + }; +#endif + + + +void matrix_scan_user(void) { + if (is_alt_tab_active) { + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } + + #ifdef RGBLIGHT_ENABLE //Stretch timer code + if (is_stretch_active && !is_stretch_time) { + if(timer_elapsed(stretch_timer)>60000) { //1 minute has passed. Timer is uint16 max. + stretch_minutes++; + stretch_timer = timer_read(); + } + if (stretch_minutes > 30) { //Change RGB animation effect after set number of minutes. 30 minutes is a good interval. + rgblight_set_effect_range(0, 42); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE); + is_stretch_time = true; + stretch_minutes = 0; + } + } + #endif + + encoder_action_unregister(); + #ifdef RGBLIGHT_ENABLE //Add rotation animations underneath rotary encoders when turning + if (!encoder_effect && is_encoder1_rotate) { //Turn on the effect for encoder 1 + rgblight_set_effect_range(0, 4); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE); + is_encoder1_rotate = false; + encoder_effect = true; + } else if (!encoder_effect && is_encoder6_rotate) { //Turn on the effect for encoder 6 + rgblight_set_effect_range(22, 4); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE); + is_encoder6_rotate = false; + encoder_effect = true; + } else if (!encoder_effect && is_encoder7_rotate) { //Turn on the effect for encoder 7 + rgblight_set_effect_range(26, 4); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE); + is_encoder7_rotate = false; + encoder_effect = true; + } else if (!is_encoder1_rotate && !is_encoder6_rotate && !is_encoder7_rotate && timer_elapsed(encoder_timer) > encoder_interval) { //Turn off the animated LED effect + if(encoder_effect){ + rgblight_set_effect_range(0, 42); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); + } + is_encoder1_rotate = false; + is_encoder6_rotate = false; + is_encoder7_rotate = false; + encoder_effect = false; + } else { + is_encoder1_rotate = false; //Wait until encoder is turned again + is_encoder6_rotate = false; + is_encoder7_rotate = false; + } + + if(!is_stretch_time){ //Update LED status indicators when stretch animation is not playing. + if(is_stretch_active==1) { + rgblight_sethsv_at(0,230,100,40); //Set LED to orange to indicate timer is on + } + } + #endif +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { //For super alt tab keycodes + case ATABF: //Alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + return true; + case ATABR: //Alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + return true; + + case NMR: //Move window to next monitor on right + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + case NML: //Move window to next monitor on left + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + + case STRT: //Stretch timer + if (record->event.pressed) { + is_stretch_active ^= 1; + stretch_timer = timer_read(); + if(is_stretch_time==1) { //Check if it is time to stretch, then dismiss the animation. + rgblight_set_effect_range(0, 42); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); + rgblight_sethsv_at(0,230,100,40); //Set LED to orange to indicate timer is on + is_stretch_active = 1; + is_stretch_time = 0; + stretch_minutes = 0; + } + else if(is_stretch_active==1) { + rgblight_set_effect_range(0, 42); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); + rgblight_sethsv_at(0,230,100,40); //Set LED to orange to indicate timer is on + is_stretch_time = 0; + stretch_minutes = 0; + } + else { + rgblight_set_effect_range(0, 42); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set back to layer colours + is_stretch_time = 0; + stretch_minutes = 0; + } + } + return false; + } + return true; +} + + +// RGB Layer Light Settings - Note that this will fix the key switches with same LED colour and brightness +//const rgblight_segment_t PROGMEM my_layer0_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 95,255,90}); //Spring green +const rgblight_segment_t PROGMEM my_layer0_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 128,255,100}); //Cyan +const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 30,255,120}); //Yellow-orange +//const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 128,255,100}); //Cyan +const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 95,255,90}); //Spring green +const rgblight_segment_t PROGMEM my_layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 18, 215,255,120}); //Magenta +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS({4, 2, 43,100,160}); //White-left caps lock indication (No dedicated LED) +const rgblight_segment_t PROGMEM my_numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS({8, 2, 43,100,150}); //White-right num lock indication (No dedicated LED) +const rgblight_segment_t PROGMEM my_scrollock_layer[] = RGBLIGHT_LAYER_SEGMENTS({6, 2, 43,100,160}); //White-middle scroll lock indication (No dedicated LED) + +const rgblight_segment_t *const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST( //Lighting layers + my_layer0_layer, + my_layer1_layer, + my_layer2_layer, + my_layer3_layer, + my_capslock_layer, //Highest status indicators override other layers + my_numlock_layer, + my_scrollock_layer +); + + +void keyboard_post_init_user(void) +{ + rgblight_layers = my_rgb_layers;// Enable the LED layers + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9 + layer_move(0); //start on layer 0 to get the lighting activated +} + + +layer_state_t layer_state_set_user(layer_state_t state) +{ + rgblight_set_layer_state(0, layer_state_cmp(state, 0)); // Multiple layers will light up if both kb layers are active + rgblight_set_layer_state(1, layer_state_cmp(state, 1)); + rgblight_set_layer_state(2, layer_state_cmp(state, 2)); + rgblight_set_layer_state(3, layer_state_cmp(state, 3)); + + switch(biton32(state)){ // Change all other LEDs based on layer state as well + case 0: + //rgblight_sethsv_noeeprom(50,255,30); //blue-green gradient + rgblight_sethsv_noeeprom(106,200,30); //blue gradient + break; + case 1: + rgblight_sethsv_noeeprom(30,255,30); + break; + case 2: + //rgblight_sethsv_noeeprom(106,255,30); //blue gradient + rgblight_sethsv_noeeprom(50,255,30); //blue-green gradient + break; + case 3: + rgblight_sethsv_noeeprom(215,255,30); + break; + default: + rgblight_sethsv_noeeprom(64,255,30); + } + return state; +} + + +bool led_update_user(led_t led_state) +{ + rgblight_set_layer_state(4, led_state.caps_lock); //Activate capslock lighting layer + rgblight_set_layer_state(5, !(led_state.num_lock)); //Invert the indication so numlock does not always appear "on". + rgblight_set_layer_state(6, led_state.scroll_lock); //Activate scrollock lighting layer + return true; +} diff --git a/keyboards/solartempest/9e/keymaps/via/rules.mk b/keyboards/solartempest/9e/keymaps/via/rules.mk new file mode 100644 index 000000000000..1e5b99807cb7 --- /dev/null +++ b/keyboards/solartempest/9e/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/solartempest/9e/readme.md b/keyboards/solartempest/9e/readme.md new file mode 100644 index 000000000000..6fd810b711d2 --- /dev/null +++ b/keyboards/solartempest/9e/readme.md @@ -0,0 +1,45 @@ +# Atlantis 9e Macropad + +![Atlantis 9e](https://i.imgur.com/hFuZyXU.jpg) + +A 18-key macro pad with 9 pushbutton rotary encoders and underglow RGB per key RGB and for the case. + +For detailed instructions on using VIA and flashing, please refer to the sections further down the page! + +* Keyboard Maintainer: solartempest +* Hardware Supported: Atlantis 9e +* Hardware Availability: [rioo897](https://shop198276076.world.taobao.com/index.htm?spm=2013.1.w5002-23418336364.2.3f4d7d51DkVX3s) + +# Custom Features: + +- 9 remappable rotary encoder controlling a variety of different things! +- RGB underglow support and remapped to physical locations. +- When turning the 3 large rotary encoders the RGB LEDs underneath animate. +- Adds custom layer lighting with custom gradients for each and static colours for the switches. +- Adds white caps lock, scroll lock, and num lock key indicators on the top row. +- VIA support included by default. +- Allows for remapping of per-layer rotary encoder functions in VIA. +- Custom macro key in VIA for Super Alt Tab, which is fully compatible with rotary encoders. +- Custom macro key in VIA for moving windows to other monitors in Windows, which is fully compatible with rotary encoders. +- Stretch timer (reminder to stop sitting) animates LEDS after 30 minute interval. LED indicator is red and timer is toggled. + + +## Flashing + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb solartempest/9e -km via + +- Please note that QMK toolbox and configurator cannot be used to flash this board. +- You will need to use an ISP Programmer to directly flash the 9e. No board reset is required, as you will flash the MCU directly. +- I used Prog ISP V2.0 but other AVR programmers will also work. +- Use a 12P AWM 20624 ribbon cable with FCP-12P-1.0mm breakout board. Only 10 pins are used. +- Plug in the ribbon cable with the data pins facing away from the PCB. + +## Using with VIA + +- After flashing, in VIA make sure to Import Keymap, which is "9e VIA keymap.json". This will alow VIA to recognize the updated layout and custom functions. VIA will not auto-recognize the keyboard with this firmware because of the necessary customization. +- Go to Save+Load to Load Saved Layout. You can import my own layout "9e VIA layout.json" or just use the Keymap tab to assign your own keys. Having another keyboard connected can be handy for doing this step. +- It is a good idea to Save Current Layout after you decide on your mapping. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/solartempest/9e/rules.mk b/keyboards/solartempest/9e/rules.mk new file mode 100644 index 000000000000..17d308a4490a --- /dev/null +++ b/keyboards/solartempest/9e/rules.mk @@ -0,0 +1,60 @@ +# MCU name +MCU = at90usb646 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# Comment out to disable the options. + +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration (+1000) +CONSOLE_ENABLE = no # Console for debug (+400) +COMMAND_ENABLE = no # Commands for debug and configuration (+878) +TERMINAL_ENABLE = no # Terminal interface feature (+4410) +MOUSEKEY_ENABLE = yes # Mouse keys (+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control (+450) +RGBLIGHT_ENABLE = yes # RGB LEDs +NKRO_ENABLE = yes # NKRO (+328) +KEY_LOCK_ENABLE = no # Key lock functionality +ENCODER_ENABLE = yes # Encoders +LTO_ENABLE = yes # Save space +LEADER_ENABLE = no # Leader keys +COMBO_ENABLE = no # Combo keys +UNICODE_ENABLE = no # Unicode diff --git a/keyboards/solartempest/9e/solartempest_9e_via.hex b/keyboards/solartempest/9e/solartempest_9e_via.hex new file mode 100644 index 000000000000..4279fca60a35 --- /dev/null +++ b/keyboards/solartempest/9e/solartempest_9e_via.hex @@ -0,0 +1,1508 @@ +:100000000C94A3040C94EA040C94EA040C94EA04FF +:100010000C94EA040C94EA040C94EA040C94EA04A8 +:100020000C94EA040C94EA040C9464250C942025A6 +:100030000C9461260C94EA040C94EA040C94EA04EF +:100040000C94EA040C94EA040C94EA040C94EA0478 +:100050000C94EA040C943D260C94EA040C94EA04F3 +:100060000C94EA040C94EA040C94EA040C94EA0458 +:100070000C94EA040C94EA040C94EA040C94EA0448 +:100080000C94EA040C94EA040C94EA040C94EA0438 +:100090000C94EA040C94EA0406022B64A0FF00000E +:1000A000000008022B6496FF0000000004022B648D +:1000B000A0FF000000000412D7FF78FF000000003E +:1000C00004125FFF5AFF0000000004121EFF78FFB9 +:1000D00000000000041280FF64FF00000000050122 +:1000E0000902A10185020901A100050919012908D8 +:1000F00015002501950875018102050109300931B6 +:100100001581257F95027508810609381581257F9F +:10011000950175088106050C0A38021581257F9521 +:100120000175088106C0C005010980A10185031978 +:10013000012AB700150126B700950175108100C08E +:10014000050C0901A101850419012AA00215012647 +:10015000A002950175108100C005010906A1018565 +:1001600006050719E029E7150025019508750181A5 +:10017000020507190029EF1500250195F075018189 +:10018000020508190129059505750191029501756A +:10019000039101C00660FF0961A1010962150026F3 +:1001A000FF009520750881020963150026FF009560 +:1001B0002075089102C005010906A101050719E093 +:1001C00029E715002501950875018102950175083B +:1001D00081010507190029FF150026FF0095067506 +:1001E00008810005081901290595057501910295F9 +:1001F0000175039101C00000000000000000000034 +:1002000000000000000000000000000000000000EE +:10021000000000000000000000007E0F00D4FFFF7F +:10022000FFC70000007800000000000000002A2B3B +:100230002800000000000000000000000000000096 +:100240000029000000002C1E3420212224342627FF +:10025000252E362D3738271E1F2021222324252620 +:100260003333362E37381F0405060708090A0B0CEE +:100270000D0E0F101112131415161718191A1B1C36 +:100280001D2F3130232D350405060708090A0B0CF4 +:100290000D0E0F101112131415161718191A1B1C16 +:1002A0001D2F3130354CD400CA00C000B600AC0060 +:1002B000A2009800000000047F3F1F6432146432E3 +:1002C00014783C1E1E140A05000101010101010100 +:1002D00001010202020202020202020303030303FB +:1002E00003030304040404040404050505050506CA +:1002F0000606060607070707070808080809090988 +:10030000090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E30 +:100310000F0F0F10101111111212131314141515C1 +:1003200016161717181819191A1A1B1B1C1D1D1E33 +:100330001E1F202021222223242425262627282987 +:10034000292A2B2C2D2D2E2F3031323233343536B5 +:100350003738393A3B3C3D3E3F40414243444546B5 +:100360004748494A4C4D4E4F505153545556585991 +:100370005A5B5D5E5F616264656668696B6C6D6F38 +:100380007072737577787A7B7D7E808283858788AB +:100390008A8C8E8F91939596989A9C9EA0A2A3A5E5 +:1003A000A7A9ABADAFB1B3B5B7BABCBEC0C2C4C6E6 +:1003B000C9CBCDCFD1D4D6D8DBDDDFE2E4E7E9EBA2 +:1003C000EEF0F3F5F8FAFDFFFFAA7F5540090807A4 +:1003D0000605040F0E0D0C0B0A1514131211100351 +:1003E000000102191617181D1A1B1C25242322218F +:1003F000201E292827262223252628292A2C2D2F8E +:100400003032333536383A3B3D3E4042434547492A +:100410004A4C4E5051535557595A5C5E606264665F +:1004200068696B6D6F71737577797B7D7F8183856B +:1004300087898A8C8E90929496989A9C9E9FA1A36D +:10044000A5A7A8AAACAEAFB1B3B4B6B8B9BBBCBE91 +:10045000BFC1C2C3C5C6C7C9CACBCCCDCED0D1D20D +:10046000D2D3D4D5D6D7D7D8D9D9DADADBDBDBDC0F +:10047000DCDCDCDCDDDDDDDDDCDCDCDCDCDBDBDBBB +:10048000DADAD9D9D8D7D7D6D5D4D3D2D2D1D0CE1B +:10049000CDCCCBCAC9C7C6C5C3C2C1BFBEBCBBB920 +:1004A000B8B6B4B3B1AFAEACAAA8A7A5A3A19F9E9E +:1004B0009C9A98969492908E8C8A89878583817F66 +:1004C0007D7B79777573716F6D6B69686664626047 +:1004D0005E5C5A5957555351504E4C4A4947454313 +:1004E00042403E3D3B3A3836353332302F2D2C2AB0 +:1004F00029282625232250007F004F00115012503A +:1005000013505F0060006100CA5C2C00C95CC45CD1 +:10051000C25CC35C3900470053005C005D005E00B4 +:10052000C65C3D04C55C815FAD00805FB900845F3F +:10053000620059005A005B00F9001A01FA0000003D +:10054000000000002B034A002B0156017F005701D9 +:100550002B0317012B0101000100010010500100C5 +:100560000100010001000100010001000100010083 +:100570000100010001000100010001000100010073 +:100580000100010001000100010001000100010063 +:100590000100010001000100010001000100000054 +:1005A0000000000001000100010001000100010045 +:1005B00001000100010001000100010010500100D4 +:1005C0000100010001000100010001000100010023 +:1005D0000100010001000100010001000100010013 +:1005E0000100010001000100010001000100010003 +:1005F00001000100010001000100010001000000F4 +:1006000000000000010001000100010001000100E4 +:100610000100010001000100010001001050010073 +:1006200001000100010001000100010001000100C2 +:1006300001000100010001000100010001000100B2 +:1006400001000100010001000100010001000100A2 +:100650000100010001000100010001000100000093 +:100660000000000001000100010001000100010084 +:100670000100010001000100010001000100010072 +:100680000100010001000100010001000100010062 +:100690000100010001000100010001000100010052 +:1006A0000100010001000100010001000100010042 +:1006B0000100010001000100010001000100000033 +:1006C0000000000001000100010001000100010024 +:1006D0000100010001000100010001000100010012 +:1006E0000100010001000100010001000100010002 +:1006F00001000100010001000100010001000100F2 +:1007000001000100010001000100010001000100E1 +:1007100001000100010001000100010001000000D2 +:1007200000000000010001000100010001000100C3 +:1007300001000100010001000100010001000100B1 +:1007400001000100010001000100010001000100A1 +:100750000100010001000100010001000100010091 +:100760000100010001000100010001000100010081 +:100770000100010001000100010001000100000072 +:100780000000000001000100010001000100010063 +:100790000100010001000100010001000100010051 +:1007A0000100010001000100010001000100010041 +:1007B0000100010001000100010001000100010031 +:1007C0000100010001000100010001000100010021 +:1007D0000100010001000100010001000100000012 +:1007E0000000000001000100010001000100010003 +:1007F00001000100010001000100010001000100F1 +:1008000001000100010001000100010001000100E0 +:1008100001000100010001000100010001000100D0 +:1008200001000100010001000100010001000100C0 +:1008300001000100010001000100010001000000B1 +:1008400000000000010001000100010001000100A2 +:100850000100010001000100010001000100010090 +:100860000100010001000100010001000100010080 +:100870000100010001000100010001000100010070 +:100880000100010001000100010001000100010060 +:100890000100010001000100010001000100000051 +:1008A0000000000001000100010001000100010042 +:1008B00001000100010009025B00030100A0FA0928 +:1008C000040000010301010009211101000122407F +:1008D000000705810308000A090401000203000063 +:1008E00000092111010001222200070582032000D6 +:1008F00001070503032000010904020001030000B1 +:100900000009211101000122B6000705840320001F +:100910000A12010002000000084B41090001000119 +:100920000200010803410039006500000012034184 +:100930000074006C0061006E0074006900730000B8 +:1009400000040309040011241FBECFEFD0E1DEBF75 +:10095000CDBF04B603FE27C080919303909194030A +:10096000A0919503B09196038730904BA740B04B70 +:10097000D1F4109293031092940310929503109265 +:10098000960314BE84B7877F84BF0FB6F894A895EA +:1009900080916000886180936000109260000FBEBB +:1009A000E0E0F8E7099523E0A4EEB1E001C01D9274 +:1009B000A339B207E1F711E0A0E0B1E0E8E3FDE51B +:1009C00002C005900D92A43EB107D9F70E94882677 +:1009D0000C94632E0C940000E8EDF0E080818C7F95 +:1009E00080831092E2001092DA001092E100A0EEF3 +:1009F000B0E08C9181608C9380818F77808319BC6B +:100A0000A7EDB0E08C918E7F8C9380818F7E808368 +:100A10001092DC0208952091E4003091E50095E603 +:100A2000A9012091EC00822F817020FF06C08091E7 +:100A3000E80080FF06C080E008952091E80022FDD4 +:100A40001AC080910103882389F0853089F0809154 +:100A5000EB0085FD0FC02091E4003091E5004217C6 +:100A60005307F9F29150E1F684E0089582E0089589 +:100A700083E0089581E00895EF92FF920F931F9312 +:100A8000CF937C018B010E940B05C82F811117C0E9 +:100A90008091E80085FD0BC08091E8008E778093FF +:100AA000E8000E940B05882399F3C82F08C0F701BE +:100AB00081917F018093F1000150110949F78C2F3A +:100AC000CF911F910F91FF90EF90089580910303B4 +:100AD00087FF13C08091E80082FF06C08091E80084 +:100AE0008B778093E80004C0809101038111F2CFDD +:100AF0000895809101038823D9F38091E80080FF55 +:100B0000F8CF8091E8008E77ECCF982F9093E90092 +:100B1000242F762F50E0891731F07091EC0020914E +:100B2000ED005091F00021FD07C09F5F973071F7F5 +:100B30008093E90081E008953091EB003E7F30938F +:100B4000EB003091ED003D7F3093ED003091EB00F4 +:100B500031603093EB007093EC002093ED005093E4 +:100B6000F0002091EE0027FDE0CF80E00895CF92C5 +:100B7000DF92EF92FF920F931F93CF93DF93C8ED15 +:100B8000D0E088818F7E8883E7EDF0E0808181600E +:100B9000808381E08093DC0288818C7F888302EEF1 +:100BA00010E0D8011C921092DA0081EEC82ED12CF0 +:100BB000D6011C9288818F7788838881806888839A +:100BC00088818F7D888380818068808319BC1092A2 +:100BD000010310920203109200031092FF0290EEA4 +:100BE000E92EF12CF70180818B7F808388818160E1 +:100BF000888342E060E080E00E948505D6018C9108 +:100C00008E7F8C93F80180818160808380818860F1 +:100C10008083D7018C918E7F8C93888180618883BB +:100C2000DF91CF911F910F91FF90EF90DF90CF90C8 +:100C30000895FC018091090390910A038617970794 +:100C4000A0F06115710529F49091E8009E779093CA +:100C5000E80090E06115710551F4911108C0809190 +:100C6000E80082FF33C080E00895BC01F2CF80919C +:100C700001038823B9F18530B9F18091E80083FD43 +:100C80002FC08091E80082FDEACF8091E80080FFCC +:100C9000E1CF2091F2003091F3006115710519F058 +:100CA0002830310558F091E02830310509F090E006 +:100CB0002091E8002E772093E800CCCF819180939B +:100CC000F100615071092F5F3F4FE7CF8091010321 +:100CD000882341F0853041F08091E80083FFBFCF49 +:100CE00081E0089582E0089583E008950895809159 +:100CF000DE0208959C014FB7F8948091D302909141 +:100D0000D402A091D502B091D6024FBF821B930BA3 +:100D100008952FB7F8948091D3029091D402A091B6 +:100D2000D502B091D6022FBF08952091D002309104 +:100D3000D1022817390771F09093D1028093D00225 +:100D4000E091CE02F091CF02309721F00084F1853E +:100D5000E02D099408952091CC023091CD022817FE +:100D6000390771F09093CD028093CC02E091CE02CE +:100D7000F091CF02309721F00680F781E02D0994A1 +:100D80000895E091CE02F091CF02309721F00190CA +:100D9000F081E02D099480E00895FA01811101C0ED +:100DA000FB010994089580918B03982F9E7F61F435 +:100DB0008170826080938B0380918E03853B18F055 +:100DC00084EB80938E0308958A34B0F38170886435 +:100DD000F1CFAF92BF92DF92EF92FF920F931F93EA +:100DE000CF93DF93182F062FE901453B08F044EB22 +:100DF000E42FF0E0E853FD4F011110C0E4915E2FA5 +:100E00004E2F4983E8835A83DF91CF911F910F9131 +:100E1000FF90EF90DF90BF90AF900895202F30E0CB +:100E20004491D42EE42EF12C56E0159FC0011124DC +:100E3000EFEFF0E0BF010E94642D812F90E0880F5A +:100E4000991F55E5569FD001579FB00D11248A1B5D +:100E50009B0B982F990F890F5F01A21AB30AAE9CC2 +:100E6000D001AF9CB00DBE9CB00D11245B2F089F2C +:100E700080011124012F11275F01A01AB10AAE9C35 +:100E80008001AF9C100DBE9C100D11245F01A81AAB +:100E9000B108A29EC001A39E900DB29E900D112498 +:100EA000892F9927E81BF90BEE9DC001EF9D900D4E +:100EB000FE9D900D1124E92F62307105A1F050F4D0 +:100EC0006115710509F49DCF6130710581F0EB2F3B +:100ED000512F97CF6430710569F080F0663071054D +:100EE00009F48FCFF4CFE42F4B2F592F8ACFE42F63 +:100EF000412F87CFEB2F542F492F83CF4B2F5D2DC1 +:100F0000E12F7FCF0E9489069C019091B9028091C8 +:100F1000BA02982B21F03093B6022093B50290913B +:100F2000BB028091BC02982B21F03093B402209335 +:100F3000B302E091CE02F091CF02309749F082E007 +:100F40008093B7020480F581E02D87EB92E009944D +:100F500008954091B902803F59F48091BA0287FF09 +:100F60000DC01092BA0241110BC01092B10208C01C +:100F7000813F81F48091BA0218169CF3442381F0DA +:100F80008091BB029091BC02892B09F05AC010924B +:100F9000B0020895823F49F447FFF0CF1092B902A2 +:100FA0008091BA028111ECCFE0CF833F19F414167F +:100FB000ACF3E4CF9091BB02893F29F41916F4F603 +:100FC0001092BB02DBCF8A3F19F497FFD7CFF8CF3F +:100FD0009091BC028B3F29F497FFD0CF1092BC02B6 +:100FE000CDCF8C3F19F41916CCF3C8CF9CE0980FE5 +:100FF000953090F4845F990B21E030E0B90102C094 +:10100000660F771F8A95E2F7CB0180959091B80221 +:1010100089238093B802B2CF8D3F31F48091B20220 +:101020008E7F8093B202AACF8E3F21F48091B202CC +:101030008D7FF7CF8F3F09F0A1CF8091B2028B7FD8 +:10104000F0CF08958091B20280FD16C081FD16C0D8 +:1010500082FD16C08091B0028823A1F0883280F40E +:1010600028E0829FC001112468E270E00E94782D80 +:10107000862F672B39F0089582E0089584E0089563 +:1010800088E0089581E008958091B20280FD14C047 +:1010900081FD14C082FD16C08091B102882381F0C9 +:1010A000843180F422E3829FC001112464E170E066 +:1010B0000E94782D862F08958CE0089589E1089587 +:1010C00085E0089582E30895803F31F40E9444084A +:1010D00081958093BA020895813F19F40E944408D3 +:1010E000F8CF823F31F40E94440881958093B90281 +:1010F0000895833F19F40E944408F8CF893F29F4EA +:101100000E9422088093BB0208958A3F21F40E9426 +:1011100022088195F7CF8B3F31F40E9422088195F8 +:101120008093BC0208958C3F19F40E942208F8CFE6 +:101130009CE0980F953070F4845F990B21E030E0CB +:1011400001C0220F8A95EAF78091B802822B809322 +:10115000B80208958D3F31F48091B202816080938E +:10116000B20208958E3F21F48091B2028260F7CFDF +:101170008F3FB9F78091B2028460F1CF80E008958B +:10118000F894E82FE295EF70F0E031A1282F2F704E +:1011900081E090E001C0880F2A95EAF7982F90959A +:1011A000932391A392A1892B82A37894089590917F +:1011B000D70292FF06C0282F28712830F9F4877FC4 +:1011C000846093FF06C0282F28712831F1F4877EB0 +:1011D00084612091D80220FF06C0382F3871383042 +:1011E000D9F4877F816021FF06C0282F287128311C +:1011F000D1F4877E816194FD877E0895282F247124 +:101200002430F9F68B7F8860DCCF282F24712431BD +:1012100001F78B7E8861DDCF382F3171313019F7BE +:101220008E7F8860E0CF282F2171213121F78E7EBB +:101230008861E1CFCF93DF93EC0182389105A9F16A +:10124000D8F58133910509F496C048F589329105A6 +:1012500009F48AC08A9709F495C0C11521E5D2071F +:1012600008F0BCC0C11530E5D30708F014C1C83E72 +:10127000D10508F09CC0C03ED10560F5C83AD10543 +:1012800008F087C0C53AD10508F0FDC0C130D105CE +:1012900009F12097F9F0C430D105E0F440C085335E +:1012A000910509F45AC0C997C1F68091D70283709D +:1012B00089F0C0EED0E00EC0833E910599F170F444 +:1012C000803E910501F1823E910539F68091D70269 +:1012D00082FD21C0CE01DF91CF910895863E910518 +:1012E00061F1873E910571F1843E910509F0B5CF1A +:1012F0008091D80281FFEECF8091D702C7EED0E077 +:1013000084FD0DC0E7CF8091D70280FD12C190917E +:10131000D80290FFDFCFC3EED0E084FFDBCFD0E078 +:10132000C0E0D8CF8091D70282FD06C19091D8024B +:1013300090FDBFCF84FFCECFF2CF8091D70283FD47 +:10134000DDCFC8CF8091D70283FDF9C09091D8023C +:1013500091FFF0CFC4EED0E0BDCF8091D70285FFE2 +:10136000B9CFC9E2D0E0B6CF8091D70285FFB2CF26 +:10137000C5E3D0E0AFCF8091D70286FFABCFCAE202 +:10138000D0E0A8CF8091D70286FFA4CFC1E3D0E000 +:10139000A1CFCF3BD10518F6C85AD0E0CC0FDD1F46 +:1013A000CD5DDE4F0990D881C02DD46493CFC11597 +:1013B00040E2D40758F4C11581E0D80708F08ACF7D +:1013C000C03FD10508F4ABCFD06584CFC11590E400 +:1013D000D90708F4A4CFDF70D06A7CCFC11525E50A +:1013E000D20700F5C11534E5D30708F08AC0C1154E +:1013F00043E5D40708F071C0C11582E5D80708F4A9 +:1014000067C0CE018370992721E030E002C0220F2F +:10141000331F8A95E2F7C695C69580E2C89FE00122 +:10142000112452C0C11599E5D907A8F4C11528E5C2 +:10143000D20708F06BC0C11536E5D30708F06FCFAF +:101440008C2F0E94D708C82FD0E0DC2FCC27CC27C8 +:10145000DF71D0623FCFC1154AE5D40708F45BC005 +:10146000CE0190568115904208F059CF8D2F8F7183 +:101470000E94D70890E0982F882788279F719C01A9 +:101480002C2BE901E6CFC55AD0E0C05EDE4FC88103 +:10149000D0E0D0641FCFCE01E4E096958795EA9521 +:1014A000E1F783702C2F26952695237040E2249F28 +:1014B00090011124382B8C2F8370C1E0D0E002C042 +:1014C000CC0FDD1F8A95E2F7C22BD32BDC6802CF4D +:1014D000DC2FCC27C16FD06AFDCECE018370992757 +:1014E00021E030E002C0220F331F8A95E2F7C69553 +:1014F000C69590E2C99FE0011124C22BD32BDA6874 +:10150000E9CEDC2FCC27C46FD06AE4CEDC2FCC2709 +:10151000C06FD06ADFCE8C2F8F700E94D70834E066 +:10152000D695C7953A95E1F7CF709C2FEC01D0691D +:10153000D1CEC9E3D0E0CECEC2EED0E0CBCEC6EE67 +:10154000D0E0C8CE80915B02811110925B020895B9 +:10155000809590915A02982390935A020895809111 +:101560005A0290915902892B90915802892B8093AD +:10157000E60190915B029923A1F0892B8093E6010B +:1015800080911F01882341F18091D70287FF24C0F9 +:101590008EE1E8EEF1E090E0815000F591110E94BB +:1015A000A20AE091CE02F091CF023097E1F0809153 +:1015B0001F01882359F08091D70287FF07C08091CF +:1015C000E6018093E70186E08093E6010280F381E3 +:1015D000E02D86EE91E0099486E0DBCF2191222375 +:1015E000D9F29F5FD9CF089590911F019923D1F02F +:1015F0009091D70297FF16C0E82FE695E695E695FD +:10160000EE31E0F4F0E0EA51FE4F282F277081E040 +:1016100090E001C0880F2A95EAF78095928189238E +:1016200082830895E8EEF1E09191891303C0DF0110 +:1016300011971C9291E0EE3EF907B1F70895909151 +:101640001F019923C1F09091D70297FF14C0E82F92 +:10165000E695E695E695EE31F8F4F0E0EA51FE4FB6 +:10166000877021E030E001C0220F8A95EAF782817D +:10167000822B82830895A8EEB1E0EFEF90E02D91E8 +:10168000821751F0EF3F19F4211101C0E92F9F5F3C +:101690009630A9F7EF3F09F408950E2E000CFF0BCA +:1016A000EA51FE4FE6CF80915602909125029813A1 +:1016B00001C008958F5F8770FACF2CE0929F800D54 +:1016C0001124982F977086958695869524E0829FA1 +:1016D000F0011124E95FFD4F50E040E080E02191EE +:1016E00030E0092E02C0369527950A94E2F7217062 +:1016F0003327042E01C0220F0A94EAF7822B4F5F92 +:101700005F4F4430510559F708952CE0929F800DAA +:101710001124982F977041E001C0440F9A95EAF781 +:1017200086958695869594E0899FF0011124E95F5E +:10173000FD4F90E080E070E05191DF0111979B0137 +:10174000082E02C0369527950A94E2F7217021955C +:101750002527242325272C9301968430910561F7B2 +:10176000089590E080E00E94AB0690E080E00E9447 +:10177000950610925902109258020E94AF0A86E014 +:10178000E7EBF2E0DF011D928A95E9F71092B102D2 +:101790001092B0021092B2020C94820790935D02F4 +:1017A00080935C020C94B10B882321F00E94A80A5C +:1017B0000C94AF0A0895882339F090915A02982B1F +:1017C00090935A020C94AF0A0895882309F452C0EA +:1017D000823871F40E94C10681FF4CC089E30E94E7 +:1017E0001F0B0E94AF0A89E30E94F40A0C94AF0A0F +:1017F000833859F40E94C10680FF3CC083E50E94F3 +:101800001F0B0E94AF0A83E5EFCF843859F40E9482 +:10181000C10682FF2FC087E40E941F0B0E94AF0AFF +:1018200087E4E2CF9CEF980F913AF0F290E2980FA4 +:10183000983050F4877091E001C0990F8A95EAF7CB +:10184000892F0E94A80AD2CF9BE5980F933020F4ED +:1018500090E080E00C94AB0698E5980F973120F467 +:1018600090E080E00C949506803F20F00E94A9074C +:101870000C94820708958093D9027093DB026093E1 +:10188000DA02809101038430F9F48093E9008FEF4C +:101890009091E800815095FD06C095ED9A95F1F77D +:1018A00000008111F5CF8091E80085FF0DC050E068 +:1018B00040E063E070E089ED92E00E943C05809199 +:1018C000E8008E778093E8000895BC0184E00C94D2 +:1018D0003B0CBC0183E00C943B0C9C0184E08093A6 +:1018E000E9009FEF8091E800915085FD06C085EDED +:1018F0008A95F1F700009111F5CF8091E80085FFFE +:101900000CC050E040E066E070E0C9010E943C0578 +:101910008091E8008E778093E8000895CF93DF935D +:10192000EC0180911F018823B1F18091D70287FFDC +:1019300032C060E284E08093E9008FEF9091E8008C +:10194000815095FD06C095ED9A95F1F70000811143 +:10195000F5CF8091E80085FF1BC080911F0170E0EA +:1019600050E040E0811104C050E040E068E070E0E9 +:10197000CE010E943C058091E8008E778093E800BC +:1019800080E2FE01AFEDB2E001900D928A95E1F7A1 +:10199000DF91CF91089568E081E0CDCF81E0809321 +:1019A000E00080E28093D8001092C9008FE19EE4AD +:1019B0000197F1F700C0000087E090EBDC01809315 +:1019C000930390939403A0939503B093960388E1B7 +:1019D0009CE00FB6F894A895809360000FBE90939A +:1019E0006000FFCFCF93C82F882309F4AEC08238A0 +:1019F000C1F40E94C10681FDA8C089E30E941F0BAB +:101A00000E94AF0A2FEF81EE94E021508040904079 +:101A1000E1F700C0000089E30E94F40ACF910C9422 +:101A2000AF0A8338A1F40E94C10680FD8EC083E511 +:101A30000E941F0B0E94AF0A2FEF81EE94E021500D +:101A400080409040E1F700C0000083E5E5CF843896 +:101A5000A1F40E94C10682FD78C087E40E941F0B9A +:101A60000E94AF0A2FEF81EE94E021508040904019 +:101A7000E1F700C0000087E4CFCF8CEF8C0F813AF4 +:101A800088F580911F01882301F18091D70287FF9B +:101A90001CC0EC2FE695E695E695F0E0EA51FE4F86 +:101AA000828190E04C2F477021E030E002C0220F8D +:101AB000331F4A95E2F782239323892B79F08C2FE9 +:101AC0000E94F40A0E94AF0A09C0E8EEF1E0819199 +:101AD000C817A9F321E0EE3EF207C9F78C2F0E9448 +:101AE0001F0B9CCF80E28C0F883068F4C77021E018 +:101AF00030E001C0220FCA95EAF780915A02822B8A +:101B000080935A028BCFEBE5EC0FE33040F4F0E02A +:101B1000E05EFE4F808190E0CF910C94AB06E8E54B +:101B2000EC0FE73150F4F0E0EE0FFF1FED5DFE4FDC +:101B300080819181CF910C949506C03F30F08C2F1D +:101B40000E946408CF910C948207CF9108951F934F +:101B5000CF93DF93182FD0E0C0E0893311F4C0E5B4 +:101B6000D0E0812F0E94F20C209731F4812FDF9179 +:101B7000CF911F910C94E50B8FE99FE00197F1F74E +:101B800000C000002197F0CF0F931F93CF93DF93F6 +:101B9000C62FD42F022FFC0182818823A1F06093ED +:101BA00092030E9489069093910380939003C770DB +:101BB00081E001C0880FCA95EAF7DF91CF911F91AC +:101BC0000F910C94DB0B80919203681335C08091C8 +:101BD0009003909191030E947A06883C910560F5EC +:101BE00010E21D0FCD17B9F080E28C0F883040F461 +:101BF000C77081E001C0880FCA95EAF70E94D40B34 +:101C0000183048F481E09D2F977001C0880F9A9595 +:101C1000EAF70E94DB0B802F0E94A70D183098F482 +:101C2000D77081E001C0880FDA95EAF7DF91CF9194 +:101C30001F910F910C94D40BC77081E001C0880FE5 +:101C4000CA95EAF7F3CFDF91CF911F910F910895D5 +:101C5000CF93DF93C7EED3E060E0CE010E94EB2D7F +:101C60002196C11588E0D807B9F7DF91CF91089583 +:101C70006F927F928F929F92AF92BF92CF92DF929C +:101C8000EF92FF920F931F93CF93DF9386EFC82EAF +:101C900084E0D82E9FE9E92EF12CE701C056D10946 +:101CA00036011BC0F50185909490692DC8010E94F2 +:101CB000EB2D682DC80101960E94EB2D82E0A80E45 +:101CC000B11C0E5F1F4FC017D10761F788E1680E86 +:101CD000711C6896CE15DF0529F08E010851110997 +:101CE0005301E0CF7E0180E6E80EF11C80E6C80ECD +:101CF000D11C8FE5E81684E0F80679F6DF91CF91E4 +:101D00001F910F91FF90EF90DF90CF90BF90AF9019 +:101D10009F908F907F906F900895CF93C82F6FEF13 +:101D2000811162E283E290E00E94EB2D6FEFC1111E +:101D300061E084E290E00E94EB2D6FEFC11162E060 +:101D400085E290E0CF910C94EB2D80E00E948D0E07 +:101D500060E086E290E00E94EB2D0E94380E0E9427 +:101D6000280E81E00C948D0ECF93C92F682F84E04C +:101D700090E00E94EB2D6C2F82E290E0CF910C94CA +:101D8000EB2D0F931F93CF93DF93C42FD0E0CC0F95 +:101D9000DD1F28E1629FC00DD11D112430E6839F15 +:101DA000C00DD11D1124CE0187960E94D72D082F7A +:101DB00010E0102F0027CE0188960E94D72D9801A1 +:101DC000282BC901DF91CF911F910F910895462FC4 +:101DD0008A3038F4743028F46C3018F4672F0C947F +:101DE000C10E90E080E00895BF92CF92DF92EF9213 +:101DF000FF920F931F93CF93DF937C0100910B030E +:101E000010910C0380915C0290915D02082B192BBC +:101E1000CFE0D0E0CC24C394D12CBC2EC6010C2E34 +:101E200002C0880F991F0A94E2F780239123892B1F +:101E300071F4219790F7B12C8B2DDF91CF911F91E9 +:101E40000F91FF90EF90DF90CF90BF900895B70172 +:101E50008C2F0E94E70E0E941A09019751F3ECCFD4 +:101E6000CF93DF93EC010E94F40EBE010E94E70EB7 +:101E7000DF91CF910C941A09FC01808191810E941D +:101E8000300F292F2F7092959F7092509E3078F4CA +:101E9000E92FF0E0EB59F14D0C948C2D803F19F0B7 +:101EA00020F4883E20F481E00895843FE1F380E04F +:101EB0000895883EC0F3813FD1F7F5CF822F8695F4 +:101EC00086958695089583E290E00E94D72D823210 +:101ED00089F484E290E00E94D72D813059F485E2A4 +:101EE00090E00E94D72D91E0823009F090E0892F98 +:101EF0008170089580E0FCCFCF9384E090E00E9451 +:101F0000D72DC82F82E290E00E94D72D982F8C2FDA +:101F1000CF91089560918B03669570E04BE050E09F +:101F20008CE091E00E94BD2D892B19F481E0809313 +:101F3000C7020E9489069093C1028093C00208954F +:101F40004F925F926F927F928F929F92AF92BF92C9 +:101F5000CF92DF92EF92FF920F931F93CF93DF9375 +:101F6000CDB7DEB7CE57D1090FB6F894DEBF0FBE9E +:101F7000CDBF50901B0180918B0380FF5DC080908E +:101F8000BE029090BF028114910409F068C0EDEC8C +:101F9000F3E09E012F5F3F4FBE0161587F4FC901A3 +:101FA000A4914A2F50E0DA01AA0FBB1FA40FB51F5E +:101FB000A35FBC4FCD90DD90EC90D901CD92DD9226 +:101FC000ED929D0131966A177B0751F720911A0116 +:101FD00043E0249F800D911D11246E9A2EB12F7B1A +:101FE0003EB130645FB7F894BC01549E600D711D22 +:101FF00011248617970709F08DC05FBF8FE594E025 +:102000000197F1F700C00000C258DF4F0FB6F894F7 +:10201000DEBF0FBECDBFDF91CF911F910F91FF901B +:10202000EF90DF90CF90BF90AF909F908F907F9078 +:102030006F905F904F90089580911C0190911D01C9 +:1020400023E0829FF0011124E35FFC4F891708F021 +:1020500096CF1182108212828F5F3396F7CF8091D4 +:10206000BD02811194CFD12CC12C66246394712CB4 +:1020700053E0452E8091C80293010C2C01C0220F21 +:102080000A94EAF7822309F43CC0F601EE0FFF1F21 +:10209000E80DF91DE590F490E114F10409F477CF0F +:1020A00045E050E0B701CE0101960E94B42D0981B0 +:1020B0000F3F39F18A81800F9927991F8B32910543 +:1020C00014F08AE290E05C01AA0CBB1C8A0D9B1DF7 +:1020D000DC01A35FBC4F5D01049D80011124035FFF +:1020E0001C4F0A151B0520F0B5E0EB0EF11CD8CFF4 +:1020F00098014D816C818B810E94E9060D5F1F4F15 +:10210000F0CFEFEFCE1ADE0AF8E0CF16D10409F0D7 +:10211000B1CF3DCFFC014191CF01E8E03EB90000D5 +:1021200000C047FF2EB9440F000000C000C000C02F +:102130002EB900C0EA9591F75CCFCF93DF9300D022 +:102140000F92CDB7DEB780918B0380FF13C09E0145 +:102150002F5F3F4F44E666EE80E00E94E9068B81E8 +:1021600099812A8120938603909385038093870326 +:102170000E94A00F0F900F900F90DF91CF910895C4 +:102180000F931F93CF93DF93EC0110E000E0909149 +:102190001E019017110609F06CF40E94A00F8C81AB +:1021A00090E00196817099278C83DF91CF911F91E8 +:1021B0000F91089520911C01A801420F511D9A0111 +:1021C000220F331F240F351F235F3C4F4C8160913A +:1021D0008D0380918C0396959017110651F04CF069 +:1021E000442349F040918E030E94E9060F5F1F4F80 +:1021F000CECF4423B9F340E0F7CF8F929F92AF92B6 +:10220000BF92CF92DF92EF92FF920F931F93CF93E3 +:10221000DF93EC014C81042F10E09801D8010E945B +:10222000542E9B01AC010E941F2E4B015C01E0E289 +:10223000F0E0E01BF10BA5E5B0E0AC019B010E94D2 +:102240001F2E6B017C019F01DF010E94992D9B01D4 +:10225000AC010E942A2E9B01AC01280D391D4A1D9C +:102260005B1DC701B6010E94322EF22E822F90E034 +:1022700039E23F1560F143E0249F90011124359528 +:102280002795122F109500E085E5E82EEF18809134 +:102290001E01081758F10E94A00F9C8181E099232C +:1022A00019F0903219F48FEF809319018091190180 +:1022B000890F8C83DF91CF911F910F91FF90EF9049 +:1022C000DF90CF90BF90AF909F908F90089525E5BD +:1022D00030E0B901681B790B9B01220F331F260FD9 +:1022E000371F37FFCCCF2F5F3F4FC9CF8E2D01FD5A +:1022F0008F2D20911C01622F600F7727771F9B0184 +:10230000220F331F260F371F235F3C4F412F609151 +:102310008D030E94E9060F5FBACF0F931F93CF93EF +:10232000DF9380911C0190911D0123E0829FF001B9 +:102330001124E35FFC4F891740F1C0E0D3E06091C6 +:102340001E01C61740F10E94A00F20911701809135 +:10235000CA02820F8093CA0290911801920F909343 +:102360001801191654F4082E000C990B40911E0107 +:102370004150550B841795071CF0219520931701A8 +:10238000DF91CF911F910F910895118210821282D7 +:102390008F5F3396D0CF0C2F10E070E0C8010E9401 +:1023A000782D20911C01820F482F50E02091CA0205 +:1023B000022E000C330B02171307BCF020911801FA +:1023C000022E000C330B201731077CF08D9F9001FB +:1023D0001124235F3C4F40918E0360918D038091C7 +:1023E0008C030E94E906CF5FAACFFA01EE0FFF1F10 +:1023F000E40FF51FE35FFC4F118210821282F3CFCE +:102400001F93CF93DF93FC018281DFEF80FFD1E048 +:10241000C0E01AE290911E01C91788F00E94A00F37 +:102420008091C902D130C9F5811102C080911E018D +:1024300081508093C902DF91CF911F910895E0915F +:102440001C014C2F50E09A012E0F311DF901EE0FA7 +:10245000FF1FE20FF31FE35FFC4F11821082128215 +:102460008091C9028B32ACF0612F0E94562D892FCA +:10247000082E000C990B4817590749F49F01409109 +:102480008E0360918D0380918C030E94E906CF5FDB +:10249000C1CF87FFEDCF890FEBCF90E00196609120 +:1024A0001E0170E00E94782DC4CFEF92FF921F931F +:1024B000CF93DF93EC0110E0EE24EA94F12C6091CD +:1024C0001E01161770F00E94A00F9A818C8190FF58 +:1024D00027C08F5F8C83DF91CF911F91FF90EF908A +:1024E000089520911C01422F410F5527551FCA0105 +:1024F0009A01220F331F280F391F235F3C4F70E0D2 +:10250000C7010E94782D962F8C8140918E03609197 +:102510008D03199F800D11240E94E9061F5FCFCF04 +:102520008150D8CF90918B0390FF14C090911C01E3 +:1025300020911D0133E0939FF0011124E35FFC4FD4 +:10254000921710F00C94A00F8183608342839F5FE9 +:102550003396F6CF08950F931F93CF93DF9300D058 +:102560000F92CDB7DEB78C018091CB0281110AC0EA +:102570009E012F5F3F4F44EB6FEF0E94E9068A8177 +:102580008093CB02F8016481613069F08091CB02C5 +:1025900040E0662361F040E0623011F44091CB02EC +:1025A00080E060E004C06091CB0240E080E00E94E7 +:1025B0009212F801848190E0019663E070E00E943D +:1025C000782D84830F900F900F90DF91CF911F9102 +:1025D0000F910895CF93DF9300D00F92CDB7DEB760 +:1025E00090918B0390FF0AC09E012F5F3F4F0E9486 +:1025F000E9064B8169818A810E9492120F900F90A7 +:102600000F90DF91CF910895CF93DF93EC01EBE82A +:10261000F3E0438162818C810E94EA128C818F5F9A +:102620008C83DF91CF910895CF93DF93EC01EC8100 +:10263000F0E0EA50FC4F4491EBE8F3E062818181E5 +:102640000E94EA128C818F5F8C83DF91CF91089575 +:10265000CF92DF92EF92FF926B017C010E94D30632 +:10266000B701A60188E090E0FF90EF90DF90CF9057 +:102670000C94FD2DAF92BF92CF92DF92EF92FF921A +:102680000F931F93CF93DF9300D00F92CDB7DEB798 +:10269000182FF62E042FE22E90918B0390FF29C065 +:1026A000E92FE695AE2FB0E0A055BE4F8C918093F8 +:1026B000C6029E7F923059F59E012F5F3F4F812FBA +:1026C0000E94E9064B8169818A810E9492121093CF +:1026D0008C03F0928D0300938E03EE2051F06091F5 +:1026E0008B0370918C0380918D0390918E030E94D7 +:1026F00028130F900F900F90DF91CF911F910F91A2 +:10270000FF90EF90DF90CF90BF90AF900895823010 +:1027100019F400918E03DBCF863019F410918C03ED +:10272000D6CF8930D9F3893191F6E9518E2F817056 +:10273000D82EE695F0E0E853FC4FA590B490C12C5C +:10274000BB2460911E01C61618F00E94A00FBFCFD7 +:102750002C2D30E0A29EC001A39E900DB29E900D44 +:10276000112470E00E94642D812FD11013C0860FB8 +:1027700040911C01420F532F511D9A01220F331F0C +:10278000240F351F235F3C4F402F6F2D0E94E90619 +:10279000C394D7CF861BECCFEBE8F3E0438128E06E +:1027A000421B08F440E021E0628181810C943A13DD +:1027B000EBE8F3E0438128E0420F08F44FEF21E01B +:1027C000628181810C943A13EBE8F3E0628128E0A6 +:1027D000621B08F460E021E0438181810C943A138C +:1027E000EBE8F3E0628128E0620F08F46FEF21E08C +:1027F000438181810C943A13EBE8F3E0818121E07D +:102800004381628188500C943A13EBE8F3E08181B4 +:1028100021E043816281885F0C943A1380918F0399 +:10282000882319F0815080938F0360918B037091FE +:102830008C0380918D0390918E030C9428138091CA +:102840008F03833018F48F5F80938F0360918B0325 +:1028500070918C0380918D0390918E030C942813BA +:1028600090918B0390FF36C09170811129C09260C6 +:1028700090938B03662351F060918B0370918C03CE +:1028800080918D0390918E030E94281360918B0399 +:10289000669570E04BE050E08CE091E00E94BD2D29 +:1028A000892BA9F01092C70281E08093C30220E037 +:1028B00040918E0360918D0380918C030C943A13A8 +:1028C000853210F09864D4CF880F982BD1CF0E9416 +:1028D0008A0FEACF089560E00C94301421E030E0D4 +:1028E000A90102C0440F551F8A95E2F7CA01209141 +:1028F000C802662391F0822B8093C8028091C702A0 +:10290000811105C080918B0386950E946B14809184 +:102910008B0380FD05C00C94A00F80958223ECCF23 +:102920000895CF93DF93C82FC17082FBDD27D0F9C4 +:1029300081FB662760F984E00E946E1461E06C27D9 +:1029400085E00E946E146D2F86E0DF91CF910C948C +:102950006E140F931F93CF93DF93EC0161E0009708 +:1029600009F0682F617080E00E946E1460E020978B +:1029700021F0BE0176956795617081E00E946E142A +:1029800060E0209731F0BE01769567957695679562 +:10299000617082E00E946E1460E0209739F0BE0101 +:1029A000B3E076956795BA95E1F7617083E00E9490 +:1029B0006E14AE0170E060E0BB27A72F962F852F25 +:1029C0000097A105B105D9F1AC01BD0188E08A01EC +:1029D0009B01F4E03695279517950795FA95D1F761 +:1029E000011511052105310519F08C5FB901A80108 +:1029F0008A019B01E2E03695279517950795EA95A0 +:102A0000D1F7011511052105310519F08E5FB901C6 +:102A1000A8017695679557954795452B462B472BEB +:102A200009F08F5F8130C9F0882359F08230D1F0EE +:102A30008330E9F020E04EE16FEF80E406C080E0F3 +:102A4000C6CF20E04EE168EC8AE60E943A13CE0140 +:102A5000DF91CF911F910F91089520E04EE16FEF2C +:102A60008EE1F3CF20E04EE16FEF82E3EECF20E086 +:102A70004EE16FEF87EDE9CF0E94A91490930C030C +:102A800080930B030C94B10B80910B0390910C037A +:102A90009C01267033272630310519F488600C9488 +:102AA0003C15877FFCCF21E030E002C0220F331FAE +:102AB0008A95E2F72095309580910B0390910C0355 +:102AC000822393230C943C1590915702809589237F +:102AD00080935702282F277091F4282F082E000C7E +:102AE000330B9217130659F09091D80292FD07C04C +:102AF0008595859585950E945315109257020895E6 +:102B00009091D80292FB222720F9281769F080FBC8 +:102B100092F99093D8028091D7029091D8020E94A6 +:102B2000B40E82E00C946415089521E030E002C0F8 +:102B3000220F331F8A95E2F780910B0390910C03CB +:102B4000822B932B0C943C1580918B03869581509E +:102B500009F484E261E00C94301480918B03869533 +:102B60008F5F853208F081E061E00C943014909121 +:102B70008B0390FF07C09695981720F0961710F4D6 +:102B80000C94AD1561E00C943014EBE8F3E083E0B5 +:102B9000808311828FEF828384EB83831482608130 +:102BA0007181828193810C94281310925A02809132 +:102BB0001F01E8EEF1E0882359F08091D70287FFEA +:102BC00007C08EE1DF011D928A95E9F70C94B10BE5 +:102BD00086E0F8CF1F93CF93DF93CDB7DEB7AA97E8 +:102BE0000FB6F894DEBF0FBECDBF83E093E0209117 +:102BF000F100DC012D93CD01B3E08B309B07B9F7D9 +:102C000080910403833009F472C0B8F4813009F470 +:102C100049C0823009F4B3C08091E80083FF8BC2C1 +:102C200080910303909104039A3008F084C2E92F45 +:102C3000F0E0ED58F14D0C948C2D8A3009F48EC0E3 +:102C40008B3009F471C0893039F7809103038132E8 +:102C500019F78091070390910803009711F00297EC +:102C6000D9F68091E800877F8093E8008091E800A2 +:102C700082FF38C08091F2009091F300029731F406 +:102C80008091F100813011F0863021F48091F100C3 +:102C90008093DE028091E8008B778093E8000E94A9 +:102CA0006605BACF80910303813A09F0B5CF8091D0 +:102CB000E800877F8093E8008091070390910803E4 +:102CC000892B61F460E28FED92E070E00E941906BA +:102CD0008091E8008B778093E8009ECF60E090E0E1 +:102CE00080E0F3CF809101038111C0CF95CF809117 +:102CF0000303813A09F090CF809107039091080374 +:102D0000892B09F089CF8091E800877F8093E800C4 +:102D10008091E80080FFFCCF80911F018093F1003B +:102D20008091E8008E77B9CF80910303813209F05A +:102D300073CF8091070390910803892B09F06CCF22 +:102D40008091E800877F8093E8000E94660580916B +:102D5000050380931F010E94D5155ECF8091030368 +:102D6000813209F059CF8091E800877F8093E80095 +:102D70000E946605809106038093DD024DCF80910D +:102D80000303813A09F048CF8091E800877F809360 +:102D9000E8008091E80080FFFCCF8091DD02BECF8B +:102DA000803899F0823809F0C6C1809107038F708E +:102DB000873008F0C0C18093E9008091EB0085FB6B +:102DC000882780F91092E90006C08091FF02909157 +:102DD0000003911182609091E800977F9093E80042 +:102DE0008093F1001092F1008091E8008E779FC1EE +:102DF000882309F48DC1823009F09DC180910503BB +:102E0000811190C1809107038F702FEF280F26301A +:102E100008F091C18093E9002091EB0020FF82C16E +:102E2000933031F48091EB0080628093EB007AC1A3 +:102E30009091EB0090619093EB0021E030E001C0B5 +:102E4000220F8A95EAF72093EA001092EA00809117 +:102E5000EB008860EACF81116EC1109105031F77E6 +:102E60008091E3008078812B8093E3008091E800DB +:102E7000877F8093E8000E9466058091E80080FFCC +:102E8000FCCF8091E30080688093E30082E0111121 +:102E900083E0809301034FC18058823008F04BC11A +:102EA00020910503309106032C3DE3E03E07A1F598 +:102EB00083E08A838AE289834FB7F894DE01139610 +:102EC00020E03EE051E2E32FF0E050935700E49120 +:102ED00020FF03C0E295EF703F5FEF708E2F90E010 +:102EE000EA30C0F0C7968D939D932F5F243159F738 +:102EF0004FBF8091E800877F8093E8006AE270E02E +:102F0000CE0101960E9419068091E8008B7780938C +:102F1000E80011C1C096E7CF8091070390910803A4 +:102F2000432F55274330510509F44AC078F5413005 +:102F3000510509F47AC08BE590E0E6EBF8E0423009 +:102F4000510509F0F8C02091E800277F2093E800A0 +:102F50002091090330910A038217930708F49C011A +:102F600040E02115310509F065C0411163C0809131 +:102F7000E80082FDC9CF80910103882329F28530C2 +:102F800019F28091E80083FFF2CFBECF41325105A4 +:102F900009F43CC04232510509F0CDC0833091059F +:102FA00008F0C9C0FC01EE0FFF1FE852FE4F019070 +:102FB000F081E02D8B529E4FDC018C9190E01AC085 +:102FC000332721303105D1F02115310561F0223050 +:102FD000310509F0B0C0E3E2F9E0E4918E2F90E012 +:102FE000E3E2F9E007C0E1E4F9E0E4918E2F90E03C +:102FF000E1E4F9E0009709F49EC0A5CFEDE2F9E025 +:10300000E4918E2F90E0EDE2F9E0F4CF833091056A +:1030100008F091C0880F991FFC01E252FE4F019009 +:10302000F081E02D89E090E08ECF82E190E0E1E157 +:10303000F9E089CF80910103882309F465CF8530B9 +:1030400009F462CF8091E80083FD5ECF8091E800B3 +:1030500082FD8DCF8091E80080FF83CF8091F200C8 +:103060009091F3002115310519F08830910550F049 +:1030700041E0089709F040E08091E8008E77809366 +:10308000E8006FCF44914093F1003196215031090F +:103090000196E8CF803809F04EC08091E800877F24 +:1030A0008093E800809102038093F1009DCE81110E +:1030B00042C0109105031230F0F58091E800877F3F +:1030C0008093E800109302030E946605112311F01B +:1030D00084E005C08091E30087FDFACF81E0809312 +:1030E000010342E061EC81E00E94850542E261EC6F +:1030F00084E00E94850542E261EC82E00E94850541 +:1031000042E260EC83E00E9485058091010313C0D8 +:1031100080910503813079F481E0933009F080E0FB +:10312000809300031092E9008091E800877F8093EC +:10313000E8000E9466058091E80083FF0AC0809144 +:10314000E800877F8093E8008091EB0080628093A5 +:10315000EB00AA960FB6F894DEBF0FBECDBFDF918D +:10316000CF911F91089569EE7EEF90E080E00E947C +:10317000092E60E082E090E00E94EB2D60E083E0A9 +:1031800090E00E94EB2D10925D0210925C0260E0D4 +:1031900084E090E00E94EB2D60E082E290E00E94EB +:1031A000EB2D60E085E090E00E94EB2D60E086E092 +:1031B00090E00E94EB2D6FEF87E090E00E94EB2DF6 +:1031C00040E050E0BA0188E090E00E94FD2D60E010 +:1031D0008DE090E00E94EB2D40E050E0BA0188E1E4 +:1031E00090E00E94FD2D60E087E190E00E94EB2DD1 +:1031F00040E050E0BA018CE190E00E94FD2D70E0CB +:1032000060E080E290E00E94092E40E050E0BA01C8 +:1032100088E190E00E94FD2D80E00E948D0E0E94CA +:10322000A50E40E050E0BA018FE090E00E94FD2D35 +:1032300040E050E0BA0183E190E00C94FD2D3F9214 +:103240004F925F926F927F928F929F92AF92BF92B6 +:10325000CF92DF92EF92FF920F931F93CF93DF9362 +:1032600000D000D00F92CDB7DEB78C01FC01838176 +:103270009481892B31F08081918189238F3F09F0DE +:1032800073C60F900F900F900F900F90DF91CF911A +:103290001F910F91FF90EF90DF90CF90BF90AF9074 +:1032A0009F908F907F906F905F904F903F90089588 +:1032B0000E94F40EF82E682F89819A810E94850B56 +:1032C00069817A818F2D0E94E70E7C01F80182814D +:1032D000882309F43BC6970122513F45203131052F +:1032E00008F0F3C58FEF97E00E94D72DFEEEEF0EAA +:1032F00057EE852E53E0952E8823A1F18091570239 +:10330000877009F4BECFF8018281882309F4B9CF10 +:103310008091D80282FDB5CF82E00F900F900F9080 +:103320000F900F90DF91CF911F910F91FF90EF9031 +:10333000DF90CF90BF90AF909F908F907F906F90D5 +:103340005F904F903F900C946415811428E0920692 +:10335000A9F2C4010E94D72D811101C0EA943FEF68 +:10336000831A930AE110F1CF1C821B8244244394F8 +:103370004AE0342E74014FEFE41AF40AC4010E94AB +:10338000D72D89831A82882309F4B8CF9FEF980F2D +:10339000933000F58A83498252E0850E911CC70163 +:1033A0000E94D72D8B83882309F4A8CFCE010196E4 +:1033B0007C01F70120812223E9F2213009F049C084 +:1033C00091818281913041F4F2E0EF0EF11C0E9474 +:1033D000A70D09C04701EACF923049F422E0E20E7E +:1033E000F11C0E94F20C3FEFE31AF30AE2CF933094 +:1033F00031F432E0E30EF11C0E94E50BF4CF94307F +:1034000021F04FEFE41AF40AEECF52E0E50EF11C82 +:1034100030E020E0B7016F5F7F4FF70141818053BB +:10342000990B8A30910550F021503109E0F28FE973 +:103430009FE00197F1F700C00000F6CF329EF00147 +:10344000339EF00D11249C012E0F3F1F842F7B0112 +:10345000E1CFE22FF0E0EA5DFD4F5490822F869598 +:103460008695869590E0FC01EA5EFD4F649027709A +:10347000712C022E02C0759467940A94E2F7E1E081 +:103480006E227724FC01EA5FFD4FA490B12C022E3E +:1034900002C0B594A7940A94E2F7F1E0AF22BB24EE +:1034A000FC01EA50FE4FC490D12C02C0D594C794C1 +:1034B0002A95E2F721E0C222DD246114710419F09B +:1034C00081EE0E94F20CA114B10419F086EE0E9464 +:1034D000F20C852D0E94A70DAB2819F086EE0E94F4 +:1034E000E50B672819F081EE0E94E50BCD2809F461 +:1034F0007ACF8CE26CCF81E00E9495150E94441532 +:10350000FDCE81E00E945315F9CF82E0F5CFF3E8BC +:10351000EF16FFE5FF0609F4C5C024E8E2162FE523 +:10352000F20609F0F2C4882309F4E8CEF0906C02A8 +:10353000EE24E394FE24F0926C020E94890690939C +:103540006A028093690280916B0210921C018823A9 +:1035500009F4B6C08AE280931D0180931E0181E2C6 +:103560000E946B140E949D10E0926C0210926B02FC +:103570001092680210926702C1CE882309F47AC0C3 +:1035800080916F02811106C081E080936F0282EE0C +:103590000E94F20C0E94890690936E0280936D0245 +:1035A0008BE20E94F20CF8018281882309F4EDC4B9 +:1035B00010929203F3E0EF16FDE5FF0608F0B3C0AA +:1035C0002AEFE2162CE5F20630F4C70182509C4542 +:1035D000449708F0AEC00E947C0F9093D80280936D +:1035E000D70240E1E4164CE5F40609F48AC108F07C +:1035F000F8C088E0E8168CE5F80609F470C108F018 +:10360000C4C0E4E0EE16ECE5FE0609F45AC108F089 +:10361000A6C022E0E2162CE5F20609F44CC1809126 +:10362000D702826033E0E3163CE5F30609F446C1B5 +:103630008091D7029091D8020E94B40E0E94D515B5 +:103640005DCE8823A1F080916F02811106C081E0D8 +:1036500080936F0282EE0E94F20C0E948906909382 +:103660006E0280936D0281EE0E94F20C99CF81EE82 +:103670000E94E50B8BE20E94E50B95CF882309F4AD +:1036800092CF81EE0E94F20C83EE0E94F20C8FE446 +:103690000E94F20C8FE40E94E50B83EE0E94E50B82 +:1036A00081EEE9CF882309F47ECF81EE0E94F20CEF +:1036B00083EE0E94F20C80E50E94F20C80E5EBCFD5 +:1036C0008AE280931D0180931E0181E2FF2029F090 +:1036D0000E946B140E949D1049CF0E946B1446CF2C +:1036E000E5EFEE16ECE5FE06B9F090F026EFE216F7 +:1036F0002CE5F20609F057CF27E245EE66EE22C42C +:1037000027E245EE65EE1EC426E241EE60EE1AC4E5 +:1037100027E245EE64EE16C426E241EE62EE12C4E4 +:1037200028E241E0EFCF31E6E3163DE5F30609F488 +:1037300052CF80915A0246E1E4164CE5F40609F0B6 +:1037400031C48A7A91E009F490E0909306028111E5 +:10375000FDC089E20E941F0B0E94AF0ACFCD80916D +:10376000D702806146E0E4164CE5F40609F4A6C0F1 +:103770008091D702886057E0E5165CE5F50608F40D +:103780009DC08091D702806299C08CE0E8168CE5DC +:10379000F80609F4AEC078F48091D7028C60EAE0B4 +:1037A000EE16ECE5FE0609F489C008F49CC0809191 +:1037B000D7028E7F83C08091D702877F2EE0E216EA +:1037C0002CE5F20609F47AC08091D7028B7F3FE0A6 +:1037D000E3163CE5F30608F471C08091D7028F7EB2 +:1037E0006DC04CEFE4164CE5F40609F486C0A0F574 +:1037F00084E1E8168CE5F80609F497C098F4E2E154 +:10380000EE16ECE5FE0609F480C08091D7028F7BAE +:10381000F3E1EF16FCE5FF0608F450C08091D702F3 +:10382000837F4CC02AEFE2162CE5F20609F44DC066 +:1038300008F051C045E1E4164CE5F40609F0F8CE75 +:103840008091D70282FB992790F921E0922790FB83 +:1038500082F990FB83F932C0E1145DE5F50609F4C5 +:103860005AC0A0F48091D80283609EEFE9169CE5CF +:10387000F90671F18091D8028D7FEFEFEE16ECE53D +:10388000FE0630F18091D8028C7F22C0F2E0EF1664 +:10389000FDE5FF0609F458C008F450C031E6E31610 +:1038A0003DE5F30609F0C4CE9091D702892F8F7EB3 +:1038B00094FF806103C08091D70281608093D7021A +:1038C000B7CE8091D7028460F9CF8091D802816011 +:1038D0008093D802ADCE8091D8028260F9CF8091DA +:1038E000D7028064EBCF0E94D5158091D702806803 +:1038F000E5CF8091D7028D7FE1CF8091D8028E7F76 +:10390000E7CF8091D7028F7DD9CF0E94D5158091C6 +:10391000D7028F77D3CF8091D802982F909591704E +:103920008E7F892B90FB81F9D3CF0E94D515909182 +:10393000D702892F97FB87F98058C0CF61E08EE0CE +:1039400090E00E94EB2D74CE60E0F9CF85E302CFCA +:1039500085E325C380918B0380FF1BC08E7F8093FE +:103960008B0360918B0370918C0380918D039091F8 +:103970008E030E9428131092C7025FEF80E792E047 +:10398000515080409040E1F700C000000E94A00F1D +:10399000B5CC816080938B0361E086950E943014E2 +:1039A000ADCC44EA55E16DEA75E10E94CD06A6CCA6 +:1039B0004DEA55E164EA75E1F8CF45E054E16CEF7A +:1039C00073E1F3CF44EE53E160EF73E1EECF4CECE3 +:1039D00053E168ED73E1E9CF48ED53E16CEC73E13D +:1039E000E4CF4FE154E16EE074E1DFCF61E081E0CC +:1039F000D5CF65E082E00E94B71580CC68E086E014 +:103A0000FACF64E18FE0F7CF67E185E1F4CF62E2BE +:103A100089E1F1CF61E083E2C1CF4BE5E4164DE5EA +:103A2000F40611F15CE5E5165DE5F50609F0ECC27A +:103A30008091D80282FB882780F991E089270E9433 +:103A40008015E2C20E94D5158FEF94E3ECE081501F +:103A50009040E040E1F700C000000E94CE0C0E94C0 +:103A6000B3184CCC81E0EBCF80E0E9CFC7010E94D6 +:103A70005D0BD82ED8C22F2D2F70C22E8F2D807F98 +:103A800019F0C29490EFC922DD20B9F0CC2069F082 +:103A900080E28E0D883010F0811009C080915A02AA +:103AA000C82AC0925A020E94AF0A8E2D4DC0809142 +:103AB0005902C82AC0925902F6CF8E2D0E94E50BFA +:103AC000CC2009F443C080E28E0D883010F08110C4 +:103AD00004C08C2D0E94A80A06C0C094809159028F +:103AE000C822C09259020E94AF0A30C03F2D3F70D9 +:103AF000C32E8F2D807F803219F0C29480EFC822B0 +:103B0000882089F041E0841609F480C0DD2009F4A2 +:103B10008AC0BB2009F480C0F801858180FFC5CF31 +:103B20008F70858379C02091D80222FF4CC0DD20A0 +:103B300009F443C0CC2039F080915A02C82AC092BF +:103B40005A020E94AF0A80E00E94F20CE92DE85070 +:103B5000FF0B349720F40E94C1060E949114AA2002 +:103B600009F48FCB8091570280FD8BCBF801128234 +:103B70008595859585950E949515C8010E941F1908 +:103B8000809157028595859585950F900F900F90A0 +:103B90000F900F90DF91CF911F910F91FF90EF90B9 +:103BA000DF90CF90BF90AF909F908F907F906F905D +:103BB0005F904F903F900C94531580E00E94E50B6E +:103BC000CC2021F286CFDD20A1F090915B028C2DDC +:103BD000892BB11003C00E94DB0BB8CF51E0B512A6 +:103BE000FACF22FDB3CF891709F4B0CF80935B02DF +:103BF000ADCFB11006C00E94A20A8C2D0E94D40B3A +:103C0000A5CF81E0B81609F4A1CFF5CFDD2031F0C2 +:103C100095E09B1508F49ACF8C2DDDCFE4E0EB15F1 +:103C200008F494CFEACFBB2041F3F9E38F1209C027 +:103C30002FEF37EE43E0215030404040E1F700C025 +:103C400000008E2D0E94E50B81CF8F2D86958695E5 +:103C5000837061F0813009F079CFC7019370D11082 +:103C600002C090E080E00E94950670CFC70193707B +:103C7000D11002C090E080E00E94AB0667CF8E2D8D +:103C8000DD2029F00E9464080E9482075FCF0E9415 +:103C9000A907FACF8F2D837009F040C0D11056CFFD +:103CA0004E2D429546954770440F440F8E2D8F70D0 +:103CB00090E0042E02C0880F991F0A94E2F730E0CA +:103CC00020E0E4FE09C02FE030E002C0220F331FE5 +:103CD0004A95E2F7209530954F2D469546954370CD +:103CE000423099F078F460915C0270915D0241304D +:103CF00039F0822B932B862397230E94CE0B26CF5D +:103D0000862B972B822B932BF8CF822B932B2091F2 +:103D10005C0230915D0282279327EFCF8695DD20EC +:103D200011F08F2D8170882309F410CF4E2D42950C +:103D300046954770440F440F8E2D8F7090E0042EEF +:103D400002C0880F991F0A94E2F730E020E0E4FEF9 +:103D500009C02FE030E002C0220F331F4A95E2F77E +:103D6000209530954F2D469546954370423099F0F9 +:103D700078F460910B0370910C03413039F0822B81 +:103D8000932B862397230E943C15E0CE862B972BFE +:103D9000822B932BF8CF822B932B20910B03309106 +:103DA0000C0382279327EFCF5F2D5F70F52EDD2068 +:103DB00029F0852F0E9495158E2D0DCF8E2D0E94F6 +:103DC000D40B8F2D0E945315C1CE8E2D92EF8916E4 +:103DD000A1F1981570F0E0EF8E16D1F0F1EF8F168B +:103DE00091F0DD2009F461C0B1105FCE8F2D8F718D +:103DF00028C023EF821641F134EF8312F2CF809175 +:103E0000D80282FF32C08F2D8F71DD20D9F219C008 +:103E1000DD2071F044E04B1508F498CE2F2D2F7162 +:103E200081E090E002C0880F991F2A95E2F7B5CF94 +:103E300055E05B1508F48ACEF1CF8F2D8F71D1102C +:103E4000C1CF0E94951582CE90E080E0DD2009F47C +:103E50009ACF9F2D9F7121E030E0F90102C0EE0F53 +:103E6000FF1F9A95E2F7CF018ECFDD2099F0FF2D4D +:103E7000FF71FF2E8F2F0E9495158091D80282FD31 +:103E800007C028E0F29EC00111248360809357028E +:103E90008F2DD7CF81E00E94641531E03B1508F0EB +:103EA00055CE82E00E94641551CEBB2059F0893373 +:103EB00009F0C7CE4FEF57EE83E0415050408040AD +:103EC000E1F7BDCE8F2D8F717DCFF0E1EF16FFE5CD +:103ED000FF0609F410CB21E1E2162FE5F20609F402 +:103EE00014CB42E8E4164FE5F40609F4C7CB08F01A +:103EF0000ECB90E8E9169FE5F90609F43ECBE1E820 +:103F0000EE16EFE5FE0609F49CCB33EFE3163CE535 +:103F1000F30609F4F9CB08F0E3CB58EDE5165CE5C0 +:103F2000F50609F4EDCB89EDE8168CE5F80609F401 +:103F3000F7CB97EDE9169CE5F90609F034CB26E2BC +:103F400041EE61EEC8010E94C40DD8C930E1E3160C +:103F50003FE5F30609F4D5CA41E1E4164FE5F4065E +:103F600009F0BFCF82E0CECA85E0DE011196019054 +:103F70000D928A95E1F7F801228189819A812111B8 +:103F800097C90E945D0BF82E9BC9F6E1EF16FCE580 +:103F9000FF06D1F5809106028111DACC89E20E94F8 +:103FA000F40ADACB82722CECE2162CE5F20609F464 +:103FB00018CD08F0ABC046ECE4164CE5F40609F465 +:103FC000FCCC08F07AC093ECE9169CE5F90609F4FC +:103FD000E8CC08F061C0F2ECEF16FCE5FF0609F44E +:103FE000B9CCEAE5EE16EDE5FE0609F43BCD08F0A6 +:103FF00014CDE1142CE5F20609F424CD3EEDE316D0 +:104000003CE5F30609F42BCDF8018281E080F180D4 +:10401000882309F42BCDC7010E94F40ED82E682FF7 +:10402000C7010E94850BB7018D2D0E94E70E0E94EB +:104030001A097C01882EF801D280B580B2943FE045 +:10404000B322809157028770C1F0AD2CDD20B1F012 +:104050008F2D807F803421F080E28E0D883068F0D3 +:104060008091D80282FD09C082E00E94641580918F +:1040700057028770AA24A3948111A12C9F2C92949B +:104080002FE09222FBE0F91508F460CDE92DF0E075 +:10409000E358F14D0C948C2D24ECE2162CE5F2063D +:1040A00009F486CC4CEF53E165E074E135ECE3169E +:1040B0003CE5F30609F479CC94CF49ECE4164CE5E1 +:1040C000F40609F484CC88F497ECE9169CE5F9062B +:1040D00009F478CC40EF53E164EE73E1E8ECEE16BE +:1040E000ECE5FE0609F461CC7CCFFAECEF16FCE5BA +:1040F000FF0609F471CC4EE054E16FE174E12BEC62 +:10410000E2162CE5F20609F450CC6BCF31EDE31644 +:104110003CE5F30609F475CCB8F45EECE5165CE515 +:10412000F50609F466CC08F461CC9FECE9169CE531 +:10413000F90609F463CC6EE089E0E0EDEE16ECE5FB +:10414000FE0609F458CC4DCFF4EDEF16FCE5FF0662 +:1041500009F45DCC78F432EDE3163CE5F30609F49E +:1041600053CC61E088E143EDE4164CE5F40609F434 +:1041700015CC37CF55EDE5165CE5F50609F44ACCCC +:104180008DE5E816F80609F4B9C82BCF1F93CF9335 +:10419000DF9380912402807FA9F4809121028823FB +:1041A00089F080915602D091250260911F02709192 +:1041B0002002A0912202B0912302C62FC72316E04D +:1041C000D81304C0DF91CF911F91089590E010970C +:1041D00011F0CF3F19F401968770F2CF189F90012C +:1041E000199F300D1124F901EA5DFD4F41814713FC +:1041F000F2CF40814613EFCF42814111ECCF438192 +:1042000054814A1B5B0B483C510528F780912402DE +:104210008F70806180932402F901E55DFD4F8081FC +:104220008F70806180838FE192E00E941F19DF917F +:10423000CF911F910C94530BAF92BF92CF92DF920C +:10424000EF92FF920F931F93CF93DF93CDB7DEB71B +:1042500061970FB6F894DEBF0FBECDBF8C0185E02D +:10426000F801DE011D9601900D928A95E1F7F801A3 +:10427000E2808FE1A82E82E0B82E60912202709138 +:1042800023026115710509F432C190911F0240911A +:104290002002892F84238F3F09F429C12081318195 +:1042A000C380D480F0902102F601E61BF70BFF20BB +:1042B00009F4E8C080912402582F507FE83CF105B2 +:1042C00008F0ABC0511177C0FE2C431321C09213EC +:1042D0001FC0E1101DC08F70806180932402C50152 +:1042E0000E941F1980912402F80185838F2D619609 +:1042F0000FB6F894DEBF0FBECDBFDF91CF911F91F7 +:104300000F91FF90EF90DF90CF90BF90AF90089506 +:10431000CD2829F0822F83238F3F09F003C180E04D +:10432000F82FF170DF2E80FF3CC080915602409143 +:10433000250256E0841315C02D873E878D859E8506 +:104340000E94300F292F22952F702230F0F0243058 +:1043500018F59F70F1F0F8019581907FD1F4D12C80 +:104360001EC090E0589FF001599FF00D1124EA5DA6 +:10437000FD4F6181361306C06081261303C0628140 +:10438000E6120FC001968770D5CF9F7011F0882379 +:1043900031F3805E883018F3C8010E941F19FD2C8C +:1043A000A5CFEE2009F4A2CF8091240281608093F2 +:1043B0002402F12C9BCF431306C0921304C0F801D2 +:1043C000EE2009F479C0C8010E943C0F882309F14E +:1043D000EE20F9F080912402803270F020911F02CB +:1043E0003091200238872F831986DB86CA868C8716 +:1043F000CE0107960E941F1986E0F801AFE1B2E0F6 +:1044000001900D928A95E1F70E94C620FF24F39453 +:104410006DCFC8010E941F19F9CF51110AC08FE159 +:1044200092E00E941F1986E0F50111928A95E9F742 +:10443000C0CF43130FC092130DC0E1100BC0F801A1 +:104440008583C8010E941F1986E0F50111928A95A3 +:10445000E9F74CCFC8010E943C0F8823D1F2EE202F +:10446000C1F280912402803238F220911F023091F3 +:1044700020023A8329831B82DD82CC828E83CE0187 +:104480000196B8CFE83CF105F8F6FE2CEE2009F2D3 +:1044900043131FC092131DC08091240280FD10C0E1 +:1044A000982F907F69F0F8018583903F31F0982F25 +:1044B000907F905F8F70892B8583C8010E941F19A0 +:1044C00086E0F801AFE1B2E001900D928A95E1F744 +:1044D0000DCFC8010E943C0F81118ECF8091240224 +:1044E000816080932402C8010E941F19FFCEEE2034 +:1044F00009F48FCFC8010E943C0FF82E882309F4DD +:1045000088CF86E0F801AFE1B2E001900D928A9584 +:10451000E1F780911F02909120020E94300F0E94CB +:10452000C620E4CE81E08E25FBCE1F93CF93DF9390 +:10453000CDB7DEB767970FB6F894DEBF0FBECDBF1D +:104540004B8B5C8B6D8B7E8B8F8B61111092590224 +:104550001A8A198A85E0FE017396DE011D96019084 +:104560000D928A95E1F786E0FE013D96DE011796F1 +:1045700001900D928A95E1F7CE0107960E941C21C9 +:10458000882389F016E080915602909125028913C4 +:1045900049C067960FB6F894DEBF0FBECDBFDF915E +:1045A000CF911F91089586E0FE013796DE011196A6 +:1045B00001900D928A95E1F78A859B85892B11F3ED +:1045C0008F81988589238F3FE9F22091250230E081 +:1045D000C90101968770992740915602481719061C +:1045E00071F40E94D515109225021092560286E0B1 +:1045F000EFE1F2E0DF011D928A95E9F7C3CF96E083 +:10460000929FD001939FB00D1124AA5DBD4FFE0172 +:10461000319601900D929A95E1F7809325020E94C0 +:10462000530BB0CF819FC00111248A5D9D4F0E9422 +:104630001C21882309F4ADCF8091560290E00196A9 +:1046400087709927809356029ECF6F927F928F92A8 +:104650009F92AF92BF92CF92DF92EF92FF920F9311 +:104660001F93CF93DF93CDB7DEB72D970FB6F89496 +:10467000DEBF0FBECDBF8E010F5F1F4F88E0F80178 +:1046800011928A95E9F751E5E52E51E0F52E680182 +:1046900065E5662E61E0762E88248394912CF701DF +:1046A00081917F018F3F09F446C0F894E82FE2958D +:1046B000EF70F0E021A18F70A40102C0440F551FDC +:1046C0008A95E2F7CA01922F982B91A392A1809527 +:1046D000892382A3789400C0E5E5F1E021E030E091 +:1046E000B12CA12C41914F3F09F477C0A42FA29582 +:1046F000AF70B0E090968C9190E04F7002C09595AD +:1047000087954A95E2F780FD68C0C901A82AB92AB1 +:10471000220F331F51E0E136F50721F7F7013197FA +:1047200080818F3F11F00E94C00880EA8A95F1F7DE +:10473000F601B182A082F2E0CF0ED11C6E147F048C +:1047400009F0ADCF48E050E0B80180E792E00E9468 +:10475000CA2DBB24B394009709F4B12C892B09F41A +:104760003FC088E0F801A0E7B2E001900D928A9581 +:10477000E1F781E0809360020E94890690935F02D6 +:1047800080935E0280915E0290915F020E947A06A1 +:10479000069750F180917002909171029093A90256 +:1047A0008093A80280917202909173029093AB0261 +:1047B0008093AA0280917402909175029093AD0249 +:1047C0008093AC0280917602909177029093AF0231 +:1047D0008093AE021092600207C090E080E096CF16 +:1047E000809160028111CECF80916F02882371F099 +:1047F00080916D0290916E020E947A06893E9340EC +:1048000028F082EE0E94E50B10926F0280916C02FC +:10481000882399F180916B0281112FC080916902E8 +:1048200090916A020E947A0681369A4E78F08091C1 +:1048300067029091680201969093680280936702E4 +:104840000E94890690936A028093690280916702B0 +:10485000909168024F9788F010921C018AE2809331 +:104860001D0180931E018FE00E946B1481E08093F4 +:104870006B0210926802109267023AE7E32E32E070 +:10488000F32E10E000E0CC24C394F701D1907F0117 +:10489000DD2051F10115110509F062C0C0926502D9 +:1048A0000E9489069093620280936102D694C801A7 +:1048B000880F991FDD2009F460C08D589E4FFC01C0 +:1048C000808191819A8789871B860E9489068160F1 +:1048D000782F9D878C87F7013197108249855A85FB +:1048E0006B858D850E9495220F5F1F4F0930110542 +:1048F00061F61091660280916502111167C08823EC +:1049000009F43EC010921C0184E080931D01809345 +:104910001E018FE00E946B141092650281E080936B +:10492000660280916B02811105C080916C02811139 +:104930000E949D108B2D2D960FB6F894DEBF0FBEF2 +:10494000CDBFDF91CF911F910F91FF90EF90DF903E +:10495000CF90BF90AF909F908F907F906F90089571 +:104960000530110519F4C09264029ACF0630110582 +:1049700009F09CCFC092630293CF8F599E4F9FCF77 +:1049800080916402882379F086E180931C018AE19A +:1049900080931D0184E080931E018FE00E946B14C0 +:1049A00010926402BBCF809163028823A9F08AE150 +:1049B00080931C018EE180931D0184E080931E0191 +:1049C0008FE00E946B1410926302A8CF811126C061 +:1049D00080916402811122C08091630281111EC006 +:1049E00080916102909162020E947A06853F914017 +:1049F000A8F0112351F010921C018AE280931D014E +:104A000080931E0181E20E946B1410926502109245 +:104A10006402109263021092660283CF10926502C4 +:104A200010926402109263027CCF90E080E00E94BA +:104A3000E52D893E9E4F11F40C94630F80E008959C +:104A40001F920F920FB60F9211242F933F934F9303 +:104A50005F936F937F938F939F93AF93BF93CF9306 +:104A6000DF93EF93FF93D091E900DF708091EC002A +:104A7000C82FC17080FDC0E81092E9008091F0005D +:104A8000877F8093F00078940E94EA151092E900E5 +:104A90008091F00088608093F000CD2BCF70C093A0 +:104AA000E900FF91EF91DF91CF91BF91AF919F917D +:104AB0008F917F916F915F914F913F912F910F90C7 +:104AC0000FBE0F901F9018951F920F920FB60F9266 +:104AD00011242F933F934F935F936F937F938F9303 +:104AE0009F93AF93BF93EF93FF938091E10082FF79 +:104AF00009C08091E20082FF05C08091E1008B7FB8 +:104B00008093E1008091DA0080FF24C08091D8007A +:104B100080FF20C08091DA008E7F8093DA00809140 +:104B2000D90080FF9DC088E189BD8AE189BD09B4B3 +:104B300000FEFDCF81E0809301038091DC028111B2 +:104B400009C00E94EC040E94B7058091E2008460D5 +:104B50008093E2008091E10080FF17C08091E20025 +:104B600080FF13C08091E2008E7F8093E2008091ED +:104B7000E20080618093E2008091D800806280939F +:104B8000D80019BC85E0809301038091E10084FF87 +:104B90002BC08091E20084FF27C088E189BD8AE1B3 +:104BA00089BD89B5982F917080FFFBCF8091D80087 +:104BB0008F7D8093D8008091E1008F7E8093E1000B +:104BC0008091E2008F7E8093E2008091E20081601C +:104BD0008093E20080910203882309F447C084E0B7 +:104BE00080930103809101038091E10083FF27C03E +:104BF0008091E20083FF23C08091E100877F809352 +:104C0000E10082E080930103109202038091E100B1 +:104C10008E7F8093E1008091E2008E7F8093E2009E +:104C20008091E20080618093E20042E060E080E0F9 +:104C30000E9485058091F00088608093F000FF91CC +:104C4000EF91BF91AF919F918F917F916F915F9104 +:104C50004F913F912F910F900FBE0F901F9018957D +:104C600019BC109201031092DC0274CF8091E30012 +:104C700087FD93E090930103B5CF78941F921FB600 +:104C80001F9211248F939F93AF93BF938091D30270 +:104C90009091D402A091D502B091D6020196A11DA7 +:104CA000B11D8093D3029093D402A093D502B09308 +:104CB000D602BF91AF919F918F911F901FBE1F9001 +:104CC00018951F921FB61F9211248F939F93AF9335 +:104CD000BF938091D202811113C08091D302909131 +:104CE000D402A091D502B091D6024196A11DB11D6A +:104CF0008093D3029093D402A093D502B093D602AE +:104D0000BF91AF919F918F911F901FBE1F901895DB +:104D1000CDB7DEB7E0970FB6F894DEBF0FBECDBFBC +:104D200084B7877F84BF0FB6F894A8958091600000 +:104D3000886180936000109260000FBE80E890E070 +:104D40000FB6F89480936100909361000FBE85B711 +:104D5000806885BF85B7806885BF8EEB98E09093AB +:104D6000E5018093E4010E94EC040E94B705809164 +:104D7000E20084608093E2007894809101038823AC +:104D8000A1F01091E9001F709091EC00892F8170C3 +:104D900090FD80E8182B1092E9008091E80083FDD7 +:104DA0000E94EA151F701093E90082E084BD93E031 +:104DB00095BD9AEF97BD80936E000E94630F81119D +:104DC00002C00E94A50E80EF0E94C00881EF0E94E1 +:104DD000C00882EF0E94C00883EF0E94C00805E56A +:104DE00011E0F1E6EF2EF1E0FF2ED8018D918D015B +:104DF0008F3F11F00E94C008E016F106B1F788E07D +:104E0000E8EAF2E0DF01282F1D922A95E9F7E0E7B2 +:104E1000F2E0DF011D928A95E9F70E9415258111C4 +:104E200002C00E94B31882E090E00E94D72D8093C8 +:104E30009F020E947C0F9093D8028093D7020E9419 +:104E40002523EFE7FBEB3197F1F700C000000E944C +:104E500025238091A80280FF08C06FEF7FEF90E0CC +:104E600080E00E94092E0E94CE0C83E090E00E9418 +:104E7000D72D90E00E94CE0B80910B0390910C03F4 +:104E80000E94A91480917802811132C00E941525D8 +:104E9000811104C00E94B3180E94C51588E090E0FB +:104EA0000E94DF2D60938B0370938C0380938D039E +:104EB00090938E036E7F71F40E94C51588E090E098 +:104EC0000E94DF2D60938B0370938C0380938D037E +:104ED00090938E030E94D3061092C70280918B0399 +:104EE00080FF03C086950E946B1481E08093780256 +:104EF00060EB71E0E5E98E2EE2E09E2E2EE931E0D6 +:104F0000E7EAF1E041E050E01191812F82958F7046 +:104F100090E0DC019196FC9091971F70E12E6A0160 +:104F200001C0CC0C1A95EAF70C2D00950F21919633 +:104F30000C93919792961C9192971C2992961C9390 +:104F4000D901FD909D010F2D02950F7010E0D80141 +:104F50009196BC90BF2DBF70FB2E6A0101C0CC0C96 +:104F6000BA95EAF7DC2CD094DB20D8019196DC923C +:104F700091979296DC909297DC289296DC92DC01D5 +:104F800090968C9190E002C095958795EA94E2F70F +:104F90008170D80190960C9110E002C0159507958C +:104FA000FA94E2F790E000FD92E0892BD4018D9312 +:104FB0004D016E177F0709F0A7CF8091D702806857 +:104FC0008093D7028091D7029091D8020E94B40EAC +:104FD00086EA92E09093BF028093BE0281E20E9433 +:104FE0006B1481E090E00E943C1580E091E090938A +:104FF000CF028093CE0258E1252E312C80910103FF +:10500000FF24F39408E11AE1853009F4B3C20E9449 +:105010002523882359F08FB7F8944091D3025091FB +:10502000D4026091D5027091D6028FBFA8EAB2E097 +:10503000E0EAF2E010E000E0702F8D919D91219167 +:1050400031912817390709F4BEC22827392760E0B3 +:10505000EE24E394F12CA9014E215F21452B09F4A4 +:10506000ACC269A37AA39C012E213F2191E0232B9E +:1050700009F490E09BA30E9489068160782F9DA38C +:105080008CA349A15AA16BA18DA10E949522000F6A +:10509000111FF801E056FD4F80819181E826F92625 +:1050A000F182E0828091C7028823D1F18091C6020B +:1050B000E0918B03E695E81BE093C202823009F091 +:1050C00099C2F0E0EC53FD4FE4910E2F10E024E183 +:1050D000E22E23E1F22E8091C302882361F0109228 +:1050E000C3020E9489069093C1028093C00210926D +:1050F000C5021092C4020E948906E091C002F0919C +:10510000C1028E1B9F0B8F3F9F4750F4E00FF11F92 +:10511000F093C102E093C00280EC92E0F7010995A0 +:105120003CE8E32E32E0F32E03E812E04AE7842E57 +:1051300042E0942E85E991E09CA78BA7D12CC12C4D +:10514000AEE9B1E0BEA7ADA7E7EAF1E0F8ABEFA7A3 +:1051500055E9652E52E0752E512C44244394D30119 +:10516000ED913D01EE0FEE0FAFA5B8A92D91B8ABB3 +:10517000AFA7A22FA295AF70B0E090968C9190E06F +:105180002F7002C0959587952A95E2F7817099272F +:10519000ADA5BEA54D91BEA7ADA7A42FA295AF709A +:1051A000B0E090962C9130E04F7002C03595279575 +:1051B0004A95E2F7A9014170552720FF02C042E05D +:1051C00050E0842BE82BD3011197EC93ABA5BCA541 +:1051D000AD90BCA7ABA7EF70F0E0EB57FE4F80811E +:1051E000F7019081890F8083B12C082E000C990B58 +:1051F00020E08A159B05DCF0D8018C918F5F8C93A1 +:10520000F601EF59FE4F808191819A8389834B8209 +:105210000E9489068160782F9D838C83F4014082EF +:1052200049815A816B818D810E94952221E0D701AD +:105230008C91082E000C990B442755274A195B09BD +:1052400048175907E4F0F801808181508083F60106 +:10525000ED58FE4F808191819A8389834B820E9411 +:1052600089068160782F9D838C83E2E0D401EC93E2 +:1052700049815A816B818D810E94952221E0D7015D +:105280008C91082E000C990BB5010E94782DF70126 +:1052900081937F01522A0F5F1F4FFFEF8F1A9F0AE2 +:1052A00022E0C20ED11C42E1C416D10409F057CF4E +:1052B000552059F08FB7F8944091D3025091D40201 +:1052C0006091D5027091D6028FBF86E0E7EBF2E0E5 +:1052D000DE01119601900D928A95E1F7F090B902E6 +:1052E000E090BA021091BB020091BC021092B90288 +:1052F0001092BA021092BB021092BC028F2D8E291E +:1053000009F448C08091B5029091B6020E947A06D5 +:105310009C019091B102992309F4C3C32333310551 +:10532000C8F19F3F19F09F5F9093B102FF2059F0A1 +:105330000E9444089FEF1F140CF491E0899F802D78 +:1053400011248093B902EE2059F00E9444089FEF87 +:105350001E140CF491E0899F802D11248093BA02D1 +:105360003091B9023323B1F02091BA02222391F097 +:1053700045EB3403C0011124992309F495C190939E +:10538000B90245EB240390011124332309F490C1A1 +:105390003093BA02812F802B09F448C08091B30268 +:1053A0009091B4020E947A069C019091B0029923D8 +:1053B00009F472C325363105C8F19F3F19F09F5F8C +:1053C0009093B002112359F00E9422089FEF11160A +:1053D0000CF491E0899F802D11248093BB0200235F +:1053E00059F00E9422089FEF10160CF491E0899F5B +:1053F000802D11248093BC023091BB023323B1F085 +:105400002091BC02222391F045EB3403C00111240A +:10541000992309F451C19093BB0245EB24039001F9 +:105420001124332309F44CC13093BC028091B9029A +:105430009091BA02892B9091BB02892B9091BC026A +:10544000892B11F00E94820786E0FE013196A7EBBE +:10545000B2E001900D928A95E1F70E94C106909109 +:105460009E02891731F00E94C10680939E020E941D +:10547000911480910103843009F0C0CD83E08093C2 +:10548000E9008091E80082FFB9CD8091E80090E0CA +:1054900085FF06C00E940B05882309F415C191E021 +:1054A0008091E8008B778093E800992309F4A6CDDA +:1054B000E981E150E33108F09BC1F0E0E757F14D9D +:1054C0000C948C2D80910103843009F441C080E05C +:1054D0000E9491141092C7028091BD02811116C0E2 +:1054E000F092BD0280918B03982F91709093790276 +:1054F0008E7F80938B03BFEFE0E7F2E0B150E04096 +:10550000F040E1F700C000000E94A00F1092D2020C +:1055100020E40FB6F894A895209260000FBE209367 +:10552000600083B7817F846083BF83B7816083BF5E +:105530007894889583B78E7F83BF0FB6F894A8952B +:1055400080916000886180936000109260000FBEBF +:1055500080910003882371F00E942523E8EAF2E09D +:1055600081919191892B09F078C280EB92E08E179E +:105570009F07B1F780910103853009F4A3CF0E9402 +:10558000D5150E94C1060E9491141092BD0280910F +:105590007902882359F080918B03816080938B037B +:1055A00086950E946B140E948A0F31CD8091C802AB +:1055B0008823C9F30E94A00FF6CF6F5FEE0CFF1C8B +:1055C0006C3009F048CD0F5F1F4F0430110509F012 +:1055D00033CD8FEF8EA38FA318A60E94890681601A +:1055E000782F9AA789A74EA15FA168A58AA50E94D6 +:1055F000952258CD863059F4F0E0EF53FD4FE491F9 +:105600000E2F10E094E0E92E93E1F92E64CD89305D +:1056100061F4E695F0E0E254FD4FE4910E2F10E0C6 +:1056200085E5E82E82E1F82E56CD8F3061F4E695BF +:10563000F0E0E554FD4FE4910E2F10E0B0E0EB2ECA +:10564000B2E1FB2E48CD853159F4F0E0E854FD4F2E +:10565000E4910E2F10E0ADE8EA2EA1E1FA2E3BCD49 +:1056600008E210E07DEFE72E70E1F72E883109F4B3 +:1056700032CD833249F4E6EBF2E005911491FBEA76 +:10568000EF2EF2E1FF2E27CD04EF11E0E0ECEE2E3D +:10569000E0E1FE2E843209F41ECD00ED17E062ED4C +:1056A000E62E66E0F62E17CD81E08093B90269CE32 +:1056B00081E08093BA026ECE81E08093BB02ADCED2 +:1056C00081E08093BC02B2CE00E210E0CE010196F0 +:1056D0007C018091E80085FD0AC08091E8008B770D +:1056E0008093E8000E940B05882399F3D8CE80911F +:1056F000F100D7018D937D010150110951F7CFCEF3 +:105700001A8289E08B833FC08A81823009F4BBC151 +:105710008330A9F0813009F06BC02FB7F894609105 +:10572000D3027091D4028091D5029091D6022FBFFE +:105730000E94922D6B837C838D839E8324C08091F5 +:10574000A8029091A9029827892798279C838B8388 +:105750008091AA029091AB029827892798279E836F +:105760008D838091AC029091AD029827892798276C +:1057700098878F838091AE029091AF0298278927F6 +:1057800098279A87898780910103843009F036CC65 +:105790001091E9001F709091EC00892F817090FDAD +:1057A00080E8182B82E08093E9008091E80080FF78 +:1057B0000DC050E040E060E270E0CE0101960E9432 +:1057C0003C058091E8008E778093E8001F7010936D +:1057D000E90014CC8A81823059F46B817C818D81FF +:1057E0009E810E94922D86E290E00E94EB2DCBCF0D +:1057F0008FEF8983C8CF4C816B818A810E94C10E53 +:105800009827892798279E838D83BDCFED80FE80C2 +:10581000FE24EF24FE248A810B81B8E10B9F8001D6 +:105820001124E0E68E9F000D111D11248C8190E063 +:10583000880F991F080F191F6F2DC80187960E94A6 +:10584000EB2D6E2DC8018896D0CF0E94380E9BCFCD +:105850008A818138C1F060F4803809F094CF20E06B +:105860004B8160918D0380918C030E943A138BCF02 +:10587000823849F1833809F086CF20E040918E03C9 +:105880006C818B81F2CF8B810E946B149B81809104 +:105890008B03911111C08E7F80938B031092C702EE +:1058A000FFEF20E742E0F15020404040E1F700C028 +:1058B00000000E94A00F67CF816080938B038695C4 +:1058C0000E946B1460CF8B8180938F035CCF8A81A1 +:1058D000813899F030F4803809F055CF80918E03EB +:1058E00011CF823891F0833809F04DCF80918C032D +:1058F0008B8380918D038C8346CF80918B0380FFB7 +:1059000002C08695FFCE80E0FDCE80918F03FACE57 +:1059100060918B0370918C0380918D0390918E0325 +:105920000E94281330CF80E18A832DCF84E08A83C0 +:1059300089E1E8CE0A811B81102701271027CE01BB +:1059400001966C01EC80DC01AE0DB11D7D01C8013A +:1059500089519C4FEC14FD0409F415CF0931B4E0D2 +:105960001B0750F40E94D72DF60184830F5F1F4F51 +:10597000BFEFCB1ADB0AEBCFD60114961C92F6CF01 +:105980000A811B81102701271027FE0131966F0124 +:10599000EC80E00EF12EF11CC80189519C4FE016FD +:1059A000F10609F4F0CE0931F4E01F0728F4D6011E +:1059B00014966C910E94EB2DBFEFCB1ADB0A0F5FA0 +:1059C0001F4FEACF0E94280EDECE8AE0ADCF0A81BB +:1059D0001B81102701271027FE0131966F01EC80F3 +:1059E000CF018E0D911D7C01C8018796EC14FD043A +:1059F00009F4C9CE003CA3E01A0750F40E94D72D49 +:105A0000F60184830F5F1F4FBFEFCB1ADB0AECCF89 +:105A1000D60114961C92F6CF0A811B81102701270C +:105A20001027FE0131966F01EC80E00EF12EF11C83 +:105A3000C8018796E016F10609F4A5CE003CF3E014 +:105A40001F0728F4D60114966C910E94EB2DBFEF2E +:105A5000CB1ADB0A0F5F1F4FEBCF09BD19BD09B48D +:105A600000FEFDCF8091D8008F7D8093D80080917B +:105A7000E00082608093E0008091E00081FDFCCF37 +:105A80000E94D51577CD86E290E00E94D72D1B822B +:105A90001C821D828E8377CE2D32314008F08FCC50 +:105AA000C5CC2D32314008F03ECC74CC87FB082E9B +:105AB000062687FD819567FD61950E94A82D0EF44D +:105AC000919507FC81950895AA1BBB1B51E107C066 +:105AD000AA1FBB1FA617B70710F0A61BB70B881F7E +:105AE000991F5A95A9F780959095BC01CD0108950D +:105AF00097FB072E16F4009407D077FD09D00E947B +:105B0000642D07FC05D03EF4909581959F4F089534 +:105B1000709561957F4F0895EE0FFF1F0590F491EA +:105B2000E02D099469279627692778278727782702 +:105B300008950E94542E332312F48A1B9B0B0C945D +:105B4000A32D0E94542EB7FF0895821B930B089536 +:105B5000991B79E004C0991F961708F0961B881FBF +:105B60007A95C9F780950895FB01DC0102C0059084 +:105B70000D9241505040D8F70895FC0141505040DB +:105B800030F001900616D1F73197CF01089588279C +:105B900099270895FB01DC0104C08D9101908019C3 +:105BA00021F441505040C8F7881B990B0895F9998A +:105BB000FECF92BD81BDF89A992780B50895A6E1E0 +:105BC000B0E044E050E00C94112EA8E1B0E042E0D7 +:105BD00050E00C94112E262FF999FECF92BD81BD75 +:105BE000F89A019700B4021639F01FBA20BD0FB61B +:105BF000F894FA9AF99A0FBE08950396272F0E94F7 +:105C0000EC2D0E94EB2D252F0E94EC2D242F0C94BF +:105C1000EC2D0196272F0E94EC2D0C94EB2DDC012E +:105C2000CB01FC01F999FECF06C0F2BDE1BDF89AA7 +:105C3000319600B40D9241505040B8F708950E943B +:105C4000542EA59F900DB49F900DA49F800D911D83 +:105C500011240895B7FF0C941F2E0E941F2E821B43 +:105C6000930B0895A1E21A2EAA1BBB1BFD010DC0C8 +:105C7000AA1FBB1FEE1FFF1FA217B307E407F507FC +:105C800020F0A21BB30BE40BF50B661F771F881FD8 +:105C9000991F1A9469F760957095809590959B016E +:105CA000AC01BD01CF010895A29FB001B39FC00117 +:105CB000A39F700D811D1124911DB29F700D811D38 +:105CC0001124911D0895F894FFCF4E0F4E0F570FDA +:105CD000570F590F570F570F570F4E0F4E0F5E0F9D +:105CE000570F570F5E0FD016F8169B18F8169B1813 +:105CF0002B174C179B184A1857183B1D3B1D761D38 +:105D0000761D251E3F1EA61DA61D4A1ED41EE51E7D +:105D1000E51E802B842BEA2BFB2B062C252C282C14 +:105D2000672C882CF82BF82B932C962C9A2CC02CB3 +:085D3000E22CE52CE72C0C2D00 +:105D380077068E0C6D0C690C650C760601191A1B1A +:105D48001C1D1E1F202122010201002A002A2A01EF +:105D5800818283E200E900EA00B500B600B700CD11 +:105D6800008301CC008A01920194012102230224BC +:105D7800022502260227022A02B300B4006F00702F +:105D880000F0F1F2F3F5F6F70001020304053736E7 +:105D9800350200020102020B000B010B020B030586 +:105DA80003080300000001000209000901090209B3 +:105DB800030303060300FF0100010000FFFF0000CA +:105DC800010001FF000404040404040402026162E7 +:105DD80064669092949706606365679193959607B9 +:105DE8000001020202020606060909090909090F4B +:105DF8000F0F0F0F0F15151518191919191919194A +:105E080019191923244022B6B6019401DE00C808E6 +:045E1800E108010993 +:00000001FF diff --git a/keyboards/solartempest/ak21/ak21 VIA keymap.json b/keyboards/solartempest/ak21/ak21 VIA keymap.json new file mode 100644 index 000000000000..0f369e01f272 --- /dev/null +++ b/keyboards/solartempest/ak21/ak21 VIA keymap.json @@ -0,0 +1,69 @@ +{ + "name": "AK21", + "vendorId": "0x414B", + "productId": "0x0021", + "lighting": "qmk_rgblight", + "matrix": { "rows": 6, "cols": 4 }, + "customKeycodes": [ + { + "name": "Super Alt Tab FWD", + "title": "Alt Tab Forwards in Windows", + "shortName": "ATABF" + }, + { + "name": "Super Alt Tab REV", + "title": "Alt Tab Reverse in Windows", + "shortName": "ATABR" + } + ], + "layouts": { + "keymap": [ + [ + { + "c": "#393B3B", + "t": "#91867A" + }, + "0,0", + "0,1", + "0,2", + "0,3" + ], + [ + "1,0", + "1,1", + "1,2", + "1,3" + ], + [ + "2,0", + "2,1", + "2,2", + { + "h": 2 + }, + "2,3" + ], + [ + "3,0", + "3,1", + "3,2" + ], + [ + "4,0", + "4,1", + "4,2", + { + "h": 2 + }, + "4,3" + ], + [ + { + "w": 2 + }, + "5,1", + "5,2" + ] +] + } +} \ No newline at end of file diff --git a/keyboards/solartempest/ak21/ak21 VIA layout.json b/keyboards/solartempest/ak21/ak21 VIA layout.json new file mode 100644 index 000000000000..dbec06309e55 --- /dev/null +++ b/keyboards/solartempest/ak21/ak21 VIA layout.json @@ -0,0 +1,267 @@ +{ + "name": "AK21", + "vendorProductId": 1095434273, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "MO(1)", + "KC_MSTP", + "USER01", + "USER00", + "KC_NLCK", + "KC_PSLS", + "KC_PAST", + "KC_PMNS", + "KC_P7", + "KC_P8", + "KC_P9", + "KC_PPLS", + "KC_P4", + "KC_P5", + "KC_P6", + "KC_NO", + "KC_P1", + "KC_P2", + "KC_P3", + "KC_PENT", + "KC_P0", + "KC_P0", + "KC_PDOT", + "KC_NO" + ], + [ + "KC_TRNS", + "TO(2)", + "TO(3)", + "TO(4)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RESET", + "KC_TRNS", + "KC_NO" + ], + [ + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ] + ] +} \ No newline at end of file diff --git a/keyboards/solartempest/ak21/ak21.c b/keyboards/solartempest/ak21/ak21.c new file mode 100644 index 000000000000..4d53707a6fa8 --- /dev/null +++ b/keyboards/solartempest/ak21/ak21.c @@ -0,0 +1,19 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ak21.h" diff --git a/keyboards/solartempest/ak21/ak21.h b/keyboards/solartempest/ak21/ak21.h new file mode 100644 index 000000000000..2bf922bf5158 --- /dev/null +++ b/keyboards/solartempest/ak21/ak21.h @@ -0,0 +1,38 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE + #define LAYOUT( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, \ + K40, K41, K42, K43, \ + K50, K52 \ + ) { \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, KC_NO }, \ + { K40, K41, K42, K43 }, \ + { K50, KC_NO, K52, KC_NO }, \ + } +#endif diff --git a/keyboards/solartempest/ak21/config.h b/keyboards/solartempest/ak21/config.h new file mode 100644 index 000000000000..2931a96fccf5 --- /dev/null +++ b/keyboards/solartempest/ak21/config.h @@ -0,0 +1,94 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include "config_common.h" + +// USB Device descriptor parameter +#define VENDOR_ID 0x414B // "AK" +#define PRODUCT_ID 0x0021 +#define DEVICE_VER 0x0001 // Ver1 +#define MANUFACTURER ATLANTIS +#define PRODUCT AK21 + + +// key matrix size +#ifdef RGBLIGHT_ENABLE + #define MATRIX_ROWS 6 + #define MATRIX_COLS 4 +#endif + +#define MATRIX_ROW_PINS { B3, F1, F4, F5, F6, F7 } +#define MATRIX_COL_PINS { B2, F0, D6, D7 } +#define UNUSED_PINS + +// COL2ROW or ROW2COL +#define DIODE_DIRECTION ROW2COL + +// For LED status indicators +#define LED_NUM_LOCK_PIN E6 +#define LED_PIN_ON_STATE 0 + +#define RGB_DI_PIN B0 +#ifdef RGBLIGHT_ENABLE + #define RGBLED_NUM 33 // 21 key + 12 underglow for RGBLIGHT + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_DEFAULT_VAL 40 // default brightness on clearing EEPROM + #define RGBLIGHT_LIMIT_VAL 200 // brightness level max is 255 + #define RGBLIGHT_SLEEP // if defined, RGB lighting off when host is sleeping + #define RGBLIGHT_ANIMATIONS + + //RGB LED Conversion macro from physical array to electric array + //First section is the LED matrix, second section is the electrical wiring order, and the third section is the desired mapping + #define LED_LAYOUT( \ + L01, L02, L03, L04, L05, \ + L10, L11, L12, L13, L14, L15, \ + L20, L21, L22, L23, L25, \ + L30, L31, L32, L33, L34, L35, \ + L40, L41, L42, L43, L45, \ + L51, L53, L55, \ + L60, L63, L65 ) \ + { \ + L01,L02,L03,L05,L14,L13,L12,L11,L21,L22,L23,L34,L33,L32,L31,L41,L42,L43,L55,L53,L51,L60,L63,L65,L45,L35,L25,L04,L10,L20,L30,L40, \ + } + //RGB LED logical order map + //Right->Left, Top->Bottom + #define RGBLIGHT_LED_MAP LED_LAYOUT( \ + 4, 3, 2, 1, 0, \ + 10, 9, 8, 7, 6, 5, \ + 15, 14, 13, 12, 11, \ + 21, 20, 19, 18, 17, 16, \ + 26, 25, 24, 23, 22, \ + 29, 28, 27, \ + 32, 31, 30 ) +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +#define COMBO_COUNT 2 //Number of tap combos used +#define COMBO_TERM 300 //Default combo time is 200ms + +#define TAPPING_TERM 200 //Tap dance time diff --git a/keyboards/solartempest/ak21/info.json b/keyboards/solartempest/ak21/info.json new file mode 100644 index 000000000000..8ebc6f69bdc9 --- /dev/null +++ b/keyboards/solartempest/ak21/info.json @@ -0,0 +1,39 @@ +{ + "keyboard_name": "Atlantis AK21 Macropad", + "url": "", + "maintainer": "solartempest", + "width": 4, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"x":0, "y":0}, + {"x":0, "y":1}, + {"x":0, "y":2}, + {"x":0, "y":3}, + + {"x":1, "y":0}, + {"x":1, "y":1}, + {"x":1, "y":2}, + {"x":1, "y":3}, + + {"x":2, "y":0}, + {"x":2, "y":1}, + {"x":2, "y":2}, + {"x":2, "y":3, "h":2}, + + {"x":3, "y":0}, + {"x":3, "y":1}, + {"x":3, "y":2}, + + {"x":4, "y":0}, + {"x":4, "y":1}, + {"x":4, "y":2}, + {"x":4, "y":3, "h":2}, + + {"x":5, "y":0, "w":2}, + {"x":5, "y":2}, + ] + } + } +} diff --git a/keyboards/solartempest/ak21/keymaps/default/keymap.c b/keyboards/solartempest/ak21/keymaps/default/keymap.c new file mode 100644 index 000000000000..57cb17af2a32 --- /dev/null +++ b/keyboards/solartempest/ak21/keymaps/default/keymap.c @@ -0,0 +1,293 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "ak21.h" +#ifdef RGBLIGHT_ENABLE + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT +#endif + +bool is_alt_tab_active = false; // Super Alt Tab Code +uint16_t alt_tab_timer = 0; +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR //Alt tab reverse + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR //Alt tab reverse + }; +#endif + + +enum combos { //Tap combos + kppls_7, + kppls_8 +}; + +const uint16_t PROGMEM kppls7_combo[] = {KC_KP_PLUS, KC_KP_7, COMBO_END}; +const uint16_t PROGMEM kppl8_combo[] = {KC_KP_PLUS, KC_KP_8, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [kppls_7] = COMBO(kppls7_combo, KC_BSPACE), + [kppls_8] = COMBO(kppl8_combo, KC_DELETE) +}; + + +// Tap Dance declarations +enum { + TD_MINUS_NUMLOCK, +}; + +// Tap Dance definitions. Not VIA compatible. +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_MINUS_NUMLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_KP_MINUS, KC_NUMLOCK), +}; +//TD(TD_MINUS_NUMLOCK) // Add tap dance item to your keymap in place of a keycode + + +enum layer_names { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, + _LAYER4, + _LAYER5, + _LAYER6, + _LAYER7, + _LAYER8, + _LAYER9 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_LAYER0] = LAYOUT( + MO(_LAYER1), KC_ESC, KC_CALC, KC_BSPC, + KC_NLCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, + KC_KP_0, KC_KP_DOT + ), + [_LAYER1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RESET, + KC_TRNS, KC_TRNS + ), + [_LAYER2] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER3] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER6] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER7] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER9] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ) +}; + + +void matrix_init_user(void) { //run when matrix is initiated, before all features init +}; + +void matrix_scan_user(void) { //run whenever user matrix is scanned + if (is_alt_tab_active) { + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { //Actions to override existing key behaviours + switch (keycode) { //For super alt tab keycodes + case ATABF: //Alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + break; + case ATABR: //Alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + break; + } + return true; +}; + + +void keyboard_post_init_user(void) { //run as last task in keyboard init + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9. Looks great this way! + rgblight_sethsv(58, 255, 30); //Set lower default brightness when connected as the right side dimming is not yet in effect + #endif +}; + + +#ifdef RGBLIGHT_ENABLE +layer_state_t layer_state_set_user(layer_state_t state) { + switch (get_highest_layer(state)) { + //This custom layer lighting is similar to RGB Light Gradient 9, but customized to separate key and case underglow brightness + static uint16_t underglow_brightness = 140; + static uint16_t perkey_brightness = 80; + static uint16_t current_hue = 0; //hue calculated to be used + static uint16_t layer0_huestart = 56; //hue gradient starting colour - green/blue + static uint16_t layer0_hueincrement = 2; //hue gradient colour increment + static uint16_t layer1_huestart = 15; //hue gradient starting colour - orange/green + static uint16_t layer1_hueincrement = 2; //hue gradient colour increment + static uint16_t layer2_huestart = 220; //hue gradient starting colour - magenta/orange + static uint16_t layer2_hueincrement = 2; //hue gradient colour increment + static uint16_t layer3_huestart = 135; //hue gradient starting colour - blue/purple + static uint16_t layer3_hueincrement = 2; //hue gradient colour increment + static uint16_t layer4_huestart = 30; //hue gradient starting colour - orange/red + static uint16_t layer4_hueincrement = 1; //hue gradient colour increment + + case _LAYER0: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer0_hueincrement+layer0_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER1: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer1_hueincrement+layer1_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER2: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ //This code is for normal gradient colouration + current_hue=i*layer2_hueincrement+layer2_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER3: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer3_hueincrement+layer3_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER4: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer4_hueincrement+layer4_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + } + return state; + }; +#endif diff --git a/keyboards/solartempest/ak21/keymaps/via/config.h b/keyboards/solartempest/ak21/keymaps/via/config.h new file mode 100644 index 000000000000..4bbacd9a507b --- /dev/null +++ b/keyboards/solartempest/ak21/keymaps/via/config.h @@ -0,0 +1,22 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +// Set 10 layers for VIA +#define DYNAMIC_KEYMAP_LAYER_COUNT 10 diff --git a/keyboards/solartempest/ak21/keymaps/via/keymap.c b/keyboards/solartempest/ak21/keymaps/via/keymap.c new file mode 100644 index 000000000000..57cb17af2a32 --- /dev/null +++ b/keyboards/solartempest/ak21/keymaps/via/keymap.c @@ -0,0 +1,293 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "ak21.h" +#ifdef RGBLIGHT_ENABLE + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT +#endif + +bool is_alt_tab_active = false; // Super Alt Tab Code +uint16_t alt_tab_timer = 0; +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR //Alt tab reverse + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR //Alt tab reverse + }; +#endif + + +enum combos { //Tap combos + kppls_7, + kppls_8 +}; + +const uint16_t PROGMEM kppls7_combo[] = {KC_KP_PLUS, KC_KP_7, COMBO_END}; +const uint16_t PROGMEM kppl8_combo[] = {KC_KP_PLUS, KC_KP_8, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [kppls_7] = COMBO(kppls7_combo, KC_BSPACE), + [kppls_8] = COMBO(kppl8_combo, KC_DELETE) +}; + + +// Tap Dance declarations +enum { + TD_MINUS_NUMLOCK, +}; + +// Tap Dance definitions. Not VIA compatible. +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_MINUS_NUMLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_KP_MINUS, KC_NUMLOCK), +}; +//TD(TD_MINUS_NUMLOCK) // Add tap dance item to your keymap in place of a keycode + + +enum layer_names { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, + _LAYER4, + _LAYER5, + _LAYER6, + _LAYER7, + _LAYER8, + _LAYER9 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_LAYER0] = LAYOUT( + MO(_LAYER1), KC_ESC, KC_CALC, KC_BSPC, + KC_NLCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, + KC_KP_0, KC_KP_DOT + ), + [_LAYER1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RESET, + KC_TRNS, KC_TRNS + ), + [_LAYER2] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER3] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER6] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER7] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER9] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ) +}; + + +void matrix_init_user(void) { //run when matrix is initiated, before all features init +}; + +void matrix_scan_user(void) { //run whenever user matrix is scanned + if (is_alt_tab_active) { + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { //Actions to override existing key behaviours + switch (keycode) { //For super alt tab keycodes + case ATABF: //Alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + break; + case ATABR: //Alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + break; + } + return true; +}; + + +void keyboard_post_init_user(void) { //run as last task in keyboard init + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9. Looks great this way! + rgblight_sethsv(58, 255, 30); //Set lower default brightness when connected as the right side dimming is not yet in effect + #endif +}; + + +#ifdef RGBLIGHT_ENABLE +layer_state_t layer_state_set_user(layer_state_t state) { + switch (get_highest_layer(state)) { + //This custom layer lighting is similar to RGB Light Gradient 9, but customized to separate key and case underglow brightness + static uint16_t underglow_brightness = 140; + static uint16_t perkey_brightness = 80; + static uint16_t current_hue = 0; //hue calculated to be used + static uint16_t layer0_huestart = 56; //hue gradient starting colour - green/blue + static uint16_t layer0_hueincrement = 2; //hue gradient colour increment + static uint16_t layer1_huestart = 15; //hue gradient starting colour - orange/green + static uint16_t layer1_hueincrement = 2; //hue gradient colour increment + static uint16_t layer2_huestart = 220; //hue gradient starting colour - magenta/orange + static uint16_t layer2_hueincrement = 2; //hue gradient colour increment + static uint16_t layer3_huestart = 135; //hue gradient starting colour - blue/purple + static uint16_t layer3_hueincrement = 2; //hue gradient colour increment + static uint16_t layer4_huestart = 30; //hue gradient starting colour - orange/red + static uint16_t layer4_hueincrement = 1; //hue gradient colour increment + + case _LAYER0: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer0_hueincrement+layer0_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER1: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer1_hueincrement+layer1_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER2: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ //This code is for normal gradient colouration + current_hue=i*layer2_hueincrement+layer2_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER3: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer3_hueincrement+layer3_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + break; + case _LAYER4: + for (uint8_t i = 0; i < RGBLED_NUM; i++){ + current_hue=i*layer4_hueincrement+layer4_huestart; //Determine the calculated hue + if(current_hue>255){current_hue=current_hue-255;}; //Roll over max hue of 256 + if (i == 1 || i == 5 || i == 10 || i == 11 || i == 15 || i == 16|| i == 21|| i == 22|| i == 26|| i == 27|| i == 30|| i == 31|| i == 32) { + rgblight_sethsv_at(current_hue,255,underglow_brightness,i); + } else { + rgblight_sethsv_at(current_hue,255,perkey_brightness,i); + }; + }; + } + return state; + }; +#endif diff --git a/keyboards/solartempest/ak21/keymaps/via/rules.mk b/keyboards/solartempest/ak21/keymaps/via/rules.mk new file mode 100644 index 000000000000..1e5b99807cb7 --- /dev/null +++ b/keyboards/solartempest/ak21/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/solartempest/ak21/readme.md b/keyboards/solartempest/ak21/readme.md new file mode 100644 index 000000000000..ef0114b54ba6 --- /dev/null +++ b/keyboards/solartempest/ak21/readme.md @@ -0,0 +1,20 @@ +# Atlantis AK21 Macropad + +![Atlantis AK21](https://update) +![Rear View](https://update) +![PCB View](https://update) +![Side View](https://update) + +A 21-key macro pad with pushbutton rotary encoder and underglow RGB per key RGB and for the case. + +* Keyboard Maintainer: solartempest +* Hardware Supported: Atlantis AK21 +* Hardware Availability: [rioo897](https://shop198276076.world.taobao.com/index.htm?spm=2013.1.w5002-23418336364.2.3f4d7d51DkVX3s) + +Make example for this keyboard (after setting up your build environment): + + make solartempest/ak21:via + +To reset the board into bootloader mode, tap the Reset switch mounted on the bottom of the PCB. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/solartempest/ak21/rules.mk b/keyboards/solartempest/ak21/rules.mk new file mode 100644 index 000000000000..c6bc1c8cc8cf --- /dev/null +++ b/keyboards/solartempest/ak21/rules.mk @@ -0,0 +1,28 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# + +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration +MOUSEKEY_ENABLE = no # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +RGB_MATRIX_ENABLE = no # RGB matrix for individual LED control +RGB_MATRIX_DRIVER = WS2812 # Addressable LED strand driver (keep for RGBLIGHT too) +BLUETOOTH_ENABLE = no # Enable Bluetooth +AUDIO_ENABLE = no # Audio output +MIDI_ENABLE = no # No midi +UNICODE_ENABLE = yes # Unicode +COMBO_ENABLE = yes # Tap combo chording +TAP_DANCE_ENABLE = yes # Tap dance +LTO_ENABLE = yes # Reduce firmware size diff --git a/keyboards/solartempest/ak21/solartempest_ak21_via.hex b/keyboards/solartempest/ak21/solartempest_ak21_via.hex new file mode 100644 index 000000000000..1c6288a1558e --- /dev/null +++ b/keyboards/solartempest/ak21/solartempest_ak21_via.hex @@ -0,0 +1,1475 @@ +:100000000C9470030C94B7030C94B7030C94B703CF +:100010000C94B7030C94B7030C94B7030C94B70378 +:100020000C94B7030C94B7030C94B6260C94722668 +:100030000C94B1270C94B7030C94B7030C94B7033A +:100040000C94B7030C94B7030C94B7030C94B70348 +:100050000C94B7030C948D270C94B7030C94B7033E +:100060000C94B7030C94B7030C94B7030C94B70328 +:100070000C94B7030C94B7030C94B7030C94B70318 +:100080000C94B7030C94B7030C94B7030C94B70308 +:100090000C94B7030C94B7030C94B7030C94B703F8 +:1000A0000C94B7030C94B7030C94B703570060008B +:1000B000000057005F00000005010980A1018503D1 +:1000C00019012AB700150126B700950175108100A6 +:1000D000C0050C0901A101850419012AA00215011E +:1000E00026A002950175108100C005010906A10135 +:1000F0008505050719E029E7150025019508750113 +:1001000081020507190029EF1500250195F07501F9 +:1001100081020508190129059505750191029501CE +:1001200075039101C00660FF0961A1010962150014 +:1001300026FF009520750881020963150026FF003F +:10014000952075089102C005010906A1010507194E +:10015000E029E715002501950875018102950175D3 +:100160000881010507190029FF150026FF009506E3 +:100170007508810005081901290595057501910289 +:10018000950175039101C00000000000000000000F +:10019000000000000000000000000000000000005F +:1001A00000000000000000000000007E0F00D4FFEF +:1001B000FFFFC70000007800000000000000002AD8 +:1001C0002B280000000000000000000000000000DC +:1001D000000029000000002C1E3420212224342697 +:1001E00027252E362D3738271E1F20212223242590 +:1001F000263333362E37381F0405060708090A0B45 +:100200000C0D0E0F101112131415161718191A1BB6 +:100210001C1D2F3130232D350405060708090A0B54 +:100220000C0D0E0F101112131415161718191A1B96 +:100230001C1D2F3130354C00047F3F1F6432146485 +:100240003214783C1E1E140A05000101010101014F +:10025000010101020202020202020202030303037D +:10026000030303030404040404040405050505054D +:10027000060606060607070707070808080809090B +:1002800009090A0A0A0B0B0B0C0C0C0D0D0D0E0EB6 +:100290000E0F0F0F10101111111212131314141549 +:1002A0001516161717181819191A1A1B1B1C1D1DBD +:1002B0001E1E1F2020212222232424252626272813 +:1002C00029292A2B2C2D2D2E2F3031323233343543 +:1002D000363738393A3B3C3D3E3F40414243444546 +:1002E000464748494A4C4D4E4F5051535455565825 +:1002F000595A5B5D5E5F616264656668696B6C6DCF +:100300006F7072737577787A7B7D7E808283858744 +:10031000888A8C8E8F91939596989A9C9EA0A2A382 +:10032000A5A7A9ABADAFB1B3B5B7BABCBEC0C2C487 +:10033000C6C9CBCDCFD1D4D6D8DBDDDFE2E4E7E947 +:10034000EBEEF0F3F5F8FAFDFFFFAA7F554004034A +:100350000200060708090E0D0C11121314191817C4 +:100360001B1C1D201F1E16100B010A0F151A22231D +:10037000252628292A2C2D2F3032333536383A3B82 +:100380003D3E4042434547494A4C4E5051535557D4 +:10039000595A5C5E6062646668696B6D6F717375F3 +:1003A00077797B7D7F81838587898A8C8E909294F3 +:1003B00096989A9C9E9FA1A3A5A7A8AAACAEAFB100 +:1003C000B3B4B6B8B9BBBCBEBFC1C2C3C5C6C7C94A +:1003D000CACBCCCDCED0D1D2D2D3D4D5D6D7D7D804 +:1003E000D9D9DADADBDBDBDCDCDCDCDCDDDDDDDD56 +:1003F000DCDCDCDCDCDBDBDBDADAD9D9D8D7D7D65E +:10040000D5D4D3D2D2D1D0CECDCCCBCAC9C7C6C514 +:10041000C3C2C1BFBEBCBBB9B8B6B4B3B1AFAEAC5A +:10042000AAA8A7A5A3A19F9E9C9A98969492908E05 +:100430008C8A89878583817F7D7B79777573716FDE +:100440006D6B6968666462605E5C5A5957555351BA +:10045000504E4C4A4947454342403E3D3B3A383670 +:10046000353332302F2D2C2A2928262523220151DD +:100470002900B2002A0053005400550056005F00C6 +:100480006000610057005C005D005E0000005900E4 +:100490005A005B0058006200000063000000010089 +:1004A0000100010001000100010001000100010044 +:1004B0000100010001000100010001000000010035 +:1004C00001000100005C01000000010000000100CB +:1004D0000100010001000100010001000100010014 +:1004E0000100010001000100010001000000010005 +:1004F00001000100010001000000010000000100F6 +:1005000001000100010001000100010001000100E3 +:1005100001000100010001000100010000000100D4 +:1005200001000100010001000000010000000100C5 +:1005300001000100010001000100010001000100B3 +:1005400001000100010001000100010000000100A4 +:100550000100010001000100000001000000010095 +:100560000100010001000100010001000100010083 +:100570000100010001000100010001000000010074 +:100580000100010001000100000001000000010065 +:100590000100010001000100010001000100010053 +:1005A0000100010001000100010001000000010044 +:1005B0000100010001000100000001000000010035 +:1005C0000100010001000100010001000100010023 +:1005D0000100010001000100010001000000010014 +:1005E0000100010001000100000001000000010005 +:1005F00001000100010001000100010001000100F3 +:1006000001000100010001000100010000000100E3 +:1006100001000100010001000000010000000100D4 +:1006200001000100010001000100010001000100C2 +:1006300001000100010001000100010000000100B3 +:10064000010001000100010000000100000009029A +:100650005B00030100A0FA0904000001030101008E +:100660000921110100012240000705810308000A49 +:100670000904010002030000000921110100012208 +:100680002200070582032000010705030320000163 +:1006900009040200010300000009211101000122E8 +:1006A0006D000705840320000A120100020000000B +:1006B000084B4121000100010200010A0341004BE7 +:1006C000003200310000001203410054004C004190 +:1006D000004E0054004900530000000403090400C8 +:1006E00011241FBECFEFDAE0DEBFCDBF04B603FE9C +:1006F00027C08091800390918103A0918203B091E3 +:1007000083038730904BA740B04BD1F41092800305 +:1007100010928103109282031092830314BE84B757 +:10072000877F84BF0FB6F894A89580916000886198 +:1007300080936000109260000FBEE0E0F8E309953E +:1007400011E0A0E0B1E0E2E5FBE502C005900D920A +:10075000A23BB107D9F723E0A2EBB1E001C01D92A3 +:10076000A038B207E1F70E94D8270C94702D0C94A2 +:100770000000E8EDF0E080818E7F80831092E2003F +:100780001092DA001092E100A0EEB0E08C9181604E +:100790008C9380818F77808319BCA7EDB0E08C911A +:1007A0008E7F8C9380818F7E80831092E4020895E7 +:1007B0002091E4003091E50095E6A9012091EC003C +:1007C000822F817020FF06C08091E80080FF06C064 +:1007D00080E008952091E80022FD1AC0809109036D +:1007E000882389F0853089F08091EB0085FD0FC06A +:1007F0002091E4003091E50042175307F9F291503F +:10080000E1F684E0089582E0089583E0089581E0B0 +:100810000895EF92FF920F931F93CF937C018B016A +:100820000E94D803C82F811117C08091E80085FD70 +:100830000BC08091E8008E778093E8000E94D80377 +:10084000882399F3C82F08C0F70181917F01809315 +:10085000F1000150110949F78C2FCF911F910F9191 +:10086000FF90EF90089580910B0387FF13C0809154 +:10087000E80082FF06C08091E8008B778093E80053 +:1008800004C0809109038111F2CF0895809109037A +:100890008823D9F38091E80080FFF8CF8091E800A9 +:1008A0008E77ECCF982F9093E900242F762F50E08D +:1008B000891731F07091EC002091ED005091F0001B +:1008C00021FD07C09F5F973071F78093E90081E0B9 +:1008D00008953091EB003E7F3093EB003091ED00B6 +:1008E0003D7F3093ED003091EB0031603093EB00B1 +:1008F0007093EC002093ED005093F0002091EE00F7 +:1009000027FDE0CF80E00895CF92DF92EF92FF9233 +:100910000F931F93CF93DF93C8EDD0E088818F7E34 +:100920008883E7EDF0E080818160808384E082BF8E +:1009300081E08093E40288818E7F888302EE10E05C +:10094000F80110821092DA0081EEC82ED12CF60147 +:10095000108288818F7788838881806888838881E6 +:100960008F7D888319BC1092090310920A0310929C +:1009700008031092070390EEE92EF12CF701808115 +:100980008B7F808388818160888342E060E080E0A3 +:100990000E945204F60180818E7F8083F80180815D +:1009A00081608083808188608083F70180818E7F71 +:1009B0008083888180618883DF91CF911F910F911F +:1009C000FF90EF90DF90CF900895FC01809111038C +:1009D0009091120386179707A0F06115710529F40D +:1009E0009091E8009E779093E80090E06115710582 +:1009F00051F4911108C08091E80082FF34C080E07A +:100A00000895BC01F2CF809109038823C1F185309C +:100A1000C1F18091E80083FD30C08091E80082FD43 +:100A2000EACF8091E80080FFE1CF8091F300209130 +:100A3000F200382F6115710519F02830310558F092 +:100A400091E02830310509F090E02091E8002E7700 +:100A50002093E800CBCF81918093F1006150710920 +:100A60002F5F3F4FE7CF80910903882341F0853006 +:100A700041F08091E80083FFBECF81E0089582E0DD +:100A8000089583E00895089508958091E6020895F9 +:100A90009C014FB7F8948091DB029091DC02A09109 +:100AA000DD02B091DE024FBF821B930B08952FB77A +:100AB000F8948091DB029091DC02A091DD02B0916C +:100AC000DE022FBF08952091D8023091D902281755 +:100AD000390771F09093D9028093D802E091D60241 +:100AE000F091D702309721F00084F185E02D099430 +:100AF00008952091D4023091D5022817390771F05A +:100B00009093D5028093D402E091D602F091D7025F +:100B1000309721F00680F781E02D09940895E09147 +:100B2000D602F091D702309721F00190F081E02DAC +:100B3000099480E00895DC016091CC028091CD029F +:100B4000962F891301C00895292F30E0F901EE0F87 +:100B5000FF1FEC53FD4F408151814A175B07A1F401 +:100B600087E08A9FA0018B9F500D1124435E5E4F4A +:100B700081E0FA0184839613E6CF2F5F3F4F237005 +:100B800033272093CC0208952F5F3F4F922F93700D +:100B9000D8CF1092610210926002809122018111DF +:100BA00004C010922101109223018091290181112A +:100BB00004C01092280110922A010895FA018111AF +:100BC00001C0FB01099480917B03982F9E7F61F403 +:100BD0008170826080937B0380917E03893C18F052 +:100BE00088EC80937E0308958A34B0F38170886422 +:100BF000F1CFAF92BF92DF92EF92FF920F931F93CC +:100C0000CF93DF93182F062FE901493C08F048ECF9 +:100C1000E42FF0E0E75BFD4F011110C0E4915E2F7F +:100C20004E2F4983E8835A83DF91CF911F910F9113 +:100C3000FF90EF90DF90BF90AF900895202F30E0AD +:100C40004491D42EE42EF12C56E0159FC0011124BE +:100C5000EFEFF0E0BF010E947A2C812F90E0880F27 +:100C6000991F55E5569FD001579FB00D11248A1B3F +:100C70009B0B982F990F890F5F01A21AB30AAE9CA4 +:100C8000D001AF9CB00DBE9CB00D11245B2F089F0E +:100C900080011124012F11275F01A01AB10AAE9C17 +:100CA0008001AF9C100DBE9C100D11245F01A81A8D +:100CB000B108A29EC001A39E900DB29E900D11247A +:100CC000892F9927E81BF90BEE9DC001EF9D900D30 +:100CD000FE9D900D1124E92F62307105A1F050F4B2 +:100CE0006115710509F49DCF6130710581F0EB2F1D +:100CF000512F97CF6430710569F080F0663071052F +:100D000009F48FCFF4CFE42F4B2F592F8ACFE42F44 +:100D1000412F87CFEB2F542F492F83CF4B2F5D2DA2 +:100D2000E12F7FCF80E00895F894E82FE295EF70EF +:100D3000F0E031A1282F2F7081E090E001C0880FF2 +:100D40002A95EAF7982F9095932391A392A1892B46 +:100D500082A3789408959091DF0292FF06C0282F15 +:100D600028712830F9F4877F846093FF06C0282F0C +:100D700028712831F1F4877E84612091E00220FF00 +:100D800006C0382F38713830D9F4877F816021FF51 +:100D900006C0282F28712831D1F4877E816194FD07 +:100DA000877E0895282F24712430F9F68B7F886080 +:100DB000DCCF282F2471243101F78B7E8861DDCFB1 +:100DC000382F3171313019F78E7F8860E0CF282FAE +:100DD0002171213121F78E7E8861E1CFCF93DF939E +:100DE000EC0182389105A9F1D8F58133910509F418 +:100DF00096C048F58932910509F48AC08A9709F4AA +:100E000095C0C11522E5D20708F0B6C0C11531E57D +:100E1000D30708F026C1C83ED10508F09CC0C03EEB +:100E2000D10560F5C83AD10508F087C0C53AD105AB +:100E300008F0EFC0C130D10509F12097F9F0C430B6 +:100E4000D105E0F440C08533910509F45AC0C99733 +:100E5000C1F68091DF02837089F0C0EED0E00EC051 +:100E6000833E910599F170F4803E910501F1823E37 +:100E7000910539F68091DF0282FD21C0CE01DF911C +:100E8000CF910895863E910561F1873E910571F1FC +:100E9000843E910509F0B5CF8091E00281FFEECF4D +:100EA0008091DF02C7EED0E084FD0DC0E7CF8091D6 +:100EB000DF0280FD07C19091E00290FFDFCFC3EE1B +:100EC000D0E084FFDBCFD0E0C0E0D8CF8091DF025C +:100ED00082FDFBC09091E00290FDBFCF84FFCECF9A +:100EE000F2CF8091DF0283FDDDCFC8CF8091DF029A +:100EF00083FDEEC09091E00291FFF0CFC4EED0E010 +:100F0000BDCF8091DF0285FFB9CFC9E2D0E0B6CF77 +:100F10008091DF0285FFB2CFC5E3D0E0AFCF8091F3 +:100F2000DF0286FFABCFCAE2D0E0A8CF8091DF021C +:100F300086FFA4CFC1E3D0E0A1CFCF3BD10518F607 +:100F4000C85AD0E0CC0FDD1FCA5BDE4F0990D881B4 +:100F5000C02DD46493CFC11540E5D40708F064C018 +:100F6000C11580E4D80708F05CC0CE019A958115C0 +:100F70009F4108F483CFA7CFC11536E5D30718F5F5 +:100F8000C11545E5D40708F084C0C11584E5D8072C +:100F900008F07AC09C2F969596959E012370332772 +:100FA000C115D34508F462C0C1E0D0E002C0CC0F47 +:100FB000DD1F2A95E2F730E2939FC0011124C82B70 +:100FC000D92BDA685BCFC1158AE5D80778F4C1154B +:100FD00099E5D90708F068C0C11528E5D20708F4DB +:100FE00072CFDC2FCC27C06FD06A48CFCE0190568D +:100FF0008115904208F067CF8D2F8F710E94AB064C +:1010000090E0982F882788279F719C012C2BE9015D +:1010100049C0C55AD0E0CD5BDE4FC881D0E0D06476 +:101020002DCFDF70D06A2ACFCE01E4E09695879568 +:10103000EA95E1F783702C2F26952695237040E2E0 +:10104000249F90011124382B8C2F8370C1E0D0E0B5 +:1010500002C0CC0FDD1F8A95E2F7C22BD32BDC68D0 +:101060000DCFDC2FCC27C16FD06A08CFC1E0D0E014 +:1010700002C0CC0FDD1F2A95E2F720E2929FC0014B +:101080001124C82BD92BEBCFDC2FCC27C46FD06A0F +:10109000F5CE8C2F0E94AB06C82FD0E0DC2FCC27DA +:1010A000CC27DF71D062EACE8C2F8F700E94AB0606 +:1010B00034E0D695C7953A95E1F7CF709C2FEC01B7 +:1010C000D069DCCEC9E3D0E0D9CEC2EED0E0D6CE36 +:1010D000C6EED0E0D3CE8091310281111092310260 +:1010E000089580959091D30298239093D302089508 +:1010F0008091D3029091D202892B90913002892B5A +:101100008093B401909131029923A1F0892B8093AF +:10111000B40180914201882341F18091DF0287FF71 +:1011200024C08EE1E6EBF1E090E0815000F59111F2 +:101130000E946B08E091D602F091D7023097E1F05F +:1011400080914201882359F08091DF0287FF07C018 +:101150008091B4018093B50185E08093B401028051 +:10116000F381E02D84EB91E0099486E0DBCF2191BF +:101170002223D9F29F5FD9CF0895CF93DF93EC015B +:1011800081E0898B8091D3029F81892B8093D30248 +:101190008091D2029885892B8093D2020E94780890 +:1011A000EA81FB81309739F06C897D89CE01069602 +:1011B000DF91CF910994DF91CF910895EF92FF9243 +:1011C0000F931F93CF93DF93EC018A85811139C070 +:1011D000EB80FC8087E5F81A26E12E9DC0012F9D4B +:1011E000900D1124DC01A45DBE4F1496ED91FC918D +:1011F0001597309731F054966D917C918E5C9E4F8F +:10120000099586E18E9D80018F9D100D1124045D4E +:101210001E4FF80187810E947108F8018085982F80 +:1012200090958091D20289238093D2020E947808FF +:10123000188219861B861E821D821092D10210927E +:10124000D002DF91CF911F910F91FF90EF90089501 +:10125000909142019923D1F09091DF0297FF16C03F +:10126000E82FE695E695E695EE31E0F4F0E0EC54F3 +:10127000FE4F282F277081E090E001C0880F2A954B +:10128000EAF780959281892382830895E6EBF1E065 +:101290009191891303C0DF0111971C9291E0EC3BFF +:1012A000F907B1F70895909142019923C1F0909107 +:1012B000DF0297FF14C0E82FE695E695E695EE313C +:1012C000F8F4F0E0EC54FE4F877021E030E001C00C +:1012D000220F8A95EAF78281822B82830895A6EBFA +:1012E000B1E0EFEF90E02D91821751F0EF3F19F44C +:1012F000211101C0E92F9F5F9630A9F7EF3F09F454 +:1013000008950E2E000CFF0BEC54FE4FE6CF80919B +:101310002E029091ED01981301C008958F5F8770A0 +:10132000FACF990F990F890F982F97708695869508 +:10133000869524E0829FF0011124E752FE4F50E091 +:1013400040E080E0219130E0092E02C036952795DB +:101350000A94E2F721703327042E01C0220F0A9469 +:10136000EAF7822B4F5F5F4F4430510559F70895DC +:10137000990F990F890F982F977041E001C0440F82 +:101380009A95EAF786958695869594E0899FF0016F +:101390001124E752FE4F30E020E070E05191DF0170 +:1013A0001197CB01022E02C0969587950A94E2F719 +:1013B000817081958527842385278C932F5F3F4FEC +:1013C0002430310559F7089590E080E00E947905B6 +:1013D00090E080E00E9463051092D20210923002E9 +:1013E0000C94780890933302809332020C94E409B1 +:1013F000882341F080959091D20289238093D20274 +:101400000C9478080895882339F09091D202982B93 +:101410009093D2020C9478080895882321F00E94BA +:1014200071080C9478080895882339F09091D302BC +:10143000982B9093D3020C9478080895882309F48C +:101440004BC0823871F40E948F0581FF45C089E34B +:101450000E9453090E94780889E30E9428090C948D +:101460007808833859F40E948F0580FF35C083E5E2 +:101470000E9453090E94780883E5EFCF843859F41D +:101480000E948F0582FF28C087E40E9453090E94B2 +:10149000780887E4E2CF9CEF980F913AF0F290E25F +:1014A000980F983050F4877091E001C0990F8A9599 +:1014B000EAF7892F0E947108D2CF9BE5980F9330ED +:1014C00020F490E080E00C947905885A873120F46C +:1014D00090E080E00C946305089580FD02C0769A48 +:1014E0000895769808959C013A9521153F4150F54D +:1014F000FC01EE27F170BC0166277270AC01442735 +:1015000054709C012227387094FF0EC080E1EF2BAD +:1015100009F480E0672B09F08062452B09F08064B4 +:10152000232B89F08068089581E0EF2B09F480E097 +:10153000672B09F08260452B09F08460232B19F09A +:101540008860089580E00895CF93DF93EC010E94B6 +:101550001E0ACE010E94730A9E01205E31092830C6 +:10156000310510F0CD2B21F4DF91CF910C940D0AB1 +:10157000DF91CF910C94F809FC018081813029F42E +:10158000FB01808191810C94A40A823021F4FB013B +:1015900082819381F8CF089590910903943029F5C1 +:1015A0008093E1027093E3026093E2029093E9007A +:1015B0008FEF9091E800815095FD06C095ED9A95CA +:1015C000F1F700008111F5CF8091E80085FF0DC093 +:1015D00050E040E063E070E081EE92E00E94090498 +:1015E0008091E8008E778093E8000895BC0184E044 +:1015F0000C94CC0ABC0183E00C94CC0ACF93DF930B +:10160000EC01809142018823B1F18091DF0287FFD4 +:1016100032C060E284E08093E9008FEF9091E800AF +:10162000815095FD06C095ED9A95F1F70000811166 +:10163000F5CF8091E80085FF1BC08091420170E0EA +:1016400050E040E0811104C050E040E068E070E00C +:10165000CE010E9409048091E8008E778093E80013 +:1016600080E2FE01A7EEB2E001900D928A95E1F7CB +:10167000DF91CF91089568E081E0CDCF81E0809344 +:10168000E00080E28093D8001092C9008FE19EE4D0 +:101690000197F1F700C0000087E090EBDC01809338 +:1016A000800390938103A0938203B093830388E126 +:1016B0009CE00FB6F894A895809360000FBE9093BD +:1016C0006000FFCFAF92BF92CF92DF92EF921F9355 +:1016D000CF93DF93CDB7DEB7C356D1090FB6F894D9 +:1016E000DEBF0FBECDBF80917B0380FD0AC0E8E165 +:1016F000F3E0118210821282339683E0EB37F80711 +:10170000C1F77EE4A72E73E0B72EDE011196AE017D +:101710004C595F4F1A2F7B2FF5018491282F30E011 +:10172000C901880F991F820F931F885E9C4FFC018F +:10173000C080D180E280CD92DD92ED92FFEFAF1AB2 +:10174000BF0AA417B50741F7209A35B13E7F25B1EE +:1017500021606FB7F894812F972FFC017191CF0111 +:10176000E8E025B9000000C077FF35B9770F000029 +:1017700000C000C000C035B900C0EA9591F78417D9 +:10178000950759F76FBF8FE594E00197F1F700C017 +:101790000000CD59DF4F0FB6F894DEBF0FBECDBFAE +:1017A000DF91CF911F91EF90DF90CF90BF90AF90DE +:1017B00008951F93CF93DF9300D00F92CDB7DEB77C +:1017C000142F90917B0390FF1AC09E012F5F3F4F13 +:1017D000462F6FEF0E94F905113289F08B819981B4 +:1017E000412F50E0FA01EE0FFF1FE40FF51FE85EF6 +:1017F000FC4F2A812183908382830E94620B0F9089 +:101800000F900F90DF91CF911F910895EF92FF926B +:101810000F931F93CF93DF937C018F2D90E0C8E04F +:10182000009711F4C701C0E09C0154E0369527955C +:101830005A95E1F72115310511F0CC5FC9019C01E2 +:1018400036952795369527952115310511F0CE5FF0 +:10185000C90196958795892B09F0CF5FC23009F4AD +:101860008AC068F4CC23B1F1C13009F45BC0C70170 +:10187000DF91CF911F910F91FF90EF900895C330AA +:1018800009F4AEC0C43099F7CEE1D0E08C2F4C2FD4 +:101890004E51D093D501C093D401942F9B7F9130AA +:1018A00089F0942F9E7E9A3069F093ED9C0F9230D0 +:1018B00048F09DEC9C0F923028F094EC9C0F9330F4 +:1018C00008F0B7C06CE80E94D90B2196CF33D10540 +:1018D000E9F6CDCF08E310E01093D5010093D401D1 +:1018E000802F9C2F9B7F913081F09C2F9E7E9A3081 +:1018F00061F091EF9C0F923040F09BEE9C0F923084 +:1019000020F092EE9C0F933050F44C2F6CE80E9424 +:10191000D90BCF5F0E5F1F4FC132F1F6A8CF4C2F0E +:1019200060E5F5CF0FE010E0C0E01093D501009323 +:10193000D401802F9C2F9B7F913081F09C2F9E7E25 +:101940009A3061F091EF9C0F923040F09BEE9C0F2B +:10195000923020F092EE9C0F933050F44C2F6CE8B4 +:101960000E94D90BCF5F0E5F1F4FC132F1F67FCFC0 +:101970004C2F60E5F5CF0CED10E0C0E00F3F1105F6 +:1019800009F030F51093D5010093D4018091D40172 +:101990009C2F9B7F913091F09C2F9E7E9A3071F00E +:1019A00091EF9C0F923050F09BEE9C0F923030F0F4 +:1019B00092EE9C0F4C2F60E5933010F44C2F6CE8A6 +:1019C0000E94D90BCF5F0E5F1F4FC132B9F64FCFC8 +:1019D000C8018F5F91099093D5018093D401D6CF30 +:1019E00007E810E0C0E01093D5010093D401802FE8 +:1019F0009C2F9B7F913081F09C2F9E7E9A3061F0CE +:101A000091EF9C0F923040F09BEE9C0F923020F0B3 +:101A100092EE9C0F933050F44C2F6CE80E94D90B3F +:101A2000CF5F0E5F1F4FC132F1F621CF4C2F60E523 +:101A3000F5CF60E548CF0E94060C90931403809385 +:101A400013030C94E40980911303909114039C01F7 +:101A5000267033272630310519F488600C941B0D4D +:101A6000877FFCCF21E030E002C0220F331F8A9530 +:101A7000E2F720953095809113039091140382230F +:101A800093230C941B0D90912F02809589238093B2 +:101A90002F02282F277039F4282F082E000C330B23 +:101AA0009217130621F49091E00292FF07C08595EA +:101AB000859585950E94320D10922F02089521E0A0 +:101AC00030E002C0220F331F8A95E2F780911303A2 +:101AD00090911403822B932B0C941B0DEF92FF9289 +:101AE0000F931F93CF93DF938C01C8E1D3E0F12CC8 +:101AF000E12CF801948160917D0380917C03F0E1F9 +:101B0000EF16F104FCF49923F9F09E0140917E0355 +:101B10000E94F9052FEFE21AF20A239681E2E816F5 +:101B2000F10439F70E94620BF801848190E001967C +:101B3000817099278483DF91CF911F910F91FF903E +:101B4000EF900895992309F39E0140E0E1CF8F9231 +:101B50009F92AF92BF92CF92DF92EF92FF920F933C +:101B60001F93CF93DF93EC014C81042F10E0980179 +:101B7000D8010E94D92C9B01AC010E94EF2C4B0193 +:101B80005C01E0E2F0E0E01BF10BA5E5B0E0AC01A8 +:101B90009B010E94EF2C6B017C019F01DF010E94E1 +:101BA000D12C9B01AC010E94FA2C9B01AC01280DA9 +:101BB000391D4A1D5B1DC701B6010E94A22CF22EE1 +:101BC000822F90E039E23F15D8F143E0249F900145 +:101BD000112435952795122F109598E1C92E93E081 +:101BE000D92E00E085E5E82EEF188E2D01FD8F2D12 +:101BF0009601412F60917D030E94F9050F5F53E02C +:101C0000C50ED11C013289F70E94620B9C8181E0D4 +:101C1000992319F0903219F48FEF80931C01809171 +:101C20001C01890F8C83DF91CF911F910F91FF9041 +:101C3000EF90DF90CF90BF90AF909F908F900895DE +:101C400025E530E0A901481B590BCA019A01220F72 +:101C5000331F280F391F37FFBCCF2F5F3F4FB9CF3E +:101C60000F931F93CF93DF93C8E1D3E0FE0111825E +:101C700010821282339683E0EB37F807C1F710E049 +:101C800000E080915E02082E000C990B08171907DE +:101C90008CF180911B01082E000C990B8017910785 +:101CA0004CF19E0140917E0360917D0380917C0305 +:101CB0000E94F9050F5F1F4F23960132110509F7A6 +:101CC0000E94620B80911A0190915E02980F90938E +:101CD0005E0220911B01280F20931B01121614F4A1 +:101CE00090321CF0819580931A01DF91CF911F9162 +:101CF0000F910895198218821A82DCCFBF92CF9279 +:101D0000DF92EF92FF920F931F93CF93DF93FC012B +:101D10008281DD24DA9480FD02C0DD24D39408E1C1 +:101D200013E0D0E0C0E021E2B22EF801118210826F +:101D3000128294E0E92EF12CC12C80915D028C0D71 +:101D400082320CF43DC06B2D0E946C2C892F082E22 +:101D5000000C990B8C179D0791F480917E038E9D4A +:101D6000A0018F9D500D1124559547955595479588 +:101D7000980160917D0380917C030E94F905CD0C50 +:101D8000F1E0EF1AF108C9F621960D5F1F4FC1323D +:101D9000D10559F60E94620B80915D0291E0D91243 +:101DA00015C0811111C080E280935D02DF91CF9157 +:101DB0001F910F91FF90EF90DF90CF90BF9008950B +:101DC00087FFC5CF8F5DC3CF8150EECF90E00196E6 +:101DD000BE010E948E2CE8CFEF92FF921F93CF930B +:101DE000DF93EC0188E1E82E83E0F82E10E08C818F +:101DF000970140917E0360917D03810F0E94F90558 +:101E0000195F83E0E80EF11C173E89F70E94620B10 +:101E10009A818C8190FF08C08F5F8C83DF91CF9176 +:101E20001F91FF90EF9008958150F7CF90917B0321 +:101E300090FF0CC0E8E1F3E0818360834283339636 +:101E400093E0EB37F907C1F70C94620B08950F93F9 +:101E50001F93CF93DF9300D00F92CDB7DEB78C01E5 +:101E600080915F0281110AC09E012F5F3F4F48ECB5 +:101E70006FEF0E94F9058A8180935F02F801648107 +:101E8000613069F080915F0240E0662361F040E0DC +:101E9000623011F440915F0280E060E004C0609124 +:101EA0005F0240E080E00E94160FF801848190E01C +:101EB000019663E070E00E948E2C84830F900F9057 +:101EC0000F90DF91CF911F910F910895CF93DF93E2 +:101ED00000D00F92CDB7DEB790917B0390FF0AC080 +:101EE0009E012F5F3F4F0E94F9054B8169818A81D6 +:101EF0000E94160F0F900F900F90DF91CF910895D1 +:101F0000CF93DF93EC01EBE7F3E0438162818C81B7 +:101F10000E94660F8C818F5F8C83DF91CF91089533 +:101F2000CF93DF93EC01EC81F0E0E259FC4F449158 +:101F3000EBE7F3E0628181810E94660F8C818F5F05 +:101F40008C83DF91CF910895CF93C82F882309F414 +:101F5000A6C08238C1F40E948F0581FDA0C089E32C +:101F60000E9453090E9478082FEF81EE94E02150DF +:101F700080409040E1F700C0000089E30E942809FA +:101F8000CF910C9478088338A1F40E948F0580FDCE +:101F900086C083E50E9453090E9478082FEF81EEE6 +:101FA00094E0215080409040E1F700C0000083E5BC +:101FB000E5CF8438A1F40E948F0582FD70C087E4CC +:101FC0000E9453090E9478082FEF81EE94E021507F +:101FD00080409040E1F700C0000087E4CFCF8CEF55 +:101FE0008C0F813A88F580914201882301F180911C +:101FF000DF0287FF1CC0EC2FE695E695E695F0E042 +:10200000EC54FE4F828190E04C2F477021E030E08D +:1020100002C0220F331F4A95E2F782239323892BB4 +:1020200079F08C2F0E9428090E94780809C0E6EBFD +:10203000F1E08191C817A9F321E0EC3BF207C9F761 +:102040008C2F0E9453099CCF80E28C0F883068F45B +:10205000C77021E030E001C0220FCA95EAF78091F5 +:10206000D302822B8093D3028BCFEBE5EC0FE330CE +:1020700040F4F0E0ED5BFE4F808190E0CF910C9456 +:102080007905C85AC73158F4EC2FF0E0EE0FFF1F66 +:10209000EA5BFE4F80819181CF910C946305CF91D3 +:1020A00008951F93CF93DF93182FD0E0C0E08933BA +:1020B00011F4C0E5D0E0812F0E94A40F209731F4E5 +:1020C000812FDF91CF911F910C941E0A8FE99FE021 +:1020D0000197F1F700C000002197F0CF0F931F93F5 +:1020E000CF93DF93C62FD42F022FFC018281882348 +:1020F000A1F0609317030E945705909316038093F5 +:102100001503C77081E001C0880FCA95EAF7DF9117 +:10211000CF911F910F910C94140A809117036813AB +:1021200035C080911503909116030E944805883CA4 +:10213000910560F510E21D0FCD17B9F080E28C0F0C +:10214000883040F4C77081E001C0880FCA95EAF773 +:102150000E940D0A183048F481E09D2F977001C04D +:10216000880F9A95EAF70E94140A802F0E94511056 +:10217000183098F4D77081E001C0880FDA95EAF73B +:10218000DF91CF911F910F910C940D0AC77081E0E0 +:1021900001C0880FCA95EAF7F3CFDF91CF911F9165 +:1021A0000F910895DF92EF92FF920F931F93CF93B9 +:1021B000DF93E82FF0E0E954FE4FD490282F2695C6 +:1021C0002695269530E0F901E955FE4F0491877078 +:1021D00010E0082E02C0159507950A94E2F70170E9 +:1021E0001127F901E956FE4FE490F12C082E02C0A8 +:1021F000F594E7940A94E2F791E0E922FF24F901CB +:10220000E957FE4FC491D0E002C0D595C7958A9595 +:10221000E2F7C170DD270115110519F081EE0E946A +:10222000A40FE114F10419F086EE0E94A40F8D2D85 +:102230000E945110EF2819F086EE0E941E0A012B11 +:1022400019F081EE0E941E0ACD2B51F08CE2DF9135 +:10225000CF911F910F91FF90EF90DF900C94511050 +:10226000DF91CF911F910F91FF90EF90DF90089534 +:10227000CF93DF93EC010E94730A9E01205E310927 +:102280002830310510F0209739F40E94140A8C2F61 +:10229000DF91CF910C94A40F0E94030AF8CFFC01A8 +:1022A0008081813029F4FB01808191810C94381167 +:1022B000823021F4FB0182819381F8CF0895CF937E +:1022C000DF93EC018881823039F4FB0182819381B4 +:1022D0000E94381181E08B87DF91CF910895CF93D1 +:1022E000DF93C7E0D2E060E0CE010E94222D21966C +:1022F000C11584E0D807B9F7DF91CF9108956F92A7 +:102300007F928F929F92AF92BF92CF92DF92EF9285 +:10231000FF920F931F93CF93DF938EE6C82E84E036 +:10232000D82E0FE510E0E801E09736011CC0F5015A +:1023300085909490692DC7010E94222D682DC701B8 +:1023400001960E94222D82E0A80EB11C82E0E80EC8 +:10235000F11CCE15DF0559F788E0680E711C289630 +:102360000C171D0731F07E0188E0E81AF1085301CF +:10237000DECF005D1F4F80E3C80ED11C0F3382E01B +:10238000180789F6DF91CF911F910F91FF90EF9081 +:10239000DF90CF90BF90AF909F908F907F906F9085 +:1023A0000895CF93C82F6FEF811161E283E290E02F +:1023B0000E94222DC1110CC0CFEF6C2F84E290E05F +:1023C0000E94222D6C2F85E290E0CF910C94222D5B +:1023D000C9E0F3CF80E00E94D11160E086E290E096 +:1023E0000E94222D0E947F110E946F1181E00C94A7 +:1023F000D111CF93C091E002C2FB992790F99817B1 +:1024000081F080FBC2F9C093E0026091DF0284E0BA +:1024100090E00E94222D6C2F82E290E0CF910C94EC +:10242000222DCF9108950F931F93CF93DF9328E030 +:10243000629FE001112450E0440F551FC40FD51FC7 +:1024400030E3839FC00DD11D1124CE0187960E94D9 +:102450000E2D082F10E0102F0027CE0188960E9425 +:102460000E2D9801282BC901DF91CF911F910F915B +:102470000895462F8A3038F4763028F4643018F402 +:10248000672F0C94131290E080E00895BF92CF92D2 +:10249000DF92EF92FF920F931F93CF93DF937C0114 +:1024A0000091130310911403809132029091330232 +:1024B000082B192BCFE0D0E0CC24C394D12CBC2E18 +:1024C000C6010C2E02C0880F991F0A94E2F78023E0 +:1024D0009123892B71F4219790F7B12C8B2DDF91EB +:1024E000CF911F910F91FF90EF90DF90CF90BF9011 +:1024F0000895B7018C2F0E9439120E94EE060197B1 +:1025000051F3ECCFCF93DF93EC010E944612BE0152 +:102510000E943912DF91CF910C94EE06FC01868166 +:102520009781009779F00E94EE06292F2F709295DF +:102530009F7092509E30A0F4E92FF0E0EE58F24DDB +:102540000C94C42C808191810E948212EECF803F36 +:1025500019F020F4883E20F481E00895843FE1F3EF +:1025600080E00895883EC0F3813FD1F7F5CF822FF8 +:1025700086958695869508951F93CF93DF9300D017 +:1025800000D00F92CDB7DEB7FC012681378121152F +:10259000310541F525E0DE01119601900D922A9555 +:1025A000E1F7FC01228189819A812223B9F0662317 +:1025B000A9F00E944612182F682F89819A810E94E3 +:1025C000B80969817A81812F0F900F900F900F9039 +:1025D0000F90DF91CF911F910C9439120E949109B5 +:1025E000182FEFCFC9010F900F900F900F900F9001 +:1025F000DF91CF911F91089583E290E00E940E2D0C +:10260000813289F484E290E00E940E2D893059F4E1 +:1026100085E290E00E940E2D91E0893009F090E073 +:10262000892F8170089580E0FCCFCF9384E090E003 +:102630000E940E2DC82F82E290E00E940E2D982F4E +:102640008C2FCF91089560917B03669570E04BE0ED +:1026500050E08FE091E00E94562D892B19F481E023 +:1026600080935C020E945705909356028093550216 +:102670000895CF92DF92EF92FF926B017C010E944E +:10268000E305B701A60188E090E0FF90EF90DF90AE +:10269000CF900C94342D5F926F927F928F929F9285 +:1026A000AF92BF92CF92DF92EF92FF920F931F9360 +:1026B000CF93DF9300D00F92CDB7DEB7182F762ED1 +:1026C000042F622E90917B0390FF29C0E92FE6959D +:1026D000AE2FB0E0A258BE4F8C9180935B029E7FDC +:1026E000923081F59E012F5F3F4F812F0E94F905A7 +:1026F0004B8169818A810E94160F10937C0370922E +:102700007D0300937E03662051F060917B037091FE +:102710007C0380917D0390917E030E9439130F907A +:102720000F900F90DF91CF911F910F91FF90EF903D +:10273000DF90CF90BF90AF909F908F907F906F90E1 +:102740005F900895823019F400917E03D6CF8630D1 +:1027500019F410917C03D1CF8930D9F3893169F60E +:10276000E9518E2F8170582EE695F0E0E75BFC4F23 +:10277000A590B490BB2488E1E82E83E0F82ED12CFC +:10278000C12C91E2892E912CC601B4010E947A2CB1 +:10279000812F511013C0860F9701402F672D0E9483 +:1027A000F905CA0CDB1C83E0E80EF11C8BE7E81688 +:1027B00083E0F80649F70E94620B9FCF861BECCF9F +:1027C000EBE7F3E0438128E0421B08F440E021E01E +:1027D000628181810C944B13EBE7F3E0438128E0A5 +:1027E000420F08F44FEF21E0628181810C944B137A +:1027F000EBE7F3E0628128E0621B08F460E021E08F +:10280000438181810C944B13EBE7F3E0628128E074 +:10281000620F08F46FEF21E0438181810C944B1328 +:10282000EBE7F3E0818121E04381628188500C94E1 +:102830004B13EBE7F3E0818121E043816281885F04 +:102840000C944B1380917F03882319F0815080935F +:102850007F0360917B0370917C0380917D03909155 +:102860007E030C94391380917F03833018F48F5FBB +:1028700080937F0360917B0370917C0380917D0343 +:1028800090917E030C94391390917B0390FF36C096 +:102890009170811129C0926090937B03662351F05F +:1028A00060917B0370917C0380917D0390917E0306 +:1028B0000E94391360917B03669570E04BE050E015 +:1028C0008FE091E00E94562D892BA9F010925C02B6 +:1028D00081E08093580220E040917E0360917D0367 +:1028E00080917C030C944B13853210F09864D4CF04 +:1028F000880F982BD1CF0E942313EACF089580919F +:102900007B038695815009F484E261E00C944414C1 +:1029100080917B0386958F5F853208F081E061E0CE +:102920000C94441490917B0390FF07C096959817E0 +:1029300020F0961710F40C94881461E00C94441461 +:10294000EBE7F3E083E0808311828FEF828388E2FC +:102950008383148260817181828193810C94391305 +:1029600069EE7EEF90E080E00E94402D60E082E022 +:1029700090E00E94222D60E083E090E00E94222DF2 +:10298000109233021092320260E084E090E00E94E4 +:10299000222D60E082E290E00E94222D60E085E03E +:1029A00090E00E94222D60E086E090E00E94222DBF +:1029B0006FEF87E090E00E94222D40E050E0BA01E6 +:1029C00088E090E00E94342D60E08DE090E00E946D +:1029D000222D40E050E0BA0188E190E00E94342DC1 +:1029E00060E087E190E00E94222D40E050E0BA01D3 +:1029F0008CE190E00E94342D70E060E080E290E095 +:102A00000E94402D40E050E0BA0188E190E00E9431 +:102A1000342D80E00E94D1110E94EA1140E050E084 +:102A2000BA018FE090E00E94342D40E050E0BA01FE +:102A300083E190E00C94342D90E080E00E941C2D06 +:102A4000893E9E4F11F40C94FC1280E00895109280 +:102A5000D30280914201E6EBF1E0882359F08091A6 +:102A6000DF0287FF07C08EE1DF011D928A95E9F73B +:102A70000C94E40986E0F8CF1F93CF93DF93CDB792 +:102A8000DEB7AA970FB6F894DEBF0FBECDBF8BE0BE +:102A900093E02091F100DC012D93CD01B3E083316F +:102AA0009B07B9F780910C03833009F471C0B8F427 +:102AB000813009F448C0823009F4B2C08091E80046 +:102AC00083FF3AC180910B0390910C039A3008F078 +:102AD00033C1E92FF0E0E058F24D0C94C42C8A3059 +:102AE00009F48DC08B3009F470C0893039F78091BA +:102AF0000B03813219F780910F0390911003009717 +:102B000011F00297D9F68091E800877F8093E80062 +:102B10008091E80082FF37C09091F3008091F2002D +:102B2000029729F48091F1008B7F813021F480910C +:102B3000F1008093E6028091E8008B778093E800B3 +:102B40000E943304BBCF80910B03813A09F0B6CFCA +:102B50008091E800877F8093E80080910F03909137 +:102B60001003892B61F460E287EE92E070E00E942E +:102B7000E5048091E8008B778093E8009FCF60E0C8 +:102B800090E080E0F3CF809109038111C1CF96CF0F +:102B900080910B03813A09F091CF80910F039091BE +:102BA0001003892B09F08ACF8091E800877F8093FA +:102BB000E8008091E80080FFFCCF80914201809383 +:102BC000F1008091E8008E77B9CF80910B038132BC +:102BD00009F074CF80910F0390911003892B09F0B5 +:102BE0006DCF8091E800877F8093E8000E943304D6 +:102BF00080910D03809342010E9427155FCF809141 +:102C00000B03813209F05ACF8091E800877F8093CF +:102C1000E8000E94330480910E038093E5024ECFBA +:102C200080910B03813A09F049CF8091E800877FBA +:102C30008093E8008091E80080FFFCCF8091E5025E +:102C4000BECF803899F0823809F076C080910F03AA +:102C50008F70873008F070C08093E9008091EB009E +:102C600085FB882780F91092E90006C08091070350 +:102C700090910803911182609091E800977F909362 +:102C8000E8008093F1001092F1008091E8008E77C7 +:102C9000B5C1882309F4A2C1823009F04DC08091EA +:102CA0000D038111A6C180910F038F702FEF280FA4 +:102CB000263008F041C08093E9002091EB0020FF0E +:102CC00098C1933031F48091EB0080628093EB00E7 +:102CD00090C19091EB0090619093EB0021E030E087 +:102CE00001C0220F8A95EAF72093EA001092EA00C9 +:102CF0008091EB008860EACF81111EC010910D0316 +:102D00001F778091E3008078812B8093E30080918E +:102D1000E800877F8093E8000E9433048091E800F8 +:102D200080FFFCCF8091E30080688093E30082E025 +:102D3000111183E0809309038091E80083FF0AC0AA +:102D40008091E800877F8093E8008091EB008062AB +:102D50008093EB00AA960FB6F894DEBF0FBECDBFEE +:102D6000DF91CF911F9108958058823028F72091EC +:102D70000D0330910E032C3DE3E03E07A1F583E007 +:102D80008A838AE289834FB7F894DE01139620E0A4 +:102D90003EE051E2E32FF0E050935700E49120FF32 +:102DA00003C0E295EF703F5FEF708E2F90E0EA3046 +:102DB000C0F0C7968D939D932F5F243159F74FBF75 +:102DC0008091E800877F8093E8006AE270E0CE019E +:102DD00001960E94E5048091E8008B778093E800DB +:102DE000ABCFC096E7CF80910F0390911003432F94 +:102DF00055274330510509F44AC078F54130510553 +:102E000009F47AC08BE590E0EEE4F6E0423051053B +:102E100009F092CF2091E800277F2093E8002091CD +:102E20001103309112038217930708F49C0140E0CC +:102E30002115310509F065C0411163C08091E8009A +:102E400082FDC9CF80910903882329F2853019F2C8 +:102E50008091E80083FFF2CFBECF4132510509F4E3 +:102E60003CC04232510509F067CF8330910508F02C +:102E700063CFFC01EE0FFF1FEA55FE4F0190F0817A +:102E8000E02D8D559E4FDC018C9190E01AC03327C8 +:102E900021303105D1F02115310561F022303105A5 +:102EA00009F04ACFEBEBF6E0E4918E2F90E0EBEBEC +:102EB000F6E007C0EBEDF6E0E4918E2F90E0EBED4D +:102EC000F6E0009709F438CFA5CFE7ECF6E0E491FF +:102ED0008E2F90E0E7ECF6E0F4CF8330910508F018 +:102EE0002BCF880F991FFC01E455FE4F0190F08114 +:102EF000E02D89E090E08ECF82E190E0E9EAF6E013 +:102F000089CF80910903882309F465CF853009F4BE +:102F100062CF8091E80083FD5ECF8091E80082FD62 +:102F20008DCF8091E80080FF83CF9091F300809156 +:102F3000F2002115310519F08830910550F041E07B +:102F4000089709F040E08091E8008E778093E800D0 +:102F50006FCF44914093F100319621503109019691 +:102F6000E8CF803809F0E8CE8091E800877F809331 +:102F7000E80080910A038093F10087CE8111DCCEB6 +:102F800010910D03123008F0D7CE8091E800877FB2 +:102F90008093E80010930A030E943304112311F078 +:102FA00084E005C08091E30087FDFACF81E0809343 +:102FB000090342E061EC81E00E94520442E261ECCC +:102FC00084E00E94520442E261EC82E00E945204DA +:102FD00042E260EC83E00E945204AECE80910D0389 +:102FE000813009F0A9CE81E0933009F080E0809330 +:102FF00008031092E9008091E800877F8093E80041 +:103000000E94330499CE9F92AF92BF92CF92DF92EB +:10301000EF92FF920F931F93CF93DF9300D000D0D6 +:10302000CDB7DEB77C01DC0113968D919C9114978E +:10303000892B39F08C9111969C9189238F3F09F04F +:1030400040C60F900F900F900F90DF91CF911F917E +:103050000F91FF90EF90DF90CF90BF90AF909F9037 +:103060000895D60116968C9116978823E9F0199643 +:103070008D919C910817190739F48091D002909195 +:10308000D1020817190781F0F60197861487038784 +:103090008189811103C0C6010E94BD08C601069640 +:1030A0000E94DE081092D202FFEFAF1ABF0A26E19B +:1030B000C20ED11C1CC6980122513F45203131055A +:1030C00008F0DEC48FEF93E00E940E2D025167E0FE +:1030D000C62E62E0D62E882349F180912F02877098 +:1030E00009F4AFCFF7018281882309F4AACF82E0E7 +:1030F0000F900F900F900F90DF91CF911F910F9134 +:10310000FF90EF90DF90CF90BF90AF909F900C9486 +:10311000430DC11434E0D30601F3C6010E940E2D05 +:10312000811101C001508FEFC81AD80A0111F1CFE7 +:103130001C821B82BB24B3945AE0A52E86010F5F2C +:103140001F4FC6010E940E2D89831A82882329F2FF +:103150009FEF980F933020F58A83B98292E0C90ED1 +:10316000D11CC8010E940E2D8B83882309F4B5CF92 +:103170008E010F5F1F4FD8018C918823F9F28130A7 +:1031800009F046C011969C91119712968C9191303E +:1031900049F40E5F1F4F0E9451100F5F1F4FEBCF7E +:1031A0006801E6CF923029F40E5F1F4F0E94A40FF2 +:1031B000F4CF933029F40E5F1F4F0E941E0AEDCF0B +:1031C000943019F00F5F1F4FE8CF0E5F1F4F30E0B4 +:1031D00020E0B8016F5F7F4FF80141818053990B68 +:1031E0008A30910550F021503109B8F28FE99FE003 +:1031F0000197F1F700C00000F6CFA29EF001A39E58 +:10320000F00D11249C012E0F3F1F842F8B01E1CF65 +:103210000E94D210C2CF81E00E945F0D0E94230D58 +:103220005CCF81E00E94320DF9CF82E0F5CF882398 +:1032300069F180913902811106C081E080933902E1 +:1032400082EE0E94A40F0E9457059093380280934B +:1032500037028BE20E94A40F27C48823A1F080913B +:103260003902811106C081E08093390282EE0E940A +:10327000A40F0E945705909338028093370281EE85 +:103280000E94A40FE6CF81EE0E941E0A8BE20E94EC +:103290001E0A0AC4882309F455C4F60181898823CB +:1032A00009F450C4C5018E5C9E4F0E94DE084AC4DA +:1032B00082EE0E94A40F82C488E193E00E9438113C +:1032C00088E193E00E94A40A79C482EE0E94A40FD0 +:1032D00087E50E94511072C486EE0E94511088E169 +:1032E000F8CF895A85C482EE0E941E0A99C48CE2E6 +:1032F0000E9451108091D701882309F491C489E379 +:103300000E9451108DC488E2FBCF033FBCE51B0730 +:1033100039F188F4083DFCE51F07F1F0093D2CE583 +:10332000120751F1073D3CE5130709F07DC426E281 +:1033300041EE61EE0DC0053F8CE51807C9F0A0F025 +:1033400027E245EE66EE063FACE51A0709F06CC4CD +:10335000C7010E946E10C1CE27E245EE65EEF8CFA0 +:1033600026E241EE60EEF4CF27E245EE64EEF0CFC8 +:1033700026E241EE62EEECCF28E241E0EFCF809111 +:10338000DF02806106303CE5130709F487C008F4CA +:103390008CC08091DF02806281C08091DF028D7FCE +:1033A0000C309CE5190709F479C070F48091DF02B4 +:1033B0008C600A30BCE51B0709F470C008F481C0BA +:1033C0008091DF028E7F6AC08091DF02877F0E309E +:1033D000FCE51F0709F462C08091DF028B7F0F308C +:1033E0001C4508F45BC08091DF028F7E57C00B3F05 +:1033F0003CE5130709F45DC030F503319CE519077E +:1034000009F46DC078F40131BCE51B0709F463C011 +:1034100002311C4509F045C40E9427158091DF0246 +:103420008F773CC00531FCE51F0709F460C008F444 +:1034300074C08091E00281600A3F1C4509F031C4EC +:103440008093E0022EC40F3F8CE5180709F44BC0AF +:1034500088F48091E0028D7F0D3FACE51A0781F37F +:103460008091E0028E7F0E3F1C4550F38091E00278 +:103470008360E6CF0130EDE51E0709F457C008F47C +:1034800042C060E002301D4509F00BC48EE090E0C0 +:103490000E94222D06C48091DF0281608093DF02AA +:1034A00000C48091DF028460F9CF8091DF028860E0 +:1034B000F5CF8091E0028260C3CF8091DF0280640B +:1034C000EDCF0E9427158091DF028068E7CF8091C1 +:1034D000DF028F7DE3CF8091DF028F7BDFCF809192 +:1034E000DF02837FDBCF8091E0028C7FA9CF8091C8 +:1034F000DF0282FB992790F921E0922790FB82F965 +:1035000090FB83F9CBCF8091E002982F909591703A +:103510008E7F892B90FB81F993CF0E942715909184 +:10352000DF02892F97FB87F98058B8CF61E0AECFD3 +:103530008091D30206313CE5130709F0FCC38A7A77 +:1035400091E009F490E09093D801811106C089E2DE +:103550000E9453090E947808C0CD85E3F9CF85E326 +:10356000E7C380917B0380FF1BC08E7F80937B032A +:1035700060917B0370917C0380917D0390917E0329 +:103580000E94391310925C028FEF90E7A2E0815005 +:103590009040A040E1F700C000000E94620B9DCD6A +:1035A000816080937B0361E086950E94441495CDF1 +:1035B0004FE754E168E874E10E94DE058ECD48E8EB +:1035C00054E16FE774E1F8CF49E154E160E174E15F +:1035D000F3CF48EF53E164E074E1EECF40EE53E106 +:1035E0006CEE73E1E9CF4CEE53E160EE73E1E4CFB2 +:1035F00043E354E162E274E1DFCF61E081E0D5CFE3 +:1036000065E082E00E94921468CD68E086E0FACF1F +:1036100064E18FE0F7CF67E185E1F4CF62E289E111 +:10362000F1CF61E083E2C1CF0B353DE5130701F136 +:103630000C351D4509F0AAC38091E00282FB882762 +:1036400080F991E089270E94F911A0C30E942715F3 +:103650009FEFA4E3BCE09150A040B040E1F700C070 +:1036600000000E943E0B0E94B01437CD81E0EBCFEA +:1036700080E0E9CFF701828100811181882369F020 +:10368000C8010E944612D82E682FC8010E94B809AE +:10369000B8018D2D0E94391280C3C8010E94910982 +:1036A000D82EF6CFE12FEF70CE2E107F19F0C294F6 +:1036B00090EFC922DD20C9F0CC2069F080E2800FB4 +:1036C000883010F001110BC08091D302C82AC0923B +:1036D000D3020E947808802F0E94A40F16C0809108 +:1036E000D202C82AC092D202F4CF802F0E941E0AB2 +:1036F000CC2059F080E2800F883010F0011138C0E2 +:103700008C2D0E9471080E947808A92DA850BB0B2F +:10371000149720F40E948F050E946D0AAA20A9F038 +:1037200080912F0280FD11C0F70112828595859549 +:1037300085950E945F0DC7010E94031880912F029A +:103740008595859585950E94320D60E0C7010F90A3 +:103750000F900F900F90DF91CF911F910F91FF90DD +:10376000EF90DF90CF90BF90AF909F900C94BC12E1 +:10377000C0948091D202C822C092D202C4CFF12F4D +:10378000FF70BF2E107F103219F0B29480EFB82274 +:10379000002381F0013099F1DD20F1F1CC20A9F175 +:1037A000D70115968C91159780FF95CF8F70159640 +:1037B0008C932BC0DD20B1F0909131028B2D892BA1 +:1037C000C11003C00E94140AA0CF21E0C212FACF98 +:1037D0002091E00222FD99CF981709F496CF8093AB +:1037E000310293CFC11006C00E946B088B2D0E943E +:1037F0000D0A8BCF31E0C31609F487CFF5CFDD205A +:1038000031F085E08C1508F480CF8B2DDBCF94E070 +:103810009C1508F47ACFEACFCC2041F3093349F460 +:10382000BFEFE7EEF3E0B150E040F040E1F700C059 +:103830000000802F0E941E0A68CF812F86958695F2 +:10384000837061F0813009F060CFC8019370D110AE +:1038500002C090E080E00E94630557CFC8019370DA +:10386000D11002C090E080E00E9479054ECF812FF8 +:10387000837009F03FC0D11048CF402F4295469544 +:103880004770440F440F802F8F7090E0042E02C0C9 +:10389000880F991F0A94E2F730E020E004FF09C086 +:1038A0002FE030E002C0220F331F4A95E2F7209547 +:1038B0003095169516951370123099F078F4409162 +:1038C000320250913302113039F0822B932B842332 +:1038D00095230E94F20919CF842B952B822B932BD1 +:1038E000F8CF822B932B2091320230913302822722 +:1038F0009327EFCF8695DD2011F0812F81708823EB +:1039000009F403CF402F429546954770440F440F6A +:10391000802F8F7090E0042E02C0880F991F0A94A8 +:10392000E2F730E020E004FF09C02FE030E002C001 +:10393000220F331F4A95E2F720953095169516957C +:103940001370123099F078F44091130350911403DE +:10395000113039F0822B932B842395230E941B0D69 +:10396000D4CE842B952B822B932BF8CF822B932BA9 +:10397000209113033091140382279327EFCF1F70F8 +:10398000DD2029F0812F0E945F0D802F1BCF802F1B +:103990000E940D0A812F0E94320DB7CE023F09F41A +:1039A00041C060F4003F11F1013FA1F1DD2009F4B5 +:1039B00057C0C11090CE812F8F7131C0033FB9F134 +:1039C000043FA1F7DD2009F440C01F71812F0E9440 +:1039D0005F0D8091E00282FD07C0A8E01A9FC00140 +:1039E0001124836080932F02812F19C0DD2069F09C +:1039F00024E02C1508F489CE1F7181E090E002C00C +:103A0000880F991F1A95E2F7B3CF35E03C1508F4FB +:103A10007CCEF2CF812F8F71DD2009F4BCCF0E94C4 +:103A20005F0D73CE812F8F71DD20C9F3B4CF90E08D +:103A300080E0DD2009F492CF1F7181E090E002C0A8 +:103A4000880F991F1A95E2F789CF81E00E94430DF4 +:103A5000B1E0BC1508F059CE82E00E94430D55CE6E +:103A6000CC2059F0093309F0E4CEEFEFF7EE23E074 +:103A7000E150F0402040E1F7DACE812F8F718BCFFB +:103A80000031FFE51F0709F4C6CB01312FE512070E +:103A900009F4CBCB0038AFE51A0709F4C8CB0138DD +:103AA000BFE51B0709F4D9CBC80197558F3F910596 +:103AB00011F008F047C020910401022E000C330BD6 +:103AC0002817390714F480930401F701228136E1A5 +:103AD000389F5001399FB00C1124C501845D9E4F61 +:103AE0006C01DC0150962C935097928116968C9124 +:103AF0001697992309F4CECB1A961C930E93199717 +:103B00008F5F16968C930E945705F60196878587DE +:103B10008091310287838091D2029091D302892BC8 +:103B200080870190F081E02D309741F0D6015496C6 +:103B30006D917C91C5018E5C9E4F09951093D102C9 +:103B40000093D002D70112968C91882369F0C801A6 +:103B5000815E9C45059740F46FE1600F60933A02E7 +:103B60008CE090E00E94222D17FFCFCBF7018281DD +:103B7000882309F459C00E948F058695817080932F +:103B8000D70190913A02913029F4882319F089E302 +:103B90000E9451108091D3028093D6011092D302DB +:103BA00080913A02813009F487CB882309F480CBD5 +:103BB000823009F48ACB843009F48ECB8FE39CE900 +:103BC0000197F1F700C000005801E894B7F84CE005 +:103BD000C42ED12CC5010C2C02C0969587950A9451 +:103BE000E2F78F7096EF980F963008F47ACB805DED +:103BF0000E94D21094E0C91AD108ACEFCA16AFEFF8 +:103C0000DA0641F780913A02813009F470CB8823BB +:103C100009F469CB823009F466CB843009F473CBA4 +:103C20008091D6018093D302F7018281882309F421 +:103C300077C0109217030230FCE51F0708F478CC18 +:103C400006312CE5120730F0C8018A5F9C450997C0 +:103C500008F06ECC0E9415139093E0028093DF026F +:103C600000313CE5130709F432CC08F0C0CB083032 +:103C70009CE5190709F421CC08F08FCB0430BCE592 +:103C80001B0709F40ECC08F07ACB0230FCE51F07C5 +:103C900009F401CC8091DF02826003301C4509F4F5 +:103CA000FDCB6091DF021091E00284E090E00E9481 +:103CB000222D612F82E290E00E94222D0E94271582 +:103CC0000CCA61E0C7010E94BC128C01D701129698 +:103CD0008C918823A9F0809104018F3F89F07CE2C8 +:103CE000C72E71E0D72EB12CA12C992493948091EA +:103CF0000401082E000C990B8A159B050CF0B1C924 +:103D0000F70182818111D7C900313FE5130709F41A +:103D100088CA01319FE5190709F0BCCE82E082CA4A +:103D200006311C4599F58091D801811118CC89E2A2 +:103D30000E9428090FCC82720C3CECE51E0709F4A6 +:103D400057CC08F090C0063C2CE5120709F43CCC97 +:103D500008F065C0033C9CE5190709F429CC08F07C +:103D60004FC0023CBCE51B0709F4FBCB0A35BDE59F +:103D70001B0709F47BCC08F057CC0115FCE51F07A5 +:103D800009F464CC0E3D1C4509F46DCCD7011696A0 +:103D90008D919C91009709F46DCC0E94EE068C01E8 +:103DA000D7011296DC9012971596CC90C2943FE002 +:103DB000C32280912F028770A1F0AD2CDD2091F0FD +:103DC000812F807F803421F080E2800F883048F09E +:103DD00082E00E94430D80912F028770AA24A39451 +:103DE0008111A12C912E92942FE09222BBE0B91563 +:103DF00008F48BCCE92DF0E0E657F24D0C94C42C7E +:103E0000043CECE51E0709F4DACB40E154E169E13A +:103E100074E1053CFCE51F0709F4CECBA7CF093CB4 +:103E20002CE5120709F4DACB78F4073C9CE5190776 +:103E300009F4CFCB44E054E168EF73E1083CACE512 +:103E40001A0709F4B9CB92CF0A3CBCE51B0709F469 +:103E5000CACB42E254E163E374E10B3CECE51E079C +:103E600009F4AACB83CF013DFCE51F0709F4D0CBB1 +:103E7000A0F40E3C3CE5130709F4C2CB08F4BDCB1B +:103E80000F3C9CE5190709F4C0CB6EE089E0003DCA +:103E9000ACE51A0709F4B6CB69CF043DBCE51B07B6 +:103EA00009F4BCCB68F4023DFCE51F0709F4B3CB71 +:103EB00061E088E1033D2CE5120709F476CB56CF8B +:103EC000053D3CE5130709F4ACCB0D35100709F4AB +:103ED00004C94CCFCF93DF938091EA01807FA1F496 +:103EE0008091E701882381F080912E02D091ED012D +:103EF0006091E5017091E601A091E801B091E901BE +:103F0000C62FC723D81303C0DF91CF91089590E047 +:103F1000109711F0CF3F19F401968770F3CF9C01F1 +:103F200043E0220F331F4A95E1F7F901E251FE4FBA +:103F300041814713F1CF40814613EECF42814111B9 +:103F4000EBCF438154814A1B5B0B483C510520F762 +:103F50008091EA018F7080618093EA01F901ED5050 +:103F6000FE4F80818F708061808385EE91E00E949A +:103F70000318DF91CF910C948709AF92BF92CF9233 +:103F8000DF92EF92FF920F931F93CF93DF93CDB702 +:103F9000DEB765970FB6F894DEBF0FBECDBF8C01BC +:103FA00085E0F801DE01519601900D928A95E1F7C6 +:103FB000F801E28065EEA62E61E0B62E6091E80180 +:103FC0007091E9016115710509F468C19091E501ED +:103FD0004091E601892F84238F3F09F45FC120813E +:103FE0003181C380D480F090E701F601E61BF70B26 +:103FF000FF2009F41DC18091EA01582F507FE83C51 +:10400000F10508F0D0C0511181C0FE2C43132BC024 +:10401000921329C06091EB017091EC01F801468187 +:10402000578164177507F9F4E1101DC08F70806126 +:104030008093EA01C5010E9403188091EA01F8010A +:1040400085838F2D65960FB6F894DEBF0FBECDBF6A +:10405000DF91CF911F910F91FF90EF90DF90CF9064 +:10406000BF90AF900895CD2829F0822F83238F3FF2 +:1040700009F02FC180E0F82FF170DF2E80FF3CC0E7 +:1040800080912E024091ED01841315C0298B3A8B4B +:1040900089899A890E948212292F22952F702230B5 +:1040A000F8F0243020F59F70F9F0F8019581907FA9 +:1040B000D9F4D12C1FC090E0FC0153E0EE0FFF1F9C +:1040C0005A95E1F7E251FE4F5181351306C05081F8 +:1040D000251303C05281E5120FC001968770D4CF1B +:1040E0009F7011F0882329F3805E883010F3C80197 +:1040F0000E940318FD2CA5CFEE2009F4A2CF8091D9 +:10410000EA0181608093EA01F12C9BCF43131BC02D +:10411000921319C04091EB015091EC01F8012681F6 +:1041200037814217530779F4E1100DC08583C80128 +:104130000E94031888E0F801A5EEB1E001900D920D +:104140008A95E1F77ECFC8010E948E12882339F14B +:10415000EE2029F18091EA018032A0F02091E50162 +:104160003091E6013A8729871B86DD86CC868E87CB +:104170008091EB019091EC01988B8F87CE0109968D +:104180000E94031888E0F801A5EEB1E001900D92BD +:104190008A95E1F70E946A1FFF24F39452CFC80169 +:1041A0000E940318F9CF51110AC085EE91E00E94D8 +:1041B000031888E0F50111928A95E9F7A5CF43131A +:1041C00018C0921316C04091EB015091EC01F80118 +:1041D000268137814217530761F4E1100AC08583B5 +:1041E000C8010E94031888E0F50111928A95E9F749 +:1041F00028CFC8010E948E12882389F2EE2079F21E +:104200008091EA01803208F4BDCF2091E501309120 +:10421000E6013A8329831B82DD82CC828E838091E2 +:10422000EB019091EC0198878F83CE010196A8CF86 +:10423000E83CF105C0F6FE2CEE2009F4B0CF4313A4 +:104240001FC092131DC02091EB013091EC01F801C9 +:10425000868197812817390799F49091EA0190FD9A +:1042600069CF907F09F466CF8091EA018583903F02 +:1042700009F45DCF982F907F905F8F70892B56CF78 +:10428000C8010E948E1281117DCF8091EA01816068 +:104290008093EA01C8010E940318D3CEEE2009F4EE +:1042A0007ECFC8010E948E12F82E882309F477CFA2 +:1042B00088E0F801A5EEB1E001900D928A95E1F752 +:1042C0008091E5019091E6010E9482120E946A1F8E +:1042D000B8CE81E08E25CFCECF93DF93CDB7DEB7BA +:1042E00060970FB6F894DEBF0FBECDBF29873A871F +:1042F0004B875C876D877E878F87988BCE01099669 +:104300000E94BD1F811112C088E0FE013996DE01B6 +:10431000119601900D928A95E1F78C859D85892BE8 +:1043200029F089859A8589238F3FA9F580912E02EE +:104330009091ED0189131CC060960FB6F894DEBF12 +:104340000FBECDBFDF91CF91089593E0AA0FBB1FA1 +:104350009A95E1F7A251BE4F98E0FE013196019087 +:104360000D929A95E1F78093ED010E948709DECFC7 +:10437000B8E08B9FC001112482519E4F0E94BD1F47 +:104380008823D1F280912E0290E0019687709927C0 +:1043900080932E02CBCFA091ED01B0E0CD0101962C +:1043A0008770992720912E022817190671F60E940E +:1043B00027151092ED0110922E0288E0E5EEF1E053 +:1043C000DF011D928A95E9F7B1CF0F931F93CF9329 +:1043D000DF9380916302E0916202CCE081111AC008 +:1043E000DF91CF911F910F910895D1E0DE0FD0930F +:1043F00062020E2F10E0EC9FF0011124EC59FD4FEA +:1044000083819481892B29F08081918189238F3F39 +:1044100051F4ED2F80916302E81738F31092630294 +:1044200010926202DDCFC09FD001C19FB00D112458 +:10443000AC59BD4F16968D919C911797892B29F4F5 +:1044400018968D919C91019651F420813181428181 +:10445000538164817581868197810E946C21C09F00 +:10446000F001C19FF00D1124EC59FD4F148213820D +:10447000D0CF1092CF021092CE0210922B018091D9 +:10448000CD028093CC020E94C9050C94E5212F92A5 +:104490003F924F925F926F927F928F929F92AF92D4 +:1044A000BF92CF92DF92EF92FF920F931F93CF9321 +:1044B000DF93C091CC02E7E0FE2E01E010E0FCE0CB +:1044C0002F2EAEEFEA2E8091CD028C1316C00E94E3 +:1044D000E521DF91CF911F910F91FF90EF90DF9039 +:1044E000CF90BF90AF909F908F907F906F905F9094 +:1044F0004F903F902F900C94C905D0E0FE01EE0F35 +:10450000FF1FEC53FD4F80819181F89EF001F99ED1 +:10451000F00D1124E35EFE4F2481211158C030902C +:104520006302A4E6B2E030E020E0412C5F012315F5 +:1045300008F04BC01A966D907C901B97F501808017 +:1045400091804FEF5FEF512CC52CD12CF601EE0F6F +:10455000FF1FE80DF91D659174916616770609F441 +:10456000A601672B11F05394EFCF4F3F5407B1F1E1 +:10457000B80102C0660F771F4A95E2F7462AA801E4 +:1045800002C0440F551F5A94E2F741505109441696 +:10459000150601F5229EF001239EF00D1124EC5921 +:1045A000FD4FF89ED001F99EB00D1124A35EBE4FC1 +:1045B00012962D913C91139737832683E082E182F6 +:1045C0009187808771E015967C930E949B052196C8 +:1045D000C37079CF14961C921E9213972F5F3F4F92 +:1045E0001C96A5CFAF92BF92CF92DF92EF92FF922F +:1045F0000F931F93CF93DF9300D000D000D0CDB79F +:10460000DEB78E010F5F1F4F86E0D8011D928A959D +:10461000E9F724E7C22E21E0D22EF12CE12CAA24C6 +:10462000A394B12CF60181916F018F3F09F44BC027 +:10463000F894E82FE295EF70F0E021A18F70A501CA +:1046400002C0440F551F8A95E2F7CA01922F982B9A +:1046500091A392A18095892382A3789400C0C5017B +:104660000E2C01C0880F0A94EAF7382F282F2095C6 +:1046700068E771E0F801DB019D91BD0180819F3FFA +:1046800009F46BC0492F42954F7050E0DA019096C3 +:104690004C9150E09F7002C0559547959A95E2F76E +:1046A00040FD5BC0832B80833196B1E06E377B0782 +:1046B00011F7F601319780818F3F11F00E94940627 +:1046C000E0EAEA95F1F7FFEFEF1AFF0A24E0E216BD +:1046D000F10409F0A7CF46E050E0B8018EE392E084 +:1046E0000E94632DDD24D394009709F4D12C892BEB +:1046F000B1F186E0F801AEE3B2E001900D928A9547 +:10470000E1F781E0809336020E94570590933502CD +:104710008093340280913402909135020E944805C2 +:10472000059708F180913E0280934F0280913F02ED +:104730008093500280914002809351028091410207 +:1047400080935202809142028093530280914302EF +:10475000809354021092360206C08223A4CF809127 +:1047600036028111D7CF809104018F3F09F06AC0D2 +:1047700080912B0181116AC080913902882371F0E8 +:1047800080913702909138020E944805893E9340FB +:1047900028F082EE0E941E0A109239028D2D269674 +:1047A0000FB6F894DEBF0FBECDBFDF91CF911F9142 +:1047B0000F91FF90EF90DF90CF90BF90AF90089552 +:1047C000E29EF001E39EF00D1124E45DFE4FA2880D +:1047D000B388A114B10419F498ECA92EB12CE29E6F +:1047E0008001E39E100D1124045D1E4FD801169622 +:1047F0008C9116978823C9F01D968D919C910E94EB +:104800004805A816B90688F4FE9C50011124F80149 +:104810008189811105C0C501845D9E4F0E94BD083C +:10482000C5018E5C9E4F0E94DE08F3942F2D30E070 +:1048300080910401082E000C990B821793070CF04D +:10484000BFCF96CFF12C86E1E82EF0CF8091CE023B +:104850009091CF02009709F48FCF0E9448052091D4 +:104860006002309161022817390708F085CF9091D6 +:10487000CC028091CD02981759F00E9447221092E5 +:104880006102109260021092CF021092CE0274CF99 +:104890000E94E5211092CF021092CE020E94C9051B +:1048A0006BCF2F923F924F925F926F927F928F9237 +:1048B0009F92AF92BF92CF92DF92EF92FF920F93AF +:1048C0001F93CF93DF93CDB7DEB769970FB6F894F8 +:1048D000DEBF0FBECDBF498B5A8B6B8B7C8B8D8B14 +:1048E00061111092D2021D861E861F86188A85E0ED +:1048F000FE017196DE01199601900D928A95E1F7FD +:104900008C859D85892B31F089859A8589238F3FF8 +:1049100009F0D4C129853A854B855C856D857E85F6 +:104920008F8598890E946C21C3C028EFC2162CE5A0 +:10493000D20629F4882379F00E943922EBCF39EF8F +:10494000C3163CE5D30639F4882329F080912B0166 +:104950008111F2CFC3C10DE111E0E12CB12CA12CEA +:1049600088248394912C2EEF522E44244394F801F2 +:104970006081718166246A94762C20E0422F50E099 +:10498000FA01EE0FFF1FE60FF71F85919491C816ED +:10499000D90609F43A01892B31F02F5FEFCFAA2411 +:1049A000A394B12CE4CFF12CFFEF6F167F0609F42E +:1049B00045C0F8014481F0902B018F2D411180E01A +:1049C000F82FF170FF2EF801258086819B859923B1 +:1049D00009F404C1FF2009F401C1211014C0A4018D +:1049E00001C0440F6A94EAF7842B868380916002A9 +:1049F000909161028C32914030F44CE251E050933E +:104A0000610240936002C40102C0880F991F2A9579 +:104A1000E2F70197F80126812817190679F48091A9 +:104A2000CE029091CF02009709F45BC00E94480526 +:104A30008D32914008F455C0F8014482EF28095F97 +:104A40001F4FAA94AB2809F0AACF8B85882309F4BD +:104A500020C1EE2009F41DC10E9457059093CF029A +:104A60008093CE0280916302883010F591E0980F18 +:104A70009093630298E0FE013996DE011196019051 +:104A80000D929A95E1F72CE0829FC00111248C5978 +:104A90009D4F28E0FE013196DC0101900D922A9590 +:104AA000E1F72FEF3FEFFC0131872087D386C286E5 +:104AB00069960FB6F894DEBF0FBECDBFDF91CF91E0 +:104AC0001F910F91FF90EF90DF90CF90BF90AF902C +:104AD0009F908F907F906F905F904F903F902F901E +:104AE00008958091CC026090CD02982FF0E0E0E034 +:104AF000861114C09093CC020E171F0709F49ECFA5 +:104B000090E0FC01EE0FFF1FEC53FD4FB182A0823D +:104B10000196837099278093CD0290CF282E312C57 +:104B2000F101EE0FFF1FEC53FD4F20813181F7E0C3 +:104B3000F29FD001F39FB00D1124A35EBE4F2D91C3 +:104B40003C911197398F288F712C60E070E0E72F2E +:104B5000F0E0EE0FFF1F288D398DE20FF31F259136 +:104B6000349121153105E1F0F8010190F081E02D3B +:104B7000FF8BEE8B60E005C02417350709F47F2C0E +:104B80006F5FE62FF0E0EE0FFF1F4E895F89E40FA5 +:104B9000F51F459154914115510571F77F5FD7CFAE +:104BA0007720C9F0F801671708F0FD0144820E175D +:104BB0001F0721F49093CC02F72C40CF981305C027 +:104BC000AE17BF0711F49F5F937091012F5F3F4FA6 +:104BD000822F83708DCFF0E0E0E0F7CF90E02110DE +:104BE0001FC0B40102C0660F771F2A95E2F79B0130 +:104BF000215031092817390731F4442309F447C0FB +:104C0000C5010E949B05C40101C0880F6A94EAF7A0 +:104C1000982F9095F801868189238683F22C0ECFF8 +:104C20009C01062C02C0359527950A94E2F7A9014C +:104C300041705527BC016150710986239723892B48 +:104C400011F5452B01F1F80182819381892BC1F087 +:104C50001B821C821D821E8259825A820E94570525 +:104C60008160582F9D838C83F801828193818F838B +:104C7000988729813A814B816D817E810E946C21C8 +:104C8000F8011582C0CFF22FF1702F2EBCCF2F2C40 +:104C9000BACF9091CC028091CD02981731F00E944A +:104CA0004722EE2009F436CE03CF0E94E521109270 +:104CB000CF021092CE020E94C905F3CF61E0CE016F +:104CC00009960E94BC126C018B85F7EFCF16FCE5AC +:104CD000DF0609F02ACE882309F43DCE81E08093D7 +:104CE0002B0118CE1F920F920FB60F9211242F9303 +:104CF0003F934F935F936F937F938F939F93AF9364 +:104D0000BF93CF93DF93EF93FF93D091E900DF70D0 +:104D10008091EC00C82FC17080FDC0E81092E900BE +:104D20008091F000877F8093F00078940E943C157A +:104D30001092E9008091F00088608093F000CD2B04 +:104D4000CF70C093E900FF91EF91DF91CF91BF91B8 +:104D5000AF919F918F917F916F915F914F913F9113 +:104D60002F910F900FBE0F901F9018951F920F92CA +:104D70000FB60F9211242F933F934F935F936F932E +:104D80007F938F939F93AF93BF93EF93FF93809104 +:104D9000E10082FF09C08091E20082FF05C080919E +:104DA000E1008B7F8093E1008091DA0080FF24C0D6 +:104DB0008091D80080FF20C08091DA008E7F8093A0 +:104DC000DA008091D90080FF9BC080E189BD82E13B +:104DD00089BD09B400FEFDCF81E080930903809175 +:104DE000E402811109C00E94B9030E9484048091E9 +:104DF000E20084608093E2008091E10080FF17C0B0 +:104E00008091E20080FF13C08091E2008E7F80934A +:104E1000E2008091E20080618093E2008091D800FE +:104E200080628093D80019BC85E08093090380914B +:104E3000E10084FF29C08091E20084FF25C080E169 +:104E400089BD82E189BD89B5982F917080FFFBCF24 +:104E50008091D8008F7D8093D8008091E1008F7E73 +:104E60008093E1008091E2008F7E8093E200809148 +:104E7000E20081608093E20080910A03882309F4B4 +:104E800045C084E0809309038091E10083FF27C03F +:104E90008091E20083FF23C08091E100877F8093AF +:104EA000E10082E08093090310920A038091E100FF +:104EB0008E7F8093E1008091E2008E7F8093E200FC +:104EC0008091E20080618093E20042E060E080E057 +:104ED0000E9452048091F00088608093F000FF915E +:104EE000EF91BF91AF919F918F917F916F915F9162 +:104EF0004F913F912F910F900FBE0F901F901895DB +:104F000019BC109209031092E40276CF8091E3005D +:104F100087FD93E090930903B7CF78941F921FB653 +:104F20001F9211248F939F93AF93BF938091DB02C5 +:104F30009091DC02A091DD02B091DE020196A11DEC +:104F4000B11D8093DB029093DC02A093DD02B0934D +:104F5000DE02BF91AF919F918F911F901FBE1F9056 +:104F600018951F921FB61F9211248F939F93AF9392 +:104F7000BF938091DA02811113C08091DB0290917E +:104F8000DC02A091DD02B091DE024196A11DB11DAF +:104F90008093DB029093DC02A093DD02B093DE02EB +:104FA000BF91AF919F918F911F901FBE1F90189539 +:104FB000CDB7DEB7AA970FB6F894DEBF0FBECDBF50 +:104FC00084B7877F84BF0FB6F894A895809160005E +:104FD000886180936000109260000FBE80E890E0CE +:104FE0000FB6F89480936100909361000FBE85B76F +:104FF000806885BF85B7806885BF82E996E0909319 +:10500000B3018093B2010E94B9030E94840480918D +:10501000E20084608093E200789480910903882301 +:10502000A1F01091E9001F709091EC00892F817020 +:1050300090FD80E8182B1092E9008091E80083FD34 +:105040000E943C151F701093E90082E084BD93E03C +:1050500095BD9AEF97BD80936E000E94FC1281115E +:1050600002C00E94EA1182E30E94940680EF0E942F +:10507000940686E90E94940687E90E94940608E750 +:1050800011E02EE7E22E21E0F22EF80181918F014E +:105090008F3F11F00E949406E016F106B1F7EEE39F +:1050A000F2E084E492E0AFE4B2E011921D928E1738 +:1050B0009F07D9F70E941C15811102C00E94B014ED +:1050C00082E090E00E940E2D809348020E9415130A +:1050D0009093E0028093DF020E94F2228FE39CE92A +:1050E0000197F1F700C000000E94F22280914F0268 +:1050F00080FF08C06FEF7FEF90E080E00E94402DBE +:105100000E943E0B83E090E00E940E2D90E00E94F2 +:10511000F20980911303909114030E94060C6E9A79 +:10512000769A8CE090E00E940E2D90E0B0E0A0E036 +:1051300080933A0290933B02A0933C02B0933D02CD +:1051400080914402811133C00E941C15811104C05A +:105150000E94B0140E94A01488E090E00E94162DD6 +:1051600060937B0370937C0380937D0390937E0315 +:105170006E7F71F40E94A01488E090E00E94162DCA +:1051800060937B0370937C0380937D0390937E03F5 +:105190000E94E30510925C0280917B0380FF04C0B3 +:1051A00060E086950E94441481E0809344028091DF +:1051B0007B03816080937B0361E086950E944414A9 +:1051C00060E081E20E94441421E04EE16FEF8AE347 +:1051D0000E944B1385E091E09093D7028093D60212 +:1051E00018E1E12EF12C00E4C02E8FE492E096E06D +:1051F000D92ED80E80910903BB24B39400E112E1AB +:10520000853009F402C10E94F222882359F08FB739 +:10521000F8944091DB025091DC026091DD027091C4 +:10522000DE028FBFE9E4F2E0AFE4B2E010E000E0BC +:10523000302F8D919191981709F409C1292F2827B2 +:1052400090E0BB24B394422F4B2109F4FBC099A3F7 +:105250003AA38B2191E009F490E09BA30E945705AB +:105260008160782F9DA38CA349A15AA16BA18DA128 +:105270000E945124F801E75BFD4F8081B826B0827F +:1052800080915C028823D1F180915B02E0917B03E5 +:10529000E695E81BE0935702823009F0EFC0F0E09A +:1052A000EB5BFD4FE4910E2F10E0B0E9AB2EBFE0B9 +:1052B000BB2E80915802882361F0109258020E9400 +:1052C0005705909356028093550210925A021092FD +:1052D00059020E945705E0915502F09156028E1B2B +:1052E0009F0B8F3F9F4750F4E00FF11FF093560242 +:1052F000E093550285E592E0F50109950E948F053E +:1053000090914702891731F00E948F0580934702E0 +:105310000E946D0A80910903843009F06BCF83E00D +:105320008093E9008091E80082FF64CF8091E800DB +:1053300090E085FF06C00E94D803882309F4F8C0D6 +:1053400091E08091E8008B778093E800992309F43D +:1053500051CFE981E150E33108F06CC1F0E0EA5649 +:10536000F24D0C94C42C80910903843009F440C0A0 +:1053700080E00E946D0A10925C02809146028111C9 +:1053800016C0B092460280917B03982F9170909343 +:1053900045028E7F80937B039FEFE0E7F2E0915020 +:1053A000E040F040E1F700C000000E94620B109264 +:1053B000DA020FB6F894A895E09260000FBEC09292 +:1053C000600083B7817F846083BF83B7816083BFC0 +:1053D0007894889583B78E7F83BF0FB6F894A8958D +:1053E00080916000886180936000109260000FBE21 +:1053F00080910803882349F00E94F222EFE4F2E052 +:10540000819181114AC2DE12FBCF80910903853060 +:1054100009F4A9CF0E9427150E948F050E946D0AEA +:105420001092460280914502882349F080917B03C7 +:10543000816080937B0360E086950E9444140E9403 +:105440002313E1CE9F5FBB0C943009F0FCCE0F5FBD +:105450001F4F0630110509F0EBCE8FEF8EA38FA3FF +:1054600018A60E9457058160782F9AA789A74EA198 +:105470005FA168A58AA50E94512402CF863059F405 +:10548000F0E0EE5BFD4FE4910E2F10E0A0E8AA2EB5 +:10549000AFE0BA2E0ECF893061F4E695F0E0E15C22 +:1054A000FD4FE4910E2F10E0FCEEAF2EFEE0BF2E7C +:1054B00000CF8F3061F4E695F0E0E45CFD4FE491BD +:1054C0000E2F10E0EEE7AE2EEEE0BE2EF2CE8531CE +:1054D00059F4F0E0E75CFD4FE4910E2F10E070E32B +:1054E000A72E7EE0B72EE5CE08E210E047EAA42E14 +:1054F0004DE0B42E883109F4DCCE833249F4E7E381 +:10550000F2E00591149167E2A62E6FE0B62ED1CE9F +:1055100004EF11E05EE6A52E5DE0B52E843209F4BD +:10552000C8CE00ED17E033E4A32E35E0B32EC1CE94 +:1055300000E210E0CE0101965C018091E80085FD5B +:105540000AC08091E8008B778093E8000E94D8031E +:10555000882399F3F5CE8091F100F50181935F01E5 +:105560000150110951F7ECCE1A8289E08B832DC0CE +:105570008A81823009F4A7C18330A9F0813009F013 +:1055800059C02FB7F8946091DB027091DC028091D2 +:10559000DD029091DE022FBF0E94CA2C6B837C83B8 +:1055A0008D839E8312C080914F028B838091500225 +:1055B0008C83809151028D83809152028E838091E1 +:1055C00053028F838091540288878091090384302D +:1055D00009F010CE1091E9001F709091EC00892F16 +:1055E000817090FD80E8182B82E08093E900809123 +:1055F000E80080FF0DC050E040E060E270E0CE01C6 +:1056000001960E9409048091E8008E778093E8005B +:105610001F701093E900EECD8A81823059F46B81BE +:105620007C818D819E810E94CA2C86E290E00E943E +:10563000222DCBCF8FEF8983C8CF4C816B818A819C +:105640000E9413129827892798279E838D83BDCFA8 +:10565000AD80BE80BA24AB24BA248A810B81F8E0E5 +:105660000F9F8001112420E3829F000D111D112442 +:105670008C8190E0880F991F080F191F6B2DC801AE +:1056800087960E94222D6A2DC8018896D0CF0E944D +:105690007F119BCF8A818138C1F060F4803809F096 +:1056A00094CF20E04B8160917D0380917C030E9428 +:1056B0004B138BCF823859F1833809F086CF20E025 +:1056C00040917E036C818B81F2CF60E08B810E94E0 +:1056D00044149B8180917B03911111C08E7F809334 +:1056E0007B0310925C028FEF90E7E2E081509040E4 +:1056F000E040E1F700C000000E94620B66CF8160CD +:1057000080937B0360E086950E9444145ECF8B817A +:1057100080937F035ACF8A81813899F030F48038A2 +:1057200009F053CF80917E0321CF823891F08338E6 +:1057300009F04BCF80917C038B8380917D038C8318 +:1057400044CF80917B0380FF02C086950FCF80E01D +:105750000DCF80917F030ACF60917B0370917C0312 +:1057600080917D0390917E030E9439132ECF80E1BA +:105770008A832BCF81E08A8389EFF8CEAA80BB8011 +:10578000BA24AB24BA248E010F5F1F4F8C80800E89 +:10579000912E911CC501895F9D4F8016910609F4D9 +:1057A00014CFF9EFAF16F1E0BF0650F40E940E2DB2 +:1057B000F8018483FFEFAF1ABF0A0F5F1F4FEACFD4 +:1057C000F8011482F7CF0A811B81102701271027C7 +:1057D000CE0101964C01AC80A00EB12EB11CC801C7 +:1057E000895F9D4FA016B10609F4EFCE093FE1E0B5 +:1057F0001E0720F4F40164810E94222DFFEF8F1A0E +:105800009F0A0F5F1F4FEBCF0E946F11DECE8AE021 +:10581000AFCFAA80BB80BA24AB24BA248E010F5F1D +:105820001F4F8C80800E912E911CC501879680168B +:10583000910609F4CACE20EEA21621E0B20650F479 +:105840000E940E2DF8018483FFEFAF1ABF0A0F5F8D +:105850001F4FEBCFF8011482F7CF0A811B8110276D +:1058600001271027CE0101964C01AC80A00EB12E6D +:10587000B11CC8018796A016B10609F4A6CE003E59 +:10588000E1E01E0720F4F40164810E94222DFFEF65 +:105890008F1A9F0A0F5F1F4FECCF09BD19BD09B4C6 +:1058A00000FEFDCF8091D8008F7D8093D80080913D +:1058B000E00082608093E0008091E00081FDFCCFF9 +:1058C0000E942715A2CD86E290E00E940E2D1B8239 +:1058D0001C821D828E8379CE87FB082E062687FDCB +:1058E000819567FD61950E94022D0EF4919507FC4C +:1058F00081950895AA1BBB1B51E107C0AA1FBB1FBE +:10590000A617B70710F0A61BB70B881F991F5A954B +:10591000A9F780959095BC01CD01089597FB072EBE +:1059200016F4009407D077FD09D00E947A2C07FC6A +:1059300005D03EF4909581959F4F0895709561959F +:105940007F4F0895A1E21A2EAA1BBB1BFD010DC0BB +:10595000AA1FBB1FEE1FFF1FA217B307E407F5071F +:1059600020F0A21BB30BE40BF50B661F771F881FFB +:10597000991F1A9469F760957095809590959B0191 +:10598000AC01BD01CF010895EE0FFF1F0590F4910A +:10599000E02D099469279627692778278727782794 +:1059A00008950E94D92C332312F48A1B9B0B0C946C +:1059B000EA2CA29FB001B39FC001A39F700D811D6F +:1059C0001124911DB29F700D811D1124911D089508 +:1059D0000E94D92CB7FF0895821B930B08950E9453 +:1059E000D92CA59F900DB49F900DA49F800D911D63 +:1059F00011240895B7FF0C94EF2C0E94EF2C821B0A +:105A0000930B0895991B79E004C0991F961708F02D +:105A1000961B881F7A95C9F780950895F999FECF4E +:105A200092BD81BDF89A992780B50895A6E1B0E0AE +:105A300044E050E00C94482DA8E1B0E042E050E092 +:105A40000C94482D262FF999FECF92BD81BDF89A6E +:105A5000019700B4021639F01FBA20BD0FB6F894B2 +:105A6000FA9AF99A0FBE08950396272F0E94232DC4 +:105A70000E94222D252F0E94232D242F0C94232DAC +:105A80000196272F0E94232D0C94222DDC01CB019F +:105A9000FC01F999FECF06C0F2BDE1BDF89A31963E +:105AA00000B40D9241505040B8F70895FC014150A8 +:105AB000504030F001900616D1F73197CF0108958C +:105AC000882799270895FB01DC0104C08D9101907E +:105AD000801921F441505040C8F7881B990B089554 +:105AE000F894FFCFA712A712B012B012B212B012E0 +:105AF000B012B012A712A712B712B012B012B7129A +:105B0000211649169C1649169C167C16B4169C162E +:105B1000B117BE17521B521BBF1BBF1B1D1C851B81 +:105B2000851B851B371CBF1CCE1CCE1CB42AB82A73 +:105B30000C2B1D2B282B472B4A2B8B2BAC2B1A2BDA +:105B40001A2BB72BBA2BBE2BE32B042C072C092CBA +:025B50002D2CFA +:105B520056005300FF4505FE0A4405FA0AF60A01FB +:105B6200191A1B1C1D1E1F202122010201B2002A2C +:105B720000000000AC004C00000000015F114F115A +:105B8200BC0A00000000000000000000000000004D +:105B9200000101818283E200E900EA00B500B6005B +:105BA200B700CD008301CC008A0192019401210249 +:105BB200230224022502260227022A02B300B4008D +:105BC2006F00700032F0969733F1F4F5F6F70001AA +:105BD200020202020606060909090909090F0F0F46 +:105BE2000F0F0F151515181919191919191919194E +:105BF20019232440226D47012501B8006006790669 +:025C0200990601 +:00000001FF diff --git a/keyboards/solartempest/ps17/config.h b/keyboards/solartempest/ps17/config.h new file mode 100644 index 000000000000..e29caf530514 --- /dev/null +++ b/keyboards/solartempest/ps17/config.h @@ -0,0 +1,144 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include "config_common.h" + +// USB Device descriptor parameter +#define VENDOR_ID 0x414B // "AK" +#define PRODUCT_ID 0x0015 +#define DEVICE_VER 0x0002 // Ver2 +#define MANUFACTURER ATLANTIS +#define PRODUCT PS17 + +//#define ENCODER_RESOLUTION 2 // default is 4 + +// key matrix size +#ifdef RGBLIGHT_ENABLE + #define MATRIX_ROWS 6 +#endif +#ifdef RGB_MATRIX_ENABLE + #define MATRIX_ROWS 11 //Numpad actually has 6 rows. 5 rows were added for underglow RGB matrix to work together +#endif +#define MATRIX_COLS 4 +#define MATRIX_ROW_PINS { F0, B4, B5, B6, C6, C7 } //Rotary encoder SPST is on F0,F7 +#define MATRIX_COL_PINS { F6, F7, D3, D6 } +#define DIODE_DIRECTION COL2ROW +#define DEBOUNCE 5 //Default is 5, 0 if not needed. + +// Encoder matrix +#define ENCODERS_PAD_A { D1 } +#define ENCODERS_PAD_B { D2 } + +// NKRO Settings +#ifdef NKRO_ENABLE + #define FORCE_NKRO //Force NKRO if enabled. +#endif + +// Combo settings +#ifdef COMBO_ENABLE + #define COMBO_COUNT 6 //Number of tap combos used + #define COMBO_TERM 400 //Default combo time is 200ms +#endif + +// Tapping settings +#define TAP_CODE_DELAY 10 +#define TAPPING_TOGGLE 2 //Tap TT twice to toggle layer +#define TAPPING_TERM 160 //Tapping duration in ms + +// For LED status indicators +#define LED_NUM_LOCK_PIN D0 +#define LED_CAPS_LOCK_PIN D5 +#define LED_SCROLL_LOCK_PIN D4 +#define LED_PIN_ON_STATE 0 + +#define RGB_DI_PIN B7 +#ifdef RGBLIGHT_ENABLE + #define RGBLED_NUM 28 //17 key + 11 underglow for RGBLIGHT + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_DEFAULT_VAL 40 //Default brightness on clearing EEPROM + #define RGBLIGHT_LIMIT_VAL 180 //Brightness level max is 255 + //#define RGBLIGHT_LAYERS //Enable layer light indicators. Not required as layer_state_set_user is used instead. + //#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF + #define RGBLIGHT_SLEEP //Turn off LEDs when computer sleeping (+72) + #define RGBLIGHT_ANIMATIONS //Very memory intensive (+2604) + + //RGB LED Conversion macro from physical array to electric array + //First section is the LED matrix, second section is the electrical wiring order, and the third section is the desired mapping + #define LED_LAYOUT( \ + L00, L05, \ + L10, L15, \ + L20, L21, L22, L23, L24, L25, \ + L31, L32, L33, L34, \ + L40, L41, L42, L43, L45, \ + L51, L52, L53, L54, \ + L60, L61, L62, L63, L65 ) \ + { \ + L21,L22,L23,L24,L31,L32,L33,L34,L41,L42,L43,L51,L52,L53,L54,L61,L63,L60,L40,L20,L10,L00,L05,L15,L25,L45,L65,L62, \ + } + //RGB LED logical order map + //Right->Left, Top->Bottom + #define RGBLIGHT_LED_MAP LED_LAYOUT( \ + 1, 0, \ + 3, 2, \ + 9, 8, 7, 6, 5, 4, \ + 13, 12, 11, 10, \ + 18, 17, 16, 15, 14, \ + 22, 21, 20, 19, \ + 27, 26, 25, 24, 23 ) +#endif + +#ifdef RGB_MATRIX_ENABLE // For reactive RGB Matrix effects + #define DRIVER_LED_TOTAL 28 // The number of LEDs connected for matrix, 17 key + 11 underglow + #define RGB_MATRIX_CENTER { 126, 126 }; + #define RGB_MATRIX_KEYPRESSES + #define DISABLE_RGB_MATRIX_ALPHAS_MODS //Remove effects not desired + #define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN + #define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT + #define DISABLE_RGB_MATRIX_BAND_SAT + #define DISABLE_RGB_MATRIX_BAND_VAL + #define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT + #define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL + #define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT + #define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL + #define DISABLE_RGB_MATRIX_CYCLE_ALL + #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN + #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL + #define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + #define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL + #define DISABLE_RGB_MATRIX_CYCLE_SPIRAL + #define DISABLE_RGB_MATRIX_DUAL_BEACON + #define DISABLE_RGB_MATRIX_RAINBOW_BEACON + #define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS + #define DISABLE_RGB_MATRIX_RAINDROPS + #define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + #define DISABLE_RGB_MATRIX_HUE_BREATHING + #define DISABLE_RGB_MATRIX_HUE_PENDULUM + #define DISABLE_RGB_MATRIX_HUE_WAVE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS + #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS + #define DISABLE_RGB_MATRIX_SPLASH + #define DISABLE_RGB_MATRIX_MULTISPLASH + #define DISABLE_RGB_MATRIX_SOLID_SPLASH + #define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH +#endif diff --git a/keyboards/solartempest/ps17/info.json b/keyboards/solartempest/ps17/info.json new file mode 100644 index 000000000000..2806bc0128d6 --- /dev/null +++ b/keyboards/solartempest/ps17/info.json @@ -0,0 +1,38 @@ +{ + "keyboard_name": "Atlantis PS17 Macropad", + "url": "", + "maintainer": "solartempest", + "width": 4, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"x":0, "y":0, "h":1.5}, + {"x":0, "y":1}, + {"x":0, "y":2, "h":1.5}, + + {"x":1, "y":0}, + {"x":1, "y":1}, + {"x":1, "y":2}, + {"x":1, "y":3}, + + {"x":2, "y":0}, + {"x":2, "y":1}, + {"x":2, "y":2}, + {"x":2, "y":3, "h":2}, + + {"x":3, "y":0}, + {"x":3, "y":1}, + {"x":3, "y":2}, + + {"x":4, "y":0}, + {"x":4, "y":1}, + {"x":4, "y":2}, + {"x":4, "y":3, "h":2}, + + {"x":5, "y":0, "w":2}, + {"x":5, "y":2}, + ] + } + } +} diff --git a/keyboards/solartempest/ps17/keymaps/via/config.h b/keyboards/solartempest/ps17/keymaps/via/config.h new file mode 100644 index 000000000000..9083208b5fc3 --- /dev/null +++ b/keyboards/solartempest/ps17/keymaps/via/config.h @@ -0,0 +1,22 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +// Set number of layers for VIA (+30 per layer) +#define DYNAMIC_KEYMAP_LAYER_COUNT 10 diff --git a/keyboards/solartempest/ps17/keymaps/via/keymap.c b/keyboards/solartempest/ps17/keymaps/via/keymap.c new file mode 100644 index 000000000000..e24a32135e78 --- /dev/null +++ b/keyboards/solartempest/ps17/keymaps/via/keymap.c @@ -0,0 +1,432 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "ps17.h" +#ifdef RGBLIGHT_ENABLE + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT +#endif + + +bool is_alt_tab_active = false; // Super Alt Tab Code +uint16_t alt_tab_timer = 0; + +bool spam_arrow; // Spam F24 or other keys like arrows Code +uint16_t spam_timer = false; +uint16_t spam_interval = 1000; // (1000ms == 1s) + +bool teams_muted; // Teams muted simple LED indicator + +bool is_stretch_active = false; // Stretch Timer Code +bool is_stretch_time = false; +uint16_t stretch_timer = 0; +uint16_t stretch_minutes = 0; + +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SPAMARROW, //Spam arrows. Updated to send F24 instead, which is more convenient. + TEAMSMUTE, //MS Teams mute shortcut and simple LED status + STRT //Stretch Timer + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SPAMARROW, //Spam arrows. Updated to send F24 instead, which is more convenient. + TEAMSMUTE, //MS Teams mute shortcut and simple LED status + STRT //Stretch Timer + }; +#endif + +#ifdef COMBO_ENABLE //Tap combos + enum combos { + kppls_7, //Hold plus and 7 to backspace + kppls_8, //Hold plus and 8 to delete + kpent_4, //Hold enter and 4 for left arrow + kpent_5, //Hold enter and 5 for down arrow + kpent_6, //Hold enter and 6 for right arrow + kpent_8, //Hold enter and 4'8 for up arrow + }; + const uint16_t PROGMEM kppls7_combo[] = {KC_KP_PLUS, KC_KP_7, COMBO_END}; + const uint16_t PROGMEM kppl8_combo[] = {KC_KP_PLUS, KC_KP_8, COMBO_END}; + const uint16_t PROGMEM kpent4_combo[] = {KC_PENT, KC_KP_4, COMBO_END}; + const uint16_t PROGMEM kpent5_combo[] = {KC_PENT, KC_KP_5, COMBO_END}; + const uint16_t PROGMEM kpent6_combo[] = {KC_PENT, KC_KP_6, COMBO_END}; + const uint16_t PROGMEM kpent8_combo[] = {KC_PENT, KC_KP_8, COMBO_END}; + combo_t key_combos[COMBO_COUNT] = { + [kppls_7] = COMBO(kppls7_combo, KC_BSPACE), + [kppls_8] = COMBO(kppl8_combo, KC_DELETE), + [kpent_4] = COMBO(kpent4_combo, KC_LEFT), + [kpent_5] = COMBO(kpent5_combo, KC_DOWN), + [kpent_6] = COMBO(kpent6_combo, KC_RGHT), + [kpent_8] = COMBO(kpent8_combo, KC_UP) + }; +#endif + +#ifdef TAP_DANCE_ENABLE// Tap Dance definitions. Not compatible with VIA. + enum { + TD_MINUS_NUMLOCK, + }; + qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_MINUS_NUMLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_KP_MINUS, KC_NUMLOCK), + }; + //TD(TD_MINUS_NUMLOCK) // Add tap dance item to your keymap in place of a keycode (non-VIA only) +#endif + + +enum layer_names { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, + _LAYER4, + _LAYER5, + _LAYER6, + _LAYER7, + _LAYER8, + _LAYER9 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_LAYER0] = LAYOUT( + KC_PGDOWN, KC__MUTE, KC_PGUP, + MO(_LAYER1), KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, + KC_KP_0, KC_KP_DOT + ), + [_LAYER1] = LAYOUT( + KC_RIGHT, KC_TRNS, KC_LEFT, + KC_TRNS, KC_MEDIA_STOP, KC_SPACE, KC_NUMLOCK, + TO(_LAYER4), TG(_LAYER2), TG(_LAYER3), KC_BSPACE, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RESET, + RESET, KC_TRNS + ), + [_LAYER2] = LAYOUT( + KC_RBRACKET, KC_TRNS, KC_LBRACKET, + TO(0), KC_B, KC_T, C(S(KC_N)), + KC_J, KC_S, KC_D, C(KC_MINS), + C(KC_C), C(KC_V), KC_M, + C(KC_N), C(S(KC_Z)), KC_LSHIFT, C(KC_PPLS), + KC_SPACE, KC_LALT + ), + [_LAYER3] = LAYOUT( + ATABF, KC_TRNS, ATABR, + TO(0), KC_WWW_REFRESH, KC_HOME, C(KC_T), + C(S(KC_TAB)), KC_UP, C(KC_TAB), C(KC_W), + KC_LEFT, KC_DOWN, KC_RIGHT, + KC_WWW_BACK, KC_SPACE, KC_WWW_FORWARD, KC_ENTER, + KC_PGDOWN, KC_PGUP + ), + [_LAYER4] = LAYOUT( + ATABF, KC_TRNS, ATABR, + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, + KC_LEFT, KC_DOWN, KC_RIGHT, + C(S(KC_M)), LWIN(KC_F4), KC_TRNS, KC_NUMLOCK, + KC_F13, KC_F14 + ), + [_LAYER5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER6] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER7] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [_LAYER9] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ) +}; + + +void matrix_scan_user(void) { + if (is_alt_tab_active) { //Super alt tab code + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } + if (spam_arrow && timer_elapsed(spam_timer) >= spam_interval) { + spam_timer = timer_read(); //Spam arrow code + tap_code(KC_F24); + } + + #ifdef RGBLIGHT_ENABLE + if (is_stretch_active && !is_stretch_time) { //Stretch timer code + if(timer_elapsed(stretch_timer)>60000) { //1 minute in ms has passed. Timer is uint16 max. + stretch_minutes++; + stretch_timer = timer_read(); + } + if (stretch_minutes > 30) { //Change RGB animation effect after set number of minutes. 30 minutes is a good interval. + rgblight_set_effect_range(0, 28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE); + is_stretch_time = true; + stretch_minutes = 0; + } + } + + if(!is_stretch_time){ //Update LED status indicators when stretch animation is not playing. + if(is_stretch_active==1) { + rgblight_sethsv_at(0,230,100,8); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,9); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,13); //Set LED to orange to indicate timer is on + } + + if(teams_muted==1) { //Check and display teamsmuted status + rgblight_sethsv_at(15,255,120,18); + rgblight_sethsv_at(15,255,120,22); + } + + if(spam_arrow==1) { //Change LED colour on bottom row and underglow to orange to indicate on + rgblight_sethsv_at(15,255,120,24); + rgblight_sethsv_at(15,255,120,25); + rgblight_sethsv_at(15,255,120,26); + rgblight_sethsv_at(15,255,120,27); + } + } + #endif +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { //For keycode overrides + case ATABF: //Super alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + return true; + case ATABR: //Super alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + return true; + + case NMR: //Move window to next monitor on right + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + case NML: //Move window to next monitor on left + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + + case SPAMARROW: // Spam F24 or other keys like arrows + if (record->event.pressed) { + spam_arrow ^= 1; + spam_timer = timer_read(); + #ifdef RGBLIGHT_ENABLE + if(spam_arrow==1) { //Change LED colour on bottom row and underglow to orange to indicate on + rgblight_sethsv_at(15,255,120,24); + rgblight_sethsv_at(15,255,120,25); + rgblight_sethsv_at(15,255,120,26); + rgblight_sethsv_at(15,255,120,27); + } + else { + rgblight_set_effect_range(0, 28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set back to layer colours + } + #endif + } + return false; + + case TEAMSMUTE: //Mute MS teams shortcut and simply change LED for key 1 colour + if (record->event.pressed) { + register_code(KC_LCTRL); + register_code(KC_LSFT); + register_code(KC_M); + unregister_code(KC_M); + unregister_code(KC_LSFT); + unregister_code(KC_LCTRL); + teams_muted ^= 1; + #ifdef RGBLIGHT_ENABLE + if(teams_muted==1) { //Change LED colour on LEDs for key 1 and underglow to orange to indicate muted + rgblight_sethsv_at(15,255,120,18); + rgblight_sethsv_at(15,255,120,22); + } + else { + //rgblight_sethsv_at(175,255,120,18); //Set LEDs back to violet, assuming on that coloured layer + //rgblight_sethsv_at(175,255,120,22); + rgblight_sethsv_at(207,255,120,18); //Set LEDs back to magenta, assuming on that coloured layer + rgblight_sethsv_at(207,255,120,22); + } + #endif + } + return true; + + + case STRT: //Stretch timer + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + is_stretch_active ^= 1; + stretch_timer = timer_read(); + //rgblight_sethsv_at(75,215,80,41); + if(is_stretch_time==1) { //Check if it is time to stretch, then dismiss the animation. + rgblight_set_effect_range(0, 28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); + rgblight_sethsv_at(0,230,100,8); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,9); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,13); //Set LED to orange to indicate timer is on + is_stretch_active = 1; + is_stretch_time = 0; + stretch_minutes = 0; + } + else if(is_stretch_active==1) { + rgblight_set_effect_range(0, 28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); + rgblight_sethsv_at(0,230,100,8); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,9); //Set LED to orange to indicate timer is on + rgblight_sethsv_at(0,230,100,13); //Set LED to orange to indicate timer is on + is_stretch_time = 0; + stretch_minutes = 0; + } + else { + rgblight_set_effect_range(0, 28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set back to layer colours -- CHECK LAYERS RESET LED STATUS + is_stretch_time = 0; + stretch_minutes = 0; + } + #endif + } + return false; + } + return true; +} + + +void keyboard_post_init_user(void) { + #ifdef RGB_MATRIX_ENABLE + //NOTE 1: Layer lighting doesn't work in RGB matrix mode + //NOTE 2: VIA lighting tab doesn't work and might crash in RGB matrix mode + //NOTE 3: VIA layers doesn't seem to work properly in RGB matrix mode + //rgb_matrix_enable_noeeprom(); //turn on RGB matrix based on previous state + rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE); //set initial RGB matrix mode + rgb_matrix_sethsv_noeeprom(50, 255, 100); //sets LED to green-yellow + #endif + #ifdef RGBLIGHT_ENABLE + //rgblight_layers = my_rgb_layers;// Enable the LED layers + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9 + layer_move(0); //start on layer 0 to get the lighting activated + #endif +}; + + +#ifdef RGBLIGHT_ENABLE +layer_state_t layer_state_set_user(layer_state_t state) { + /*rgblight_set_layer_state(0, layer_state_cmp(state, 0)); // Multiple layers will light up if both kb layers are active + rgblight_set_layer_state(1, layer_state_cmp(state, 1)); + rgblight_set_layer_state(2, layer_state_cmp(state, 2)); + rgblight_set_layer_state(3, layer_state_cmp(state, 3)); + rgblight_set_layer_state(4, layer_state_cmp(state, 4));*/ + + // This is what the LED layout is. + // 1, 0, + // 3, 2, + // 9, 8, 7, 6, 5, 4, + // 13, 12, 11, 10, + // 18, 17, 16, 15, 14, + // 22, 21, 20, 19, + // 27, 26, 25, 24, 23 + + switch (get_highest_layer(state)) { // Change all other LEDs based on layer state as well + case 0: + //rgblight_sethsv_noeeprom(50,255,100); //blue-green gradient + rgblight_sethsv_noeeprom(115,200,100); //pale-blue gradient + //You can selectively decrease certain LEDs if you are have a clear acrylic case and the shine-through is bothersome. Rgblight_sethsv_at() can be used here for those LEDs (0, 2, 4, 14, and 23). Otherwise some black tape on the acrylic plate or foam underneath the FR4 plate will do the trick. + break; + case 1: + rgblight_sethsv_noeeprom(5,255,100); + case 2: + //rgblight_sethsv_noeeprom(128,255,100);//blue-purple gradient + rgblight_sethsv_noeeprom(160,255,100); //blue-magenta gradient + break; + case 3: + rgblight_sethsv_noeeprom(215,255,100); + break; + case 4: + rgblight_sethsv_noeeprom(15,255,100); + break; + } + return state; + }; +#endif diff --git a/keyboards/solartempest/ps17/keymaps/via/rules.mk b/keyboards/solartempest/ps17/keymaps/via/rules.mk new file mode 100644 index 000000000000..d50c3fb8e377 --- /dev/null +++ b/keyboards/solartempest/ps17/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes #Enable VIA (+1556) diff --git a/keyboards/solartempest/ps17/ps17 VIA keymap.json b/keyboards/solartempest/ps17/ps17 VIA keymap.json new file mode 100644 index 000000000000..7df873bcce6b --- /dev/null +++ b/keyboards/solartempest/ps17/ps17 VIA keymap.json @@ -0,0 +1,56 @@ +{ + "name": "PS17" , + "vendorId": "0x414B", + "productId": "0x0015", + "lighting": "qmk_rgblight", + "matrix": { "rows": 6, "cols": 4 }, + "customKeycodes": [ + { + "name": "Super Alt Tab FWD", + "title": "Alt Tab Forwards in Windows", + "shortName": "ATABF" + }, + { + "name": "Super Alt Tab REV", + "title": "Alt Tab Reverse in Windows", + "shortName": "ATABR" + }, + { + "name": "Move Window Right", + "title": "Move Window Right in Windows", + "shortName": "MWR" + }, + { + "name": "Move Window Left", + "title": "Move Window Left in Windows", + "shortName": "MWL" + }, + { + "name": "Spam Arrow", + "title": "Toggle F24 on interval timer with Orange LED", + "shortName": "SA" + }, + { + "name": "Teams Muted", + "title": "Simply Change LED of 1 to show if muted or not", + "shortName": "TM" + }, + { + "name": "Stretch Timer", + "title": "Activate Stretch Timer", + "shortName": "STRT" + } + ], + "layouts": + { + "keymap": + [ + [{"w": 1, "h":1.5},"0,0", "0,1", {"w": 1, "h":1.5},"0,2"], + [{"y":0.75}, "1,0", "1,1", "1,2", "1,3"], + [ "2,0", "2,1", "2,2", {"h":2},"2,3"], + [ "3,0","3,1","3,2"], + [ "4,0", "4,1", "4,2", {"h":2},"4,3"], + [{"w": 2},"5,0", "5,2"] + ] + } +} \ No newline at end of file diff --git a/keyboards/solartempest/ps17/ps17 VIA layout.json b/keyboards/solartempest/ps17/ps17 VIA layout.json new file mode 100644 index 000000000000..8716ead03f2d --- /dev/null +++ b/keyboards/solartempest/ps17/ps17 VIA layout.json @@ -0,0 +1,267 @@ +{ + "name": "PS17", + "vendorProductId": 1095434261, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "C(KC_TAB)", + "C(KC_W)", + "C(S(KC_TAB))", + "KC_NO", + "TO(2)", + "KC_PSLS", + "KC_PAST", + "KC_PMNS", + "KC_P7", + "KC_P8", + "KC_P9", + "KC_PPLS", + "KC_P4", + "KC_P5", + "KC_P6", + "KC_NO", + "KC_P1", + "KC_P2", + "KC_P3", + "KC_PENT", + "KC_P0", + "KC_NO", + "KC_PDOT", + "KC_NO" + ], + [ + "KC_RGHT", + "KC_TRNS", + "KC_LEFT", + "KC_NO", + "TO(0)", + "KC_TRNS", + "KC_TRNS", + "KC_NLCK", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_BSPC", + "TO(5)", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "TO(2)", + "TO(3)", + "TO(4)", + "KC_TRNS", + "RESET", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_VOLU", + "KC_TRNS", + "KC_VOLD", + "KC_NO", + "TO(0)", + "KC_WWW_REFRESH", + "KC_WWW_HOME", + "C(S(KC_H))", + "C(S(KC_TAB))", + "KC_UP", + "C(KC_TAB)", + "USER06", + "KC_LEFT", + "KC_DOWN", + "KC_RGHT", + "KC_NO", + "USER05", + "KC_NLCK", + "KC_SLCK", + "USER04", + "KC_F13", + "KC_NO", + "KC_F14", + "KC_NO" + ], + [ + "USER00", + "KC_TRNS", + "USER01", + "KC_NO", + "TO(0)", + "KC_WWW_REFRESH", + "KC_HOME", + "C(KC_T)", + "C(S(KC_TAB))", + "KC_UP", + "C(KC_TAB)", + "C(KC_W)", + "KC_LEFT", + "KC_DOWN", + "KC_RGHT", + "KC_NO", + "KC_WWW_BACK", + "KC_SPC", + "KC_WWW_FORWARD", + "KC_ENT", + "KC_PGDN", + "KC_NO", + "KC_PGUP", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_NO" + ] + ] +} \ No newline at end of file diff --git a/keyboards/solartempest/ps17/ps17.c b/keyboards/solartempest/ps17/ps17.c new file mode 100644 index 000000000000..9ec609d6b4dd --- /dev/null +++ b/keyboards/solartempest/ps17/ps17.c @@ -0,0 +1,71 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ps17.h" +bool encoder_update_user(uint8_t index, bool clockwise) { // QMK encoder functionality + #ifdef VIA_ENABLE //Add in VIA setting of rotary encoder keymap + if (index == 0) { //First encoder + if (clockwise) { + action_exec((keyevent_t){.key = (keypos_t){.row = 0, .col = 0}, .pressed = true, .time = (timer_read() | 1) }); //Time is 1 tick otherwise empty event + action_exec((keyevent_t){.key = (keypos_t){.row = 0, .col = 0}, .pressed = false, .time = (timer_read() | 1) }); + } + else { + action_exec((keyevent_t){.key = (keypos_t){.row = 0, .col = 2}, .pressed = true, .time = (timer_read() | 1) }); + action_exec((keyevent_t){.key = (keypos_t){.row = 0, .col = 2}, .pressed = false, .time = (timer_read() | 1) }); + } + } + #else //Assign rotary encoder function here if VIA not enabled + if (index == 0) { /* First encoder */ + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } + #endif + return true; +} + + +#ifdef RGB_MATRIX_ENABLE //Add in addressable LED underglow support with physical locations + led_config_t g_led_config = { { + //Key matrix to LED index + { NO_LED, NO_LED, NO_LED, NO_LED, }, + { 0, 1, 2, 3, }, + { 4, 5, 6, 7, }, + { 8, 9, 10, NO_LED, }, + { 11, 12, 13, 14, }, + { 15, NO_LED, 16, NO_LED, }, + + //Underglow matrix to LED index + { 21, NO_LED, NO_LED, 22, }, + { 20, NO_LED, NO_LED, 23, }, + { 19, NO_LED, NO_LED, 24, }, + { 18, NO_LED, NO_LED, 25, }, + { 17, 27, NO_LED, 26, } + }, { + // LED Key Index to Physical Position, calculated with Plot Digitizer and scaled PCB Image with center at {126,126} + {74,165},{108,165},{144,165},{179,165},{74,129},{109,129},{143,129},{188,121},{74,95},{109,95},{143,95},{73,60},{109,60},{144,60},{188,51},{91,25},{144,25}, + + // LED underglow + {61,26},{61,88},{61,158},{61,197},{61,232},{192,232},{192,196},{192,158},{192,87},{183,26},{127,24} + }, { + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, // LED Index to Flag. 4 for key backlight. + 2,2,2,2,2,2,2,2,2,2,2 // 2 for case underglow. + } }; +#endif diff --git a/keyboards/solartempest/ps17/ps17.h b/keyboards/solartempest/ps17/ps17.h new file mode 100644 index 000000000000..64ebc5766887 --- /dev/null +++ b/keyboards/solartempest/ps17/ps17.h @@ -0,0 +1,61 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE + #define LAYOUT( \ + K00, K01, K02, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, \ + K40, K41, K42, K43, \ + K50, K52 \ + ) { \ + { K00, K01, K02, KC_NO }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, KC_NO }, \ + { K40, K41, K42, K43 }, \ + { K50, KC_NO, K52, KC_NO }, \ + } +#endif + +#ifdef RGB_MATRIX_ENABLE // Five empty rows of keys were added for RGB Matrix purposes. You must map to a key otherwise it will not work. + #define LAYOUT( \ + K00, K01, K02, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, \ + K40, K41, K42, K43, \ + K50, K52 \ + ) { \ + { K00, K01, K02, KC_NO }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, KC_NO }, \ + { K40, K41, K42, K43 }, \ + { K50, KC_NO, K52, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO }, \ + } +#endif diff --git a/keyboards/solartempest/ps17/readme.md b/keyboards/solartempest/ps17/readme.md new file mode 100644 index 000000000000..f6a82d203a20 --- /dev/null +++ b/keyboards/solartempest/ps17/readme.md @@ -0,0 +1,40 @@ +# Atlantis PS17 Macropad + +![Atlantis PS17](https://i.imgur.com/Y0rkPgA.jpg) + +A 17-key macro pad with pushbutton rotary encoder and underglow RGB per key RGB and for the case. + +For detailed instructions on using VIA and flashing, please refer to the sections further down the page! + +* Keyboard Maintainer: solartempest +* Hardware Supported: Atlantis PS17 v2 +* Hardware Availability: [rioo897](https://shop198276076.world.taobao.com/index.htm?spm=2013.1.w5002-23418336364.2.3f4d7d51DkVX3s) + +# Custom Features: + +- Remappable rotary encoder controls volume up/down/mute. +- Allows for remapping of per-layer rotary encoder functions in VIA. +- VIA support included by default. +- RGB underglow and matrix support and remapped to physical locations for nicer gradient and effects. +- Adds custom layer lighting with custom gradients for each. +- Custom macro key in VIA for Super Alt Tab, which is fully compatible with rotary encoders. +- Custom macro key in VIA for moving windows to other monitors in Windows, which is fully compatible with rotary encoders. +- Custom macro key in VIA for Stretch Timer. It animates the LEDs after 30 minutes as a reminder to stand up and stretch. Push to dismiss. +- Adds key combo functionality for backspace, delete, and arrow keys. Plus+8/9 along with Enter+4/5/6/8. + +## Make and Flashing + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb solartempest/ps17 -km via + +To reset the board into bootloader mode, tap the Reset switch mounted on the bottom of the PCB. +Flash with QMK toolbox, auto-flash. + +## Using with VIA + +- After flashing, in VIA make sure to Import Keymap, which is "ps17 VIA keymap.json". This will alow VIA to recognize the updated layout and custom functions. VIA will not auto-recognize the keyboard with this firmware because of the necessary customization. +- Go to Save+Load to Load Saved Layout. You can import my own layout "ps17 VIA layout.json" or just use the Keymap tab to assign your own keys. Having another keyboard connected can be handy for doing this step. +- It is a good idea to Save Current Layout after you decide on your mapping. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/solartempest/ps17/rules.mk b/keyboards/solartempest/ps17/rules.mk new file mode 100644 index 000000000000..4e6a51aa5994 --- /dev/null +++ b/keyboards/solartempest/ps17/rules.mk @@ -0,0 +1,26 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Build Options +# Comment out to disable the options. + +CONSOLE_ENABLE = no # Console for debug (+4686) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration (+644) +MAGIC_ENABLE = no # Save space by not PROCESS_MAGIC, which is bootmagic with out the boot (+634) +GRAVE_ESC_ENABLE = no # Save space by not using KC_GESC (+127) +SPACE_CADET_ENABLE = no # Save space by not using space cadet left/right shift (+350) +LTO_ENABLE = yes # Save space by link time optimization + +MOUSEKEY_ENABLE = yes # Mouse keys (+1482) +EXTRAKEY_ENABLE = yes # Audio control and System control (+450) +NKRO_ENABLE = yes # NKRO (+328) +RGBLIGHT_ENABLE = yes # RGB lighting (+3826) +RGB_MATRIX_ENABLE = no # RGB matrix for reactive effects (-1068) +RGB_MATRIX_DRIVER = WS2812 # Addressable LED strand driver +UNICODE_ENABLE = yes # Unicode +ENCODER_ENABLE = yes # Rotary encoders (+1112) +COMBO_ENABLE = yes # Tap combo chording (+952) +TAP_DANCE_ENABLE = no # Tap dance (+1008). Not VIA compatible. diff --git a/keyboards/solartempest/ps17/solartempest_ps17_via.hex b/keyboards/solartempest/ps17/solartempest_ps17_via.hex new file mode 100644 index 000000000000..42b66569857c --- /dev/null +++ b/keyboards/solartempest/ps17/solartempest_ps17_via.hex @@ -0,0 +1,1493 @@ +:100000000C949E030C94E5030C94E5030C94E50317 +:100010000C94E5030C94E5030C94E5030C94E503C0 +:100020000C94E5030C94E5030C94A7250C9463252C +:100030000C94A4260C94E5030C94E5030C94E503BE +:100040000C94E5030C94E5030C94E5030C94E50390 +:100050000C94E5030C9480260C94E5030C94E503C2 +:100060000C94E5030C94E5030C94E5030C94E50370 +:100070000C94E5030C94E5030C94E5030C94E50360 +:100080000C94E5030C94E5030C94E5030C94E50350 +:100090000C94E5030C94E5030C94E5030C94E50340 +:1000A0000C94E5030C94E5030C94E5035800600000 +:1000B000000058005E00000058005D00000058007D +:1000C0005C00000057006000000057005F00000067 +:1000D00005010902A10185020901A1000509190113 +:1000E00029081500250195087501810205010930CF +:1000F00009311581257F950275088106093815811A +:10010000257F950175088106050C0A3802158125A1 +:100110007F950175088106C0C005010980A1018590 +:100120000319012AB700150126B700950175108142 +:1001300000C0050C0901A101850419012AA00215BE +:100140000126A002950175108100C005010906A1D4 +:10015000018506050719E029E715002501950875B1 +:100160000181020507190029EF1500250195F07599 +:10017000018102050819012905950575019102956E +:100180000175039101C00660FF0961A101096215B3 +:100190000026FF009520750881020963150026FFDF +:1001A00000952075089102C005010906A101050707 +:1001B00019E029E7150025019508750181029501CF +:1001C000750881010507190029FF150026FF009514 +:1001D0000675088100050819012905950575019125 +:1001E00002950175039101C00000000000000000AD +:1001F00000000000000000000000000000000000FF +:100200000000000000000000000000007E0F00D48D +:10021000FFFFFFC7000000780000000000000000A2 +:100220002A2B280000000000000000000000000051 +:1002300000000029000000002C1E3420212224345C +:100240002627252E362D3738271E1F20212223242E +:1002500025263333362E37381F0405060708090ACA +:100260000B0C0D0E0F101112131415161718191A66 +:100270001B1C1D2F3130232D350405060708090AE4 +:100280000B0C0D0E0F101112131415161718191A46 +:100290001B1C1D2F3130354C00047F3F1F6432146E +:1002A000643214783C1E1E140A050001010101018C +:1002B000010101010202020202020202020303031F +:1002C00003030303030404040404040405050505EF +:1002D00005060606060607070707070808080809AF +:1002E0000909090A0A0A0B0B0B0C0C0C0D0D0D0E5B +:1002F0000E0E0F0F0F1010111111121213131414F0 +:10030000151516161717181819191A1A1B1B1C1D64 +:100310001D1E1E1F202021222223242425262627BD +:100320002829292A2B2C2D2D2E2F303132323334EF +:1003300035363738393A3B3C3D3E3F4041424344F5 +:1003400045464748494A4C4D4E4F505153545556D7 +:1003500058595A5B5D5E5F616264656668696B6C83 +:100360006D6F7072737577787A7B7D7E80828385FE +:1003700087888A8C8E8F91939596989A9C9EA0A23E +:10038000A3A5A7A9ABADAFB1B3B5B7BABCBEC0C248 +:10039000C4C6C9CBCDCFD1D4D6D8DBDDDFE2E4E70C +:1003A000E9EBEEF0F3F5F8FAFDFFFFAA7F55400800 +:1003B0000706050D0C0B0A11100F161514131A1849 +:1003C0001B120903010002040E17192223252628F7 +:1003D000292A2C2D2F3032333536383A3B3D3E40DA +:1003E00042434547494A4C4E5051535557595A5C20 +:1003F0005E6062646668696B6D6F71737577797B37 +:100400007D7F81838587898A8C8E90929496989A35 +:100410009C9E9FA1A3A5A7A8AAACAEAFB1B3B4B64A +:10042000B8B9BBBCBEBFC1C2C3C5C6C7C9CACBCCA5 +:10043000CDCED0D1D2D2D3D4D5D6D7D7D8D9D9DA78 +:10044000DADBDBDBDCDCDCDCDCDDDDDDDDDCDCDCED +:10045000DCDCDBDBDBDADAD9D9D8D7D7D6D5D4D315 +:10046000D2D2D1D0CECDCCCBCAC9C7C6C5C3C2C1EA +:10047000BFBEBCBBB9B8B6B4B3B1AFAEACAAA8A747 +:10048000A5A3A19F9E9C9A98969492908E8C8A89FF +:10049000878583817F7D7B79777573716F6D6B69DC +:1004A00068666462605E5C5A5957555351504E4CB1 +:1004B0004A4947454342403E3D3B3A383635333260 +:1004C000302F2D2C2A2928262523224E007F004B51 +:1004D00000000001515400550056005F00600061AB +:1004E0000057005C005D005E00000059005A005B90 +:1004F00000580062000000630000004F000100503F +:100500000000000100AD002C005300145002530302 +:10051000532A000100010001000000010001000158 +:1005200000005C005C000001000000300001002FB2 +:1005300000000010500500170011030D0016000701 +:10054000002D01060119011000000011011D03E139 +:100550000057012C000000E2000000805F010081D4 +:100560005F00001050B9004A0017012B0352002B06 +:10057000011A01500051004F000000B6002C00B7D6 +:100580000028004E0000004B000000805F01008149 +:100590005F00001050010001000100010052000145 +:1005A000000100500051004F00000010033D080101 +:1005B0000053006800000069000000010001000114 +:1005C0000000000100010001000100010001000124 +:1005D0000001000100010001000000010001000114 +:1005E0000001000100000001000000010001000105 +:1005F00000000001000100010001000100010001F4 +:1006000000010001000100010000000100010001E3 +:1006100000010001000000010000000100010001D4 +:1006200000000001000100010001000100010001C3 +:1006300000010001000100010000000100010001B3 +:1006400000010001000000010000000100010001A4 +:100650000000000100010001000100010001000193 +:100660000001000100010001000000010001000183 +:100670000001000100000001000000010001000174 +:100680000000000100010001000100010001000163 +:100690000001000100010001000000010001000153 +:1006A000000100010000000100000009025B0003DE +:1006B0000100A0FA09040000010301010009211151 +:1006C0000100012240000705810308000A09040116 +:1006D000000203000000092111010001222200078D +:1006E000058203200001070503032000010904021D +:1006F00000010300000009211101000122B60007DA +:1007000005840320000A12010002000000084B418A +:1007100015000200010200010A03500053003100DD +:10072000370000001203410054004C0041004E000D +:1007300054004900530000000403090411241FBEA3 +:10074000CFEFDAE0DEBFCDBF04B603FE27C0809155 +:100750009C0390919D03A0919E03B0919F038730CD +:10076000904BA740B04BD1F410929C0310929D0384 +:1007700010929E0310929F0314BE84B7877F84BF9C +:100780000FB6F894A895809160008861809360000E +:10079000109260000FBEE0E0F8E3099511E0A0E0E0 +:1007A000B1E0E8E6FCE502C005900D92AA3CB10775 +:1007B000D9F723E0AAECB1E001C01D92AC39B20731 +:1007C000E1F70E94CB260C94F42D0C940000E8ED88 +:1007D000F0E080818E7F80831092E2001092DA0038 +:1007E0001092E100A0EEB0E08C9181608C9380814A +:1007F0008F77808319BCA7EDB0E08C918E7F8C93AE +:1008000080818F7E808310926A0308952091E40096 +:100810003091E50095E6A9012091EC00822F8170CE +:1008200020FF06C08091E80080FF06C080E00895A8 +:100830002091E80022FD1AC080919003882389F05E +:10084000853089F08091EB0085FD0FC02091E40098 +:100850003091E50042175307F9F29150E1F684E038 +:10086000089582E0089583E0089581E00895EF926D +:10087000FF920F931F93CF937C018B010E9406047C +:10088000C82F811117C08091E80085FD0BC08091B1 +:10089000E8008E778093E8000E940604882399F38D +:1008A000C82F08C0F70181917F018093F1000150AA +:1008B000110949F78C2FCF911F910F91FF90EF9065 +:1008C00008958091920387FF13C08091E80082FF12 +:1008D00006C08091E8008B778093E80004C0809187 +:1008E00090038111F2CF0895809190038823D9F36A +:1008F0008091E80080FFF8CF8091E8008E77ECCF00 +:10090000982F9093E900242F762F50E0891731F02B +:100910007091EC002091ED005091F00021FD07C096 +:100920009F5F973071F78093E90081E008953091DF +:10093000EB003E7F3093EB003091ED003D7F309334 +:10094000ED003091EB0031603093EB007093EC00E0 +:100950002093ED005093F0002091EE0027FDE0CFB2 +:1009600080E00895CF92DF92EF92FF920F931F9352 +:10097000CF93DF93C8EDD0E088818F7E8883E7ED49 +:10098000F0E080818160808384E082BF81E0809399 +:100990006A0388818E7F888302EE10E0F80110825E +:1009A0001092DA0081EEC82ED12CF60110828881D7 +:1009B0008F77888388818068888388818F7D88830A +:1009C00019BC109290031092910310928F03109211 +:1009D0008E0390EEE92EF12CF70180818B7F8083CE +:1009E00088818160888342E060E080E00E9480042A +:1009F000F60180818E7F8083F80180818160808311 +:100A0000808188608083F70180818E7F80838881E8 +:100A100080618883DF91CF911F910F91FF90EF90BC +:100A2000DF90CF900895FC018091980390919903F5 +:100A300086179707A0F06115710529F49091E800D9 +:100A40009E779093E80090E06115710551F4911143 +:100A500008C08091E80082FF34C080E00895BC01A6 +:100A6000F2CF809190038823C1F18530C1F180914C +:100A7000E80083FD30C08091E80082FDEACF8091DC +:100A8000E80080FFE1CF8091F3002091F200382F41 +:100A90006115710519F02830310558F091E02830C2 +:100AA000310509F090E02091E8002E772093E800CE +:100AB000CBCF81918093F100615071092F5F3F4F3F +:100AC000E7CF80919003882341F0853041F08091F9 +:100AD000E80083FFBECF81E0089582E0089583E0BF +:100AE0000895089580916D0308959C014FB7F8947F +:100AF0008091610390916203A0916303B0916403BC +:100B00004FBF821B930B08952FB7F8948091610318 +:100B100090916203A0916303B09164032FBF089585 +:100B200020914A012223C9F02091650327FF15C0B7 +:100B3000E62FE695E695E695EE31D8F4E80FF92F25 +:100B4000F11D677021E030E001C0220F6A95EAF7DD +:100B500020958281282322830895FC0132960896ED +:100B60002191621303C0DF0111971C92E817F90766 +:100B7000B9F7089520915E0330915F032817390774 +:100B800071F090935F0380935E03E0915C03F091BA +:100B90005D03309721F00084F185E02D09940895DC +:100BA00020915A0330915B032817390771F0909315 +:100BB0005B0380935A03E0915C03F0915D033097EF +:100BC00021F00680F781E02D09940895E0915C03FF +:100BD000F0915D03309721F00190F081E02D0994B0 +:100BE00080E00895DC016091560380915703962FB1 +:100BF000891301C00895292F30E0F901EE0FFF1F7E +:100C0000E25BFC4F408151814A175B07A1F487E00A +:100C10008A9FA0018B9F500D1124415E5E4F81E0A1 +:100C2000FA0184839613E6CF2F5F3F4F237033275B +:100C30002093560308952F5F3F4F922F9370D8CF84 +:100C40001092EB021092EA02EFE1F1E0858181114E +:100C500002C014821682379681E0E934F807B1F7B2 +:100C60000895FA01811101C0FB0109940895809152 +:100C7000E502982F9E7F61F4817082608093E50287 +:100C80008091E802853B18F084EB8093E802089598 +:100C90008A34B0F381708864F1CFAF92BF92DF9253 +:100CA000EF92FF920F931F93CF93DF93182F062F8E +:100CB000E901453B08F044EBE42FF0E0E655FD4F39 +:100CC000011110C0E4915E2F4E2F4983E8835A83AF +:100CD000DF91CF911F910F91FF90EF90DF90BF9028 +:100CE000AF900895202F30E04491D42EE42EF12CC3 +:100CF00056E0159FC0011124EFEFF0E0BF010E9404 +:100D0000FE2C812F90E0880F991F55E5569FD0014A +:100D1000579FB00D11248A1B9B0B982F990F890F99 +:100D20005F01A21AB30AAE9CD001AF9CB00DBE9C6D +:100D3000B00D11245B2F089F80011124012F112772 +:100D40005F01A01AB10AAE9C8001AF9C100DBE9C41 +:100D5000100D11245F01A81AB108A29EC001A39E24 +:100D6000900DB29E900D1124892F9927E81BF90B45 +:100D7000EE9DC001EF9D900DFE9D900D1124E92F79 +:100D800062307105A1F050F46115710509F49DCF31 +:100D90006130710581F0EB2F512F97CF64307105D1 +:100DA00069F080F06630710509F48FCFF4CFE42F3D +:100DB0004B2F592F8ACFE42F412F87CFEB2F542F62 +:100DC000492F83CF4B2F5D2DE12F7FCF0E948405CC +:100DD0009C019091820280918302982B21F03093A4 +:100DE0007F0220937E029091840280918502982B4D +:100DF00021F030937D0220937C02E0915C03F0911E +:100E00005D03309749F082E0809380020480F58191 +:100E1000E02D80E892E00994089540918202803F9D +:100E200059F48091830287FF0DC010928302411113 +:100E30000BC010927A0208C0813F81F48091830236 +:100E400018169CF3442381F08091840290918502CE +:100E5000892B09F05AC0109279020895823F49F413 +:100E600047FFF0CF10928202809183028111ECCF74 +:100E7000E0CF833F19F41416ACF3E4CF90918402D1 +:100E8000893F29F41916F4F610928402DBCF8A3FC9 +:100E900019F497FFD7CFF8CF909185028B3F29F4B3 +:100EA00097FFD0CF10928502CDCF8C3F19F4191641 +:100EB000CCF3C8CF9CE0980F953090F4845F990BE9 +:100EC00021E030E0B90102C0660F771F8A95E2F792 +:100ED000CB01809590918102892380938102B2CFCA +:100EE0008D3F31F480917B028E7F80937B02AACF6D +:100EF0008E3F21F480917B028D7FF7CF8F3F09F0E9 +:100F0000A1CF80917B028B7FF0CF089580917B02EF +:100F100080FD16C081FD16C082FD16C08091790249 +:100F20008823A1F0883280F428E0829FC001112438 +:100F300068E270E00E94122D862F672B39F0089529 +:100F400082E0089584E0089588E0089581E008959E +:100F500080917B0280FD14C081FD14C082FD16C00B +:100F600080917A02882381F0843180F422E3829F89 +:100F7000C001112464E170E00E94122D862F0895B3 +:100F80008CE0089589E1089585E0089582E308954D +:100F9000803F31F40E94A8078195809383020895D1 +:100FA000813F19F40E94A807F8CF823F31F40E94D4 +:100FB000A8078195809382020895833F19F40E94C7 +:100FC000A807F8CF893F29F40E94860780938402FE +:100FD00008958A3F21F40E9486078195F7CF8B3FC1 +:100FE00031F40E94860781958093850208958C3F95 +:100FF00019F40E948607F8CF9CE0980F953070F4A2 +:10100000845F990B21E030E001C0220F8A95EAF756 +:1010100080918102822B8093810208958D3F31F46B +:1010200080917B02816080937B0208958E3F21F442 +:1010300080917B028260F7CF8F3FB9F780917B026E +:101040008460F1CF80E00895F894E82FE295EF7086 +:10105000F0E031A1282F2F7081E090E001C0880FCF +:101060002A95EAF7982F9095932391A392A1892B23 +:1010700082A3789408959091650392FF06C0282F6B +:1010800028712830F9F4877F846093FF06C0282FE9 +:1010900028712831F1F4877E84612091660320FF56 +:1010A00006C0382F38713830D9F4877F816021FF2E +:1010B00006C0282F28712831D1F4877E816194FDE4 +:1010C000877E0895282F24712430F9F68B7F88605D +:1010D000DCCF282F2471243101F78B7E8861DDCF8E +:1010E000382F3171313019F78E7F8860E0CF282F8B +:1010F0002171213121F78E7E8861E1CFCF93DF937B +:10110000EC0182389105A9F1D8F58133910509F4F4 +:1011100096C048F58932910509F48AC08A9709F486 +:1011200095C0C11521E5D20708F0BCC0C11530E556 +:10113000D30708F014C1C83ED10508F09CC0C03EDA +:10114000D10560F5C83AD10508F087C0C53AD10588 +:1011500008F0FDC0C130D10509F12097F9F0C43085 +:10116000D105E0F440C08533910509F45AC0C99710 +:10117000C1F680916503837089F0C0EED0E00EC0A7 +:10118000833E910599F170F4803E910501F1823E14 +:10119000910539F68091650382FD21C0CE01DF9172 +:1011A000CF910895863E910561F1873E910571F1D9 +:1011B000843E910509F0B5CF8091660381FFEECFA3 +:1011C00080916503C7EED0E084FD0DC0E7CF80912C +:1011D000650380FD12C19091660390FFDFCFC3EEDF +:1011E000D0E084FFDBCFD0E0C0E0D8CF80916503B2 +:1011F00082FD06C19091660390FDBFCF84FFCECFE4 +:10120000F2CF8091650383FDDDCFC8CF8091650368 +:1012100083FDF9C09091660391FFF0CFC4EED0E05A +:10122000BDCF8091650385FFB9CFC9E2D0E0B6CFCD +:101230008091650385FFB2CFC5E3D0E0AFCF809149 +:10124000650386FFABCFCAE2D0E0A8CF80916503EB +:1012500086FFA4CFC1E3D0E0A1CFCF3BD10518F6E4 +:10126000C85AD0E0CC0FDD1FC25BDE4F0990D88199 +:10127000C02DD46493CFC11540E2D40758F4C115F2 +:1012800081E0D80708F08ACFC03FD10508F4ABCF82 +:10129000D06584CFC11590E4D90708F4A4CFDF70DE +:1012A000D06A7CCFC11525E5D20700F5C11534E51C +:1012B000D30708F08AC0C11543E5D40708F071C010 +:1012C000C11582E5D80708F467C0CE01837099275D +:1012D00021E030E002C0220F331F8A95E2F7C69565 +:1012E000C69580E2C89FE001112452C0C11599E55E +:1012F000D907A8F4C11528E5D20708F06BC0C115BD +:1013000036E5D30708F06FCF8C2F0E943B08C82F1B +:10131000D0E0DC2FCC27CC27DF71D0623FCFC115C6 +:101320004AE5D40708F45BC0CE019056811590427F +:1013300008F059CF8D2F8F710E943B0890E0982FB5 +:10134000882788279F719C012C2BE901E6CFC55A7D +:10135000D0E0C55BDE4FC881D0E0D0641FCFCE01A6 +:10136000E4E096958795EA95E1F783702C2F269512 +:101370002695237040E2249F90011124382B8C2F56 +:101380008370C1E0D0E002C0CC0FDD1F8A95E2F788 +:10139000C22BD32BDC6802CFDC2FCC27C16FD06AE5 +:1013A000FDCECE018370992721E030E002C0220FEC +:1013B000331F8A95E2F7C695C69590E2C99FE00172 +:1013C0001124C22BD32BDA68E9CEDC2FCC27C46FD3 +:1013D000D06AE4CEDC2FCC27C06FD06ADFCE8C2F52 +:1013E0008F700E943B0834E0D695C7953A95E1F797 +:1013F000CF709C2FEC01D069D1CEC9E3D0E0CECE26 +:10140000C2EED0E0CBCEC6EED0E0C8CE809148028E +:101410008111109248020895809590916B03982352 +:1014200090936B03089580916B0390914702892BF1 +:1014300090914602892B8093CC0190914802992388 +:10144000A1F0892B8093CC0180914A01882341F13E +:101450008091650387FF24C08EE1EEECF1E090E01F +:10146000815000F591110E94060AE0915C03F09111 +:101470005D033097E1F080914A01882359F0809113 +:10148000650387FF07C08091CC018093CD0186E082 +:101490008093CC010280F381E02D8CEC91E00994E3 +:1014A00086E0DBCF21912223D9F29F5FD9CF089527 +:1014B0008091440290910302981301C008958F5FB8 +:1014C0008770FACF990F990F890F982F977086958B +:1014D0008695869524E0829FF0011124E151FE4F0C +:1014E00050E040E080E0219130E0092E02C03695C6 +:1014F00027950A94E2F721703327042E01C0220FAA +:101500000A94EAF7822B4F5F5F4F4430510559F739 +:101510000895990F990F890F982F977041E001C096 +:10152000440F9A95EAF786958695869594E0899F6B +:10153000F0011124E151FE4F30E020E070E05191C4 +:10154000DF011197CB01022E02C0969587950A9470 +:10155000E2F7817081958527842385278C932F5FFF +:101560003F4F2430310559F7089590E080E00E9404 +:10157000D00590E080E00E94BA05109247021092D8 +:1015800046020E94130A86E0E0E8F2E0DF011D92C5 +:101590008A95E9F710927A021092790210927B02F2 +:1015A0000C94E60690934A02809349020C94B50A83 +:1015B000882341F0809590914702892380934702C8 +:1015C0000C94130A0895882339F090914702982BC0 +:1015D000909347020C94130A0895882321F00E94E7 +:1015E0000C0A0C94130A0895882339F090916B0328 +:1015F000982B90936B030C94130A0895882379F128 +:101600009CEF980F913A38F4682F8CEC91E00E948F +:1016100090050C94130A90E2980F983050F487705C +:1016200091E001C0990F8A95EAF7892F0E940C0A70 +:10163000F0CF9BE5980F933020F490E080E00C947D +:10164000D00598E5980F973120F490E080E00C9455 +:10165000BA05803F20F00E940D070C94E60608951D +:10166000CF93C82F882309F49CC08CEF8C0F813A4C +:1016700008F064C080914A018823D1F1809165030C +:1016800087FF36C0EC2FE695E695E695F0E0E4534B +:10169000FE4F828190E04C2F477021E030E002C085 +:1016A000220F331F4A95E2F782239323892B61F09F +:1016B0006C2F8CEC91E00E9490050E94130A22C0CE +:1016C0008091650387FF22C0EC2FE695E695E695AD +:1016D000F0E0E453FE4FC77021E030E001C0220F7C +:1016E000CA95EAF78281822B8283CF910C94130AE8 +:1016F000EEECF1E084ED91E02191C217C9F28E1772 +:101700009F07D1F780914A018111DACFAEECB1E0A9 +:10171000EFEF80E09D91C91741F3EF3F19F491116C +:1017200001C0E82F8F5F8630A9F7EF3FF1F20E2E50 +:10173000000CFF0BE453FE4FC283D7CF80E28C0F27 +:10174000883068F4C77021E030E001C0220FCA95EC +:10175000EAF780916B03822B80936B03C6CFEBE596 +:10176000EC0FE33040F4F0E0E55BFE4F808190E069 +:10177000CF910C94D005E8E5EC0FE73150F4F0E0A0 +:10178000EE0FFF1FE25BFE4F80819181CF910C94A1 +:10179000BA05C03F30F08C2F0E94C807CF910C943F +:1017A000E606CF910895809580FF08C0589A81FF82 +:1017B00007C05D9A82FF06C05C9A08955898F7CFDB +:1017C0005D98F8CF5C9808958093670370936903E0 +:1017D00060936803809190038430F9F48093E9006A +:1017E0008FEF9091E800815095FD06C095ED9A9598 +:1017F000F1F700008111F5CF8091E80085FF0DC061 +:1018000050E040E063E070E087E693E00E94370438 +:101810008091E8008E778093E8000895BC0184E011 +:101820000C94E40BBC0183E00C94E40B9C0184E079 +:101830008093E9009FEF8091E800915085FD06C0FC +:1018400085ED8A95F1F700009111F5CF8091E800C0 +:1018500085FF0CC050E040E066E070E0C9010E94E6 +:1018600037048091E8008E778093E8000895CF9345 +:10187000DF93EC0180914A018823B1F180916503E7 +:1018800087FF32C060E284E08093E9008FEF90919F +:10189000E800815095FD06C095ED9A95F1F700009E +:1018A0008111F5CF8091E80085FF1BC080914A012E +:1018B00070E050E040E0811104C050E040E068E09A +:1018C00070E0CE010E9437048091E8008E7780930B +:1018D000E80080E2FE01AEE6B3E001900D928A9549 +:1018E000E1F7DF91CF91089568E081E0CDCF81E00D +:1018F0008093E00080E28093D8001092C9008FE1CD +:101900009EE40197F1F700C0000087E090EBDC0156 +:1019100080939C0390939D03A0939E03B0939F0399 +:1019200088E19CE00FB6F894A895809360000FBE04 +:1019300090936000FFCFCF92DF92EF920F931F93AF +:10194000CF93DF93CDB7DEB7C455D1090FB6F89466 +:10195000DEBF0FBECDBF60911B018091E50280FF0D +:101960004CC0EFEAF3E09E012F5F3F4F8E010B5A10 +:101970001F4FC901A4914A2F50E0DA01AA0FBB1FE3 +:10198000A40FB51FAF56BD4FCD90DD90EC90D9019F +:10199000CD92DD92ED929D013196A017B10751F7DE +:1019A00020911A0143E0249F800D911D1124279A54 +:1019B00025B12F7735B130685FB7F894FC01649F8B +:1019C000E00DF11D1124BF018617970749F55FBF90 +:1019D000EFE5F4E03197F1F700C00000CC5ADF4F9B +:1019E0000FB6F894DEBF0FBECDBFDF91CF911F9130 +:1019F0000F91EF90DF90CF90089580911C0190910E +:101A00001D0123E0829FF0011124EF56FD4F89173D +:101A100008F0A7CF1182108212828F5F3396F7CF22 +:101A2000DC014D91CD01E8E035B9000000C047FF71 +:101A300025B9440F000000C000C000C025B900C097 +:101A4000EA9591F7C1CF0F931F93CF93DF93EC01EA +:101A500010E000E090911E019017110609F06CF45F +:101A60000E949B0C8C8190E00196817099278C8359 +:101A7000DF91CF911F910F91089520911C01A80132 +:101A8000420F511D9A01220F331F240F351F2F566D +:101A90003D4F4C816091E7028091E6029695901748 +:101AA000110651F04CF0442349F04091E8020E94A5 +:101AB0004D060F5F1F4FCECF4423B9F340E0F7CF61 +:101AC0008F929F92AF92BF92CF92DF92EF92FF924E +:101AD0000F931F93CF93DF93EC014C81042F10E001 +:101AE0009801D8010E945D2D9B01AC010E94732DCD +:101AF0004B015C01E0E2F0E0E01BF10BA5E5B0E09A +:101B0000AC019B010E94732D6B017C019F01DF01E1 +:101B10000E94552D9B01AC010E947E2D9B01AC01C2 +:101B2000280D391D4A1D5B1DC701B6010E94262DD7 +:101B3000F22E822F90E039E23F1560F143E0249FBE +:101B40009001112435952795122F109500E085E519 +:101B5000E82EEF1880911E01081758F10E949B0C87 +:101B60009C8181E0992319F0903219F48FEF8093D2 +:101B7000190180911901890F8C83DF91CF911F91F9 +:101B80000F91FF90EF90DF90CF90BF90AF909F901C +:101B90008F90089525E530E0B901681B790B9B0112 +:101BA000220F331F260F371F37FFCCCF2F5F3F4F3A +:101BB000C9CF8E2D01FD8F2D20911C01622F600F4A +:101BC0007727771F9B01220F331F260F371F2F56B2 +:101BD0003D4F412F6091E7020E944D060F5FBACF43 +:101BE0000F931F93CF93DF9380911C0190911D0160 +:101BF00023E0829FF0011124EF56FD4F891740F139 +:101C0000C0E0D3E060911E01C61740F10E949B0C1A +:101C10002091170180918F02820F80938F02909103 +:101C20001801920F90931801191654F4082E000C05 +:101C3000990B40911E014150550B841795071CF0DC +:101C4000219520931701DF91CF911F910F91089556 +:101C50001182108212828F5F3396D0CF0C2F10E04A +:101C600070E0C8010E94122D20911C01820F482FA4 +:101C700050E020918F02022E000C330B0217130745 +:101C8000BCF020911801022E000C330B20173107F5 +:101C90007CF08D9F900111242F563D4F4091E8021A +:101CA0006091E7028091E6020E944D06CF5FAACFC5 +:101CB000FA01EE0FFF1FE40FF51FEF56FD4F1182E3 +:101CC00010821282F3CF9F92AF92BF92CF92DF9297 +:101CD000EF92FF920F931F93CF93DF93FC018281CA +:101CE0000FEF80FF01E010E04CE1942EA0901E0168 +:101CF0001A15D0F00E949B0C80918E02013009F0E1 +:101D000054C0811102C080911E01815080938E02C7 +:101D1000DF91CF911F910F91FF90EF90DF90CF90C7 +:101D2000BF90AF909F900895C0911C01C12ED12CFF +:101D3000CC0DDD2DD11DCE01880F991FC80FD91FE5 +:101D4000CF56DD4F198218821A8234E0E32EF12C2F +:101D5000B12C80918E028B0D8D311CF1692D0E946A +:101D6000F02C892F082E000C990BC816D90691F477 +:101D70008091E8028E9DA0018F9D500D11245595F4 +:101D80004795559547959E016091E7028091E6023F +:101D90000E944D06B00EF1E0EF1AF108D1F61F5F78 +:101DA000A5CF87FFDFCF8A0DDDCF90E00196609150 +:101DB0001E0170E00E94122DA9CFEF92FF921F9397 +:101DC000CF93DF93EC0110E0EE24EA94F12C6091C4 +:101DD0001E01161770F00E949B0C9A818C8190FF57 +:101DE00027C08F5F8C83DF91CF911F91FF90EF9081 +:101DF000089520911C01422F410F5527551FCA01FC +:101E00009A01220F331F280F391F2F563D4F70E0C4 +:101E1000C7010E94122D962F8C814091E80260919B +:101E2000E702199F800D11240E944D061F5FCFCF3E +:101E30008150D8CF1F93CF93DF9300D00F92CDB7AF +:101E4000DEB7122F9091E50290FF16C09E012F5F22 +:101E50003F4F0E944D068B819981212F30E0F9017F +:101E6000EE0FFF1FE20FF31FEF56FD4F2A81218374 +:101E7000908382830E949B0C0F900F900F90DF91B4 +:101E8000CF911F9108959091E50290FF14C0909119 +:101E90001C0120911D0133E0939FF0011124EF56A6 +:101EA000FD4F921710F00C949B0C8183608342834A +:101EB0009F5F3396F6CF08950F931F93CF93DF93D1 +:101EC00000D00F92CDB7DEB78C01809190028111C6 +:101ED0000AC09E012F5F3F4F44EB6FEF0E944D06FB +:101EE0008A8180939002F8016481613069F0809169 +:101EF000900240E0662361F040E0623011F44091CE +:101F0000900280E060E004C06091900240E080E0D8 +:101F10000E94430FF801848190E0019663E070E035 +:101F20000E94122D84830F900F900F90DF91CF911C +:101F30001F910F910895CF93DF9300D00F92CDB7EB +:101F4000DEB79091E50290FF0AC09E012F5F3F4FE0 +:101F50000E944D064B8169818A810E94430F0F9038 +:101F60000F900F90DF91CF910895CF93DF93EC0105 +:101F7000E5EEF2E0438162818C810E949B0F8C81AF +:101F80008F5F8C83DF91CF910895CF93DF93EC0126 +:101F9000EC81F0E0E553FC4F4491E5EEF2E0628124 +:101FA00081810E949B0F8C818F5F8C83DF91CF9109 +:101FB00008951F93CF93DF93182FCAE0D0E08933A1 +:101FC00011F4C0E5D0E0812F0E94300B8FE99FE033 +:101FD0000197F1F700C000002197C1F7812FDF9131 +:101FE000CF911F910C94FE0ADF92EF92FF920F9314 +:101FF0001F93CF93DF93E82FF0E0E85EFD4FD4907E +:10200000282F26952695269530E0F901E85FFD4FAB +:102010000491877010E0082E02C0159507950A9468 +:10202000E2F701701127F901E850FE4FE490F12C1E +:10203000082E02C0F594E7940A94E2F791E0E922B1 +:10204000FF24F901E851FE4FC491D0E002C0D595BC +:10205000C7958A95E2F7C170DD270115110519F0C2 +:1020600081EE0E94300BE114F10419F086EE0E941B +:10207000300B8D2D0E94D90FEF2819F086EE0E94AB +:10208000FE0A012B19F081EE0E94FE0ACD2B51F0C1 +:102090008CE2DF91CF911F910F91FF90EF90DF9035 +:1020A0000C94D90FDF91CF911F910F91FF90EF907A +:1020B000DF900895CF93DF93C7E0D2E060E0CE01D8 +:1020C0000E94A62D2196C11584E0D807B9F7DF91AB +:1020D000CF9108956F927F928F929F92AF92BF920D +:1020E000CF92DF92EF92FF920F931F93CF93DF93E4 +:1020F0008BECC82E84E0D82E0FE510E0E801E097C5 +:1021000036011CC0F50185909490692DC7010E948D +:10211000A62D682DC70101960E94A62D82E0A80E6B +:10212000B11C82E0E80EF11CCE15DF0559F788E0FE +:10213000680E711C28960C171D0731F07E0188E08F +:10214000E81AF1085301DECF005D1F4F80E3C80E8F +:10215000D11C0F3382E0180789F6DF91CF911F91D0 +:102160000F91FF90EF90DF90CF90BF90AF909F9036 +:102170008F907F906F900895CF93C82F6FEF81114C +:1021800062E283E290E00E94A62D6FEFC11161E050 +:1021900084E290E00E94A62D6FEFC11162E085E21B +:1021A00090E0CF910C94A62D80E00E94BC1060E0DE +:1021B00086E290E00E94A62D0E946A100E945A10AA +:1021C00081E00C94BC100F931F93CF93DF9328E012 +:1021D000629FE001112450E0440F551FC40FD51F2A +:1021E00030E3839FC00DD11D1124CE0187960E943C +:1021F000922D082F10E0102F0027CE0188960E9404 +:10220000922D9801282BC901DF91CF911F910F9139 +:102210000895462F8A3038F4763028F4643018F464 +:10222000672F0C94E31090E080E00895BF92CF9266 +:10223000DF92EF92FF920F931F93CF93DF937C0176 +:1022400000919A0310919B038091490290914A0258 +:10225000082B192BCFE0D0E0CC24C394D12CBC2E7A +:10226000C6010C2E02C0880F991F0A94E2F7802342 +:102270009123892B71F4219790F7B12C8B2DDF914D +:10228000CF911F910F91FF90EF90DF90CF90BF9073 +:102290000895B7018C2F0E9409110E947E080197B2 +:1022A00051F3ECCFCF93DF93EC010E941611BE01E6 +:1022B0000E940911DF91CF910C947E08FC01868168 +:1022C0009781009779F00E947E08292F2F709295B0 +:1022D0009F7092509E30A0F4E92FF0E0EA50F24D4A +:1022E0000C94482D808191810E945211EECF803F45 +:1022F00019F020F4883E20F481E00895843FE1F352 +:1023000080E00895883EC0F3813FD1F7F5CF822F5A +:1023100086958695869508951F93CF93DF9300D079 +:1023200000D00F92CDB7DEB7FC0126813781211591 +:10233000310541F525E0DE01119601900D922A95B7 +:10234000E1F7FC01228189819A812223B9F0662379 +:10235000A9F00E941611182F682F89819A810E9476 +:10236000890A69817A81812F0F900F900F900F90C9 +:102370000F90DF91CF911F910C9409110E94620A76 +:10238000182FEFCFC9010F900F900F900F900F9063 +:10239000DF91CF911F91089583E290E00E94922DEA +:1023A000823289F484E290E00E94922D813059F4C7 +:1023B00085E290E00E94922D91E0823009F090E059 +:1023C000892F8170089580E0FCCF6091E5026695C9 +:1023D00070E04BE050E08CE091E00E94DA2D892B18 +:1023E00019F481E080938D020E9484059093870206 +:1023F000809386020895CF92DF92EF92FF926B0155 +:102400007C010E943706B701A60188E090E0FF90AA +:10241000EF90DF90CF900C94B82DAF92BF92CF92F7 +:10242000DF92EF92FF920F931F93CF93DF9300D031 +:102430000F92CDB7DEB7182FF62E042FE22E909113 +:10244000E50290FF29C0E92FE695AE2FB0E0AA562D +:10245000BE4F8C9180938C029E7F923059F59E01E5 +:102460002F5F3F4F812F0E944D064B8169818A81EA +:102470000E94430F1093E602F092E7020093E802F5 +:10248000EE2051F06091E5027091E6028091E70242 +:102490009091E8020E94FB110F900F900F90DF9136 +:1024A000CF911F910F91FF90EF90DF90CF90BF9051 +:1024B000AF900895823019F40091E802DBCF8630A6 +:1024C00019F41091E602D6CF8930D9F3893191F60B +:1024D000E9518E2F8170D82EE695F0E0E655FC4F3D +:1024E000A590B490C12CBB2460911E01C61618F0B3 +:1024F0000E949B0CBFCF2C2D30E0A29EC001A39E5A +:10250000900DB29E900D112470E00E94FE2C812F40 +:10251000D11013C0860F40911C01420F532F511D43 +:102520009A01220F331F240F351F2F563D4F402F86 +:102530006F2D0E944D06C394D7CF861BECCFE5EEDE +:10254000F2E0438128E0421B08F440E021E0628190 +:1025500081810C940D12E5EEF2E0438128E0420FF8 +:1025600008F44FEF21E0628181810C940D12E5EEB9 +:10257000F2E0628128E0621B08F460E021E0438120 +:1025800081810C940D12E5EEF2E0628128E0620F89 +:1025900008F46FEF21E0438181810C940D12E5EE88 +:1025A000F2E0818121E04381628188500C940D1218 +:1025B000E5EEF2E0818121E043816281885F0C9445 +:1025C0000D12CF93DF93D82FC92F292F30E088E049 +:1025D0002115310519F42D2F392F80E0A90174E060 +:1025E000569547957A95E1F74115510511F08C5FA5 +:1025F0009A01A9015695479556954795411551055C +:1026000011F08E5F9A0136952795232B09F08F5F85 +:10261000823001F148F4882381F08130A9F08D2FB8 +:102620009C2FDF91CF9108958330C9F08430B9F7A2 +:1026300020E044E66FEF8FE004C020E044E668EC61 +:1026400083E70E940D12EBCF20E044E66FEF85E0B8 +:102650000E940D1220E044E66FEF80EAF2CF20E006 +:1026600044E66FEF87EDEDCF0E94E11290939B035C +:1026700080939A030C94B50A80919A0390919B03DE +:102680009C01267033272630310519F488600C949C +:102690003413877FFCCF21E030E002C0220F331FCC +:1026A0008A95E2F72095309580919A0390919B034B +:1026B000822393230C9434139091450280958923AF +:1026C00080934502282F277091F4282F082E000CA4 +:1026D000330B9217130659F09091660392FD07C0D1 +:1026E0008595859585950E944B1310924502089516 +:1026F000CF93C0916603C2FB992790F9981799F080 +:1027000080FBC2F9C09366036091650384E090E0AA +:102710000E94A62D6C2F82E290E00E94A62D82E0FE +:10272000CF910C945C13CF91089521E030E002C06A +:10273000220F331F8A95E2F780919A0390919B03B1 +:10274000822B932B0C9434138091E902882319F087 +:1027500081508093E9026091E5027091E6028091D8 +:10276000E7029091E8020C94FB118091E90283301A +:1027700018F48F5F8093E9026091E5027091E602A0 +:102780008091E7029091E8020C94FB119091E50290 +:1027900090FF36C09170811129C092609093E5023C +:1027A000662351F06091E5027091E6028091E702A4 +:1027B0009091E8020E94FB116091E502669570E03D +:1027C0004BE050E08CE091E00E94DA2D892BA9F0DB +:1027D00010928D0281E08093890220E04091E8020E +:1027E0006091E7028091E6020C940D12853210F0A0 +:1027F0009864D4CF880F982BD1CF0E94E511EACFEF +:10280000089560E00C94C6138091E502869581508E +:1028100009F484E261E00C94C6138091E502869588 +:102820008F5F853208F081E061E00C94C6139091CF +:10283000E50290FF07C09695981720F0961710F4C0 +:102840000C940D1461E00C94C613E5EEF2E083E005 +:10285000808311828FEF828388E283831482608178 +:102860007181828193810C94FB1180914A01EEEC7D +:10287000F1E0882359F08091650387FF07C08EE15E +:10288000DF011D928A95E9F70C94B50A86E0F8CF2E +:102890001F93CF93DF93CDB7DEB7AA970FB6F89407 +:1028A000DEBF0FBECDBF82E993E02091F100DC01D5 +:1028B0002D93CD01B3E08A399B07B9F7809193033B +:1028C000833009F472C0B8F4813009F449C0823011 +:1028D00009F4B5C08091E80083FF8DC28091920316 +:1028E000909193039A3008F086C2E92FF0E0EC5FF4 +:1028F000F14D0C94482D8A3009F490C08B3009F4C6 +:1029000071C0893039F780919203813219F7809133 +:10291000960390919703009711F00297D9F6809152 +:10292000E800877F8093E8008091E80082FF38C04C +:102930009091F3008091F200029731F48091F100C0 +:10294000813011F0863021F48091F10080936D0385 +:102950008091E8008B778093E8000E946104BACFF1 +:1029600080919203813A09F0B5CF8091E800877F8A +:102970008093E8008091960390919703892B61F4EE +:1029800060E28EE693E070E00E9413058091E8001B +:102990008B778093E8009ECF60E090E080E0F3CFFB +:1029A000809190038111C0CF95CF80919203813A9D +:1029B00009F090CF8091960390919703892B09F0AD +:1029C00089CF8091E800877F8093E8008091E800BC +:1029D00080FFFCCF80914A018093F1008091E80054 +:1029E0008E77B9CF80919203813209F073CF8091B5 +:1029F000960390919703892B09F06CCF8091E800A2 +:102A0000877F8093E8000E94610480919403809303 +:102A10004A0110926B030E9435145CCF809192039F +:102A2000813209F057CF8091E800877F8093E800DA +:102A30000E9461048091950380936C034BCF809139 +:102A40009203813A09F046CF8091E800877F809316 +:102A5000E8008091E80080FFFCCF80916C03BCCF40 +:102A6000803899F0823809F0C6C1809196038F7042 +:102A7000873008F0C0C18093E9008091EB0085FBAE +:102A8000882780F91092E90006C080918E0390910A +:102A90008F03911182609091E800977F9093E800F6 +:102AA0008093F1001092F1008091E8008E779FC131 +:102AB000882309F48DC1823009F09DC1809194036F +:102AC000811190C1809196038F702FEF280F2630CF +:102AD00008F091C18093E9002091EB0020FF82C1B2 +:102AE000933031F48091EB0080628093EB007AC1E7 +:102AF0009091EB0090619093EB0021E030E001C0F9 +:102B0000220F8A95EAF72093EA001092EA0080915A +:102B1000EB008860EACF81116EC1109194031F779A +:102B20008091E3008078812B8093E3008091E8001E +:102B3000877F8093E8000E9461048091E80080FF15 +:102B4000FCCF8091E30080688093E30082E0111164 +:102B500083E0809390034FC18058823008F04BC1CE +:102B600020919403309195032C3DE3E03E07A1F5BD +:102B700083E08A838AE289834FB7F894DE01139653 +:102B800020E03EE051E2E32FF0E050935700E49163 +:102B900020FF03C0E295EF703F5FEF708E2F90E053 +:102BA000EA30C0F0C7968D939D932F5F243159F77B +:102BB0004FBF8091E800877F8093E8006AE270E071 +:102BC000CE0101960E9413058091E8008B778093D7 +:102BD000E80011C1C096E7CF8091960390919703CA +:102BE000432F55274330510509F44AC078F5413049 +:102BF000510509F47AC08BE590E0EBEAF6E042304B +:102C0000510509F0F8C02091E800277F2093E800E3 +:102C100020919803309199038217930708F49C013F +:102C200040E02115310509F065C0411163C0809174 +:102C3000E80082FDC9CF80919003882329F2853076 +:102C400019F28091E80083FFF2CFBECF41325105E7 +:102C500009F43CC04232510509F0CDC083309105E2 +:102C600008F0C9C0FC01EE0FFF1FE254FE4F0190B7 +:102C7000F081E02D85549E4FDC018C9190E01AC0CC +:102C8000332721303105D1F02115310561F0223093 +:102C9000310509F0B0C0E8E1F7E0E4918E2F90E053 +:102CA000E8E1F7E007C0E8E3F7E0E4918E2F90E079 +:102CB000E8E3F7E0009709F49EC0A5CFE4E2F7E06F +:102CC000E4918E2F90E0E4E2F7E0F4CF83309105B9 +:102CD00008F091C0880F991FFC01EC53FE4F019042 +:102CE000F081E02D89E090E08ECF82E190E0E6E097 +:102CF000F7E089CF80919003882309F465CF853070 +:102D000009F462CF8091E80083FD5ECF8091E800F6 +:102D100082FD8DCF8091E80080FF83CF9091F300FA +:102D20008091F2002115310519F08830910550F09D +:102D300041E0089709F040E08091E8008E778093A9 +:102D4000E8006FCF44914093F10031962150310952 +:102D50000196E8CF803809F04EC08091E800877F67 +:102D60008093E800809191038093F1009DCE8111C2 +:102D700042C0109194031230F0F58091E800877FF3 +:102D80008093E800109391030E946104112311F0D5 +:102D900084E005C08091E30087FDFACF81E0809355 +:102DA000900342E061EC81E00E94800442E261EC29 +:102DB00084E00E94800442E261EC82E00E94800490 +:102DC00042E260EC83E00E9480048091900313C093 +:102DD00080919403813079F481E0933009F080E0B0 +:102DE00080938F031092E9008091E800877F8093A1 +:102DF000E8000E9461048091E80083FF0AC080918E +:102E0000E800877F8093E8008091EB0080628093E8 +:102E1000EB00AA960FB6F894DEBF0FBECDBFDF91D0 +:102E2000CF911F91089569EE7EEF90E080E00E94BF +:102E3000C42D60E082E090E00E94A62D60E083E077 +:102E400090E00E94A62D10924A021092490260E082 +:102E500084E090E00E94A62D60E082E290E00E9473 +:102E6000A62D60E085E090E00E94A62D60E086E05F +:102E700090E00E94A62D6FEF87E090E00E94A62DC3 +:102E800040E050E0BA0188E090E00E94B82D60E098 +:102E90008DE090E00E94A62D40E050E0BA0188E16C +:102EA00090E00E94B82D60E087E190E00E94A62D9E +:102EB00040E050E0BA018CE190E00E94B82D70E053 +:102EC00060E080E290E00E94C42D40E050E0BA0152 +:102ED00088E190E00E94B82D80E00E94BC100E9422 +:102EE000D41040E050E0BA018FE090E00E94B82D8D +:102EF00040E050E0BA0183E190E00C94B82D8F924D +:102F00009F92AF92BF92CF92DF92EF92FF920F9378 +:102F10001F93CF93DF9300D000D0CDB7DEB76C0105 +:102F2000FC0183819481892B31F0808191818923F7 +:102F30008F3F09F057C60F900F900F900F90DF91C1 +:102F4000CF911F910F91FF90EF90DF90CF90BF90A6 +:102F5000AF909F908F900895980122513F45203166 +:102F6000310508F034C68FEF93E00E94922D025194 +:102F700077E0E72E72E0F72E882361F18091450219 +:102F80008770C9F2F60182818823A9F280916603D5 +:102F900082FDD1CF82E00F900F900F900F90DF91C4 +:102FA000CF911F910F91FF90EF90DF90CF90BF9046 +:102FB000AF909F908F900C945C13E114F4E0FF06A7 +:102FC000E9F2C7010E94922D811101C001502FEF3B +:102FD000E21AF20A0111F1CF1C821B82BB24B394C6 +:102FE0006AE0A62E87010F5F1F4FC7010E94922D36 +:102FF00089831A82882311F29FEF980F933008F586 +:103000008A83B98232E0E30EF11CC8010E94922D3E +:103010008B83882309F4B2CF8E010F5F1F4FF80115 +:1030200080818823F9F2813009F043C09181828147 +:10303000913049F40E5F1F4F0E94D90F0F5F1F4F51 +:10304000EECF7801E9CF923029F40E5F1F4F0E9436 +:10305000300BF4CF933029F40E5F1F4F0E94FE0A0D +:10306000EDCF943019F00F5F1F4FE8CF0E5F1F4F69 +:1030700030E020E0B8016F5F7F4FF801418180535D +:10308000990B8A30910550F021503109B8F28FE93F +:103090009FE00197F1F700C00000F6CFA29EF0017B +:1030A000A39EF00D11249C012E0F3F1F842F8B0136 +:1030B000E1CF0E94F40FC2CF81E00E9495130E94DD +:1030C0003C135CCF81E00E944B13F9CF82E0FBCF31 +:1030D000882309F41AC180915A02811106C081E047 +:1030E00080935A0282EE0E94300B0E9484059093D6 +:1030F0005902809358028BE20E94300BF6018281C4 +:10310000882369F0C801815E9C45059740F46FE112 +:10311000600F60935B028CE090E00E94A62D17FF89 +:1031200070C0F6018281882309F46BC00E94E60515 +:10313000869581708093EE010E94E60581708093F0 +:10314000ED0180915B02813039F48091EE0188239A +:1031500019F089E30E94D90F80916B038093EC01F1 +:1031600010926B0380915B02813009F4B7C1882310 +:1031700009F4B0C1823009F4C4C1843009F4D5C166 +:103180008FE39CE90197F1F700C000005801E89433 +:10319000B7F84CE0E42EF12C5AE0852E912CC501B5 +:1031A0000E2C02C0969587950A94E2F78F70909145 +:1031B0005B02923009F0C0C18A3008F0BBC190E0D8 +:1031C0000996B4010E94122D875A0E94D90F94E0EB +:1031D000E91AF108ECEFEE16EFEFFE0601F7809129 +:1031E0005B02813009F4B6C1882309F4AFC1823093 +:1031F00009F4BCC1843009F4C2C18091EC01809310 +:103200006B03F6018281882369F180916B038272DE +:103210000C3CFCE51F0709F465C208F0E5C1063C5B +:103220003CE5130709F44AC208F0BCC1033CECE5D5 +:103230001E0709F439C208F0A4C1023C2CE51207AC +:1032400009F40BC20A358DE5180709F489C208F0A4 +:1032500063C20115ECE51E0709F470C20E3D1C4562 +:1032600009F47BC2F60186819781009709F47CC23C +:103270000E947E088C01F601F280B580B2943FE096 +:10328000B322809145028770C1F0AF2CFF20B1F0CE +:10329000812F807F803421F080E2800F883068F0B9 +:1032A0008091660382FD09C082E00E945C138091D8 +:1032B00045028770AA24A3948111A12C912E929487 +:1032C0002FE09222FBE0F91508F4CDC2E92DF0E0E1 +:1032D000E25FF14D0C94482D8823A1F080915A02B1 +:1032E000811106C081E080935A0282EE0E94300B69 +:1032F0000E948405909359028093580281EE0E94A7 +:10330000300BF9CE81EE0E94FE0A8BE20E94FE0A8B +:10331000F5CE882309F4F2CE81EE0E94300B83EEC5 +:103320000E94300B8FE40E94300B8FE40E94FE0A53 +:1033300083EE0E94FE0A81EEE9CF882309F4DECEF7 +:1033400081EE0E94300B83EE0E94300B80E50E94DC +:10335000300B80E5EBCF882309F410CE1091570293 +:1033600081E01827109357020E948405909356021B +:10337000809355021123C9F028E148E76FEF8FE0F1 +:103380000E941A0F29E148E76FEF8FE00E941A0FA1 +:103390002AE148E76FEF8FE00E941A0F2BE148E720 +:1033A0006FEF8FE00E941A0FE9CD10921C018CE1A3 +:1033B00080931D0180931E0181E20E940114DECDE5 +:1033C000882309F49BCE80EE0E94300B81EE0E9490 +:1033D000300B80E10E94300B80E10E94FE0A81EEFA +:1033E0000E94FE0A80EE0E94FE0A80914E0291E049 +:1033F00022E148E76FEF892780934E02882351F03E +:103400008FE00E941A0F26E148E76FEF8FE00E94DD +:103410001A0F74CE8FEC0E941A0F26E148E76FEF67 +:103420008FECF5CF882309F4A9CD1091540201E067 +:103430001027109354020E948405909352028093A7 +:1034400051028091530210921C01882319F18CE1E2 +:1034500080931D0180931E0181E20E94011428E0E7 +:1034600044E666EE80E00E941A0F29E044E666EE2C +:1034700080E00E941A0F2DE044E666EE80E00E9494 +:103480001A0F00935402109253021092500210929D +:103490004F0274CD8CE180931D0180931E0181E267 +:1034A0001123A9F00E94011428E044E666EE80E0B2 +:1034B0000E941A0F29E044E666EE80E00E941A0F8F +:1034C0002DE044E666EE80E00E941A0FDCCF0E94F9 +:1034D0000114D9CF82EE0E94300B52CE83E00E94BD +:1034E000E30A88E10E94300B8FE39CE90197F1F732 +:1034F00000C0000088E10E94FE0A83E00E94D80A12 +:103500003FCE8091ED01811103C083E50E94D90F68 +:1035100082EE0E94300BEFE3FCE93197F1F700C037 +:10352000000087E50E94D90F2BCE86EE0E94D90FAE +:1035300088E1F8CF865049CE96EF980F963020F06C +:10354000805D0E94F40F43CE895AFBCF82EE0E9429 +:10355000FE0A53CE8CE20E94D90F8091EE0188239F +:1035600009F44BCE89E30E94D90F47CE82EE0E9428 +:10357000FE0A8091ED01811140CE83E5F4CF88E20F +:10358000F2CF043C3CE5130709F493C04FEC52E141 +:1035900068ED72E1053C9CE5190709F053CE0E94E5 +:1035A0003106ECCC093CECE51E0709F491C070F43F +:1035B000073C2CE5120709F486C043EC52E167EBA7 +:1035C00072E1083C3CE5130751F33CCE0A3C9CE514 +:1035D000190709F482C044EA53E165EB73E10B3C3F +:1035E000ECE51E07E1F22ECE013DFCE51F0709F4D4 +:1035F00087C0B0F40E3C3CE5130709F47BC008F427 +:1036000076C00F3C9CE5190709F477C06EE089E0AD +:10361000003DECE51E0709F015CE0E941714AECC54 +:10362000043DFCE51F0709F471C068F4023D3CE568 +:10363000130709F468C0033D8CE5180709F002CEB2 +:1036400061E088E12EC0053D9CE5190709F461C0E1 +:103650000D35100709F492CCF5CD8091E50280FF7D +:103660001BC08E7F8093E5026091E5027091E602B7 +:103670008091E7029091E8020E94FB1110928D0266 +:10368000FFEF20E732E0F15020403040E1F700C08A +:1036900000000E949B0C72CC81608093E50261E087 +:1036A00086950E94C6136ACC44E054E16DE074E153 +:1036B00076CF4DE054E164E074E171CF48ED52E122 +:1036C0006FEC72E16CCF47EB52E163EC72E167CFD4 +:1036D0004FE952E16BEA72E162CF4BEA52E16FE9E6 +:1036E00072E15DCF45EB53E164EA73E158CF61E0ED +:1036F00081E0D7CF65E082E090CF68E086E08DCFB3 +:1037000064E18FE08ACF67E185E187CF62E289E1FA +:1037100084CF61E083E2C5CF0B352DE5120711F1AF +:103720000C351D4509F09ECD8091660382FB8827EC +:1037300080F991E089270E94781394CD10926B0351 +:103740000E9435148FEF94E3ECE081509040E0400C +:10375000E1F700C000000E94770C0E9413170ECC06 +:1037600081E0E9CF80E0E7CF828100811181882369 +:1037700069F0C8010E941611F82E682FC8010E9436 +:10378000890AB8018F2D0E94091172CDC8010E94CB +:10379000620AF82EF6CF212F2F70E22E107F19F03B +:1037A000E29490EFE922FF20B9F0EE2069F080E288 +:1037B000800F883010F0011109C080916B03E82A56 +:1037C000E0926B030E94130A802F4BC08091470246 +:1037D000E82AE0924702F6CF802F0E94FE0AEE20F0 +:1037E00009F441C080E2800F883010F0011104C05C +:1037F0008E2D0E940C0A06C0E09480914702E822B8 +:10380000E09247020E94130A2EC0312F3F70E32E30 +:10381000107F103219F0E29480EFE822002381F04B +:10382000013009F47EC0FF2009F488C0BB2009F4F0 +:103830007EC0F601858180FFC7CF8F70858377C0FA +:103840002091660322FF4AC0FF2009F441C0EE2008 +:1038500039F080916B03E82AE0926B030E94130A0F +:1038600080E00E94300B292D2850330B2430310585 +:1038700020F40E94E6050E94D30BAA20A9F08091B3 +:10388000450280FD11C0F6011282859585958595CA +:103890000E949513C6010E947F178091450285956D +:1038A000859585950E944B1360E0C6010F900F909F +:1038B0000F900F90DF91CF911F910F91FF90EF909C +:1038C000DF90CF90BF90AF909F908F900C948C1111 +:1038D00080E00E94FE0AEE2031F28ACFFF20A1F0A4 +:1038E000909148028E2D892BB11003C00E94F40ADA +:1038F000BACFE1E0BE12FACF22FDB5CF891709F4A5 +:10390000B2CF80934802AFCFB11006C00E94060A22 +:103910008E2D0E94ED0AA7CFF1E0BF1609F4A3CFC8 +:10392000F5CFFF2031F022E02B1508F49CCF8E2D2F +:10393000DDCF31E03B1508F496CFEACFBB2041F351 +:10394000093369F4FFEF27EE33E0F15020403040B7 +:10395000E1F700C00000802F0E94FE0A84CF8FE3B1 +:103960009CE90197F1F7F5CF812F869586958370B5 +:1039700061F0813009F077CFC8019370F11002C077 +:1039800090E080E00E94BA056ECFC8019370F110FC +:1039900002C090E080E00E94D00565CF802FFF201C +:1039A00029F00E94C8070E94E6065DCF0E940D071D +:1039B000FACF812F837009F03FC0F11054CF402F10 +:1039C000429546954770440F440F802F8F7090E0CA +:1039D000042E02C0880F991F0A94E2F730E020E01D +:1039E00004FF09C02FE030E002C0220F331F4A95C8 +:1039F000E2F720953095169516951370123099F0D0 +:103A000078F44091490250914A02113039F0822BEA +:103A1000932B842395230E94D20A25CF842B952BA8 +:103A2000822B932BF8CF822B932B2091490230913C +:103A30004A0282279327EFCF8695FF2011F0812F2E +:103A40008170882309F40FCF402F42954695477027 +:103A5000440F440F802F8F7090E0042E02C0880F17 +:103A6000991F0A94E2F730E020E004FF09C02FE03C +:103A700030E002C0220F331F4A95E2F720953095BF +:103A8000169516951370123099F078F440919A03B8 +:103A900050919B03113039F0822B932B8423952373 +:103AA0000E943413E0CE842B952B822B932BF8CFDE +:103AB000822B932B20919A0330919B03822793278B +:103AC000EFCF1F70FF2029F0812F0E949513802FC8 +:103AD0000DCF802F0E94ED0A812F0E944B13C3CE81 +:103AE000023F71F160F4003FB9F0013F81F0FF2027 +:103AF00009F459C0B11068CE812F8F7125C0033FE2 +:103B000031F1043FA1F78091660382FF2EC0812F1F +:103B10008F71FF2011F318C0FF2069F091E09B1511 +:103B200008F4A1CE1F7181E090E002C0880F991FB8 +:103B30001A95E2F7BFCFE2E0EB1508F494CEF2CF8E +:103B4000812F8F71F110C9CF0E9495138CCE90E018 +:103B500080E0FF2009F4A4CF1F7181E090E002C053 +:103B6000880F991F1A95E2F79BCFFF2089F01F71EC +:103B7000812F0E9495138091660382FD07C0F8E0B3 +:103B80001F9FC0011124836080934502812FDCCFE9 +:103B900081E00E945C1321E02B1508F064CE82E0E6 +:103BA0000E945C1360CEBB2079F0093341F43FEFF3 +:103BB00087EE93E0315080409040E1F7CACEEFE3CA +:103BC000FCE93197F1F7C5CE812F8F7186CF003197 +:103BD0003FE5130709F470CA01319FE51907A9F4FD +:103BE00082E06BCA61E0C6010E948C118C01F60173 +:103BF00082818111B1C90031FFE51F0709F462CA52 +:103C000001312FE5120709F461CAF801E058FF45B8 +:103C1000E730F10508F072CAE65EF14D0C94482DCC +:103C2000CF93DF9380910002807FA1F48091FD010A +:103C3000882381F080914402D09103026091FB01BE +:103C40007091FC01A091FE01B091FF01C62FC72326 +:103C5000D81303C0DF91CF91089590E0109711F031 +:103C6000CF3F19F401968770F3CF9C0143E0220FF8 +:103C7000331F4A95E1F7F901EC5FFD4F418147138E +:103C8000F1CF40814613EECF42814111EBCF43810A +:103C900054814A1B5B0B403A510520F7809100028A +:103CA0008F70806180930002F901E75FFD4F808192 +:103CB0008F70806180838BEF91E00E947F17DF918E +:103CC000CF910C94580AAF92BF92CF92DF92EF92AD +:103CD000FF920F931F93CF93DF93CDB7DEB7659716 +:103CE0000FB6F894DEBF0FBECDBF8C0185E0F801A2 +:103CF000DE01519601900D928A95E1F7F801E2807C +:103D00006BEFA62E61E0B62E6091FE017091FF016F +:103D10006115710509F468C19091FB014091FC01A6 +:103D2000892F84238F3F09F45FC120813181C380B3 +:103D3000D480F090FD01F601E61BF70BFF2009F49B +:103D40001DC180910002582F507FE03AF10508F024 +:103D5000D0C0511181C0FE2C43132BC0921329C037 +:103D60006091010270910202F80146815781641747 +:103D70007507F9F4E1101DC08F7080618093000217 +:103D8000C5010E947F1780910002F80185838F2D65 +:103D900065960FB6F894DEBF0FBECDBFDF91CF9111 +:103DA0001F910F91FF90EF90DF90CF90BF90AF9059 +:103DB0000895CD2829F0822F83238F3F09F02FC14A +:103DC00080E0F82FF170DF2E80FF3CC0809144022C +:103DD00040910302841315C0298B3A8B89899A89F3 +:103DE0000E945211292F22952F702230F8F0243092 +:103DF00020F59F70F9F0F8019581907FD9F4D12CCE +:103E00001FC090E0FC0153E0EE0FFF1F5A95E1F751 +:103E1000EC5FFD4F5181351306C05081251303C05F +:103E20005281E5120FC001968770D4CF9F7011F0B8 +:103E3000882329F3805E883010F3C8010E947F1721 +:103E4000FD2CA5CFEE2009F4A2CF80910002816065 +:103E500080930002F12C9BCF43131BC0921319C017 +:103E60004091010250910202F801268137814217E8 +:103E7000530779F4E1100DC08583C8010E947F17B4 +:103E800088E0F801ABEFB1E001900D928A95E1F77F +:103E90007ECFC8010E945E11882339F1EE2029F1FE +:103EA000809100028032A0F02091FB013091FC0152 +:103EB0003A8729871B86DD86CC868E878091010212 +:103EC00090910202988B8F87CE0109960E947F17EE +:103ED00088E0F801ABEFB1E001900D928A95E1F72F +:103EE0000E94101EFF24F39452CFC8010E947F1736 +:103EF000F9CF51110AC08BEF91E00E947F1788E043 +:103F0000F50111928A95E9F7A5CF431318C09213D2 +:103F100016C04091010250910202F80126813781BA +:103F20004217530761F4E1100AC08583C8010E945B +:103F30007F1788E0F50111928A95E9F728CFC8012B +:103F40000E945E11882389F2EE2079F280910002AE +:103F5000803208F4BDCF2091FB013091FC013A83FF +:103F600029831B82DD82CC828E8380910102909115 +:103F7000020298878F83CE010196A8CFE03AF1051F +:103F8000C0F6FE2CEE2009F4B0CF43131FC09213ED +:103F90001DC02091010230910202F80186819781B3 +:103FA0002817390799F49091000290FD69CF907F0E +:103FB00009F466CF809100028583903F09F45DCFBC +:103FC000982F907F905F8F70892B56CFC8010E94E9 +:103FD0005E1181117DCF809100028160809300028B +:103FE000C8010E947F17D3CEEE2009F47ECFC8010E +:103FF0000E945E11F82E882309F477CF88E0F8013B +:10400000ABEFB1E001900D928A95E1F78091FB0151 +:104010009091FC010E9452110E94101EB8CE81E0C6 +:104020008E25CFCECF93DF93CDB7DEB760970FB697 +:10403000F894DEBF0FBECDBF29873A874B875C87D8 +:104040006D877E878F87988BCE0109960E94631EAD +:10405000811112C088E0FE013996DE0111960190AF +:104060000D928A95E1F78C859D85892B29F08985AC +:104070009A8589238F3FA9F580914402909103028C +:1040800089131CC060960FB6F894DEBF0FBECDBF7B +:10409000DF91CF91089593E0AA0FBB1F9A95E1F7A6 +:1040A000AC5FBD4F98E0FE01319601900D929A955C +:1040B000E1F7809303020E94580ADECFB8E08B9F9D +:1040C000C00111248C5F9D4F0E94631E8823D1F292 +:1040D0008091440290E00196877099278093440272 +:1040E000CBCFA0910302B0E0CD0101968770992754 +:1040F000209144022817190671F610926B030E9452 +:104100003514109203021092440288E0EBEFF1E0C4 +:10411000DF011D928A95E9F7AFCF0F931F93CF93DD +:10412000DF938091ED02E091EC02CCE081111AC0A6 +:10413000DF91CF911F910F910895D1E0DE0FD093C1 +:10414000EC020E2F10E0EC9FF0011124E251FD4F24 +:1041500083819481892B29F08081918189238F3FEC +:1041600051F4ED2F8091ED02E81738F31092ED0233 +:104170001092EC02DDCFC09FD001C19FB00D112481 +:10418000A251BD4F16968D919C911797892B29F4BA +:1041900018968D919C91019651F420813181428134 +:1041A000538164817581868197810E941220C09F0E +:1041B000F001C19FF00D1124E251FD4F14821382D2 +:1041C000D0CF109259031092580310924901809158 +:1041D0005703809356030E9420060C948D202F9243 +:1041E0003F924F925F926F927F928F929F92AF9287 +:1041F000BF92CF92DF92EF92FF920F931F93CF93D4 +:10420000DF93C0915603E7E0FE2E01E010E0FCE0F2 +:104210002F2EAEEFEA2E809157038C1316C00E940A +:104220008D20DF91CF911F910F91FF90EF90DF9044 +:10423000CF90BF90AF909F908F907F906F905F9046 +:104240004F903F902F900C942006D0E0FE01EE0F8F +:10425000FF1FE25BFC4F80819181F89EF001F99E87 +:10426000F00D1124E15EFE4F2481211158C03090E1 +:10427000ED02AEEEB2E030E020E0412C5F0123150C +:1042800008F04BC01A966D907C901B97F5018080CA +:1042900091804FEF5FEF512CC52CD12CF601EE0F22 +:1042A000FF1FE80DF91D659174916616770609F4F4 +:1042B000A601672B11F05394EFCF4F3F5407B1F194 +:1042C000B80102C0660F771F4A95E2F7462AA80197 +:1042D00002C0440F551F5A94E2F741505109441649 +:1042E000150601F5229EF001239EF00D1124E251E6 +:1042F000FD4FF89ED001F99EB00D1124A15EBE4F76 +:1043000012962D913C91139737832683E082E182A8 +:104310009187808771E015967C930E94F205219623 +:10432000C37079CF14961C921E9213972F5F3F4F44 +:104330001C96A5CF2F923F924F925F926F927F92E1 +:104340008F929F92AF92BF92CF92DF92EF92FF92A5 +:104350000F931F93CF93DF93CDB7DEB769970FB657 +:10436000F894DEBF0FBECDBF498B5A8B6B8B7C8B15 +:104370008D8B6111109247021D861E861F86188A3A +:1043800085E0FE017196DE01199601900D928A95E5 +:10439000E1F78C859D85892B31F089859A85892364 +:1043A0008F3F09F0D4C129853A854B855C856D85A1 +:1043B0007E858F8598890E941220C3C028EFC2167F +:1043C0002CE5D20629F4882379F00E94E120EBCF76 +:1043D00039EFC3163CE5D30639F4882329F08091E0 +:1043E00049018111F2CFC3C10FE111E0E12CB12CE1 +:1043F000A12C88248394912C9EEF592E442443941D +:10440000F8016081718166246A94762C20E0422F45 +:1044100050E0FA01EE0FFF1FE60FF71F8591949110 +:10442000C816D90609F43A01892B11F02F5FEFCF96 +:10443000F12CFFEF6F167F0609F445C0F8014481A7 +:10444000F09049018F2D411180E0F82FF170FF2E7F +:10445000F801258086819B85992309F408C1FF20F6 +:1044600009F405C1211014C0A40101C0440F6A94CD +:10447000EAF7842B86838091EA029091EB028039DF +:10448000914030F440E951E05093EB024093EA024E +:10449000C40102C0880F991F2A95E2F70197F8011D +:1044A00026812817190679F48091580390915903B1 +:1044B000009709F45FC00E9475058139914008F4A6 +:1044C00059C0F8014482EF28FFEFAF1ABF0A095F15 +:1044D0001F4F26E0A216B10409F092CF8B858823E6 +:1044E00009F420C1EE2009F41DC10E9484059093B7 +:1044F0005903809358038091ED02883010F591E0C4 +:10450000980F9093ED0298E0FE013996DE01119626 +:1045100001900D929A95E1F73CE0839FC001112430 +:1045200082519D4F28E0FE013196DC0101900D92F1 +:104530002A95E1F72FEF3FEFFC0131872087D386E3 +:10454000C28669960FB6F894DEBF0FBECDBFDF916D +:10455000CF911F910F91FF90EF90DF90CF90BF9080 +:10456000AF909F908F907F906F905F904F903F9013 +:104570002F9008958091560360905703982FF0E094 +:10458000E0E0861114C0909356030E171F0709F43C +:104590009ACF90E0FC01EE0FFF1FE25BFC4FB1826F +:1045A000A082019683709927809357038CCF282E81 +:1045B000312CF101EE0FFF1FE25BFC4F20813181B6 +:1045C000F7E0F29FD001F39FB00D1124A15EBE4F22 +:1045D0002D913C911197398F288F712C60E070E0FC +:1045E000E72FF0E0EE0FFF1F288D398DE20FF31F4C +:1045F0002591349121153105E1F0F8010190F08108 +:10460000E02DFF8BEE8B60E005C02417350709F421 +:104610007F2C6F5FE62FF0E0EE0FFF1F4E895F8962 +:10462000E40FF51F459154914115510571F77F5FD6 +:10463000D7CF7720C9F0F801671708F0FD01448251 +:104640000E171F0721F490935603F72C3CCF9813B5 +:1046500005C0AE17BF0711F49F5F937091012F5FE4 +:104660003F4F822F83708DCFF0E0E0E0F7CF90E0F6 +:1046700021101FC0B40102C0660F771F2A95E2F710 +:104680009B01215031092817390731F4442309F4DB +:1046900047C0C5010E94F205C40101C0880F6A9499 +:1046A000EAF7982F9095F801868189238683F22C6A +:1046B0000ACF9C01062C02C0359527950A94E2F793 +:1046C000A90141705527BC016150710986239723C8 +:1046D000892B11F5452B01F1F80182819381892BFA +:1046E000C1F01B821C821D821E8259825A820E9446 +:1046F00084058160582F9D838C83F801828193818A +:104700008F83988729813A814B816D817E810E94B8 +:104710001220F8011582C0CFF22FF1702F2EBCCFDE +:104720002F2CBACF9091560380915703981731F0F0 +:104730000E94EF20EE2009F436CE03CF0E948D2098 +:1047400010925903109258030E942006F3CF61E0A3 +:10475000CE0109960E948C116C018B85F7EFCF1664 +:10476000FCE5DF0609F02ACE882309F43DCE81E07E +:104770008093490118CE9F92AF92BF92CF92DF9261 +:10478000EF92FF920F931F93CF93DF9300D000D04F +:1047900000D0CDB7DEB78E010F5F1F4F86E0F80166 +:1047A00011928A95E9F78CE7C82E81E0D82EF12C7A +:1047B000E12CAA24A394B12CF60181916F018F3FC3 +:1047C00009F443C0F894E82FE295EF70F0E021A1DE +:1047D0008F70A50102C0440F551F8A95E2F7CA01E8 +:1047E000922F982B91A392A18095892382A37894EC +:1047F00000C0E2E8F1E0912C31E021912F3F09F473 +:104800006EC0A22FA295AF70B0E090968C9190E010 +:104810002F7002C0959587952A95E2F780FD5FC0BD +:10482000832F982A330F51E0E638F50731F7F60168 +:10483000319780818F3F11F00E94240880EA8A9589 +:10484000F1F7F801EE0DFF1D9082EFEFEE1AFE0A70 +:10485000F6E0EF16F10409F0AFCF46E050E0B80102 +:104860008FE592E00E94E72DFF24F394009709F46E +:10487000F12C892BB1F186E0F801AFE5B2E00190AF +:104880000D928A95E1F781E080934D020E948405A4 +:1048900090934C0280934B0280914B0290914C027A +:1048A0000E947505059708F180915F02809373025D +:1048B00080916002809374028091610280937502FE +:1048C00080916202809376028091630280937702E6 +:1048D000809164028093780210924D0206C080E0BD +:1048E000A0CF80914D028111D7CF809149018823BB +:1048F00001F180915803909159030097D1F00E94E3 +:1049000075052091EA023091EB022817390788F4E7 +:104910009091560380915703981709F47EC00E9426 +:10492000EF201092EB021092EA02109259031092BB +:10493000580380915A02882371F080915802909117 +:1049400059020E947505893E934028F082EE0E942C +:10495000FE0A10925A0280915702882391F08091AA +:104960005502909156020E947505883E934048F08A +:104970000E948405909356028093550283E70E941B +:10498000D90F8091530290915402992309F44EC09B +:10499000811130C080915102909152020E947505A0 +:1049A00081369A4E78F080914F0290915002019694 +:1049B0009093500280934F020E948405909352027C +:1049C0008093510280914F02909150024F9708F4CA +:1049D0005CC010921C018CE180931D0180931E012C +:1049E0008FE00E94011481E08093530210925002E4 +:1049F00010924F028F2D26960FB6F894DEBF0FBE91 +:104A0000CDBFDF91CF911F910F91FF90EF90DF907D +:104A1000CF90BF90AF909F9008950E948D201092EC +:104A20005903109258030E94200683CF8111E2CFD0 +:104A300080914E02882361F022E148E76FEF8FE01A +:104A40000E941A0F26E148E76FEF8FE00E941A0FCD +:104A500080915702882371F228E148E76FEF8FE0D9 +:104A60000E941A0F29E148E76FEF8FE00E941A0FAA +:104A70002AE148E76FEF8FE00E941A0F2BE148E729 +:104A80006FEF8FE00E941A0FB5CF28E044E666EE84 +:104A900080E00E941A0F29E044E666EE80E00E9462 +:104AA0001A0F2DE044E666EE80E00E941A0FC0CF98 +:104AB00090E080E00E94A02D893E9E4F11F40C945E +:104AC000CC1180E008951F920F920FB60F9211241F +:104AD0002F933F934F935F936F937F938F939F9306 +:104AE000AF93BF93CF93DF93EF93FF93D091E90000 +:104AF000DF708091EC00C82FC17080FDC0E810927B +:104B0000E9008091F000877F8093F00078940E9404 +:104B100048141092E9008091F00088608093F000C2 +:104B2000CD2BCF70C093E900FF91EF91DF91CF9132 +:104B3000BF91AF919F918F917F916F915F914F91B5 +:104B40003F912F910F900FBE0F901F9018951F92BD +:104B50000F920FB60F9211242F933F934F935F93B1 +:104B60006F937F938F939F93AF93BF93EF93FF9335 +:104B70008091E10082FF09C08091E20082FF05C0C0 +:104B80008091E1008B7F8093E1008091DA0080FFCB +:104B900024C08091D80080FF20C08091DA008E7FF1 +:104BA0008093DA008091D90080FF9DC080E189BDAB +:104BB00082E189BD09B400FEFDCF81E080939003BE +:104BC00080916A03811109C00E94E7030E94B20428 +:104BD0008091E20084608093E2008091E10080FF98 +:104BE00017C08091E20080FF13C08091E2008E7FA9 +:104BF0008093E2008091E20080618093E2008091E6 +:104C0000D80080628093D80019BC85E0809390031F +:104C10008091E10084FF2BC08091E20084FF27C0D7 +:104C200080E189BD82E189BD89B5982F917080FFAF +:104C3000FBCF8091D8008F7D8093D8008091E100D8 +:104C40008F7E8093E1008091E2008F7E8093E2006E +:104C50008091E20081608093E2008091910388233B +:104C600009F447C084E08093900380919003809181 +:104C7000E10083FF27C08091E20083FF23C0809181 +:104C8000E100877F8093E10082E08093900310929F +:104C900091038091E1008E7F8093E1008091E2009A +:104CA0008E7F8093E2008091E20080618093E20039 +:104CB00042E060E080E00E9480048091F000886023 +:104CC0008093F000FF91EF91BF91AF919F918F91F1 +:104CD0007F916F915F914F913F912F910F900FBEF8 +:104CE0000F901F90189519BC1092900310926A03B0 +:104CF00074CF8091E30087FD93E090939003B5CF4C +:104D000078941F921FB61F9211248F939F93AF9395 +:104D1000BF938091610390916203A0916303B0916E +:104D200064030196A11DB11D8093610390936203FA +:104D3000A0936303B0936403BF91AF919F918F9150 +:104D40001F901FBE1F9018951F921FB61F9211240F +:104D50008F939F93AF93BF9380916003811113C092 +:104D60008091610390916203A0916303B091640309 +:104D70004196A11DB11D8093610390936203A0939E +:104D80006303B0936403BF91AF919F918F911F9084 +:104D90001FBE1F901895CDB7DEB7EE970FB6F894EB +:104DA000DEBF0FBECDBF84B7877F84BF0FB6F89438 +:104DB000A8958091600088618093600010926000E7 +:104DC0000FBE80E890E00FB6F89480936100909356 +:104DD00061000FBE85B7806885BF85B7806885BFD5 +:104DE00082E298E09093CB018093CA010E94E7038E +:104DF0000E94B2048091E20084608093E200789483 +:104E0000809190038823A1F01091E9001F70909188 +:104E1000EC00892F817090FD80E8182B1092E9003A +:104E20008091E80083FD0E9448141F701093E900F0 +:104E300082E084BD93E095BD9AEF97BD80936E00AC +:104E40000E94CC11811102C00E94D4100CE711E025 +:104E500022E8C22E21E0D22ED8018D918D018F3F04 +:104E600011F00E942408C016D106B1F786EF0E9407 +:104E7000240887EF0E94240883E90E94240886E919 +:104E80000E94240886E0E3E7F2E0DF01282F1D926C +:104E90002A95E9F7EFE5F2E0DF011D928A95E9F73F +:104EA0000E945825811102C00E94131782E090E0F1 +:104EB0000E94922D80936C0284E090E00E94922DDB +:104EC000182F82E290E00E94922D982F812F9093CC +:104ED0006603809365030E94BB23EFE3FCE93197EF +:104EE000F1F700C000000E94BB238091730280FF95 +:104EF00008C06FEF7FEF90E080E00E94C42D0E9419 +:104F0000770C83E090E00E94922D90E00E94D20AFC +:104F100080919A0390919B030E94E112509A589AB3 +:104F2000559A5D9A549A5C9A8CE090E00E94922D7A +:104F300090E0B0E0A0E080935B0290935C02A093CD +:104F40005D02B0935E0280916502811132C00E94C1 +:104F50005825811104C00E9413170E94251488E06F +:104F600090E00E949A2D6093E5027093E602809390 +:104F7000E7029093E8026E7F71F40E94251488E0A6 +:104F800090E00E949A2D6093E5027093E602809370 +:104F9000E7029093E8020E94370610928D028091FA +:104FA000E50280FF03C086950E94011481E0809392 +:104FB00065025198599A52985A9A89B1869581708A +:104FC0004A994DC290E0892B80936A0260916503F3 +:104FD0006068609365031091660384E090E00E942E +:104FE000A62D612F82E290E00E94A62D81E20E9410 +:104FF000011481E090E00E94341380E091E09093EE +:105000005D0380935C0308E1C02ED12C83E792E01E +:1050100096E0B92EB80E80919003853019F510E412 +:10502000912E8824839400E112E1809190038530D1 +:1050300009F417C210926B030E9435140E94E60512 +:105040000E94D30B1092670280916602882341F080 +:105050008091E50281608093E50286950E940114AB +:105060000E94E5110E94BB23882359F08FB7F89462 +:1050700040916103509162036091630370916403F6 +:105080008FBFA3E7B2E0EDE6F2E010E000E0302FE2 +:105090008D919191981709F43DC2292F282790E00E +:1050A00099249394422F492109F42FC29DAB3EAB22 +:1050B000892191E009F490E09FAB0E948405816012 +:1050C000782F99AF88AF4DA95EA96FA989AD0E94CD +:1050D0009A21F801E359FD4F8081982690828091B2 +:1050E0008D028823D1F180918C02E091E502E69552 +:1050F000E81BE0938802823009F023C2F0E0EA5511 +:10510000FD4FE4910E2F10E0B5EC8B2EBFE09B2EEF +:1051100080918902882361F0109289020E9484059F +:10512000909387028093860210928B0210928A02DB +:105130000E948405E0918602F09187028E1B9F0BEE +:105140008F3F9F4750F4E00FF11FF0938702E093E9 +:10515000860286E892E0F4010995E0916A02EE0F7A +:10516000EE0FE0936A0289B181FBEE24E0F84A99E0 +:1051700042C280E08E29E82BE0936A02EF70F0E0F3 +:10518000EA57FE4F808190916902890F80936902EE +:1051900020E0843034F1809168028F5F8093680250 +:1051A00012E018AB19AA81E08AAB0E9484058160E5 +:1051B000782F9CAB8BAB48A959A96AA98CA90E94EE +:1051C0009A211BA71CA61DA60E9484058160782F2A +:1051D0009FA78EA74BA55CA56DA58FA50E949A21C0 +:1051E00021E0809169028D3F2CF580916802815009 +:1051F000809368021EA21FA281E088A70E948405F6 +:105200008160782F9AA789A74EA15FA168A58AA57A +:105210000E949A2119A21AA21BA20E9484058160F1 +:10522000782F9DA38CA349A15AA16BA18DA10E94A7 +:105230009A2121E080916902082E000C990B64E00C +:1052400070E00E94122D80936902222359F08FB7DB +:10525000F8944091610350916203609163037091EF +:1052600064038FBF86E0E0E8F2E0DE011196019072 +:105270000D928A95E1F790908202809083021091BE +:105280008402009185021092820210928302109291 +:10529000840210928502892D882909F448C08091E2 +:1052A0007E0290917F020E9475059C0190917A0286 +:1052B000992309F490C323333105C8F19F3F19F0B6 +:1052C0009F5F90937A02992059F00E94A8079FEF60 +:1052D00019140CF491E0899F802D1124809382028F +:1052E000882059F00E94A8079FEF18140CF491E051 +:1052F000899F802D11248093830230918202332371 +:10530000B1F020918302222391F045EB3403C001D8 +:105310001124992309F472C19093820245EB24036E +:1053200090011124332309F46DC130938302812F3E +:10533000802B09F448C080917C0290917D020E94EC +:1053400075059C0190917902992309F43FC3253694 +:105350003105C8F19F3F19F09F5F909379021123A7 +:1053600059F00E9486079FEF11160CF491E0899F77 +:10537000802D112480938402002359F00E94860717 +:105380009FEF10160CF491E0899F802D11248093DB +:105390008502309184023323B1F0209185022223CB +:1053A00091F045EB3403C0011124992309F42EC177 +:1053B0009093840245EB240390011124332309F4D4 +:1053C00029C1309385028091820290918302892BBA +:1053D00090918402892B90918502892B11F00E9473 +:1053E000E60686E0FE013196A0E8B2E001900D925B +:1053F0008A95E1F70E94E60590916B02891731F0DA +:105400000E94E60580936B020E94D30B809190036B +:10541000843009F000CE83E08093E9008091E800B9 +:1054200082FFF9CD8091E80090E085FF06C00E94E0 +:105430000604882309F4F2C091E08091E8008B779C +:105440008093E800992309F4E6CDE981E150E33146 +:1054500008F066C1F0E0EF5DF14D0C94482D92E04C +:10546000B2CD80919003843009F440C080E00E9466 +:10547000D30B10928D0280916702811116C0809229 +:1054800067028091E502982F9170909366028E7F5B +:105490008093E502FFEF20E742E0F15020404040DA +:1054A000E1F700C000000E949B0C109260030FB651 +:1054B000F894A895C09260000FBE9092600083B7E8 +:1054C000817F846083BF83B7816083BF7894889530 +:1054D00083B78E7F83BF0FB6F894A8958091600044 +:1054E000886180936000109260000FBE80918F03EE +:1054F000882309F49ACD0E94BB23E3E7F2E081916F +:10550000811143C2BE12FBCF90CD9F5F990C9430A6 +:1055100009F0C8CD0F5F1F4F0630110509F0B7CD58 +:105520008FEF8AAF8BAF1CAE0E9484058160782F0D +:105530009EAF8DAF4AAD5BAD6CAD8EAD0E949A2132 +:10554000CECD863059F4F0E0ED55FD4FE4910E2FAD +:1055500010E0A5EB8A2EAFE09A2EDACD893061F407 +:10556000E695F0E0E056FD4FE4910E2F10E0FDEDE2 +:105570008F2EFEE09F2ECCCD8F3061F4E695F0E0CB +:10558000E356FD4FE4910E2F10E0E3E68E2EEEE0A1 +:105590009E2EBECD853159F4F0E0E656FD4FE491E4 +:1055A0000E2F10E070EF872E7DE0972EB1CD08E230 +:1055B00010E040E6842E4DE0942E883109F4A8CD09 +:1055C000833249F4E8E9F2E0059114916CE5862E06 +:1055D0006FE0962E9DCD04EF11E053E2852E5DE045 +:1055E000952E843209F494CD00ED17E036E3832E36 +:1055F00036E0932E8DCD82E090E0BCCD81E08093AB +:1056000082028CCE81E08093830291CE81E08093F0 +:105610008402D0CE81E080938502D5CE00E210E0F6 +:10562000CE0101964C018091E80085FD0AC0809171 +:10563000E8008B778093E8000E940604882399F3A2 +:10564000FBCE8091F100D4018D934D0101501109E1 +:1056500051F7F2CE1A8289E08B832DC08A81823085 +:1056600009F4ABC18330A9F0813009F059C02FB7DC +:10567000F89460916103709162038091630390914B +:1056800064032FBF0E944E2D6B837C838D839E838A +:1056900012C0809173028B83809174028C838091FD +:1056A00075028D83809176028E83809177028F833D +:1056B00080917802888780919003843009F0ABCC88 +:1056C0001091E9001F709091EC00892F817090FD7E +:1056D00080E8182B82E08093E9008091E80080FF49 +:1056E0000DC050E040E060E270E0CE0101960E9403 +:1056F00037048091E8008E778093E8001F70109344 +:10570000E90089CC8A81823059F46B817C818D815A +:105710009E810E944E2D86E290E00E94A62DCBCF66 +:105720008FEF8983C8CF4C816B818A810E94E310FF +:105730009827892798279E838D83BDCF8D809E8053 +:105740009824892498248A810B81B8E00B9F8001DA +:105750001124E0E38E9F000D111D11248C8190E037 +:10576000880F991F080F191F692DC80187960E947D +:10577000A62D682DC8018896D0CF0E946A109BCFB5 +:105780008A818138C1F060F4803809F094CF20E03C +:105790004B816091E7028091E6020E940D128BCF4F +:1057A000823849F1833809F086CF20E04091E80241 +:1057B0006C818B81F2CF8B810E9401149B8180913F +:1057C000E502911111C08E7F8093E50210928D0247 +:1057D000FFEF20E742E0F15020404040E1F700C0F9 +:1057E00000000E949B0C67CF81608093E502869544 +:1057F0000E94011460CF8B818093E9025CCF8A8183 +:10580000813899F030F4803809F055CF8091E80262 +:1058100023CF823891F0833809F04DCF8091E60292 +:105820008B838091E7028C8346CF8091E50280FFD5 +:1058300002C0869511CF80E00FCF8091E9020CCF96 +:105840006091E5027091E6028091E7029091E80292 +:105850000E94FB1130CF80E18A832DCF81E08A83C3 +:1058600089EFFACE0A811B81102701271027CE016C +:1058700001963C018C80DC01A80DB11D4D01C801D1 +:10588000895F9D4F8614970409F415CF093FB1E055 +:105890001B0750F40E94922DF30184830F5F1F4F6A +:1058A000BFEF6B1A7B0AEBCFD30114961C92F6CF95 +:1058B0000A811B81102701271027FE0131963F0125 +:1058C0008C80800E912E911CC801895F9D4F80169F +:1058D000910609F4F0CE093FF1E01F0728F4D30147 +:1058E00014966C910E94A62DBFEF6B1A7B0A0F5F76 +:1058F0001F4FEACF0E945A10DECE8AE0ADCF0A8158 +:105900001B81102701271027FE0131963F018C8053 +:10591000CF01880D911D4C01C8018796861497040C +:1059200009F4C9CE003EA1E01A0750F40E94922D5E +:10593000F30184830F5F1F4FBFEF6B1A7B0AECCF1D +:10594000D30114961C92F6CF0A811B8110270127E0 +:105950001027FE0131963F018C80800E912E911C04 +:10596000C80187968016910609F4A5CE003EF1E0A5 +:105970001F0728F4D30114966C910E94A62DBFEF47 +:105980006B1A7B0A0F5F1F4FEBCF09BD19BD09B41E +:1059900000FEFDCF8091D8008F7D8093D80080914C +:1059A000E00082608093E0008091E00081FDFCCF08 +:1059B00010926B030E94351438CB86E290E00E946F +:1059C000922D1B821C821D828E8375CE2D3231401A +:1059D00008F0C2CCF8CC2D32314008F071CCA7CC05 +:1059E00087FB082E062687FD819567FD61950E943D +:1059F000862D0EF4919507FC81950895AA1BBB1B7B +:105A000051E107C0AA1FBB1FA617B70710F0A61BBE +:105A1000B70B881F991F5A95A9F780959095BC01DF +:105A2000CD01089597FB072E16F4009407D077FD5B +:105A300009D00E94FE2C07FC05D03EF4909581957C +:105A40009F4F0895709561957F4F0895A1E21A2E9A +:105A5000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F12 +:105A6000A217B307E407F50720F0A21BB30BE40B62 +:105A7000F50B661F771F881F991F1A9469F76095A9 +:105A80007095809590959B01AC01BD01CF01089563 +:105A9000EE0FFF1F0590F491E02D099469279627DA +:105AA000692778278727782708950E945D2D33235B +:105AB00012F48A1B9B0B0C946E2DA29FB001B39F16 +:105AC000C001A39F700D811D1124911DB29F700D07 +:105AD000811D1124911D08950E945D2DB7FF089529 +:105AE000821B930B08950E945D2DA59F900DB49F7E +:105AF000900DA49F800D911D11240895B7FF0C9463 +:105B0000732D0E94732D821B930B0895991B79E0CE +:105B100004C0991F961708F0961B881F7A95C9F73D +:105B200080950895F999FECF92BD81BDF89A992785 +:105B300080B50895A6E1B0E044E050E00C94CC2D8F +:105B4000A8E1B0E042E050E00C94CC2D262FF9996A +:105B5000FECF92BD81BDF89A019700B4021639F0CC +:105B60001FBA20BD0FB6F894FA9AF99A0FBE08959D +:105B70000396272F0E94A72D0E94A62D252F0E9455 +:105B8000A72D242F0C94A72D0196272F0E94A72D17 +:105B90000C94A62DDC01CB01FC01F999FECF06C0C7 +:105BA000F2BDE1BDF89A319600B40D9241505040DB +:105BB000B8F70895FC014150504030F001900616AE +:105BC000D1F73197CF010895882799270895FB01D0 +:105BD000DC0104C08D910190801921F441505040A6 +:105BE000C8F7881B990B0895F894FFCF77117711A8 +:105BF000801180118211801180118011771177112D +:105C0000871180118011871130155815FB16581512 +:105C1000FB168B15AC15FB16AA16B716CB1BCB1BA8 +:105C2000051C051CB41CCE1C331C331CD91C611D67 +:105C3000701D701D68186C1989199D19AB19E01930 +:105C4000121A2A2B2E2B822B932B9E2BBD2BC02B73 +:105C5000FF2B202C902B902B2B2C2E2C322C582CC5 +:085C60007A2C7D2C7F2CA42C72 +:105C68007205370C160C120C0E0C710501191A1B53 +:105C78001C1D1E1F202122010201001C001C1CCA21 +:105C8800002A00000000C4004C00000000BE0050C4 +:105C980000000000B8005100000000B2004F0000F2 +:105CA8000000AC0052000000000101818283E20084 +:105CB800E900EA00B500B600B700CD008301CC00CA +:105CC8008A0192019401210223022402250226025C +:105CD80027022A02B300B4006F007000F034353692 +:105CE8006667F6F7939600FF0100010000FFFF00CA +:105CF80000010001FF000001020202020606060977 +:105D080009090909090F0F0F0F0F0F151515181994 +:105D180019191919191919191923244022B6A80192 +:0A5D28008601D000BD06D606F6067F +:00000001FF diff --git a/keyboards/solartempest/sofle/.noci b/keyboards/solartempest/sofle/.noci new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/solartempest/sofle/config.h b/keyboards/solartempest/sofle/config.h new file mode 100644 index 000000000000..c9b3d0025bbb --- /dev/null +++ b/keyboards/solartempest/sofle/config.h @@ -0,0 +1,166 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#pragma once +#include "config_common.h" + +// USB Device descriptor parameters +#define VENDOR_ID 0xFC32 +#define PRODUCT_ID 0x1287 //Original is 0x0287 but we do not want to load default VIA keymap as it has errors for the bottom row +#define DEVICE_VER 0x0002 +#define MANUFACTURER Keyhive +#define PRODUCT Solarius_Sofle //New unique name +#define DESCRIPTION Rose version of the Sofle + +// Set which side is master +#define MASTER_LEFT +//#define EE_HANDS //Use this if EEPROM setting is desired instead + +// Key Matrix Settings +// Rows are doubled-up for split keyboards. Added extra column for rotary encoder VIA mapping. +#define MATRIX_ROWS 10 +#define MATRIX_COLS 7 +#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, NO_PIN } //NO_PIN is used for the encoder key matrix in via. +#define MATRIX_ROW_PINS_RIGHT { C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS_RIGHT { F6, F7, B1, B3, B2, B6, NO_PIN } //NO_PIN is used for the encoder key matrix in via. +#define DIODE_DIRECTION COL2ROW +#define DEBOUNCE 6 //Default is 5 + +// NKRO Settings +#ifdef NKRO_ENABLE + #define FORCE_NKRO //Force NKRO if enabled. +#endif + +// Tapping settings +#define TAP_CODE_DELAY 10 +#define TAPPING_TOGGLE 2 //Tap TT twice to toggle layer +#define TAPPING_TERM 160 //Tapping duration in ms + +// Combo settings +#ifdef COMBO_ENABLE + #define COMBO_COUNT 1 //Number of tap combos used + #define COMBO_TERM 400 //Default combo time is 200ms. This is the time delay allowed between deleting each whole word with shift-backspace. +#endif + +#define D2SKATE_MACRO_ENABLE //Enable Destiny 2 hunter skate macro (+224) + +// Disabled to save space +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define NO_ACTION_ONESHOT //Save 244 bytes (-244). +#define NO_RESET //Save 40 bytes (-40). +#define LAYER_STATE_8BIT //For less than 8 bits worth of layers. +#undef LOCKING_SUPPORT_ENABLE //For MX lock keys only. +#undef LOCKING_RESYNC_ENABLE //For MX lock keys only. +//#define SUPER_ALT_TAB_ENABLE //Enable super alt tab custom keycode(+178). + +// Encoder support +#define ENCODERS_PAD_A { F5 } +#define ENCODERS_PAD_B { F4 } +#define ENCODERS_PAD_A_RIGHT { F4 } +#define ENCODERS_PAD_B_RIGHT { F5 } +#define ENCODER_RESOLUTIONS { 4, 2 } //Left encoder seems to have double-output issue but right does not. This resolves that issue. + +// Communication between sides +#define SOFT_SERIAL_PIN D2 + +// OLED settings +#ifdef OLED_ENABLE + #define OLED_TIMEOUT 80000 //80000 = 80secs, 120000 = 2mins in ms. + #define OLED_BRIGHTNESS 90 //Default is 100. + #define SPLIT_OLED_ENABLE //Synx on/off OLED state between halves (+100). + #ifdef WPM_ENABLE + #define SPLIT_WPM_ENABLE //Enable WPM across split keyboards (+106-268). + #endif + #define OLED_LOGO //Enable to print snakey custom logo on slave side (+108). + //#define SNEAK_DISABLE //Disable snakey keyboard pet sneak animation to save space (-132). + //#define OLED_NO_SLAVE //Disable snakey minimal keyboard pet slave OLED rendering (-160). + //#define OLED_NO_MASTER //Disable snakey minimal keyboard pet master OLED rendering and render status on the slave (+96). + #ifdef OLED_NO_MASTER + #define SPLIT_LAYER_STATE_ENABLE //Keep on master to save space (+142). + #define SPLIT_LED_STATE_ENABLE //Keep on master to save space (+112). + #undef SPLIT_OLED_ENABLE //Do not sync OLED state with one OLED only (+100). + #endif + //#define SPLIT_MODS_ENABLE //Keep on master to save space (+138). +#endif + +// Haptic feedback settings +#ifdef HAPTIC_ENABLE + #define FB_ERM_LRA 1 + #define FB_BRAKEFACTOR 2 // For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 + #define FB_LOOPGAIN 0 // For Low:0, Medium:1, High:2, Very High:3 + + // Refer to datasheet for the optimal setting for specific motors. + #define RATED_VOLTAGE 2 //2Vrms per ELV1411A datasheet, which is the LRA used for the Pimoroni Haptic Bzzz driver DRV2605. + #define V_PEAK 2.0 //Per QMK docs. + #define V_RMS 2.0 //Per ELV1411A datasheet. + #define F_LRA 150 //Resonant frequency per ELV1411A datasheet. + + //#define HAPTIC_OFF_IN_LOW_POWER 1 //Turn off haptic feedback while sleeping (+54). + #define NO_HAPTIC_PUNCTUATION + #define NO_HAPTIC_ALPHA + #define NO_HAPTIC_MOD + //#define NO_HAPTIC_NUMERIC + //#define NO_HAPTIC_NAV +#endif + +// Pimoroni trackball settings +#ifdef POINTING_DEVICE_ENABLE + //#define PIMORONI_TRACKBALL_INTERVAL_MS 6 //Default is 8ms + #define PIMORONI_TRACKBALL_ROTATE //Change according to your particular installed trackball orientation. + #define PIMORONI_TRACKBALL_INVERT_Y + #define PIMORONI_TRACKBALL_INVERT_X +#endif + +// RGB settings +#ifdef RGBLIGHT_ENABLE + #define RGB_DI_PIN D3 + #define RGBLED_NUM 74 + #define RGBLED_SPLIT {37,37} + //#define RGBLIGHT_ANIMATIONS // Very memory intensive (+2604) + #define RGBLIGHT_EFFECT_STATIC_GRADIENT //Preferred RGB effect (+262) + #define RGBLIGHT_LIMIT_VAL 160 //Power draw may still exceed the USB limitations of 0.6A at max brightness with white colour with this setting. + //#define RGBLIGHT_LAYERS //Enable layer light indicators. Not required as updates are done in layer_state_set_user and led_update_user (+588). + #define RGBLIGHT_SLEEP //Turn off LEDs when computer sleeping (+72) + + //RGB LED Conversion macro from physical array to electric array (+146). This results in better looking animated effects. + //First section is the LED matrix, second section is the electrical wiring order, and the third section is the desired mapping + #define LED_LAYOUT( \ + L00, L01, L02, L03, L04, L05, L08, L09, L010, L011, L012, L013, \ + L10, L12, L14, L19, L111, L113, \ + L20, L21, L22, L23, L24, L25, L28, L29, L210, L211, L212, L213, \ + L30, L31, L32, L33, L34, L35, L38, L39, L310, L311, L312, L313, \ + L40, L42, L44, L49, L411, L413, \ + L50, L51, L52, L53, L54, L55, L58, L59, L510, L511, L512, L513, \ + L62, L63, L64, L65, L66, L67, L68, L69, L610, L611, \ + L71, L76, L77, L712 )\ + { \ + L14,L12,L10,L40,L42,L44,L71,L76,L66,L65,L55,L35,L25,L05,L04,L24,L34,L54,L64,L63,L53,L33,L23,L03,L02,L22,L32,L52,L62,L51,L31,L21,L01,L00,L20,L30,L50,L19,L111,L113,L413,L411,L49,L712,L77,L67,L68,L58,L38,L28,L08,L09,L29,L39,L59,L69,L610,L510,L310,L210,L010,L011,L211,L311,L511,L611,L512,L312,L212,L012,L013,L213,L313,L513, \ + } + //RGB LED logical order map + #define RGBLIGHT_LED_MAP LED_LAYOUT( \ + 5, 6, 17, 18, 29, 30, 43, 44, 55, 56, 67, 68, \ + 4, 16, 28, 45, 57, 69, \ + 3, 7, 15, 19, 27, 31, 42, 46, 54, 58, 66, 70, \ + 2, 8, 14, 20, 26, 32, 41, 47, 53, 59, 65, 71, \ + 1, 13, 25, 48, 60, 72, \ + 0, 9, 12, 21, 24, 33, 40, 49, 52, 61, 64, 73, \ + 11, 22, 23, 34, 35, 38, 39, 50, 51, 62, \ + 10, 36, 37, 63 ) +#endif diff --git a/keyboards/solartempest/sofle/info.json b/keyboards/solartempest/sofle/info.json new file mode 100644 index 000000000000..16147f76dd51 --- /dev/null +++ b/keyboards/solartempest/sofle/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Solarius_Sofle", + "url": "", + "maintainer": "solartempest", + "width": 15, + "height": 8.0, + "layouts": { + "LAYOUT": { + "layout": [{"label":"0,3", "x":3.25, "y":0.5}, {"label":"5,3", "x":13.25, "y":0.5}, {"label":"0,2", "x":2.25, "y":0.63}, {"label":"0,4", "x":4.25, "y":0.63}, {"label":"5,4", "x":12.25, "y":0.63}, {"label":"5,2", "x":14.25, "y":0.63}, {"label":"0,5", "x":5.25, "y":0.73}, {"label":"5,5", "x":11.25, "y":0.73}, {"label":"0,0", "x":0.25, "y":0.86}, {"label":"0,1", "x":1.25, "y":0.86}, {"label":"5,1", "x":15.25, "y":0.86}, {"label":"5,0", "x":16.25, "y":0.86}, {"label":"1,3", "x":3.25, "y":1.46}, {"label":"1,6", "x":6.45, "y":1.46}, {"label":"6,6", "x":10.05, "y":1.46}, {"label":"6,3", "x":13.25, "y":1.46}, {"label":"1,2", "x":2.25, "y":1.56}, {"label":"1,4", "x":4.25, "y":1.56}, {"label":"6,4", "x":12.25, "y":1.56}, {"label":"6,2", "x":14.25, "y":1.56}, {"label":"1,5", "x":5.25, "y":1.66}, {"label":"6,5", "x":11.25, "y":1.66}, {"label":"1,0", "x":0.25, "y":1.76}, {"label":"1,1", "x":1.25, "y":1.76}, {"label":"6,1", "x":15.25, "y":1.76}, {"label":"6,0", "x":16.25, "y":1.76}, {"label":"2,3", "x":3.25, "y":2.36}, {"label":"4,0", "x":6.45, "y":2.36}, {"label":"9,5", "x":10.05, "y":2.36}, {"label":"7,3", "x":13.25, "y":2.36}, {"label":"2,2", "x":2.25, "y":2.46}, {"label":"2,4", "x":4.25, "y":2.46}, {"label":"7,4", "x":12.25, "y":2.46}, {"label":"7,2", "x":14.25, "y":2.46}, {"label":"2,5", "x":5.25, "y":2.56}, {"label":"7,5", "x":11.25, "y":2.56}, {"label":"2,0", "x":0.25, "y":2.66}, {"label":"2,1", "x":1.25, "y":2.66}, {"label":"7,1", "x":15.25, "y":2.66}, {"label":"7,0", "x":16.25, "y":2.66}, {"label":"3,3", "x":3.25, "y":3.26}, {"label":"3,6", "x":6.45, "y":3.26}, {"label":"8,6", "x":10.05, "y":3.26}, {"label":"8,3", "x":13.25, "y":3.26}, {"label":"3,2", "x":2.25, "y":3.36}, {"label":"3,4", "x":4.25, "y":3.36}, {"label":"8,4", "x":12.25, "y":3.36}, {"label":"8,2", "x":14.25, "y":3.36}, {"label":"3,5", "x":5.25, "y":3.46}, {"label":"8,5", "x":11.25, "y":3.46}, {"label":"3,0", "x":0.25, "y":3.56}, {"label":"3,1", "x":1.25, "y":3.56}, {"label":"8,1", "x":15.25, "y":3.56}, {"label":"8,0", "x":16.25, "y":3.56}, {"label":"4,2", "x":3.25, "y":4.26}, {"label":"9,1", "x":13.25, "y":4.26}, {"label":"4,3", "x":4.25, "y":4.36}, {"label":"9,2", "x":12.25, "y":4.36}, {"label":"4,1", "x":2.25, "y":4.36}, {"label":"9,0", "x":14.25, "y":4.36}, {"label":"4,4", "x":1, "y":9.96}, {"label":"4,5", "x":3.35, "y":8.71, "h":1.5}, {"label":"9,3", "x":0.8, "y":11.56}, {"label":"9,4", "x":-2.08, "y":11.01, "h":1.5}] + } + } +} diff --git a/keyboards/solartempest/sofle/keymaps/via/bongocat.c b/keyboards/solartempest/sofle/keymaps/via/bongocat.c new file mode 100644 index 000000000000..76d7525d91c8 --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/bongocat.c @@ -0,0 +1,220 @@ +/* Code is by foureight84 and modified slightly. This may need some updates for the 2021-08-30 breaking changes. +Check out their post and other work! +https://www.reddit.com/r/olkb/comments/lxw6jw/adapted_bongo_cat_animation_to_the_sofle_keyboard/ +https://github.com/foureight84/qmk_firmware/tree/sofle_foureight84 */ + +#ifdef OLED_ENABLE +uint32_t oled_timer = 0; //OLED timeout +led_t led_usb_state; + +static void print_status_narrow(void) { +/* // Print current mode + oled_write_P(PSTR("\n\n"), false); + oled_write_ln_P(PSTR("MODE"), false); + oled_write_ln_P(PSTR(""), false); + if (keymap_config.swap_lctl_lgui) { + oled_write_ln_P(PSTR("MAC"), false); + } else { + oled_write_ln_P(PSTR("WIN"), false); + } + + switch (get_highest_layer(default_layer_state)) { + case _QWERTY: + oled_write_ln_P(PSTR("Qwrt"), false); + break; + case _COLEMAK: + oled_write_ln_P(PSTR("Clmk"), false); + break; + default: + oled_write_P(PSTR("Undef"), false); + } + oled_write_P(PSTR("\n\n"), false);*/ + // Print current layer + oled_set_cursor(0,2); + oled_write("LAYER", false); + + oled_set_cursor(0,3); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + /* lock status */ + oled_set_cursor(0,6); + oled_write("LOCK", false); + oled_set_cursor(0,7); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,8); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,9); + oled_write("Scrl", led_usb_state.scroll_lock); +} + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_270; +} + +/* Animation bit by j-inc https://github.com/qmk/qmk_firmware/tree/master/keyboards/kyria/keymaps/j-inc */ +// WPM-responsive animation stuff here +#define IDLE_FRAMES 5 +#define IDLE_SPEED 20 // below this wpm value your animation will idle. Default 30. + +// #define PREP_FRAMES 1 // uncomment if >1 + +#define TAP_FRAMES 2 +#define TAP_SPEED 40 // above this wpm value typing animation to trigger. Default 60. + +#define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms +// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing +#define ANIM_SIZE 320 // number of bytes in array, minimize for adequate firmware size, max is 1024 + +uint32_t anim_timer = 0; +uint32_t anim_sleep = 0; +uint8_t current_idle_frame = 0; +// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1 +uint8_t current_tap_frame = 0; + +// Implementation credit j-inc(/James Incandenza), pixelbenny, and obosob. +// Bongo cat images changed and adapted for sofle keyboard oled size. +// Original gif can be found here: https://www.pixilart.com/art/bongo-cat-bd2a8e9323aa705 +static void render_anim(void) { + static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = { + { + 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xfc, 0x03, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, + 0xe1, 0x1e, 0x00, 0xc0, 0xbc, 0x83, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x03, 0x00, 0x00, 0x00, 0x80, 0x78, 0x87, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0xe0, 0x1f, + 0x01, 0xc0, 0x3c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x05, 0x41, 0x12, 0x04, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x87, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0xc0, 0x3f, 0x03, 0x80, + 0x78, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x03, 0x05, + 0x00, 0x00, 0xf0, 0xcf, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0x80, 0x79, 0x07, 0x80, 0x78, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1e, 0x01, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0xf9, 0x07, 0x80, 0x78, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x2c, 0x32, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0x00, 0xf0, 0x0f, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x60, 0x80, 0x00, 0x00, 0xe1, 0x1e, 0x01, 0xf0, 0x8f, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x09, 0x0e, 0x0e, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x19, + 0x19, 0x41, 0x0a, 0x22, 0x84, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x70, 0x80, + 0x00, 0x00, 0xf0, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x02, 0x01, + } + }; + static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = { + { + 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xfc, 0xff, 0xff, 0xff, 0x7c, 0x70, 0x40, 0x40, + 0x61, 0x5e, 0x80, 0xc0, 0xbc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x03, 0x00, 0x00, 0x00, 0x80, 0x78, 0x87, 0x00, 0x03, 0x0f, 0x3f, 0xf8, 0xf0, 0xf0, 0x20, + 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x87, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0xc0, 0x3f, 0x03, 0x80, + 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, + 0x00, 0x00, 0xf0, 0xcf, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0x80, 0x79, 0x07, 0x80, 0x78, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1e, 0x01, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0xf9, 0x07, 0x80, 0x78, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x2c, 0x32, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0x00, 0xf0, 0x0f, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x60, 0x80, 0x00, 0x00, 0xe1, 0x1e, 0x01, 0xf0, 0x8f, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x09, 0x0e, 0x0e, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x19, + 0x19, 0x41, 0x0a, 0x22, 0x84, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x70, 0x80, + 0x00, 0x00, 0xf0, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x02, 0x01, + }, + { + 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xfc, 0x03, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, + 0xe1, 0x1e, 0x00, 0xc0, 0xbc, 0x83, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x03, 0x00, 0x00, 0x00, 0x80, 0x78, 0x87, 0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, 0xe0, 0x1f, + 0x01, 0xc0, 0x3c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x05, 0x41, 0x12, 0x04, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x87, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0xc0, 0x3f, 0x03, 0x80, + 0x78, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x03, 0x05, + 0x00, 0x00, 0xf0, 0xcf, 0x00, 0x01, 0x06, 0x18, 0x60, 0x80, 0x80, 0x79, 0x07, 0x80, 0x78, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xc0, 0x00, 0xf9, 0x07, 0x80, 0x78, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x2c, 0x32, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x03, 0x0f, 0x3f, 0xff, 0x03, 0x01, 0x03, 0x07, 0x18, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x60, 0x80, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x09, 0x0e, 0x0e, 0x01, 0xf3, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x70, 0x80, + 0x00, 0x00, 0xf0, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x02, 0x01 + }, + }; + + //assumes 1 frame prep stage + void animation_phase(void) { + if(get_current_wpm() <=IDLE_SPEED){ + /* + current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES; + oled_write_raw_P(idle[abs((IDLE_FRAMES-1)-current_idle_frame)], ANIM_SIZE); + */ + oled_write_raw_P(idle[0], ANIM_SIZE); + } + /* + if(get_current_wpm() >IDLE_SPEED && get_current_wpm() 1 + oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1 + }*/ + if(get_current_wpm() >=TAP_SPEED){ + current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES; + oled_write_raw_P(tap[abs((TAP_FRAMES-1)-current_tap_frame)], ANIM_SIZE); + } + } + if(get_current_wpm() != 000) { + oled_on(); // not essential but turns on animation OLED with any alpha keypress + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animation_phase(); + } + anim_sleep = timer_read32(); + } else { + if(timer_elapsed32(anim_sleep) > OLED_TIMEOUT) { + oled_off(); + } else { + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animation_phase(); + } + } + } +} + +bool oled_task_user(void) { + led_usb_state = host_keyboard_led_state(); + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 30000) { + oled_off(); + return false; + } else { + oled_on(); + } + print_status_narrow(); + } else { + oled_set_cursor(0,1); + render_anim(); + oled_set_cursor(0,13); + oled_write_P(PSTR("WPM: "), false); + oled_write(get_u8_str(get_current_wpm(), ' '), false); + } + return false; +} +#endif diff --git a/keyboards/solartempest/sofle/keymaps/via/config.h b/keyboards/solartempest/sofle/keymaps/via/config.h new file mode 100644 index 000000000000..15790961fa5e --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/config.h @@ -0,0 +1,22 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#pragma once + +// Set number of layers for VIA (+30 per layer) +#define DYNAMIC_KEYMAP_LAYER_COUNT 5 diff --git a/keyboards/solartempest/sofle/keymaps/via/encoder.c b/keyboards/solartempest/sofle/keymaps/via/encoder.c new file mode 100644 index 000000000000..e309b919f1f9 --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/encoder.c @@ -0,0 +1,45 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#ifdef ENCODER_ENABLE + static uint8_t encoder_state[2] = {0}; + static keypos_t encoder_ccw[2] = {{6, 3}, {6, 8}}; //Use these keymap positions to specify the encoder functions on rotate. + static keypos_t encoder_cw[2] = {{6, 1}, {6, 6}}; + + void encoder_action_unregister(void) { + for (int index = 0; index < 2; ++index) { + if (encoder_state[index]) { + keyevent_t encoder_event = (keyevent_t){.key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index], .pressed = false, .time = (timer_read() | 1)}; + encoder_state[index] = 0; + action_exec(encoder_event); + } + } + } + + void encoder_action_register(uint8_t index, bool clockwise) { + keyevent_t encoder_event = (keyevent_t){.key = clockwise ? encoder_cw[index] : encoder_ccw[index], .pressed = true, .time = (timer_read() | 1)}; + encoder_state[index] = (clockwise ^ 1) | (clockwise << 1); + action_exec(encoder_event); + } + + bool encoder_update_user(uint8_t index, bool clockwise) { + encoder_action_register(index, clockwise); + return false; + }; +#endif diff --git a/keyboards/solartempest/sofle/keymaps/via/keymap.c b/keyboards/solartempest/sofle/keymaps/via/keymap.c new file mode 100644 index 000000000000..9780d2cc7eb7 --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/keymap.c @@ -0,0 +1,528 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +#ifdef ENCODER_ENABLE + #include "encoder.c" +#endif + +#ifdef OLED_ENABLE + //#include "oled.c" //Stock OLED code + //Note that the keyboard animations below take a large amount of space! + //#include "bongocat.c" //OLED code for Bongocat, original code by foureight84. + //#include "luna.c" //OLED code for Luna, original code by Hellsingcoder and adapted by Jackasaur. + //#include "snakey.c" //OLED code for Snakey, customized from Luna. If not used, do not use OLED_LOGO in config.h. + #include "snakey_minimal.c" //OLED code for Snakey, without WPM/related animations to save space. If not used, do not use OLED_LOGO in config.h. +#endif + +#ifdef POINTING_DEVICE_ENABLE + bool trackball_is_scrolling = true; //Default mode is scrolling + bool trackball_is_precision = false; //Default mode is less precise + bool was_scrolling = true; //Remember preferred state of trackball scrolling +#endif + +#ifdef HAPTIC_ENABLE + #include "drivers/haptic/DRV2605L.h" +#endif + +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_LAYERS) + extern rgblight_config_t rgblight_config; // To pull layer status for RGBLIGHT +#endif + + +//Variables for custom keycodes +#ifdef SUPER_ALT_TAB_ENABLE + bool is_alt_tab_active = false; // Super Alt Tab Code + uint16_t alt_tab_timer = 0; +#endif +bool lshift_held = false; // LShift Backspace Delete whole Word Code +bool rshift_held = false; // RShift Backspace Delete whole Word Code +static uint16_t held_shift = 0; + +#ifdef D2SKATE_MACRO_ENABLE + uint16_t D2SKATE_TIMER = 0; + bool D2SKATE_skated = false; //Has skated + bool D2SKATE_reset = true; //Has skated +#endif + +#ifdef VIA_ENABLE + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = USER00, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SBS, //Shift backspace to delete whole word (Swap KC_BPSC with this) + PM_SCROLL, //Toggle trackball scrolling mode + PM_PRECISION, //Toggle trackball precision mode + D2SKATE //Destiny 2 hunter sword skate + }; +#else + enum custom_keycodes { //Use USER 00 instead of SAFE_RANGE for Via. VIA json must include the custom keycode. + ATABF = SAFE_RANGE, //Alt tab forwards + ATABR, //Alt tab reverse + NMR, //Move window to monitor on right + NML, //Move window to monitor on left + SBS, //Shift backspace to delete whole word (Swap KC_BPSC with this) + PM_SCROLL, //Toggle trackball scrolling mode + PM_PRECISION, //Toggle trackball precision mode + D2SKATE //Destiny 2 hunter sword skate + }; +#endif + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //Can skip these hard-coded layouts to save space when using only VIA (+700). +/* QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ESC | Q | W | E | R | T |-------. | Y | U | I | O | P | Bspc | + * |------+------+------+------+------+------| Trkbl | |------+------+------+------+------+------| + * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| Enc | | Enc |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' +*/ +/*[0] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC__VOLUP, KC_PGUP,KC_Y, KC_U, KC_I, KC_O, KC_P, SBS, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC__VOLDOWN,KC_PGDN,KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI,KC_LALT,KC_LCTRL,MO(2), KC_ENT, KC_SPC, MO(3), KC_RCTRL,KC_RALT,KC_RGUI +), +[1] = LAYOUT( + KC_PSCR, KC_5, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F4, + KC_T, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, + KC_G, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, + KC_ENT, KC_B, KC_TRNS, KC_PAUS, KC_SPACE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +), +[2] = LAYOUT( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_RGHT, KC_TRNS,KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, + KC_WREF, KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_TRNS, KC_TRNS,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, KC_PIPE, + KC_TRNS, KC_EQL, KC_MINS,KC_PLUS,KC_LCBR,KC_LCBR,KC_LEFT, KC_TRNS,KC_LBRC,KC_RBRC,KC_DOT, KC_COLN,KC_BSLS, KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS +), +[3] = LAYOUT( + NML, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NMR, + KC_NLCK, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ATABF, NMR, KC_WFWD, KC_HOME, KC_UP, KC_END, KC_INS, KC_DEL, + KC_SLCK, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WBAK, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ATABR, NML, KC_CAPS, KC_PGUP, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +), +[4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_NLCK, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_SLCK, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +)*/ +}; + + +#ifdef POINTING_DEVICE_ENABLE + void run_trackball_cleanup(void) { //Set colour of trackball LED. Does not require RGBLIGHT_ENABLE if colour shorthands are not used. + #ifdef POINTING_DEVICE_ENABLE + if (trackball_is_scrolling) { + pimoroni_trackball_set_rgbw(43, 153, 103, 0x00); + } else if (!trackball_is_precision) { + pimoroni_trackball_set_rgbw(0, 27, 199, 0x00); + } else { + pimoroni_trackball_set_rgbw(217, 165, 33, 0x00); //RGB_GOLDENROD in number form. + } + #endif + } + + uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button) { + if (pressed) { + buttons |= 1 << (button); + #ifdef HAPTIC_ENABLE //Haptic feedback when trackball button is pressed + DRV_pulse(4); //sharp_click + #endif + } else { + buttons &= ~(1 << (button)); + } + return buttons; + } + + report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { + if (trackball_is_scrolling) { + mouse_report.h = mouse_report.x; + #ifndef PIMORONI_TRACKBALL_INVERT_X + mouse_report.v = 0.3*mouse_report.y; //Multiplier to lower scrolling sensitivity + #else + mouse_report.v = 0.3*-mouse_report.y; //invert vertical scroll direction + #endif + mouse_report.x = mouse_report.y = 0; + } + return mouse_report; + } + + #if !defined(MOUSEKEY_ENABLE) //Allows for button clicks on keymap even though mousekeys is not defined. + static bool mouse_button_one, trackball_button_one; + #endif + + void trackball_register_button(bool pressed, enum mouse_buttons button) { + report_mouse_t currentReport = pointing_device_get_report(); + if (pressed) { + currentReport.buttons |= button; + } else { + currentReport.buttons &= ~button; + } + pointing_device_set_report(currentReport); + } +#endif + + +void matrix_scan_user(void) { + #ifdef SUPER_ALT_TAB_ENABLE + if (is_alt_tab_active) { //Allows for use of super alt tab. + if (timer_elapsed(alt_tab_timer) > 1000) { + unregister_code(KC_LALT); + is_alt_tab_active = false; + } + } + #endif + #ifdef D2SKATE_MACRO_ENABLE + if (D2SKATE_reset == false) { //Check if Destiny 2 skate timer is activated + if (timer_elapsed(D2SKATE_TIMER) > 4000) { + rgblight_sethsv_noeeprom(252,255,80); //Set regular game layer colour + D2SKATE_reset = true; + #ifdef HAPTIC_ENABLE + DRV_pulse(12); //trp_click + #endif + } + } + #endif + #ifdef ENCODER_ENABLE + encoder_action_unregister(); + #endif + if (timer_elapsed32(oled_timer) > 60000) { //60000ms = 60s + pimoroni_trackball_set_rgbw(0,0,0, 0x00); //Turn off Pimoroni trackball LED when computer is idle for 1 minute. Would use suspend_power_down_user but the code is not working. + } +} + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + #if defined(KEYBOARD_PET) || defined(OLED_LOGO) + if (record->event.pressed) { //OLED timeout code + oled_timer = timer_read32(); + } + #endif + + switch (keycode) { //For keycode overrides + #ifdef SUPER_ALT_TAB_ENABLE + case ATABF: //Alt tab forwards + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_TAB); + } else { + unregister_code(KC_TAB); + } + return true; + case ATABR: //Alt tab reverse + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_code(KC_LALT); + } + alt_tab_timer = timer_read(); + register_code(KC_LSHIFT); + register_code(KC_TAB); + } else { + unregister_code(KC_LSHIFT); + unregister_code(KC_TAB); + } + return true; + #endif + + case NMR: //Move window to next monitor on right + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_RIGHT); + unregister_code(KC_RIGHT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + case NML: //Move window to next monitor on left + if (record->event.pressed) { + register_code(KC_LSFT); + register_code(KC_LWIN); + register_code(KC_LEFT); + unregister_code(KC_LEFT); + unregister_code(KC_LWIN); + unregister_code(KC_LSFT); + } + return true; + + case KC_RSFT: //Shift Backspace to Delete Whole Word. Inspired by Hellsingcoder. + rshift_held = record->event.pressed; + held_shift = keycode; + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + if (record->event.pressed) { + isBarking = true; + } else { + isBarking = false; + } + #endif + return true; + case KC_LSFT: + lshift_held = record->event.pressed; + held_shift = keycode; + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + if (record->event.pressed) { + isBarking = true; + } else { + isBarking = false; + } + #endif + return true; + case SBS: + if (record->event.pressed) { //When left shift is held and backspace pressed, one whole word will be deleted (left). + if (lshift_held) { + unregister_code(held_shift); + register_code(KC_LCTL); + register_code(KC_BSPC); + } else if (rshift_held) { //When left shift is held and backspace pressed, one whole word will be deleted (right). + unregister_code(held_shift); + register_code(KC_LCTL); + register_code(KC_DEL); + } else { + register_code(KC_BSPC); + } + } else { + unregister_code(KC_BSPC); + unregister_code(KC_DEL); + unregister_code(KC_LCTL); + if (lshift_held || rshift_held) { + register_code(held_shift); + } + } + return false; + #ifdef D2SKATE_MACRO_ENABLE + case D2SKATE: + if (record->event.pressed) { + register_code(KC_0); + wait_ms(34); + register_code(KC_SPC); + unregister_code(KC_0); + register_code(KC_X); + wait_ms(18); + unregister_code(KC_SPC); + unregister_code(KC_X); + rgblight_sethsv_noeeprom(180,255,80); + D2SKATE_skated = true; + } + return false; + case KC_1: + case KC_2: + case KC_3: + if (record->event.pressed) { + if(D2SKATE_skated){ //Start the cooldown timer + D2SKATE_TIMER = timer_read(); + D2SKATE_skated = false; + D2SKATE_reset = false; + } + } + return true; + #endif + + #ifdef POINTING_DEVICE_ENABLE //Allow modes when trackball is enabled. + case PM_SCROLL: + if (record->event.pressed) { + if (trackball_is_scrolling || was_scrolling){ //Enable toggling for trackball scrolling + trackball_is_scrolling=false; + was_scrolling=false; //Tracks status of scrolling setting. Works with holding of layer key for mouse mode. + } else{ + trackball_is_scrolling=true; + was_scrolling=true; + } + run_trackball_cleanup(); + break; + } + case PM_PRECISION: + if (record->event.pressed) { + if (trackball_is_precision){ //Enable toggling for trackball precision + pimoroni_trackball_set_precision(1.75); + trackball_is_precision=false; + } else{ + pimoroni_trackball_set_precision(0.8); + trackball_is_precision=true; + } + run_trackball_cleanup(); + break; + } + #ifndef MOUSEKEY_ENABLE //Allow for using mouse buttons in the keymap when mouse keys is not enabled. + case KC_MS_BTN1: + mouse_button_one = record->event.pressed; + trackball_register_button(mouse_button_one | trackball_button_one, MOUSE_BTN1); + break; + case KC_MS_BTN2: + trackball_register_button(record->event.pressed, MOUSE_BTN2); + break; + case KC_MS_BTN3: + trackball_register_button(record->event.pressed, MOUSE_BTN3); + break; + #endif + #endif + + #ifdef KEYBOARD_PET // KEYBOARD PET STATUS + case KC_LCTL: + case KC_RCTL: + #ifndef SNEAK_DISABLE + if (record->event.pressed) { //Pet sneaks when control held. + isSneaking = true; + } else { + isSneaking = false; + } + #endif + #ifdef HAPTIC_ENABLE //Set different patterns for keys on certain layers. In this case it is for gaming feedback. + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(51); //buzz_20 + } + #endif + return true; + case KC_SPC: + if (record->event.pressed) { //Pet jumps when enter is pressed. + isJumping = true; + showedJump = false; + } else { + isJumping = false; + } + return true; + #endif + + #ifdef HAPTIC_ENABLE //Set different patterns for keys on certain layers. In this case it is for gaming feedback. + case KC_G: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(50); //buzz_40 + } + case KC_R: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(52); //pulsing_strong + } + case KC_F: + if (record->event.pressed && (get_highest_layer(layer_state)==1)) { + DRV_pulse(49); //buzz_60 + } + #endif + } + return true; +} + + +#ifdef RGBLIGHT_ENABLE + layer_state_t layer_state_set_user(layer_state_t state) //Use for layer lighting. This method uses less space than RGBLIGHT_LAYER_SEGMENTS. + { + switch (get_highest_layer(state)) { // Change all other LEDs based on layer state as well + case 0: + //rgblight_sethsv_noeeprom(50,255,80); //green-blue gradient + rgblight_sethsv_noeeprom(115,170,80); //pale blue gradient + #ifdef POINTING_DEVICE_ENABLE + if (was_scrolling==true){ //Check if was scrolling when layer was left + trackball_is_scrolling=true; + run_trackball_cleanup(); + } else{ + trackball_is_scrolling=false; + run_trackball_cleanup(); + } + #endif + break; + case 1: + rgblight_sethsv_noeeprom(252,255,80); + #ifdef HAPTIC_ENABLE //Set different patterns for haptic feedback layer indication + DRV_pulse(69); //transition_hum_10 + #endif + break; + case 2: + rgblight_sethsv_noeeprom(80,255,80); + #ifdef HAPTIC_ENABLE + DRV_pulse(37); //lg_dblclick_str + #endif + break; + case 3: + //rgblight_sethsv_noeeprom(118,255,80); //blue-purple gradient + rgblight_sethsv_noeeprom(160,255,80); //blue-magenta gradient + #ifdef HAPTIC_ENABLE + DRV_pulse(31); //sh_dblclick_med + #endif + break; + case 4: + rgblight_sethsv_noeeprom(218,255,80); + #ifdef HAPTIC_ENABLE + DRV_pulse(7); //soft_bump + #endif + #ifdef POINTING_DEVICE_ENABLE //Set trackball mouse mode when layer 4 is activated + if (was_scrolling==true){ //Check if in scrolling mode when layer was activated + trackball_is_scrolling=false; + run_trackball_cleanup(); + } + #endif + } + return state; + } + + bool led_update_user(led_t led_state) //Lock key status indicators + { + if(led_state.caps_lock){ + rgblight_sethsv_range(43,100,170, 4,7); //White-left caps lock indication + } + if(!(led_state.num_lock)){ + rgblight_sethsv_range(43,100,170, 28,31); //White-right num lock indication. Since this indicator is inverted, it must be on the master side of the keyboard to shut off properly when the computer is sleeping. + } + if(led_state.scroll_lock){ + rgblight_sethsv_range(43,100,170, 16,19); //White-middle scroll lock indication + } + return true; + } +#endif + + +void keyboard_post_init_user(void) +{ + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT+8); //Set to static gradient 9 + #endif + layer_move(0); //Start on layer0 by default to set LED colours. Can remove to save a very small amount of space. + #ifdef POINTING_DEVICE_ENABLE + pimoroni_trackball_set_precision(1.75); //Start trackball with lower precision mode + run_trackball_cleanup(); + #endif +} + +#ifdef POINTING_DEVICE_ENABLE + void suspend_power_down_user(void) { //Code does not work, need to confirm why + pimoroni_trackball_set_rgbw(0,0,0, 0x00); //Turn off Pimoroni trackball LED when computer is sleeping + } +#endif + +#ifdef POINTING_DEVICE_ENABLE + void suspend_wakeup_init_user(void) { //turn on Pimoroni LED when awoken + run_trackball_cleanup(); + } +#endif diff --git a/keyboards/solartempest/sofle/keymaps/via/luna.c b/keyboards/solartempest/sofle/keymaps/via/luna.c new file mode 100644 index 000000000000..31055609c26b --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/luna.c @@ -0,0 +1,308 @@ +/* Copyright + * 2021 solartempest + * 2021 Luna code adapted from HellSingCoder and Jackasaur + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty o + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//SSD1306 OLED update loop +#ifdef OLED_ENABLE + /* KEYBOARD PET START */ + #define KEYBOARD_PET + + /* settings */ + #define MIN_WALK_SPEED 10 + #define MIN_RUN_SPEED 40 + + /* advanced settings */ + #define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms + #define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024 + + /* timers */ + uint32_t anim_timer = 0; + uint32_t anim_sleep = 0; + + /* current frame */ + uint8_t current_frame = 0; + + /* status variables */ + int current_wpm_read = 0; + uint32_t oled_timer = 0; //For Keyboard pet OLED timeout with animations, code by Drashna. + led_t led_usb_state; + + bool isSneaking = false; + bool isJumping = false; + bool showedJump = true; + bool isBarking = false; + + + /* logic */ + static void render_luna(int LUNA_X, int LUNA_Y) { + + /* Sit */ + static const char PROGMEM sit[2][ANIM_SIZE] = { + /* 'sit1', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, + 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, + 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + /* 'sit2', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, + 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, + 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }; + + /* Walk */ + static const char PROGMEM walk[2][ANIM_SIZE] = { + /* 'walk1', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80, + 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03, + 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + /* 'walk2', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, + 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + /* Run */ + static const char PROGMEM run[2][ANIM_SIZE] = { + /* 'run1', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01, + 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + /* 'run2', 32x22px */ + { + 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, + 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + /* Bark */ + static const char PROGMEM bark[2][ANIM_SIZE] = { + /* 'bark1', 32x22px */ + { + 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, + 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, + 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + /* 'bark2', 32x22px */ + { + 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, + 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, + 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + /* Sneak */ + static const char PROGMEM sneak[2][ANIM_SIZE] = { + /* 'sneak1', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04, + 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06, + 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + }, + + /* 'sneak2', 32x22px */ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04, + 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04, + 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + /* animation */ + void animate_luna(void) { + + /* jump */ + if (isJumping || !showedJump) { + + /* clear */ + oled_set_cursor(LUNA_X,LUNA_Y +2); + oled_write(" ", false); + + oled_set_cursor(LUNA_X,LUNA_Y -1); + + showedJump = true; + } else { + + /* clear */ + oled_set_cursor(LUNA_X,LUNA_Y -1); + oled_write(" ", false); + + oled_set_cursor(LUNA_X,LUNA_Y); + } + + /* switch frame */ + current_frame = (current_frame + 1) % 2; + + /* current status */ + if(isBarking) { + oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE); + + } else if(isSneaking) { + oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE); + + } else if(current_wpm_read <= MIN_WALK_SPEED) { + oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE); + + } else if(current_wpm_read <= MIN_RUN_SPEED) { + oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE); + + } else { + oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE); + } + } + + /* animation timer */ + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animate_luna(); + } + } + + /* KEYBOARD PET END */ + + static void print_logo_narrow(void) { + oled_set_cursor(0,3); + oled_write("SOLAR", false); + oled_set_cursor(0,4); + oled_write("TMPST", false); + + /* wpm counter */ + oled_set_cursor(0,10); + oled_write_P(PSTR("WPM: "), false); + oled_write(get_u8_str(get_current_wpm(), ' '), false); + } + + static void print_status_narrow(void) { + /*switch (get_highest_layer(default_layer_state)) { //Not required as only one default layer is used + case 0: + oled_write("SOLAR", false); + break; + case 1: + oled_write("GAME", false); + break; + default: + oled_write("UNDEF", false); + }*/ + + /* Print current layer */ + oled_set_cursor(0,2); + oled_write("LAYER", false); + + oled_set_cursor(0,3); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + /* lock status */ + oled_set_cursor(0,6); + oled_write("LOCK", false); + oled_set_cursor(0,7); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,8); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,9); + oled_write("Scrl", led_usb_state.scroll_lock); + + /* KEYBOARD PET RENDER START */ + render_luna(0,13); + /* KEYBOARD PET RENDER END */ + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_270; + } + + bool oled_task_user(void) { + /* KEYBOARD PET VARIABLES START */ + current_wpm_read = get_current_wpm(); + led_usb_state = host_keyboard_led_state(); + /* KEYBOARD PET VARIABLES END */ + + + if (is_keyboard_master()) { //Drashna's OLED timeout off code for animations + if (timer_elapsed32(oled_timer) > 30000) { + oled_off(); + return false; + } else { + oled_on(); + } + } + + if (is_keyboard_master()) { + print_status_narrow(); + } else { + print_logo_narrow(); + } + return false; + } +#endif diff --git a/keyboards/solartempest/sofle/keymaps/via/oled.c b/keyboards/solartempest/sofle/keymaps/via/oled.c new file mode 100644 index 000000000000..b7b55ad0712a --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/oled.c @@ -0,0 +1,90 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//Sets up what the OLED screens display. + +#ifdef OLED_ENABLE + uint32_t oled_timer = 0; //OLED timeout + static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0 + }; + + oled_write_P(qmk_logo, false); + } + + static void print_status_narrow(void) { + // Print current mode + oled_write_P(PSTR("\n\n"), false); + + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_ln_P(PSTR("Qwrt"), false); + break; + case 1: + oled_write_ln_P(PSTR("Clmk"), false); + break; + default: + oled_write_P(PSTR("Mod\n"), false); + break; + } + oled_write_P(PSTR("\n\n"), false); + // Print current layer + oled_write_ln_P(PSTR("LAYER"), false); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write_P(PSTR("Base\n"), false); + break; + case 3: + oled_write_P(PSTR("Raise"), false); + break; + case 4: + oled_write_P(PSTR("Lower"), false); + break; + default: + oled_write_ln_P(PSTR("Undef"), false); + } + oled_write_P(PSTR("\n\n"), false); + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_270; + } + return rotation; + } + /* oled_rotation_t oled_init_user(oled_rotation_t rotation) { //128x64 OLED test + if (is_keyboard_master()) { + return OLED_ROTATION_270; + } + return OLED_ROTATION_90; + }*/ + + bool oled_task_user(void) { + if (is_keyboard_master()) { + print_status_narrow(); + } else { + render_logo(); + } + return false; + } +#endif \ No newline at end of file diff --git a/keyboards/solartempest/sofle/keymaps/via/rules.mk b/keyboards/solartempest/sofle/keymaps/via/rules.mk new file mode 100644 index 000000000000..1e5b99807cb7 --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/solartempest/sofle/keymaps/via/snakey.c b/keyboards/solartempest/sofle/keymaps/via/snakey.c new file mode 100644 index 000000000000..c456e47a9326 --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/snakey.c @@ -0,0 +1,318 @@ +/* Copyright + * 2021 solartempest + * 2021 Luna code adapted from HellSingCoder and Jackasaur + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty o + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//SSD1306 OLED update loop +#ifdef OLED_ENABLE + uint32_t oled_timer = 0; //OLED timeout + led_t led_usb_state; + + // KEYBOARD PET START + #define KEYBOARD_PET + + // settings for WPM-reactive animations + #define MIN_WALK_SPEED 10 + #define MIN_RUN_SPEED 40 + + // advanced settings + #define ANIM_FRAME_DURATION 300 // how long each frame lasts in ms. Default is 200. + #define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024 + + // timers + uint32_t anim_timer = 0; + + // current frame + uint8_t current_frame = 0; + + // status variables + int current_wpm_read = 0; + #ifndef SNEAK_DISABLE + bool isSneaking = false; + #endif + bool isJumping = false; + bool showedJump = true; + bool isBarking = false; + + #if defined(OLED_LOGO) && !defined(OLED_NO_SLAVE) + static void render_logo(int LUNA_X, int LUNA_Y) { + static const char PROGMEM luna_logo[] = { + 0x00, 0x00, 0x04, 0xf6, 0xb8, 0xf8, 0xd8, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, + 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe1, 0xf3, 0xfb, 0x7f, 0x1f, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x3f, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xf3, 0xff, 0x7f, 0x1f, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x30, + 0x1e, 0x3f, 0x3f, 0x7f, 0xf9, 0xf0, 0xf0, 0x70, 0x78, 0x3c, 0x3f, 0x1f, 0x0f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x3f, 0x7f, 0x7f, 0xfb, 0xf1, 0xf0, 0x78, 0x3c, 0x1e, 0x0f, 0x03, 0x00, 0x00, + }; + oled_set_cursor(LUNA_X,LUNA_Y); + oled_write_raw_P(luna_logo, sizeof(luna_logo)); + } + #endif + + // logic + static void render_luna(int LUNA_X, int LUNA_Y) { + + // Sit + static const char PROGMEM sit[2][ANIM_SIZE] = { + // 'sit1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x70, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'sit2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Walk + static const char PROGMEM walk[2][ANIM_SIZE] = { + // 'walk1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xfc, 0xfe, 0xfe, 0x1f, 0x3f, 0x39, 0x39, 0x3f, 0x3f, 0x1e, 0x1e, 0x0c, 0x00, + 0x00, 0x00, 0x01, 0x0f, 0x3e, 0x78, 0x70, 0xf8, 0xfc, 0xfe, 0x7e, 0x3e, 0x3c, 0x3c, 0x78, 0x78, + 0x78, 0xf0, 0xf1, 0xff, 0x7f, 0x7f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'walk2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0x60, 0x60, 0xc0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x7f, 0xff, 0xff, 0xe7, 0xc7, 0x0e, 0x0e, 0x0f, 0x0f, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1f, 0x3e, 0x78, 0xf0, 0xfc, 0x7e, 0x1e, 0x1f, 0x0f, 0x0e, + 0x1e, 0x1c, 0x3d, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Run + static const char PROGMEM run[2][ANIM_SIZE] = { + // 'run1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf8, 0x98, 0xf8, 0xf8, 0xf8, 0xf0, 0x70, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf0, 0xf0, 0xe0, 0xc0, + 0x87, 0x7f, 0xff, 0xff, 0xf1, 0xc3, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1f, 0x3e, 0x78, 0xf7, 0xff, 0x7f, 0x3d, 0x03, 0x07, 0x0f, + 0x1e, 0x3d, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'run2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0xf0, 0xf0, 0xf8, 0x98, 0xf8, 0xf8, 0xf8, 0xf0, 0x70, 0x20, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf8, 0xfc, 0x3e, 0xde, 0xfe, 0xfc, 0xf8, 0x00, 0x00, + 0xe0, 0xfe, 0xff, 0x7f, 0x07, 0x01, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x1e, 0x3c, 0x78, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x07, 0x1f, 0x3f, 0x7c, 0x78, 0xff, + 0xff, 0x7f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Bark + static const char PROGMEM bark[2][ANIM_SIZE] = { + // 'bark1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x30, 0x70, 0xe0, 0xe0, 0xc0, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0xff, 0xff, 0xe7, 0xe7, 0xef, 0xef, 0xcf, 0xcb, 0x83, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x1c, 0x38, 0x78, 0xf1, 0xe3, 0xe3, 0xe7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'bark2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0x60, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x9f, + 0x0f, 0x0e, 0x1f, 0x1f, 0x3f, 0x3f, 0x7e, 0xe6, 0x83, 0x03, 0x0f, 0x43, 0x43, 0x90, 0x88, 0x08, + 0x00, 0x00, 0x03, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, 0xe0, 0xf0, 0xf0, 0xfb, 0xff, 0xff, 0xff, 0x7f, + 0x7f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Sneak + #ifndef SNEAK_DISABLE + static const char PROGMEM sneak[2][ANIM_SIZE] = { + // 'sneak1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf1, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x01, 0x03, 0x06, 0x02, 0x00, 0x00, 0x00, + }, + + // 'sneak2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0xf8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf0, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + #endif + + // animation + void animate_luna(void) { + // jump + if (isJumping || !showedJump) { + // clear + oled_set_cursor(LUNA_X,LUNA_Y +2); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y -1); + showedJump = true; + } else { + // clear + oled_set_cursor(LUNA_X,LUNA_Y -1); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y); + } + + // switch frame + current_frame = (current_frame + 1) % 2; + + // current status + if(isBarking) { + oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE); + #ifndef SNEAK_DISABLE + } else if(isSneaking) { + oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE); + #endif + } else if(current_wpm_read <= MIN_WALK_SPEED) { + oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE); + } else if(current_wpm_read <= MIN_RUN_SPEED) { + oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE); + } else { + oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE); + } + } + + // animation timer + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animate_luna(); + } + } + // KEYBOARD PET END + + #ifndef OLED_NO_SLAVE + static void print_logo_narrow(void) { + oled_set_cursor(0,2); + oled_write("SOLAR", false); + oled_set_cursor(0,3); + oled_write("TMPST", false); + + #ifdef OLED_LOGO + render_logo(0,7); //Not defining this in config.h will save space (+112). + #endif + + /* wpm counter */ + oled_set_cursor(0,13); + oled_write_P(PSTR("WPM: "), false); + oled_write(get_u8_str(get_current_wpm(), ' '), false); + } + #endif + + static void print_status_narrow(void) { + /*switch (get_highest_layer(default_layer_state)) { //May be useful if you use multiple non-QWERTY layouts to show which is active. + case 0: + oled_write("SOLAR", false); + break; + case 1: + oled_write("GAME", false); + break; + default: + oled_write("UNDEF", false); + }*/ + + /* Print current layer */ + oled_set_cursor(0,2); + oled_write("LAYER", false); + + oled_set_cursor(0,3); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + /* lock status */ + oled_set_cursor(0,6); + oled_write("LOCK", false); + oled_set_cursor(0,7); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,8); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,9); + oled_write("Scrl", led_usb_state.scroll_lock); + + /* KEYBOARD PET RENDER START */ + render_luna(0,12); + /* KEYBOARD PET RENDER END */ + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_270; + } + + bool oled_task_user(void) { + /* KEYBOARD PET VARIABLES START */ + current_wpm_read = get_current_wpm(); + /* KEYBOARD PET VARIABLES END */ + led_usb_state = host_keyboard_led_state(); + + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 30000) {//OLED timeout 30000ms = 30s + oled_off(); + return false; + } else { + oled_on(); + } + print_status_narrow(); + } else { + print_logo_narrow(); + } + return false; + } +#endif diff --git a/keyboards/solartempest/sofle/keymaps/via/snakey_minimal.c b/keyboards/solartempest/sofle/keymaps/via/snakey_minimal.c new file mode 100644 index 000000000000..01ffe67ea29f --- /dev/null +++ b/keyboards/solartempest/sofle/keymaps/via/snakey_minimal.c @@ -0,0 +1,257 @@ +/* Copyright + * 2021 solartempest + * 2021 Luna code adapted from HellSingCoder and Jackasaur + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty o + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//SSD1306 OLED update loop +#ifdef OLED_ENABLE + uint32_t oled_timer = 0; //OLED timeout + led_t led_usb_state; + + #define KEYBOARD_PET + // KEYBOARD PET START + + // advanced settings + #define ANIM_FRAME_DURATION 300 // how long each frame lasts in ms. Default is 200. + #define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024 + + // timers + uint32_t anim_timer = 0; + uint32_t text_timer = 0; + + // current frame + uint8_t current_frame = 0; + + // status variables + #ifndef SNEAK_DISABLE + bool isSneaking = false; + #endif + bool isJumping = false; + bool showedJump = true; + bool isBarking = false; + + #if defined(OLED_LOGO) && !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void render_logo(int LUNA_X, int LUNA_Y) { + static const char PROGMEM luna_logo[] = { + 0x00, 0x00, 0x04, 0xf6, 0xb8, 0xf8, 0xd8, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, + 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe1, 0xf3, 0xfb, 0x7f, 0x1f, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x3f, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xf3, 0xff, 0x7f, 0x1f, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x30, + 0x1e, 0x3f, 0x3f, 0x7f, 0xf9, 0xf0, 0xf0, 0x70, 0x78, 0x3c, 0x3f, 0x1f, 0x0f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x3f, 0x7f, 0x7f, 0xfb, 0xf1, 0xf0, 0x78, 0x3c, 0x1e, 0x0f, 0x03, 0x00, 0x00, + }; + oled_set_cursor(LUNA_X,LUNA_Y); + oled_write_raw_P(luna_logo, sizeof(luna_logo)); + } + #endif + + // logic + static void render_luna(int LUNA_X, int LUNA_Y) { + + // Sit + static const char PROGMEM sit[2][ANIM_SIZE] = { + // 'sit1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x70, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'sit2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xcc, + 0xcc, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x7f, 0xfc, 0xf9, 0xf1, + 0xe1, 0xc1, 0x81, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x60, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + //Walk and run animations have been removed to save space. + + // Bark + static const char PROGMEM bark[2][ANIM_SIZE] = { + // 'bark1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x30, 0x70, 0xe0, 0xe0, 0xc0, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0xff, 0xff, 0xe7, 0xe7, 0xef, 0xef, 0xcf, 0xcb, 0x83, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x1c, 0x38, 0x78, 0xf1, 0xe3, 0xe3, 0xe7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + + // 'bark2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0x60, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x9f, + 0x0f, 0x0e, 0x1f, 0x1f, 0x3f, 0x3f, 0x7e, 0xe6, 0x83, 0x03, 0x0f, 0x43, 0x43, 0x90, 0x88, 0x08, + 0x00, 0x00, 0x03, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, 0xe0, 0xf0, 0xf0, 0xfb, 0xff, 0xff, 0xff, 0x7f, + 0x7f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + + // Sneak + #ifndef SNEAK_DISABLE + static const char PROGMEM sneak[2][ANIM_SIZE] = { + // 'sneak1', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf1, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x01, 0x03, 0x06, 0x02, 0x00, 0x00, 0x00, + }, + // 'sneak2', 32x22px + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0xf8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, + 0x7c, 0xfc, 0xee, 0xe6, 0xfc, 0xfc, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x7f, 0xf0, 0xf8, 0xf8, 0x7c, 0x7c, 0xf8, 0xf0, 0xf0, 0xf1, 0xe7, 0xef, 0xef, + 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + }; + #endif + + // animation + void animate_luna(void) { + // jump + if (isJumping || !showedJump) { + // clear + oled_set_cursor(LUNA_X,LUNA_Y +2); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y -1); + showedJump = true; + } else { + // clear + oled_set_cursor(LUNA_X,LUNA_Y -1); + oled_write(" ", false); + oled_set_cursor(LUNA_X,LUNA_Y); + } + + // switch frame + current_frame = (current_frame + 1) % 2; + + // current status + if(isBarking) { + oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE); + #ifndef SNEAK_DISABLE + } else if(isSneaking) { + oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE); + #endif + } else { + oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE); + } + } + + // animation timer + if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animate_luna(); + } + } + // KEYBOARD PET END + + + #if !defined(OLED_NO_SLAVE) && !defined(OLED_NO_MASTER) + static void print_logo_narrow(void) { + oled_set_cursor(0,4); + oled_write("SOLAR", false); + oled_set_cursor(0,5); + oled_write("TMPST", false); + + #ifdef OLED_LOGO + render_logo(0,9); //Not defining this in config.h will save space (+112). + #endif + } + #endif + + static void print_status_narrow(void) { + // Print current layer + oled_set_cursor(0,1); + oled_write("LAYER", false); + + oled_set_cursor(0,2); + switch (get_highest_layer(layer_state)) { + case 0: + case 2: + oled_write("Base ", false); + break; + case 1: + oled_write("Game ", false); + break; + case 4: + oled_write("Raise", false); + break; + case 3: + oled_write("Lower", false); + break; + } + + // lock status + oled_set_cursor(0,5); + oled_write("LOCK", false); + oled_set_cursor(0,6); + oled_write("Caps", led_usb_state.caps_lock); + oled_set_cursor(0,7); + oled_write("Num", !(led_usb_state.num_lock)); + oled_set_cursor(0,8); + oled_write("Scrl", led_usb_state.scroll_lock); + + /* KEYBOARD PET RENDER START */ + render_luna(0,11); + /* KEYBOARD PET RENDER END */ + } + + oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_270; + } + + bool oled_task_user(void) { + led_usb_state = host_keyboard_led_state(); + + + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 30000) {//OLED timeout 30000ms = 30s + oled_off(); + return false; + } else { + oled_on(); + } + #ifndef OLED_NO_MASTER + print_status_narrow(); + #endif + } else { + #ifdef OLED_NO_SLAVE //do not render slave + #else + #if !defined(OLED_NO_MASTER) //render as normal + print_logo_narrow(); + #else //render status on slave + print_status_narrow(); + #endif + #endif + } + return false; + } +#endif diff --git a/keyboards/solartempest/sofle/readme.md b/keyboards/solartempest/sofle/readme.md new file mode 100644 index 000000000000..a57c29a89231 --- /dev/null +++ b/keyboards/solartempest/sofle/readme.md @@ -0,0 +1,99 @@ +### --- Note: When flashing this firmware, be sure to load the VIA keymap and layout files otherwise your keys won't work! Please refer to the VIA section below. --- + +# Sofle Keyboard + +![SofleKeyboard version 2.1 RGB Keyhive](https://i.imgur.com/utkZbYS.jpeg) + +Sofle is a 58-key column-staggered split keyboard with rotary encoders and OLEDs with support for a trackball and haptic feedback. Based on Lily58, Corne and Helix keyboards. + +For details about the keyboard design, refer to Josef's blog: [Sofle Keyboard - a split keyboard based on Lily58 and Crkbd](https://josef-adamcik.cz/electronics/let-me-introduce-you-sofle-keyboard-split-keyboard-based-on-lily58.html) + +Build guide and log is available here: [SofleKeyboard build log/guide](https://josef-adamcik.cz/electronics/soflekeyboard-build-log-and-build-guide.html) + +* Keyboard Maintainer: [Solartempest] +* Hardware Supported: SofleKeyboard V2.1 RGB PCB, ProMicro / Elite-C +* Hardware Availability: [Keyhive](https://keyhive.xyz/shop/sofle) + +# Custom Features: +### OLED Features: +- Includes Snakey keyboard pet! Slithers according to WPM, bites, and sticks its tongue out at you! +- Includes Snakey minimal version, with less animations and WPM-free to allow for more free space. +- OLED displays current layer, lock key status, WPM, custom logo, and custom name. +- OLED shuts off on idle and when computer is sleeping. +- Includes working Luna keyboard pet. +- Includes working Bongocat (disable other features for sufficient space). +- Includes stock OLED code as well. + +### Trackball Features: +- Supports Pimoroni Trackball installed on master side. +- Default action is scrolling. Hold Raise layer for mouse mode. +- Mouse mode and precision mode are toggleable with trackball LED indication. +- Trackball LED shuts off when computer is sleeping. +- Clicking and dragging is enabled using mouse keys on keymap. + +### RGB Features: +- Adds custom layer lighting with custom gradients for each layer. +- RGB underglow support and remapped to physical locations (nicer gradients and effects). +- Adds white caps lock, scroll lock, and num lock key indicators using the top row/underglow LEDs. + +### Rotary Encoder and VIA Features: +- Fully emappable left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN. +- Allows for live remapping of per-layer rotary encoder functions in VIA. +- VIA support included by default. +- This fixes the Keyhive left bottom row offset issue in VIA. You will need to import sofle.json in VIA. +- Custom macro key in VIA for Super Alt Tab, which is fully compatible with rotary encoders. +- Custom macro key in VIA for moving windows to other monitors in Windows, which is fully compatible with rotary encoders. + +### Haptic Feedback Features: +- Supports Pimoroni Haptic Bzzz installed on master side. +- Different vibrations when layers are activated. +- Provides tactile feedback when trackball is clicked or mouse keys are used. +- Tactile feedback for specific keys on gaming layer. + +### Tap and Other Features: +- Push left-shift + backspace to delete whole words. Right-shift + backspace to delete whole words in the opposite direction. +- Double tap layers to stay on a layer instead of momentary push. +- Symmetric modifiers (CMD/Super, Alt/Opt, Ctrl, Shift). + +### Acknowledgements +- Thanks Drashna for the OLED timeout and extensible rotary encoder code. +- Thanks Dasky for helping me resolve prior trackball code issues. +- Thanks to Hellsingcoder for creating Luna and Jackasaur for optimizing the code for less space. This was the base code I used for Snakey. +- Bongocat code by foureight84, included for those who want to try it easily. +- Stock OLED code by Keyhive and + +## Using with VIA (Important! Please Read.) + +- After flashing, in VIA make sure to Import Keymap, which is "sofle VIA keymap.json". This will alow VIA to recognize the updated layout and custom functions. VIA will not auto-recognize the keyboard with this firmware because of the necessary customization. +- Go to Save+Load to Load Saved Layout. You can import my own layout "sofle VIA layout.json" or just use the Keymap tab to assign your own keys. Having another keyboard connected can be handy for doing this step. +- It is a good idea to Save Current Layout after you decide on your mapping. + + +# Compiling + +Compile with the command below: + +```sh +# for Elite C with Left Side Master builds +qmk compile -kb solartempest/sofle -km via +``` + +## Flashing + +Flash using the correct command below or use QMK Toolbox. Specifying side during compile is unnecessary as Master Left is defined by default: + +```sh +# for pro micro-based builds +qmk flash -kb solartempest/sofle -km via + +# for Elite C or dfu bootloader builds +qmk flash -kb solartempest/sofle -km via +``` + +These commands can be mixed if, for example, you have an Elite C on the left and a pro micro on the right. +Press reset button on he keyboard when asked. + +Disconnect the first half, connect the second one and repeat the process. + + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/solartempest/sofle/rules.mk b/keyboards/solartempest/sofle/rules.mk new file mode 100644 index 000000000000..e315f80465f5 --- /dev/null +++ b/keyboards/solartempest/sofle/rules.mk @@ -0,0 +1,31 @@ +MCU = atmega32u4 +BOOTLOADER = atmel-dfu + +# Build Options +# Comment out to disable the options. + +SPLIT_KEYBOARD = yes # Split keyboard +CONSOLE_ENABLE = no # Console for debug (+4686) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration (+644) +MAGIC_ENABLE = no # Save space by not PROCESS_MAGIC, which is bootmagic with out the boot (+634) +GRAVE_ESC_ENABLE = no # Save space by not using KC_GESC (+127) +SPACE_CADET_ENABLE = no # Save space by not using space cadet left/right shift (+350) +LTO_ENABLE = yes # Save space by link time optimization + +RGBLIGHT_ENABLE = yes # RGB lighting (+3826) +ENCODER_ENABLE = yes # Rotary encoders (+1112) +EXTRAKEY_ENABLE = yes # Audio control and System control (+450) +MOUSEKEY_ENABLE = no # Mouse keys (+1482). Not required for trackball usage. +NKRO_ENABLE = no # 6KRO by default. NKRO works if enabled (+328) +COMBO_ENABLE = no # Tap combo chording (+952) +#VIA # VIA_ENABLE with the keymap (+2300). Note: VIA is required as non-via layouts were removed to save space. + +OLED_ENABLE = yes # Must be disabled if OLEDs are not installed (+3608-4774 with pet) +OLED_DRIVER = SSD1306 # Specify OLED driver +WPM_ENABLE = no # WPM counter for typing-speed-reactive keyboard pets (+782) + +POINTING_DEVICE_ENABLE = yes # Enable Pimoroni Trackball on master (+2304) +POINTING_DEVICE_DRIVER = pimoroni_trackball + +HAPTIC_ENABLE = no # Enable Pimoroni Haptic Bzzz LRA (+1192) +HAPTIC_DRIVER += DRV2605L diff --git a/keyboards/solartempest/sofle/sofle VIA keymap.json b/keyboards/solartempest/sofle/sofle VIA keymap.json new file mode 100644 index 000000000000..99eb5259d441 --- /dev/null +++ b/keyboards/solartempest/sofle/sofle VIA keymap.json @@ -0,0 +1,77 @@ +{ + "name": "Solarius_Sofle" , + "vendorId": "0xFC32", + "productId": "0x1287", + "lighting": "qmk_rgblight", + "matrix": { "rows": 10, "cols": 7 }, + "customKeycodes": [ + { + "name": "Super Alt Tab FWD", + "title": "Alt Tab Forwards in Windows", + "shortName": "ATABF" + }, + { + "name": "Super Alt Tab REV", + "title": "Alt Tab Reverse in Windows", + "shortName": "ATABR" + }, + { + "name": "Move Window Right", + "title": "Move Window Right in Windows", + "shortName": "MWR" + }, + { + "name": "Move Window Left", + "title": "Move Window Left in Windows", + "shortName": "MWL" + }, + { + "name": "Shift-BSPC", + "title": "Shift-Backspace to Delete Whole Words", + "shortName": "SBS" + }, + { + "name": "Trackball Scroll", + "title": "Pimoroni Trackball Scroll Mode", + "shortName": "PM_SCROLL" + }, + { + "name": "Trackball Precision", + "title": "Pimoroni Trackball Precision Mode", + "shortName": "PM_PRECISION" + }, + { + "name": "D2 Hunter Skate", + "title": "Destiny 2 Hunter Sword Skate", + "shortName": "D2SKATE" + } + ], + "layouts": + { + "keymap": + [ + [{"y":0.5,"x":3.25},"0,3",{"x":9},"5,3"], + [{"y":-0.87,"x":2.25},"0,2",{"x":1},"0,4",{"x":7},"5,4",{"x":1},"5,2"], + [{"y":-0.9,"x":5.25},"0,5",{"x":5},"5,5"], + [{"y":-0.87,"x":0.25,"c":"#777777"},"0,0",{"c":"#cccccc"},"0,1",{"x":13},"5,1",{"c":"#aaaaaa"},"5,0"], + [{"y":-0.4,"x":3.25,"c":"#cccccc"},"1,3",{"x":2.2},"1,6",{"x":2.6},"8,6",{"x":2.2},"6,3"], + [{"y":-0.9,"x":2.25},"1,2",{"x":1},"1,4",{"x":7},"6,4",{"x":1},"6,2"], + [{"y":-0.9,"x":5.25},"1,5",{"x":5},"6,5"], + [{"y":-0.9,"x":0.25,"c":"#aaaaaa"},"1,0",{"c":"#cccccc"},"1,1",{"x":13},"6,1",{"c":"#aaaaaa"},"6,0"], + [{"y":-0.4,"x":3.25,"c":"#cccccc"},"2,3",{"x":2.2},"4,0",{"x":2.6},"9,5",{"x":2.2},"7,3"], + [{"y":-0.9,"x":2.25},"2,2",{"x":1},"2,4",{"x":7},"7,4",{"x":1},"7,2"], + [{"y":-0.9,"x":5.25},"2,5",{"x":5},"7,5"], + [{"y":-0.9,"x":0.25,"c":"#aaaaaa"},"2,0",{"c":"#cccccc"},"2,1",{"x":13},"7,1",{"c":"#aaaaaa"},"7,0"], + [{"y":-0.4,"x":3.25,"c":"#cccccc"},"3,3",{"x":2.2},"3,6",{"x":2.6},"6,6",{"x":2.2},"8,3"], + [{"y":-0.9,"x":2.25},"3,2",{"x":1},"3,4",{"x":7},"8,4",{"x":1},"8,2"], + [{"y":-0.9,"x":5.25},"3,5",{"x":5},"8,5"], + [{"y":-0.9,"x":0.25,"c":"#aaaaaa"},"3,0",{"c":"#cccccc"},"3,1",{"x":13},"8,1",{"c":"#aaaaaa"},"8,0"], + [{"y":-0.3,"x":3.25},"4,2",{"x":9},"9,1"], + [{"y":-0.9,"x":2.25},"4,1",{"x":1},"4,3",{"x":7},"9,2",{"x":1},"9,0"], + [{"r":30,"rx":7.15,"y":4.6,"x":1,"c":"#777777"},"4,4"], + [{"r":45,"y":-2.25,"x":3.35,"h":1.5},"4,5"], + [{"r":-45,"y":1.3,"x":-2.08,"h":1.5},"9,4"], + [{"r":-30,"y":-0.45,"x":0.8},"9,3"] + ] + } +} diff --git a/keyboards/solartempest/sofle/sofle VIA layout trackball.json b/keyboards/solartempest/sofle/sofle VIA layout trackball.json new file mode 100644 index 000000000000..e4b03f1b599b --- /dev/null +++ b/keyboards/solartempest/sofle/sofle VIA layout trackball.json @@ -0,0 +1,367 @@ +{ + "name": "Solarius_Sofle", + "vendorProductId": 4231139975, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_NO", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_VOLU", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "KC_F", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_VOLD", + "KC_MUTE", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "TT(3)", + "KC_ENT", + "KC_LALT", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "KC_0", + "USER04", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "KC_LEFT", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "KC_NO", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "KC_RGHT", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "TT(4)", + "KC_SPC", + "C(KC_W)", + "KC_N" + ], + [ + "KC_PSCR", + "KC_4", + "KC_1", + "KC_2", + "KC_3", + "KC_G", + "KC_SPC", + "KC_F12", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_TRNS", + "KC_TAB", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_NO", + "KC_LSFT", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_TRNS", + "KC_TRNS", + "KC_LALT", + "KC_TRNS", + "USER07", + "KC_F22", + "KC_SPC", + "KC_NO", + "KC_F4", + "KC_F11", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F12", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_RALT", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "TO(0)", + "KC_RALT", + "MO(4)", + "MO(2)", + "KC_ENT", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_NO", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_VOLU", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "KC_F", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_VOLD", + "KC_MUTE", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "TT(2)", + "KC_SPC", + "KC_LALT", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "KC_0", + "USER04", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "KC_PGUP", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "KC_NO", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "KC_PGDN", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "TT(3)", + "KC_ENT", + "C(KC_W)", + "KC_N" + ], + [ + "KC_GRV", + "KC_F1", + "KC_F2", + "KC_F3", + "KC_F4", + "KC_F5", + "KC_NO", + "KC_ESC", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "C(KC_TAB)", + "KC_TRNS", + "KC_EXLM", + "KC_AT", + "KC_HASH", + "KC_DLR", + "KC_PERC", + "KC_NO", + "KC_TRNS", + "KC_EQL", + "KC_MINS", + "KC_PLUS", + "KC_LCBR", + "KC_RCBR", + "C(S(KC_TAB))", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F11", + "KC_F10", + "KC_F9", + "KC_F8", + "KC_F7", + "KC_F6", + "KC_NO", + "KC_F12", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "C(S(KC_TAB))", + "KC_PIPE", + "KC_RPRN", + "KC_LPRN", + "KC_ASTR", + "KC_AMPR", + "KC_CIRC", + "KC_NO", + "KC_TRNS", + "KC_BSLS", + "KC_COLN", + "KC_DOT", + "KC_RBRC", + "KC_LBRC", + "C(KC_TAB)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_BSPC", + "KC_TRNS", + "C(KC_T)", + "KC_NO" + ], + [ + "KC_TRNS", + "C(KC_MINS)", + "C(KC_PPLS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_INS", + "KC_PSCR", + "KC_APP", + "C(KC_UP)", + "C(KC_DOWN)", + "USER00", + "KC_TRNS", + "KC_LALT", + "KC_LCTL", + "KC_LSFT", + "C(KC_LEFT)", + "C(KC_RGHT)", + "KC_NO", + "KC_TRNS", + "C(KC_Z)", + "C(KC_X)", + "C(KC_C)", + "C(KC_V)", + "KC_TRNS", + "USER01", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_MYCM", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_F14", + "KC_F13", + "KC_NO", + "KC_DEL", + "KC_INS", + "KC_END", + "KC_UP", + "KC_HOME", + "KC_WWW_FORWARD", + "USER03", + "KC_BSPC", + "KC_NLCK", + "KC_RGHT", + "KC_DOWN", + "KC_LEFT", + "KC_WWW_BACK", + "KC_NO", + "KC_TRNS", + "KC_CAPS", + "KC_MS_BTN2", + "KC_MS_BTN1", + "USER05", + "USER06", + "USER02", + "KC_SLCK", + "KC_TRNS", + "KC_WWW_REFRESH", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ] + ] +} \ No newline at end of file diff --git a/keyboards/solartempest/sofle/sofle VIA layout.json b/keyboards/solartempest/sofle/sofle VIA layout.json new file mode 100644 index 000000000000..12f50ce6f43a --- /dev/null +++ b/keyboards/solartempest/sofle/sofle VIA layout.json @@ -0,0 +1,367 @@ +{ + "name": "Solarius_Sofle", + "vendorProductId": 4231139975, + "macros": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], + "layers": [ + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_NO", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_VOLU", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "KC_F", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_VOLD", + "KC_MUTE", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "TT(3)", + "KC_ENT", + "KC_LALT", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "KC_0", + "USER04", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "KC_PGUP", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "KC_NO", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "KC_PGDN", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "TT(4)", + "KC_SPC", + "C(KC_W)", + "KC_N" + ], + [ + "KC_PSCR", + "KC_5", + "KC_1", + "KC_2", + "KC_3", + "KC_G", + "KC_SPC", + "KC_F12", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_TRNS", + "KC_ENT", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_NO", + "KC_LSFT", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_TRNS", + "KC_TRNS", + "KC_LALT", + "KC_B", + "KC_TRNS", + "KC_F22", + "KC_SPC", + "KC_NO", + "KC_F4", + "KC_F11", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F12", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_RALT", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "TO(0)", + "KC_RALT", + "KC_RCTL", + "MO(2)", + "KC_ENT", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_GRV", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "KC_NO", + "KC_ESC", + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_VOLU", + "KC_TAB", + "KC_A", + "KC_S", + "KC_D", + "KC_F", + "KC_G", + "KC_F", + "KC_LSFT", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "KC_VOLD", + "KC_MUTE", + "KC_LGUI", + "KC_LALT", + "KC_LCTL", + "TT(2)", + "KC_SPC", + "KC_LALT", + "KC_MINS", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "KC_0", + "USER04", + "KC_P", + "KC_O", + "KC_I", + "KC_U", + "KC_Y", + "KC_PGUP", + "KC_QUOT", + "KC_SCLN", + "KC_L", + "KC_K", + "KC_J", + "KC_H", + "KC_NO", + "KC_RSFT", + "KC_SLSH", + "KC_DOT", + "KC_COMM", + "KC_M", + "KC_N", + "KC_PGDN", + "TO(1)", + "KC_RALT", + "KC_RCTL", + "TT(3)", + "KC_ENT", + "C(KC_W)", + "KC_N" + ], + [ + "KC_GRV", + "KC_F1", + "KC_F2", + "KC_F3", + "KC_F4", + "KC_F5", + "KC_NO", + "KC_ESC", + "KC_1", + "KC_2", + "KC_3", + "KC_4", + "KC_5", + "C(KC_PPLS)", + "KC_TRNS", + "KC_EXLM", + "KC_AT", + "KC_HASH", + "KC_DLR", + "KC_PERC", + "KC_NO", + "KC_TRNS", + "KC_EQL", + "KC_MINS", + "KC_PLUS", + "KC_LCBR", + "KC_RCBR", + "C(KC_MINS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_F11", + "KC_F10", + "KC_F9", + "KC_F8", + "KC_F7", + "KC_F6", + "KC_NO", + "KC_F12", + "KC_0", + "KC_9", + "KC_8", + "KC_7", + "KC_6", + "C(S(KC_TAB))", + "KC_PIPE", + "KC_RPRN", + "KC_LPRN", + "KC_ASTR", + "KC_AMPR", + "KC_CIRC", + "KC_NO", + "KC_TRNS", + "KC_BSLS", + "KC_COLN", + "KC_DOT", + "KC_RBRC", + "KC_LBRC", + "C(KC_TAB)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_BSPC", + "KC_TRNS", + "C(KC_T)", + "KC_NO" + ], + [ + "KC_TRNS", + "C(KC_MINS)", + "C(KC_PPLS)", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_INS", + "KC_PSCR", + "KC_APP", + "C(KC_UP)", + "C(KC_DOWN)", + "USER00", + "KC_TRNS", + "KC_LALT", + "KC_LCTL", + "KC_LSFT", + "C(KC_LEFT)", + "C(KC_RGHT)", + "KC_NO", + "KC_TRNS", + "C(KC_Z)", + "C(KC_X)", + "C(KC_C)", + "C(KC_V)", + "KC_TRNS", + "USER01", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_MYCM", + "KC_TRNS", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_F14", + "KC_F13", + "KC_NO", + "KC_DEL", + "KC_INS", + "KC_END", + "KC_UP", + "KC_HOME", + "KC_WWW_FORWARD", + "USER03", + "KC_BSPC", + "KC_NLCK", + "KC_RGHT", + "KC_DOWN", + "KC_LEFT", + "KC_WWW_BACK", + "KC_NO", + "KC_TRNS", + "KC_SLCK", + "KC_PGDN", + "S(LWIN(SWIN(KC_S)))", + "KC_PGUP", + "KC_CAPS", + "USER02", + "KC_TRNS", + "KC_TRNS", + "KC_WWW_REFRESH", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ] + ] +} \ No newline at end of file diff --git a/keyboards/solartempest/sofle/sofle.c b/keyboards/solartempest/sofle/sofle.c new file mode 100644 index 000000000000..b51a7e8a0460 --- /dev/null +++ b/keyboards/solartempest/sofle/sofle.c @@ -0,0 +1,19 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +#include "sofle.h" diff --git a/keyboards/solartempest/sofle/sofle.h b/keyboards/solartempest/sofle/sofle.h new file mode 100644 index 000000000000..6e9b06cef09f --- /dev/null +++ b/keyboards/solartempest/sofle/sofle.h @@ -0,0 +1,42 @@ +/* Copyright + * 2021 solartempest + * 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "quantum.h" + +// Extra keys are added for rotary encoder support in VIA +#define LAYOUT( \ + LA1, LA2, LA3, LA4, LA5, LA6, RA6, RA5, RA4, RA3, RA2, RA1, \ + LB1, LB2, LB3, LB4, LB5, LB6, LB7, RB7, RB6, RB5, RB4, RB3, RB2, RB1, \ + LC1, LC2, LC3, LC4, LC5, LC6, LE1, RE6, RC6, RC5, RC4, RC3, RC2, RC1, \ + LD1, LD2, LD3, LD4, LD5, LD6, LD7, RD7, RD6, RD5, RD4, RD3, RD2, RD1, \ + LE2, LE3, LE4, LE5, LE6, RE5, RE4, RE3, RE2, RE1 \ + ) \ + { \ + { LA1, LA2, LA3, LA4, LA5, LA6, KC_NO }, \ + { LB1, LB2, LB3, LB4, LB5, LB6, LB7 }, \ + { LC1, LC2, LC3, LC4, LC5, LC6, KC_NO }, \ + { LD1, LD2, LD3, LD4, LD5, LD6, LD7 }, \ + { LE1, LE2, LE3, LE4, LE5, LE6, KC_NO }, \ + { RA1, RA2, RA3, RA4, RA5, RA6, KC_NO }, \ + { RB1, RB2, RB3, RB4, RB5, RB6, RB7 }, \ + { RC1, RC2, RC3, RC4, RC5, RC6, KC_NO }, \ + { RD1, RD2, RD3, RD4, RD5, RD6, RD7 }, \ + { RE1, RE2, RE3, RE4, RE5, RE6, KC_NO } \ + } diff --git a/keyboards/solartempest/sofle/solartempest_sofle_via.hex b/keyboards/solartempest/sofle/solartempest_sofle_via.hex new file mode 100644 index 000000000000..c751a30efc73 --- /dev/null +++ b/keyboards/solartempest/sofle/solartempest_sofle_via.hex @@ -0,0 +1,1693 @@ +:100000000C9418060C945F060C945F060C94AE30AA +:100010000C945F060C945F060C945F060C945F06CC +:100020000C945F060C945F060C94B3190C946F1932 +:100030000C94BB260C945F060C945F060C945F0630 +:100040000C945F060C945F060C945F060C945F069C +:100050000C945F060C948C1A0C945F060C945F064B +:100060000C945F060C945F060C945F060C945F067C +:100070000C945F060C945F060C945F060C945F066C +:100080000C945F060C945F060C945F060C945F065C +:100090000C945F060C945F060C945F060C945F064C +:1000A0000C945F060C945F060C945F060501090230 +:1000B000A10185020901A1000509190129081500FE +:1000C0002501950875018102050109300931158165 +:1000D000257F95027508810609381581257F9501D0 +:1000E00075088106050C0A38021581257F95017572 +:1000F000088106C0C005010980A101850319012AF4 +:10010000B700150126B700950175108100C0050CD8 +:100110000901A101850419012AA002150126A002E6 +:10012000950175108100C00660FF0961A101096297 +:10013000150026FF00952075088102096315002629 +:10014000FF00952075089102C005010906A101056F +:100150000719E029E7150025019508750181029529 +:1001600001750881010507190029FF150026FF0008 +:100170009506750881000508190129059505750181 +:100180009102950175039101C0000000000000007C +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000007E0F00C2 +:1001B000D4FFFFFFC700000078000000000000002F +:1001C000002A2B28000000000000000000000000B2 +:1001D0000000000029000000002C1E3420212224F1 +:1001E000342627252E362D3738271E1F202122237F +:1001F0002425263333362E37381F04050607080911 +:100200000A0B0C0D0E0F10111213141516171819D6 +:100210001A1B1C1D2F3130232D3504050607080934 +:100220000A0B0C0D0E0F10111213141516171819B6 +:100230001A1B1C1D2F3130354C00DA02815AD9F1BE +:10024000DB20A4A62EAF00A0C000A1C800AED580C0 +:10025000A81FD300408D1420000000000000000003 +:10026000000000E0F0F0F8F8CCCCF8F8F0F0600016 +:10027000000000000000000000000000000000007E +:100280000000000F3F7FFCF9F1E1C1810000000098 +:1002900000000000000000000000000000000C381A +:1002A0007060E0E0F0F0F8F9FFFFFFFFFF7E1C0058 +:1002B000000000000000000000000000000000003E +:1002C000000000E0F0F0F8F8CCCCF8F8F0F06000B6 +:1002D000000000000000000000000000000000001E +:1002E0000000000F3F7FFCF9F1E1C1810000010136 +:1002F00002060C04000000000000000000000038AE +:100300007C60E0E0F0F0F8F9FFFFFFFFFF7E1C00EB +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:10033000000000000000000000000000CCF8700089 +:100340000000000000C0F0F8F87CFCEEE6FCFC7851 +:1003500078B00000000000000000003F7FF1F8F8D6 +:100360007C7CF8F0F0F1E7EFEFFEFEFEFCFCF8F02D +:100370006000010306020000000000000000000011 +:10038000000000000000000000000000000000006D +:10039000000000000000000000000080E0F81C00E9 +:1003A0000000000000C0F0F8F87CFCEEE6FCFC78F1 +:1003B00078300000000000000000003F7FF0F8F8F7 +:1003C0007C7CF8F0F0F1E7EFEFFEFEFEFCFCF8F0CD +:1003D000600000000000000000000000000080C07D +:1003E000C0E0E03070E0E0C0C0800000000000002D +:1003F000000000000000000000000000001F7FFF60 +:10040000FFE7E7EFEFCFCB838301000000000000A0 +:100410000000000000000000000000061C3878F119 +:10042000E3E3E7F7F7FFFFFFFF7F3E000000000078 +:1004300000000000000000000000000000000000BC +:10044000000000000000000000000080C0E0E0604C +:10045000E0C0C0808000000000000000000000003C +:10046000000020F8FEFFFFFF9F0F0E1F1F3F3F7E83 +:10047000E683030F43439088080000031E3C78F096 +:10048000E0E0F0F0FBFFFFFF7F7F3800000000009E +:10049000000000000000000000000004F6B8F8D8DA +:1004A000F0E0C000000080C0E0E0F0F0F0F0E0E03C +:1004B000C080000000000000000080C0E1F3FB7F6E +:1004C0001F0F0000F0FFFF3F030100000080C1F399 +:1004D000FF7F1F000080C0E0301E3F3F7FF9F0F03B +:1004E00070783C3F1F0F03000000001C3F7F7FFB24 +:1004F000F1F0783C1E0F0300000001010101010131 +:1005000001010102020202020202020203030303CA +:10051000030303030404040404040405050505059A +:100520000606060606070707070708080808090958 +:1005300009090A0A0A0B0B0B0C0C0C0D0D0D0E0E03 +:100540000E0F0F0F10101111111212131314141596 +:100550001516161717181819191A1A1B1B1C1D1D0A +:100560001E1E1F2020212222232424252626272860 +:1005700029292A2B2C2D2D2E2F3031323233343590 +:10058000363738393A3B3C3D3E3F40414243444593 +:10059000464748494A4C4D4E4F5051535455565872 +:1005A000595A5B5D5E5F616264656668696B6C6D1C +:1005B0006F7072737577787A7B7D7E808283858792 +:1005C000888A8C8E8F91939596989A9C9EA0A2A3D0 +:1005D000A5A7A9ABADAFB1B3B5B7BABCBEC0C2C4D5 +:1005E000C6C9CBCDCFD1D4D6D8DBDDDFE2E4E7E995 +:1005F000EBEEF0F3F5F8FAFDFFFFAA7F55401C1073 +:1006000004010D190A24232221201F1E1D1B1A1864 +:10061000171615141312110F0E0C0B0908070605F7 +:100620000302002D3945483C303F25262728292A3A +:100630002B2C2E2F31323334353637383A3B3D3E72 +:10064000404142434446474907087F0807003E5B54 +:100650004F5B3E003E6B4F6B3E001C3E7C3E1C00E1 +:10066000183C7E3C18001C577D571C001C5E7F5EAA +:100670001C0000183C180000FFE7C3E7FF0000184B +:1006800024180000FFE7DBE7FF0030483A060E00C1 +:10069000262979292600407F05050700407F05258A +:1006A0003F005A3CE73C5A007F3E1C1C0800081CD7 +:1006B0001C3E7F0014227F2214005F5F005F5F00FA +:1006C00006097F017F00006689956A0060606060AE +:1006D000600094A2FFA2940008047E040800102089 +:1006E0007E20100008082A1C0800081C2A080800A0 +:1006F0001E10101010000C1E0C1E0C0030383E385E +:100700003000060E3E0E0600000000000000000053 +:100710005F000000000700070000147F147F140032 +:10072000242A7F2A120023130864620036495620C7 +:100730005000000807030000001C22410000004197 +:10074000221C00002A1C7F1C2A0008083E08080002 +:100750000080703000000808080808000000606091 +:1007600000002010080402003E5149453E000042AE +:100770007F4000007249494946002141494D3300FC +:100780001814127F10002745454539003C4A494955 +:1007900031004121110907003649494936004649CF +:1007A00049291E0000001400000000403400000031 +:1007B00000081422410014141414140000412214DF +:1007C00008000201590906003E415D594E007C12A5 +:1007D00011127C007F49494936003E4141412200C7 +:1007E0007F4141413E007F49494941007F09090954 +:1007F00001003E41415173007F0808087F0000411D +:100800007F4100002040413F01007F081422410049 +:100810007F40404040007F021C027F007F040810A0 +:100820007F003E4141413E007F09090906003E41EB +:1008300051215E007F0919294600264949493200A5 +:1008400003017F0103003F4040403F001F20402044 +:100850001F003F4038403F00631408146300030446 +:10086000780403006159494D4300007F4141410034 +:10087000020408102000004141417F0004020102EF +:10088000040040404040400000030708000020549E +:10089000547840007F2844443800384444442800B9 +:1008A000384444287F0038545454180000087E0906 +:1008B000020018A4A49C78007F0804047800004477 +:1008C0007D4000002040403D00007F102844000093 +:1008D00000417F4000007C04780478007C08040418 +:1008E0007800384444443800FC18242418001824A4 +:1008F0002418FC007C0804040800485454542400C4 +:1009000004043F4424003C4040207C001C20402044 +:100910001C003C4030403C004428102844004C90CF +:1009200090907C004464544C440000083641000020 +:1009300000007700000000413608000002010204B8 +:1009400002003C2623263C0000000000000040403E +:1009500040F0F8F8FF38FFF8F83FF8F8FF38FFF8F4 +:10096000F8F040404000000000000080C0C0C0809F +:100970000000C0C08000000080C0C000C0C00000F7 +:1009800080C0C00000000000C0C0C0C0C000C0C027 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C00000000000000000C0F0F8FC3E1E06010020 +:1009D00000007F4141417F007F4141417F00008015 +:1009E000C0E07E5B4F5BFEC00000C000DCD7DEDEF7 +:1009F000DED7DC00C00000000000000000000000A6 +:100A00000000000000000000000000000000494954 +:100A100049FFFFFFFFE0DFBFBF00BFBFDFE0FFFF19 +:100A2000FFFF49494900000000001F3F6060E0BF30 +:100A30001F007F7F071E381E077F7F007F7F0E1FEE +:100A40003B716000000000007F7F0C0C0C007E7E7C +:100A5000007F7E0303007F7E03037E7E03037F7E91 +:100A6000000F3E703C063C703E0F00327B49493F10 +:100A70007E007F7E0303001E3F69696F2600000031 +:100A800000000000000000030F1F3F3C7870600072 +:100A900000007F4141417F007F4141417F00307B29 +:100AA0007F7830202030787F3B0003000F7F0F0FCE +:100AB0000F7F0F0003000000000000000000000096 +:100AC0000000000000000000000000000000010124 +:100AD00001070F0F7F0F7F0F0F7E0F0F7F0F7F0F0D +:100AE0000F070101010000000000000000000001EC +:100AF00001000000000000000000000000000000F5 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B8000000000000000000000AF00AE09025B00A2 +:100B9000030100A0FA09040000010301010009217A +:100BA000110100012240000705810308000A090421 +:100BB00001000203000000092111010001222200AE +:100BC0000705820320000107050303200001090433 +:100BD00002000103000000092111010001227B0035 +:100BE0000705840320000A120100020000000832F9 +:100BF000FC87120200010200011E0353006F006C0B +:100C000000610072006900750073005F0053006F9F +:100C10000066006C006500000010034B0065007961 +:100C20000068006900760065000000040309040004 +:100C300011241FBECFEFDAE0DEBFCDBF04B603FE46 +:100C400027C080916C0690916D06A0916E06B091C0 +:100C50006F068730904BA740B04BD1F410926C06D2 +:100C600010926D0610926E0610926F0614BE84B735 +:100C7000877F84BF0FB6F894A89580916000886143 +:100C800080936000109260000FBEE0E0F8E30995E9 +:100C900012E0A0E0B1E0E4E7F8E602C005900D92B2 +:100CA000A233B107D9F726E0A2E3B2E001C01D925A +:100CB000AC36B207E1F70E94E2260C9401340C94A2 +:100CC0000000CF93DF9340916A0650916B064A561D +:100CD00054409A01205A3F4F21303240C0F020E06A +:100CE00032E0241B350B6091680470916904FC01AB +:100CF000CA01240F351FC1E0D0E08217930750F0DE +:100D00007093690460936804DF91CF91089520E6A1 +:100D100030E0E9CF4491DC01A659BB4F5C91451707 +:100D200081F04C93AC01A5E056954795AA95E1F763 +:100D3000DE0102C0AA0FBB1F4A95E2F7AD016A2B84 +:100D4000752B01963196D9CFE8EDF0E080818E7F4A +:100D500080831092E2001092DA001092E100A0EE7F +:100D6000B0E08C9181608C9380818F77808319BCF7 +:100D7000A7EDB0E08C918E7F8C9380818F7E8083F5 +:100D800010926C0308952091E4003091E50095E6FF +:100D9000A9012091EC00822F817020FF06C0809174 +:100DA000E80080FF06C080E008952091E80022FD61 +:100DB0001AC080917A03882389F0853089F0809168 +:100DC000EB0085FD0FC02091E4003091E500421753 +:100DD0005307F9F29150E1F684E0089582E0089516 +:100DE00083E0089581E00895EF92FF920F931F939F +:100DF000CF937C018B010E94C306C82F811117C0BD +:100E00008091E80085FD0BC08091E8008E7780938B +:100E1000E8000E94C306882399F3C82F08C0F70191 +:100E200081917F018093F1000150110949F78C2FC6 +:100E3000CF911F910F91FF90EF90089580917C03C7 +:100E400087FF13C08091E80082FF06C08091E80010 +:100E50008B778093E80004C080917A038111F2CFF0 +:100E6000089580917A038823D9F38091E80080FF68 +:100E7000F8CF8091E8008E77ECCF982F9093E9001F +:100E8000242F762F50E0891731F07091EC002091DB +:100E9000ED005091F00021FD07C09F5F973071F782 +:100EA0008093E90081E008953091EB003E7F30931C +:100EB000EB003091ED003D7F3093ED003091EB0081 +:100EC00031603093EB007093EC002093ED00509371 +:100ED000F0002091EE0027FDE0CF80E00895CF9252 +:100EE000DF92EF92FF920F931F93CF93DF93C8EDA2 +:100EF000D0E088818F7E8883E7EDF0E0808181609B +:100F0000808384E082BF81E080936C0388818E7F40 +:100F1000888302EE10E0F80110821092DA0081EE70 +:100F2000C82ED12CF601108288818F778883888122 +:100F30008068888388818F7D888319BC10927A03AA +:100F400010927B03109279031092780390EEE92EB1 +:100F5000F12CF70180818B7F808388818160888379 +:100F600042E060E080E00E943D07F60180818E7FD4 +:100F70008083F801808181608083808188608083A4 +:100F8000F70180818E7F8083888180618883DF91F3 +:100F9000CF911F910F91FF90EF90DF90CF90089528 +:100FA000FC01809182039091830386179707A0F03C +:100FB0006115710529F49091E8009E779093E800FF +:100FC00090E06115710551F4911108C08091E8001D +:100FD00082FF34C080E00895BC01F2CF80917A0393 +:100FE0008823C1F18530C1F18091E80083FD30C0D4 +:100FF0008091E80082FDEACF8091E80080FFE1CF98 +:101000008091F3002091F200382F6115710519F0DD +:101010002830310558F091E02830310509F090E092 +:101020002091E8002E772093E800CBCF8191809328 +:10103000F100615071092F5F3F4FE7CF80917A0334 +:10104000882341F0853041F08091E80083FFBECFD6 +:1010500081E0089582E0089583E0089508958091E5 +:101060006F030895CF92DF92EF92FF922FB7F8941B +:10107000C0906503D0906603E0906703F09068032A +:101080002FBFA7019601261B370B480B590BCA012E +:10109000B901FF90EF90DF90CF9008952FB7F894AB +:1010A0006091650370916603809167039091680376 +:1010B0002FBF0895209162033091630328173907E9 +:1010C00071F09093630380936203E0916003F09169 +:1010D0006103309721F00084F185E02D0994089593 +:1010E00020915E0330915F032817390771F09093C8 +:1010F0005F0380935E03E0916003F091610330979A +:1011000021F00680F781E02D099408952091510384 +:1011100036E0839FC0011124629F800D911D112430 +:10112000811522E0920714F090E080E086599B4FF1 +:1011300090936B0680936A060895FC01680F791FEF +:101140008FEF91E32191822728E030E087FF09C0EB +:10115000880F892721503109C9F7E617F70791F75A +:101160000895880FF7CFFA01811101C0FB0109949E +:1011700080916304982F9E7F61F4817082608093D8 +:10118000630480916604813A18F080EA80936604D3 +:1011900008958831B0F381708661F1CFAF92BF922C +:1011A000DF92EF92FF920F931F93CF93DF93082F5D +:1011B000162FE901E42FF0E0E750FB4F611110C05A +:1011C000E4915E2F4E2F4983E8835A83DF91CF91BC +:1011D0001F910F91FF90EF90DF90BF90AF90089517 +:1011E000E62EF12C4491D42EE42FF0E026E0829FED +:1011F000C00111242FEF30E0B9010E942832802F66 +:1012000090E0880F991F55E5569FD001579FB00D6C +:1012100011248A1B9B0B982F990F890F5901AE1827 +:10122000BF08AE9ED001AF9EB00DBE9EB00D112482 +:101230005B2F189F80011124012F11275901A01A3B +:10124000B10AAE9E8001AF9E100DBE9E100D1124FE +:101250005901A81AB108AE9CC001AF9C900DBE9C6C +:10126000900D1124892F9927281B390B2E9FC0011F +:101270002F9F900D3E9F900D1124E92F6230710534 +:10128000A1F050F46115710509F49DCF613071052D +:1012900081F0EB2F512F97CF6430710569F080F00A +:1012A0006630710509F48FCFF4CFE42F4B2F592FFF +:1012B0008ACFE42F412F87CFEB2F542F492F83CF95 +:1012C0004B2F5D2DE12F7FCF80E008957894089516 +:1012D000F894E82FE295EF70F0E031A1282F2F70FD +:1012E00081E090E001C0880F2A95EAF7982F909549 +:1012F000932391A392A1892B82A30C9466099091C8 +:10130000DB0292FF06C0282F28712830F9F4877F6E +:10131000846093FF06C0282F28712831F1F4877E5E +:1013200084612091DC0220FF06C0382F38713830EC +:10133000D9F4877F816021FF06C0282F28712831CA +:10134000D1F4877E816194FD877E0895282F2471D2 +:101350002430F9F68B7F8860DCCF282F247124316C +:1013600001F78B7E8861DDCF382F3171313019F76D +:101370008E7F8860E0CF282F2171213121F78E7E6A +:101380008861E1CFCF93DF93EC018238910581F141 +:10139000B0F58133910509F491C020F589329105AA +:1013A00009F485C08A9709F490C0C11521E5D207D8 +:1013B00008F0AAC0C11530E5D30708F0F2C0CF3B52 +:1013C000D10508F089C0C83AD10508F0DFC0C53A98 +:1013D000D10508F0D3C0C430D105F8F4C130D1052F +:1013E000E1F040C08533910509F45AC0C997E9F688 +:1013F0008091DB02837089F0C0EED0E00EC0833EA6 +:10140000910599F170F4803E910501F1823E9105BC +:1014100061F68091DB0282FD21C0CE01DF91CF9188 +:101420000895863E910561F1873E910571F1843EF4 +:10143000910509F0BACF8091DC0281FFEECF809157 +:10144000DB02C7EED0E084FD0DC0E7CF8091DB0268 +:1014500080FDF7C09091DC0290FFDFCFC3EED0E0BB +:1014600084FFDBCFD0E0C0E0D8CF8091DB0282FDEB +:10147000EBC09091DC0290FDBFCF84FFCECFF2CFC6 +:101480008091DB0283FDDDCFC8CF8091DB0283FD3D +:10149000DEC09091DC0291FFF0CFC4EED0E0BDCF72 +:1014A0008091DB0285FFB9CFC9E2D0E0B6CF809151 +:1014B000DB0285FFB2CFC5E3D0E0AFCF8091DB0286 +:1014C00086FFABCFCAE2D0E0A8CF8091DB0286FFD7 +:1014D000A4CFC1E3D0E0A1CFC11540E2D40760F4AE +:1014E000C11581E0D80708F098CFCE01815E91093F +:1014F000079708F492CFB6CFC11590E4D90708F446 +:10150000B1CFDF70D06A89CFC11524E5D20778F456 +:10151000C11533E5D30708F072C0C11542E5D40701 +:1015200008F05CC0DC2FCC27C16FD06A76CFC11524 +:101530008AE5D80778F4C11599E5D90708F073C092 +:10154000C11528E5D20708F48DCFDC2FCC27C06F5A +:10155000D06A63CFCE0190568115904208F082CFB9 +:101560008D2F8F710E947F0990E0982F8827882700 +:101570009F719C012C2BE901D0624FCFC55AD0E05E +:10158000CD53DE4FC881D0E0D06447CFC85AD0E0F9 +:10159000CC0FDD1FCA53DE4F0990D881C02DD46413 +:1015A0003CCFCE0164E0969587956A95E1F783700C +:1015B0002C2F26952695237040E2249F900111241C +:1015C000382B8C2F8370C1E0D0E002C0CC0FDD1F20 +:1015D0008A95E2F7C22BD32BDC681FCFCE01837034 +:1015E000992721E030E002C0220F331F8A95E2F7ED +:1015F000C695C69580E2C89FE0011124EBCFCE01CD +:101600008370992721E030E002C0220F331F8A95B2 +:10161000E2F7C695C69590E2C99FE0011124C22B5E +:10162000D32BDA68FACE8C2F8F700E947F0934E0BA +:10163000D695C7953A95E1F7CF709C2FEC01D0690C +:10164000ECCEC9E3D0E0E9CEC2EED0E0E6CEC6EE05 +:10165000D0E0E3CE0C944E0880916D0390919702F8 +:10166000892B90919602892B80933402E09160033C +:10167000F0916103309731F00280F381E02D84E333 +:1016800092E00994089580919502909164029813D4 +:1016900001C008958F5F8770FACF27E0929F800D79 +:1016A0001124982F977086958695869523E0829FC2 +:1016B000F0011124ED5BFD4F50E040E080E021910E +:1016C00030E0092E02C0369527950A94E2F7217082 +:1016D0003327042E01C0220F0A94EAF7822B4F5FB2 +:1016E0005F4F4330510559F7089527E0929F800DD1 +:1016F0001124982F977041E001C0440F9A95EAF7A2 +:1017000086958695869593E0899FF0011124ED5B7F +:10171000FD4F90E080E070E05191DF0111979B0157 +:10172000082E02C0369527950A94E2F7217021957C +:101730002527242325272C9301968330910561F7D3 +:10174000089590E080E00E94700890E080E00E94A0 +:101750005A0810929702109296020C942C0B8093C8 +:1017600098020C94A10B882341F0809590916D0311 +:10177000892380936D030C942C0B0895882339F0F2 +:1017800090916D03982B90936D030C942C0B0895FE +:101790008823B1F19CEF980F913A70F4E6E3F2E000 +:1017A0009191891303C0DF0111971C9242E0EC3341 +:1017B000F407B1F70C942C0B90E2980F983088F452 +:1017C000877021E030E0A90102C0440F551F8A95BF +:1017D000E2F7CA01809590916D03892380936D0390 +:1017E000E9CF9BE5980F933020F490E080E00C94D3 +:1017F0007008885A873120F490E080E00C945A08F1 +:1018000008950F931F93CF93C82F882309F469C0BD +:101810008CEF8C0F813AB0F506E312E08CE392E096 +:10182000F8012191C21701F122E0EC33F207C9F768 +:10183000EFEF80E0D8019D918D01C91781F0EF3F56 +:1018400019F4911101C0E82F8F5F863099F7EF3FAF +:1018500031F00E2E000CFF0BEC5CFD4FC283CF91DC +:101860001F910F910C942C0BE6E3F2E02191C2132F +:1018700003C0DF0111971C928E179F07B9F70E94D2 +:101880002C0BD6CF80E28C0F883068F4C77021E033 +:1018900030E001C0220FCA95EAF780916D03822BD8 +:1018A00080936D03DCCFEBE5EC0FE33050F4F0E018 +:1018B000ED53FE4F808190E0CF911F910F910C94DA +:1018C0007008C85AC73168F4EC2FF0E0EE0FFF1F24 +:1018D000EA53FE4F80819181CF911F910F910C941B +:1018E0005A08CF911F910F910895982F92959F704C +:1018F00011F0892F94E0282F2695269511F09E5FF0 +:10190000822F869509F09F5F892F0895CF93DF93EB +:10191000CDB7DEB762970FB6F894DEBF0FBECDBF6E +:1019200096E0EFE3F3E0DE01179601900D929A95B1 +:10193000E1F796E0FE013796DE011D9601900D92CB +:101940009A95E1F798858823E9F0962B9E8786E0A3 +:10195000FE013D96DE01119601900D928A95E1F708 +:1019600086E0FE013196AFE3B3E001900D928A95D7 +:10197000E1F762960FB6F894DEBF0FBECDBFDF91E0 +:10198000CF91089560959623E1CF8093690370937A +:101990006B0360936A0380917A038430F9F4809337 +:1019A000E9008FEF9091E800815095FD06C095ED1C +:1019B0009A95F1F700008111F5CF8091E80085FF3D +:1019C0000DC050E040E063E070E089E693E00E94E3 +:1019D000F4068091E8008E778093E8000895BC01BA +:1019E00084E00C94C50CBC0183E00C94C50C9C01F4 +:1019F00084E08093E9009FEF8091E800915085FD9D +:101A000006C085ED8A95F1F700009111F5CF809120 +:101A1000E80085FF0CC050E040E066E070E0C901DE +:101A20000E94F4068091E8008E778093E800089584 +:101A3000CF93DF93EC0181E08093E9008FEF9091E9 +:101A4000E800815095FD06C095ED9A95F1F70000EC +:101A50008111F5CF8091E80085FF14C050E040E08F +:101A600068E070E0CE010E94F4068091E8008E7775 +:101A70008093E80088E0FE01A0E7B3E001900D92BA +:101A80008A95E1F7DF91CF910895CF92DF92EF929F +:101A90000F931F93CF93DF93CDB7DEB7CE5DD10900 +:101AA0000FB6F894DEBF0FBECDBF60917401809178 +:101AB000630480FF4CC0EEEFF5E09E012F5F3F4FC7 +:101AC0008E0101521F4FC901A4914A2F50E0DA0143 +:101AD000AA0FBB1FA40FB51FAB57BC4FCD90DD9015 +:101AE000EC90D901CD92DD92ED929D013196A01737 +:101AF000B10751F72091730143E0249F800D911DA0 +:101B00001124539A2BB1277F3BB138605FB7F8940B +:101B1000FC01649FE00DF11D1124BF01861797079A +:101B200049F55FBFEFE5F4E03197F1F700C0000041 +:101B3000C252DF4F0FB6F894DEBF0FBECDBFDF91AC +:101B4000CF911F910F91EF90DF90CF9008958091EA +:101B500075019091760123E0829FF0011124EB57EB +:101B6000FC4F891708F0A7CF1182108212828F5F75 +:101B70003396F7CFDC014D91CD01E8E03BB9000091 +:101B800000C047FF2BB9440F000000C000C000C0D8 +:101B90002BB900C0EA9591F7C1CF0F931F93CF9354 +:101BA000DF9300D00F92CDB7DEB7182F062F8091AC +:101BB000630480FF22C09E012F5F3F4F40EA64E62E +:101BC0008BE20E94CE081017C0F48B8199812A8184 +:101BD00033E0139FF0011124EB57FC4F21839083D6 +:101BE00082831F5F33960113F9CF0E94450D8FE961 +:101BF0009FE00197F1F700C000000F900F900F9049 +:101C0000DF91CF911F910F910895CF93DF93C82F4C +:101C1000D82FD17081FF04C067E084E00E94CD0D11 +:101C2000D11104C06FE18CE10E94CD0DC2FF06C04E +:101C300063E180E1DF91CF910C94CD0DDF91CF91E5 +:101C40000895E3E6F4E080818E7F8083EEE4F3E0A4 +:101C50008281816082832FEF80E792E02150804073 +:101C60009040E1F700C000000C94450D9F92AF92A8 +:101C7000BF92CF92DF92EF92FF920F931F93CF9379 +:101C8000DF937C015B016A018091D60201E010E0E4 +:101C90008A3010F40AE010E0C1E0D0E0F894B50119 +:101CA000C701F6010995982E0E946609911004C09B +:101CB00021960C171D076CF4892DDF91CF911F9190 +:101CC0000F91FF90EF90DF90CF90BF90AF909F90DB +:101CD0000895CC9F9001CD9F300D300D112490E0E0 +:101CE00080E045E34A95F1F70000019682179307DB +:101CF000C1F7D4CF8091A702811110C08091D80084 +:101D000080618093D8008AE18A95F1F700C08091C4 +:101D1000D90080FF0AC081E08093A70281E0909102 +:101D2000A702913009F080E0089582E08093A70235 +:101D30000E94A40610927A03F1CF0E947A0E8823A3 +:101D400051F0E0916003F0916103309721F0019030 +:101D5000F081E02D099480E008951F93CF93DF93E5 +:101D6000182FEB010E94010C8FE99FE00197F1F71A +:101D700000C000002197C1F7812FDF91CF911F9103 +:101D80000C94C80B0F931F93CF93DF9300D000D018 +:101D9000CDB7DEB789836A834B831C8204E610E0EB +:101DA00024E030E0AE014F5F5F4F60E084E10E94CD +:101DB000862F0F900F900F900F90DF91CF911F9172 +:101DC0000F91089580917001882329F047E669E911 +:101DD0008BE20C94C20E80913D0247EC6BE18823AC +:101DE000C1F341E265EA89EDF4CFCF92DF92EF9241 +:101DF000FF920F931F93CF93DF936C017B0164E6F7 +:101E000070E088E70E946E2EEC0197FD12C010E092 +:101E100000E0F601E00FF11F849164E670E00E949B +:101E2000E82EEC01892B29F40F5F1F4F0E151F05BB +:101E300081F70E940230CE01DF91CF911F910F9167 +:101E4000FF90EF90DF90CF90089580915C03909188 +:101E50005D03911103C091E089270895882369F0FB +:101E600062E070E08AE89BE00E94F50E892B19F091 +:101E700080915C03089510925C0380915C03EBCF2A +:101E8000CF93C0915C0380915D038823D1F00E94C1 +:101E90004E086058774C8E4F9F4F60935803709355 +:101EA000590380935A0390935B03C11108C062E009 +:101EB00070E088E89BE00E94F50E892B29F0C09124 +:101EC0005C038C2FCF91089581E080935C03F7CF62 +:101ED000CF93DF93C3EED2E060E0CE010E949C324C +:101EE0002196C11584E0D807B9F7DF91CF91089505 +:101EF0006F927F928F929F92AF92BF92CF92DF921A +:101F0000EF92FF920F931F93CF93DF938CE8C82E2D +:101F10008BE0D82E91ECE92EF12CE701CC58D109B9 +:101F200036011BC0F50185909490692DC8010E946F +:101F30009C32682DC80101960E949C3282E0A80E56 +:101F4000B11C0E5F1F4FC017D10761F78EE0680EFE +:101F5000711C2E96CE15DF0529F08E010E50110949 +:101F60005301E0CF7E018CE8E80EF11C8CE8C80E2E +:101F7000D11C8DE7E81683E0F80679F6DF91CF9162 +:101F80001F910F91FF90EF90DF90CF90BF90AF9097 +:101F90009F908F907F906F900895CF93C82F6FEF91 +:101FA000811162E283E290E00E949C326FEFC111E6 +:101FB00064E084E290E00E949C326FEFC11163E123 +:101FC00085E290E0CF910C949C3280E00E94CD0F8E +:101FD00060E086E290E00E949C320E94780F0E94AE +:101FE000680F81E00C94CD0F0F931F93CF93DF9375 +:101FF000C42FD0E0CC0FDD1F2EE0629FC00DD11D9D +:1020000011243CE8839FC00DD11D1124CE01879679 +:102010000E948832082F10E0102F0027CE018896EA +:102020000E9488329801282BC901DF91CF911F911E +:102030000F910895462F853038F47A3028F46730B0 +:1020400018F4672F0C94F40F90E080E00895CF927D +:10205000DF92FF920F931F93CF93DF936C01009158 +:10206000840380919802082BC7E0D0E010E0FC2E9A +:10207000C8010C2E02C0959587950A94E2F780FD61 +:102080000CC02197A0F7F12C8F2DDF91CF911F91DC +:102090000F91FF90DF90CF900895B6018C2F0E9492 +:1020A0001A100E94C209019761F3EECFCF93DF931C +:1020B000EC010E942710BE010E941A10DF91CF91FF +:1020C0000C94C209FC01808191810E945610292F35 +:1020D0002F7092959F7092509E3078F4E92FF0E027 +:1020E000ED5FFB4C0C945C32803F19F020F4883E8D +:1020F00020F481E00895843FE1F380E00895883E74 +:10210000C0F3813FD1F7F5CF822F869586958695CE +:10211000089583E290E00E948832823289F484E25A +:1021200090E00E948832843059F485E290E00E9469 +:10213000883291E0833109F090E0892F8170089511 +:1021400080E0FCCF1F93CF93DF93CDB7DEB76897C6 +:102150000FB6F894DEBF0FBECDBF40913F03509144 +:102160004003609141037091420380914303909139 +:1021700044030E94CB1A20933F03309340036093A3 +:10218000430370934403642F152F1195109341035B +:102190004093420386E0EFE3F3E0DE0117960190FF +:1021A0000D928A95E1F786E0FE013796DE011196E1 +:1021B00001900D928A95E1F79B858C8520917001A5 +:1021C0002223B1F0772761950CF47095072E000C4F +:1021D000880B990B0E9408332AE939E949E95EE343 +:1021E0000E946C330E94D032962F812F60E010E065 +:1021F0001B836C839D838E8386E0FE013196DE0116 +:102200001D9601900D928A95E1F786E0FE013D96BC +:10221000DE01539601900D928A95E1F786E0FE016A +:102220007396DE01119601900D928A95E1F786E092 +:10223000FE013196AFE3B3E001900D928A95E1F78C +:1022400086E0EFE3F3E0DE01179601900D928A95A8 +:10225000E1F786E0E9E3F3E0DE01119601900D92EB +:102260008A95E1F746E050E0BE016F5F7F4FCE01F7 +:1022700007960E947232892B79F0E0916003F09109 +:102280006103309749F082E080933F030480F58139 +:10229000E02D8FE393E009951092410310924203E1 +:1022A000109243031092440386E0EFE3F3E0A9E3C6 +:1022B000B3E001900D928A95E1F768960FB6F89415 +:1022C000DEBF0FBECDBFDF91CF911F910895E6E332 +:1022D000F2E086E0DF011D928A95E9F70C94A10BEC +:1022E0001F93CF93DF93CDB7DEB7AA970FB6F894BD +:1022F000DEBF0FBECDBF8CE793E02091F100DC0183 +:102300002D93CD01B3E084389B07B9F780917D030D +:10231000833009F472C0B8F4813009F449C08230C6 +:1023200009F4B5C08091E80083FF8DC280917C03E1 +:1023300090917D039A3008F086C2E92FF0E0EF5EBD +:10234000FB4C0C945C328A3009F490C08B3009F459 +:1023500071C0893039F780917C03813219F78091FF +:10236000800390918103009711F00297D9F6809134 +:10237000E800877F8093E8008091E80082FF38C002 +:102380009091F3008091F200029731F48091F10076 +:10239000813011F0863021F48091F10080936F0339 +:1023A0008091E8008B778093E8000E941E07BACFE7 +:1023B00080917C03813A09F0B5CF8091E800877F56 +:1023C0008093E8008091800390918103892B61F4D0 +:1023D00068E080E793E070E00E94D0078091E80019 +:1023E0008B778093E8009ECF60E090E080E0F3CFB1 +:1023F00080917A038111C0CF95CF80917C03813A7F +:1024000009F090CF8091800390918103892B09F08E +:1024100089CF8091E800877F8093E8008091E80071 +:1024200080FFFCCF809178018093F1008091E800DB +:102430008E77B9CF80917C03813209F073CF809180 +:10244000800390918103892B09F06CCF8091E80083 +:10245000877F8093E8000E941E0780917E0380930F +:10246000780110926D030E9467115CCF80917C030C +:10247000813209F057CF8091E800877F8093E80090 +:102480000E941E0780917F0380936E034BCF809143 +:102490007C03813A09F046CF8091E800877F8093E2 +:1024A000E8008091E80080FFFCCF80916E03BCCFF4 +:1024B000803899F0823809F0C6C1809180038F700E +:1024C000873008F0C0C18093E9008091EB0085FB64 +:1024D000882780F91092E90006C0809178039091D6 +:1024E0007903911182609091E800977F9093E800C2 +:1024F0008093F1001092F1008091E8008E779FC1E7 +:10250000882309F48DC1823009F09DC180917E033A +:10251000811190C1809180038F702FEF280F26309A +:1025200008F091C18093E9002091EB0020FF82C167 +:10253000933031F48091EB0080628093EB007AC19C +:102540009091EB0090619093EB0021E030E001C0AE +:10255000220F8A95EAF72093EA001092EA00809110 +:10256000EB008860EACF81116EC110917E031F7766 +:102570008091E3008078812B8093E3008091E800D4 +:10258000877F8093E8000E941E078091E80080FF0B +:10259000FCCF8091E30080688093E30082E011111A +:1025A00083E080937A034FC18058823008F04BC19A +:1025B00020917E0330917F032C3DE3E03E07A1F59F +:1025C00083E08A838AE289834FB7F894DE01139609 +:1025D00020E03EE051E2E32FF0E050935700E49119 +:1025E00020FF03C0E295EF703F5FEF708E2F90E009 +:1025F000EA30C0F0C7968D939D932F5F243159F731 +:102600004FBF8091E800877F8093E8006AE270E026 +:10261000CE0101960E94D0078091E8008B778093CD +:10262000E80011C1C096E7CF8091800390918103AB +:10263000432F55274330510509F44AC078F54130FE +:10264000510509F47AC08BE590E0ECE8FBE04230FC +:10265000510509F0F8C02091E800277F2093E80099 +:1026600020918203309183038217930708F49C0121 +:1026700040E02115310509F065C0411163C080912A +:10268000E80082FDC9CF80917A03882329F2853042 +:1026900019F28091E80083FFF2CFBECF413251059D +:1026A00009F43CC04232510509F0CDC08330910598 +:1026B00008F0C9C0FC01EE0FFF1FEB5DFD4F01905C +:1026C000F081E02D8E5D9D4FDC018C9190E01AC071 +:1026D000332721303105D1F02115310561F0223049 +:1026E000310509F0B0C0E9EFFBE0E4918E2F90E0F6 +:1026F000E9EFFBE007C0EBE2FCE0E4918E2F90E015 +:10270000EBE2FCE0009709F49EC0A5CFE9E1FCE014 +:10271000E4918E2F90E0E9E1FCE0F4CF8330910565 +:1027200008F091C0880F991FFC01E55DFD4F0190F5 +:10273000F081E02D89E090E08ECF82E190E0E7EE3D +:10274000FBE089CF80917A03882309F465CF853037 +:1027500009F462CF8091E80083FD5ECF8091E800AC +:1027600082FD8DCF8091E80080FF83CF9091F300B0 +:102770008091F2002115310519F08830910550F053 +:1027800041E0089709F040E08091E8008E7780935F +:10279000E8006FCF44914093F10031962150310908 +:1027A0000196E8CF803809F04EC08091E800877F1D +:1027B0008093E80080917B038093F1009DCE81118E +:1027C00042C010917E031230F0F58091E800877FBF +:1027D0008093E80010937B030E941E07112311F0E1 +:1027E00084E005C08091E30087FDFACF81E080930B +:1027F0007A0342E061EC81E00E943D0742E261EC35 +:1028000084E00E943D0742E261EC82E00E943D07C5 +:1028100042E260EC83E00E943D0780917A0313C09E +:1028200080917E03813079F481E0933009F080E07B +:10283000809379031092E9008091E800877F80936C +:10284000E8000E941E078091E80083FF0AC0809183 +:10285000E800877F8093E8008091EB00806280939E +:10286000EB00AA960FB6F894DEBF0FBECDBFDF9186 +:10287000CF911F9108951F93CF93DF93162FC0918F +:102880006A06D0916B068A30D1F420915103CE01B3 +:102890008A569440622F70E00E942832281B822FB3 +:1028A00066E00E943C32C82FC15020F4DF91CF91E6 +:1028B0001F91089560E080E20E943B14F5CF8D30B7 +:1028C000E9F4CA56D44020915103622F70E0CE0142 +:1028D0000E942832281B822F9E01280F311D2115AE +:1028E000324018F080E0D0E0C0E0C80FD11DC659DA +:1028F000DB4FD0936B06C0936A06D8CF96E0FE01FB +:10290000A2E5B3E001900D929A95E1F7803E90F137 +:1029100086E0FE0111928A95E9F7C0916A06D0918E +:102920006B06111133C046E050E0BE0182E593E032 +:102930000E9472329E012A563440892B91F52A5FFB +:102940003F4F40915103642F70E0C9010E9428322B +:10295000481B463010F4240F311D211572E0370753 +:1029600010F030E020E026593B4F30936B06209367 +:102970006A069CCFF6E08F9FB0011124685B794F07 +:1029800046E050E0CE010E946932C7CF9E012A5F27 +:102990003F4FFE012E173F0731F2808180958193D2 +:1029A000F9CFC90145E0969587954A95E1F741E051 +:1029B00050E0BA0102C0660F771F8A95E2F7CB019B +:1029C0006091680470916904862B972BB9016B5F45 +:1029D0007F4FE5E076956795EA95E1F702C0440FF1 +:1029E000551F6A95E2F7842B952B90936904809389 +:1029F0006804A5CFFF920F931F93CF93DF93EC0151 +:102A0000F62EFC0101900020E9F78F010150110919 +:102A1000C017D10730F0DF91CF911F910F91FF9038 +:102A200008956F2D89910E943B14F2CFCF92DF92CF +:102A3000EF92FF926B017C010E94B808B701A601DA +:102A400088E090E0FF90EF90DF90CF900C94AE3252 +:102A5000AF92BF92CF92DF92EF92FF920F931F93AC +:102A6000CF93DF9300D00F92CDB7DEB7082FF62EAD +:102A7000142FE22E8091630480FF4FC0E82FE6956B +:102A8000AE2FB0E0AA5EBD4F9C9190934E038E7F17 +:102A9000823009F056C0413A08F040EA9E012F5FAB +:102AA0003F4F6F2D802F0E94CE088091630480FFDE +:102AB00011C02B8139814A818091750190917601F5 +:102AC00053E0859FF0011124EB57FC4F891798F1D3 +:102AD0000E94450D80916404801308C080916504B4 +:102AE0008F1104C080916604811729F080915003F2 +:102AF00082608093500300936404F0926504109305 +:102B00006604EE2051F0609163047091640480913A +:102B10006504909166040E9416150F900F900F9017 +:102B2000DF91CF911F910F91FF90EF90DF90CF90A9 +:102B3000BF90AF9008954183308322838F5F339697 +:102B4000C5CF923039F6E2508E2F8170D82EE6959F +:102B5000F0E0E750FA4FA590B490C12CBB246091EF +:102B60007701C61608F0B4CF2C2D30E0A29EC0012C +:102B7000A39E900DB29E900D112470E00E94283209 +:102B8000802FD11016C0860F40917501420F532F30 +:102B9000511D9A01220F331F240F351F2B573C4F15 +:102BA000412F113A08F040EA6F2D0E94CE08C394DD +:102BB000D6CF861BE9CF20E00C942815CF93C82FE1 +:102BC0000E94750C823069F138F48823A9F08130B5 +:102BD00011F18C2FCF910895833039F18430C9F7EA +:102BE00040E56FEF8AED0E94DB158091000188239C +:102BF00081F3109270010CC040E56AEA83E70E94FD +:102C0000DB15809100018823A1F381E0809370019E +:102C10000E94E20EDECF40E56FEF8CEF0E94DB15E5 +:102C2000D8CF40E56FEF80E5F9CF40E56FEF80EA60 +:102C3000F5CF0E94DE15809384030C94A10B809144 +:102C40008403982F9670963019F488600C941916A6 +:102C5000877FFCCF21E030E001C0220F8A95EAF7A0 +:102C600020958091840382230C94191621E030E092 +:102C700001C0220F8A95EAF780918403822B0C947D +:102C80001916E3E6F4E0438121E1421B08F440E039 +:102C900021E0628181810C942815E3E6F4E0438110 +:102CA00021E1420F08F44FEF21E0628181810C9411 +:102CB0002815E3E6F4E0628121E1621B08F460E09C +:102CC00021E0438181810C942815E3E6F4E06281E0 +:102CD00021E1620F08F46FEF21E0438181810C94C0 +:102CE0002815E3E6F4E0818121E043816281885088 +:102CF0000C942815E3E6F4E0818121E043816281B0 +:102D0000885F0C94281580916704882319F08150FE +:102D100080936704609163047091640480916504FA +:102D2000909166040C94161580916704833018F412 +:102D30008F5F809367046091630470916404809155 +:102D40006504909166040C9416159091630490FFAD +:102D500026C0917081111CC0926090936304809191 +:102D60005003816080935003662351F060916304A7 +:102D70007091640480916504909166040E94161518 +:102D80004091660460916504809164040C94DB15A5 +:102D90008C3010F09661E1CF880F982BDECF08952C +:102DA000809163048695815009F48BE061E00C9476 +:102DB000A5168091630486958F5F8C3008F081E0C2 +:102DC00061E00C94A5168091630480FF07C086958E +:102DD00082588F77893010F40C94D91661E082E024 +:102DE0000C94A516E3E6F4E083E0808311828FEF74 +:102DF000828380EA83831482AEE4B3E012968C91DE +:102E00001297836012968C93608171818281938185 +:102E10000C9416150E94682E40E060E080E00C944F +:102E2000C20E69EE7EEF90E080E00E94BA3260E070 +:102E300082E090E00E949C3260E083E090E00E949B +:102E40009C321092980260E084E090E00E949C32F4 +:102E500060E082E290E00E949C3260E085E090E0D9 +:102E60000E949C3260E086E090E00E949C326FEF0E +:102E700087E090E00E949C3240E050E0BA0188E098 +:102E800090E00E94AE3260E08DE090E00E949C32C3 +:102E900040E050E0BA0188E190E00E94AE3260E08C +:102EA00087E190E00E949C3240E050E0BA018CE162 +:102EB00090E00E94AE3270E060E080E290E00E941C +:102EC000BA3240E050E0BA0188E190E00E94AE32B0 +:102ED00080E00E94CD0F0E94E50F40E050E0BA0173 +:102EE0008FE090E00E94AE3240E050E0BA0183E112 +:102EF00090E00C94AE320F931F93CF93DF9300D0EA +:102F000000D0CDB7DEB76091CA027091CB0280913C +:102F1000CC029091CD020E94320864367105810581 +:102F2000910588F10E947A0E882379F10E944E085B +:102F30006E5F7F4F8F4F9F4F69837A838B839C8314 +:102F400080912D0190912E018B549D4F40912C0129 +:102F500050E04530510510F044E050E0BE016F5F95 +:102F60007F4F0E947F3284E090E00E947431892B71 +:102F7000D9F40E944E086093CA027093CB028093EA +:102F8000CC029093CD0281E010C00E944E080091C7 +:102F9000D7021091D8022091D9023091DA02600F45 +:102FA000711F821F931FC4CF80E00F900F900F906E +:102FB0000F90DF91CF911F910F910895BF92CF9203 +:102FC000DF92EF92FF920F931F93CF93DF93B82E70 +:102FD000EB01F42E6901688179818A819B810E94CD +:102FE0003208643671058105910510F4FF2019F14E +:102FF000EB2C0B2C000CFF088B2D9AE08902F001C2 +:103000001124EE5FFE4F838194818B549D4F42814A +:1030100050E00417150708F4A801B6010E947F329A +:10302000C7010E947431892B89F40E944E0868837D +:1030300079838A839B8381E0DF91CF911F910F91E8 +:10304000FF90EF90DF90CF90BF90089580E0F4CF95 +:103050000F931F93CF93DF930F92CDB7DEB780917D +:103060005C0389832091C90290E041E0281719068A +:1030700009F440E001E010E09E012F5F3F4F62ED58 +:1030800072E086E00E94DE170F90DF91CF911F91D2 +:103090000F9108950F931F93CF93DF93CDB7DEB7B2 +:1030A00028970FB6F894DEBF0FBECDBF85E0E3E6EC +:1030B000F4E0DE01119601900D928A95E1F780917E +:1030C0004E0390914F03A09150038E839F83A88756 +:1030D00041E08885811101C040E008E010E09E01D8 +:1030E0002F5F3F4F6EEC72E085E00E94DE1781118A +:1030F0001092500328960FB6F894DEBF0FBECDBFD6 +:10310000DF91CF911F910F9108956F927F928F92CF +:103110009F92AF92BF92CF92DF92EF92FF920F9366 +:103120001F93CF93DF930F92CDB7DEB7862E5A0150 +:103130006901682E880F7708C3010E947431892BBA +:1031400009F07BC08AE0869DF001879DF00D112477 +:10315000EE5FFE4F458150E04115510511F041E011 +:1031600050E08AE0869DF001879DF00D1124EE5F0E +:10317000FE4F668177816B547D4FCE0101960E9490 +:103180007F32F50160817181828193810E943208D2 +:10319000643671058105910540F4B701C8010E94AC +:1031A0009D089981891709F44FC0082C000C9908D3 +:1031B000C4010E947431892B91F0B12C8B2D0F909A +:1031C000DF91CF911F910F91FF90EF90DF90CF9003 +:1031D000BF90AF909F908F907F906F9008958AE0FE +:1031E000889DF001899DF00D1124EE5FFE4F458111 +:1031F00050E0E416F50608F4A7018AE0889DF00186 +:10320000899DF00D1124EE5FFE4F668177816B542E +:103210007D4FC6010E947F32B701C8010E949D0800 +:1032200099818913CACF0E944E08F501608371838A +:1032300082839383BB24B394C1CFB12CA701B8017F +:10324000C6010E947F32BACFBB24B394F7CFCF928E +:10325000DF92EF92FF920F931F93CF93DF9300D0F3 +:1032600000D00F92CDB7DEB76B0185E0E82EF12CD0 +:1032700006EB12E09E012F5F3F4F4DEA52E061E006 +:1032800080E00E948518882349F095E0FE01319680 +:10329000A8EAB2E001900D929A95E1F795E0E8EA8C +:1032A000F2E0D60101900D929A95E1F70F900F9000 +:1032B0000F900F900F90DF91CF911F910F91FF9082 +:1032C000EF90DF90CF90089590E080E00E949632DA +:1032D000893E9E4F11F40C94891080E008951F924E +:1032E0000F920FB60F9211242F933F934F935F933A +:1032F0006F937F938F939F93AF93BF93CF93DF93FE +:10330000EF93FF93D091E900DF708091EC00C82F1C +:10331000C17080FDC0E81092E9008091F000877FC5 +:103320008093F00078940E9470111092E9008091CF +:10333000F00088608093F000CD2BCF70C093E9003F +:10334000FF91EF91DF91CF91BF91AF919F918F91BD +:103350007F916F915F914F913F912F910F900FBE91 +:103360000F901F9018951F920F920FB60F92112475 +:103370002F933F934F935F936F937F938F939F937D +:10338000AF93BF93EF93FF938091E10082FF09C059 +:103390008091E20082FF05C08091E1008B7F8093E5 +:1033A000E1008091DA0080FF24C08091D80080FF86 +:1033B00020C08091DA008E7F8093DA008091D9005E +:1033C00080FF9DC080E189BD82E189BD09B400FE16 +:1033D000FDCF81E080937A0380916C03811109C055 +:1033E0000E94A4060E946F078091E200846080938F +:1033F000E2008091E10080FF17C08091E20080FF31 +:1034000013C08091E2008E7F8093E2008091E20001 +:1034100080618093E2008091D80080628093D80020 +:1034200019BC85E080937A038091E10084FF2BC072 +:103430008091E20084FF27C080E189BD82E189BDDF +:1034400089B5982F917080FFFBCF8091D8008F7D38 +:103450008093D8008091E1008F7E8093E10080917D +:10346000E2008F7E8093E2008091E2008160809391 +:10347000E20080917B03882309F447C084E08093B5 +:103480007A0380917A038091E10083FF27C08091C5 +:10349000E20083FF23C08091E100877F8093E100F9 +:1034A00082E080937A0310927B038091E1008E7F0B +:1034B0008093E1008091E2008E7F8093E200809112 +:1034C000E20080618093E20042E060E080E00E94E0 +:1034D0003D078091F00088608093F000FF91EF91AC +:1034E000BF91AF919F918F917F916F915F914F911C +:1034F0003F912F910F900FBE0F901F90189519BC00 +:1035000010927A0310926C0374CF8091E30087FDD0 +:1035100093E090937A03B5CF78941F921FB61F92D1 +:1035200011248F939F93AF93BF93809165039091E4 +:103530006603A0916703B09168030196A11DB11DB8 +:103540008093650390936603A0936703B093680329 +:10355000BF91AF919F918F911F901FBE1F901895A3 +:103560009C014FB7F8948091650390916603A091F8 +:103570006703B09168034FBF821B930B08952FB769 +:10358000F8948091650390916603A0916703B091D0 +:1035900068032FBF0895AF92BF92DF92EF92FF9220 +:1035A0000F931F93CF93DF93CDB7DEB761970FB61D +:1035B000F894DEBF0FBECDBF4C87888B998BE52E6C +:1035C000D62EF72E5E0127E0A20EB11C85E0F50194 +:1035D00011928A95E9F780914D038A3008F095C0E1 +:1035E00080914B0390914C030E94B01A089708F405 +:1035F0008CC004E610E025E030E0A50164E084E141 +:103600000E94B32F892B09F0DBC010924D038B85EC +:1036100087FDD1C0E894E0F88091490390914A0376 +:10362000009709F0C2C08F819885891708F091C072 +:10363000981B892F41E02091710130917201889F80 +:10364000C001112455E0589FF001599FF00D11243D +:10365000E29FB001E39F700DF29F700D1124660F81 +:10366000672F661F770B7195442319F0719561954B +:1036700071098091470390914803680F791F8985EC +:103680009A85891708F068C0981B892F41E0889FA8 +:10369000C001112455E0589FF001599FF00D1124ED +:1036A000E29FC001E39F900DF29F900D1124880FBF +:1036B000892F881F990B9195442319F09195819535 +:1036C00091092091450330914603820F931F603882 +:1036D00071050CF444C06F577109709348036093EF +:1036E00047033FE7D32E803891050CF44BC08F572A +:1036F000910990934603809345039FE7F92E0E941A +:10370000BF1A90934C0380934B03ED86DE86FF86B1 +:1037100086E0FE013C96DE01119601900D928A959D +:10372000E1F729813A814B815C816D817E8180E066 +:1037300090E061960FB6F894DEBF0FBECDBFDF916B +:10374000CF911F910F91FF90EF90DF90BF90AF90BE +:103750000895891B40E06FCF891B40E098CF613806 +:10376000FFEF7F074CF461587F4F709348036093DD +:10377000470321E8D22EB7CFD62E109248031092DD +:103780004703B1CF81382FEF92074CF481589F4FF8 +:10379000909346038093450381E8F82EB0CFF82E2E +:1037A0001092460310924503AACF019790934A03C3 +:1037B00080934903A4CF6894E0F884E190E0F6CFC9 +:1037C00080914D038F5F80934D0399CF5F926F92ED +:1037D0007F928F929F92AF92BF92CF92DF92EF92A1 +:1037E000FF920F931F93CF93DF9300D000D00F92DF +:1037F000CDB7DEB77C01FC0183819481892B31F048 +:103800008081918189238F3F09F06AC50F900F90C5 +:103810000F900F900F90DF91CF911F910F91FF901C +:10382000EF90DF90CF90BF90AF909F908F907F9060 +:103830006F905F9008950E942710182F682F89813C +:103840009A810E94750B69817A81812F0E941A10DA +:103850008C01F7018281882309F436C5C8018251A1 +:103860009F45409708F0BAC48FEF93E00E948832DA +:10387000025193EEA92E92E0B92E8111C7CF01110A +:103880003AC01C821B82662463948AE0582E85010C +:103890000F5F1F4FC5010E94883289831A828823D7 +:1038A00009F4B4CF9FEF980F9330A0F58A83698213 +:1038B00032E0A30EB11CC8010E9488328B8388239A +:1038C00009F4A4CF8E010F5F1F4FF801208122233E +:1038D000F1F2213009F058C0918182819130E1F4F8 +:1038E0000E5F1F4F6AE070E0893311F460E570E00D +:1038F0000E94AD0E17C0A114F4E0BF0609F486CFF4 +:10390000C5010E948832811101C001502FEFA21A17 +:10391000B20AB5CF5801D6CF923039F40E5F1F4F9F +:103920000E94010C0F5F1F4FD0CF933029F40E5F20 +:103930001F4F0E94C80BF6CF943019F00F5F1F4F36 +:10394000F1CF0E5F1F4F30E020E0B8016F5F7F4F77 +:10395000F80141818053990B8A30910550F0215034 +:10396000310900F38FE99FE00197F1F700C00000F3 +:10397000F6CF529EF001539EF00D11249C012E0FA4 +:103980003F1F842F8B01E1CFE22FF0E0E754FE4F81 +:103990007490822F86958695869590E0FC01E75578 +:1039A000FE4FE4902770F12C022E02C0F594E794AC +:1039B0000A94E2F7E1E0EE22FF24FC01E756FE4F15 +:1039C000C490D12C022E02C0D594C7940A94E2F779 +:1039D000F1E0CF22DD24FC01E757FE4F8490912CCB +:1039E00002C0959487942A95E2F721E082229924D7 +:1039F000E114F10419F081EE0E94010CC114D1040C +:103A000019F086EE0E94010C39E36AE070E073124F +:103A100002C060E570E0872D0E94AD0ECD2819F040 +:103A200086EE0E94C80BEF2819F081EE0E94C80BA9 +:103A3000892809F477CF6AE070E08CE259CF81E001 +:103A40000E94361603C081E00E942A160F900F9044 +:103A50000F900F900F90DF91CF911F910F91FF90DA +:103A6000EF90DF90CF90BF90AF909F908F907F901E +:103A70006F905F900C941F1682E0E2CF043E110518 +:103A800009F421C1053E110509F47DC0013E11056F +:103A900009F0D1C380933F0278C00338FFE51F07C8 +:103AA00009F463C008F5063F110509F40AC108F4DA +:103AB00006C102383FE5130709F0BDC3882309F4A6 +:103AC000BAC381EE0E94010C83EE0E94010C8FE4C8 +:103AD0000E94010C8FE40E94C80B83EE0E94C80B69 +:103AE00081EE0E94C80BA7C305384FE5140709F4FF +:103AF000B2C008F457C006389FE5190709F4C2C0E0 +:103B00000738EFE51E0709F096C3882309F47ECE37 +:103B100087E20E94010CFFEF28EA31E0F1502040DB +:103B20003040E1F700C000008CE20E94010C87E207 +:103B30000E94C80B8BE10E94010C4FEF50EE80E019 +:103B4000415050408040E1F700C000008CE20E94EC +:103B5000C80B8BE10E94C80B40E56FEF84EB0E941D +:103B6000DB1581E080933E0251CE882309F463C3C4 +:103B700081EE0E94010C83EE0E94010C80E50E9400 +:103B8000010C80E5A8CF809342021093410200937C +:103B90004002882321F081E08093F3024CC310920D +:103BA000F30249C3882379F180913F02882349F0C9 +:103BB000809140020E94C80B80EE0E94010C8AE2B4 +:103BC0000CC0809142028823D1F3809140020E9470 +:103BD000C80B80EE0E94010C8CE40F900F900F90A8 +:103BE0000F900F90DF91CF911F910F91FF90EF9069 +:103BF000DF90CF90BF90AF909F908F907F906F900D +:103C00005F900C94010C8AE20E94C80B8CE40E9425 +:103C1000C80B80EE0E94C80B80913F02811105C045 +:103C200080914202882309F4F1CD80914002D5CFE2 +:103C3000882309F400C380913E02882309F4FBC263 +:103C40000E94BF1A9093A1028093A00210923E029C +:103C500010920101F0C2882371F1809170018111ED +:103C600004C080910001882339F0109270011092F5 +:103C700000010E94E20EDFC281E080937001809318 +:103C80000001F7CF8823B9F080913D02882349F0E5 +:103C900080EE90E0909372018093710110923D024A +:103CA000E8CF86E690E0909372018093710181E005 +:103CB00080933D02DECF61E00E94860CBCC262E0D0 +:103CC000FBCF64E0F9CF882321F081E08093F202FA +:103CD000B2C21092F202AFC2882331F081E0809329 +:103CE000F50210926801A7C21092F502A4C2073C27 +:103CF0002CE5120709F4AEC008F4A7C0083C4CE557 +:103D0000140709F4ACC0093C1C4509F0B4C241E4F5 +:103D100056E16DE476E179C0043DECE51E07A8F4B8 +:103D20000E3CFCE51F0708F071CD0C3C2CE512079A +:103D300009F49FC043E856E164E976E10D3C1C4577 +:103D400008F463C061E081E046C0053D4CE514071E +:103D500009F45CCD08F492C00D351D4509F456CD2B +:103D60008AC28091630480FF31C08E7F8093630498 +:103D7000609163047091640480916504909166047D +:103D80000E941615809150038160809350039FEF2D +:103D9000E0E7F2E09150E040F040E1F700C00000C1 +:103DA0000F900F900F900F900F90DF91CF911F9178 +:103DB0000F91FF90EF90DF90CF90BF90AF909F90CA +:103DC0008F907F906F905F900C94450D81608093F1 +:103DD000630461E086950F900F900F900F900F9005 +:103DE000DF91CF911F910F91FF90EF90DF90CF90D7 +:103DF000BF90AF909F908F907F906F905F900C944A +:103E0000A51640ED56E169ED76E10F900F900F9009 +:103E10000F900F90DF91CF911F910F91FF90EF9036 +:103E2000DF90CF90BF90AF909F908F907F906F90DA +:103E30005F900C94B30849ED56E160ED76E1E5CF73 +:103E400041E756E16AE776E1E0CF4AE756E161E70C +:103E500076E1DBCF49E556E165E676E1D6CF45E68A +:103E600056E169E576E1D1CF4DE456E161E476E1D2 +:103E7000CCCF44E956E163E876E1C7CF0F900F90CD +:103E80000F900F900F90DF91CF911F910F91FF90A6 +:103E9000EF90DF90CF90BF90AF909F908F907F90EA +:103EA0006F905F900C94E3160E3D1C4509F0E3C142 +:103EB0000F900F900F900F900F90DF91CF911F9167 +:103EC0000F91FF90EF90DF90CF90BF90AF909F90B9 +:103ED0008F907F906F905F900C941117C8010E9493 +:103EE0004D0BD82ED6C1092F0F70907F11F002957F +:103EF000007F812F2223C9F0002369F090E2910F07 +:103F0000983010F011110BC080916D03082B0093B5 +:103F10006D030E942C0B812F0E94010C17C0809111 +:103F20009702082B00939702F4CF0E94C80B00233E +:103F300069F00095105E183010F0B11027C0809124 +:103F40006D03082300936D030E942C0B98E0C91A9F +:103F5000D108E4E0CE16D10408F058CC0E949D0EA2 +:103F60000F900F900F900F900F90DF91CF911F91B6 +:103F70000F91FF90EF90DF90CF90BF90AF909F9008 +:103F80008F907F906F905F900C94050E80919702B8 +:103F9000082300939702D8CF892F8F70907F90329B +:103FA00011F08295807FF1E0BF120CC0222329F02E +:103FB000333060F60E94BE0BC9CF323038F60E9413 +:103FC000B30BC4CF222341F03323A1F340FFA3CF8F +:103FD0004F70F7014583EECF332389F3193309F08E +:103FE000F5C0FFEF27EE33E0F15020403040E1F71D +:103FF00000C00000812F0E94C80BA8CF892F869592 +:104000008695837061F0813009F0A0CF812F937085 +:10401000211102C090E080E00E945A0897CF812FC2 +:104020009370211102C090E080E00E9470088ECF52 +:10403000892F8370A1F5211189CF812F82958695D3 +:104040008770880F880F412F4F70082E01C0440FD2 +:104050000A94EAF7212F207114FF07C02FE030E007 +:1040600001C0220F8A95EAF7209596959695937050 +:10407000923081F0822F842B933030F4809198021B +:10408000913029F0242B82230E94AF0B5FCF842B29 +:10409000822BFACF242B809198028227F5CF869528 +:1040A000222311F0892F8170882309F44FCF812FAB +:1040B000829586958770880F880F412F4F70082E44 +:1040C00001C0440F0A94EAF7212F207114FF07C0A2 +:1040D0002FE030E001C0220F8A95EAF720959695EF +:1040E00096959370923081F0822F842B933030F428 +:1040F00080918403913029F0242B82230E94191689 +:1041000025CF842B822BFACF242B80918403822706 +:10411000F5CF092F0F70222329F0802F0E94361629 +:10412000812F48CF812F0E94B30B802F0E942A1627 +:104130000DCF812FE1EF1E1789F1E11750F0F0EF5D +:104140001F17B9F02223B1F13111E5CE892F8F71FC +:1041500029C042EF141749F153EF1513F3CF80E054 +:10416000222361F29F7181E001C0880F9A95EAF7DE +:10417000C5CF222379F0323008F0E8CE292F2F71F5 +:1041800081E090E001C0880F2A95EAF790918403BE +:104190008927B4CF333008F0D9CEF0CF892F8F7173 +:1041A000222321F20E943616D1CE892F8F7122232D +:1041B000C9F3BCCF332379F0893341F48FEF97EE05 +:1041C000E3E081509040E040E1F712CF8FE39CE9BB +:1041D0000197F1F70DCF892F8F71A8CF0031FFE53F +:1041E0001F0709F42CCC01312FE5120709F444CC48 +:1041F0000E944E086093FA027093FB028093FC02C7 +:104200009093FD02F7018281043F110509F453CD1B +:1042100008F043CC003E110509F455CD08F02ECC32 +:104220000E31110540F00132110508F401CD0C32B8 +:10423000110509F451CDF7019281911135CE80918C +:104240006D0382720A3CFCE51F0709F40DCE08F0ED +:1042500063CD053C3CE5130709F4F2CD08F047CDEA +:10426000033C5CE5150709F4CCCD08F0E4CD023C35 +:104270001C4509F476CDF70100811181992309F4D9 +:104280002DCEC8010E942710D82E682FC8010E9489 +:10429000750BB8018D2D0E941A100E94C209182FAB +:1042A000B82EF70122814581342F32953F70892F36 +:1042B00082958F70C82ED12C8C3008F047CEF60135 +:1042C000E55EFB4C0C945C3200313FE5130709F4CA +:1042D000BACB01314FE5140709F094CF82E0B4CB9B +:1042E00085E0DE01119601900D928A95E1F7F701C4 +:1042F000228189819A8121119ECA0E944D0B182F1B +:10430000A2CA1F93CF93DF9380916302807FA9F4A9 +:1043100080916002882389F080919502D091640297 +:1043200060915E0270915F02A0916102B0916202A1 +:10433000C62FC72316E0D81304C0DF91CF911F9179 +:10434000089590E0109711F0CF3F19F4019687700F +:10435000F2CF189F9001199F300D1124F901EB59EC +:10436000FD4F41814713F2CF40814613EFCF428189 +:104370004111ECCF438154814A1B5B0B403A5105FC +:1043800028F7809163028F70806180936302F90146 +:10439000E659FD4F80818F70806180838EE592E0C9 +:1043A0000E94E61BDF91CF911F910C94430BAF92BB +:1043B000BF92CF92DF92EF92FF920F931F93CF9312 +:1043C000DF93CDB7DEB761970FB6F894DEBF0FBEAF +:1043D000CDBF8C0185E0F801DE011D9601900D92A4 +:1043E0008A95E1F7F801E2808EE5A82E82E0B82EEA +:1043F00060916102709162026115710509F432C128 +:1044000090915E0240915F02892F84238F3F09F4CF +:1044100029C120813181C380D480F0906002F601EF +:10442000E61BF70BFF2009F4E8C080916302582FC8 +:10443000507FE03AF10508F0ABC0511177C0FE2C77 +:10444000431321C092131FC0E1101DC08F70806103 +:1044500080936302C5010E94E61B80916302F8010C +:1044600085838F2D61960FB6F894DEBF0FBECDBF4A +:10447000DF91CF911F910F91FF90EF90DF90CF9040 +:10448000BF90AF900895CD2829F0822F83238F3FCE +:1044900009F003C180E0F82FF170DF2E80FF3CC0EF +:1044A000809195024091640256E0841315C02D87D7 +:1044B0003E878D859E850E945610292F22952F704C +:1044C0002230F0F0243018F59F70F1F0F80195815A +:1044D000907FD1F4D12C1EC090E0589FF001599FDD +:1044E000F00D1124EB59FD4F6181361306C0608138 +:1044F000261303C06281E6120FC001968770D5CFE4 +:104500009F7011F0882331F3805E883018F3C80162 +:104510000E94E61BFD2CA5CFEE2009F4A2CF8091CE +:104520006302816080936302F12C9BCF431306C02A +:10453000921304C0F801EE2009F479C0C8010E946A +:104540006210882309F1EE20F9F080916302803235 +:1045500070F020915E0230915F0238872F831986B8 +:10456000DB86CA868C87CE0107960E94E61B86E012 +:10457000F801AEE5B2E001900D928A95E1F70E9454 +:104580008121FF24F3946DCFC8010E94E61BF9CF6F +:1045900051110AC08EE592E00E94E61B86E0F5010B +:1045A00011928A95E9F7C0CF43130FC092130DC043 +:1045B000E1100BC0F8018583C8010E94E61B86E06C +:1045C000F50111928A95E9F74CCFC8010E9462105B +:1045D0008823D1F2EE20C1F280916302803238F25A +:1045E00020915E0230915F023A8329831B82DD8233 +:1045F000CC828E83CE010196B8CFE03AF105F8F671 +:10460000FE2CEE2009F243131FC092131DC08091AF +:10461000630280FD10C0982F907F69F0F8018583B8 +:10462000903F31F0982F907F905F8F70892B85831A +:10463000C8010E94E61B86E0F801AEE5B2E00190F9 +:104640000D928A95E1F70DCFC8010E946210811189 +:104650008ECF80916302816080936302C8010E94C3 +:10466000E61BFFCEEE2009F48FCFC8010E94621036 +:10467000F82E882309F488CF86E0F801AEE5B2E091 +:1046800001900D928A95E1F780915E0290915F0210 +:104690000E9456100E948121E4CE81E08E25FBCE3F +:1046A0001F93CF93DF93CDB7DEB767970FB6F8941C +:1046B000DEBF0FBECDBF4B8B5C8B6D8B7E8B8F8B2C +:1046C0006111109297021A8A198A85E0FE01739689 +:1046D000DE011D9601900D928A95E1F786E0FE01BC +:1046E0003D96DE01179601900D928A95E1F7CE0175 +:1046F00007960E94D721882389F016E080919502C1 +:104700009091640289134BC067960FB6F894DEBF90 +:104710000FBECDBFDF91CF911F91089586E0FE01BE +:104720003796DE01119601900D928A95E1F78A8500 +:104730009B85892B11F38F81988589238F3FE9F21F +:104740002091640230E0C901019687709927409159 +:1047500095024817190681F410926D030E946711A3 +:10476000109264021092950286E0EEE5F2E0DF011D +:104770001D928A95E9F7C1CF96E0929FD001939F51 +:10478000B00D1124AB59BD4FFE01319601900D9231 +:104790009A95E1F7809364020E94430BAECF819F0C +:1047A000C00111248B599D4F0E94D721882309F401 +:1047B000ABCF8091950290E0019687709927809306 +:1047C00095029CCF7F928F929F92AF92BF92CF9291 +:1047D000DF92EF92FF920F931F93CF93DF93CDB7AA +:1047E000DEB764970FB6F894DEBF0FBECDBF8E0163 +:1047F0000F5F1F4F8AE0D8011D928A95E9F79FE469 +:10480000C92E91E0D92EF12CE12CAA24A394B12C2D +:104810003FE4832E31E0932EF60181916F018F3FAB +:1048200009F443C0F894E82FE295EF70F0E021A17D +:104830008F70A50102C0440F551F8A95E2F7CA0187 +:10484000922F982B91A392A18095892382A30E94F5 +:10485000660900C0E8E4F1E0712C31E021912F3FBE +:1048600009F479C0A22FA295AF70B0E090968C9118 +:1048700090E02F7002C0959587952A95E2F780FD0C +:104880006AC0832F782A330F8E169F0639F7F601F8 +:10489000319780818F3F11F00E94680950EA5A9544 +:1048A000F1F7F801EE0DFF1D70828FEFE81AF80A9C +:1048B000A5E0EA16F10409F0AFCF4AE050E0B801F4 +:1048C0008DED92E00E9472327C01892B41F08AE0EA +:1048D000F801ADEDB2E001900D928A95E1F71091EB +:1048E000E802E114F104C9F181E080939B020E9487 +:1048F000BF1A90939A0280939902809199029091A5 +:104900009A020E94B01A069770F0ADEDB2E0E12F66 +:10491000F0E0E15DFC4F8D91819322E0A23EB20771 +:10492000D1F710929B0281E090E0EF28D1F06496DD +:104930000FB6F894DEBF0FBECDBFDF91CF911F91B0 +:104940000F91FF90EF90DF90CF90BF90AF909F902E +:104950008F907F90089580E095CF80919B02811188 +:10496000CCCF0E947A0ED82EE091E802882309F479 +:10497000DEC07E0140E1E40EF11C85E0D7011D920E +:104980008A95E9F70E2F10E0015D1C4F8091D60249 +:104990008A3008F095C047E259E1B701C8010E948A +:1049A000360E882309F4AFC045E656E2B701C801C8 +:1049B0000E94360E882309F4A6C04BE757E1B701E1 +:1049C000C8010E94360E882309F49DC04AE458E1CC +:1049D000B701C8010E94360E882309F494C048E24A +:1049E00058E1B701C8010E94360E882309F48BC034 +:1049F0001092D6028091E70290E045E050E0B701C6 +:104A0000815D9C4F0E94723221E02093A602892B87 +:104A100009F06CC0D12C80910101811111C08091ED +:104A2000A0029091A1020E94B01A813A9F4040F0EA +:104A300040E56FEF8CEF0E94DB1581E08093010170 +:104A40008EE9E82E82E0F82E10E000E0D7018D918B +:104A50007D018823D1F08695F80109F465C0E850FE +:104A6000FE4F808191819C878B871D860E94BF1A93 +:104A70008160782F9F878E87F701319710824B8551 +:104A80005C856D858F850E9450230E5F1F4F04301B +:104A90001105E1F66091FA027091FB028091FC022F +:104AA0009091FD020E94320861367A4E810591058F +:104AB00028F040E060E080E00E94C20E8D2D37CFEC +:104AC00080919C0290919D020E94B01A843F914077 +:104AD00008F061CF8091A602882309F49BCF85E07E +:104AE000F70111928A95E9F71092A602A091E702C8 +:104AF000B0E0A15DBC4F85E0FE01709601900D9283 +:104B00008A95E1F788CF8091D6028F3F31F08F5F91 +:104B10008093D6028A3008F46DCF0E94BF1A90931A +:104B20009D0280939C02D6CFEC50FE4F9ACFF0E0CE +:104B3000E15DFC4FF89485E0A6EBB2E001900D92A8 +:104B40008A95E1F765E070E086EB92E00E949D08AF +:104B50008093B5020E946609F894E091F002F0E0BB +:104B6000E351FD4F80818B878093BC0261E070E050 +:104B7000CE010B960E949D088093BB020E9466099D +:104B8000F894C090BD02D090BE02E090BF02F090B9 +:104B9000C0028091A2029091A302A091A402B091C0 +:104BA000A502C816D906EA06FB06D1F0C092A202F9 +:104BB000D092A302E092A402F092A5020E947A0E83 +:104BC00081110EC00E944E08C61AD70AE80AF90AD7 +:104BD000C092D702D092D802E092D902F092DA02C3 +:104BE0000E946609F8948091C8028823F1F080FF42 +:104BF0000DC08091C10280FF25C090916304916037 +:104C00009093630460E086950E94A5168091C80287 +:104C100081FF09C020E04091C4026091C3028091ED +:104C2000C2020E9428151092C8020E946609F894D8 +:104C30008091C902882349F00E94400F0E946609B2 +:104C400080E075CE0E94210EE1CF0E94250FF6CFA5 +:104C5000EF92FF920F931F93CF93DF9300D000D07A +:104C60000F92CDB7DEB7162FE82EF12CC701880FB3 +:104C7000991F662339F188509E4FFC0180819181F4 +:104C80009A83898301E00B830E94BF1A8160782F89 +:104C90009D838C83F701E256FD4F0127110F102BE6 +:104CA000108349815A816B818D810F900F900F90F5 +:104CB0000F900F90DF91CF911F910F91FF90EF9088 +:104CC0000C9450238C509E4FD8CFCF92DF92EF920E +:104CD000FF920F931F93CF93DF930F92CDB7DEB761 +:104CE000EE24E394F12C0CEB12E09E012F5F3F4F7A +:104CF00041EB52E063E082E00E948518082F882390 +:104D000021F1C090EA028C2D90E09C0123513D4F8F +:104D100079011981F9018081181BD12E80E00AC028 +:104D2000DA94F70180818F5F808360E08C2D0E9490 +:104D30002826802F1D14A4F3912F17FD90E0191B36 +:104D400011110EC081110E942A0B802F0F90DF914C +:104D5000CF911F910F91FF90EF90DF90CF9008952A +:104D60001F5FF70180818150808361E08C2D0E945C +:104D70002826802FE5CF1F921FB61F9211248F93F4 +:104D80009F93AF93BF9380916403811113C080916F +:104D9000650390916603A0916703B0916803419603 +:104DA000A11DB11D8093650390936603A0936703D3 +:104DB000B0936803BF91AF919F918F911F901FBED9 +:104DC0001F901895CDB7DEB7E0970FB6F894DEBF09 +:104DD0000FBECDBF84B7877F84BF0FB6F894A89568 +:104DE00080916000886180936000109260000FBE27 +:104DF00080E890E00FB6F894809361009093610092 +:104E00000FBE85B7806885BF85B7806885BF84E69B +:104E100099E090933302809332020E94A4060E948C +:104E20006F078091E20084608093E2007894809123 +:104E30007A038823A1F01091E9001F709091EC0093 +:104E4000892F817090FD80E8182B1092E9008091E5 +:104E5000E80083FD0E9470111F701093E90082E04A +:104E600084BD93E095BD9AEF97BD80936E0010923C +:104E7000D7021092D8021092D9021092DA020E9440 +:104E80008910811102C00E94E50F0E947A0E809362 +:104E9000590180915901882309F4C9C01092730106 +:104EA00085E2809374010E947A0E81110E9467301E +:104EB0008091590181112FC0FE01359686E0DF01F6 +:104EC0001D928A95E9F786E6898387E98A8386ECCD +:104ED0008B8384E38C8385E38D833497AFE4B1E0E7 +:104EE000CE010B9621912D938E179F07D9F787E05E +:104EF000E9E7F1E0DE01919601900D928A95E1F7E4 +:104F0000FE01B196A8E4B1E0CE01889621912D93DF +:104F10008E179F07D9F78091590195E0811190E094 +:104F20009093E80285E0891B8093E7020FE411E08B +:104F300084E5E82E81E0F82EF80181918F018F3F02 +:104F400011F00E946809E016F106B1F708E411E0DB +:104F5000BFE4EB2EB1E0FB2ED8018D918D018F3F88 +:104F600011F00E946809E016F106B1F78AE0EFE25D +:104F7000F3E0DF01282F1D922A95E9F7EDEDF2E02D +:104F8000DF011D928A95E9F70E946419811102C020 +:104F90000E94111782E090E00E94883280932403DF +:104FA00084E090E00E948832182F82E290E00E9414 +:104FB0008832982F812F9093DC028093DB020E942D +:104FC000E223EFE7FBEB3197F1F700C000000E940E +:104FD000E22380912F0380FF2EC06FEF7FEF90E0E0 +:104FE00080E00E94BA3281E08093E00080E280930A +:104FF000D8001092C9008FE19EE40197F1F700C03C +:10500000000087E090EBDC0180936C0690936D06C6 +:10501000A0936E06B0936F0688E19CE00FB6F894FB +:10502000A895809360000FBE90936000FFCF85E24B +:105030008093730136CF83E090E00E9488320E9413 +:10504000AF0B809184030E94DE150E947A0E8111BD +:1050500002C00E946A3083E080931F0380E2809345 +:1050600051030E94682E6DE070E08CE492E00E9493 +:10507000F50E892BE9F580911F0363E070E081FD57 +:1050800005C289E492E00E94F50E892B89F56DE056 +:1050900070E089E392E00E94F50E892B49F50E94A9 +:1050A0004E086058774C8E4F9F4F60935803709313 +:1050B000590380935A0390935B03EAE6F4E080E09F +:1050C00092E0DF019C011D9221503040E1F7F09306 +:1050D0006B06E0936A068FEF9FEF909369048093CD +:1050E000680481E080935D0380935C031092200349 +:1050F0008091E902811136C00E946419811104C0B7 +:105100000E9411170E94F21688E090E00E949032EF +:1051100060936304709364048093650490936604C1 +:10512000809150038360809350036E7F71F40E94DE +:10513000F21688E090E00E949032609363047093CE +:10514000640480936504909366040E94B80880917B +:10515000630480FF04C060E086950E94A51681E08C +:105160008093E90280915901811106C084EF8093F8 +:10517000670185EF8093660120916701A22FA295B8 +:10518000AF70B0E091963C9191972F7081E090E0E4 +:10519000BC01022E01C0660F0A94EAF7462F409523 +:1051A000432391964C93919792963C919297362BEC +:1051B00092963C93929740916601E42FE295EF70AE +:1051C000F0E031A14F70042E01C0880F0A94EAF775 +:1051D000982F9095932391A392A1892B82A39096C7 +:1051E0008C9190E002C0959587952A95E2F78170A1 +:1051F00020A130E002C0359527954A95E2F792E06C +:1052000020FF90E0892B8093F1029091590181E079 +:1052100098279093F002891B8093EA020E940A1754 +:1052200060E08AE00E94A51681E00E94191680EED7 +:1052300090E090937201809371010E94E20E8AE5E2 +:1052400091E09093610380936003A0E46A2E8091C3 +:105250007A03FF24F39400E112E1853009F465C17B +:105260000E94E223E82E81110E944E08FFE22F2EB9 +:10527000F3E03F2EE5E2F3E0D10110E000E0B02ED4 +:10528000DD9081918D1509F474C18D25C12CFF2409 +:10529000F3949F2D982309F467C10E947A0E882306 +:1052A00099F0C9A2BAA2DF2081E009F480E08BA3C3 +:1052B0000E94BF1A8160782F9DA38CA349A15AA197 +:1052C0006BA18DA10E945023F801EB5DFC4F808102 +:1052D000F826F0828091F102E82FEE0FEE0F909108 +:1052E0006701A92FA295AF70B0E090962C9130E0A5 +:1052F0009F7002C0359527959A95E2F72170332764 +:1053000090916601A92FA295AF70B0E090964C9154 +:1053100050E09F7002C0559547959A95E2F7CA01F3 +:105320008170992740FF02C082E090E0822B8E2B93 +:105330008093F1021091F0028F70E82FF0E0E250BC +:10534000FE4F80819091EF02890F8093EF02F12C44 +:1053500084306CF0E12FF0E0E351FD4F80818F5FEE +:10536000808360E0812F0E942826FF24F39480919F +:10537000EF028D3F6CF4E12FF0E0E351FD4F8081AF +:105380008150808361E0812F0E942826FF24F394BE +:105390008091EF02082E000C990B64E070E00E94EF +:1053A00048328093EF02F1100E942A0B80915D0336 +:1053B000882351F180912103909122030E94B01A19 +:1053C000C29708F0EDC0209168043091690421155E +:1053D000310509F0F0C180915C038823A9F00E9497 +:1053E0004E08009158031091590320915A033091AF +:1053F0005B03601B710B820B930B6F3F7F4F8F4FD3 +:105400009F4710F40E94250FE11001C0F1100E9487 +:10541000400F0E94A2100E949D0E909123038917B5 +:1054200031F00E949D0E809323030E94050E80910F +:105430007A03843009F00BCF83E08093E9008091F8 +:10544000E80082FF04CF8091E80090E085FF0CC067 +:105450000E94C30630E2E32EF12C8E010F5F1F4F36 +:10546000882309F487C291E08091E8008B778093CC +:10547000E800992309F4EBCEE981E150E33108F02B +:10548000DDC2F0E0E95DFB4C0C945C3286E492E016 +:10549000FACD80917A03843009F437C080E00E940D +:1054A000050E8091EC02811109C0F092EC0280910E +:1054B000630481708093EB020E94210E0E94250FED +:1054C0000E94A2101092640388E190E00FB6F89455 +:1054D000A895809360000FBE6092600083B7817FC3 +:1054E000846083BF83B7816083BF7894889583B7D6 +:1054F0008E7F83BF0FB6F894A89580916000886175 +:1055000080936000109260000FBE80917903882321 +:1055100061F00E94E223EFE2F3E081918111B7C3D1 +:10552000A9E3B3E0AE17BF07C1F780917A038530D6 +:1055300009F4AFCF10926D030E9467110E949D0E77 +:105540000E94050E1092EC028091EB02882349F034 +:105550008091630481608093630460E086950E947B +:10556000A5160E94E20E7CCEC394FF0C27E0C21267 +:1055700090CE0F5F1F4F0A30110509F080CE8FEFDC +:1055800088A789A71AA60E94BF1A8160782F9CA7B6 +:105590008BA748A559A56AA58CA50E9450239ACE31 +:1055A0000E94BF1A909322038093210360E080E061 +:1055B0000E9486080E949D0E8093FE020E947A0E31 +:1055C000882309F4DFC06091FA027091FB02809198 +:1055D000FC029091FD020E943208613375478105FB +:1055E000910540F00E94250F80915D03882309F406 +:1055F000F2CEE9CE0E94400F61E080E00E94860872 +:1056000060E080E891E00E94FA1462E080E00E948D +:105610008608809184030E94750C823009F48CC046 +:1056200008F081C0882309F487C0813009F48AC05A +:1056300065E080E00E94860860E08EE991E00E94CB +:10564000FA1466E080E00E9486086091FE0266958A +:10565000617083EA91E00E94FA1467E080E00E94A2 +:1056600086086091FE026095617088EA91E00E9470 +:10567000FA1468E080E00E9486086091FE0262FBF6 +:10568000662760F98CEA91E00E94FA146091F602B4 +:105690007091F7028091F8029091F9020E9432080D +:1056A0006D3271408105910508F49ECF0E944E082D +:1056B0006093F6027093F7028093F8029093F902D8 +:1056C0008091F502811104C080916801811142C06E +:1056D0006DE080E00E94860860E081EB91E00E942E +:1056E000FA146AE080E00E94860881E080936801F5 +:1056F0008091F40290E00196817099278093F402E2 +:1057000021E030E0281B390B40E6429FC001439F57 +:10571000900D11242091F302222351F187529C4FC6 +:105720000E94610661CF833089F0843009F080CF18 +:1057300060E082E991E003C060E086E891E00E94C9 +:10574000FA1476CF60E08CE891E0F9CF60E088E968 +:1057500091E0F5CF6AE080E00E94860860E081EB8E +:1057600091E00E94FA146BE080E00E948608C0CFAE +:105770002091F202222319F0875E9C4FD1CF875AE5 +:105780009D4FCECF64E080E00E94860860E087EB0A +:1057900091E00E94FA1465E080E00E94860860E0D3 +:1057A0008DEB91E00E94FA1469E080E00E94860887 +:1057B00089E994E0B5CF8091200361E070E0811128 +:1057C0000ACE082F10E02B01082E02C0440C551CF5 +:1057D0000A94E2F7A90144215521452B09F448C058 +:1057E00090911F0390FD46C08295880F807680932C +:1057F0006B019801369527953695279520936E0174 +:10580000815E80936C0110926F0124E630E047E0E6 +:1058100050E069E671E088E70E945F2F892B09F06C +:10582000DACDA80175E0440F551F7A95E1F7809114 +:105830001F0380FD2DC046595B4F04E610E020E2B7 +:1058400030E060E488E70E94862F892B09F0C3CD01 +:105850000E94400FC201809590954090680450903E +:105860006904482259225092690440926804B3CDD9 +:105870008F5FA7CF880F880F880F80936B011092DE +:105880006E01895F80936C0183E080936F01BDCFCF +:10589000EFEFF2E080E2DF011D928A95E9F7E2E1A5 +:1058A000F2E0F8ABEFA70EE012E067E0A62E992435 +:1058B0009394AFA5B8A96D91B8ABAFA7F80181914A +:1058C0008F01840F952F911D9C0126593B4F3EA7B8 +:1058D0002DA7E62FF0E0E150FD4F30E020E07A2CDC +:1058E000721AB92C022E01C0BB0C0A94EAF7CDA49F +:1058F000DEA490E0D6018D916D018B21672D691B8F +:105900006770862E062E000C770BB82F01C0BB0FD8 +:105910008A94EAF78B2E71956195710967707727E4 +:1059200001C086956A95EAF7882A8081882A808254 +:105930009F5F9830F9F62F5F3F4F31962830310541 +:1059400071F6E6E1F2E02FA538A9E217F30709F0B6 +:10595000B0CF04E610E020E230E04FEF52E071CF2C +:105960008091F100D8018D938D01B1E0EB1AF1081F +:1059700009F479CD8091E80085FDF2CF8091E800AF +:105980008B778093E8000E94C306882399F36BCD40 +:105990001A8289E08B8311C08A81823009F48FC119 +:1059A000833091F1813009F049C00E944E080E9475 +:1059B00062326B837C838D839E8380917A038430F3 +:1059C00009F045CC1091E9001F709091EC00892FEF +:1059D000817090FD80E8182B82E08093E90080912F +:1059E000E80080FF0DC050E040E060E270E0CE01D2 +:1059F00001960E94F4068091E8008E778093E8007B +:105A00001F701093E90023CCFE013396D1018D91D4 +:105A10001D018193B9E32B16B3E03B06B9F7CDCF57 +:105A20008A81823059F46B817C818D819E810E94B4 +:105A3000623286E290E00E949C32BFCF8FEF898372 +:105A4000BCCF4C816B818A810E94F40F98278927F3 +:105A500098279E838D83B1CFED80FE80FE24EF24B6 +:105A6000FE248A810B81EEE00E9F80011124FCE868 +:105A70008F9F000D111D11248C8190E0880F991FBC +:105A8000080F191F6F2DC80187960E949C326E2D3A +:105A9000C8018896D0CF0E94780F8FCF8A81813835 +:105AA000B1F058F4803809F088CF4B8160916504DB +:105AB000809164040E94DB1580CF8238E1F0833846 +:105AC00009F07BCF409166046C818B81F3CF60E05D +:105AD0008B810E94A5168B81811103C00E94210E2B +:105AE0006CCF8091630481608093630460E086954D +:105AF0000E94A51662CF8B81809367045ECF8A8156 +:105B0000813899F030F4803809F057CF80916604DD +:105B100041CF823891F0833809F04FCF80916404EF +:105B20008B83809165048C8348CF8091630480FFD0 +:105B300002C086952FCF80E02DCF809167042ACFB9 +:105B4000609163047091640480916504909166048F +:105B50000E94161532CF80E18A832FCF81E08A839D +:105B60008DE118CFCA80DB80DC24CD24DC248E01BB +:105B70000F5F1F4FEC80E00EF12EF11CC6018D511E +:105B80009D4F0E151F0509F418CF2DE1C21621E017 +:105B9000D20658F40E948832D80114968C93FFEFF5 +:105BA000CF1ADF0A0F5F1F4FE9CFF8011482F7CF3A +:105BB0000A811B811027012710279E012F5F3F4F6D +:105BC0006901EC80E00EF12EF11CC8018D519D4F52 +:105BD000E016F10609F4F1CE0D3131E0130728F497 +:105BE000D60114966C910E949C32BFEFCB1ADB0A4F +:105BF0000F5F1F4FEACF0E94680FDFCE85E0ACCF6A +:105C0000CA80DB80DC24CD24DC248E010F5F1F4F93 +:105C1000EC80E00EF12EF11CC6018796E016F1062D +:105C200009F4CBCEECEBCE16E2E0DE0658F40E948F +:105C30008832D80114968C93FFEFCF1ADF0A0F5FDA +:105C40001F4FEACFF8011482F7CF0A811B8110277A +:105C5000012710279E012F5F3F4F6901EC80E00E66 +:105C6000F12EF11CC8018796E016F10609F4A5CEC5 +:105C70000C3B32E0130728F4D60114966C910E9475 +:105C80009C32BFEFCB1ADB0A0F5F1F4FEBCF09BD72 +:105C900019BD09B400FEFDCF8091D8008F7D80939F +:105CA000D8008091E00082608093E0008091E00065 +:105CB00081FDFCCF10926D030E94671136CC86E205 +:105CC00090E00E9488321B821C821D828E8375CEDA +:105CD0001092B9008CE08093B80008959F92AF9223 +:105CE000BF92CF92DF92EF92FF920F931F93CF93C9 +:105CF000DF93B82EEB010E94BF1A6C01EE24E394EF +:105D0000F12CC431D10560F025E0E22EF12CCF3F1B +:105D1000DC0731F0CE0164E170E00E9428327B01A3 +:105D200084EAA82E94E8992E1092BC00A092BC00A0 +:105D30000E94BF1A8C018091BC0087FF0DC080912A +:105D4000B900887F883039F18091B900887F80312F +:105D500011F10FEF1FEF09C00E94BF1A801B910BBA +:105D60008E159F0540F30EEF1FEFCF3FDC07E1F2EA +:105D7000C6010E94B01A8C179D07B0F2C801DF91CE +:105D8000CF911F910F91FF90EF90DF90CF90BF9038 +:105D9000AF909F900895B092BB009092BC000E947B +:105DA000BF1A8C018091BC0087FF0AC08091B900A6 +:105DB000887F883111F0803461F610E000E0DECF9A +:105DC0000E94BF1A801B910B8E159F0558F3CBCFF5 +:105DD0000F931F93CF93DF93EB018093BB0084E875 +:105DE0008093BC000E94BF1A8C018091BC0087FF89 +:105DF00011C02091B900287F81E090E0283211F491 +:105E000090E080E0919581959109DF91CF911F916C +:105E10000F910895CF3FDC0741F30E94BF1A801B0A +:105E2000910B8C179D0708F38EEF9FEFEECF0F932A +:105E30001F93CF93DF93EC0184EC8093BC000E940E +:105E4000BF1A8C018091BC0087FF08C08091BB0005 +:105E500090E0DF91CF911F910F910895CF3FDC0724 +:105E600089F30E94BF1A801B910B8C179D0750F37A +:105E70008EEF9FEFEECF0F931F93CF93DF93EC0145 +:105E800084E88093BC000E94BF1A8C018091BC0002 +:105E900087FF08C08091BB0090E0DF91CF911F91F8 +:105EA0000F910895CF3FDC0789F30E94BF1A801B32 +:105EB000910B8C179D0750F38EEF9FEFEECFCF9293 +:105EC000DF92EF92FF920F931F93CF93DF936B01BB +:105ED0008A017901B9010E946E2EE6010C0D1D1D8B +:105EE000C017D10761F424E92093BC00DF91CF9162 +:105EF0001F910F91FF90EF90DF90CF90089597FD45 +:105F0000F2CFB70189910E94E82EEACFCF92DF92BB +:105F1000EF92FF920F931F93CF93DF93C62F6A01E7 +:105F20007901B8010E946E2E97FD0CC0B8018C2F2C +:105F30000E94E82EE601EC0CFD1CCE15DF0511F0E9 +:105F400097FF0CC024E92093BC00DF91CF911F91F3 +:105F50000F91FF90EF90DF90CF900895B801899155 +:105F60000E94E82EEACFCF92DF92EF92FF920F933A +:105F70001F93CF93DF93F82EE62EEA016901B80153 +:105F80000E946E2E97FD15C0B8018E2D0E94E82E3E +:105F900097FD0FC0B8018F2D81600E946E2EF12CED +:105FA000E12C21E0C21AD108EC14FD0400F597FFA2 +:105FB00011C024E92093BC001816190614F490E0CF +:105FC00080E0DF91CF911F910F91FF90EF90DF90D4 +:105FD000CF900895C8010E94172F97FD04C0FE01BD +:105FE000EE0DFF1D80832FEFE21AF20ADDCF97FD41 +:105FF000E0CFC8010E943B2F97FDDBCFCC0DDD1D0C +:106000008883D7CF84E98093BC0008958EE14A9BB2 +:1060100002C08150E1F74A9BFECF08955A9880E272 +:106020008A95F1F75A9A0895FC013BE03A95F1F709 +:1060300098E020E080E031E040E14A95F1F7880FF8 +:106040004A9B02C08160232742E04A95F1F7000095 +:1060500040E14A95F1F7915079F790E19A95F1F77F +:1060600099B132E03A95F1F7000040E14A95F1F735 +:1060700092FB992790F992272081920F908308959F +:10608000EF92FF920F931F93CF93DF930F92CDB7B1 +:10609000DEB719828C017C01E60EF11C0E151F057E +:1060A00061F481E09981911180E00F90DF91CF91AF +:1060B0001F910F91FF90EF9008950E940630CE013E +:1060C00001960E941430F80181938F01E7CF529A14 +:1060D0005A9A089552985A9AEA9AE9E6F0E080812D +:1060E0008F7C808308956150770B91E001C0990FF8 +:1060F0006A95EAF720E031E0911108C0222391F07F +:106100005A9A80E28A95F1F75A980895492F4823C0 +:1061100039F05A9A232740E24A95F1F79695ECCF49 +:106120005A98F9CF5A98EDCFFF920F931F93CF93C0 +:10613000DF93EC018C01060F111DC017D10731F45C +:10614000DF91CF911F910F91FF900895F9900E94D8 +:106150000E3068E08F2D0E947330EFCF1F920F92A8 +:106160000FB60F921124EF92FF920F931F932F936C +:106170003F934F935F936F937F938F939F93AF93CF +:10618000BF93EF93FF93CF93DF930F92CDB7DEB71B +:1061900019820E940630CE0101960E941430A82F69 +:1061A000A695A695A695282F229525709A2F9570CD +:1061B000290F922F937026952695920F9827977006 +:1061C0008981982B09F075C0A83008F072C080E171 +:1061D0008A95F1F75A9A529AB2E0BA95F1F700C04F +:1061E0005A98EA2EF12CEAE0AE9FD0011124AE5F5E +:1061F000BE4F1896ED91FC9119973097B1F06091D0 +:10620000FC017091FD0116962D913C911797260F78 +:10621000371F13968D919C911497680F791F1596CF +:106220004C91159712968C9109958AE08E9DF001FC +:106230008F9DF00D1124EE5FFE4F6581662351F0B6 +:106240002091FC013091FD0186819781820F931F7F +:106250000E9494300E940E30F0E1FA95F1F75A98BE +:1062600052985A9A80E18A95F1F78AE08E9D8001D2 +:106270008F9D100D11240E5F1E4FD80112966C9148 +:106280001297662371F12091FC013091FD01139664 +:106290008D919C91820F931F0E944030D801ED9107 +:1062A000FC91882311F088E001C082E080830E9485 +:1062B00006300F90DF91CF91FF91EF91BF91AF9199 +:1062C0009F918F917F916F915F914F913F912F910E +:1062D0001F910F91FF90EF900F900FBE0F901F90A6 +:1062E0001895ED91FC91DFCF0F931F93CF93DF9320 +:1062F000EC0108970CF0A9C08AE08C9FF0018D9FFB +:10630000F00D1124EE5FFE4F80819181892B09F4FD +:106310009CC0F894529A5A9885E08A95F1F700004B +:106320008C2F869585709C2F9570890F982F937070 +:1063300086958695890F8E0193E0000F111F9A951F +:10634000E1F7082B0E940E3000C068E0802F0E9409 +:106350007330A0E1AA95F1F752985A9A4A9B27C048 +:1063600087E090E04A9925C08AE08C9F80018D9F4C +:10637000100D11240E5F1E4FF80165816623A1F1F7 +:106380002091FC013091FD0186819781820F931F3E +:106390000E944030811128C0529A5A9AD801ED913A +:1063A000FC9182E08083789482E090E016C000C087 +:1063B000D5CF0197B9F4529A5A9A8AE08C9FF0018E +:1063C0008D9FF00D1124EE5FFE4F0190F081E02DC6 +:1063D00081E08083789481E090E0DF91CF911F91FC +:1063E0000F91089500C0BECF0E940630B0E2BA956A +:1063F000F1F75A98529AE0E1EA95F1F78AE08C9F1A +:10640000F0018D9FF00D1124EE5FFE4F6281662337 +:1064100051F02091FC013091FD0183819481820F24 +:10642000931F0E9494300E940E308AE08C9FF001EE +:106430008D9FF00D1124EE5FFE4F0190F081E02D55 +:106440001082789490E080E0C8CF84E090E0C5CFDF +:10645000AA1BBB1B51E107C0AA1FBB1FA617B7078A +:1064600010F0A61BB70B881F991F5A95A9F78095A6 +:106470009095BC01CD010895991B79E004C0991F46 +:10648000961708F0961B881F7A95C9F7809508958E +:1064900097FB072E16F4009407D077FD09D00E94D1 +:1064A000283207FC05D03EF4909581959F4F0895C2 +:1064B000709561957F4F0895EE0FFF1F0590F49141 +:1064C000E02D099469279627692778278727782759 +:1064D0000895FB01DC0102C005900D92415050402F +:1064E000D8F70895FB01DC0104C08D91019080195B +:1064F00021F441505040C8F7881B990B0895FB01C7 +:10650000DC0102C001900D9241505040D8F708952F +:10651000F999FECF92BD81BDF89A992780B508956B +:10652000A6E1B0E044E050E00C94C232A8E1B0E053 +:1065300042E050E00C94C232262FF999FECF92BD72 +:1065400081BDF89A019700B4021639F01FBA20BD38 +:106550000FB6F894FA9AF99A0FBE08950396272F6A +:106560000E949D320E949C32252F0E949D32242F32 +:106570000C949D320196272F0E949D320C949C32E0 +:10658000DC01CB01FC01F999FECF06C0F2BDE1BDF3 +:10659000F89A319600B40D9241505040B8F70895E2 +:1065A0000E94D7326894B1110C94663308950E940A +:1065B0004B3388F09F5798F0B92F9927B751B0F017 +:1065C000E1F0660F771F881F991F1AF0BA95C9F777 +:1065D00014C0B13091F00E946533B1E008950C947D +:1065E0006533672F782F8827B85F39F0B93FCCF330 +:1065F000869577956795B395D9F73EF490958095F4 +:10660000709561957F4F8F4F9F4F0895E89409C013 +:1066100097FB3EF490958095709561957F4F8F4FD5 +:106620009F4F9923A9F0F92F96E9BB279395F695EB +:10663000879577956795B795F111F8CFFAF4BB0F69 +:1066400011F460FF1BC06F5F7F4F8F4F9F4F16C0CD +:10665000882311F096E911C0772321F09EE8872F57 +:10666000762F05C0662371F096E8862F70E060E013 +:106670002AF09A95660F771F881FDAF7880F96958C +:10668000879597F9089557FD9058440F551F59F075 +:106690005F3F71F04795880F97FB991F61F09F3F0F +:1066A00079F087950895121613061406551FF2CF38 +:1066B0004695F1DF08C0161617061806991FF1CF88 +:1066C00086957105610508940895E894BB276627AF +:1066D0007727CB0197F908950E947F330C94F0330C +:1066E0000E94E23338F00E94E93320F0952311F044 +:1066F0000C94D9330C94DF3311240C9466330E942C +:10670000433370F3959FC1F3950F50E0551F629F7F +:10671000F001729FBB27F00DB11D639FAA27F00DFA +:10672000B11DAA1F649F6627B00DA11D661F829F21 +:106730002227B00DA11D621F739FB00DA11D621F06 +:10674000839FA00D611D221F749F3327A00D611D23 +:10675000231F849F600D211D822F762F6A2F112405 +:106760009F5750409AF0F1F088234AF0EE0FFF1F38 +:10677000BB1F661F771F881F91505040A9F79E3F8F +:10678000510580F00C94D9330C9466335F3FE4F3E9 +:10679000983ED4F3869577956795B795F795E795E5 +:1067A0009F5FC1F7FE2B880F911D9695879597F9EE +:1067B000089597F99F6780E870E060E008959FEF83 +:1067C00080EC089500240A94161617061806090688 +:1067D000089500240A941216130614060506089557 +:1067E000092E0394000C11F4882352F0BB0F40F4DF +:1067F000BF2B11F460FF04C06F5F7F4F8F4F9F4F1F +:106800000895F894FFCF741074107D107D107F10E0 +:106810007D107D107D107410741084107D107D101B +:10682000841058128012231480122314B312D4122D +:106830002314D213DF13731F731FCC1FCC1FFE1F33 +:10684000A61FA61FA61F1820892099209920C82CB2 +:10685000CC2C102D212D2C2D4B2D4E2D7F2DA02DF0 +:106860001E2D1E2DAB2DAE2DB22DD82DFB2DFE2DA8 +:04687000002E252EA3 +:1068740001013C0200000001000000003C02000095 +:106884000005010000003C020000000106000000B9 +:106894003C0200000001070000003C020408000064 +:1068A400000000003C02080C0000000000003C0254 +:1068B400011400000000000036323331F7F6FF66A1 +:1068C40097C634350000000000012F08180DF70C9E +:1068D400F30CEF0C2E08F4F5010021007F220003D5 +:1068E400018000004A004A4A01F6F731333236FF8C +:1068F4004C415945520042617365200047616D6502 +:1069040020005261697365004C6F776572004C4FCB +:10691400434B0043617073004E756D005363726C9A +:1069240000202020202000534F4C415200544D5051 +:10693400535400818283E200E900EA00B500B60006 +:10694400B700CD008301CC008A0192019401210299 +:10695400230224022502260227022A02B300B400DD +:106964006F0070000603060806010606B50200FF64 +:106974000100010000FFFF0000010001FF0000080A +:10698400101818100800000102020202020202029A +:10699400020240227B49012701AC009E0BB70BD7B2 +:0269A4000B00E6 +:00000001FF diff --git a/keyboards/splitkb/kyria/keymaps/harvester/config.h b/keyboards/splitkb/kyria/keymaps/harvester/config.h new file mode 100644 index 000000000000..4b19ad01c403 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/config.h @@ -0,0 +1,119 @@ +/* Copyright 2022 Thomas Baart + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define SPLIT_TRANSPORT_MIRROR +#define SPLIT_LAYER_STATE_ENABLE +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_MODS_ENABLE + +#ifdef TAPPING_TERM + #undef TAPPING_TERM + #define TAPPING_TERM 200 +#endif + +#ifdef ENCODER_RESOLUTION + #undef ENCODER_RESOLUTION + #define ENCODER_RESOLUTION 4 +#endif + +# ifdef RGB_MATRIX_ENABLE +//# define DRIVER_LED_TOTAL RGBLED_NUM +//# define RGB_MATRIX_SPLIT RGBLED_SPLIT + +# define RGB_MATRIX_KEYPRESSES // reacts to keypresses +// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) +// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects +# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended +//# define RGB_MATRIX_FRAMEBUFFER_EFFECTS +// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) +// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) +//# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 120 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash. +# define RGB_MATRIX_HUE_STEP 2 +# define RGB_MATRIX_SAT_STEP 8 +# define RGB_MATRIX_VAL_STEP 8 +# define RGB_MATRIX_SPD_STEP 10 + +/* Enable the animations you want/need. You may need to enable only a small number of these because * + * they take up a lot of space. Enable and confirm that you can still successfully compile your firmware. */ +// RGB Matrix Animation modes. Explicitly enabled +// For full list of effects, see: +// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects +# define ENABLE_RGB_MATRIX_ALPHAS_MODS +# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_BREATHING +# define ENABLE_RGB_MATRIX_BAND_SAT +# define ENABLE_RGB_MATRIX_BAND_VAL +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +# define ENABLE_RGB_MATRIX_CYCLE_ALL +# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +# define ENABLE_RGB_MATRIX_DUAL_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +# define ENABLE_RGB_MATRIX_RAINDROPS +# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +# define ENABLE_RGB_MATRIX_HUE_BREATHING +# define ENABLE_RGB_MATRIX_HUE_PENDULUM +# define ENABLE_RGB_MATRIX_HUE_WAVE +# define ENABLE_RGB_MATRIX_PIXEL_RAIN +# define ENABLE_RGB_MATRIX_PIXEL_FLOW +# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined +# define ENABLE_RGB_MATRIX_TYPING_HEATMAP +# define ENABLE_RGB_MATRIX_DIGITAL_RAIN +// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +# define ENABLE_RGB_MATRIX_SPLASH +# define ENABLE_RGB_MATRIX_MULTISPLASH +# define ENABLE_RGB_MATRIX_SOLID_SPLASH +# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH + +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_BREATHING +#endif + +#ifdef RGBLIGHT_ENABLE +# define RGBLIGHT_ANIMATIONS +# define RGBLIGHT_HUE_STEP 8 +# define RGBLIGHT_SAT_STEP 8 +# define RGBLIGHT_VAL_STEP 8 +# define RGBLIGHT_LIMIT_VAL 150 +#endif + +// Lets you roll mod-tap keys +#define IGNORE_MOD_TAP_INTERRUPT + +#define USB_POLLING_INTERVAL_MS 1 +#define QMK_KEYS_PER_SCAN 12 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 10 diff --git a/keyboards/splitkb/kyria/keymaps/harvester/encoder.c b/keyboards/splitkb/kyria/keymaps/harvester/encoder.c new file mode 100644 index 000000000000..9fe951b81e6b --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/encoder.c @@ -0,0 +1,53 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//Setting up what encoder rotation does. If your encoder can be pressed as a button, that function can be set in Via. + +#ifdef ENCODER_ENABLE + +bool encoder_update_user(uint8_t index, bool clockwise) { + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + if (clockwise) { + tap_code(KC_PGDOWN); + } else { + tap_code(KC_PGUP); + } + } + return true; +} + +#endif + +#if defined(ENCODER_MAP_ENABLE) + const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [_BASE] = { ENCODER_CCW_CW(KC_UP, KC_DOWN), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, + [_GAME] = { ENCODER_CCW_CW(KC_F11, KC_F12), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_FUN] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDOWN), ENCODER_CCW_CW(KC_HOME, KC_END) }, + [_MEDIA] = { ENCODER_CCW_CW(RGB_HUI, RGB_SAI), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_NUM] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, + [_MOD] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_F13, KC_F14) }, + [_SYM] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_MSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_HOME, KC_END) }, + [_NAV] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDOWN) }, +}; +#endif diff --git a/keyboards/splitkb/kyria/keymaps/harvester/enums.h b/keyboards/splitkb/kyria/keymaps/harvester/enums.h new file mode 100644 index 000000000000..71033e991855 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/enums.h @@ -0,0 +1,14 @@ +// [KYRIA layers Init] -------------------------------------------------------// +typedef enum { + _BASE, + _GAME, + _NAV, + _MSE, + _MEDIA, + _NUM, + _SYM, + _FUN, + _MOD +}KYRIA_LAYERS; + +extern enum KYRIA_LAYERS kyria_layers; diff --git a/keyboards/splitkb/kyria/keymaps/harvester/keymap.c b/keyboards/splitkb/kyria/keymaps/harvester/keymap.c new file mode 100644 index 000000000000..a3f9ddc54cdf --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/keymap.c @@ -0,0 +1,282 @@ +/* Copyright 2019 Thomas Baart + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include QMK_KEYBOARD_H +#include "enums.h" +#include "encoder.c" +#include "oled.c" + +// Aliases for readability +#define BASE TO(_BASE) +#define GAME TO(_GAME) + +#define SYM LT(_SYM,KC_ENT) +#define NAV LT(_NAV,KC_TAB) +#define FUN LT(_FUN,KC_DEL) +#define MSE LT(_MSE,KC_SPC) +#define MEDIA LT(_MEDIA,KC_ESC) +#define NUM LT(_NUM,KC_BSPC) +#define MOD MO(_MOD) +#define FUNG MO(_FUN) + +// Note: LAlt/Enter (ALT_ENT) is not the same thing as the keyboard shortcut Alt+Enter. +// The notation `mod/tap` denotes a key that activates the modifier `mod` when held down, and +// produces the key `tap` when tapped (i.e. pressed and released). + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * Base Layer: QWERTY + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_BASE] = LAYOUT( + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RSFT_T(KC_QUOT), + KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,A(KC_TAB), C(A(KC_TAB)), KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL, + KC_LGUI, KC_LALT, MEDIA, NAV, MSE, SYM, NUM, FUN, KC_RALT, KC_APP + ), + +/* + * Base Layer: Dvorak +* + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | ' " | , < | . > | P | Y | | F | G | C | R | L | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | O | E | U | I | | D | H | T | N | S |Ctrl/- _| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | ; : | Q | J | K | X | [ { |CapsLk| |F-keys| ] } | B | M | W | V | Z | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_GAME] = LAYOUT( + KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LSFT, KC_G, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, XXXXXXX, XXXXXXX, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL, + KC_ESC, KC_LALT, FUNG, MOD, KC_SPC, KC_ENT, KC_BSPC , KC_DEL, KC_RALT, KC_MUTE + ), + +/* + * Base Layer: Colemak DH + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | Q | W | F | P | B | | J | L | U | Y | ; : | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | R | S | T | G | | M | N | E | I | O |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | [ { |CapsLk| |F-keys| ] } | K | H | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_NAV] = LAYOUT( + XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, C(KC_Y), C(KC_V), C(KC_C), C(KC_X), C(KC_Z), C(KC_S), + XXXXXXX, C(KC_A), C(KC_S), XXXXXXX, C(KC_F), XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, + XXXXXXX, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX + ), + +/* + * Nav Layer: Media, navigation[] + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_MSE] = LAYOUT( + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, GAME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, + EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX + ), + +/* + * Sym Layer: Numbers and symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_MEDIA] = LAYOUT( + XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, + _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, KC_MUTE + ), + +/* + * Function Layer: Function keys + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | F9 | F10 | F11 | F12 | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_NUM] = LAYOUT( + XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_NUM, KC_0, KC_0, KC_DOT, KC_MINS, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX + ), + +/* + * Adjust Layer: Default layer settings, RGB + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | |QWERTY| | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SYM] = LAYOUT( + XXXXXXX, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, KC_UNDS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + +/* + * Layer template + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + + [_FUN] = LAYOUT( + XXXXXXX, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_LGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + NK_TOGG, XXXXXXX, KC_MENU, KC_TAB, KC_SPC, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX + ), + +/* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ + + [_MOD] = LAYOUT( + XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, BASE, + XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + NK_TOGG, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + +// /* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +}; + +/* The default OLED and rotary encoder code can be found at the bottom of qmk_firmware/keyboards/splitkb/kyria/rev1/rev1.c + * These default settings can be overriden by your own settings in your keymap.c + * For your convenience, here's a copy of those settings so that you can uncomment them if you wish to apply your own modifications. + * DO NOT edit the rev1.c file; instead override the weakly defined default functions by your own. + */ + +/* DELETE THIS LINE TO UNCOMMENT (1/2) + +#ifdef ENCODER_ENABLE +bool encoder_update_user(uint8_t index, bool clockwise) { + + if (index == 0) { + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} +#endif +DELETE THIS LINE TO UNCOMMENT (2/2) */ diff --git a/keyboards/splitkb/kyria/keymaps/harvester/oled.c b/keyboards/splitkb/kyria/keymaps/harvester/oled.c new file mode 100644 index 000000000000..fe3bb5ec0492 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/oled.c @@ -0,0 +1,96 @@ + /* Copyright 2020 Josef Adamcik + * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +//Sets up what the OLED screens display. + +#ifdef OLED_ENABLE +oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; } + +bool oled_task_user(void) { + if (is_keyboard_master()) { + // QMK Logo and version information + // clang-format off + static const char PROGMEM qmk_logo[] = { + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; + // clang-format on + + oled_write_P(qmk_logo, false); + oled_write_P(PSTR("Kyria rev1.0\n\n"), false); + + // Host Keyboard Layer Status + oled_write_P(PSTR("Layer: "), false); + switch (get_highest_layer(layer_state|default_layer_state)) { + case _BASE: + oled_write_P(PSTR("Base\n"), false); + break; + case _GAME: + oled_write_P(PSTR("Game\n"), false); + break; + case _NUM: + oled_write_P(PSTR("Num\n"), false); + break; + case _FUN: + oled_write_P(PSTR("Func\n"), false); + break; + case _MEDIA: + oled_write_P(PSTR("Media\n"), false); + break; + case _MOD: + oled_write_P(PSTR("Game+\n"), false); + break; + case _NAV: + oled_write_P(PSTR("Nav\n"), false); + break; + case _SYM: + oled_write_P(PSTR("Sym\n"), false); + break; + case _MSE: + oled_write_P(PSTR("Mouse\n"), false); + break; + default: + oled_write_ln_P(PSTR("NFI\n"), false); + } + oled_write_ln_P(PSTR("\n"), false); + // Write host Keyboard LED Status to OLEDs + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPLK"), led_usb_state.caps_lock); + oled_write_ln_P(PSTR(" "), false); + oled_write_ln_P(PSTR("NMLK"), led_usb_state.num_lock); + oled_write_ln_P(PSTR(" "), false); + oled_write_ln_P(PSTR("SCLK"), led_usb_state.scroll_lock); + oled_write_ln_P(PSTR(" "), false); + oled_write_ln_P(PSTR("NKRO"), keymap_config.nkro); + } else { + // clang-format off + static const char PROGMEM kyria_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + // clang-format on + oled_write_raw_P(kyria_logo, sizeof(kyria_logo)); + } + return false; +} +#endif diff --git a/keyboards/splitkb/kyria/keymaps/harvester/readme.md b/keyboards/splitkb/kyria/keymaps/harvester/readme.md new file mode 100644 index 000000000000..7401609f356b --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/readme.md @@ -0,0 +1,249 @@ +# Kyria's Default Keymap + +![KLE render of the default Kyria keymap with QWERTY as the base layer. Layers are shown in sublegends.](https://i.ibb.co/RQZx2dY/default-kyria2.jpg) + + +The default keymap contains 5 layers which allows it to include all keys found on an ANSI layout TKL keyboard plus media keys. +Hardware features of the Kyria such as OLEDs, rotary encoders and underglow are also supported. + +The five different layers are the following: +1. Base layer (QWERTY, Colemak-DH or Dvorak) +2. Navigation layer +3. Symbols/Numbers layer +4. Function layer +5. Adjust layer + +## Base layer(s) +``` +Base Layer: - + +,-------------------------------------------. ,-------------------------------------------. +| Tab | - | - | - | - | - | | - | - | - | - | - | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| - | - | - | - | - | | - | - | - | - | - |Ctrl/ - | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | - | - | - | - | - | [ { |CapsLk| |F-Keys| ] } | - | - | - | - | - | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` +Three different well-known keyboard layouts are provided to fill in the placeholder `-` keys: QWERTY, Colemak-DH, and Dvorak. The default layer can be changed at runtime, more info on that in the section on the [adjust layer](#adjust-layer). + +For the rest of this write-up, the base layer will be assumed to be QWERTY and will be used as a reference to describe physical keys, e.g. “B key” vs, the much more verbose, “lower inner index key”. + +``` +Base Layer: QWERTY + +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Aside from variations in the alpha cluster, the rest of the base keys remain the same and are designed to feel familiar. + +![Step-by-step animation of the transformation of an ortholinear TKL to a Kyria](https://i.imgur.com/uVDCOek.gif) + +
+After making transformations to the classic ANSI US QWERTY TKL 60% to arrive to the layout of the Kyria, as illustrated in the animation above, the result looks like this: + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Cap Lk | A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | | | | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | LCtrl| LGUI | LAlt | Space| | | | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +First thing to notice is the presence of blank keys. To fill in the blank keys above the Space keys, we can take inspiration from other split keyboards featuring an extra inner index column on each half. A common mapping for those kind of keys are the bracket keys that got removed in the fourth step of the animated transformation. The thumb keys besides Spaces is prime real estate for dedicated layer-switching keys. It doesn't matter on which side is assigned the sym-layer-switch key but it helps to keep the nav-layer-switch on the left in order to keep the arrow keys on the right side like on a classic keyboard, so we'll put nav on the left and sym on the right. We'll address the remaining blank thumb keys later. + +The base layer is starting to form but there remains some flaws. One glaring issue is the position of Control. Control is a very commonly used function but the key on which it sits right now is way too tucked in under the hand to be able to press it comfortably with either the thumb or the pinky from resting position. In fact, installing a rotary encoder there is a common move among Kyria users and I guarantee you that activating Control by holding down a rotary encoder does not spark joy. Instead, let's employ a popular trick that involves remapping the current Caps Lock key, which is positioned at a comfortable position on the keyboard, to Control. + +We can go further though; a variant of this trick makes the Control key produce Escape when tapped. This is called a “modtap”. There is no use to tapping Control by itself without chording it with another key and there is no use to holding down the Esc key so why not combine the two into a single key? + +All of this leaves us with three blank keys. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { | | | | ] } | N | M | , < | . > | / ? | RShift | +`--------+-------------+--------------------+------+------| |------+------+--------------------+------+---------------' + | | LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +These keys are not easily reachable while touch typing (that is, not reachable without picking up your hand) and should thus be associated with functions that you are not likely to be typed within a stream of text. The idea is that if you have to pick up your hand to hit a key, you want it to be at a time when you are likely to be pausing your interaction with the machine, rather than in the midst of a flurry of typing. They're thus well suited for accessing the adjust layer and the function layer. We can also toss in Caps Lock even though it is an editing-type function that gets used within a stream of text because shouting in ALL-CAPS should be a deliberate action. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +The next glaring issue is the absence of an Enter key on the current base layer this far. Enter is a very frequently used key so it deserves to be placed at a good spot in the keymap. The best way to insert it in the keymap with minimal changes to the current layout is to use modtaps. A tempting solution is to turn the RShift key into a RShift/Enter modtap but that can result in chat messages sent too frustratingly early when you're not used to it. Using GUI is also sub-optimal because tapping the GUI modifier actually has a use as opposed to taps of the Control or the Shift key. Pressing and releasing the GUI key by itself opens the App menu in many desktop environments. The natural choice is thus LAlt/Enter. That way, Enter is 1u away from resting thumb position and is unlikely to get accidentally activated because Alt is very rarely used in the midst of prose. + +Finally, we're one Quality-Of-Life update away from the actual base layer. Ctrl/' " not only preserves symmetry in the keymap with Ctrl/Esc but also helps balance the load between your pinkies and invites you to use both hands instead of contortions. Perhaps more importantly, it also frees you from the necessity of picking up your hand, breaking touch typing position and pressing a pinky key with your ring finger in order to execute Ctrl+A or Ctrl+Z. That becomes even more important on a board with such an aggressive pinky columnar stagger like the Kyria. + + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +
+ +## Navigation layer + +``` +Nav Layer: Media, navigation + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +This is where you'll find all the keys that are generally between the main block of a classic keyboard and the numpad in addition to media controls and modifiers on easy access on the home row for fast and comfortable chording with navigation keys. + +Useful mnemonics: +- “GACS” to remember the order of the modifiers on the left-hand home row +- Scroll Lock is on the same key as Caps Lock because they're both locks +- Delete is on the same key as Backspace because they both erase characters +- Home is the leftmost position on the current line so it is above . Same logic applies for End. +- Media Previous = ⏮, Media Next = ⏭ +- Page Up, Page Down and Volume Up, Volume Down are positioned like the main Up and Down keys. + +## Sym layer +``` +Sym Layer: Numbers, symbols + +,-------------------------------------------. ,-------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +The top row is the unshifted num row, the home row of the layer is the shifted num row and the bottom row contains the hyphen `-` and the underscore `_` on the best lower row spot because of how frequent they are as well as redundant symbols that are already present on the base layer but are reproduced here to avoid juggling back and forth between base, shift, and sym when typing a string of symbols. + +The layout of the first two rows needs no introduction, you're already used to them but it's worth looking into the structure of the bottom row. + +The two halves are mirrored in a sense. On the right, you can find , . / at their usual spots with the addition of Shift+/=? to the right of the / key to remove the need to press simultaneously Sym and a Shift key to access `?`. + +Now, if you look at the left side, you'll notice that the mirror of , is ;, the mirror of . is : and the mirror of / is \\. The same logic used for Shift+/=? also applies to Shift+\\=|. + +In case you wish to combine Shift with a symbol key anyways, you can hold down Shift on the base layer with your pinky, activate Sym with your right thumb and while still holding down the Shift key, tap your desired symbol key. Same thing if you need Ctrl+Digit. + +## Function layer +``` +Function Layer: Function keys + +,-------------------------------------------. ,-------------------------------------------. +| | F9 | F10 | F11 | F12 | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | F1 | F2 | F3 | F4 | | | | | | | | | | | | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +In a similar fashion to the nav layer, pressing down `FKEYS` with the right thumb enables a numpad of function keys on the opposite hand and modifiers on the right-hand home row. Once again, mirror symmetry is leveraged in this keymap for the order of the right-hand modifiers. + +The Alt modifier, despite being situated on the right half of the keyboard is *not* `KC_RALT`, it is `KC_LALT`. `KC_RALT` is actually the AltGr key which generally acts very differently to the left Alt key. Keyboard shortcuts involving AltGr+F# are rare and infrequent as opposed to the much more common Alt+F# shortcuts. Consequently, `KC_LALT` was chosen for the function layer. + +Since there are more than 10 function keys, the cluster of F-keys does not follow the usual 3×3+1 numpad arrangement. + + +## Adjust layer +``` +Adjust Layer: Default layer settings, RGB + +,-------------------------------------------. ,-------------------------------------------. +| | | |QWERTY| | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Default layer settings on the left and various RGB underglow controls on the right. + +The default layer settings are lined up on the middle finger column because the home middle finger key is D on QWERTY (like the “D” in “Dvorak”) and the lower middle finger key is C on QWERTY (like the “C” in “Colemak”). I can hear you say that “QWERTY” doesn't start with “E” but Dvorak and Colemak were already aligned in a column so the QWERTY may as well join the formation. + +NOTE: The default layer settings set by those keys are *NOT* stored in EEPROM and thus do not persist through boots. If you wish to change the default layer in a non-volatile manner, either change the order of the layers in the firmware, for example like so if you want to set Dvorak as the new default: +```c +enum layers { + _DVORAK = 0, + _QWERTY, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST +}; +``` +or re-define the `QWERTY`, `COLEMAK` and `DVORAK` keys to point to custom keycodes starting on `SAFE_RANGE` and calling the `set_single_persistent_default_layer` function inside of `process_record_user`. + +## Hardware Features + +### Rotary Encoder +The left rotary encoder is programmed to control the volume whereas the right encoder sends PgUp or PgDn on every turn. + +### OLEDs +The OLEDs display the current layer at the top of the active layers stack, the Kyria logo and lock status (caps lock, num lock, scroll lock). + +### Underglow +The underglow LEDs should be red. + +## Going further… + +This default keymap can be used as is, unchanged, as a daily driver for your Kyria but you're invited to treat your keymap like a bonsai. At the beginning, it's just like the default keymap but from time to time, you can tweak it a little. Cut a little key here, let another combo grow there. Slowly but surely it will be a unique keymap that will fit you like a glove. + +Check out the #keymap-ideas channel on the official SplitKB Discord server for inspiration. diff --git a/keyboards/splitkb/kyria/keymaps/harvester/rules.mk b/keyboards/splitkb/kyria/keymaps/harvester/rules.mk new file mode 100644 index 000000000000..928720901271 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/harvester/rules.mk @@ -0,0 +1,22 @@ +OLED_ENABLE = yes +OLED_DRIVER = SSD1306 # Enables the use of OLED displays +VIA_ENABLE = yes +BOOTMAGIC_ENABLE = lite # Enable Bootmagic Lite +EXTRAKEY_ENABLE = yes # Audio control and System control +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # USB Nkey Rollover +OLED_ENABLE = yes +ENCODER_ENABLE = yes # Enables the use of one or more encoders +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +KEY_LOCK_ENABLE = no +WPM_ENABLE = no +RGB_MATRIX_ENABLE = yes +CONSOLE_ENABLE = yes # Console for debug +MOUSEKEY_ENABLE = yes # Mouse keys +TAP_DANCE_ENABLE = no +SWAP_HANDS_ENABLE = yes +LTO_ENABLE = no +ENCODER_MAP_ENABLE = yes +GRAVE_ESC_ENABLE = no +SPLIT_KEYBOARD = yes +DEBOUNCE_TYPE = asym_eager_defer_pk diff --git a/platforms/chibios/boards/QMK_KB2040/board/board.mk b/platforms/chibios/boards/QMK_KB2040/board/board.mk new file mode 100644 index 000000000000..2222644cf1d3 --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/board/board.mk @@ -0,0 +1,9 @@ +# List of all the board related files. +BOARDSRC = $(CHIBIOS)/os/hal/boards/RP_PICO_RP2040/board.c + +# Required include directories +BOARDINC = $(CHIBIOS)/os/hal/boards/RP_PICO_RP2040 + +# Shared variables +ALLCSRC += $(BOARDSRC) +ALLINC += $(BOARDINC) diff --git a/platforms/chibios/boards/QMK_KB2040/configs/board.h b/platforms/chibios/boards/QMK_KB2040/configs/board.h new file mode 100644 index 000000000000..2f300b7b8b50 --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/configs/board.h @@ -0,0 +1,12 @@ +// Copyright 2022 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next "board.h" + +#undef BOARD_RP_PICO_RP2040 +#define BOARD_KB2040 + +#undef BOARD_NAME +#define BOARD_NAME "Adafruit KB2040" diff --git a/platforms/chibios/boards/QMK_KB2040/configs/chconf.h b/platforms/chibios/boards/QMK_KB2040/configs/chconf.h new file mode 100644 index 000000000000..d53f57edd943 --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/configs/chconf.h @@ -0,0 +1,13 @@ +// Copyright 2022 Stefan Kerkmann +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define CH_CFG_SMP_MODE TRUE +#define CH_CFG_ST_RESOLUTION 32 +#define CH_CFG_ST_FREQUENCY 1000000 +#define CH_CFG_INTERVALS_SIZE 32 +#define CH_CFG_TIME_TYPES_SIZE 32 +#define CH_CFG_ST_TIMEDELTA 20 + +#include_next diff --git a/platforms/chibios/boards/QMK_KB2040/configs/config.h b/platforms/chibios/boards/QMK_KB2040/configs/config.h new file mode 100644 index 000000000000..5702b84e12bf --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/configs/config.h @@ -0,0 +1,14 @@ +// Copyright 2022 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#ifndef I2C_DRIVER +# define I2C_DRIVER I2CD2 +#endif +#ifndef I2C1_SDA_PIN +# define I2C1_SDA_PIN D2 +#endif +#ifndef I2C1_SCL_PIN +# define I2C1_SCL_PIN D3 +#endif diff --git a/platforms/chibios/boards/QMK_KB2040/configs/halconf.h b/platforms/chibios/boards/QMK_KB2040/configs/halconf.h new file mode 100644 index 000000000000..d7a58f0ea694 --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/configs/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2022 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/platforms/chibios/boards/QMK_KB2040/configs/mcuconf.h b/platforms/chibios/boards/QMK_KB2040/configs/mcuconf.h new file mode 100644 index 000000000000..df1bb9029c31 --- /dev/null +++ b/platforms/chibios/boards/QMK_KB2040/configs/mcuconf.h @@ -0,0 +1,95 @@ +/* + ChibiOS - Copyright (C) 2006..2021 Giovanni Di Sirio + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef MCUCONF_H +#define MCUCONF_H + +/* + * RP2040_MCUCONF drivers configuration. + * + * IRQ priorities: + * 3...0 Lowest...Highest. + * + * DMA priorities: + * 0...1 Lowest...Highest. + */ + +#define RP2040_MCUCONF + +/* + * HAL driver system settings. + */ +#define RP_NO_INIT FALSE +#define RP_CORE1_START FALSE +#define RP_CORE1_VECTORS_TABLE _vectors +#define RP_CORE1_ENTRY_POINT _crt0_c1_entry +#define RP_CORE1_STACK_END __c1_main_stack_end__ + +/* + * IRQ system settings. + */ +#define RP_IRQ_SYSTICK_PRIORITY 2 +#define RP_IRQ_TIMER_ALARM0_PRIORITY 2 +#define RP_IRQ_TIMER_ALARM1_PRIORITY 2 +#define RP_IRQ_TIMER_ALARM2_PRIORITY 2 +#define RP_IRQ_TIMER_ALARM3_PRIORITY 2 +#define RP_IRQ_UART0_PRIORITY 3 +#define RP_IRQ_UART1_PRIORITY 3 +#define RP_IRQ_SPI0_PRIORITY 2 +#define RP_IRQ_SPI1_PRIORITY 2 +#define RP_IRQ_USB0_PRIORITY 3 +#define RP_IRQ_I2C0_PRIORITY 2 +#define RP_IRQ_I2C1_PRIORITY 2 + +/* + * ADC driver system settings. + */ +#define RP_ADC_USE_ADC1 FALSE + +/* + * SIO driver system settings. + */ +#define RP_SIO_USE_UART0 FALSE +#define RP_SIO_USE_UART1 FALSE + +/* + * SPI driver system settings. + */ +#define RP_SPI_USE_SPI0 TRUE +#define RP_SPI_USE_SPI1 FALSE +#define RP_SPI_SPI0_RX_DMA_CHANNEL RP_DMA_CHANNEL_ID_ANY +#define RP_SPI_SPI0_TX_DMA_CHANNEL RP_DMA_CHANNEL_ID_ANY +#define RP_SPI_SPI1_RX_DMA_CHANNEL RP_DMA_CHANNEL_ID_ANY +#define RP_SPI_SPI1_TX_DMA_CHANNEL RP_DMA_CHANNEL_ID_ANY +#define RP_SPI_SPI0_DMA_PRIORITY 1 +#define RP_SPI_SPI1_DMA_PRIORITY 1 +#define RP_SPI_DMA_ERROR_HOOK(spip) + +/* + * I2C driver system settings. + */ +#define RP_I2C_USE_I2C0 FALSE +#define RP_I2C_USE_I2C1 TRUE +#define RP_I2C_BUSY_TIMEOUT 50 +#define RP_I2C_ADDRESS_MODE_10BIT FALSE + +/* + * USB driver system settings. + */ +#define RP_USB_USE_USBD0 TRUE +#define RP_USB_FORCE_VBUS_DETECT TRUE +#define RP_USE_EXTERNAL_VBUS_DETECT FALSE +#define RP_USB_USE_SOF_INTR TRUE +#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE + +#endif /* MCUCONF_H */ diff --git a/reviung_reviung41_harvester.hex b/reviung_reviung41_harvester.hex new file mode 100644 index 000000000000..d8630f1cc1dd --- /dev/null +++ b/reviung_reviung41_harvester.hex @@ -0,0 +1,1378 @@ +:100000000C94F4030C942C040C942C040C942C04E9 +:100010000C942C040C942C040C942C040C942C04A0 +:100020000C942C040C942C040C9445210C94012168 +:100030000C9442220C942C040C942C040C942C044C +:100040000C942C040C942C040C942C040C942C0470 +:100050000C942C040C941E220C942C040C942C0450 +:100060000C942C040C942C040C942C040C942C0450 +:100070000C942C040C942C040C942C040C942C0440 +:100080000C942C040C942C040C942C040C942C0430 +:100090000C942C040C942C040C942C040C942C0420 +:1000A0000C942C040C942C040C942C040A0180FF56 +:1000B000FFFF000000000A01BFFFFFFF000000007B +:1000C0000A0115FFFFFF000000000A01AAFFFFFF61 +:1000D000000000000A01D5FFFFFF000000000A0138 +:1000E00055FFFFFF000000000A0100FFFFFF0000B6 +:1000F00000000A010000FFFF000000000A0100FFED +:10010000FFFF0000000005010980A101850319011E +:100110002AB700150126B700950175108100C005AA +:100120000C0901A101850419012AA002150126A0CC +:1001300002950175108100C005010906A10185061F +:10014000050719E029E715002501950875018102C9 +:100150000507190029EF1500250195F075018102A9 +:100160000508190129059505750191029501750389 +:100170009101C00660FF0961A1010962150026FF17 +:10018000009520750881020963150026FF0095205F +:1001900075089102C005010906A101050719E029AA +:1001A000E715002501950875018102950175088103 +:1001B000010507190029FF150026FF00950675089F +:1001C0008100050819012905950575019102950120 +:1001D00075039101C0000000000000000000000055 +:1001E000000000000000000000000000000000000F +:1001F0000000000000000000007E0F00D4FFFFFFA1 +:10020000C70000007800000000000000002A2B2832 +:1002100000000000000000000000000000000000DE +:1002200029000000002C1E342021222434262725FA +:100230002E362D3738271E1F202122232425263332 +:1002400033362E37381F0405060708090A0B0C0D34 +:100250000E0F101112131415161718191A1B1C1D46 +:100260002F3130232D350405060708090A0B0C0D24 +:100270000E0F101112131415161718191A1B1C1D26 +:100280002F3130354CFC00F200E800DE00D400CA0B +:1002900000C000B600AC0000001E0F0500047F3F48 +:1002A0001F643214643214783C1E1E140A050001C7 +:1002B0000101010101010101020202020202020226 +:1002C00002030303030303030304040404040404F8 +:1002D00005050505050606060606070707070708BC +:1002E000080808090909090A0A0A0B0B0B0C0C0C6F +:1002F0000D0D0D0E0E0E0F0F0F1010111111121209 +:1003000013131414151516161717181819191A1A85 +:100310001B1B1C1D1D1E1E1F2020212222232424E6 +:10032000252626272829292A2B2C2D2D2E2F303122 +:100330003232333435363738393A3B3C3D3E3F4034 +:100340004142434445464748494A4C4D4E4F50511F +:100350005354555658595A5B5D5E5F6162646566D9 +:1003600068696B6C6D6F7072737577787A7B7D7E60 +:100370008082838587888A8C8E8F91939596989AB0 +:100380009C9EA0A2A3A5A7A9ABADAFB1B3B5B7BAC8 +:10039000BCBEC0C2C4C6C9CBCDCFD1D4D6D8DBDD9C +:1003A000DFE2E4E7E9EBEEF0F3F5F8FAFDFFFFAA90 +:1003B0007F55402223252628292A2C2D2F30323301 +:1003C0003536383A3B3D3E4042434547494A4C4E1C +:1003D0005051535557595A5C5E6062646668696B48 +:1003E0006D6F71737577797B7D7F81838587898A4E +:1003F0008C8E90929496989A9C9E9FA1A3A5A7A854 +:10040000AAACAEAFB1B3B4B6B8B9BBBCBEBFC1C283 +:10041000C3C5C6C7C9CACBCCCDCED0D1D2D2D3D416 +:10042000D5D6D7D7D8D9D9DADADBDBDBDCDCDCDC34 +:10043000DCDDDDDDDDDCDCDCDCDCDBDBDBDADAD902 +:10044000D9D8D7D7D6D5D4D3D2D2D1D0CECDCCCB84 +:10045000CAC9C7C6C5C3C2C1BFBEBCBBB9B8B6B4A2 +:10046000B3B1AFAEACAAA8A7A5A3A19F9E9C9A9832 +:10047000969492908E8C8A89878583817F7D7B7903 +:10048000777573716F6D6B6968666462605E5C5AE4 +:100490005957555351504E4C4A4947454342403EA7 +:1004A0003D3B3A3836353332302F2D2C2A29282639 +:1004B000252322167C14001A000800150017002BB3 +:1004C0002204001600070009000A0000571D001B47 +:1004D000000600190005001C0018000C0012001393 +:1004E0000031000B000D000E000F003300343211FC +:1004F0000010003600370038000157E7434C422C0B +:10050000462A44284500002B00170014001A000852 +:10051000001500E1000A000400160007000900E0D1 +:10052000001D001B000600190005001C0018000C2F +:1005300000120013002A000B000D000E000F003304 +:1005400000340011001000360037003800E40029A4 +:100550000027522C002800E60000003500000000B3 +:100560000000000000015201000401160100000912 +:100570000100002F021D011B010601190100001CD2 +:1005800001190106011B011D01160139005000511E +:100590000052004F00000049004A004E004B004D41 +:1005A000003002E300010028004C000000000000C1 +:1005B00000000000000808150800000100000016F7 +:1005C0000A00000000000000000000000000000021 +:1005D0000000002078217823782578277800000013 +:1005E00000AC00AA00A900AB000000000000000061 +:1005F0000000000000000001000000AE00AD00A8F7 +:1006000000000000002F002400250026003000001C +:100610000033002100220023002E002F0035001E91 +:10062000001F00200031000000000000000000005A +:100630000000005300E500E400E600E300000000D5 +:100640007C00000000000000003000370027002D73 +:100650000001000000000000002F022402250226F5 +:10066000023002000033022102220223022E020085 +:100670000035021E021F02200231020000000000AD +:10068000000000000000000000E500E400E600E3D8 +:100690000000000000000000000000000000002634 +:1006A0000227022D0200000100000000004500406A +:1006B00000410042004600000044003D003E003F73 +:1006C000004700000043003A003B003C00480000A7 +:1006D000000000000000000000007C0000E500E4D5 +:1006E00000E600E300000000000000000000000041 +:1006F00000037C76002B00010000000000000000D9 +:1007000000000000000000000000000000000000E9 +:1007100000010000000000000000000100010001D5 +:100720000000000000000000000000000000520077 +:100730000000000000000000000000007C0000003D +:100740000000000000000000000100280000000080 +:1007500000000009025B00030100A0FA0904000088 +:1007600001030101000921110100012240000705D8 +:1007700081030800010904010002030000000921AF +:100780001101000122220007058203200001070554 +:1007900003032000010904020001030000000921F5 +:1007A00011010001226D00070584032000011201E0 +:1007B0000002000000080778CBDC01000102000104 +:1007C0001403720065007600690075006E00670012 +:1007D0003400310000000C036700740069007000F1 +:1007E000730000000403090411241FBECFEFDAE0F8 +:1007F000DEBFCDBF04B603FE18C0809129039091DF +:100800002A03A0912B03B0912C038730904BA74073 +:10081000B04B59F41092290310922A0310922B0323 +:1008200010922C03E0E0F8E3099523E0AAEBB1E095 +:1008300001C01D92A932B207E1F711E0A0E0B1E0DA +:10084000E8E4F5E502C005900D92AA3BB107D9F79F +:100850000E9469220C94422A0C940000E8EDF0E01A +:1008600080818E7F80831092E2001092DA001092D5 +:10087000E100A0EEB0E08C9181608C9380818F7755 +:10088000808319BCA7EDB0E08C918E7F8C93808122 +:100890008F7E80831092F40208952091E4003091BD +:1008A000E50095E6A9012091EC00822F817020FFE0 +:1008B00006C08091E80080FF06C080E00895209186 +:1008C000E80022FD1AC080911903882389F0853041 +:1008D00089F08091EB0085FD0FC02091E4003091FC +:1008E000E50042175307F9F29150E1F684E00895CC +:1008F00082E0089583E0089581E0089580911B03CC +:1009000087FF13C08091E80082FF06C08091E80055 +:100910008B778093E80004C0809119038111F2CF96 +:100920000895809119038823D9F38091E80080FF0E +:10093000F8CF8091E8008E77ECCF982F9093E90064 +:10094000242F762F50E0891731F07091EC00209120 +:10095000ED005091F00021FD07C09F5F973071F7C7 +:100960008093E90081E008953091EB003E7F309361 +:10097000EB003091ED003D7F3093ED003091EB00C6 +:1009800031603093EB007093EC002093ED005093B6 +:10099000F0002091EE0027FDE0CF80E00895B0E068 +:1009A000A0E0E5EDF4E00C94C027C8EDD0E088812C +:1009B0008F7E8883E7EDF0E080818160808384E032 +:1009C00082BF81E08093F40288818E7F888302EE6B +:1009D00010E0F80110821092DA0081EEC82ED12CBE +:1009E000F601108288818F77888388818068888368 +:1009F00088818F7D888319BC1092190310921A0385 +:100A0000109218031092170390EEE92EF12CF701C3 +:100A100080818B7F808388818160888342E060E071 +:100A200080E00E949D04F60180818E7F8083F80122 +:100A3000808181608083808188608083F7018081EC +:100A40008E7F8083888180618883CDB7DEB7E8E0C0 +:100A50000C94DC27FC0180912103909122038617DE +:100A60009707A0F06115710529F49091E8009E7731 +:100A70009093E80090E06115710551F4911108C060 +:100A80008091E80082FF34C080E00895BC01F2CF7D +:100A9000809119038823C1F18530C1F18091E8006C +:100AA00083FD30C08091E80082FDEACF8091E800AC +:100AB00080FFE1CF8091F3002091F200382F611583 +:100AC000710519F02830310558F091E028303105D2 +:100AD00009F090E02091E8002E772093E800CBCF3A +:100AE00081918093F100615071092F5F3F4FE7CFF3 +:100AF00080911903882341F0853041F08091E8000E +:100B000083FFBECF81E0089582E0089583E00895D9 +:100B1000089508958091F60208952FB7F894809172 +:100B2000EE029091EF02A091F002B091F1022FBF7E +:100B30000895A3E0B0E0EFE9F5E00C94C62720911A +:100B4000EB023091EC0228173907A1F09093EC02E8 +:100B50008093EB02E091E902F091EA02309751F0C4 +:100B600024E029839B838A830680F781E02DCE01D0 +:100B7000019609952396E2E00C94E227A3E0B0E009 +:100B8000E4ECF5E00C94C6272091E7023091E802EE +:100B900028173907A1F09093E8028093E702E091CB +:100BA000E902F091EA02309751F023E029839B8318 +:100BB0008A830680F781E02DCE0101960995239660 +:100BC000E2E00C94E227E091E902F091EA0230972A +:100BD00029F00190F081E02D0995089580E00895B5 +:100BE000FA01811101C0FB010995089521E030E06F +:100BF000A90102C0440F551F8A95E2F7CA0120914E +:100C00008202662339F0822B8093820281E08093F6 +:100C10007602089580958223F7CF8091DE02982F87 +:100C20009E7F29F4817082608093DE02089586356C +:100C3000E8F381708465F8CFAF92BF92DF92EF92B4 +:100C4000FF920F931F93CF93DF93082F162FE90185 +:100C5000E42FF0E0E255FD4F611110C0E4915E2FEA +:100C60004E2F4983E8835A83DF91CF911F910F91D3 +:100C7000FF90EF90DF90BF90AF900895E62EF12C9B +:100C80004491D42EE42FF0E026E0829FC00111248D +:100C90002FEF30E0B9010E947227802F90E0880F7B +:100CA000991F55E5569FD001579FB00D11248A1BFF +:100CB0009B0B982F990F890F5901AE18BF08AE9E54 +:100CC000D001AF9EB00DBE9EB00D11245B2F189FBA +:100CD00080011124012F11275901A01AB10AAE9EDB +:100CE0008001AF9E100DBE9E100D11245901A81A4F +:100CF000B108AE9CC001AF9C900DBE9C900D11241C +:100D0000892F9927281B390B2E9FC0012F9F900DEB +:100D10003E9F900D1124E92F62307105A1F050F42F +:100D20006115710509F49DCF6130710581F0EB2FDC +:100D3000512F97CF6430710569F080F066307105EE +:100D400009F48FCFF4CFE42F4B2F592F8ACFE42F04 +:100D5000412F87CFEB2F542F492F83CF4B2F5D2D62 +:100D6000E12F7FCF80E00895F894E82FE295EF70AF +:100D7000F0E031A1282F2F7081E090E001C0880FB2 +:100D80002A95EAF7982F9095932391A392A1892B06 +:100D900082A3789408959091F20292FF06C0282FC2 +:100DA00028712830F9F4877F846093FF06C0282FCC +:100DB00028712831F1F4877E84612091F30220FFAD +:100DC00006C0382F38713830D9F4877F816021FF11 +:100DD00006C0282F28712831D1F4877E816194FDC7 +:100DE000877E0895282F24712430F9F68B7F886040 +:100DF000DCCF282F2471243101F78B7E8861DDCF71 +:100E0000382F3171313019F78E7F8860E0CF282F6D +:100E10002171213121F78E7E8861E1CFCF93DF935D +:100E2000EC0182389105B9F108F041C08133910598 +:100E300009F49FC050F58932910509F48FC08A9753 +:100E400009F49EC0C11520E5D20708F0BDC0C11548 +:100E500030E4D30708F00AC1C03ED10508F0A5C0B0 +:100E6000CD3CD10508F000C1C83AD10508F08FC0CB +:100E7000C53AD10508F0F0C0C130D10539F120974D +:100E800029F1C430D10510F546C08533910509F428 +:100E900060C0C997B9F68091F202837009F044C12D +:100EA0008091F30283FF12C0C9E2D0E00FC0833EFD +:100EB0009105A1F178F4803E910509F1823E9105FA +:100EC00009F0C0CF8091F20282FD21C0CE01DF91F6 +:100ED000CF910895863E910561F1873E910571F1AC +:100EE000843E910509F0AECF8091F30281FFEECFF1 +:100EF0008091F202C7EED0E084FD0DC0E7CF809173 +:100F0000F20280FD33C09091F30290FFDFCFC3EE79 +:100F1000D0E084FFDBCFD0E0C0E0D8CF8091F202F8 +:100F200082FDFFC09091F30290FDFEC084FFCECF02 +:100F3000F2CF8091F20283FDDDCFC8CF8091F20223 +:100F400083FDF5C09091F30291FFF0CFC4EED0E0A5 +:100F5000BDCF8091F20285FFB9CFA6CF8091F2027A +:100F600085FDE8C08091F30283FFB0CFC9E3D0E0F4 +:100F7000ADCF8091F20286FFA9CFCAE2D0E0A6CF22 +:100F80008091F20286FFA2CFC1E3D0E09FCFC13CA7 +:100F9000D10508F6C85AD0E0CC0FDD1FC05CDE4F8B +:100FA0000990D881C02DD46491CFC11540E2D407F7 +:100FB00008F0AAC0C11581E0D80708F087CFC83E65 +:100FC000D10508F483CFA7CFC03622E5D20718F5A4 +:100FD000C03432E5D30708F053C0C03242E5D4072D +:100FE00008F047C0C11582E5D80708F47FC02C2F50 +:100FF0002695269540E2249F900111248C2F837022 +:10100000C1E0D0E002C0CC0FDD1F8A95E2F7C22B11 +:10101000D32BDD685BCFC03A22E5D20760F4C0383D +:1010200032E5D30708F441C0CF71D0E0DC2FCC27E4 +:10103000C46FD06A4BCFC03C42E5D40708F44AC025 +:10104000C03E82E5D80708F066CFDC2FCC27CC273E +:10105000DF71C06FD06A3ACFC55AD0E0C35CDE4FB3 +:10106000C881D0E0D06432CFD06530CFDF70D06A95 +:101070002DCFCF71D0E0DC2FCC27C16FD06A26CF27 +:101080002C2F26952695277080E2289F9001112409 +:101090008C2F8370C1E0D0E002C0CC0FDD1F8A9599 +:1010A000E2F7C22BD32BDC6811CF2C2F2695269587 +:1010B000277040E2249F900111248C2F8370C1E09F +:1010C000D0E002C0CC0FDD1F8A95E2F7C22BD32BF4 +:1010D000DA68FCCE8C2F8F710E94CB06C82FD0E02F +:1010E000DC2FCC27CC27DF71D062F0CE8C2F8F7114 +:1010F0000E94CB0635E0D695C7953A95E1F7CF70BB +:101100009C2FEC01D069E2CE8D2F8F710E94CB060F +:1011100090E0982F882788279F719C012C2BE9014C +:10112000E3CFC2EED0E0D2CEC0EED0E0CFCEC6EE5E +:10113000D0E0CCCEC5E3D0E0C9CE80914F02811182 +:1011400010924F02089580959091E3029823909316 +:10115000E302089580959091E40298239093E4022D +:10116000089590913C019923D1F09091F20297FF5C +:1011700016C0E82FE695E695E695EE31E0F4F0E04E +:10118000E454FE4F282F277081E090E001C0880FC3 +:101190002A95EAF780959281892382830895EEEB60 +:1011A000F1E09191891303C0DF0111971C9291E046 +:1011B000E43CF907B1F7089590913C019923C1F0FF +:1011C0009091F20297FF14C0E82FE695E695E69518 +:1011D000EE31F8F4F0E0E454FE4F877021E030E0A7 +:1011E00001C0220F8A95EAF78281822B82830895BB +:1011F000AEEBB1E0EFEF90E02D91821751F0EF3FB1 +:1012000019F4211101C0E92F9F5F9630A9F7EF3F34 +:1012100009F408950E2E000CFF0BE454FE4FE6CFA8 +:1012200080912D029091FC01981301C008958F5F69 +:101230008770FACF973078F5863068F5E82FF0E0C0 +:1012400086E0989FE00DF11D11249E2F977083E09A +:10125000F695E7958A95E1F7EE0FFF1FEE0FFF1F5A +:10126000E252FE4F50E040E080E0219130E0092E54 +:1012700002C0369527950A94E2F721703327042E91 +:1012800001C0220F0A94EAF7822B4F5F5F4F443070 +:10129000510559F7089580E00895973098F5863004 +:1012A00088F5E82FF0E086E0989FE00DF11D11240D +:1012B0008E2F877041E001C0440F8A95EAF783E0E2 +:1012C000F695E7958A95E1F7EE0FFF1FEE0FFF1FEA +:1012D000E252FE4F30E020E070E05191DF011197C3 +:1012E000CB01022E02C0969587950A94E2F7817091 +:1012F00081958527842385278C932F5F3F4F24304A +:10130000310559F70895CF93DF93EC0161E0009721 +:1013100009F0682F617081E00E94F605D0935102B8 +:10132000C0935002DF91CF91089581FB662760F949 +:1013300080E00E94F605089582E00895CF93DF9340 +:10134000EC0160E0009721F0BC0176956795617033 +:1013500082E00E94F60560E0209731F0BE017695AC +:10136000679576956795617083E00E94F60560E069 +:10137000209739F0BE0133E0769567953A95E1F70D +:10138000617084E00E94F60560E0209739F0BE01AC +:1013900024E0769567952A95E1F7617085E00E94D3 +:1013A000F60560E0209739F0BE0195E076956795E7 +:1013B0009A95E1F7617086E00E94F60560E020975B +:1013C00039F0BE0186E0769567958A95E1F7617000 +:1013D00087E00E94F605CE01DF91CF9108950E942B +:1013E0009E099093240380932303089580912303FF +:1013F000909124039C01267033272630310521F477 +:1014000088600E94EF090895877FFBCF21E030E0DC +:1014100002C0220F331F8A95E2F720953095809104 +:10142000230390912403822393230E94EF090895BC +:1014300090912E028095892380932E02282F277069 +:1014400091F4282F082E000C330B9217130659F035 +:101450009091F30292FF07C08595859585950E942E +:10146000060A10922E02089521E030E002C0220FF9 +:10147000331F8A95E2F78091230390912403822BF6 +:10148000932B0E94EF090895FC019281913039F469 +:10149000858182FD08C080FF06C083E008959230F8 +:1014A00021F081E0089582E0089584E008950F938B +:1014B0001F93CF93DF938B01EA019091190394302E +:1014C00061F58093E9008FEF9091E800815095FDE0 +:1014D00006C095ED9A95F1F700008111F5CF809146 +:1014E000E80085FF1AC00E944D04811111C080914F +:1014F000E80085FD06C08091E8008E778093E800C3 +:10150000F2CFF80181918F018093F100219779F753 +:101510008091E8008E778093E800DF91CF911F9152 +:101520000F91089543E050E0BC0184E00E94570A07 +:101530000895CF93DF93EC0180913C01811111C09C +:1015400048E050E0BE0181E00E94570A80E2FE01BF +:10155000A7EFB2E001900D928A95E1F7DF91CF916C +:1015600008958091F20287FF05C040E284E050E0D8 +:10157000BE01EACF48E081E0FACF81E08093E0004D +:1015800080E28093D8001092C9008FE19EE4019719 +:10159000F1F700C0000087E090EBDC0180932903A5 +:1015A00090932A03A0932B03B0932C0388E19CE033 +:1015B0000FB6F894A895809360000FBE90936000DA +:1015C000FFCFCF93DF93CAE1D3E060E0CE010E946A +:1015D000AB292196C11584E0D807B9F7DF91CF91E7 +:1015E00008951F93CF93DF93122F8930E0F4673073 +:1015F000D0F44630C0F4C42FD0E0CC0FDD1F9CE007 +:10160000699FC00DD11D112494E5899FC00DD11D86 +:101610001124632FCE0186960E94AB29612FCE0143 +:1016200087960E94AB29DF91CF911F910895B0E07A +:10163000A0E0EDE1FBE00C94BF2793EBC92E94E012 +:10164000D92E10E000E07601B12C1AC00830110547 +:10165000D1F0FE01EE0FFF1FEE0DFF1D259134911D +:101660004C2F6B2D802F0E94F10A2196C630D10598 +:1016700069F78CE0E80EF11CB39487E0B81649F0E6 +:10168000D0E0C0E0E3CF21E030E04C2F6B2D88E0CC +:10169000EACF0F5F1F4F84E5C80ED11C093011053A +:1016A00091F6CDB7DEB7E9E00C94DB27CF93C82FD6 +:1016B0006FEF811162E282E290E00E94AB296FEF4E +:1016C000C11161E183E290E00E94AB296FEFC1118B +:1016D00062E184E290E00E94AB29CF91089580E01E +:1016E0000E94560B60E085E290E00E94AB290E94C8 +:1016F000170B0E94E10A81E00E94560B08950F9398 +:101700001F93CF93DF93893030F5673020F5463053 +:1017100010F5C42FD0E0CC0FDD1F2CE0629FC00D70 +:10172000D11D112434E5839FC00DD11D1124CE019C +:1017300086960E949729082F10E0102F0027CE01CF +:1017400087960E9497299801282BC901DF91CF9194 +:101750001F910F91089590E080E0F8CF462F7730E9 +:1017600040F4663030F4893020F4672F0E947F0BFC +:10177000089590E080E00895B0E0A0E0E2ECFBE0A6 +:101780000C94BF277C0100912303109124038091C6 +:10179000500290915102082B192BCFE0D0E0CC24BD +:1017A000C394D12CBC2EC6010C2E02C0880F991FE9 +:1017B0000A94E2F780239123892B49F4219790F72B +:1017C000B12C8B2DCDB7DEB7E9E00C94DB27B70148 +:1017D0008C2F0E94AE0B0E940E07019779F3F1CF78 +:1017E000CF93DF93EC010E94BC0BBE010E94AE0BB5 +:1017F0000E940E07DF91CF910895FC0183819481AF +:10180000892B29F08081918189238F3F51F480E0D9 +:101810000895843FE1F717C0883EA8F0813FB9F7EB +:1018200012C0808191810E94F00B92959F7096303A +:1018300099F358F4925F9F70923048F7803F19F007 +:1018400040F7883E20F781E008959A5FF4CFA5E045 +:10185000B0E0EDE2FCE00C94C52749835A8389810E +:101860009A81662399F0222389F00E94BC0B182FDD +:10187000682F89819A810E944D0969817A81812F1F +:101880000E94AE0B2596E3E00C94E1270E941A0912 +:10189000182FF3CF82E290E00E949729823289F4D8 +:1018A00083E290E00E949729813159F484E290E02C +:1018B0000E94972991E0823109F090E0892F817090 +:1018C000089580E0FCCF6091DE02669570E04BE009 +:1018D00050E08EE291E00E947D29892B19F481E08D +:1018E000809381020E948D0590937B0280937A02FF +:1018F0000895A5E0B0E0EFE7FCE00C94B9278091F3 +:10190000DE0280FD0AC0E6E8F2E011821082128257 +:10191000339622E0E73AF207C1F780907802909080 +:1019200079028114910409F459C0809177028111E0 +:1019300055C0D12CC12C66246394712C53E0552ED4 +:101940008091820293010C2C01C0220F0A94EAF7C5 +:10195000822309F43BC0F601EE0FFF1FE80DF91DCD +:10196000E590F490E114F104C9F145E050E0B701CD +:10197000CE0101960E94492809810F3F39F18A81E1 +:10198000800F9927991F8C30910514F08BE090E01F +:101990005C01AA0CBB1C8A0D9B1DFC01EA57FD4F84 +:1019A0005F01059D800111240A571D4F0A151B0573 +:1019B00020F0F5E0EF0EF11CD8CF98014D816C813D +:1019C0008B810E941C060D5F1F4FF0CF2FEFC21AB4 +:1019D000D20A38E0C316D10409F0B2CF539A3BB112 +:1019E000377F2BB128604FB7F89486E892E0FC016E +:1019F0005191CF0168E02BB9000000C057FF3BB9FF +:101A0000550F000000C000C000C03BB900C06A957F +:101A100091F7F2E0873A9F0751F74FBF8FE594E0C7 +:101A20000197F1F700C000002596EFE00C94D52750 +:101A3000B0E0A0E0EEE1FDE00C94B827FC0162808C +:101A4000448081E08483E3EBF3E07490E2E3F4E02C +:101A5000E491C7EAD2E036E8E32E32E0F32E4EED11 +:101A6000C42E42E0D42E52E0A52EBB24B394882489 +:101A70008A94912C55245A94E7190E2F10E082E095 +:101A8000861530F08091DF0288838091E00289839F +:101A9000411016C01B821A8297014A816981888190 +:101AA0000E941C06259683E0E80EF11CCC16DD068C +:101AB00031F70E94790CCDB7DEB7E0E10C94D42762 +:101AC0008B818823E9F081508B83859DC00111248F +:101AD0006C8170E00E947227FB01FF27ED54FC4FE0 +:101AE0008491E82FE719E59DC0011124B8010E94F7 +:101AF00072278091E102689FB00111247A83CCCFD4 +:101B00000E9439282091E102269521582A9DA001A2 +:101B10002B9D500D1124452F5527841795070CF048 +:101B2000BBCF82E0861588F40E943928B4010E9458 +:101B3000862788830E9439282091E0022695622F0B +:101B400070E00E948627280F29831A828091E10283 +:101B5000893C20F088EC8C838B839ECF8431D8F72E +:101B600084E1F9CFEF92FF920F931F93CF93DF930E +:101B70008C01C6E8D2E0F12CE12CF801948160914F +:101B8000E0028091DF02F5E0EF16F104ECF4992316 +:101B9000E9F09E014091E1020E941C062FEFE21A3B +:101BA000F20A23968BE0E816F10439F70E94790CCB +:101BB000F801848190E00196817099278483CDB7E4 +:101BC000DEB7E6E00C94DE27992319F39E0140E08E +:101BD000E3CFB0E0A0E0EFEEFDE00C94BC27EC0119 +:101BE0004C81042F10E09801D8010E94332A9B01F8 +:101BF000AC010E94FE294B015C01E0E2F0E0E01B39 +:101C0000F10BA5E5B0E0AC019B010E94FE296B0140 +:101C10007C019F01DF010E94A7279B01AC010E946C +:101C2000092A9B01AC01280D391D4A1D5B1DC70106 +:101C3000B6010E94112AF22E822F90E039E23F1560 +:101C400098F143E0249F9001112435952795122F98 +:101C5000109596E8C92E92E0D92E00E085E5E82E91 +:101C6000EF188E2D01FD8F2D9601412F6091E0021E +:101C70000E941C060F5F53E0C50ED11C0B3089F784 +:101C80000E94790C9C8181E0992319F0903219F41B +:101C90008FEF80933B0180913B01890F8C83CDB7FF +:101CA000DEB7ECE00C94D82725E530E0A901481B0D +:101CB000590BCA019A01220F331F280F391F37FF12 +:101CC000C4CF2F5F3F4FC1CF0F931F93CF93DF93AD +:101CD000C6E8D2E0FE01118210821282339682E0C1 +:101CE000E73AF807C1F710E000E080918402082E7F +:101CF000000C990B081719078CF180913A01082EF6 +:101D0000000C990B801791074CF19E014091E10264 +:101D10006091E0028091DF020E941C060F5F1F4F5E +:101D200023960B30110509F70E94790C8091390137 +:101D300090918402980F9093840220913A01280F89 +:101D400020933A01121614F49A301CF08195809376 +:101D50003901DF91CF911F910F9108951982188257 +:101D60001A82DCCFB0E0A0E0E8EBFEE00C94BF27E5 +:101D7000FC018281DD24DA9480FD02C0DD24D3944D +:101D800006E812E0D0E0C0E02BE0B22EF8011182AC +:101D90001082128294E0E92EF12CC12C80918302F2 +:101DA0008C0D8C30C4F16B2D0E946427892F082E76 +:101DB000000C990B8C179D0791F48091E1028E9D88 +:101DC000A0018F9D500D1124559547955595479528 +:101DD00098016091E0028091DF020E941C06CD0C08 +:101DE000F1E0EF1AF108D1F621960D5F1F4FCB30CD +:101DF000D10561F60E94790C8091830291E0D9129D +:101E000010C081110CC08AE080938302CDB7DEB789 +:101E1000E9E00C94DB2787FFCACF855FC8CF8150EC +:101E2000F3CF90E00196BE010E948627EDCFEF929E +:101E3000FF921F93CF93DF93EC0186E8E82E82E0B8 +:101E4000F82E10E08C8197014091E1026091E00250 +:101E5000810F0E941C06195E83E0E80EF11C1D3FF5 +:101E600089F70E94790C9A818C8190FF08C08F5F5E +:101E70008C83DF91CF911F91FF90EF900895815057 +:101E8000F7CF9091DE0290FF0CC0E6E8F2E081838C +:101E900060834283339692E0E73AF907C1F70E94E4 +:101EA000790C0895A3E0B0E0E8E5FFE00C94C427C6 +:101EB0008C018091850281110AC09E012F5F3F4FE6 +:101EC0004FEF6FEF0E941C068A8180938502F80114 +:101ED0006481613069F08091850240E0662361F0A1 +:101EE00040E0623011F44091850280E060E004C07F +:101EF0006091850240E080E00E94410FF8018481FA +:101F000090E0019663E070E00E9486278483239628 +:101F1000E4E00C94E027A3E0B0E0E1E9FFE00C94FA +:101F2000C6279091DE0290FF0AC09E012F5F3F4FAF +:101F30000E941C064B8169818A810E94410F239671 +:101F4000E2E00C94E227CF93DF93EC01EEEDF2E0B8 +:101F5000438162818C810E948B0F8C818F5F8C8387 +:101F6000DF91CF910895CF93DF93EC01EC81F0E006 +:101F7000ED54FC4F4491EEEDF2E0628181810E94CC +:101F80008B0F8C818F5F8C83DF91CF910895CF92DF +:101F9000DF92EF92FF926B017C010E940D06B70168 +:101FA000A60188E090E00E94BD29FF90EF90DF90AD +:101FB000CF900895A3E0B0E0E0EEFFE00C94B927E5 +:101FC000F82E762EE42E622E9091DE0290FF29C02C +:101FD000E92FE695AE2FB0E0A158BE4F8C918093CB +:101FE00080029E7F923009F59E012F5F3F4F8F2D1B +:101FF0000E941C064B8169818A810E94410FF092E8 +:10200000DF027092E002E092E102662051F06091FE +:10201000DE027091DF028091E0029091E1020E9465 +:10202000C70F2396EFE00C94D527823019F4E09087 +:10203000E102E5CF863019F4F090DF02E0CF89307D +:10204000D9F38931E1F6E9518E2F8170582EE6954A +:10205000F0E0E255FC4FE4910E2F10E086E8C82E28 +:1020600082E0D82EB12CA12C9BE0892E912CC501A9 +:10207000B4010E9472278F2D511013C0860F960154 +:102080004E2D672D0E941C06A00EB11E83E0C80EC7 +:10209000D11C87EAC81682E0D80649F70E94790C5D +:1020A000AECF861BECCFEEEDF2E0438120E1421B88 +:1020B00008F440E021E0628181810E94DA0F0895F6 +:1020C000EEEDF2E0438120E1420F08F44FEF21E012 +:1020D000628181810E94DA0F0895EEEDF2E0628163 +:1020E00020E1621B08F460E021E0438181810E94CD +:1020F000DA0F0895EEEDF2E0628120E1620F08F45C +:102100006FEF21E0438181810E94DA0F0895EEEDA7 +:10211000F2E0818121E04381628180510E94DA0FE7 +:102120000895EEEDF2E0818121E043816281805FDC +:102130000E94DA0F08958091E202882319F08150FD +:102140008093E2026091DE027091DF028091E002F2 +:102150009091E1020E94C70F08958091E2028330BE +:1021600018F48F5F8093E2026091DE027091DF02CB +:102170008091E0029091E1020E94C70F0895909132 +:10218000DE0290FF2CC0917081112AC09260909362 +:10219000DE02662351F06091DE027091DF028091D1 +:1021A000E0029091E1020E94C70F6091DE02669505 +:1021B00070E04BE050E08EE291E00E947D29892B97 +:1021C000B1F01092810281E080937D0220E0409185 +:1021D000E1026091E0028091DF020E94DA0F08952F +:1021E0008B3210F09465D3CF880F982BD0CF0E94FC +:1021F000630CE9CFEEEDF2E080818160808360E0E6 +:1022000086950E94BF1008958091DE0286958150C8 +:1022100009F48AE261E00E94BF1008958091DE0215 +:1022200086958F5F8B3208F081E061E00E94BF10DD +:1022300008959091DE0290FF08C09695981728F0B7 +:10224000961718F40E940E11089561E00E94BF10C5 +:102250000895EEEDF2E083E0808311828FEF8283B8 +:102260008383148260817181828193810E94C70F70 +:10227000089567EE7EEF90E080E00E94C92960E05B +:1022800082E090E00E94AB2960E083E090E00E9451 +:10229000AB29109251021092500260E074E184E088 +:1022A00090E00E94C92960E086E090E00E94AB299E +:1022B0006FEF87E090E00E94AB2940E050E0BA0168 +:1022C00088E090E00E94BD2960E08DE090E00E94EF +:1022D000AB2940E050E0BA0188E190E00E94BD29BE +:1022E00060E087E190E00E94AB2940E050E0BA0155 +:1022F0008CE190E00E94BD2970E060E080E290E017 +:102300000E94C92940E050E0BA0188E190E00E94B3 +:10231000BD2980E00E94560B0E946F0B40E050E008 +:10232000BA018FE090E00E94BD2940E050E0BA0180 +:1023300083E190E00E94BD2908959091F30292FB01 +:10234000222720F9281779F080FB92F99093F30265 +:102350006091F2027091F30284E090E00E94C9293A +:1023600082E00E94180A089590E080E00E94A5296A +:10237000873E9E4F19F40E944A0C089580E008950C +:10238000A7E0B0E0E6ECF1E10C94B6278E010F5F18 +:102390001F4F87E0D8011D928A95E9F7E2E7CE2E1C +:1023A000E1E0DE2EF12CE12CAA24A394B12CF6015D +:1023B00081916F018F3F09F443C0F894E82FE295B3 +:1023C000EF70F0E021A18F70A50102C0440F551FEE +:1023D0008A95E2F7CA01922F982B91A392A180953A +:1023E000892382A3789400C0E9E7F1E0912C31E0E1 +:1023F00021912F3F09F4BFC0A22FA295AF70B0E08A +:1024000090968C9190E02F7002C0959587952A95B3 +:10241000E2F780FDB0C0832F982A330F51E0EF37E9 +:10242000F50731F7F601319780818F3F11F00E9457 +:10243000B40680EA8A95F1F7F801EE0DFF1D90824F +:10244000AFEFEA1AFA0AB7E0EB16F10409F0AFCFE2 +:1024500047E050E0B80189E592E00E948A297C01BA +:10246000892B41F087E0F801A9E5B2E001900D92D7 +:102470008A95E1F71092560210915502112309F442 +:10248000A2C00E948D052091530230915402FC019C +:10249000E21BF30B9F019093540280935302EF3F92 +:1024A000F10511F008F069C0EF2B09F460C0622E4D +:1024B00040915702509158021092550210925202C8 +:1024C000EFE6F2E069E5262E62E0362E6A018AE246 +:1024D000C80ED11C00E0512C712CAA24A394B12C5D +:1024E00090E080E0BA01680F791FDB019C90892C95 +:1024F000E89480F8882039F1892C8694B92DB17040 +:102500009B2E8216130609F0DCF5DB019C929110DC +:102510003EC09080B501082E01C0660F0A94EAF70C +:10252000762F70957921D1018C906821672B792DB8 +:102530007627852C912C872A552453948114910455 +:1025400009F4512C608301968630910559F64A5F53 +:102550005F4F3196BFEF2B1A3B0AC416D50609F020 +:10256000BFCF709255025092560200935202E1146E +:10257000F104C1F52BC080E04FCF2FEF30E097CFB3 +:102580008618880C9828DB019C92712EDCCF012FD5 +:10259000DACF772021F040FD02C041704C932F5FCD +:1025A0003F4F26303105E9F5069631960817190791 +:1025B00069F55093550280925602809156022796F3 +:1025C000E2E10C94D227E114F10431F4809152023B +:1025D000882399F3111106C00E948D05909354022F +:1025E0008093530280915702909158025091550266 +:1025F0008090560229E5422E22E0522EEFE6F2E0CC +:102600008C01065D1F4FEE24E394F12CD2019D90C6 +:102610002D012081922630E020E06D01B1E0CB1A3F +:10262000D108BC01620F731F5701022E02C0AA0C11 +:10263000BB1C0A94E2F7DB014C91742EE89470F80D +:10264000692C6A2009F4A5CF7110A9CFD6015C913D +:102650005A2141E009F440E04A60DB014C9340FF1D +:1026600005C04081A426A0828824839451E097CF9E +:102670008091E4029091E302892B8093BC019091B8 +:102680004F029923A1F0892B8093BC0180913C01DA +:102690008823E1F18091F20287FF38C08EE1EEEBF2 +:1026A000F1E090E08150A0F591110E949D0840E278 +:1026B00050E06FE272E08CEB91E00E948A29892B56 +:1026C00021F180E2ECEBF1E0AFE2B2E001900D929B +:1026D0008A95E1F7E091E902F091EA023097A9F0DA +:1026E00080913C01882359F08091F20287FF07C056 +:1026F0008091BC018093BD0186E08093BC01028083 +:10270000F381E02D8CEB91E00995089586E0C7CF29 +:102710002191222339F29F5FC5CFCF93DF93EC0144 +:10272000EA85FB85309719F06C857D8509958B814D +:102730000E94A3088C810E94AA080E94381386E098 +:10274000FE0111928A95E9F7DF91CF910895CF9319 +:10275000DF93EC018D8181FD18C082608D838091B3 +:10276000E3029B81892B8093E3028091E4029C81A8 +:10277000892B8093E4020E943813E885F98530970D +:1027800021F06C857D85CE0109951092E6021092AC +:10279000E5028D8180FD03C0CE010E948D13DF9183 +:1027A000CF9108951092E40280913C01EEEBF1E0AC +:1027B0008823B1F08091F20287FF12C08EE1DF0121 +:1027C0001D928A95E9F790E080E00E94BE0590E0B6 +:1027D00080E00E9499051092E3020E943813089548 +:1027E00086E0EDCFAAE2B0E0E8EFF3E10C94C52774 +:1027F0008BE193E02091F100DC012D93CD01B3E05A +:1028000083329B07B9F780911C03833009F472C0AF +:10281000B8F4813009F449C0823009F4B3C0809122 +:10282000E80083FF8BC280911B0390911C039A30B8 +:1028300008F084C2E92FF0E0EC5BF54D0C949A2788 +:102840008A3009F48EC08B3009F471C0893039F7B1 +:1028500080911B03813219F780911F03909120030F +:10286000009711F00297D9F68091E800877F809356 +:10287000E8008091E80082FF38C09091F3008091D9 +:10288000F200029731F48091F100813011F086302E +:1028900021F48091F1008093F6028091E8008B771B +:1028A0008093E8000E947E04BACF80911B03813A96 +:1028B00009F0B5CF8091E800877F8093E800809190 +:1028C0001F0390912003892B61F460E287EF92E06F +:1028D00070E00E942A058091E8008B778093E800E1 +:1028E0009ECF60E090E080E0F3CF809119038111EA +:1028F000C0CF95CF80911B03813A09F090CF809192 +:102900001F0390912003892B09F089CF8091E80063 +:10291000877F8093E8008091E80080FFFCCF809162 +:102920003C018093F1008091E8008E77B9CF8091CF +:102930001B03813209F073CF80911F039091200314 +:10294000892B09F06CCF8091E800877F8093E800A5 +:102950000E947E0480911D0380933C010E94D2134B +:102960005ECF80911B03813209F059CF8091E8003E +:10297000877F8093E8000E947E0480911E038093ED +:10298000F5024DCF80911B03813A09F048CF809129 +:10299000E800877F8093E8008091E80080FFFCCF0B +:1029A0008091F502BECF803899F0823809F0C6C117 +:1029B00080911F038F70873008F0C0C18093E900B9 +:1029C0008091EB0085FB882780F91092E90006C012 +:1029D0008091170390911803911182609091E80003 +:1029E000977F9093E8008093F1001092F10080911E +:1029F000E8008E779FC1882309F48DC1823009F0E9 +:102A00009DC180911D03811190C180911F038F7022 +:102A10002FEF280F263008F091C18093E900209114 +:102A2000EB0020FF82C1933031F48091EB00806293 +:102A30008093EB007AC19091EB0090619093EB0052 +:102A400021E030E001C0220F8A95EAF72093EA00E6 +:102A50001092EA008091EB008860EACF81116EC18C +:102A600010911D031F778091E3008078812B809364 +:102A7000E3008091E800877F8093E8000E947E0455 +:102A80008091E80080FFFCCF8091E3008068809314 +:102A9000E30082E0111183E0809319034FC1805855 +:102AA000823008F04BC120911D0330911E032C3D54 +:102AB000E3E03E07A1F583E08A838AE289834FB78A +:102AC000F894DE01139620E03EE051E2E32FF0E0BF +:102AD00050935700E49120FF03C0E295EF703F5FF1 +:102AE000EF708E2F90E0EA30C0F0C7968D939D93E3 +:102AF0002F5F243159F74FBF8091E800877F809383 +:102B0000E8006AE270E0CE0101960E942A058091F9 +:102B1000E8008B778093E80011C1C096E7CF8091E1 +:102B20001F0390912003432F55274330510509F48B +:102B30004AC078F54130510509F47AC08BE590E040 +:102B4000E3E5F7E04230510509F0F8C02091E800D4 +:102B5000277F2093E80020912103309122038217E0 +:102B6000930708F49C0140E02115310509F065C088 +:102B7000411163C08091E80082FDC9CF80911903A3 +:102B8000882329F2853019F28091E80083FFF2CF83 +:102B9000BECF4132510509F43CC04232510509F023 +:102BA000CDC08330910508F0C9C0FC01EE0FFF1FB6 +:102BB000E355FE4F0190F081E02D86559E4FDC01DC +:102BC0008C9190E01AC0332721303105D1F02115C6 +:102BD000310561F02230310509F0B0C0E0ECF7E0DA +:102BE000E4918E2F90E0E0ECF7E007C0E4EEF7E030 +:102BF000E4918E2F90E0E4EEF7E0009709F49EC098 +:102C0000A5CFE6EDF7E0E4918E2F90E0E6EDF7E05A +:102C1000F4CF8330910508F091C0880F991FFC0113 +:102C2000ED54FE4F0190F081E02D89E090E08ECFD1 +:102C300082E190E0EEEAF7E089CF809119038823E2 +:102C400009F465CF853009F462CF8091E80083FDF7 +:102C50005ECF8091E80082FD8DCF8091E80080FFFB +:102C600083CF9091F3008091F2002115310519F086 +:102C70008830910550F041E0089709F040E08091DC +:102C8000E8008E778093E8006FCF44914093F10085 +:102C90003196215031090196E8CF803809F04EC0B5 +:102CA0008091E800877F8093E80080911A038093E9 +:102CB000F1009DCE811142C010911D031230F0F53C +:102CC0008091E800877F8093E80010931A030E94A8 +:102CD0007E04112311F084E005C08091E30087FD9C +:102CE000FACF81E08093190342E061EC81E00E9419 +:102CF0009D0442E261EC84E00E949D0442E261ECAA +:102D000082E00E949D0442E260EC83E00E949D0408 +:102D10008091190313C080911D03813079F481E003 +:102D2000933009F080E0809318031092E9008091BD +:102D3000E800877F8093E8000E947E048091E8008D +:102D400083FF0AC08091E800877F8093E80080912C +:102D5000EB0080628093EB00AA96E3E00C94E127FD +:102D60000E94D2132FEF84E39CE0215080409040DA +:102D7000E1F700C0000088E19CE00FB6F894A89548 +:102D8000809360000FBE90936000FFCF882321F0F6 +:102D90000E94A3080E9438130895882339F0909167 +:102DA000E302982B9093E3020E943813089588233E +:102DB00021F00E94AA080E9438130895882339F050 +:102DC0009091E402982B9093E4020E9438130895A6 +:102DD000882309F44DC0823879F40E94E30581FF0D +:102DE00047C089E30E94DC080E94381389E30E94EF +:102DF000B1080E9438130895833859F40E94E305FE +:102E000080FF36C083E50E94DC080E94381383E50A +:102E1000EECF843859F40E94E30582FF29C087E48D +:102E20000E94DC080E94381387E4E1CF9CEF980FE2 +:102E3000913AE8F290E2980F983050F4877091E060 +:102E400001C0990F8A95EAF7892F0E94AA08D1CF6D +:102E50009BE5980F933028F490E080E00E94BE0537 +:102E60000895885A893120F490E080E00E94990505 +:102E70000895CF93DF93EC010E94E816CE010E94E3 +:102E80009C090E94C616DF91CF9108958091DC01C4 +:102E9000833049F0843011F0823041F487E292E0CF +:102EA0000E943917089580E40E94D71608958091F2 +:102EB000DC01833049F0843011F0823041F486E245 +:102EC00092E00E943917089581E00E94D716089574 +:102ED000CF93C82F8823C9F08238C9F40E94E30534 +:102EE00081FD13C089E30E94DC080E9438132FEF94 +:102EF00087EE93E0215080409040E1F700C0000051 +:102F000089E30E94B1080E943813CF910895833855 +:102F1000A1F40E94E30580FDF8CF83E50E94DC0860 +:102F20000E9438132FEF81EE94E0215080409040B2 +:102F3000E1F700C0000083E5E4CF8438A1F40E94EB +:102F4000E30582FDE2CF87E40E94DC080E9438138B +:102F50002FEF81EE94E0215080409040E1F700C0D7 +:102F6000000087E4CECF8CEF8C0F813A88F58091FA +:102F70003C01882301F18091F20287FF1CC0EC2FF5 +:102F8000E695E695E695F0E0E454FE4F828190E008 +:102F90004C2F477021E030E002C0220F331F4A95CA +:102FA000E2F782239323892B79F08C2F0E94B108BA +:102FB0000E94381309C0EEEBF1E08191C817A9F324 +:102FC00021E0E43CF207C9F78C2F0E94DC089BCF7C +:102FD00080E28C0F883068F4C77021E030E001C0D7 +:102FE000220FCA95EAF78091E402822B8093E402D3 +:102FF0008ACFEBE5EC0FE33040F4F0E0E35CFE4F0A +:10300000808190E00E94BE0580CFC85AC93108F087 +:103010007CCFEC2FF0E0EE0FFF1FE05CFE4F8081D5 +:1030200091810E94990571CF1F93CF93DF93182F41 +:10303000EB010E946817209739F4812F0E94E8164F +:10304000DF91CF911F9108958FE99FE00197F1F7EC +:1030500000C000002197EFCFCF93C82F0E949C099A +:103060000E94CD168C2F0E946817CF9108950E9460 +:10307000440A8093DC01833049F0843059F0823077 +:1030800021F487E292E00E942C18089580E40E94C7 +:10309000DE16089587E292E00E942C1887E292E003 +:1030A0000E943917EECF0E94440A8093DC018330DE +:1030B00049F0843059F0823021F486E292E00E9497 +:1030C0002C18089581E00E94DE16089586E292E0B1 +:1030D0000E942C1886E292E00E943917EECFA8E0F9 +:1030E000B0E0E5E7F8E10C94B8278C01DC01139619 +:1030F0008D919C911497892B49F04C9111965C917C +:103100001197842F85238F3F09F06EC52896E0E143 +:103110000C94D427A114F4E0BF0699F1C5010E94D4 +:103120009729811101C0EA942FEFA21AB20AB1C502 +:103130005601843009F0E2C542E0E42EF12C56013C +:103140002FEFA21AB20AC6010E949729E1E0F0E02F +:10315000EC0FFD1FEE0DFF1D8083882391F08C374F +:1031600041F4E2E0F0E0EC0FFD1FEE0DFF1D1082D8 +:10317000C5C53FEFE31AF30A650147E0E416F10421 +:10318000F1F680912E02877009F4C0CFF801828198 +:10319000882309F4BBCF8091F30282FFB7CF82E08E +:1031A0000E94180AB3CF5701A9C5923049F4E2E052 +:1031B000EE0EF11C0E9468179FEFE91AF90AA1C5EB +:1031C000933031F4F2E0EF0EF11C0E94E816F4CFD8 +:1031D000943021F02FEFE21AF20AEECF32E0E30E44 +:1031E000F11C30E020E0B7016F5F7F4FD7011196EF +:1031F0004C918053990B8A30910550F02150310940 +:10320000D8F2EFE9FFE03197F1F700C00000F6CF08 +:10321000429EF001439EF00D11249C012E0F3F1F92 +:10322000842F7B01E0CFE22FF0E0EB5FFD4F549065 +:10323000822F86958695869590E0FC01EB50FE4F97 +:1032400064902770712C022E02C0759467940A94C2 +:10325000E2F731E063227724FC01EB51FE4F8490CA +:10326000912C022E02C0959487940A94E2F741E0D3 +:1032700084229924FC01EB52FE4FC490D12C02C051 +:10328000D594C7942A95E2F751E0C522DD24611454 +:10329000710419F081EE0E9468178114910419F0ED +:1032A00086EE0E94681789E370E060E0581202C061 +:1032B00060E570E0852D0E9414188114910419F0C6 +:1032C00086EE0E94E8166114710419F081EE0E94E6 +:1032D000E816C114D10409F46FCF70E060E08CE20D +:1032E00028C581E00E94340A0E94F6094ACF81E095 +:1032F0000E94060AF9CF82E0F5CF9E2D8F2D45C49E +:10330000F901858181FF45C4C9010E948D1341C423 +:103310008091F20281608093F20295C08091F30265 +:1033200088608093F3028FC08091F2028260F3CFB5 +:103330008091F2028460EFCF8091F2028860EBCF3F +:103340008091F3028160EDCF8091F3028260E9CF3A +:103350008091F2028061DFCF8091F2028062DBCF48 +:103360008091F2028064D7CF0E94D2138091F20242 +:103370008068D1CF8091F2028C60CDCF8091F30232 +:103380008360CFCF8091F2028E7FC5CF8091F30210 +:10339000877FC7CF8091F2028D7FBDCF8091F202EF +:1033A0008B7FB9CF8091F202877FB5CF8091F302F6 +:1033B0008E7FB7CF8091F3028D7FB3CF8091F202E1 +:1033C0008F7EA9CF8091F2028F7DA5CF8091F202EE +:1033D0008F7BA1CF0E94D2138091F2028F779BCF77 +:1033E0008091F202837F97CF8091F3028C7F99CFF7 +:1033F0008091F20282FB992790F921E0922790FBBD +:1034000082F990FB83F987CF8091F302982F9095F2 +:1034100091708E7F892B90FB81F983CF9091F2027E +:10342000892F8F7B96FF806476CF0E94D213909174 +:10343000F202892F97FB87F980586DCF61E08EE00B +:1034400090E00E94AB296091F2027091F30284E057 +:1034500090E00E94C9290E94D21393CE60E0EFCF82 +:103460009091F202892F8F7E94FF806154CF9091CA +:10347000F202892F8E7F90FF81604DCF9091F302F1 +:10348000892F877F93FF88604CCF85E366C4809146 +:10349000DD01811104C089E20E94B10860C485E3A6 +:1034A000FBCF8091DE0280FF12C08E7F8093DE0210 +:1034B0006091DE027091DF028091E0029091E10262 +:1034C0000E94C70F109281020E94790C5ACE81602F +:1034D0008093DE0261E086950E94BF1052CE44E0E8 +:1034E00051E16EE071E10E94F0054BCE4EE051E1FA +:1034F00064E071E1F8CF47E850E161E970E1F3CFB2 +:1035000041E950E167E870E1EECF4DE650E16AE74E +:1035100070E1E9CF4AE750E16DE670E1E4CF43E5C1 +:1035200050E160E670E1DFCF40E650E163E570E135 +:10353000DACF4BE950E16DEA70E1D5CF4DEA50E1C9 +:103540006BE970E1D0CF61E081E0C6CF65E082E059 +:103550000E94191116CE68E086E0FACF6EE089E08D +:10356000F7CF64E18FE0F4CF67E185E1F1CF61E06F +:1035700088E1B2CF62E289E1EBCF61E083E2ACCFD8 +:103580006AE285E2E5CFB3E0EB16BCE7FB0609F49F +:1035900076C008F055C0E114FCE7FF0609F462C0EC +:1035A00021E0E2162CE7F20609F46FC0D80112966A +:1035B0008C911297ED90FC90882309F474C0C70198 +:1035C0000E94BC0BD82E682FC7010E944D09B7017D +:1035D0008D2D0E94AE0B0E940E077C01882EF801F3 +:1035E000D280B580B2943FE0B32280912E028770E2 +:1035F000C1F0AD2CDD20B1F08F2D807F803421F023 +:1036000080E28E0D883068F08091F30282FF09C05D +:1036100082E00E94180A80912E028770AA24A39447 +:103620008111A12C9F2C92942FE09222FBE0F9159E +:1036300008F4A5C0E92DF0E0E25BF54D0C949A2763 +:103640003BE5E3163CE7F30661F14CE5E4164CE795 +:10365000F406E9F05AE5E5165CE7F50609F0A6CFB1 +:1036600081E01CC00E94D2138FEF94E3ACE0815044 +:103670009040A040E1F700C000000E94BD0A6FEF3B +:103680007FEF90E080E00E94C9290E94B0168091EF +:10369000F30282FB882780F991E089270E949D111F +:1036A00085CF80E0FBCFC7010E941A09D82E8FCFAB +:1036B0002F2D2F70C22E8F2D807F19F0C29490EF86 +:1036C000C922DD20B9F0CC2069F080E28E0D88306F +:1036D00010F0811009C08091E402C82AC092E4026F +:1036E0000E9438138E2D49C08091E302C82AC092EF +:1036F000E302F6CF8E2D0E94E816CC2009F43FC0DD +:1037000080E28E0D883010F0811004C08C2D0E9454 +:10371000AA0803C08C2D0E94A3080E9438132FC052 +:103720003F2D3F70C32E8F2D807F803219F0C294C1 +:1037300080EFC822882089F041E0841609F479C01E +:10374000DD2009F483C0BB2009F479C0F80185812C +:1037500080FFC8CF8F70858372C02091F30222FD55 +:1037600040C0DD20C1F1CC2039F08091E402C82AAC +:10377000C092E4020E94381380E00E946817492D2D +:103780004850550B4430510520F40E94E3050E9437 +:103790009509AA20B1F080912E0280FD12C0D801B7 +:1037A00012961C928595859585950E94340AC801CC +:1037B0000E946F1880912E028595859585950E94AF +:1037C000060A20E0F8014081518162817381848181 +:1037D0000E94270C9BCC80E00E94E816CC2079F256 +:1037E00095CFDD20A1F090914F028C2D892BB11047 +:1037F00003C00E94DE16C3CF51E0B512FACF22FFFC +:10380000BECF891709F4BBCF80934F02B8CFB11058 +:1038100006C00E949D088C2D0E94D716B0CF81E073 +:10382000B81609F4ACCF8C2D0E94D7160E949D08C3 +:10383000A6CFDD2031F095E09B1508F4A0CF8C2DAC +:10384000D8CFA4E0AB1508F49ACFE5CFBB2019F38D +:10385000F9E38F1209C02FEF37EE43E021503040DB +:103860004040E1F700C000008E2D0E94E81687CF8F +:103870008F2D86958695837061F0813009F07FCF1A +:10388000C7019370D11002C080E090E00E949905BA +:1038900076CFC7019370D11002C080E090E00E9403 +:1038A000BE056DCF8F2D837009F040C0D11067CF5A +:1038B0004E2D429546954770440F440F8E2D8F70C4 +:1038C00090E0042E02C0880F991F0A94E2F730E0BE +:1038D00020E0E4FE09C02FE030E002C0220F331FD9 +:1038E0004A95E2F7209530954F2D469546954370C1 +:1038F000423099F078F46091500270915102413059 +:1039000039F0822B932B862397230E94830937CF8C +:10391000862B972B822B932BF8CF822B932B2091E6 +:1039200050023091510282279327EFCF8695DD20F8 +:1039300011F08F2D8170882309F421CF4E2D4295EF +:1039400046954770440F440F8E2D8F7090E0042EE3 +:1039500002C0880F991F0A94E2F730E020E0E4FEED +:1039600009C02FE030E002C0220F331F4A95E2F772 +:10397000209530954F2D469546954370423099F0ED +:1039800078F46091230370912403413039F0822B45 +:10399000932B862397230E94EF09F1CE862B972B3A +:1039A000822B932BF8CF822B932B209123033091E2 +:1039B000240382279327EFCF5F2D5F70F52EDD2044 +:1039C00029F0852F0E94340A8E2D13CF8E2D0E9450 +:1039D000D7168F2D0E94060AD2CE8E2D92EF891611 +:1039E000A1F1981570F0A0EF8A16D1F0B1EF8B1607 +:1039F00091F0DD2009F461C0B11074CE8F2D8F716C +:103A000028C0E3EF8E1641F1F4EF8F12F2CF8091D0 +:103A1000F30282FD32C08F2D8F71DD20D9F219C0E3 +:103A2000DD2071F024E02B1508F4A9CE2F2D2F7185 +:103A300081E090E002C0880F991F2A95E2F7B5CF88 +:103A400035E03B1508F49BCEF1CF8F2D8F71D1104F +:103A5000C1CF0E94340A93CE90E080E0DD2009F4CB +:103A60009ACF9F2D9F7121E030E0A90102C0440F41 +:103A7000551F9A95E2F7CA018ECFDD2099F05F2D90 +:103A80005F71F52E852F0E94340A8091F30282FF28 +:103A900007C0A8E0FA9EC0011124836080932E0223 +:103AA0008F2DD7CF81E00E94180AB1E0BB1508F036 +:103AB00066CE82E00E94180A62CEBB2059F089339C +:103AC00009F0D2CEEFEFF7EE23E0E150F0402040D6 +:103AD000E1F7C8CE8F2D8F717DCFE114F7E7FF0698 +:103AE00009F4FFCB21E0E21627E7F20609F403CC44 +:103AF000970137552F3F310511F008F04AC05701A3 +:103B0000BB24AEE0EA9EF00111249F012E5E3E4FE1 +:103B10006901E95EFE4F908180FB90F990838823D4 +:103B200009F4EECB0E948D0590936D0280936C0298 +:103B3000D60112968C9112978F5F12968C931297E2 +:103B40008091E3029091E402892B13968C93139752 +:103B500080914F0214968C9314971696ED91FC91D8 +:103B60001797309729F01C966D917C91C6010995A5 +:103B70008EE08A9DF0018B9DF00D1124EE5EFE4FCC +:103B8000858181FFBACB90E080E09093E50280933D +:103B9000E602D80112968C91882309F4E3C0C7018C +:103BA0009057839708F0C8C084E090E00E94A52950 +:103BB0009093F3028093F202F701E150F047E23272 +:103BC000F10508F0A5CBE65AF54D0C949A27E114BF +:103BD00037E7F30609F48BCB41E0E41647E7F40638 +:103BE00009F086CF82E084CB21E012966C91129787 +:103BF00013967C91139714968C910E94270C7C014C +:103C0000F8018281882369F18091E5029091E602B2 +:103C1000009739F18E159F0521F1BEE08B9FC00101 +:103C20001124FC01E95EFE4F2081246020838E5E1A +:103C30009E4FFC01F182E0820E94A7131092E302E2 +:103C400021E0D8014C9111965C91119712966C91DC +:103C5000129713967C91139714968C910E94270CBF +:103C60007C01F8018281882309F4B1CF97012250A9 +:103C700037472031310508F030CF8FEF93E00E94B5 +:103C8000972981117ECAEA94EA946AE1A62E63E03C +:103C9000B62EE1103FCAFE01339686E0DF011D9289 +:103CA0008A95E9F75AE0452E7501BFEFEB1AFB0A3A +:103CB000C5010E94972989831A82882309F461CA61 +:103CC000813009F070CA6501E2E0CE0ED11CC70157 +:103CD0000E9497298A83882309F453CA9FEF980F7B +:103CE000933008F025CAF3E0AF0EB11CC6010E9464 +:103CF00097298B83882309F444CA1C82CE0101963C +:103D00007C01D7012C91222379F2213009F08BCA52 +:103D100011969C91119712968C91913009F045CA99 +:103D2000B2E0EB0EF11C70E060E0893311F460E565 +:103D300070E00E94141840CAF6E1EF16FCE7FF0697 +:103D400009F021CC8091E4028A7A91E009F490E0B4 +:103D50009093DD01811199CB89E20E94DC080E94D9 +:103D600038130FCA26E1E2162CE7F20609F48FCBCE +:103D70008091E4028272F701E052F847E531F105E3 +:103D800008F014CCE458F54D0C949A271F93CF9368 +:103D9000DF938091FB01807F09F049C08091F80199 +:103DA000882309F444C080912D02D091FC016091D8 +:103DB000F6017091F701A091F901B091FA01C62FB7 +:103DC000C72316E0D81799F190E0109711F0CF3F74 +:103DD00019F401968770F6CF189F9001199F300D46 +:103DE0001124F901E350FE4F41814713F2CF408186 +:103DF0004613EFCF42814111ECCF438154814A1BDE +:103E00005B0B483C510528F78091FB018F70806166 +:103E10008093FB01F901EE5FFD4F80818F7080611F +:103E2000808386EF91E00E946F180E941009DF9155 +:103E3000CF911F910895A1E1B0E0E1E2FFE10C9480 +:103E4000BE278C0185E0F801DE011D9601900D92E0 +:103E50008A95E1F7F801E28086EFA82E81E0B82E7E +:103E60006091F9017091FA016115710509F426C19B +:103E70009091F6014091F701892F84238F3F09F437 +:103E80001DC120813181C380D480F090F801F601FA +:103E9000E61BF70BFF2009F4DCC08091FB01582FD3 +:103EA000507FE83CF10508F09FC051116BC0FE2C1B +:103EB000431314C0921312C0E11010C08F708061C0 +:103EC0008093FB01C5010E946F188091FB01F801EE +:103ED00085838F2D6196EAE00C94DA27C114D10412 +:103EE00029F0822F83238F3F09F003C180E0F82F50 +:103EF000F170DF2E80FF3CC080912D024091FC01CB +:103F000056E0841315C02D873E878D859E850E94BF +:103F1000F00B292F22952F702230F0F0243018F565 +:103F20009F70F1F0F8019581907FD1F4D12C1EC0E3 +:103F300090E0589FF001599FF00D1124E350FE4F7F +:103F40006181361306C06081261303C06281E612C8 +:103F50000FC001968770D5CF9F7011F0882331F381 +:103F6000805E883018F3C8010E946F18FD2CB1CF15 +:103F7000EE2009F4AECF8091FB0181608093FB01BC +:103F8000F12CA7CF431306C0921304C0F801EE2012 +:103F900009F479C0C8010E94FD0B882309F1EE20C5 +:103FA000F9F08091FB01803270F02091F6013091A0 +:103FB000F70138872F831986DB86CA868C87CE0166 +:103FC00007960E946F1886E0F801A6EFB1E0019015 +:103FD0000D928A95E1F70E94C61EFF24F39479CFD3 +:103FE000C8010E946F18F9CF51110AC086EF91E005 +:103FF0000E946F1886E0F50111928A95E9F7C0CF0B +:1040000043130FC092130DC0E1100BC0F80185835C +:10401000C8010E946F1886E0F50111928A95E9F7B0 +:1040200058CFC8010E94FD0B8823D1F2EE20C1F2C7 +:104030008091FB01803238F22091F6013091F70136 +:104040003A8329831B82DD82CC828E83CE01019646 +:10405000B8CFE83CF105F8F6FE2CEE2009F2431348 +:104060001FC092131DC08091FB0180FD10C0982FCE +:10407000907F69F0F8018583903F31F0982F907F11 +:10408000905F8F70892B8583C8010E946F1886E02E +:10409000F801A6EFB1E001900D928A95E1F719CFF2 +:1040A000C8010E94FD0B81118ECF8091FB018160C0 +:1040B0008093FB01C8010E946F180BCFEE2009F41A +:1040C0008FCFC8010E94FD0BF82E882309F488CFFA +:1040D00086E0F801A6EFB1E001900D928A95E1F734 +:1040E0008091F6019091F7010E94F00B0E94C61E8C +:1040F000F0CE81E08E25FBCEA7E1B0E0E2E8F0E271 +:104100000C94C5274B8B5C8B6D8B7E8B8F8B6111D9 +:104110001092E3021A8A198A85E0FE017396DE0185 +:104120001D9601900D928A95E1F786E0FE013D967D +:10413000DE01179601900D928A95E1F7CE01079660 +:104140000E941B1F882359F016E080912D02909148 +:10415000FC01891343C06796E3E00C94E12786E0F5 +:10416000FE013796DE01119601900D928A95E1F7D6 +:104170008A859B85892B41F38F81988589238F3F81 +:1041800019F32091FC0130E0C9010196877099274D +:1041900040912D024817190671F40E94D213109213 +:1041A000FC0110922D0286E0E6EFF1E0DF011D92A6 +:1041B0008A95E9F7C9CF96E0929FD001939FB00D01 +:1041C0001124A350BE4FFE01319601900D929A9595 +:1041D000E1F78093FC010E941009B6CF819FC001D6 +:1041E000112483509E4F0E941B1F882309F4B3CFD4 +:1041F00080912D0290E001968770992780932D027F +:10420000A4CF1F920F920FB60F9211242F933F93BA +:104210004F935F936F937F938F939F93AF93BF93CE +:10422000CF93DF93EF93FF93D091E900DF708091FC +:10423000EC00C82FC17080FDC0E81092E9008091A9 +:10424000F000877F8093F00078940E94F213109220 +:10425000E9008091F00088608093F000CD2BCF7052 +:10426000C093E900FF91EF91DF91CF91BF91AF91A2 +:104270009F918F917F916F915F914F913F912F917E +:104280000F900FBE0F901F9018951F920F920FB6B0 +:104290000F9211242F933F934F935F936F937F93CC +:1042A0008F939F93AF93BF93EF93FF938091E10020 +:1042B00082FF09C08091E20082FF05C08091E10089 +:1042C0008B7F8093E1008091DA0080FF24C0809191 +:1042D000D80080FF20C08091DA008E7F8093DA00C2 +:1042E0008091D90080FF9DC080E189BD82E189BDB8 +:1042F00009B400FEFDCF81E0809319038091F402A0 +:10430000811109C00E942E040E94CF048091E20016 +:1043100084608093E2008091E10080FF17C080916B +:10432000E20080FF13C08091E2008E7F8093E20064 +:104330008091E20080618093E2008091D8008062E9 +:104340008093D80019BC85E0809319038091E10027 +:1043500084FF2BC08091E20084FF27C080E189BDEB +:1043600082E189BD89B5982F917080FFFBCF809144 +:10437000D8008F7D8093D8008091E1008F7E80935C +:10438000E1008091E2008F7E8093E2008091E20064 +:1043900081608093E20080911A03882309F447C06A +:1043A00084E080931903809119038091E10083FFD9 +:1043B00027C08091E20083FF23C08091E100877FC6 +:1043C0008093E10082E08093190310921A03809198 +:1043D000E1008E7F8093E1008091E2008E7F8093E8 +:1043E000E2008091E20080618093E20042E060E0C0 +:1043F00080E00E949D048091F00088608093F0002E +:10440000FF91EF91BF91AF919F918F917F916F91AC +:104410005F914F913F912F910F900FBE0F901F9082 +:10442000189519BC109219031092F40274CF809160 +:10443000E30087FD93E090931903B5CF78941F9222 +:104440001FB61F9211248F939F93AF93BF938091B8 +:10445000EE029091EF02A091F002B091F10201966C +:10446000A11DB11D8093EE029093EF02A093F00284 +:10447000B093F102BF91AF919F918F911F901FBE9A +:104480001F9018951F921FB61F9211248F939F9310 +:10449000AF93BF938091ED02811113C08091EE0222 +:1044A0009091EF02A091F002B091F1024196A11D0E +:1044B000B11D8093EE029093EF02A093F002B093AF +:1044C000F102BF91AF919F918F911F901FBE1F90DE +:1044D0001895CDB7DEB7AA970FB6F894DEBF0FBE1A +:1044E000CDBF85B7806885BF85B7806885BF84B735 +:1044F000877F84BF0FB6F894A8958091600088618B +:1045000080936000109260000FBE80E890E00FB6CC +:10451000F89480936100909361000FBE82EB96E067 +:104520009093BB018093BA010E942E040E94CF0495 +:104530008091E20084608093E20078948091190376 +:104540008823A1F01091E9001F709091EC00892F51 +:10455000817090FD80E8182B1092E9008091E800AE +:1045600083FD0E94F2131F701093E90082E084BD66 +:1045700093E095BD9AEF97BD80936E000E944A0C20 +:10458000811102C00E946F0B02E711E099E7E92E4A +:1045900091E0F92ED8018D918D018F3F11F00E948D +:1045A000B406E016F106B1F709E711E08FE7E82E4F +:1045B00081E0F82EF80181918F018F3F11F00E9468 +:1045C000B406E016F106B1F787E0EFE6F2E0DF01AE +:1045D000282F1D922A95E9F7E9E5F2E0DF011D9207 +:1045E0008A95E9F78AE290E00E945228BC019093F4 +:1045F00058028093570230E020E0FB01E20FF31FE6 +:1046000096E04081417041939150D9F72A5F3F4F26 +:104610002A32310591F70E94B411811102C00E9423 +:10462000391182E090E00E9497298093640284E02F +:1046300090E00E94A5299093F3028093F2020E94D9 +:10464000C011EFE3FCE93197F1F700C000000E94D0 +:10465000C01180916F0281FF08C06FEF7FEF90E083 +:1046600080E00E94C9290E94BD0A83E090E00E9478 +:10467000972990E00E94830980912303909124035D +:104680000E949E0980916002811133C00E94B41182 +:10469000811104C00E9439110E94291188E090E024 +:1046A0000E949F296093DE027093DF028093E002F4 +:1046B0009093E1026E7F71F40E94291188E090E0EE +:1046C0000E949F296093DE027093DF028093E002D4 +:1046D0009093E1020E940D06109281028091DE0209 +:1046E00080FF04C060E086950E94BF1081E0809347 +:1046F000600285E892E090937902809378028AE0E4 +:1047000091E09093EA028093E90218E1E12EF12C06 +:1047100000E4D02ECC24C3948091190300E112E16F +:10472000853009F49BC00E94C011A5E68A2EA2E044 +:104730009A2EBFE6AB2EB2E0BB2ED501F4019191CB +:104740008D9122E0EC36F20709F4A5C09817B9F371 +:1047500010E0D5010D915D01F40151904F0150160B +:1047600019F15026712C66246394862D8521A1F0C1 +:104770007EA21FA391E0862D802309F490E098A7E4 +:104780000E948D058160782F9AA789A74EA15FA10D +:1047900068A58AA50E947C207394660CF6E07F12BF +:1047A000E4CFF401319700831F5F173091F68FB784 +:1047B000F8944091EE025091EF026091F0027091F6 +:1047C000F1028FBF88C080911903843009F437C08B +:1047D00080E00E94950910928102809177028111F8 +:1047E0000DC0C09277028091DE02982F9170909355 +:1047F00061028E7F8093DE020E94790C1092ED029E +:104800000FB6F894A895E09260000FBED0926000B9 +:1048100083B7817F846083BF83B7816083BF7894CF +:10482000889583B78E7F83BF0FB6F894A895809143 +:104830006000886180936000109260000FBE8091DC +:104840001803882359F00E94C011EFE6F2E081912D +:1048500081110FC322E0E637F207C9F780911903EF +:10486000853009F4B0CF0E94D2130E94E3050E9464 +:1048700095091092770280916102882329F00E94A5 +:10488000FA100E94630C4FCF809182028823C9F3F3 +:104890000E94790CF6CF98135BCF0E948D058C0196 +:1048A000809162029091630208171907A1F08FEFBF +:1048B00089A38AA31BA20E948D058160782F9DA3E6 +:1048C0008CA349A15AA16BA18DA10E947C201093B9 +:1048D0006302009362028091E5029091E602892BC7 +:1048E00021F120916C0230916D024FB7F8948091C4 +:1048F000EE029091EF02A091F002B091F1024FBF51 +:10490000821B930B893C910580F08091E5022EE09B +:10491000829FC0011124FC01E95EFE4F208122FD2F +:1049200004C08E5E9E4F0E94A7138091810288234F +:10493000D1F180918002E091DE02E695E81BE093E0 +:104940007C02823009F083C0F0E0E655FD4FE4912F +:104950000E2F10E0F3EBAF2EFFE0BF2E80917D0213 +:10496000882361F010927D020E948D0590937B0256 +:1049700080937A0210927F0210927E020E948D052F +:10498000E0917A02F0917B028E1B9F0B8F3F9F4735 +:1049900050F4E00FF11FF0937B02E0937A028AE774 +:1049A00092E0F501099580917602882389F01092B2 +:1049B000760280918102811106C08091DE0260E062 +:1049C00086950E94BF108091DE0280FF0E94790CC4 +:1049D0000E94E30590916E02891779F080936E0230 +:1049E0009FB7F8944091EE025091EF026091F0026F +:1049F0007091F1029FBF0E94950980911903843044 +:104A000009F08ACE83E08093E9008091E80082FF7C +:104A100083CE8091E80090E085FF06C00E944D049F +:104A2000882309F480C091E08091E8008B7780931F +:104A3000E800992309F470CE8981EFEFE80FE331A4 +:104A400008F098C0F0E0EF56F54D0C949A278630A8 +:104A500059F4F0E0E955FD4FE4910E2F10E0E3EA40 +:104A6000AE2EEFE0BE2E7ACF893061F4E695F0E00D +:104A7000EC55FD4FE4910E2F10E077E1A72E7FE07B +:104A8000B72E6CCF8F3061F4E695F0E0EF55FD4F17 +:104A9000E4910E2F10E062EBA62E6EE0B62E5ECFF4 +:104AA000853159F4F0E0E256FD4FE4910E2F10E00D +:104AB00054E6A52E5EE0B52E51CF08E210E029EEB7 +:104AC000A22E2DE0B22E883109F448CF833249F46A +:104AD000ECE9F2E00591149142E5A42E4FE0B42EEA +:104AE0003DCF04EF11E092EBA92E9DE0B92E843268 +:104AF00009F434CF853281F48E2F63E00E94582769 +:104B0000E92FF0E0E756FD4FE4910E2F10E038E179 +:104B1000A32E3DE0B32E22CF00ED17E088E8A82EAB +:104B200085E0B82E1BCF00E210E0CE0101965C01BB +:104B30008091E80085FD0AC08091E8008B77809322 +:104B4000E8000E944D04882399F36DCF8091F10015 +:104B5000D5018D935D010150110951F764CF1A827F +:104B60008BE08B8328C08A81823009F498C128F4B5 +:104B7000813051F18FEF89831EC0833039F084304A +:104B8000C9F71B821C821D821E8215C080916F0294 +:104B90008B83809170028C83809171028D838091D0 +:104BA00072028E83809173028F8380917402888752 +:104BB00080917502898740E250E0BE016F5F7F4FB0 +:104BC00082E00E94570AA8CD2FB7F8946091EE02B8 +:104BD0007091EF028091F0029091F1022FBF0E943C +:104BE000A0276B837C838D839E83E5CF8A8182306F +:104BF00089F0853009F0BECF8091DE0280FF15C0BC +:104C00008091DE028E7F8093DE02109281020E94EC +:104C1000790CD1CF6B817C818D819E810E94A027F0 +:104C200085E290E00E94AB29C6CF0E94FA10C3CF64 +:104C30004C816B818A810E947F0B98278927982756 +:104C40009E838D83B8CF2D813E8132272327322743 +:104C50004C816B818A810E94F10AADCF0E94170BB3 +:104C6000AACF9A81923009F085CF8830B1F189308E +:104C700009F45EC08B81823009F1A8F4813009F01B +:104C80009ACF8C81BFEF8B9FC00111246FEF70E032 +:104C90000E947227462F20E06091E0028091DF029F +:104CA0000E94DA0F88CF8330A1F0843009F083CFDF +:104CB00020E04091E1026D818C81F2CF8C818823CC +:104CC00009F49ECF0E94FA1060E08C810E94BF1010 +:104CD00072CF8C818093E2026ECF8B818230E1F0C3 +:104CE00078F4813009F067CF8091E102EFEF8E9F79 +:104CF000C00111246FEF70E00E9472276C835BCFBC +:104D0000833099F0843009F056CF8091DF028C8394 +:104D10008091E0028D834FCF8091DE0280FF03C03F +:104D200086958C8348CF80E0FCCF8091E202F9CF5A +:104D30006091DE027091DF028091E0029091E102C9 +:104D40000E94C70F38CF80E18A8335CF1A8286EE62 +:104D500008CFAA80BB80BA24AB24BA248E010F5F8F +:104D60001F4F8C80800E912E911CC501865E9C4F3A +:104D70000815190509F41FCFF6EEAF16B10458F463 +:104D80000E949729D80114968C93FFEFAF1ABF0A9F +:104D90000F5F1F4FEACFF8011482F7CF0A811B8102 +:104DA000102701271027CE0101964C01AC80A00EE0 +:104DB000B12EB11CC801865E9C4F0A151B0509F473 +:104DC000FACE063E110528F4D40114966C910E9487 +:104DD000AB29BFEF8B1A9B0A0F5F1F4FEBCF0E94CF +:104DE000E10AE9CE89E0B0CFAA80BB80BA24AB2427 +:104DF000BA248E010F5F1F4F8C80800E912E911C64 +:104E0000C50186968016910609F4D5CEE4EFAE165C +:104E1000E2E0BE0658F40E949729D80114968C93BC +:104E2000FFEFAF1ABF0A0F5F1F4FEACFF8011482DE +:104E3000F7CF0A811B81102701271027CE01019689 +:104E40004C01AC80A00EB12EB11CC8018696A016F4 +:104E5000B10609F4B0CE043FA2E01A0720F4F40131 +:104E600064810E94AB29FFEF8F1A9F0A0F5F1F4FCB +:104E7000ECCF09BD19BD09B400FEFDCF8091D8006B +:104E80008F7D8093D8008091E00082608093E00065 +:104E90008091E00081FDFCCF0E94D213DFCC85E23F +:104EA00090E00E9497291B821C821D828E8383CEF4 +:104EB000991B79E004C0991F961708F0961B881F6C +:104EC0007A95C9F78095089587FB082E062687FDF9 +:104ED000819567FD61950E9458270EF4919507FC16 +:104EE00081950895AA1BBB1B51E107C0AA1FBB1FD8 +:104EF000A617B70710F0A61BB70B881F991F5A9566 +:104F0000A9F780959095BC01CD01089597FB072ED8 +:104F100016F4009407D077FD09D00E94722707FC91 +:104F200005D03EF4909581959F4F089570956195B9 +:104F30007F4F0895EE0FFF1F0590F491E02D099427 +:104F400069279627692778278727782708950E9459 +:104F5000332A332312F48A1B9B0B0C94B1270E9433 +:104F6000332AB7FF0895821B930B08952F923F9227 +:104F70004F925F926F927F928F929F92AF92BF9269 +:104F8000CF92DF92EF92FF920F931F93CF93DF9315 +:104F9000CDB7DEB7CA1BDB0B0FB6F894DEBF0FBE72 +:104FA000CDBF09942A88398848885F846E847D84BF +:104FB0008C849B84AA84B984C884DF80EE80FD80C1 +:104FC0000C811B81AA81B981CE0FD11D0FB6F89437 +:104FD000DEBF0FBECDBFED0108958F929F92AF92BD +:104FE000BF92CF92DF92EF92FF92CF93DF93EC01CB +:104FF000688179818A819B8161157105810591059F +:1050000021F464E279ED8BE597E02DE133EF41E0A7 +:1050100050E00E94DF2949015A019B01AC01A7EA37 +:10502000B1E40E94FE296B017C01ACEEB4EFA50156 +:1050300094010E940C2ADC01CB018C0D9D1DAE1D3C +:10504000BF1DB7FF03C00197A109B04888839983AA +:10505000AA83BB839F77DF91CF91FF90EF90DF9082 +:10506000CF90BF90AF909F908F9008950E94ED27B2 +:10507000089580E091E00E94ED270895B0E0A0E05F +:105080008093000190930101A0930201B09303016A +:105090000895FB01DC0102C005900D924150504083 +:1050A000D8F708950F931F93CF93DF938230910524 +:1050B00010F482E090E0E0912703F091280330E0C3 +:1050C00020E0B0E0A0E0309799F42115310509F413 +:1050D00047C0281B390B24303105C0F58A819B81DC +:1050E0006115710571F1FB0193838283FE0111C08B +:1050F000408151810281138148175907F8F0481700 +:10510000590799F4109761F012960C931297139621 +:105110001C933296CF01DF91CF911F910F9108958B +:105120000093270310932803F4CF2115310519F0BC +:105130004217530718F49A01BD01EF01DF01F8018E +:10514000C2CF9093280380932703D0CFFE01E20FB4 +:10515000F31F819391932250310939832883DACF49 +:105160002091250330912603232B41F42091060141 +:1051700030910701309326032093250320910401E9 +:10518000309105012115310541F42DB73EB740910D +:10519000080150910901241B350B409125035091C2 +:1051A00026034217530708F0B5CF241B350B2817E9 +:1051B000390708F4AFCFBC016E5F7F4F2617370762 +:1051C00008F4A8CF640F751F70932603609325031E +:1051D000FA01819391939ECFCF93DF930097E9F0EB +:1051E000FC01329713821282C0912703D0912803C9 +:1051F000DE0130E020E02097A1F420813181820F90 +:10520000931F20912503309126032817390709F0B1 +:1052100067C0F0932603E0932503DF91CF910895B3 +:10522000DA01AE17BF0708F040C012964D915C91AD +:1052300013979D014115510599F7D9011396FC93D8 +:10524000EE9312974D915D91A40FB51FEA17FB07DE +:1052500079F4808191810296840F951FD90111966E +:105260009C938E938281938113969C938E93129735 +:10527000B0E0A0E08A819B810097B9F5FE018191A1 +:105280009191E80FF91F80912503909126038E17C5 +:105290009F0719F6109761F51092280310922703C3 +:1052A000D0932603C0932503B8CFB383A283408154 +:1052B0005181840F951FA817B90771F44E5F5F4F96 +:1052C0008D919C911197480F591F518340831296DD +:1052D0008D919C91938382832115310509F0ADCF87 +:1052E000F0932803E093270398CFDE01EC01C2CFAF +:1052F00013961C921E921297D3CFFC01415050403E +:1053000030F001900616D1F73197CF010895882724 +:1053100099270895FB01DC0104C08D91019080194B +:1053200021F441505040C8F7881B990B0895F99912 +:10533000FECF92BD81BDF89A992780B50895A6E168 +:10534000B0E044E050E00C94D129A8E1B0E042E0A4 +:1053500050E00C94D129262FF999FECF92BD81BD42 +:10536000F89A019700B4021639F01FBA20BD0FB6A3 +:10537000F894FA9AF99A0FBE08950396272F0E947F +:10538000AC290E94AB29252F0E94AC29242F0C9414 +:10539000AC290196272F0E94AC290C94AB29DC0183 +:1053A000CB01FC01F999FECF06C0F2BDE1BDF89A30 +:1053B000319600B40D9241505040B8F70895052E33 +:1053C00097FB1EF400940E94F62957FD07D00E9417 +:1053D000112A07FC03D04EF40C94F6295095409501 +:1053E000309521953F4F4F4F5F4F08959095809591 +:1053F000709561957F4F8F4F9F4F08950E94332A7C +:10540000A59F900DB49F900DA49F800D911D112418 +:105410000895B7FF0C94FE290E94FE29821B930B6E +:105420000895A1E21A2EAA1BBB1BFD010DC0AA1FE5 +:10543000BB1FEE1FFF1FA217B307E407F50720F0FD +:10544000A21BB30BE40BF50B661F771F881F991F78 +:105450001A9469F760957095809590959B01AC01C1 +:10546000BD01CF010895A29FB001B39FC001A39FCA +:10547000700D811D1124911DB29F700D811D11248D +:10548000911D0895F894FFCFD314FB149E16FB14BE +:105490009E162E154F159E164D165A16581B581B44 +:1054A000901B901B381CBF1BBF1BBF1B521CDC1C5E +:1054B000ED1CED1CC219371ACA1994199819CE1986 +:1054C0009C19D219DE19A819301AAC19E219B019B1 +:1054D000E6190E1AB419EA19151ABA19F019F819B9 +:1054E000A019D619A419DA19BE19F419041A1E1A2A +:1054F0002E1A8E19C6193E1A511A6F1A761A7B1A6D +:10550000801A851A8A1A8F1A941A991A9E1AA31A3F +:10551000A61AAB1AAE1AB11AB41AB71ABA1ABD1A29 +:10552000C01AAF25B325F625182623262E263126A8 +:1055300031263126BA25BA25A326A626A926CE26A7 +:08554000EF26F226F4261927DC +:105548000100000000002D0320008A05990A890542 +:10555800920A0000000000000000531857170000CE +:10556800000000000000000037184617000001196D +:105578001A1B1C1D1E1F202122010201018182838A +:10558800E200E900EA00B500B600B700CD008301EB +:10559800CC008A01920194012102230224022502EF +:1055A800260227022A02B300B4006F0070009F0190 +:1055B800CB01F4F5F6F7313332946697C6343500EB +:1055C80001020202020606060909090909090F0F64 +:1055D8000F0F0F0F15151518191919191919191968 +:1055E8001919232425252525252540226D95017384 +:0A55F80001060165077E079E07000B +:00000001FF diff --git a/reviung_reviung41_via.hex b/reviung_reviung41_via.hex new file mode 100644 index 000000000000..14ac9a78b69a --- /dev/null +++ b/reviung_reviung41_via.hex @@ -0,0 +1,1498 @@ +:100000000C943D070C945A070C945A070C945A0709 +:100010000C945A070C945A070C945A070C945A07DC +:100020000C945A070C945A070C94DC250C949825D0 +:100030000C942F270C945A070C945A070C945A07C7 +:100040000C945A070C945A070C945A070C945A07AC +:100050000C945A070C940B270C945A070C945A07CB +:100060000C945A070C945A070C945A070C945A078C +:100070000C945A070C945A070C945A070C945A077C +:100080000C945A070C945A070C945A070C945A076C +:100090000C945A070C945A070C945A070C945A075C +:1000A0000C945A070C945A070C945A070631FF090E +:1000B00074A1010975150026FF00952075088102BD +:1000C0000976150026FF00952075089102C00501EC +:1000D0000980A101850319012AB700150126B7007F +:1000E000950175108100C0050C0901A10185041955 +:1000F000012AA002150126A002950175108100C0F9 +:100100000660FF0961A1010962150026FF00952024 +:10011000750881020963150026FF00952075089176 +:1001200002C005010906A101050719E029E715002C +:100130002501950875018102950175088101050762 +:10014000190029FF150026FF009506750881000596 +:10015000081901290595057501910295017503910D +:1001600001C00000000000000000000000000000CE +:10017000000000000000000000000000000000007F +:100180000000000000007E0F00D4FFFFFFC700004A +:10019000007800000000000000002A2B280000006A +:1001A0000000000000000000000000000029000026 +:1001B00000002C1E3420212224342627252E362D03 +:1001C0003738271E1F202122232425263333362E9D +:1001D00037381F0405060708090A0B0C0D0E0F100F +:1001E0001112131415161718191A1B1C1D2F313054 +:1001F000232D350405060708090A0B0C0D0E0F10F8 +:100200001112131415161718191A1B1C1D2F313033 +:10021000354C7267626C69676874206469736162E7 +:100220006C65205B454550524F4D5D3A20726762C8 +:100230006C696768745F636F6E6669672E656E616F +:10024000626C65203D2025750A007267626C6967E3 +:10025000687420656E61626C65205B454550524F45 +:100260004D5D3A207267626C696768745F636F6E98 +:100270006669672E656E61626C65203D2025750A92 +:10028000007267626C6967687420746F67676C6579 +:10029000205B454550524F4D5D3A207267626C6954 +:1002A0006768745F636F6E6669672E656E61626C06 +:1002B00065203D2025750A0044454255473A206493 +:1002C000697361626C65642E0A0044454255473A81 +:1002D00020656E61626C65642E0A003F00433E201B +:1002E000004F6E6573686F743A2061637469766558 +:1002F0003A2025640A000A002530325820006B6538 +:1003000079626F6172645F7265706F72743A200017 +:100310007267626C696768745F636F6E6669672E87 +:100320007370656564203D2025640A007267626C05 +:10033000696768745F636F6E6669672E76616C20AB +:100340003D2025640A007267626C696768745F63A8 +:100350006F6E6669672E736174203D2025640A0004 +:100360007267626C696768745F636F6E6669672E37 +:10037000687565203D2025640A007267686C6967AE +:1003800068745F636F6E6669672E6D6F6465203D8C +:100390002025640A007267626C696768745F636F26 +:1003A0006E6669672E656E61626C65203D2025640E +:1003B0000A007267626C696768745F636F6E666972 +:1003C0006720454550524F4D3A0A007267626C698A +:1003D0006768745F696E6974207267626C696768C8 +:1003E000745F636F6E6669672E6D6F6465203D2074 +:1003F000302E2057726974652064656661756C746F +:100400002076616C75657320746F20454550524F9E +:100410004D2E0A007267626C696768745F696E6965 +:1004200074206565636F6E666967206973206E6FFF +:100430007420656E61626C65642E0A007267626C7E +:10044000696768745F696E6974207374617274217E +:100450000A007267626C696768745F696E6974200C +:1004600063616C6C65642E0A005B735D000A002595 +:10047000303862003A200025303258000A722F636B +:100480002030313233343536370A0000047F3F1FC5 +:10049000643214643214783C1E1E140A050A0025C6 +:1004A000303258006C65645F7461736B3A2000727F +:1004B00067626C6967687420736574207370656522 +:1004C00064205B4E4F454550524F4D5D3A20257597 +:1004D0000A00000101010101010101010202020201 +:1004E00002020202020303030303030303040404DE +:1004F00004040404050505050506060606060707A7 +:1005000007070708080808090909090A0A0A0B0B5E +:100510000B0C0C0C0D0D0D0E0E0E0F0F0F101011FD +:100520001111121213131414151516161717181883 +:1005300019191A1A1B1B1C1D1D1E1E1F20202122EB +:1005400022232424252626272829292A2B2C2D2D31 +:100550002E2F30313232333435363738393A3B3C4E +:100560003D3E3F404142434445464748494A4C4D41 +:100570004E4F50515354555658595A5B5D5E5F610A +:100580006264656668696B6C6D6F7072737577789D +:100590007A7B7D7E8082838587888A8C8E8F9193FB +:1005A0009596989A9C9EA0A2A3A5A7A9ABADAFB122 +:1005B000B3B5B7BABCBEC0C2C4C6C9CBCDCFD1D407 +:1005C000D6D8DBDDDFE2E4E7E9EBEEF0F3F5F8FAAD +:1005D000FDFF7267626C69676874206D6F646520E7 +:1005E0005B4E4F454550524F4D5D3A2025750A00F0 +:1005F0007267626C69676874206D6F6465205B4523 +:100600004550524F4D5D3A2025750A007267626C65 +:100610006967687420656E61626C65205B4E4F454A +:100620004550524F4D5D3A207267626C696768743D +:100630005F636F6E6669672E656E61626C65203DF3 +:100640002025750A007267626C69676874206469A6 +:100650007361626C65205B4E4F454550524F4D5D56 +:100660003A207267626C696768745F636F6E66696F +:10067000672E656E61626C65203D2025750A0072EB +:1006800067626C696768742073657420687376208C +:100690005B4E4F454550524F4D5D3A2025752C25F8 +:1006A000752C25750A007267626C6967687420731F +:1006B000657420687376205B454550524F4D5D3A16 +:1006C0002025752C25752C25750A007267626C69CA +:1006D000676874207261696E626F77207365742039 +:1006E0006873763A2025642C25642C25642C2575A6 +:1006F0000A00FFAA7F55407267626C6967687420C0 +:1007000074696D657220656E61626C65642E0A00A5 +:100710007267626C696768742074696D65722064C1 +:10072000697361626C652E0A002223252628292A16 +:100730002C2D2F3032333536383A3B3D3E40424344 +:100740004547494A4C4E5051535557595A5C5E6083 +:1007500062646668696B6D6F71737577797B7D7F95 +:1007600081838587898A8C8E90929496989A9C9E94 +:100770009FA1A3A5A7A8AAACAEAFB1B3B4B6B8B9B0 +:10078000BBBCBEBFC1C2C3C5C6C7C9CACBCCCDCE18 +:10079000D0D1D2D2D3D4D5D6D7D7D8D9D9DADADBFB +:1007A000DBDBDCDCDCDCDCDDDDDDDDDCDCDCDCDC87 +:1007B000DBDBDBDADAD9D9D8D7D7D6D5D4D3D2D2C6 +:1007C000D1D0CECDCCCBCAC9C7C6C5C3C2C1BFBEAE +:1007D000BCBBB9B8B6B4B3B1AFAEACAAA8A7A5A319 +:1007E000A19F9E9C9A98969492908E8C8A898785D8 +:1007F00083817F7D7B79777573716F6D6B696866B7 +:100800006462605E5C5A5957555351504E4C4A4988 +:1008100047454342403E3D3B3A3836353332302F30 +:100820002D2C2A2928262523226B65796D61705F7E +:10083000636F6E6669672E7261773A202530325891 +:100840000A2E737761705F636F6E74726F6C5F6393 +:100850006170736C6F636B3A2025750A2E6361704B +:10086000736C6F636B5F746F5F636F6E74726F6CCA +:100870003A2025750A2E737761705F6C63746C5F24 +:100880006C6775693A2025750A2E737761705F72FF +:1008900063746C5F726775693A2025750A2E7377E9 +:1008A00061705F6C616C745F6C6775693A20257567 +:1008B0000A2E737761705F72616C745F726775691D +:1008C0003A2025750A2E6E6F5F6775693A20257587 +:1008D0000A2E737761705F67726176655F65736317 +:1008E0003A2025750A2E737761705F6261636B73BE +:1008F0006C6173685F6261636B73706163653A20FA +:1009000025750A2E6E6B726F3A2025750A2E737745 +:1009100061705F6573636170655F636170736C6F55 +:10092000636B3A2025750A0064656275675F636FC3 +:100930006E6669672E7261773A20253032580A2E2A +:10094000656E61626C653A2025750A2E6D61747260 +:1009500069783A2025750A2E6B6579626F61726439 +:100960003A2025750A2E6D6F7573653A2025750A34 +:10097000006565636F6E6669673A0A6465666175EE +:100980006C745F6C617965723A2025750A000A09FA +:100990002D204D61676963202D0A443A0944656240 +:1009A0007567204D65737361676520546F67676C69 +:1009B000650A583A094D6174726978204465627518 +:1009C00067204D6F646520546F67676C65202D202C +:1009D00053686F77206B65797072657373657320E8 +:1009E000696E206D617472697820677269640A4B60 +:1009F0003A094B6579626F6172642044656275677C +:100A000020546F67676C65202D2053686F77206BCB +:100A100065797072657373207265706F72740A4DB8 +:100A20003A094465627567204D6F75736520546F90 +:100A300067676C650A563A0956657273696F6E0A84 +:100A4000533A095374617475730A433A09416374E4 +:100A5000697661746520436F6E736F6C65204D6FAE +:100A600064650A46312D4631303A0953776974631B +:100A70006820746F204C6179657220302D392028F0 +:100A8000463130203D204C30290A302D393A095367 +:100A9000776974636820746F204C617965722030C7 +:100AA0002D390A47524156453A09537769746368AC +:100AB00020746F204C6179657220302028616C743D +:100AC00065726E617465290A423A094A756D702033 +:100AD000746F20426F6F746C6F616465720A455366 +:100AE000433A094A756D7020746F20426F6F746CC1 +:100AF0006F616465722028616C7465726E617465E3 +:100B0000290A453A095072696E7420454550524F82 +:100B10004D2053657474696E67730A4241434B53A9 +:100B2000504143453A09436C656172204545505236 +:100B30004F4D0A000A092D20436F6E736F6C6520BC +:100B40002D0A4553432F713A09717569740A0025BE +:100B500073000A092D20537461747573202D0A687F +:100B60006F73745F6B6579626F6172645F6C6564EB +:100B70007328293A20253032580A6B6579626F61F3 +:100B800072645F70726F746F636F6C3A20253032DD +:100B9000580A6B6579626F6172645F69646C653A6B +:100BA00020253032580A74696D65725F7265616420 +:100BB000333228293A202530386C580A003F000A81 +:100BC0006D6F7573653A206F66660A000A6D6F7502 +:100BD00073653A206F6E0A000A6B6579626F617205 +:100BE000643A206F66660A000A6B6579626F61720B +:100BF000643A206F6E0A000A6D61747269783A2057 +:100C00006F66660A000A6D61747269783A206F6EC9 +:100C10000A000A64656275673A206F66660A000A10 +:100C200064656275673A206F6E0A000A0A4A756D3C +:100C300070696E6720746F20626F6F746C6F61648F +:100C400065722E2E2E2000433E2000436C6561729B +:100C5000696E6720454550524F4D0A004C25640A85 +:100C6000002B0014001A00080015001700E0000413 +:100C7000001600070009000A00E1001D001B000625 +:100C800000190005001C0018000C00120013002AB7 +:100C9000000B000D000E000F003300340011001097 +:100CA000003600370038002872E30001512C0002A2 +:100CB00051E643000001001E021F02200221022211 +:100CC0000201002D022E022F023002310201002902 +:100CD00000E300E200390034022302240225022648 +:100CE0000227024C005000510052004F00350035E1 +:100CF000024A004D004B004E0046002C72010001DC +:100D000000280001000100000001001E001F00205B +:100D1000002100220001002D002E002F00300031A4 +:100D20000001002900E700E6003900340023002418 +:100D3000002500260027004C003A003B003C003D07 +:100D4000003E003F00400041004200430044004597 +:100D500000010001002A00010001000000C95CC779 +:100D60005CC55CC35C0000C25CCA5CC85CC65CC499 +:100D70005C00000000000000000000000000000017 +:100D80000000000000000000000000000000000063 +:100D9000000000000000000000005C0000000000F7 +:100DA000000000000001000100000001000100003F +:100DB000005B435D005B445D005B535D005B575D22 +:100DC000005B525D0009027B00040100A0FA0904E7 +:100DD000000001030101000921110100012240006E +:100DE0000705810308000109040100020300000057 +:100DF00009211101000122220007058203200001C0 +:100E0000070503032000010904020001030000009C +:100E1000092111010001223200070584032000018D +:100E2000090403000203000000092111010001224E +:100E300022000705850320000107050503200001A6 +:100E400012010002000000080778CBDC010001025B +:100E500000011403720065007600690075006E00E1 +:100E600067003400310000000C0367007400690063 +:100E70007000730000000403090411241FBECFEFAB +:100E8000DAE0DEBFCDBF12E0A0E0B1E0ECE3FCE5CC +:100E900002C005900D92AA34B107D9F723E0AAE465 +:100EA000B2E001C01D92AB32B207E1F70E945627B3 +:100EB0000C94F32D0C940000FF93EF93E0914A0201 +:100EC000F0914B02309709F00995EF91FF91089549 +:100ED000FC018591803011F0EFDFFBCF0895FF27F3 +:100EE000E0E230E247FF0CC0419597FF09C0EDE218 +:100EF0006095709580959095611D711D811D911D66 +:100F000027FF02C0219530E350E2AA27660F771F22 +:100F1000881F991FAA1FA41710F0A41B63955A9548 +:100F2000A9F7AA3008F0A95FA05DAF93F39561150A +:100F300071058105910541F7ED3211F4EF93F395B9 +:100F4000F21718F43F93F395FBCF8F91B5DFFA9525 +:100F5000E1F70895E991F9918591803021F085328A +:100F600019F0AADFF9CF089520E0E89455915532A1 +:100F7000C1F3503311F4689455915A3348F45053E7 +:100F800090F3220F022E220F220F200D250FF4CFF7 +:100F90000EF4219589919991533619F3533729F11C +:100FA000533559F1BC0188279927E8945C3621F420 +:100FB0008991999168945591543639F446EF7EF0B1 +:100FC00077FF0DC08FEF9FEF0AC055374AE039F029 +:100FD000583540E121F0523642E009F00895FF9380 +:100FE000EF937DDFEF91FF91B7CFFF93EF93FC017C +:100FF00081918030B9F360DFFBCFFF93EF9368DF1F +:10100000F1CFDF93CF93CDB7DEB72596A3DFCF9196 +:10101000DF910895E8EDF0E080818E7F808310926B +:10102000E2001092DA001092E100A0EEB0E08C91A4 +:1010300081608C9380818F77808319BCA7EDB0E0AD +:101040008C918E7F8C9380818F7E808310920C0395 +:1010500008952091E4003091E50095E6A9012091E2 +:10106000EC00822F817020FF06C08091E80080FF95 +:1010700006C080E008952091E80022FD1AC080910A +:101080001903882389F0853089F08091EB0085FD74 +:101090000FC02091E4003091E50042175307F9F2A8 +:1010A0009150E1F684E0089582E0089583E0089588 +:1010B00081E00895EF92FF920F931F93CF937C01ED +:1010C0008B010E942908C82F811117C08091E80068 +:1010D00085FD0BC08091E8008E778093E8000E9428 +:1010E0002908882399F3C82F08C0F70181917F014F +:1010F0008093F1000150110949F78C2FCF911F9176 +:101100000F91FF90EF90089580911B0387FF13C00C +:101110008091E80082FF06C08091E8008B77809381 +:10112000E80004C0809119038111F2CF08958091E5 +:1011300019038823D9F38091E80080FFF8CF8091CC +:10114000E8008E77ECCF982F9093E900242F762F2C +:1011500050E0891731F07091EC002091ED00509132 +:10116000F00021FD07C09F5F973071F78093E90081 +:1011700081E008953091EB003E7F3093EB00309199 +:10118000ED003D7F3093ED003091EB003160309306 +:10119000EB007093EC002093ED005093F000209151 +:1011A000EE0027FDE0CF80E00895B0E0A0E0EBED99 +:1011B000F8E00C94642DC8EDD0E088818F7E8883A0 +:1011C000E7EDF0E080818160808384E082BF81E090 +:1011D00080930C0388818E7F888302EE10E0F801F3 +:1011E00010821092DA0081EEC82ED12CF601108206 +:1011F00088818F77888388818068888388818F7DC4 +:10120000888319BC1092190310921A0310921803C4 +:101210001092170390EEE92EF12CF70180818B7F5D +:10122000808388818160888342E060E080E00E9462 +:10123000A308F60180818E7F8083F8018081816020 +:101240008083808188608083F70180818E7F8083A6 +:10125000888180618883CDB7DEB7E8E00C94802D6B +:10126000FC01809121039091220386179707A0F03B +:101270006115710529F49091E8009E779093E8003C +:1012800090E06115710551F4911108C08091E8005A +:1012900082FF34C080E00895BC01F2CF8091190331 +:1012A0008823C1F18530C1F18091E80083FD30C011 +:1012B0008091E80082FDEACF8091E80080FFE1CFD5 +:1012C0008091F3002091F200382F6115710519F01B +:1012D0002830310558F091E02830310509F090E0D0 +:1012E0002091E8002E772093E800CBCF8191809366 +:1012F000F100615071092F5F3F4FE7CF80911903D3 +:10130000882341F0853041F08091E80083FFBECF13 +:1013100081E0089582E0089583E008950895089596 +:10132000089580910E03089587E797E79093010849 +:101330008093000888E19AE00FB6F894A89580930E +:1013400060000FBE90936000FFCF2FB7F8946091BC +:1013500023037091240380912503909126032FBFCE +:1013600008952FB7F8948091230390912403A091BE +:101370002503B09126032FBF0895209103033091D8 +:1013800004032817390781F0909304038093030323 +:10139000E0910103F0910203309731F00680F7816C +:1013A000E02DBC0184E0099508952091FF02309161 +:1013B00000032817390781F0909300038093FF0200 +:1013C000E0910103F0910203309731F00680F7813C +:1013D000E02DBC0183E009950895E0910103F091AF +:1013E0000203309729F00190F081E02D09950895CE +:1013F00080E00895FA01811101C0FB01099508956B +:101400008091F802982F9E7F29F4817082608093EA +:10141000F80208958A34E8F381708864F8CFAF92B7 +:10142000BF92DF92EF92FF920F931F93CF93DF93C0 +:10143000082F162FE901E42FF0E0EE52FB4F611167 +:1014400010C0E4915E2F4E2F4983E8835A83DF91C9 +:10145000CF911F910F91FF90EF90DF90BF90AF90D1 +:101460000895E62EF12C4491D42EE42FF0E026E0EE +:10147000829FC00111242FEF30E0B9010E94D22CCD +:10148000802F90E0880F991F55E5569FD001579FF8 +:10149000B00D11248A1B9B0B982F990F890F5901AE +:1014A000AE18BF08AE9ED001AF9EB00DBE9EB00D6F +:1014B00011245B2F189F80011124012F112759013E +:1014C000A01AB10AAE9E8001AF9E100DBE9E100DF7 +:1014D00011245901A81AB108AE9CC001AF9C900D0F +:1014E000BE9C900D1124892F9927281B390B2E9F04 +:1014F000C0012F9F900D3E9F900D1124E92F623067 +:101500007105A1F050F46115710509F49DCF6130AA +:10151000710581F0EB2F512F97CF6430710569F081 +:1015200080F06630710509F48FCFF4CFE42F4B2F94 +:10153000592F8ACFE42F412F87CFEB2F542F492FDC +:1015400083CF4B2F5D2DE12F7FCFF894E82FE295CD +:10155000EF70F0E031A1282F2F7081E090E001C002 +:10156000880F2A95EAF7982F9095932391A392A13B +:10157000892B82A3789408959091B60292FF06C0B9 +:10158000282F28712830F9F4877F846093FF06C0E4 +:10159000282F28712831F1F4877E84612091B702C9 +:1015A00020FF06C0382F38713830D9F4877F81602A +:1015B00021FF06C0282F28712831D1F4877E816150 +:1015C00094FD877E0895282F24712430F9F68B7FAF +:1015D0008860DCCF282F2471243101F78B7E88614D +:1015E000DDCF382F3171313019F78E7F8860E0CF31 +:1015F000282F2171213121F78E7E8861E1CFCF9391 +:10160000DF93EC0182389105B1F108F040C08133DD +:10161000910509F49DC048F58932910509F48DC002 +:101620008A9709F49CC0C11522E5D20708F0BDC015 +:10163000C11531E5D30708F024C1C83ED10508F033 +:10164000A3C0C13ED10588F5C83AD10508F08EC0C7 +:10165000C53AD10508F0F6C0C130D10531F1209767 +:1016600021F1C430D10508F545C08533910509F451 +:101670005FC0C997C1F68091B602837009F036C188 +:101680008091B70283FF11C0C9E2D0E00EC0833E53 +:10169000910599F170F4803E910501F1823E91052A +:1016A00011F68091B60282FD21C0CE01DF91CF916B +:1016B0000895863E910561F1873E910571F1843E62 +:1016C000910509F0B0CF8091B70281FFEECF8091F4 +:1016D000B602C7EED0E084FD0DC0E7CF8091B60220 +:1016E00080FD33C09091B70290FFDFCFC3EED0E012 +:1016F00084FFDBCFD0E0C0E0D8CF8091B60282FD7E +:10170000F2C09091B70290FDF1C084FFCECFF2CF2E +:101710008091B60283FDDDCFC8CF8091B60283FDF4 +:10172000E8C09091B70291FFF0CFC4EED0E0BDCFFA +:101730008091B60285FFB9CFA7CF8091B60285FD13 +:10174000DBC08091B70283FFB0CFC9E3D0E0ADCF5B +:101750008091B60286FFA9CFCAE2D0E0A6CF8091E1 +:10176000B60286FFA2CFC1E3D0E09FCFCF3BD10529 +:1017700008F6C85AD0E0CC0FDD1FCB52DE4F0990DF +:10178000D881C02DD46491CFC11540E5D40708F0AD +:1017900064C0C11580E4D80708F05CC0CE019A95FA +:1017A00081159F4108F481CFA5CFC11536E5D30738 +:1017B00018F5C11545E5D40708F07CC0C11584E5CE +:1017C000D80708F072C09E01237033279C2F96958E +:1017D0009695C115D34508F459C0C1E0D0E002C0C8 +:1017E000CC0FDD1F2A95E2F730E2939FC001112450 +:1017F000C82BD92BDA6859CFC1158AE5D80778F4F8 +:10180000C11529E5D20708F060C0C11538E5D30736 +:1018100008F470CFDC2FCC27C06FD06A46CFCE0142 +:1018200090568115904208F065CF8D2F8F710E94E0 +:10183000BC0A90E0982F882788279F719C012C2B49 +:10184000E90141C0C55AD0E0CE52DE4FC881D0E098 +:10185000D0642BCFDF70D06A28CFCE018370992758 +:1018600021E030E002C0220F331F8A95E2F7C695CF +:10187000C69580E2C89FE0011124C22BD32BDD68FE +:1018800014CFDC2FCC27C16FD06A0FCFC1E0D0E0DE +:1018900002C0CC0FDD1F2A95E2F720E2929FC00123 +:1018A0001124C82BD92BDC6800CFDC2FCC27C46FC8 +:1018B000D06AFBCE8C2F0E94BC0AC82FD0E0DC2F50 +:1018C000CC27CC27DF71D062F0CE8C2F8F700E9496 +:1018D000BC0A34E0D695C7953A95E1F7CF709C2FB6 +:1018E000EC01D069E2CEC2EED0E0DFCEC0EED0E0B7 +:1018F000DCCEC6EED0E0D9CEC5E3D0E0D6CE809126 +:10190000AA0281111092AA02089580959091A902CD +:1019100098239093A9020895EEE4F2E0919189133F +:1019200003C0DF0111971C9292E0E435F907B1F78B +:101930000895AEE4B2E0EFEF90E02D91821751F000 +:10194000EF3F19F4211101C0E92F9F5F9630A9F7ED +:10195000EF3F09F408950E2E000CFF0BE45BFD4FE2 +:101960008283089580919E0290916D02981301C028 +:1019700008958F5F8770FACF292F973078F58630DA +:1019800068F590E036E0239F800D911D1124682FAB +:10199000677023E0969587952A95E1F7FC01EE0F95 +:1019A000FF1FE80FF91FEB5AFD4F50E040E080E0C9 +:1019B000219130E0062E02C0369527950A94E2F771 +:1019C00021703327042E01C0220F0A94EAF7822BDC +:1019D0004F5F5F4F4330510559F7089580E00895F8 +:1019E000292F973098F5863088F590E036E0239FD0 +:1019F000800D911D1124282F277041E001C0440F54 +:101A00002A95EAF723E0969587952A95E1F7FC0158 +:101A1000EE0FFF1FE80FF91FEB5AFD4F30E020E0FB +:101A200070E05191DF011197CB01022E02C0969513 +:101A300087950A94E2F7817081958527842385270D +:101A40008C932F5F3F4F2330310559F708958295CE +:101A500090E09C01220F331F220F331F2C7C9595A1 +:101A60008795959587958373282B30E0C901880F5A +:101A7000991F8A7A359527952575822B08959FB7EA +:101A8000F89410920A039FBF90911903943009F0C3 +:101A900048C02091E9002F703091EC00932F917095 +:101AA00030FD90E8922B25E02093E9002091EB0097 +:101AB00020FF34C02091EE0027FF30C020910903A1 +:101AC000222321F02091E80025FF28C0109209036D +:101AD00026E03091E80035FF14C08093F10080913A +:101AE000E80085FD27C08091E80080FFFCCF809151 +:101AF000E8008E778093E8009F709093E90080E083 +:101B0000089530911903343049F43091EB0035FDDC +:101B100005C0215041F481E0809309039F709093A8 +:101B2000E9008FEF0895EFE9FFE03197F1F700C08A +:101B30000000CFCF8FB7F89421E020930A038FBF26 +:101B4000DBCF8093060370930803609307038091B3 +:101B500019038430F9F48093E9008FEF9091E80045 +:101B6000815095FD06C095ED9A95F1F70000811121 +:101B7000F5CF8091E80085FF0DC050E040E063E0C4 +:101B800070E086E093E00E945A088091E8008E772A +:101B90008093E8000895CF93DF93EC0181E0809378 +:101BA000E9008FEF9091E800815095FD06C095ED1A +:101BB0009A95F1F700008111F5CF8091E80085FF3B +:101BC00014C050E040E068E070E0CE010E945A0886 +:101BD0008091E8008E778093E80088E0FE01AFE016 +:101BE000B3E001900D928A95E1F7DF91CF910895CE +:101BF0008091F80280FD0AC0E7EDF2E011821082C8 +:101C00001282339652E0E83FF507C1F7539A3BB191 +:101C1000377F2BB128604FB7F89487ED92E0FC0135 +:101C20005191CF0168E02BB9000000C057FF3BB9CC +:101C3000550F000000C000C000C03BB900C06A954D +:101C400091F7F2E0883F9F0751F74FBF8FE594E08F +:101C50000197F1F700C000000895EF92FF920F93F3 +:101C60001F93CF93DF938C01C7EDD2E0F12CE12CD1 +:101C7000F80194816091FA028091F902F5E0EF1683 +:101C8000F104ECF49923E9F09E014091FB020E94DB +:101C90000F0A2FEFE21AF20A23968BE0E816F104FE +:101CA00039F70E94F80DF801848190E00196817067 +:101CB00099278483CDB7DEB7E6E00C94822D992373 +:101CC00019F39E0140E0E3CFB0E0A0E0EAE6FEE0D9 +:101CD0000C94602DEC014C81042F10E09801D80188 +:101CE0000E94312D9B01AC010E94472D4B015C01EC +:101CF000E0E2F0E0E01BF10BA5E5B0E0AC019B01F8 +:101D00000E94472D6B017C019F01DF010E94292D5C +:101D10009B01AC010E94522D9B01AC01280D391D85 +:101D20004A1D5B1DC701B6010E94FA2CF22E822FBC +:101D300090E039E23F1598F143E0249F900111248F +:101D400035952795122F109597EDC92E92E0D92E33 +:101D500000E085E5E82EEF188E2D01FD8F2D960110 +:101D6000412F6091FA020E940F0A0F5F53E0C50EE7 +:101D7000D11C0B3089F70E94F80D9C8181E09923DA +:101D800019F0903219F48FEF8093170180911701A9 +:101D9000890F8C83CDB7DEB7ECE00C947C2D25E564 +:101DA00030E0A901481B590BCA019A01220F331FC9 +:101DB000280F391F37FFC4CF2F5F3F4FC1CF0F937D +:101DC0001F93CF93DF93C7EDD2E0FE011182108203 +:101DD0001282339682E0E83FF807C1F710E000E096 +:101DE0008091D502082E000C990B081719078CF169 +:101DF00080911601082E000C990B801791074CF169 +:101E00009E014091FB026091FA028091F9020E94CA +:101E10000F0A0F5F1F4F23960B30110509F70E9421 +:101E2000F80D809115019091D502980F9093D502ED +:101E300020911601280F20931601121614F49A30DF +:101E40001CF0819580931501DF91CF911F910F9127 +:101E50000895198218821A82DCCFB0E0A0E0E3E393 +:101E6000FFE00C94632DFC018281DD24DA9480FD77 +:101E700002C0DD24D39407ED12E0D0E0C0E02BE0F7 +:101E8000B22EF80111821082128294E0E92EF12C18 +:101E9000C12C8091D4028C0D8C30C4F16B2D0E942A +:101EA000C42C892F082E000C990B8C179D0791F4D8 +:101EB0008091FB028E9DA0018F9D500D11245595A0 +:101EC00047955595479598016091FA028091F902DE +:101ED0000E940F0ACD0CF1E0EF1AF108D1F621961D +:101EE0000D5F1F4FCB30D10561F60E94F80D809138 +:101EF000D40291E0D91210C081110CC08AE0809305 +:101F0000D402CDB7DEB7E9E00C947F2D87FFCACFAE +:101F1000855FC8CF8150F3CF90E00196BE010E944B +:101F2000E62CEDCFEF92FF921F93CF93DF93EC015E +:101F300087EDE82E82E0F82E10E08C819701409129 +:101F4000FB026091FA02810F0E940F0A195E83E082 +:101F5000E80EF11C1D3F89F70E94F80D9A818C81D3 +:101F600090FF08C08F5F8C83DF91CF911F91FF900E +:101F7000EF9008958150F7CF9091F80290FF0CC038 +:101F8000E7EDF2E0818360834283339692E0E83F9D +:101F9000F907C1F70E94F80D0895A3E0B0E0E3ED62 +:101FA000FFE00C94682D8C018091D60281110AC04B +:101FB0009E012F5F3F4F4FEF6FEF0E940F0A8A8104 +:101FC0008093D602F8016481613069F08091D60275 +:101FD00040E0662361F040E0623011F44091D602A7 +:101FE00080E060E004C06091D60240E080E00E94A2 +:101FF000BC0FF801848190E0019663E070E00E94DC +:10200000E62C84832396E4E00C94842DA3E0B0E0D6 +:10201000ECE0F0E10C946A2D9091F80290FF0AC078 +:102020009E012F5F3F4F0E940F0A4B8169818A8179 +:102030000E94BC0F2396E2E00C94862DCF93DF9391 +:10204000EC01E8EFF2E0438162818C810E9406108E +:102050008C818F5F8C83DF91CF910895CF93DF9335 +:10206000EC01EC81F0E0E75DF84F4491E8EFF2E03D +:10207000628181810E9406108C818F5F8C83DF9149 +:10208000CF910895CF93DF93C7E7D1E060E0CE0111 +:102090000E94A52D2196C11584E0D807B9F7DF91DC +:1020A000CF9108951F93CF93DF93122F8430E0F4E4 +:1020B0006730D0F44630C0F4C42FD0E0CC0FDD1F21 +:1020C0009CE0699FC00DD11D112494E5899FC00D2E +:1020D000D11D1124632FCE0187960E94A52D612F5B +:1020E000CE0188960E94A52DDF91CF911F91089572 +:1020F000AF92BF92CF92DF92EF92FF921F93CF9356 +:10210000DF9381E6C82E8CE0D82ED0E07601C0E0C7 +:1021100014C0F50125913491412F6C2F8D2F0E9411 +:10212000521082E0A80EB11C1F5F163091F78CE0B0 +:10213000E80EF11CCF5FC73019F0570110E0E9CF6E +:10214000DF5F84E5C80ED11CD43001F7DF91CF9159 +:102150001F91FF90EF90DF90CF90BF90AF900895C8 +:10216000CF93C82F6FEF811162E283E290E00E946B +:10217000A52D6FEFC11169E084E290E00E94A52DCA +:102180006FEFC11166E185E290E00E94A52DCF912D +:10219000089580E00E94B01060E086E290E00E9426 +:1021A000A52D0E9478100E94421081E00E94B0107C +:1021B00008950F931F93CF93DF93843030F56730EA +:1021C00020F5463010F5C42FD0E0CC0FDD1F2CE0F9 +:1021D000629FC00DD11D112434E5839FC00DD11D18 +:1021E0001124CE0187960E94912D082F10E0102F08 +:1021F0000027CE0188960E94912D9801282BC901B5 +:10220000DF91CF911F910F91089590E080E0F8CF7A +:10221000462F843040F4773030F4663020F4672F56 +:102220000E94D910089590E080E00895CF92DF9247 +:10223000FF920F931F93CF93DF936C0100912A03BA +:102240008091AB02082BC7E0D0E010E0FC2EC80163 +:102250000C2E02C0959587950A94E2F780FD0CC07C +:102260002197A0F7F12C8F2DDF91CF911F910F9126 +:10227000FF90DF90CF900895B6018C2F0E94081137 +:102280000E94FF0A019761F3EECFCF93DF93EC0139 +:102290000E941611BE010E9408110E94FF0ADF91E0 +:1022A000CF910895FC0183819481892B29F080814D +:1022B000918189238F3F51F480E00895843FE1F7B5 +:1022C00017C0883EA8F0813FB9F712C08081918184 +:1022D0000E94451192959F70963099F358F4925F41 +:1022E0009F70923048F7803F19F040F7883E20F702 +:1022F00081E008959A5FF4CF83E290E00E94912DEF +:10230000823289F484E290E00E94912D893059F460 +:1023100085E290E00E94912D91E0863109F090E0F5 +:10232000892F8170089580E0FCCFCF9384E090E006 +:102330000E94912DC82F82E290E00E94912D982F4B +:102340008C2FCF9108951092D3028091FE0280FFCE +:1023500008C080E197E09F938F930E9401080F903F +:102360000F9008958091F8028E7F8093F8028091FB +:10237000FE0280FF0CC01F921F9285E496E09F939F +:102380008F930E9401080F900F900F900F900E9462 +:10239000A3112FEF80E792E0215080409040E1F7B9 +:1023A00000C000000E94F80D08956091F802669543 +:1023B00070E04BE050E08AE091E00E94D92D892B3B +:1023C00019F481E08093D3020E94B1099093CD0269 +:1023D0008093CC028091FE0280FF08C087EF96E0D8 +:1023E0009F938F930E9401080F900F900895CF92B2 +:1023F000DF92EF92FF926B017C010E94000AB7010D +:10240000A60188E090E00E94B72DFF90EF90DF904A +:10241000CF900895A7E0B0E0E0E1F2E10C945A2DEE +:10242000582E262E342E2F839091F80290FF46C00E +:10243000E92FE695AE2FB0E0A05FBD4F8C91809361 +:10244000D2029E7F9230F1F59E012F5F3F4F852D86 +:102450000E940F0A4B8169818A810E94BC0F5092B1 +:10246000F9022092FA023092FB028F81882309F44C +:102470008CC06091F8027091F9028091FA029091FB +:10248000FB020E94F7118091FE0280FF17C080912D +:10249000FB021F928F938091FA021F928F9380917B +:1024A000F9021F928F9386EA96E09F938F930E9482 +:1024B00001080FB6F894DEBF0FBECDBF2796E2E14C +:1024C0000C94762D823019F43090FB02C8CF863000 +:1024D00019F45090F902C3CF8930D9F3893109F04A +:1024E000BECFE9518E2F81708D838E2F80958170A4 +:1024F0008E83E695F0E0EE50F94F94919C83692E1F +:10250000712C87EDE82E82E0F82ED12CC12C10E042 +:1025100000E09BE0892E912C2BECA22E26E0B22E1F +:10252000C601B4010E94D22C8D81452C81112BC093 +:10253000460E8091FE0280FF13C01F929C819F93E4 +:102540001F928E818F931F924F921F930F93BF9272 +:10255000AF920E9401080FB6F894DEBF0FBECDBF48 +:102560009701432D622D842D0E940F0A0F5F1F4F8C +:10257000C60CD71C93E0E90EF11C0B30110581F657 +:102580000E94F80D6CCF461AD4CF8091FE0280FFD6 +:1025900095CF1F923F921F922F921F925F928FE7CB +:1025A00096E083CFE8EFF2E0438120E1421B08F49C +:1025B00040E021E0628181810E940A120895E8EFE3 +:1025C000F2E0438120E1420F08F44FEF21E0628105 +:1025D00081810E940A120895E8EFF2E0628120E111 +:1025E000621B08F460E021E0438181810E940A12AD +:1025F0000895E8EFF2E0628120E1620F08F46FEFE6 +:1026000021E0438181810E940A120895E8EFF2E0FF +:10261000818121E04381628180510E940A120895E4 +:10262000E8EFF2E0818121E043816281805F0E94D6 +:102630000A1208958091FC02882319F0815080933A +:10264000FC026091F8027091F9028091FA02909177 +:10265000FB020E94F71108958091FC02833018F468 +:102660008F5F8093FC026091F8027091F902809173 +:10267000FA029091FB020E94F71108959091F802DE +:1026800090FF40C0917081113EC092609093F8021B +:10269000662309F43FC06091F8027091F9028091BD +:1026A000FA029091FB020E94F7118091FE0280FFD6 +:1026B0000FC08091F80286951F928F9380EF95E06E +:1026C0009F938F930E9401080F900F900F900F908F +:1026D0006091F802669570E04BE050E08AE091E08E +:1026E0000E94D92D892B11F10E94A31181E08093C2 +:1026F000CF0220E04091FB026091FA028091F90242 +:102700000E940A120895853210F09864BFCF880F96 +:10271000982BBCCF8091FE0280FFDACF8091F80227 +:1027200086951F928F9382ED95E0CACF0E94D511B6 +:10273000DDCF8091F80281608093F8028091FE02E3 +:1027400080FF0DC01F9281E08F938CE096E09F93F5 +:102750008F930E9401080F900F900F900F9080911F +:10276000F80260E086950E943E1308958091F80279 +:102770008695815009F484E261E00E943E13089539 +:102780008091F80286958F5F853208F081E061E0E4 +:102790000E943E1308959091F80290FF08C096950C +:1027A000981728F0961718F40E94C013089561E056 +:1027B0000E943E130895E8EFF2E083E080831182E7 +:1027C0008FEF828383831482608171818281938100 +:1027D0000E94F711089568EE7EEF90E080E00E947D +:1027E000C32D60E082E090E00E94A52D60E083E0D0 +:1027F00090E00E94A52D1092AB0260E084E090E092 +:102800000E94A52D64E082E290E00E94A52D60E088 +:1028100085E090E00E94A52D60E086E090E00E94B7 +:10282000A52D6FEF87E090E00E94A52D40E050E0DD +:10283000BA0188E090E00E94B72D60E08DE090E062 +:102840000E94A52D40E050E0BA0188E190E00E948E +:10285000B72D60E087E190E00E94A52D40E050E0B8 +:10286000BA018CE190E00E94B72D70E060E080E258 +:1028700090E00E94C32D40E050E0BA0188E190E072 +:102880000E94B72D80E00E94B0100E94C91040E065 +:1028900050E0BA018FE090E00E94B72D40E050E098 +:1028A000BA0183E190E00E94B72D08950F931F9322 +:1028B000CF93DF938091A9029091A802892B8093F6 +:1028C0004C029091AA02992391F0892B80934C029B +:1028D00020E08EE492E0FC013191CF0131112F5FB5 +:1028E000F2E084359F07B9F721110E947F0C48E080 +:1028F00050E060EA72E08CE492E00E94E62D892BC1 +:1029000009F441C088E0ECE4F2E0A0EAB2E0019012 +:102910000D928A95E1F7E0910103F091020330975F +:1029200091F10280F381E02D8CE492E00995809191 +:10293000FE0282FF28C080FF04C08EEF92E00E945A +:102940006807D0E0C0E008EF12E08091FE0280FF4F +:102950000EC0FE01E45BFD4F80811F928F931F9399 +:102960000F930E9401080F900F900F900F902196E7 +:10297000C830D10551F78091FE0280FF04C086EF78 +:1029800092E00E946807DF91CF911F910F91089507 +:1029900090E080E00E94D50990E080E00E94BD09AF +:1029A0001092A8020E945614089580932A030E9450 +:1029B000C814089580912A03982F9670963021F4B8 +:1029C00088600E94D5140895877FFBCF21E030E016 +:1029D00001C0220F8A95EAF7209580912A0382236D +:1029E0000E94D514089590919F0280958923809329 +:1029F0009F02282F277091F4282F082E000C330BEC +:102A00009217130659F09091B70292FF07C085956F +:102A1000859585950E94E61410929F020895CF93A4 +:102A2000DF93D82FC091B702C2FB882780F98D179A +:102A300011F1D0FBC2F9C093B7026091B60284E0F5 +:102A400090E00E94A52D6C2F82E290E00E94A52DBF +:102A500082E00E94F3148091FE0280FF0CC01F925E +:102A6000DF9381EE92E09F938F930E9401080F9075 +:102A70000F900F900F90DF91CF91089521E030E0FB +:102A800001C0220F8A95EAF780912A03822B0E94C7 +:102A9000D51408958093AB020E94C8140895109233 +:102AA000A902EEE4F2E086E0DF011D928A95E9F7E3 +:102AB0000E94C8140895AAE2B0E0E1E6F5E10C94A2 +:102AC000692D8BE193E02091F100DC012D93CD0184 +:102AD000B3E083329B07B9F780911C03833009F47C +:102AE00072C0B8F4813009F449C0823009F4B3C02F +:102AF0008091E80083FF91C280911B0390911C0399 +:102B00009A3008F08AC2E92FF0E0EB50F24D0C94B5 +:102B10001C2D8A3009F48EC08B3009F471C08930C5 +:102B200039F780911B03813219F780911F0390912F +:102B30002003009711F00297D9F68091E800877F73 +:102B40008093E8008091E80082FF38C09091F30004 +:102B50008091F200029731F48091F100813011F000 +:102B6000863021F48091F10080930E038091E8007B +:102B70008B778093E8000E948408BACF80911B0372 +:102B8000813A09F0B5CF8091E800877F8093E80013 +:102B900080911F0390912003892B61F468E08FE0FE +:102BA00093E070E00E9430098091E8008B77809379 +:102BB000E8009ECF60E090E080E0F3CF80911903C1 +:102BC0008111C0CF95CF80911B03813A09F090CF3E +:102BD00080911F0390912003892B09F089CF809168 +:102BE000E800877F8093E8008091E80080FFFCCFB9 +:102BF000809118018093F1008091E8008E77B9CF21 +:102C000080911B03813209F073CF80911F03909153 +:102C10002003892B09F06CCF8091E800877F809397 +:102C2000E8000E94840880911D03809318010E948F +:102C30004F155ECF80911B03813209F059CF8091EF +:102C4000E800877F8093E8000E94840880911E033B +:102C500080930D034DCF80911B03813A09F048CF3B +:102C60008091E800877F8093E8008091E80080FFF2 +:102C7000FCCF80910D03BECF803899F0823809F0E7 +:102C8000CCC180911F038F70873008F0C6C180933C +:102C9000E9008091EB0085FB882780F91092E9001C +:102CA00006C0809117039091180391118260909152 +:102CB000E800977F9093E8008093F1001092F10074 +:102CC0008091E8008E77A5C1882309F493C18230F2 +:102CD00009F0A3C180911D03811196C180911F034A +:102CE0008F702FEF280F263008F097C18093E900EE +:102CF0002091EB0020FF88C1933031F48091EB00EC +:102D000080628093EB0080C19091EB009061909382 +:102D1000EB0021E030E001C0220F8A95EAF7209312 +:102D2000EA001092EA008091EB008860EACF8111FE +:102D300074C110911D031F778091E3008078812B6F +:102D40008093E3008091E800877F8093E8000E94F1 +:102D500084088091E80080FFFCCF8091E3008068C8 +:102D60008093E30082E0111183E08093190355C141 +:102D70008058823008F051C120911D0330911E030C +:102D80002C3DE3E03E07A1F583E08A838AE2898354 +:102D90004FB7F894DE01139620E03EE051E2E32FB6 +:102DA000F0E050935700E49120FF03C0E295EF70EC +:102DB0003F5FEF708E2F90E0EA30C0F0C7968D93A2 +:102DC0009D932F5F243159F74FBF8091E800877F93 +:102DD0008093E8006AE270E0CE0101960E9430091B +:102DE0008091E8008B778093E80017C1C096E7CF09 +:102DF00080911F0390912003432F552743305105A5 +:102E000009F44AC078F54130510509F47AC08BE7DE +:102E100090E0E5ECFDE04230510509F0FEC0209164 +:102E2000E800277F2093E8002091210330912203BE +:102E30008217930708F49C0140E02115310509F041 +:102E400065C0411163C08091E80082FDC9CF8091C7 +:102E50001903882329F2853019F28091E80083FF55 +:102E6000F2CFBECF4132510509F43CC04232510588 +:102E700009F0D3C08430910508F0CFC0FC01EE0FFB +:102E8000FF1FE75CFD4F0190F081E02D8B5C9D4FB3 +:102E9000DC018C9190E01AC0332721303105D1F04C +:102EA0002115310561F02230310509F0B6C0E2E5A7 +:102EB000FEE0E4918E2F90E0E2E5FEE007C0E6E759 +:102EC000FEE0E4918E2F90E0E6E7FEE0009709F443 +:102ED000A4C0A5CFE8E6FEE0E4918E2F90E0E8E6FE +:102EE000FEE0F4CF8430910508F097C0880F991F59 +:102EF000FC01EF5BFD4F0190F081E02D89E090E057 +:102F00008ECF82E190E0E0E4FEE089CF809119036A +:102F1000882309F465CF853009F462CF8091E800F9 +:102F200083FD5ECF8091E80082FD8DCF8091E80027 +:102F300080FF83CF9091F3008091F200211531053D +:102F400019F08830910550F041E0089709F040E011 +:102F50008091E8008E778093E8006FCF4491409392 +:102F6000F1003196215031090196E8CF803809F0FF +:102F700054C08091E800877F8093E80080911A0315 +:102F80008093F1009DCE811148C010911D03123035 +:102F900008F043C08091E800877F8093E800109399 +:102FA0001A030E948408112311F084E005C0809167 +:102FB000E30087FDFACF81E08093190342E061ECE2 +:102FC00081E00E94A30842E261EC84E00E94A30831 +:102FD00042E261EC82E00E94A30842E260EC83E0FE +:102FE0000E94A30842E261EC85E00E94A308809160 +:102FF000190313C080911D03813079F481E093306F +:1030000009F080E0809318031092E9008091E800B5 +:10301000877F8093E8000E9484088091E80083FF06 +:103020000AC08091E800877F8093E8008091EB00E0 +:1030300080628093EB00AA96E3E00C94852DCF93F9 +:10304000C82F1F928F938CE59CE09F938F930E94D3 +:10305000010881E001C0880FCA95EAF70E944A156D +:103060000E944F150F900F900F900F90CF910895E1 +:10307000EF92FF920F931F93CF93DF938B3109F45D +:103080001EC108F0B4C08B3009F4DAC008F086C065 +:10309000863009F4E8C048F4853009F4B6C08DEBF9 +:1030A0009BE00E94680780E0EEC0873009F4F0C022 +:1030B0008830A9F783E090E00E94912D1F928F93B2 +:1030C00081E799E09F938F930E94010882E090E04E +:1030D0000E94912D83FB992790F91F929F9382FB69 +:1030E000992790F91F929F9381FB992790F91F923E +:1030F0009F93982F91701F929F931F928F9388E2B6 +:1031000099E09F938F930E9401080E94951193FB71 +:10311000222720F91F922F9387FB222720F91F9245 +:103120002F9386FB222720F91F922F9385FB2227BE +:1031300020F91F922F9384FB222720F91F922F93AF +:1031400083FB222720F91F922F9382FB222720F94D +:103150001F922F9391FB222720F91F922F93292F43 +:1031600021701F922F9381FB222720F91F922F930A +:10317000282F21701F922F939F938F9389E298E0BD +:103180009F938F930E9401088DB79EB78A960FB6C2 +:10319000F8949EBF0FBE8DBF81E075C0803109F4E9 +:1031A000A6C080F48E3009F07ACF9091FE02892F6C +:1031B0008B7F92FF84608093FE0282FF95C088EE31 +:1031C0009BE089C0863109F4A2C0893109F067CF3C +:1031D00089E191E09F938F938FE49BE09F938F937E +:1031E0000E9401080F900F900F900F90D5CF8A3258 +:1031F00099F1E0F4873261F128F48E3108F44FCF71 +:103200008D5127C0893209F04ACF8BE29CE00E94A1 +:1032100068070E944F159FEF24E38CE091502040F7 +:103220008040E1F700C000000E949409833468F4F4 +:103230008A3308F091C0853359F0883309F02FCFD5 +:103240008EE899E00E946807A7CF833409F027CF62 +:1032500080E00E941F18A0CF8BE49CE00E946807CA +:103260000E94EB1399CF8091FE02807F8093FE0233 +:1032700084E39BE00E94680787E49CE00E94680763 +:1032800081E08093FD02CDB7DEB7E6E00C94822D9D +:103290009091FE02892F8E7F90FF81608093FE02C5 +:1032A00080FF03C08FE19CE0CDCF82E19CE00E94D3 +:1032B00068078091FE02817F8093FE026DCF90911E +:1032C000FE02892F8D7F91FF82608093FE0281FF35 +:1032D00008C085E09CE00E9468078091FE02816042 +:1032E000EBCF87EF9BE0AECF88ED9BE0ABCF90912B +:1032F000FE02892F877F93FF88608093FE0283FF01 +:1033000003C08CEC9BE0E7CF8FEB9BE09BCF0E9450 +:10331000A509162F072FF82EE92ED0910D03C09185 +:1033200018010E94ED09EF92FF920F931F931F92D5 +:10333000DF931F92CF931F928F9382E59BE09F9321 +:103340008F930E9401088DB79EB70C960FB6F89424 +:103350009EBF0FBE8DBF20CF89537BCF0E944F15DC +:103360002FEF84E39CE0215080409040E1F700C0C3 +:10337000000088E19AE00FB6F894A8958093600069 +:103380000FBE90936000FFCF882321F00E94850C30 +:103390000E9456140895882339F09091A902982B21 +:1033A0009093A9020E9456140895882309F44DC0F1 +:1033B000823879F40E94ED0981FF47C089E30E94B9 +:1033C000990C0E94561489E30E948C0C0E9456149A +:1033D0000895833859F40E94ED0980FF36C083E5D3 +:1033E0000E94990C0E94561483E5EECF843859F45C +:1033F0000E94ED0982FF29C087E40E94990C0E9477 +:10340000561487E4E1CF9CEF980F913AE8F290E2EE +:10341000980F983050F4877091E001C0990F8A9509 +:10342000EAF7892F0E94850CD1CF9BE5980F933046 +:1034300028F490E080E00E94D5090895885A8731E9 +:1034400020F490E080E00E94BD090895CF93C82F3A +:103450008823C9F08238C9F40E94ED0981FD13C0A8 +:1034600089E30E94990C0E9456142FEF87EE93E097 +:10347000215080409040E1F700C0000089E30E94A5 +:103480008C0C0E945614CF9108958338A1F40E94A9 +:10349000ED0980FDF8CF83E50E94990C0E94561437 +:1034A0002FEF81EE94E0215080409040E1F700C082 +:1034B000000083E5E4CF8438A1F40E94ED0982FD89 +:1034C000E2CF87E40E94990C0E9456142FEF81EE00 +:1034D00094E0215080409040E1F700C0000087E474 +:1034E000CECF8CEF8C0F813A08F042C08091FD0264 +:1034F000882399F08130D9F01092FD02EEE4F2E0D9 +:1035000084E592E02191C21709F45EC08E179F07EF +:10351000C9F78C2F0E94990CB4CF8091A9028232F6 +:1035200069F78C2F0E9438188111ADCFE7CF8091B9 +:10353000A9028232B1F3C431B9F038F4CB3049F08A +:103540008BED92E00E94680711C0C93269F0C83360 +:10355000B9F784E39BE00E9468078DED92E00E943A +:10356000680781E08170E0CF1092FD0280E0FACF21 +:1035700080E28C0F883068F4C77021E030E001C031 +:10358000220FCA95EAF78091A902822B8093A902A3 +:1035900078CFEBE5EC0FE33040F4F0E0EE52FE4F75 +:1035A000808190E00E94D5096ECFC85AC73108F0DB +:1035B0006ACFEC2FF0E0EE0FFF1FEB52FE4F808141 +:1035C00091810E94BD095FCF8C2F0E948C0C0E94BC +:1035D00056149FCF1F93CF93DF93182FD0E0C0E0F6 +:1035E000893311F4C0E5D0E0812F0E94261A20977C +:1035F00039F4812F0E94D519DF91CF911F91089541 +:103600008FE99FE00197F1F700C000002197EFCF0D +:103610000F931F93CF93DF93C62FD42F022FFC015C +:1036200082818823A9F0609329030E94B1099093B5 +:10363000280380932703C77081E001C0880FCA95D3 +:10364000EAF70E94CB19DF91CF911F910F91089556 +:103650008091290368133DC02091270330912803EE +:103660004FB7F8948091230390912403A0912503F0 +:10367000B09126034FBF821B930B883C910548F500 +:1036800010E21D0F6D17B9F080E2860F883040F40C +:10369000C77081E001C0880FCA95EAF70E94C4197B +:1036A000183048F481E09D2F977001C0880F9A95DB +:1036B000EAF70E94CB19802F0E94EA1A183018F6F8 +:1036C000D77081E001C0880FDA95EAF70E94C4192B +:1036D000BACFC77081E001C0880FCA95EAF7F6CF6C +:1036E000A5E0B0E0E6E7FBE10C945B2D8C01FC016A +:1036F00083819481892B31F08081918189238F3F4F +:1037000009F0E3C52596E1E10C94772D0E9416118E +:10371000F82E682F89819A810E94F00C69817A8144 +:103720008F2D0E9408117C01F8018281882309F401 +:10373000BFC5970122513F452031310508F08BC5A7 +:103740008FEF93E00E94912D811128C0FEEEEF0EC5 +:1037500057E7852E99249394E11032C01C821B8276 +:10376000442443944AE0342E74018FEFE81AF80A97 +:10377000C4010E94912D89831A82882379F09FEFDA +:10378000980F933058F58A83498292E0890E911CF4 +:10379000C7010E94912D8B83811121C080919F02CE +:1037A000877009F4AFCFF8018281882309F4AACF8A +:1037B0008091B70282FFA6CF82E00E94F314A2CFCD +:1037C000811424E0920651F3C4010E94912D8111CD +:1037D00001C0EA943FEF831A930ABECF4701FE016E +:1037E00031967F01F7012081222309F4BDCF2130DA +:1037F00009F047C091818281913031F4F2E0EF0EFF +:10380000F11C0E94EA1A07C0923049F422E0E20E4D +:10381000F11C0E94261A3FEFE31AF30AE3CF93301C +:1038200031F432E0E30EF11C0E94D519F4CF94304C +:1038300021F08FEFE81AF80AEECF92E0E90EF11CC2 +:1038400030E020E0B7016F5F7F4FF7014181805387 +:10385000990B8A30910550F021503109E0F28FE93F +:103860009FE00197F1F700C00000F6CF329EF00113 +:10387000339EF00D11249C012E0F3F1F842F7B01DE +:10388000E1CFE22FF0E0EE56FE4F5490822F869566 +:103890008695869590E0FC01EE57FE4F6490277068 +:1038A000712C022E02C0759467940A94E2F7E1E04D +:1038B0006E227724FC01EE58FE4FA490B12C022E0C +:1038C00002C0B594A7940A94E2F7F1E0AF22BB24BA +:1038D000FC01EE59FE4FC490D12C02C0D594C79480 +:1038E0002A95E2F721E0C222DD246114710419F067 +:1038F00081EE0E94261AA114B10419F086EE0E94EE +:10390000261A852D0E94EA1AA114B10419F086EE38 +:103910000E94D5196114710419F081EE0E94D51925 +:10392000C114D10409F477CF8CE26BCF81E00E94FF +:103930003E150E94DA1432CF81E00E94E614F9CFDE +:1039400082E0F5CF95EFE9169CE5F90609F46CC025 +:1039500008F466C027E245EE66EEF6EFEF16FCE5EA +:10396000FF0609F4A1C4882309F4C0C410922903F6 +:1039700023E0E2162DE5F20608F05DC03AEFE3160B +:103980003CE5F30630F4C70182509C45449708F0AB +:103990005FC00E9495119093B7028093B602F2E146 +:1039A000EF16FCE5FF0609F476C108F0B4C039E073 +:1039B000E3163CE5F30609F44CC108F077C095E046 +:1039C000E9169CE5F90609F434C108F05DC0F3E09E +:1039D000EF16FCE5FF0609F424C108F026C180912A +:1039E000B602816032E0E3163CE5F30609F490C0CC +:1039F0006091B602F090B70284E090E00E94A52D9D +:103A00006F2D82E290E00E94A52D0E944F15C6CE38 +:103A100027E245EE65EE48C426E241EE60EE44C47E +:103A200027E245EE64EE40C426E241EE62EE3CC47D +:103A300028E241E0EFCF85EAE8168DE5F80609F4C3 +:103A4000A8CFE0F4E1E6EE16EDE5FE0609F4A1CF1D +:103A500096E1E9169CE5F90609F055C48091A902A2 +:103A60008A7A91E009F490E09093540281113DC16B +:103A700089E20E94990C0E94561490CEC7018D5A7B +:103A80009D45039728F785CF87E0E8168CE5F80673 +:103A900009F4DBC08091B602806198E0E9169CE5EC +:103AA000F906B0F18091B602806432C0EDE0EE1606 +:103AB000ECE5FE0609F4D7C0A0F48091B6028E7F33 +:103AC0002BE0E2162CE5F20619F18091B6028C602B +:103AD0003CE0E3163CE5F306D8F08091B6028D7F1A +:103AE00017C08FE0E8168CE5F80609F4CCC008F49E +:103AF000BEC0E0E1EE16ECE5FE0609F4C8C0809118 +:103B0000B6028F7BF1E1EF16FCE5FF0609F070CFFE +:103B10008093B6026DCF2FEFE2162CE5F20609F482 +:103B2000C4C0D8F58AEFE8168CE5F80609F485C01C +:103B3000D0F4E4E1EE16ECE5FE0609F4C4C008F4A6 +:103B4000B0C025E1E2162CE5F20609F051CF8091D4 +:103B5000B60282FB992790F921E0922790FB82F927 +:103B600090FB83F9D5CF3CEFE3163CE5F30609F46F +:103B700082C008F466C09DEFE9169CE5F90609F4D9 +:103B80007EC08091B7028360EEEFEE16ECE5FE0694 +:103B900009F02ECF8093B7022BCFF1E6EF16FDE5AB +:103BA000FF0609F49BC0A0F431E0E3163DE5F306FF +:103BB00009F492C008F47DC060E092E0E9169DE54A +:103BC000F90609F015CF8EE090E00E94A52D10CFE8 +:103BD000EDEAEE16EDE5FE0601F168F49091B6020D +:103BE000892F8E7F90FF816025EAE2162DE5F2068F +:103BF00009F48ECFFDCE3EEAE3163DE5F30679F1FA +:103C00008FEAE8168DE5F80609F0F2CE9091B7023A +:103C1000892F877F93FF8860BDCF8091B70288602E +:103C2000B9CF8091B602826073CF8091B602846072 +:103C30006FCF8091B60288606BCF8091B7028160B0 +:103C4000A9CF8091B7028260A5CF8091B602806231 +:103C50005FCF0E944F158091B602806859CF809146 +:103C6000B702877F97CF8091B6028B7F51CF80912B +:103C7000B602877F4DCF8091B7028E7F8BCF809128 +:103C8000B7028D7F87CF8091B6028F7E41CF809122 +:103C9000B6028F7D3DCF0E944F158091B6028F777F +:103CA00037CF8091B602837F33CF8091B7028C7F6C +:103CB00071CF8091B702982F909591708E7F892B4C +:103CC00090FB81F967CF0E944F159091B602892F22 +:103CD00097FB87F980581CCF61E075CF9091B602B1 +:103CE000892F8F7E94FF806113CF85E3C2CE85E359 +:103CF00007C381608093F8028091FE0280FF0DC0AF +:103D00001F9281E08F938AE492E09F938F930E94A9 +:103D100001080F900F900F900F908091F80261E0D2 +:103D200086950E943E133ACD46EB53E160EC73E179 +:103D30000E94FA0933CD40EC53E166EB73E1F8CF12 +:103D400040E153E166E073E1F3CF4CEE52E169EFFD +:103D500072E1EECF42ED52E16FED72E1E9CF4FED4E +:103D600052E162ED72E1E4CF4CE253E16AE173E1CA +:103D7000DFCF61E081E0D5CF65E082E00E94CB1328 +:103D80000DCD68E086E0FACF64E18FE0F7CF67E120 +:103D900085E1F4CF62E289E1F1CF61E083E2C1CF56 +:103DA0009091FE02892F8E7F90FF81608093FE02AA +:103DB00080FF05C08AEC92E00E946807EFCC88EB98 +:103DC00092E0FACF6FEF7FEF90E080E00E94C32D8A +:103DD0000E94AE198091B70282FB882780F991E09A +:103DE00089270E940F15F8018281E080F1808823E5 +:103DF00009F445C0C7010E941611D82E682FC701CB +:103E00000E94F00CB7018D2D0E9408110E94FF0A3C +:103E10007C01882EF801D280B580B2943FE0B322B5 +:103E200080919F028770C1F0AD2CDD20B1F08F2D05 +:103E3000807F803421F080E28E0D883068F08091A0 +:103E4000B70282FF09C082E00E94F31480919F02B2 +:103E50008770AA24A3948111A12C9F2C92942FE007 +:103E60009222FBE0F91508F479C0E92DF0E0E15069 +:103E7000F24D0C941C2D81E0B4CF80E0B2CFC7018D +:103E80000E94BC0CD82EBECF2F2D2F70C22E8F2D8E +:103E9000807F19F0C29490EFC922DD20B9F0CC20C8 +:103EA00069F080E28E0D883010F0811009C0809199 +:103EB000A902C82AC092A9020E9456148E2D4CC095 +:103EC0008091A802C82AC092A802F6CF8E2D0E9427 +:103ED000D519CC2009F442C080E28E0D883010F054 +:103EE000811004C08C2D0E94850C06C0C094809166 +:103EF000A802C822C092A8020E9456142FC03F2DCB +:103F00003F70C32E8F2D807F803219F0C29480EFD6 +:103F1000C822882089F081E0881609F468C0DD2075 +:103F200009F472C0BB2009F468C0F801858180FFE4 +:103F3000C5CF8F70858361C02091B70222FD35C047 +:103F4000DD2069F1CC2039F08091A902C82AC09205 +:103F5000A9020E94561480E00E94261A292D28509A +:103F6000330B2430310510F40E94ED09AA2009F426 +:103F7000C9CB80919F0280FDC5CBF8011282859547 +:103F8000859585950E943E15C8010E94701B809101 +:103F90009F028595859585950E94E614B3CB80E0B8 +:103FA0000E94D519CC20D1F29DCFDD2099F09091BF +:103FB000AA028C2D892BB11003C00E94CB19CECF41 +:103FC000E1E0BE12FACF22FFC9CF981739F28093F1 +:103FD000AA02C4CFB11006C00E947F0C8C2D0E9493 +:103FE000C419BCCFF1E0BF1609F4B8CFF5CFDD207E +:103FF00031F025E02B1508F4B1CF8C2DDECF34E065 +:104000003B1508F4ABCFEACFBB2041F3F9E38F12A5 +:1040100009C02FEF37EE83E0215030408040E1F7B8 +:1040200000C000008E2D0E94D51998CF8F2D869547 +:104030008695837061F0813009F090CFC70193704D +:10404000D11002C090E080E00E94BD0987CFC70177 +:104050009370D11002C090E080E00E94D5097ECF1D +:104060008F2D837091F5D11079CF4E2D42954695C5 +:104070004770440F440F8E2D8F70042E01C0880F9F +:104080000A94EAF72E2D2071E4FE07C02FE030E0FD +:1040900001C0220F4A95EAF720953F2D36953695B7 +:1040A0003370323069F050F44091AB02313029F076 +:1040B000822B84230E944A1551CF842B822BFACF66 +:1040C000282B8091AB028227F5CF8695DD2011F059 +:1040D0008F2D8170882309F441CF4E2D429546954E +:1040E0004770440F440F8E2D8F70042E01C0880F2F +:1040F0000A94EAF72E2D2071E4FE07C02FE030E08D +:1041000001C0220F4A95EAF720953F2D3695369546 +:104110003370323069F050F440912A03313029F085 +:10412000822B84230E94D51419CF842B822BFACFA3 +:10413000282B80912A038227F5CF9F2D9F70F92E7F +:10414000DD2029F0892F0E943E158E2D36CF8E2D31 +:104150000E94C4198F2D0E94E61400CF8E2DE2EF2D +:104160008E16B1F1E81570F0F0EF8F16D1F021EF57 +:10417000821691F0DD2009F45EC0B1109FCE8F2D24 +:104180008F712AC033EF831651F194EF8912F2CF69 +:104190008091B70282FD2FC08F2D8F71DD20D9F263 +:1041A0001BC0DD2081F0E4E0EB1508F4D7CE2F2D05 +:1041B0002F7181E090E001C0880F2A95EAF7909175 +:1041C0002A038927AFCFF5E0FB1508F4C7CEEFCF60 +:1041D0008F2D8F71D110BFCF0E943E15BFCE80E0D2 +:1041E000DD2009F49FCF9F2D9F7181E001C0880FD2 +:1041F0009A95EAF797CFDD2099F02F2D2F71F22EA7 +:10420000822F0E943E158091B70282FF07C038E0DE +:10421000F39EC0011124836080939F028F2DDCCF19 +:1042200081E00E94F31481E08B1508F097CE82E0C4 +:104230000E94F31493CEBB2059F0893309F0F2CEDB +:104240009FEFE7EEF3E09150E040F040E1F7E8CE79 +:104250008F2D8F7180CFF0E1EF16FFE5FF0609F497 +:1042600065CB21E1E2162FE5F20609F469CB93EF65 +:10427000E9169CE5F90609F4CFCB08F063CBF8ED1D +:10428000EF16FCE5FF0609F4C3CB29EDE2162CE599 +:10429000F20609F4CDCB37EDE3163CE5F30609F061 +:1042A00062CB26E241EE61EEC8010E94081B76CA8D +:1042B00030E1E3163FE5F30609F43ECB91E1E91660 +:1042C0009FE5F906A1F682E038CB85E0DE01119684 +:1042D00001900D928A95E1F7F801228189819A81F6 +:1042E000211114CA0E94BC0CF82E18CAF6E1EF1670 +:1042F000FCE5FF06E1F5809154028111F8CC89E2DA +:104300000E948C0CB8CB2AE5E2162DE5F20609F4E2 +:10431000B2CDF0F481E0E8168CE5F80609F440CD62 +:104320009EEDE9169CE5F90609F44CCDE114ECE5A7 +:10433000FE0609F058CD0E944F153FEF84E39CE044 +:10434000315080409040E1F700C000000E94940985 +:10435000FCE5EF16FDE5FF0609F43CCD08F48DCD34 +:1043600037EAE3163DE5F30609F432CD3CCD809102 +:10437000A90282729CECE9169CE5F90609F4F4CCDA +:1043800008F096C0F6ECEF16FCE5FF0609F4D8CC71 +:1043900008F065C033ECE3163CE5F30609F4C4CC41 +:1043A00008F04CC0E2ECEE16ECE5FE0609F01BCD81 +:1043B0008091FE0280FF10C08091F802809581708C +:1043C0001F928F9381E892E09F938F930E94010840 +:1043D0000F900F900F900F908091F80280FF89CC82 +:1043E0008E7F8093F8026091F8027091F9028091BB +:1043F000FA029091FB020E94F7118091FE0280FF69 +:104400000FC08091F80281701F928F9382E192E039 +:104410009F938F930E9401080F900F900F900F9021 +:104420000E94A311EFEFF0E722E0E150F0402040BE +:10443000E1F700C000000E94F80DB0C9F4ECEF16DF +:10444000FCE5FF0609F477CC46E053E160E173E157 +:1044500025ECE2162CE5F20609F46ACCC4CC39EC62 +:10446000E3163CE5F30609F475CC88F4E7ECEE16A8 +:10447000ECE5FE0609F469CC49EF52E16CEE72E11D +:10448000F8ECEF16FCE5FF0609F452CCACCC2AECB4 +:10449000E2162CE5F20609F462CC4AE153E16CE243 +:1044A00073E13BECE3163CE5F30609F441CC9BCC0D +:1044B00081EDE8168CE5F80609F466CCB8F4EEEC6C +:1044C000EE16ECE5FE0609F457CC08F452CC2FECBE +:1044D000E2162CE5F20609F454CC6EE089E030EDEA +:1044E000E3163CE5F30609F449CC7DCC84EDE816EF +:1044F0008CE5F80609F44ECC78F4E2EDEE16ECE526 +:10450000FE0609F444CC61E088E1F3EDEF16FCE52A +:10451000FF0609F406CC67CC25EDE2162CE5F20681 +:1045200009F43BCC3DE5E316F30609F437C95BCC4F +:104530001F93CF93DF9380916C02807F09F049C075 +:1045400080916902882309F444C080919E02D09131 +:104550006D026091670270916802A0916A02B09149 +:104560006B02C62FC72316E0D81799F190E0109779 +:1045700011F0CF3F19F401968770F6CF189F900184 +:10458000199F300D1124F901E259FD4F4181471364 +:10459000F2CF40814613EFCF42814111ECCF4381EE +:1045A00054814A1B5B0B483C510528F780916C02F3 +:1045B0008F70806180936C02F901ED58FD4F80810E +:1045C0008F708061808387E692E00E94701B0E945A +:1045D000B20CDF91CF911F910895A1E1B0E0E3EF1C +:1045E000F2E20C94622D8C0185E0F801DE011D964B +:1045F00001900D928A95E1F7F801E28087E6A82EF6 +:1046000082E0B82E60916A0270916B0261157105AB +:1046100009F426C19091670240916802892F842392 +:104620008F3F09F41DC120813181C380D480F09077 +:104630006902F601E61BF70BFF2009F4DCC080914C +:104640006C02582F507FE83CF10508F09FC05111D3 +:104650006BC0FE2C431314C0921312C0E11010C0A3 +:104660008F70806180936C02C5010E94701B8091E5 +:104670006C02F80185838F2D6196EAE00C947E2D03 +:10468000C114D10429F0822F83238F3F09F003C185 +:1046900080E0F82FF170DF2E80FF3CC080919E02F9 +:1046A00040916D0256E0841315C02D873E878D859D +:1046B0009E850E944511292F22952F702230F0F0FF +:1046C000243018F59F70F1F0F8019581907FD1F4B6 +:1046D000D12C1EC090E0589FF001599FF00D11247D +:1046E000E259FD4F6181361306C06081261303C075 +:1046F0006281E6120FC001968770D5CF9F7011F0CE +:10470000882331F3805E883018F3C8010E94701B43 +:10471000FD2CB1CFEE2009F4AECF80916C02816008 +:1047200080936C02F12CA7CF431306C0921304C0F0 +:10473000F801EE2009F479C0C8010E9452118823C3 +:1047400009F1EE20F9F080916C02803270F0209136 +:1047500067023091680238872F831986DB86CA8604 +:104760008C87CE0107960E94701B86E0F801A7E6B1 +:10477000B2E001900D928A95E1F70E949822FF2401 +:10478000F39479CFC8010E94701BF9CF51110AC070 +:1047900087E692E00E94701B86E0F50111928A95EF +:1047A000E9F7C0CF43130FC092130DC0E1100BC047 +:1047B000F8018583C8010E94701B86E0F501119203 +:1047C0008A95E9F758CFC8010E9452118823D1F287 +:1047D000EE20C1F280916C02803238F220916702A3 +:1047E000309168023A8329831B82DD82CC828E83DA +:1047F000CE010196B8CFE83CF105F8F6FE2CEE208C +:1048000009F243131FC092131DC080916C0280FDFA +:1048100010C0982F907F69F0F8018583903F31F0A8 +:10482000982F907F905F8F70892B8583C8010E949D +:10483000701B86E0F801A7E6B2E001900D928A9520 +:10484000E1F719CFC8010E94521181118ECF8091DA +:104850006C02816080936C02C8010E94701B0BCFB8 +:10486000EE2009F48FCFC8010E945211F82E882340 +:1048700009F488CF86E0F801A7E6B2E001900D9236 +:104880008A95E1F780916702909168020E94451134 +:104890000E949822F0CE81E08E25FBCEA7E1B0E009 +:1048A000E4E5F4E20C94692D4B8B5C8B6D8B7E8B75 +:1048B0008F8B61111092A8021A8A198A85E0FE0175 +:1048C0007396DE011D9601900D928A95E1F786E0C0 +:1048D000FE013D96DE01179601900D928A95E1F753 +:1048E000CE0107960E94ED22882359F016E08091B0 +:1048F0009E0290916D02891343C06796E3E00C9489 +:10490000852D86E0FE013796DE01119601900D920D +:104910008A95E1F78A859B85892B41F38F8198855C +:1049200089238F3F19F320916D0230E0C901019670 +:104930008770992740919E024817190671F40E94CA +:104940004F1510926D0210929E0286E0E7E6F2E0AB +:10495000DF011D928A95E9F7C9CF96E0929FD001B9 +:10496000939FB00D1124A259BD4FFE0131960190C5 +:104970000D929A95E1F780936D020E94B20CB6CF2A +:10498000819FC001112482599D4F0E94ED228823EE +:1049900009F4B3CF80919E0290E001968770992729 +:1049A00080939E02A4CFA7E0B0E0E9EDF4E20C947E +:1049B000612D8E010F5F1F4F87E0F80111928A95DC +:1049C000E9F783E0C82E82E0D82EF12CE12CAA244E +:1049D000A394B12CF60181916F018F3F09F443C07C +:1049E000F894E82FE295EF70F0E021A18F70A50117 +:1049F00002C0440F551F8A95E2F7CA01922F982BE7 +:104A000091A392A18095892382A3789400C0EAE0C3 +:104A1000F2E0912C31E021912F3F09F470C0A22FD8 +:104A2000A295AF70B0E090968C9190E02F7002C08C +:104A3000959587952A95E2F780FD61C0832F982A86 +:104A4000330F52E0E031F50731F7F60131978081FD +:104A50008F3F11F00E94A50A80EA8A95F1F7F801CC +:104A6000EE0DFF1D9082EFEFEE1AFE0AF7E0EF1653 +:104A7000F10409F0AFCF47E050E0B8018FEA92E0CF +:104A80000E94E62D892BE9F187E0F801AFEAB2E058 +:104A900001900D928A95E1F781E08093AE020E9429 +:104AA000B1099093AD028093AC022091AC02309199 +:104AB000AD024FB7F8948091230390912403A09105 +:104AC0002503B09126034FBF821B930B0597E8F097 +:104AD00047E050E06FEA72E085EC92E00E94E62D3C +:104AE000892BC1F087E0EFEAF2E0A5ECB2E001909B +:104AF0000D928A95E1F781E01092AE0207C080E046 +:104B00009ECF8091AE028111D0CF80E02796EBE05E +:104B10000C947D2D80E0F0CF90E080E00E949F2DEE +:104B2000883E9E4F19F40E947C11089580E00895FC +:104B30001F920F920FB60F9211242F933F934F9312 +:104B40005F936F937F938F939F93AF93BF93CF9315 +:104B5000DF93EF93FF93D091E900DF708091EC0039 +:104B6000C82FC17080FDC0E81092E9008091F0006C +:104B7000877F8093F00078940E945B151092E90083 +:104B80008091F00088608093F000CD2BCF70C093AF +:104B9000E900FF91EF91DF91CF91BF91AF919F918C +:104BA0008F917F916F915F914F913F912F910F90D6 +:104BB0000FBE0F901F9018951F920F920FB60F9275 +:104BC00011242F933F934F935F936F937F938F9312 +:104BD0009F93AF93BF93EF93FF938091E10082FF88 +:104BE00015C08091E20082FF11C08091E1008B7FAF +:104BF0008093E10020910B032F5F822F62E30E94DC +:104C0000B82C992309F4C0C020930B038091DA00DB +:104C100080FF28C08091D80080FF24C08091DA00F6 +:104C20008E7F8093DA008091D90080FFE3C080E11D +:104C300089BD82E189BD09B400FEFDCF81E080938A +:104C4000190381EB9DE00E94680780910C0381119C +:104C500009C00E940A080E94D5088091E200846081 +:104C60008093E2008091E10080FF1BC08091E20010 +:104C700080FF17C08091E2008E7F8093E2008091D8 +:104C8000E20080618093E2008091D800806280938E +:104C9000D80019BC85E08093190389EB9DE00E9440 +:104CA00068078091E10084FF2FC08091E20084FFBB +:104CB0002BC080E189BD82E189BD89B5982F9170B3 +:104CC00080FFFBCF8091D8008F7D8093D8008091AA +:104CD000E1008F7E8093E1008091E2008F7E8093DF +:104CE000E2008091E20081608093E20080911A03EB +:104CF000882309F489C084E0809319038DEB9DE03B +:104D00000E946807809119038091E10083FF2BC006 +:104D10008091E20083FF27C08091E100877F80932C +:104D2000E10082E08093190310921A038091E10060 +:104D30008E7F8093E1008091E2008E7F8093E2007D +:104D40008091E20080618093E20042E060E080E0D8 +:104D50000E94A3088091F00088608093F00081ECAD +:104D60009DE00E946807FF91EF91BF91AF919F91E5 +:104D70008F917F916F915F914F913F912F910F9004 +:104D80000FBE0F901F90189510920B0380910A038D +:104D9000882309F43BCF809119038430C1F49091AA +:104DA000E9009F702091EC00822F817020FD80E847 +:104DB000892B95E09093E9009091EB0090FF04C05F +:104DC0009091EE0097FD08C08F708093E9001092DB +:104DD0000A031CCF1092F1009091E80095FDFACFE4 +:104DE0009091E80090FFF0CF9091E8009E7790932B +:104DF000E800EACF19BC1092190385EB9DE00E94F0 +:104E0000680710920C032ECF8091E30087FD93E09A +:104E10009093190373CF78941F921FB61F92112499 +:104E20008F939F93AF93BF9380912303909124031B +:104E3000A0912503B09126030196A11DB11D809379 +:104E4000230390932403A0932503B0932603BF91DB +:104E5000AF919F918F911F901FBE1F9018951F9229 +:104E60001FB61F9211248F939F93AF93BF9380918E +:104E70000503811113C08091230390912403A09115 +:104E80002503B09126034196A11DB11D80932303F4 +:104E900090932403A0932503B0932603BF91AF9171 +:104EA0009F918F911F901FBE1F901895CDB7DEB7B1 +:104EB000AA970FB6F894DEBF0FBECDBF85B7806846 +:104EC00085BF85B7806885BF84B7877F84BF0FB6ED +:104ED000F894A8958091600088618093600010929A +:104EE00060000FBE80E890E00FB6F89480936100F8 +:104EF000909361000FBE8FE39DE090934B028093EF +:104F00004A020E940A080E94D5088091E20084604B +:104F10008093E2007894809119038823A1F0109186 +:104F2000E9001F709091EC00892F817090FD80E85E +:104F3000182B1092E9008091E80083FD0E945B1518 +:104F40001F701093E90082E084BD93E095BD9AEF55 +:104F500097BD80936E000E947C11811102C00E9457 +:104F6000C91003E012E04AE0E42E42E0F42ED8013A +:104F70008D918D018F3F11F00E94A50AE016F10678 +:104F8000B1F70AE012E030E1E32E32E0F32EF8014F +:104F900081918F018F3F11F00E94A50AE016F10662 +:104FA000B1F787E0E5ECF2E0DF01282F1D922A95AA +:104FB000E9F7EFEAF2E0DF011D928A95E9F70E9436 +:104FC0008C25811102C00E94EB1382E090E00E94C8 +:104FD000912D8093FE020E9495119093B7028093C9 +:104FE000B6020E94D324EFE3FCE93197F1F700C049 +:104FF00000000E94D3248091C50280FF08C06FEF9B +:105000007FEF90E080E00E94C32D0E94940983E02E +:1050100090E00E94912D0E944A158091B802811162 +:10502000DDC08091FE0280FF14C082E594E09F9372 +:105030008F930E9401088091FE020F900F9080FFD5 +:1050400008C08CE394E09F938F930E9401080F9017 +:105050000F900E948C25811110C08091FE0280FF6C +:1050600008C084E194E09F938F930E9401080F9001 +:105070000F900E94EB130E94DB1388E090E00E94E7 +:10508000992D6093F8027093F9028093FA0290933D +:10509000FB026E7FD1F48091FE0280FF08C08BEC92 +:1050A00093E09F938F930E9401080F900F900E94AE +:1050B000DB1388E090E00E94992D6093F8027093D2 +:1050C000F9028093FA029093FB020E94000A8091F9 +:1050D000FE0280FF76C082EB93E09F938F930E9445 +:1050E00001088091FE020F900F9080FF6AC08091AE +:1050F000F80281701F928F9385E993E09F938F93BD +:105100000E9401088091FE020F900F900F900F9067 +:1051100080FF57C08091F80286951F928F938AE78F +:1051200093E09F938F930E9401088091FE020F905D +:105130000F900F900F9080FF44C08091F9021F9252 +:105140008F9380E693E09F938F930E940108809154 +:10515000FE020F900F900F900F9080FF32C0809151 +:10516000FA021F928F9386E493E09F938F930E949D +:1051700001088091FE020F900F900F900F9080FF1A +:1051800020C08091FB021F928F938CE293E09F934B +:105190008F930E9401088091FE020F900F900F9054 +:1051A0000F9080FF0EC08091FC021F928F9380E1D0 +:1051B00093E09F938F930E9401080F900F900F90A0 +:1051C0000F901092D3028091F80280FF04C060E03B +:1051D00086950E943E1381E08093B80280E091E0C2 +:1051E000909302038093010388E1482E512C85ECB3 +:1051F00092E097E0392E380E27E7622E24E0722ED7 +:10520000809119038530E1F489E694E00E946807F3 +:1052100000E4F02EEE24E39400E112E18091190302 +:10522000853009F458C00E944F150E94ED09109274 +:10523000BA028091B90281110E9499130E94D5117E +:105240000E94D324BDEBEB2EB2E0FB2E15ECC12E59 +:1052500012E0D12ED601F70191918D9122E0E43C2C +:10526000F20709F47CC09817B9F38091FE0281FD22 +:105270002AC110E0D6010D916D01F70191907F01D7 +:10528000901619F19026B12CAA24A394892D8A2175 +:10529000A1F0BEA21FA391E0802F8A2109F490E023 +:1052A00098A70E94B1098160782F9AA789A74EA17B +:1052B0005FA168A58AA50E944E24B394AA0CF6E0CB +:1052C000BF12E4CFF701319700831F5F173091F6CB +:1052D0000E94A50964C080911903843009F430C08C +:1052E0000E94A3118091BA02811109C0E092BA0212 +:1052F0008091F80281708093B9020E94B2111092DD +:1053000005030FB6F894A895409260000FBEF09286 +:10531000600083B7817F846083BF83B7816083BF70 +:105320007894889583B78E7F83BF0FB6F894A8953D +:1053300080916000886180936000109260000FBED1 +:1053400080911803882309F469CF0E94D324E5ECE7 +:10535000F2E081918111EDC23E12FBCF5FCF981335 +:1053600084CF0E94B1098C018091BB029091BC0254 +:1053700008171907A1F08FEF89A38AA31BA20E9427 +:10538000B1098160782F9DA38CA349A15AA16BA17B +:105390008DA10E944E241093BC020093BB02809109 +:1053A000D3028823D1F18091D202E091F802E695F0 +:1053B000E81BE093CE02823009F0B7C0F0E0E75678 +:1053C000FB4FE4910E2F10E0EEE2EE2EE0E1FE2E18 +:1053D0008091CF02882361F01092CF020E94B10920 +:1053E0009093CD028093CC021092D1021092D00201 +:1053F0000E94B109E091CC02F091CD028E1B9F0B6F +:105400008F3F9F4750F4E00FF11FF093CD02E093E0 +:10541000CC028CEC92E0F70109950E94ED09182F5F +:105420008091C402181731F11093C4020E94A5099B +:105430008091FE0282FF1EC080FF1CC084EA94E0BF +:105440000E9468078091FE0280FF14C01F921F9384 +:105450008FE994E09F938F930E9401088091FE0250 +:105460000F900F900F900F9080FF04C08DE994E093 +:105470000E94680780911903843009F0C1CE83E04F +:105480008093E9008091E80082FFBACE8091E80025 +:1054900090E085FF06C00E942908882309F49FC078 +:1054A00091E08091E8008B778093E800992309F4DC +:1054B000A7CEE981E150E33108F00DC1F0E0E55FEE +:1054C000F14D0C941C2D8CE794E00E946807F5ECDC +:1054D0008F2EF2E09F2E10E000E0AFE6AA2EA4E0AF +:1054E000BA2E1F930F937F926F920E94010884E758 +:1054F00094E00E946807D4018D914D010E94270D10 +:105500001F928F93BF92AF920E9401088DE694E0A4 +:105510000E9468070F5F1F4F0FB6F894DEBF0FBEE3 +:10552000CDBF07301105E9F6A4CE863059F4F0E07E +:10553000EA56FB4FE4910E2F10E07EE1E72E70E17A +:10554000F72E46CF893061F4E695F0E0ED56FB4F3B +:10555000E4910E2F10E062E9E62E6FE0F62E38CFD0 +:105560008F3061F4E695F0E0E057FB4FE4910E2FA9 +:1055700010E05DE2E52E5FE0F52E2ACF853159F48B +:10558000F0E0E357FB4FE4910E2F10E04FEDE42ED7 +:105590004EE0F42E1DCF08E210E094E6E92E9EE0E6 +:1055A000F92E883109F414CF833249F4EBE8F4E0A2 +:1055B000059114913DECE32E3FE0F32E09CF04EF6B +:1055C00011E02DE2E22E2EE0F22E843209F400CF1B +:1055D00000ED17E08FE8E82E89E0F82EF9CE00E222 +:1055E00010E0CE0101967C018091E80085FD0AC0A3 +:1055F0008091E8008B778093E8000E942908882337 +:1056000099F34ECF8091F100D7018D937D01015028 +:10561000110951F745CF1A828AE08B8311C08A8124 +:10562000823009F49CC1833091F1813009F053C07C +:105630000E94A5090E94222D6B837C838D839E830B +:1056400080911903843009F0DBCD1091E9001F70BF +:105650009091EC00892F817090FD80E8182B82E0FA +:105660008093E9008091E80080FF0DC050E040E0A9 +:1056700060E270E0CE0101960E945A088091E80035 +:105680008E778093E8001F701093E900B9CD809168 +:10569000C5028B838091C6028C838091C7028D8363 +:1056A0008091C8028E838091C9028F838091CA0243 +:1056B00088878091CB028987C3CF8A81823059F451 +:1056C0006B817C818D819E810E94222D86E290E0FB +:1056D0000E94A52DB5CF8FEF8983B2CF4C816B810E +:1056E0008A810E94D9109827892798279E838D83C5 +:1056F000A7CF2D813E813227232732274C816B8112 +:105700008A810E9452109CCF0E94781099CF8A8182 +:10571000813809F1A8F4803809F092CF8B81BFEF6E +:105720008B9FC00111246FEF70E00E94D22C462F96 +:1057300020E06091FA028091F9020E940A1280CF63 +:105740008238B1F0833809F07BCF20E04091FB0232 +:105750006C818B81F2CF60E08B810E943E138B8144 +:10576000811103C00E94B2116BCF0E94991368CFC0 +:105770008B818093FC029091FE0290FF61CF1F927B +:105780008F938FEA94E09F938F930E9401080F906C +:105790000F900F900F9054CF8A818138E1F078F408 +:1057A000803809F04DCF8091FB02EFEF8E9FC00152 +:1057B00011246FEF70E00E94D22C6B8341CF8238AE +:1057C00091F0833809F03CCF8091F9028B8380916E +:1057D000FA028C8335CF8091F80280FF02C0869553 +:1057E0001CCF80E01ACF8091FC0217CF6091F802A5 +:1057F0007091F9028091FA029091FB020E94F711D8 +:105800001FCF80E18A831CCF82E08A8389E805CF9D +:10581000CA80DB80DC24CD24DC248E010F5F1F4F87 +:10582000EC80E00EF12EF11CC60189589E4FE01667 +:10583000F10609F405CFF9E8CF16F2E0DF0658F4D7 +:105840000E94912DD80114968C93FFEFCF1ADF0A96 +:105850000F5F1F4FE9CFF8011482F7CF0A811B8138 +:10586000102701271027CE0101966C01EC80E00E75 +:10587000F12EF11CC80189589E4F0E151F0509F421 +:10588000DFCE0938A2E01A0720F4F60164810E94F5 +:10589000A52DFFEFCF1ADF0A0F5F1F4FEBCF0E943E +:1058A0004210CECE84E0AECFCA80DB80DC24CD2493 +:1058B000DC248E010F5F1F4FEC80E00EF12EF11CF7 +:1058C000C60187960E151F0509F4BACE20E5C2164B +:1058D00021E0D20658F40E94912DD80114968C93A1 +:1058E000FFEFCF1ADF0A0F5F1F4FEACFF8011482D4 +:1058F000F7CF0A811B81102701271027CE010196BF +:105900006C01EC80E00EF12EF11CC8018796E016C8 +:10591000F10609F495CE0035A1E01A0720F4F6014E +:1059200064810E94A52DFFEFCF1ADF0A0F5F1F4F82 +:10593000ECCF09BD19BD09B400FEFDCF8091D800A0 +:105940008F7D8093D8008091E00082608093E0009A +:105950008091E00081FDFCCF0E944F155FCC86E274 +:1059600090E00E94912D1B821C821D828E8368CE46 +:10597000991B79E004C0991F961708F0961B881FA1 +:105980007A95C9F78095089587FB082E062687FD2E +:10599000819567FD61950E94B82C0EF4919507FCE6 +:1059A00081950895AA1BBB1B51E107C0AA1FBB1F0D +:1059B000A617B70710F0A61BB70B881F991F5A959B +:1059C000A9F780959095BC01CD01089597FB072E0E +:1059D00016F4009407D077FD09D00E94D22C07FC62 +:1059E00005D03EF4909581959F4F089570956195EF +:1059F0007F4F0895A1E21A2EAA1BBB1BFD010DC00B +:105A0000AA1FBB1FEE1FFF1FA217B307E407F5076E +:105A100020F0A21BB30BE40BF50B661F771F881F4A +:105A2000991F1A9469F760957095809590959B01E0 +:105A3000AC01BD01CF010895EE0FFF1F0590F49159 +:105A4000E02D0994692796276927782787277827E3 +:105A500008950E94312D332312F48A1B9B0B0C9462 +:105A6000422DA29FB001B39FC001A39F700D811D65 +:105A70001124911DB29F700D811D1124911D089557 +:105A80000E94312DB7FF0895821B930B08950E9449 +:105A9000312DA59F900DB49F900DA49F800D911D59 +:105AA00011240895B7FF0C94472D0E94472D821BA7 +:105AB000930B08952F923F924F925F926F927F9235 +:105AC0008F929F92AF92BF92CF92DF92EF92FF920E +:105AD0000F931F93CF93DF93CDB7DEB7CA1BDB0BBA +:105AE0000FB6F894DEBF0FBECDBF09942A8839885F +:105AF00048885F846E847D848C849B84AA84B98466 +:105B0000C884DF80EE80FD800C811B81AA81B98171 +:105B1000CE0FD11D0FB6F894DEBF0FBECDBFED0185 +:105B20000895F999FECF92BD81BDF89A992780B565 +:105B30000895A6E1B0E044E050E00C94CB2DA8E13C +:105B4000B0E042E050E00C94CB2D262FF999FECF27 +:105B500092BD81BDF89A019700B4021639F01FBAC0 +:105B600020BD0FB6F894FA9AF99A0FBE08950396DD +:105B7000272F0E94A62D0E94A52D252F0E94A62D1D +:105B8000242F0C94A62D0196272F0E94A62D0C944D +:105B9000A52DDC01CB01FC01F999FECF06C0F2BDB9 +:105BA000E1BDF89A319600B40D9241505040B8F7DB +:105BB0000895FC014150504030F001900616D1F795 +:105BC0003197CF010895882799270895FB01DC01BB +:105BD00004C08D910190801921F441505040C8F7C4 +:105BE000881B990B0895F894FFCF3C1664160D1886 +:105BF00064160D189716B8160D18B617C317441F5C +:105C0000441F7F1F7F1F1620AE1FAE1FAE1F302008 +:105C10009D20AE20AE200B2B0F2B5D2B6E2B792BF6 +:105C2000842B872BCC2BF62B6B2B6B2B012C042C72 +:0C5C3000082C2E2C4F2C522C542C792CBC +:105C3C009109CB0D9009A10D8E0901191A1B1C1D80 +:105C4C001E1F202122010201010A092D2056657216 +:105C5C0073696F6E202D0A5649443A2030783738D4 +:105C6C003037282267746970732229205049443ACE +:105C7C0020307844434342282272657669756E67FA +:105C8C0034312229205645523A2030783030303188 +:105C9C000A4255494C443A2020285365702031362D +:105CAC002032303232290A4F5054494F4E533A2049 +:105CBC004C5546412045585452414B455920434F71 +:105CCC004E534F4C4520434F4D4D414E44204C5468 +:105CDC004F20343039360A4743433A20382E352E7C +:105CEC0030204156522D4C4942433A20322E302E10 +:105CFC0030204156525F415243483A20617672350A +:105D0C000A00818283E200E900EA00B500B600B720 +:105D1C0000CD008301CC008A019201940121022361 +:105D2C000224022502260227022A02B300B4006FC5 +:105D3C00007000F4F5F6F7313332946697C63435BB +:105D4C000001020202020606060909090909090FE7 +:105D5C000F0F0F0F0F1515151819191919191919E6 +:105D6C0019191923244022322222010001CE00AC41 +:0A5D7C0000D70DF00D100E290E00E7 +:00000001FF diff --git a/sofle_rev1_harvester.hex b/sofle_rev1_harvester.hex new file mode 100644 index 000000000000..64c26686d9ec --- /dev/null +++ b/sofle_rev1_harvester.hex @@ -0,0 +1,2306 @@ +:100000000C9482070C949F070C949F070C949842C1 +:100010000C949F070C949F070C949F070C949F07C8 +:100020000C949F070C949F070C945A230C9401285E +:100030000C943B380C949F070C949F070C949F07DB +:100040000C949F070C949F070C949F070C949F0798 +:100050000C949F070C9433240C949F070C949F07D7 +:100060000C949F070C949F070C949F070C949F0778 +:100070000C949F070C949F070C949F070C949F0768 +:100080000C949F070C949F070C949F070C949F0758 +:100090000C949F070C949F070C949F070C949F0748 +:1000A0000C949F070C949F070C949F07050109026D +:1000B000A10185020901A1000509190129081500FE +:1000C0002501950875018102050109300931158165 +:1000D000257F95027508810609381581257F9501D0 +:1000E00075088106050C0A38021581257F95017572 +:1000F000088106C0C005010980A101850319012AF4 +:10010000B700150126B700950175108100C0050CD8 +:100110000901A101850419012AA002150126A002E6 +:10012000950175108100C005010906A1018506052C +:100130000719E029E71500250195087501810205D9 +:1001400007190029EF1500250195F07501810205B9 +:10015000081901290595057501910295017503910D +:1001600001C00660FF0961A1010962150026FF00B8 +:100170009520750881020963150026FF00952075FA +:10018000089102C005010906A101050719E029E748 +:1001900015002501950875018102950175088101F9 +:1001A0000507190029FF150026FF0095067508812F +:1001B000000508190129059505750191029501753C +:1001C000039101C0010000050105020503050405B6 +:1001D00005050006010602060306040605060007DB +:1001E00001070207030704070507000801080208C2 +:1001F00003080408050800090109020903090409A4 +:1002000005090000010002000300040005000001D0 +:1002100001010201030104010501000201020202C1 +:1002200003020402050200030103020303030403A3 +:10023000050300040104020403040404050400008F +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:1002600000007E0F00D4FFFFFFC7000000780000F1 +:100270000000000000002A2B280000000000000001 +:1002800000000000000000000029000000002C1EFB +:100290003420212224342627252E362D3738271EB8 +:1002A0001F202122232425263333362E37381F04DE +:1002B00005060708090A0B0C0D0E0F101112131476 +:1002C00015161718191A1B1C1D2F3130232D350434 +:1002D00005060708090A0B0C0D0E0F101112131456 +:1002E00015161718191A1B1C1D2F3130354C00DA42 +:1002F0000281FFD9F1DB20A4A62EAF00A0C000A18F +:10030000C800AED580A81FD300408D1420005343F1 +:10031000524C4B004E554D4C4B004350534C4B00F0 +:100320000A0A004E46490A004D6F757365005379FD +:100330006D0A004E61760A0047616D652B004D65C0 +:100340006469610046756E630A004E756D0A004768 +:10035000616D650A00426173650A004C415945525E +:10036000000A0A00808182838485868788898A8B37 +:100370008C8D8E8F9091929394A0A1A2A3A4A5A6F8 +:10038000A7A8A9AAABACADAEAFB0B1B2B3B4C0C16F +:10039000C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1C5 +:1003A000D2D3D400000101010101010101010202C7 +:1003B0000202020202020203030303030303030413 +:1003C00004040404040405050505050606060606DE +:1003D000070707070708080808090909090A0A0A98 +:1003E0000B0B0B0C0C0C0D0D0D0E0E0E0F0F0F103A +:1003F00010111111121213131414151516161717C4 +:10040000181819191A1A1B1B1C1D1D1E1E1F20202F +:10041000212222232424252626272829292A2B2C79 +:100420002D2D2E2F30313232333435363738393A9C +:100430003B3C3D3E3F404142434445464748494A94 +:100440004C4D4E4F50515354555658595A5B5D5E62 +:100450005F616264656668696B6C6D6F70727375FD +:1004600077787A7B7D7E8082838587888A8C8E8F61 +:1004700091939596989A9C9EA0A2A3A5A7A9ABAD8F +:10048000AFB1B3B5B7BABCBEC0C2C4C6C9CBCDCF7D +:10049000D1D4D6D8DBDDDFE2E4E7E9EBEEF0F3F52B +:1004A000F8FAFDFF07087F0807003E5B4F5B3E0040 +:1004B0003E6B4F6B3E001C3E7C3E1C00183C7E3C5D +:1004C00018001C577D571C001C5E7F5E1C00001826 +:1004D0003C180000FFE7C3E7FF00001824180000E5 +:1004E000FFE7DBE7FF0030483A060E0026297929AE +:1004F0002600407F05050700407F05253F005A3C48 +:10050000E73C5A007F3E1C1C0800081C1C3E7F0074 +:1005100014227F2214005F5F005F5F0006097F01E5 +:100520007F00006689956A0060606060600094A248 +:10053000FFA2940008047E04080010207E20100012 +:1005400008082A1C0800081C2A0808001E101010A1 +:1005500010000C1E0C1E0C0030383E383000060E09 +:100560003E0E060000000000000000005F000000DA +:10057000000700070000147F147F1400242A7F2A3C +:100580001200231308646200364956205000000808 +:1005900007030000001C224100000041221C000053 +:1005A0002A1C7F1C2A0008083E08080000807030C2 +:1005B0000000080808080800000060600000201023 +:1005C000080402003E5149453E0000427F400000C1 +:1005D0007249494946002141494D33001814127FA0 +:1005E00010002745454539003C4A49493100412121 +:1005F00011090700364949493600464949291E0074 +:100600000000140000000040340000000008142224 +:1006100041001414141414000041221408000201B3 +:10062000590906003E415D594E007C1211127C00B2 +:100630007F49494936003E41414122007F414141C5 +:100640003E007F49494941007F09090901003E41B7 +:10065000415173007F0808087F0000417F4100007E +:100660002040413F01007F08142241007F4040406C +:1006700040007F021C027F007F0408107F003E4183 +:1006800041413E007F09090906003E4151215E00BB +:100690007F091929460026494949320003017F0193 +:1006A00003003F4040403F001F2040201F003F40CC +:1006B00038403F0063140814630003047804030007 +:1006C0006159494D4300007F414141000204081037 +:1006D0002000004141417F0004020102040040402B +:1006E00040404000000307080000205454784000B8 +:1006F0007F2844443800384444442800384444287F +:100700007F0038545454180000087E09020018A4D1 +:10071000A49C78007F080404780000447D40000019 +:100720002040403D00007F102844000000417F40F1 +:1007300000007C04780478007C08040478003844C5 +:1007400044443800FC182424180018242418FC0001 +:100750007C080404080048545454240004043F4412 +:1007600024003C4040207C001C2040201C003C40D9 +:1007700030403C004428102844004C9090907C006D +:100780004464544C440000083641000000007700E7 +:1007900000000041360800000201020402003C266D +:1007A00023263C00000000000000404040F0F8F824 +:1007B000FF38FFF8F83FF8F8FF38FFF8F8F040404E +:1007C0004000000000000080C0C0C0800000C0C029 +:1007D0008000000080C0C000C0C0000080C0C00019 +:1007E00000000000C0C0C0C0C000C0C000000000C9 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:10082000000000C0F0F8FC3E1E06010000007F4101 +:1008300041417F007F4141417F000080C0E07E5BFD +:100840004F5BFEC00000C000DCD7DEDEDED7DC0080 +:10085000C0000000000000000000000000000000D8 +:1008600000000000000000000000494949FFFFFFB0 +:10087000FFE0DFBFBF00BFBFDFE0FFFFFFFF494971 +:100880004900000000001F3F6060E0BF1F007F7F45 +:10089000071E381E077F7F007F7F0E1F3B716000A1 +:1008A000000000007F7F0C0C0C007E7E007F7E032A +:1008B00003007F7E03037E7E03037F7E000F3E7076 +:1008C0003C063C703E0F00327B49493F7E007F7EF4 +:1008D0000303001E3F69696F26000000000000004E +:1008E000000000030F1F3F3C7870600000007F4154 +:1008F00041417F007F4141417F00307B7F78302044 +:100900002030787F3B0003000F7F0F0F0F7F0F0019 +:1009100003000000000000000000000000000000D4 +:1009200000000000000000000000010101070F0F9F +:100930007F0F7F0F0F7E0F0F7F0F7F0F0F070101BC +:1009400001000000000000000000000101000000A4 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000AF00AE29001E001F00200024 +:1009F00021002200350014001A000800150017001D +:100A0000E10004001600070009000A0000571D005D +:100A10001B00060019000500E300E200E74429423C +:100A20002C4339002A00270026002500240023003B +:100A30003100130012000C0018001C003472330047 +:100A40000F000E000D000B00015738003700360074 +:100A5000100011007600E6004C472A452846A80001 +:100A600029001E001F002000210022002B0017007B +:100A700014001A0008001500E1000A000400160026 +:100A800007000900E0001D001B000600190005001A +:100A900000000000055108512C0068002A002700C2 +:100AA00026002500240023003100130012000C0052 +:100AB00018001C00340033000F000E000D000B0066 +:100AC000E50038003700360010001100000000007B +:100AD0004C002A002800A8000000000000000000D0 +:100AE0000000000000000000000000000000000006 +:100AF00001000401160100000000000001001D01BA +:100B00001B010601190100000100010000000100A5 +:100B100000000000000000000000000000000000D5 +:100B200016011D011B01060119011C0100004F00E7 +:100B3000520051005000390001004D004B004E00A2 +:100B40004A004900010001004C002A002800000072 +:100B5000005C000000000868000001500000000078 +:100B6000000000000000000000000000166A000005 +:100B700000000000DE5C000000000000000000003B +:100B80000000000000000000010000000000000064 +:100B9000000000000000000016011D011B010601FD +:100BA00019011C010000F300F000F100F200000048 +:100BB00000004F00520051005000000000000000F3 +:100BC000F500F600F4000000010000000000000045 +:100BD0000000000001000000000000000000000014 +:100BE0000100E300E200E000E1000000010000007D +:100BF00000000000000000000000000001000000F4 +:100C000000000000010000000000000000000000E3 +:100C10000000C95CC75CC55CC35CC25C0000AB0083 +:100C2000A900AA00AC0000000000000000000000C5 +:100C30000000000000000000A800AD00AE00C35C92 +:100C400000000000000000000000000000002F0075 +:100C5000240025002600300000003300210022007F +:100C600023002E00000035001E001F002000310070 +:100C700000000000370027002D00000000000000E9 +:100C80000000000000000000000000000000000064 +:100C9000000000000000E300E600E400E5000000C2 +:100CA0000000000000000000000000000000000044 +:100CB0000000010000000000000000000000000033 +:100CC0000000000000002F0224022502260230024C +:100CD000000033022102220223022E02000035020C +:100CE0001E021F022002310200000000260227021D +:100CF0002D020000000000000000000000000000C5 +:100D00000000000000000000000000000000E30000 +:100D1000E600E400E5000000000000000000000024 +:100D200000000000000000000000000001000000C2 +:100D3000000000000000000000000000000045006E +:100D40004000410042004600000044003D003E00DB +:100D50003F004700000043003A003B003C004800D1 +:100D60000000000076002B002C00000000000000B6 +:100D70000000000000000000000000000000000073 +:100D8000000000000000E300E600E400E5000000D1 +:100D90000000000000000000000000000000000053 +:100DA0000100000000000000000000000000000042 +:100DB0000000000000000000000001000000000032 +:100DC0000000000001000100010000000000000020 +:100DD0000000000000000000000000000000010012 +:100DE000280000000050000000000000000000008B +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E20004E004B00A900AA0055005400A900AA00DA +:100E3000A900AA00A900AA00A900AA00A900AA0066 +:100E4000C75CC55CCB5CC95C4F0050004F005000D4 +:100E5000A900AA00A900AA004E004B004D004A00BC +:100E6000A900AA00A900AA0009025B00030100A0D2 +:100E7000FA09040000010301010009211101000128 +:100E80002240000705810308000109040100020354 +:100E90000000000921110100012222000705820340 +:100EA00020000107050303200001090402000103DB +:100EB00000000009211101000122B600070584038A +:100EC000200001120100020000000832FC8702012C +:100ED00000010200010C0353006F0066006C006506 +:100EE0000000001A034A006F0073006500660041AD +:100EF00000640061006D00630069006B0000000485 +:100F00000309040011241FBECFEFDAE0DEBFCDBF1E +:100F100029E0A6E2B3E001C01D92A832B207E1F7D2 +:100F200013E0A0E0B1E0EEEDFDE802C005900D9207 +:100F3000A632B107D9F70E9462380C9487460C9408 +:100F40000000E8EDF0E080818E7F80831092E20067 +:100F50001092DA001092E100A0EEB0E08C91816076 +:100F60008C9380818F77808319BCA7EDB0E08C9142 +:100F70008E7F8C9380818F7E80831092C00808952D +:100F80002091E4003091E50095E6A9012091EC0064 +:100F9000822F817020FF06C08091E80080FF06C08C +:100FA00080E008952091E80022FD1AC08091E508B4 +:100FB000882389F0853089F08091EB0085FD0FC092 +:100FC0002091E4003091E50042175307F9F2915067 +:100FD000E1F684E0089582E0089583E0089581E0D9 +:100FE00008958091E70887FF13C08091E80082FF91 +:100FF00006C08091E8008B778093E80004C0809160 +:10100000E5088111F2CF08958091E5088823D9F38E +:101010008091E80080FFF8CF8091E8008E77ECCFD8 +:10102000982F9093E900242F762F50E0891731F004 +:101030007091EC002091ED005091F00021FD07C06F +:101040009F5F973071F78093E90081E008953091B8 +:10105000EB003E7F3093EB003091ED003D7F30930D +:10106000ED003091EB0031603093EB007093EC00B9 +:101070002093ED005093F0002091EE0027FDE0CF8B +:1010800080E00895B0E0A0E0E8E4F8E00C94D243FA +:10109000C8EDD0E088818F7E8883E7EDF0E0808125 +:1010A0008160808384E082BF81E08093C008888172 +:1010B0008E7F888302EE10E0F80110821092DA0031 +:1010C00081EEC82ED12CF601108288818F7788831B +:1010D00088818068888388818F7D888319BC10927D +:1010E000E5081092E6081092E4081092E30890EEEA +:1010F000E92EF12CF70180818B7F808388818160CC +:10110000888342E060E080E00E941008F601808160 +:101110008E7F8083F80180818160808380818860F8 +:101120008083F70180818E7F8083888180618883BE +:10113000CDB7DEB7E8E00C94EE43FC018091ED08FA +:101140009091EE0886179707A0F06115710529F4B4 +:101150009091E8009E779093E80090E0611571050A +:1011600051F4911108C08091E80082FF34C080E002 +:101170000895BC01F2CF8091E5088823C1F1853044 +:10118000C1F18091E80083FD30C08091E80082FDCC +:10119000EACF8091E80080FFE1CF8091F3002091B9 +:1011A000F200382F6115710519F02830310558F01B +:1011B00091E02830310509F090E02091E8002E7789 +:1011C0002093E800CBCF81918093F10061507109A9 +:1011D0002F5F3F4FE7CF8091E508882341F08530AE +:1011E00041F08091E80083FFBECF81E0089582E066 +:1011F000089583E008958091C208089587E797E7EE +:10120000909301088093000888E19AE00FB6F89463 +:10121000A895809360000FBE90936000FFCF2FB71A +:10122000F8946091BA087091BB088091BC089091C5 +:10123000BD082FBF0895209195012223C9F0209168 +:10124000BE0827FF15C0E62FE695E695E695EE3138 +:10125000D8F4E80FF92FF11D677021E030E001C0EC +:10126000220F6A95EAF72095828128232283089528 +:10127000FC01329608962191621303C0DF01119799 +:101280001C92E817F907B9F70895209195012223D8 +:10129000C1F02091BE0827FF14C0E62FE695E69521 +:1012A000E695EE31F8F4E80FF92FF11D677021E0B3 +:1012B00030E001C0220F6A95EAF78281822B828397 +:1012C0000895FC0132962FEF30E04191641751F000 +:1012D0002F3F19F4411101C0232F3F5F3630A9F78A +:1012E0002F3F09F40895820F911D27FD9A95FC0167 +:1012F00062830895A3E0B0E0E0E8F9E00C94D843FD +:101300002091B7083091B80828173907A1F09093B9 +:10131000B8088093B708E091B508F091B608309707 +:1013200051F024E029839B838A830680F781E02D96 +:10133000CE01019609952396E2E00C94F443A3E0D4 +:10134000B0E0E5EAF9E00C94D8432091B30830917D +:10135000B40828173907A1F09093B4088093B30814 +:10136000E091B508F091B608309751F023E0298359 +:101370009B838A830680F781E02DCE010196099533 +:101380002396E2E00C94F443FC01680F791F8FEF81 +:1013900091E32191822728E030E087FF09C0880F80 +:1013A000892721503109C9F7E617F70791F7089502 +:1013B000880FF7CFFA01811101C0FB01099508954B +:1013C000E3EFF8E024813AE0231B08F420E02483D3 +:1013D0008091C40581608093C4050895E3EFF8E02F +:1013E00024813AE0230F08F42FEF24838091C40571 +:1013F00081608093C40508959091F308937071F013 +:101400008093F4086093F508493708F048E7409363 +:10141000F6088091C405822B8093C4050895E3EFFC +:10142000F8E0438128E0421B08F440E0818121E09C +:10143000628190E00E94FC090895E3EFF8E04381A7 +:1014400028E0420F08F44FEF818121E0628190E0B3 +:101450000E94FC090895E3EFF8E0628128E0621B36 +:1014600008F460E0818121E0438190E00E94FC0962 +:101470000895E3EFF8E0628128E0620F08F46FEF6F +:10148000818121E0438190E00E94FC090895E3EF0F +:10149000F8E0818121E0438162818250990B0E94B2 +:1014A000FC090895E3EFF8E0818190E021E04381B9 +:1014B000628102960E94FC0908959091F30893704E +:1014C00061F081110BC094609093F3081092940125 +:1014D0008091C405862B8093C40508958B3210F04B +:1014E000986AF2CF880F880F982BEECF8091F3087F +:1014F00086958695815009F48AE261E00E945D0A32 +:1015000008958091F308869586958F5F8B3208F059 +:1015100081E061E00E945D0A0895809393018091CB +:10152000F3088370809392010E94DE1283E080931F +:1015300094010895EF92FF920F939701201B3109B8 +:101540002F3F310519F010F02FEF30E02095382FA4 +:10155000320F08F43FEF832F0F91FF90EF90089523 +:10156000EF92FF920F939701201B31092F3F310516 +:1015700019F010F02FEF30E0322F3095482F430F45 +:1015800008F44FEF842F620F0F91FF90EF900895B2 +:10159000EF92FF920F93972F093438F4B701601B35 +:1015A00071096F3F710519F010F06FEF70E0485F3F +:1015B0005F4F4131510540F0A901485F5F4F413114 +:1015C000510510F06FEF70E06095482F460F08F45A +:1015D0004FEF842F37FF02C02D5F3F4F3595279582 +:1015E000359527956091F408620F792F0F91FF9040 +:1015F000EF900895EF92FF920F931F930E0D1F2D02 +:10160000111DF90137FF03C0F195E195F10924E0BF +:10161000EE0FFF1F2A95E1F7EF3FF10519F014F0E7 +:10162000EFEFF0E09A0157FF03C0319521953109A2 +:1016300094E0220F331F9A95E1F72E173F070CF421 +:10164000F901E00FF11FEF3FF10519F010F0EFEF96 +:10165000F0E0E095282F3E2F230F08F42FEF822F84 +:101660001F910F91FF90EF900895EF92FF920F93CB +:10167000970195E0099F200D311D11242F3F310561 +:1016800019F010F02FEF30E02095382F320F08F4CA +:101690003FEF832F0F91FF90EF90089522E8241BD6 +:1016A00008F420E0620F08954095282F429F412DB5 +:1016B0001124842F0895E42FF0E0EE0FFF1FE35B69 +:1016C000FD4F9081921B97FD9195292F38E1239F23 +:1016D000212D1124620F08950F931F9310E0F8013C +:1016E000EE0FFF1FE35BFD4F9081905797FD9195A3 +:1016F000000F111FF801EF5EFD4F05AD0052110BF9 +:101700002003F001219FF00D112408E310E0091BD4 +:10171000110997FD139540039001419F300D11244D +:10172000E20FF31F9F01220F331F2E0F3F1F37FFC2 +:1017300002C021583F4F220F232F221F330B620F6D +:101740001F910F9108950F931F93522F10E0F801EE +:10175000EE0FFF1FEF5EFD4FA5ADA052BB0B9D012D +:101760005203F001539FF00D1124000F111FD801F7 +:10177000A35BBD4F0C910057110B40039001419F9B +:10178000300D11242E0F3F1F37FF02C0215C3F4F49 +:1017900096E0359527959A95E1F7620F1F910F9185 +:1017A00008950F931F93522F10E0F801EE0FFF1FC3 +:1017B000EF5EFD4FA5ADA052BB0B9D015203F001A2 +:1017C000539FF00D1124000F111FD801A35BBD4FD3 +:1017D0000C910057110B40039001419F300D1124D3 +:1017E0002E0F3F1F37FF02C021583F4F220F232FDC +:1017F000221F330B620F1F910F910895EF920F93E9 +:10180000972F23E0029FB0011124759567956E0D07 +:10181000792F0F91EF900895322F50E0FA01EE0FDB +:10182000FF1FEF5EFD4F95AD905297FD9195440FD0 +:10183000551FFA01E35BFD4F2081231B330B290F5A +:10184000311D97FD3A95620F0895E42FF0E0EE0FF9 +:10185000FF1FEF5EFD4F65AD621B0895E42FF0E0C2 +:10186000EE0FFF1FE35BFD4F6081621B0895622F47 +:101870000895E42FF0E0EE0FFF1FE35BFD4F408182 +:1018800034EE439F412D1124E82FF0E050E0445EF8 +:101890005F4FDA01A21BB1099D01B7FF03C031956B +:1018A0002195310993E0220F331F9A95E1F7AF019B +:1018B000421B530B9A0157FD20E0582F259F212DE5 +:1018C0001124822F0895E42FF0E0EE0FFF1FE35B59 +:1018D000FD4F408134EE439F412D1124E72FF0E06E +:1018E00050E0445E5F4FDA01A21BB1099D01B7FFD2 +:1018F00003C031952195310993E0220F331F9A954A +:10190000E1F7AF01421B530B9A0157FD20E0279FDF +:10191000212D1124722F08950E946F130895FF92B4 +:101920000F931F93CF93DF93182F062FF42ED0E041 +:10193000C0E02F2D402F612FCE010E948C0C2196EC +:10194000C834D105B1F7CDB7DEB7E5E00C94F1436B +:10195000FC019B01009729F480E077FF2BC080E811 +:101960000895AC0197FF04C044275527481B590B25 +:10197000B901640F751F37FD10C0241B350BC90159 +:10198000A5E0880F991FAA95E1F70E940B4480E219 +:10199000861BF7FF0FC081950895CB0165E0880F86 +:1019A000991F6A95E1F7BA01621B730B0E940B4401 +:1019B00080E6EECF0895EF920F93CF93DF93D72F6A +:1019C000C82FC9010E19BA010E94A80C602F681B0C +:1019D0007D2F8C2FDF91CF910F91EF9008950F9372 +:1019E000CF93DF93D72FC82FC901BA010E94A80C4B +:1019F000682F600F7D2F8C2FDF91CF910F9108956D +:101A0000EF920F931F93CF93DF93D62FC72F182FEB +:101A1000C9010E19010FBA010E94A80C081B202F42 +:101A2000219F212D1124822F6D2F7C2FDF91CF91AB +:101A30001F910F91EF900895EF920F931F93CF9303 +:101A4000DF93D62F172FC82FC9010E19070FBA0120 +:101A50000E94A80C702F781B719F712D11246D2F7F +:101A60008C2FDF91CF911F910F91EF9008950F93DD +:101A70001F93CF93DF93D62FC72F182FC901212F84 +:101A8000201B022FBA010E94A80C982F990F990FC2 +:101A9000891B800F282F219F212D1124822F6D2F2C +:101AA0007C2FDF91CF911F910F9108950F931F937A +:101AB000CF93DF93D62F172FC82FC901272F201BB5 +:101AC000022FBA010E94A80C982F990F990F782F16 +:101AD000791B700F719F712D11246D2F8C2FDF9149 +:101AE000CF911F910F910895E82F86FDE0952E2F3D +:101AF0002F7086FD2F5FE695E695E695E670F0E09F +:101B0000E650FE4F9181929F902D212D11249295A8 +:101B10009F702295207F922B2081920F87FD9195B7 +:101B200080E8890F08950F931F93CF93DF938B0164 +:101B3000D82FC42F822F0E94740DEC2FF0E0EE0FEF +:101B4000FF1FE35BFD4F90819058890F87FD8195C2 +:101B5000880F682F2CE0629F612D1124600F712F78 +:101B60008D2FDF91CF911F910F910895409190019A +:101B70005091910125E038E0429FC001439F900DB4 +:101B8000529F900D1124875E994C90939101809300 +:101B90009001890F0895AC018230910508F40895F1 +:101BA0009FEF413E8EE1580740F49A0195E036954B +:101BB00027959A95E1F798E0920F61E0E62FE90FFB +:101BC000FF27FF1F9F0135952795822F229FF00148 +:101BD000239FF00DF00D11244E175F0738F49FEF8F +:101BE000920F961758F78FEF860F08952F3FE9F35E +:101BF00061E0620FF6CF0F93CF93DF93D72FC82FFB +:101C000047FD419588E390E0841B910947FD93953A +:101C1000889FB001899F700D700D1124229FC00113 +:101C2000239F900D900D1124860F971F0E94CB0DBE +:101C3000982F990F890F682F600F7D2F8C2FDF91C0 +:101C4000CF910F91089530E020E0869F212D969F3F +:101C5000200D311D1124C90108952091F70830E1AC +:101C6000230F08F42FEF60E1822F90E00E94230EF3 +:101C7000BC0188EB9BE00E94B44390E080E00895B3 +:101C8000AF92BF92CF92DF92FF920F931F93CF93A9 +:101C9000DF93362F472FE82FF0E0EC55FC4F711102 +:101CA0000FC0E4918E2F2E2F6E2F722FDF91CF91C8 +:101CB0001F910F91FF90DF90CF90BF90AF9008954C +:101CC000C72FD0E02491F22E022F10E056E0659F3E +:101CD000C0011124EFEFF0E0BF010E94B443832F55 +:101CE00090E0880F991F35E5369FD001379FB00DE2 +:101CF00011248A1B9B0B982F990F980F6F01CC1AF8 +:101D0000DD0AC09ED001C19EB00DD09EB00D112441 +:101D10008B2F499FA0011124452F55276F01C41A0D +:101D2000D50AC09EA001C19E500DD09E500D112419 +:101D30005F01A91AB108AC9E6001AD9ED00CBC9E9B +:101D4000D00C1124CD2CDD24EC19FD09E09FE0011D +:101D5000E19FD00DF09FD00D1124ED2F6230710561 +:101D6000A1F050F46115710509F49ECF6130710541 +:101D700081F0EB2F852F98CF6430710569F080F0EA +:101D80006630710509F490CFF4CFE22F2B2F8D2F01 +:101D90008BCFE22F252F88CFEB2F822F2D2F84CFB3 +:101DA0002B2F8F2DE52F80CFB0E0A0E0EAEDFEE0F5 +:101DB0000C94D3438C01FC01E352FD4F80816823D6 +:101DC00049F1D090F508D091F608C091F408EC2EB6 +:101DD000F12C0E94B60D282FC7018C549F4F68E646 +:101DE00071E00E940B448E199F0997FD039695950B +:101DF00087959595879523706C2F289F600D1124EA +:101E00007D2D8D2F0E94400E462F282F672FC80151 +:101E10000E948C0CCDB7DEB7E7E00C94EF438091C5 +:101E2000890480FD16C081FD16C082FD16C0809118 +:101E300088048823A1F0883280F428E0829FC001C2 +:101E4000112468E270E00E940B44862F672B39F062 +:101E5000089582E0089584E0089588E0089581E07F +:101E600008958091890480FD14C081FD14C082FD15 +:101E700016C080918704882381F08E3180F420E59C +:101E8000829FC00111246EE170E00E940B44862FF6 +:101E9000089584E1089588E2089588E0089580E532 +:101EA000089580E00895F894E82FE295EF70F0E04F +:101EB00031A1282F2F7081E090E001C0880F2A9572 +:101EC000EAF7982F9095932391A392A1892B82A34F +:101ED000789408959091BE0892FF06C0282F28712B +:101EE0002830F9F4877F846093FF06C0282F28717B +:101EF0002831F1F4877E84612091BF0820FF06C05D +:101F0000382F38713830D9F4877F816021FF06C0BF +:101F1000282F28712831D1F4877E816194FD877E36 +:101F20000895282F24712430F9F68B7F8860DCCF48 +:101F3000282F2471243101F78B7E8861DDCF382F63 +:101F40003171313019F78E7F8860E0CF282F2171F1 +:101F5000213121F78E7E8861E1CFCF93DF93EC01B1 +:101F600082389105B1F108F040C08133910509F440 +:101F70009DC048F58932910509F48DC08A9709F40E +:101F80009CC0C11522E5D20708F0C8C0C11531E5D3 +:101F9000D30708F02FC1C83ED10508F0A3C0C13E49 +:101FA000D10588F5C83AD10508F08EC0C53AD105EB +:101FB00008F004C1C130D10531F1209721F1C430BE +:101FC000D10508F545C08533910509F45FC0C9976F +:101FD000C1F68091BE08837009F046C18091BF08A8 +:101FE00083FF11C0C9E2D0E00EC0833E910599F194 +:101FF00070F4803E910501F1823E910511F68091C9 +:10200000BE0882FD21C0CE01DF91CF910895863EAA +:10201000910561F1873E910571F1843E910509F0CA +:10202000B0CF8091BF0881FFEECF8091BE08C7EE90 +:10203000D0E084FD0DC0E7CF8091BE0880FD33C0A5 +:102040009091BF0890FFDFCFC3EED0E084FFDBCFDD +:10205000D0E0C0E0D8CF8091BE0882FD02C190914F +:10206000BF0890FD01C184FFCECFF2CF8091BE08A2 +:1020700083FDDDCFC8CF8091BE0883FDF8C090916D +:10208000BF0891FFF0CFC4EED0E0BDCF8091BE0875 +:1020900085FFB9CFA7CF8091BE0885FDEBC08091A9 +:1020A000BF0883FFB0CFC9E3D0E0ADCF8091BE08B9 +:1020B00086FFA9CFCAE2D0E0A6CF8091BE0886FFF6 +:1020C000A2CFC1E3D0E09FCFC13CD10508F6C85AEA +:1020D000D0E0CC0FDD1FC156DE4F0990D881C02D56 +:1020E000D46491CFC11540E2D40758F4C11581E002 +:1020F000D80708F088CFC03FD10508F4A9CFD06534 +:1021000082CFC11520E4D20708F4A2CFC11530E573 +:10211000D30708F05BC0DF70D06A75CFC11546E504 +:10212000D40718F5C11585E5D80708F07CC0C1159E +:1021300024E5D20708F072C09E01237033279C2F3C +:1021400096959695C115D34508F459C0C1E0D0E0E5 +:1021500002C0CC0FDD1F2A95E2F730E2939FC00149 +:102160001124C82BD92BDA684ECFC11589E5D807C1 +:1021700068F4C11528E5D20708F060C0C11537E53D +:10218000D30708F065CFDD27D0663DCFC1154AE5FE +:10219000D40708F458C0CE0190568115904208F03B +:1021A00057CF8D2F8F710E946A0F90E0982F88274C +:1021B00088279F719C012C2BE9013EC0C55AD0E0B5 +:1021C000C456DE4FC881D0E0D0641DCFCE018370ED +:1021D000992721E030E002C0220F331F8A95E2F7F1 +:1021E000C695C69540E2C49FE0011124C22BD32BB3 +:1021F000DD6809CFDC2FCC27C16FD06A04CFC1E0E6 +:10220000D0E002C0CC0FDD1F2A95E2F720E2929FBA +:10221000C0011124C82BD92BDC68F5CEDC2FCC27CC +:10222000C46FD06AF0CE8C2F0E946A0FC82FD0E006 +:10223000DC2FCC27CC27DF71D062E5CEDC2FCC277A +:10224000C06FD06AE0CE8C2F8F700E946A0F34E08E +:10225000D695C7953A95E1F7CF709C2FEC01D069E0 +:10226000D2CEC2EED0E0CFCEC0EED0E0CCCEC6EE25 +:10227000D0E0C9CEC5E3D0E0C6CE0E940F090895D4 +:102280008091230481111092230408959091BF0836 +:1022900092FF05C09091230498138093230408951E +:1022A00080959091AE0898239093AE0808958095FC +:1022B0009091AF0898239093AF0808958091B1034F +:1022C00090918003981301C008958F5F8770FACFB3 +:1022D000A82FA77023E0969587952A95E1F7880F98 +:1022E000991F880F991FFB01E80FF91F50E040E08C +:1022F00080E0219130E00A2E02C0369527950A949D +:10230000E2F721703327042E01C0220F0A94EAF766 +:10231000822B4F5F5F4F4430510559F70895292FA5 +:102320009A3068F4863090F490E068E573E036E027 +:10233000239F800D911D11240E94681108952C5F28 +:10234000223020F464E573E090E0F6CF80E0089559 +:10235000262F277091E001C0990F2A95EAF723E014 +:10236000769567952A95E1F7660F771F660F771FB9 +:10237000FA01E60FF71F50E040E0682F70E081910E +:10238000DF0111979B01042E02C0369527950A9410 +:10239000E2F7217021952827292328272C934F5FC6 +:1023A0005F4F4430510559F70895282F862F9A30F2 +:1023B00070F4263058F4622F70E026E0929F600D92 +:1023C000711D112448E553E00E94A81108959C5FF7 +:1023D0009230E0F7622F70E044E553E0F5CF82E001 +:1023E0000895FC019281913039F4858182FD08C005 +:1023F00080FF06C083E00895923021F081E00895C7 +:1024000082E0089584E00895B0E0A0E0EAE0F2E11F +:102410000C94D2436C017B0164E670E088E70E9473 +:102420001241EC0197FD12C010E000E0F601E00F50 +:10243000F11F849164E670E00E947E41EC01892BDB +:1024400029F40F5F1F4F0E151F0581F70E94F441FD +:10245000CE01CDB7DEB7E8E00C94EE438091AC0836 +:102460009091AD08911103C091E0892708958823C8 +:1024700069F062E070E086EE99E00E940412892B18 +:1024800019F08091AC0808951092AC088091AC08C6 +:10249000EBCFCF93C091AC088091AD088823D1F0E9 +:1024A0000E940F09605A75418F4F9F4F6093A80893 +:1024B0007093A9088093AA089093AB08C11108C033 +:1024C00062E070E084EE99E00E940412892B29F00A +:1024D000C091AC088C2FCF91089581E08093AC0817 +:1024E000F7CF0F931F93CF93DF938B01EA01909166 +:1024F000E508943061F58093E9008FEF9091E80052 +:10250000815095FD06C095ED9A95F1F70000811177 +:10251000F5CF8091E80085FF1AC00E94C0078111A5 +:1025200011C08091E80085FD06C08091E8008E779B +:102530008093E800F2CFF80181918F018093F10040 +:10254000219779F78091E8008E778093E800DF91FA +:10255000CF911F910F91089543E050E0BC0184E0BA +:102560000E947112089546E050E0BC0184E00E9490 +:1025700071120895CF93DF93EC0180919501811141 +:1025800011C048E050E0BE0181E00E94711280E27B +:10259000FE01A3ECB8E001900D928A95E1F7DF917E +:1025A000CF9108958091BE0887FF05C040E284E086 +:1025B00050E0BE01EACF48E081E0FACF539A3BB148 +:1025C000377F2BB128604FB7F89485EC95E0FC017C +:1025D0005191CF0168E02BB9000000C057FF3BB913 +:1025E000550F000000C000C000C03BB900C06A9594 +:1025F00091F7F6E08D399F0751F74FBF8FE594E0D3 +:102600000197F1F700C000000895B0E0A0E0EBE012 +:10261000F3E10C94D0437C015B016A0180912C04AE +:1026200001E010E08A3010F40AE010E0C1E0D0E0F0 +:10263000B501C701F6010995811104C021960C1757 +:102640001D072CF4CDB7DEB7EAE00C94EC43CC9F29 +:102650009001CD9F300D300D112490E080E045E3D6 +:102660004A95F1F70000019682179307C1F7E0CF72 +:102670008091DF03811110C08091D8008061809328 +:10268000D8008AE18A95F1F700C08091D90080FFD7 +:102690000AC081E08093DF0381E09091DF039130F5 +:1026A00009F080E0089582E08093DF030E94A10793 +:1026B0001092E508F1CF0E943813811103C0809178 +:1026C000B2080895E091B508F091B608309729F066 +:1026D0000190F081E02D0995089580E00895FF9222 +:1026E0000F931F93CF93DF93EC01F62E042F122F3D +:1026F0000E94381381110FC0C432D1057CF0A49719 +:10270000FE01EE0FFF1FEC0FFD1FEB53FA4FF1829E +:102710000083128303C0C432D10594F3CDB7DEB772 +:10272000E5E00C94F143CF93C82F0E94381388231F +:1027300029F081E0C43228F080E003C081E0C83491 +:10274000D8F7CF910895A8E0B0E0E9EAF3E10C945E +:10275000C843282E7C836B83209196018FE0289FAD +:10276000802D11248D83815F8983893410F038E4B2 +:1027700039830E943813882329F08981853210F02B +:1027800094E299830E943813811105C0ED81E432EF +:1027900010F4F4E2FD832091F9082A839D81892FAA +:1027A00090E098878F83880F991FFC01EF5EFD4FA3 +:1027B0006F01822D90E09C012F5F3F4F3E832D8360 +:1027C00089819F81981730F00E9493132896E2E147 +:1027D0000C94E443EF81F885E352FD4F80819091A2 +:1027E00097018923F9F03090F4084090F5088D8125 +:1027F0009E818750974F3C01522C10E0FA815F1662 +:10280000D8F02091F608129F112D1124632D742DFC +:10281000812F0E94400E462F282F672F8F81988589 +:102820000E948C0C2F8138852F5F3F4F38872F8374 +:1028300032E0C30ED11CC4CFF30181913F01F601F8 +:10284000A4ACA81ABB0885ACF3018781881A990843 +:10285000AA9C9001AB9C300D300D1124889CC001C6 +:10286000899C900D900D1124820F931F0E94CB0D17 +:10287000082F6091F70821E0620F08F46FEFF30171 +:10288000EE0FFF1FE95FF840858996890E94230EAD +:102890007C019401A501632D742D812FEB81FC81B6 +:1028A0000995362E472E5394182FA8CFB0E0A0E0FC +:1028B000ECE5F4E10C94D2437C01C09196018FE0E9 +:1028C000C89FC02D11241FE01C0F193408F018E414 +:1028D0000E943813882319F0153208F014E20E9480 +:1028E0003813811103C0C43208F4C4E22091F70800 +:1028F00031E0230F08F42FEF30E050E040E06FEFBD +:102900007FEF80E090E00E9424466901D0E001E082 +:102910002C2FC11740F0812F0E949313CDB7DEB743 +:10292000E8E00C94EE43FE01E352FD4F808190916C +:102930009701892309F14091F9084150042E000CB8 +:10294000550B47FF1BC0C6016091F708600F08F4E4 +:102950006FEF0E94230EAC016091F4087091F508AE +:102960008091F608F70109950E94400E462F282F06 +:10297000672FCE010E948C0C2196CACFFA01E75036 +:10298000F74F818982130AC0FA01EE0FFF1FE7504B +:10299000F74F818D928D8C159D05B0F241505109F4 +:1029A000D0CFEF92FF920F931F93CF93DF937C01D1 +:1029B000C09196018FE0C89FC02D11241FE01C0F0D +:1029C000193408F018E40E943813882319F01532DE +:1029D00008F014E20E943813811103C0C43208F4D5 +:1029E000C4E26091F7086695669521E0620F08F4ED +:1029F0006FEF8091EF089091F0080E94230E082F4E +:102A0000D0E0C11740F0812F0E949313CDB7DEB7FD +:102A1000E6E00C94F043FE01E352FD4F808190917B +:102A20009701892391F06091F4087091F5088091E5 +:102A3000F608202F4C2FF70109950E94400E462FD3 +:102A4000282F672FCE010E948C0C2196DACFB0E0A0 +:102A5000A0E0EDE2F5E10C94D0436C01C091960149 +:102A60008FE0C89FC02D11241FE01C0F193408F0FF +:102A700018E40E943813882319F0153208F014E284 +:102A80000E943813811103C0C43208F4C4E260917B +:102A9000F708669566958091EF089091F0080E947E +:102AA000230EF82E80E48F0D0E94740D90E8B92E4D +:102AB000B80E8F2D0E94740D20E8A22EA80ED0E033 +:102AC000C11740F0812F0E949313CDB7DEB7EAE023 +:102AD0000C94EC43FE01E352FD4F808190919701ED +:102AE0008923A1F06091F4087091F5088091F608AF +:102AF000EF2C0C2F2A2D4B2DF60109950E94400E2C +:102B0000462F282F672FCE010E948C0C2196D8CFFC +:102B1000B0E0A0E0EEE8F5E10C94CC435C01C0919C +:102B200096018FE0C89FC02D11241FE01C0F19349F +:102B300008F018E40E943813882319F0153208F0C1 +:102B400014E20E943813811103C0C43208F4C4E2B5 +:102B50006091F70866958091EF089091F0080E94C7 +:102B6000230EF82ED0E0CE01880F991F9C012F5E16 +:102B70003D4F6901C11740F0812F0E949313CDB7DB +:102B8000DEB7EEE00C94E843FE01E352FD4F808196 +:102B900090919701892379F1F60184AD282F205770 +:102BA000330B490185ADE82FE052FF0B3F01889CB4 +:102BB0009001899C300D300D1124EE9FC001EF9FD4 +:102BC000900D900D1124820F931F0E94CB0D082FA2 +:102BD0006091F4087091F5088091F608EF2C93014C +:102BE000A401F50109950E94400E462F282F672F5A +:102BF000CE010E948C0CF2E0CF0ED11C2196BACFF0 +:102C0000B0E0A0E0E6E0F6E10C94D1436C01C091A5 +:102C100096018FE0C89FC02D11241FE01C0F1934AE +:102C200008F018E40E943813882319F0153208F0D0 +:102C300014E20E943813811103C0C43208F4C4E2C4 +:102C40006091F70866958091EF089091F0080E94D6 +:102C5000230EB82ED0E0CE01880F991F9C012F5E65 +:102C60003D4F7901C11740F0812F0E949313CDB7DA +:102C7000DEB7E9E00C94ED43FE01E352FD4F8081A5 +:102C8000909197018923C1F0F70125AD2052330BB4 +:102C900044AD4057550B6091F4087091F508809150 +:102CA000F6080B2DF60109950E94400E462F282F9D +:102CB000672FCE010E948C0CF2E0EF0EF11C2196E2 +:102CC000D1CF0F931F930E943813882329F00E94BD +:102CD0000F091F910F9108950E940F0900912D0473 +:102CE00010912E0420912F0430913004600F711F39 +:102CF000821F931FEECFCF92DF92EF92FF926B0174 +:102D00007C010E9438138823A1F02FB7F8946091BA +:102D1000BA087091BB088091BC089091BD082FBF84 +:102D20006C197D098E099F09FF90EF90DF90CF907D +:102D300008950E946116F4CF0F931F93CF93DF93F2 +:102D4000142F022F893020F5623010F598E0899F0A +:102D5000E001112484E0689FB0011124C60FD71F41 +:102D6000C15ADB4F82E090E0442311F090E080E014 +:102D7000632F8C0F9D1F0E94004683E090E011237B +:102D800011F081E090E0602F8C0F9D1F0E940046A3 +:102D9000DF91CF911F910F9108951F93CF93DF93F0 +:102DA000122F8930E0F46A30D0F44630C0F4C42FDA +:102DB000D0E0CC0FDD1F9CE0699FC00DD11D112418 +:102DC00098E7899FC00DD11D1124632FCE018796EE +:102DD0000E940046612FCE0188960E940046DF9136 +:102DE000CF911F910895B0E0A0E0E9EFF6E10C94D7 +:102DF000CE4380E2E82E8EE0F82E08EE19E0C0E027 +:102E00005801D0E015C0F401259134914D2D6D2F5E +:102E10008C2F0E94CD1682E0880E911CD39486E000 +:102E2000D812F1CF8CE0A80EB11CDF5FDA3019F0B8 +:102E30004501D12CE8CF6701D0E0F601259134910E +:102E400041E06D2F8C2F0E949C16F6013296259141 +:102E5000349140E06D2F8C2F0E949C1684E0C80EA8 +:102E6000D11CD13071F488E0E80EF11CCF5F085816 +:102E70001F4FC93009F0C4CFCDB7DEB7ECE00C94DA +:102E8000EA43D1E0DACFCF93C82F6FEF811162E22E +:102E900083E290E00E9400466FEFC11160E184E29E +:102EA00090E00E9400466FEFC11161E285E290E080 +:102EB0000E940046CF91089580E00E94431760E091 +:102EC00086E290E00E9400460E94F316C7EAD4E032 +:102ED00060E0CE010E9400462196FACFFF920F9348 +:102EE0001F93CF93DF93F42E893070F5623060F535 +:102EF00028E0829F8001112434E0639FB0011124F7 +:102F0000060F171F015A1B4F82E090E0442311F077 +:102F100090E080E0800F911F0E94E245C82FD0E032 +:102F2000DC2FCC2783E090E0FF2011F081E090E0DF +:102F3000800F911F0E94E2459E01282BC901CDB749 +:102F4000DEB7E5E00C94F14390E080E0F8CF0F931A +:102F50001F93CF93DF93893030F56A3020F54630E8 +:102F600010F5C42FD0E0CC0FDD1F2CE0629FC00D08 +:102F7000D11D112438E7839FC00DD11D1124CE012E +:102F800087960E94E245082F10E0102F0027CE01FF +:102F900088960E94E2459801282BC901DF91CF91C4 +:102FA0001F910F91089590E080E0F8CF7A3048F4B7 +:102FB000663070F4893060F4462F672F0E94A7179F +:102FC00008957D3F41F4623018F441E0893050F0BB +:102FD00090E080E008957C3FD9F76230C8F78930EF +:102FE000B8F740E00E946E170895B0E0A0E0EBEF64 +:102FF000F7E10C94D1437C0100912209109123093F +:103000008091190490911A04082B192BCFE0D0E07D +:10301000CC24C394D12CBC2EC6010C2E02C0880F28 +:10302000991F0A94E2F780239123892B49F4219771 +:1030300090F7B12C8B2DCDB7DEB7E9E00C94ED43C2 +:10304000B7018C2F0E94D6170E94AD0F019779F31C +:10305000F1CFCF93DF93EC010E94F517BE010E94E0 +:10306000D6170E94AD0FDF91CF910895FC018381A7 +:103070009481892B29F08081918189238F3F51F49C +:1030800080E00895843FE1F717C0883EA8F0813FB3 +:10309000B9F712C0808191810E94291892959F7082 +:1030A000963099F358F4925F9F70923048F7803FC2 +:1030B00019F040F7883E20F781E008959A5FF4CF39 +:1030C000A5E0B0E0E6E6F8E10C94D74349835A83E3 +:1030D00089819A81662399F0222389F00E94F5174D +:1030E000182F682F89819A810E94D51169817A8170 +:1030F000812F0E94D6172596E3E00C94F3430E949B +:103100008F11182FF3CF83E290E00E94E2458232C4 +:1031100089F484E290E00E94E245803159F485E22E +:1031200090E00E94E24591E0813209F090E0892F21 +:103130008170089580E0FCCFCF9384E090E00E94FE +:10314000E245C82F82E290E00E94E245982F8C2F42 +:10315000CF9108958091AF089091AE08892B80930C +:103160002803909123049923A1F0892B80932803AD +:10317000809195018823E1F18091BE0887FF38C0D6 +:103180008EE1EAE2F3E090E08150A0F591110E9417 +:10319000401140E250E063EB73E088E293E00E946C +:1031A000BC45892B21F180E2E8E2F3E0A3EBB3E038 +:1031B00001900D928A95E1F7E091B508F091B6087B +:1031C0003097A9F080919501882359F08091BE082D +:1031D00087FF07C0809128038093290386E08093AE +:1031E00028030280F381E02D88E293E00995089599 +:1031F00086E0C7CF2191222339F29F5FC5CFCF93BD +:10320000DF93EC01EA85FB85309719F06C857D85AD +:1032100009958B810E9450118C810E9457110E9448 +:10322000AA1886E0FE0111928A95E9F7DF91CF9105 +:103230000895CF93DF93EC018D8181FD18C08260EA +:103240008D838091AE089B81892B8093AE088091FD +:10325000AF089C81892B8093AF080E94AA18E8854B +:10326000F985309721F06C857D85CE010995109206 +:10327000B1081092B0088D8180FD03C0CE010E947C +:10328000FF18DF91CF910895882321F00E945011FB +:103290000E94AA180895882339F09091AE08982BBF +:1032A0009093AE080E94AA180895882321F00E94E6 +:1032B00057110E94AA180895882339F09091AF08F9 +:1032C000982B9093AF080E94AA1808951F93CF934C +:1032D000DF93162F8A3039F481E00E94091ADF91BA +:1032E000CF911F9108958D3011F480E0F6CFC091F9 +:1032F000A608D091A70896E0FE01A0EAB8E00190E8 +:103300000D929A95E1F7803E90F186E0FE011192D0 +:103310008A95E9F7C091A608D091A708111133C08A +:1033200046E050E0BE0180EA98E00E94BC459E0164 +:10333000205A3640892B91F52A5F3F4F40919D06D8 +:10334000642F70E0C9010E94B443481B463010F45A +:10335000240F311D211572E0370710F030E020E016 +:103360002056394F3093A7082093A608B8CFF6E02F +:103370008F9FB00111246C557B4F46E050E0CE0189 +:103380000E948844C7CF9E012A5F3F4FFE012E173F +:103390003F0731F2808180958193F9CFC90145E0E3 +:1033A000969587954A95E1F741E050E0BA0102C051 +:1033B000660F771F8A95E2F7CB0160919E067091A8 +:1033C0009F06862B972BB9016B5F7F4FE5E07695C3 +:1033D0006795EA95E1F702C0440F551F6A95E2F739 +:1033E000842B952B90939F0680939E06A5CF1F93C9 +:1033F000CF93DF93EC01162FFE018491811104C05D +:10340000DF91CF911F910895612F0E946619219637 +:10341000F3CFCF93382FE091A608F091A708E05A98 +:10342000F64020919D06622F70E0CF010E94B443C8 +:10343000281B822F332369F066E00E94FF43C82FC8 +:10344000C15010F4CF91089560E080E20E946619A7 +:10345000F7CF9F01280F311D2115324018F080E071 +:10346000F0E0E0E08E0F9F2F911D8056994F9093D2 +:10347000A7088093A608E6CF0E94F71981E00E9472 +:10348000091A08951F93CF93DF93EC01FC01E352D7 +:10349000FD4F80816823B1F00E947844182F0E946C +:1034A00078448F77782F20E8720F08F47FEF612F30 +:1034B0008091F6080E94400E462F282F672FCE01DC +:1034C0000E948C0CDF91CF911F910895B0E0A0E095 +:1034D000ECE6FAE10C94CA43182F80919301811312 +:1034E00023C09091F30893702091920130E081E025 +:1034F0009217130609F480E08170809398018091FF +:10350000F80890919701981739F08093970140E05F +:1035100060E080E00E948F0C1B3260F4E12FF0E04D +:10352000E757F94B0C941F4481E0E6CF8091980156 +:10353000811102C0C0E01BC240E060E080E00E9458 +:103540008F0CF8CFC09196018FE0C89FC02D112439 +:103550000FE00C0F093408F008E40E9438138823A8 +:1035600019F0053208F004E20E943813811103C0FB +:10357000C43208F4C4E26091F4087091F5088091B7 +:10358000F6080E94400EF62EE72ED82ED0E0C01787 +:1035900010F0802FFEC2FE01E352FD4F808190911A +:1035A0009701892331F02D2D4F2D6E2DCE010E94D4 +:1035B0008C0C2196ECCFC09196018FE0C89FC02D56 +:1035C00011240FE00C0F093408F008E40E943813AE +:1035D000882319F0053208F004E20E9438138111A3 +:1035E00003C0C43208F4C4E2E090F508F090F60895 +:1035F000D091F4086D2F7E2D8F2D0E94400ED62E77 +:10360000C72EB82E6091F7086D0F7E2D8F2D0E946A +:10361000400EF62EE72EA82ED0E0C01708F0B9CF46 +:10362000FE01E352FD4F908180919701892359F06B +:103630002A2D4F2D6E2D90FD03C02B2D4D2D6C2D61 +:10364000CE010E948C0C2196E8CFC09196018FE0AC +:10365000C89FC02D11240FE00C0F093408F008E4B6 +:103660000E943813882319F0053208F004E20E9402 +:103670003813811103C0C43208F4C4E2E090F508A5 +:10368000D090F6082091F70890E4F92E3F2D329F54 +:10369000312D1124F32ED0E0C01708F07ACFFE01AF +:1036A000E352FD4F8081909197018923B9F0FE018B +:1036B000EE0FFF1FEF5EFD4F85AD82958F7060911D +:1036C000F4088F9D600D11247E2D8D2D0E94400EDB +:1036D000462F282F672FCE010E948C0C2196DCCF1D +:1036E000C09196018FE0C89FC02D11240FE00C0FF0 +:1036F000093408F008E40E943813882319F00532D1 +:1037000008F004E20E943813811103C0C43208F4A7 +:10371000C4E2E090F508D090F6082091F708D0E4D4 +:10372000FD2E3F2D329F312D1124F32ED0E0C017F6 +:1037300008F02FCFFE01E352FD4F80819091970159 +:103740008923D9F0FE01EE0FFF1FEF5EFD4F64AD40 +:10375000F69EB0011124B5E075956795BA95E1F72D +:103760008091F408680F7E2D8D2D0E94400E462F0B +:10377000282F672FCE010E948C0C2196D8CFC091A4 +:1037800096018FE0C89FC02D11240FE00C0F093463 +:1037900008F008E40E943813882319F0053208F075 +:1037A00004E20E943813811103C0C43208F4C4E259 +:1037B000F090F408D091F508E090F6086091F708D1 +:1037C0006695669566958091EF089091F0080E9445 +:1037D000230E0E94740D805887FD8195880F282F35 +:1037E0003E2D239F212D1124822F6F2D7D2F0E948E +:1037F000400EF62EE72ED82ED0E0C01708F0C9CE26 +:10380000FE01E352FD4F808190919701892331F0B1 +:103810002D2D4F2D6E2DCE010E948C0C2196EDCFBB +:1038200083E69CE00E94D11407C089E39CE0FACFB4 +:1038300086E59DE00E940016C82F99C087E39DE0B1 +:10384000F9CF8CE19DE00E948815F6CF80E09DE0E5 +:10385000FACF87E39CE0E6CF8EE29CE0E3CF85E2FF +:103860009CE0E0CF8CE09CE0DDCF8EEF9BE0EBCFE7 +:103870008BEF9DE0DFCF8FEE9CE0DCCF8BED9CE00B +:10388000E2CF81ED9BE00E942715D6CF83EA9BE033 +:10389000FACF8CE69BE0F7CFC09196018FE0C89FEE +:1038A000C02D11240FE00C0F093408F008E40E9429 +:1038B0003813882319F0053208F004E20E94381307 +:1038C000811103C0C43208F4C4E2809198018111CF +:1038D0001FC06091F70820E1620F08F46FEF80913C +:1038E000EF089091F0080E94230E6AE070E00E94B9 +:1038F000B443892B09F04DCE0E94B60D68E40E94B6 +:10390000FF4360919701892F90E00E94D40E41CE31 +:10391000D0E0E02EF12CCE15DF050CF03ACE609110 +:103920009701CE010E94D40E2196F5CFC091980147 +:10393000C11135C06091F70820E1620F08F46FEF04 +:103940008091EF089091F0080E94230E65E070E0EE +:103950000E94B443892B09F0EDCD0E94784468E4BD +:1039600070E00E940B44609197010E94421A80917E +:1039700096018F5F80939601C1110CC082E0809305 +:10398000940180919801811105C0111103C083E059 +:1039900080939401CDB7DEB7E0E10C94E643C0918B +:1039A00096018FE0C89FC02D11240FE00C0F093441 +:1039B00008F008E40E943813882319F0053208F053 +:1039C00004E20E943813811103C0C43208F4C4E237 +:1039D000D0E0E02EF12CCE15DF050CF0DACD6091B1 +:1039E0009701CE010E94421A2196F5CFC09196010F +:1039F0008FE0C89FC02D11240FE00C0F093408F090 +:103A000008E40E943813882319F0053208F004E214 +:103A10000E943813811103C0C43208F4C4E2E0905C +:103A2000F508F090F608D091F4086091F7086695D3 +:103A3000669566958091EF089091F0080E94230E9C +:103A40000E94740D805887FD8195880F682F2CE0A7 +:103A5000629F612D11246D0F7E2D8F2D0E94400ECF +:103A6000F62EE72ED82ED0E0C01708F092CDFE013A +:103A7000E352FD4F808190919701892331F02D2DE4 +:103A80004F2D6E2DCE010E948C0C2196EDCF83E937 +:103A90009DE0C8CE8BE59BE0C5CE80919601CFE03E +:103AA0008C9FC00D1124C93408F0C8E40E9438135B +:103AB000882319F0C53208F0C4E20E9438134091FF +:103AC000EF085091F0086091F1087091F208809130 +:103AD000940490919504A0919604B0919704841752 +:103AE0009507A607B70708F053C00E94B60DD82F58 +:103AF0000E94B60D98E4891BF0F7890FE82EF12C8F +:103B0000F701E352FD4F809197019081892309F4D9 +:103B10003FC020E040E060E0D1FD13C00E94B60D40 +:103B2000D82F0E94B60D8695782F2FE7720F08F4D4 +:103B30007FEF6D2F8091F6080E94400E462F282FB0 +:103B4000672FC7010E948C0C2091F70830E1230FEA +:103B500008F42FEF60E1822F90E00E94230EBC0159 +:103B600084EF91E00E94B4438091EF089091F008B7 +:103B7000A091F108B091F208860F971FA11DB11D09 +:103B80008093940490939504A0939604B093970423 +:103B90008C2F0E94931350CE409170055091710567 +:103BA00060917205709173058091EF089091F00813 +:103BB000A091F108B091F20884179507A607B707FE +:103BC00008F4B8CC8091980181111FC0C091960172 +:103BD0008FE0C89FC02D11240FE00C0F093408F0AE +:103BE00008E40E943813811149C00E9438138111E2 +:103BF00003C0C43208F4C4E2EC2EF12C33E0C39FBE +:103C0000E0011124C856DB4F50C040E060E080E086 +:103C10000E948F0CF8E9EF2EF4E0FF2ED0E0C0E018 +:103C20000FE70E94B60D81FF0CC0F70110821182D0 +:103C300012822196F3E0EF0EF11CC834D10589F70A +:103C4000C5CF0E94B60DB82E0E94B60D8695782F6E +:103C5000700F08F47FEFCE01880F991F8C0F9D1F06 +:103C60009C0128563B4F69016B2D8091F6080E94FC +:103C7000400EF601608371838283DBCF053208F446 +:103C8000B4CF04E2B2CFF701E352FD4F80819091AF +:103C90009701892331F02A8148816981C7010E94F7 +:103CA0008C0C23962FEFE21AF20AE01660F3802FB5 +:103CB0000E94931381116DCC20E0802F8150990BCD +:103CC0007C01822F90E08E159F053CF10E94B60D7D +:103CD000E701CC0FDD1F81FF38C0CE0DDF1DC856B8 +:103CE000DB4F188219821A820E942D0EC090EF08B5 +:103CF000D090F008E090F108F090F208DC01CB01E0 +:103D00008C0D9D1DAE1DBF1D809370059093710598 +:103D1000A0937205B09373053CCCAC01440F551FC2 +:103D2000480F591F48565B4F0196FC01EE0FFF1FCD +:103D3000E80FF91FE856FB4F80819181A281FA01BB +:103D400080839183A2832F5FBCCF0E94B60DD82EB3 +:103D50000E94B60D8695782F2FE7720F08F47FEF3B +:103D6000CE0DDF1DC856DB4F6D2D8091F6080E94E9 +:103D7000400E688379838A83B7CF80919801882326 +:103D800029F040E060E080E00E948F0C8091960175 +:103D90000FE0809F000D1124093408F008E40E9410 +:103DA0003813882319F0053208F004E20E94381312 +:103DB0004091EF085091F0086091F1087091F2087D +:103DC0008091920590919305A0919405B0919505ED +:103DD00084179507A607B70708F0DBCB6091F408B6 +:103DE0007091F5088091F6080E94400E762E672E9D +:103DF000582E84E7E82E85E0F82EC1E1D2E05E017E +:103E00004E016701412C02C044244394F401819186 +:103E10004F0190E0F6012081222309F454C0252DA2 +:103E2000472D662D0E948C0CF5018581252D472D8F +:103E3000662D90E00E948C0CF601818181936F01C8 +:103E4000F1E0AF1AB10821E04212DECF8A8190E0A2 +:103E5000F7012281222309F441C0252D472D662D2B +:103E60000E948C0C8B81252D472D662D90E00E94A1 +:103E70008C0C0E94B60D837091E009F090E0F70180 +:103E80009283F3E0EF0EF11C269622E0CD34D207A8 +:103E900009F0B5CF0E942D0EC090EF08D090F00829 +:103EA000E090F108F090F208DC01CB018C0D9D1D33 +:103EB000AE1DBF1D8093920590939305A09394052A +:103EC000B093950566CB20E040E060E00E948C0C4A +:103ED000F501858120E040E060E0ABCF20E040E0EC +:103EE00060E00E948C0C8B8120E040E060E0BECF5F +:103EF00084E59BE00E9456149FCC8EE49BE0FACFB1 +:103F00008091F90821E0382F321B08F430E0832F2C +:103F100065E37BE00E94A3138FCC65E37BE080E048 +:103F2000F9CF8091F90821E0382F321B08F430E0F6 +:103F3000832F6AEF7AE0EECF6AEF7AE0F0CF8091DC +:103F4000F90821E0382F321B08F430E0832F68ECA9 +:103F50007AE0E0CF68EC7AE0E2CF8091F90821E0E6 +:103F6000382F321B08F430E0832F60EB7AE0D2CF99 +:103F700060EB7AE0D4CF8091F90821E0382F321B32 +:103F800008F430E0832F6AE97AE0C4CF6AE97AE086 +:103F9000C6CF46E050E06CE170E083EF98E00E940D +:103FA000F0451092C40508954F925F926F927F92F0 +:103FB0008F929F92AF92BF92CF92DF92EF92FF9239 +:103FC0006091BF057091C0058091C1059091C205B7 +:103FD0000E947B166B017C010E9461164B015C0103 +:103FE0008092BF059092C005A092C105B092C20513 +:103FF000A0919605E6E9F5E08A2F90E04FEF5FEF9C +:1040000060E070E04C195D096E097F09A91328C0B2 +:10401000809396058091C305811135C09091F30876 +:10402000892F837019F0892F869586959091940138 +:10403000913009F441C0992341F1923009F43FC015 +:10404000933009F43FC0FF90EF90DF90CF90BF9086 +:10405000AF909F908F907F906F905F904F9008955A +:10406000218D328D2901712C612C44155505660571 +:10407000770520F481509F5F3296C8CF2C0D3D1DEF +:10408000328F218FF8CF80E0D1CF109296018092AD +:10409000EF089092F008A092F108B092F20889E23D +:1040A000E6E9F5E0A9EFB8E001900D928A95E1F715 +:1040B00081E080939401C7CF0E94661AC4CF0E940A +:1040C0008D0AC1CF8091C40581110E94C91F6091E2 +:1040D000EF087091F0088091F1089091F2080E9429 +:1040E0007B16603171058105910508F4ACCF109203 +:1040F0009401A9CFE3EFF8E085E1808380919901F5 +:1041000090919A01A0919B0181839283A3838FE771 +:1041100084838FEF85830E94C91F0895B0E0A0E0DB +:10412000E4E9F0E20C94D3437901C82F880FDD0B4A +:1041300041155105A9F0FE0193E0EE0FFF1F9A957E +:10414000E1F7E65FFE4F8181928180529C4F208192 +:1041500030E04217530708F49A01A9010E94C945AB +:10416000CE010E943E43D82E8823D1F001151105BF +:10417000B9F083E0CC0FDD1F8A95E1F7FE01E65F21 +:10418000FE4F438150E00417150708F4A801C65FED +:10419000DE4F6C817D8160527C4FC7010E94C94512 +:1041A0008D2DCDB7DEB7E7E00C94EF43A3E0B0E090 +:1041B000ECEDF0E20C94D643809124049091250418 +:1041C000A0912604B09127042FB7F8944091BA0823 +:1041D0005091BB086091BC087091BD082FBF481B6F +:1041E000590B6A0B7B0B81E0443651056105710563 +:1041F00008F480E09091AF08998344365105610539 +:10420000710520F42091F603291381E09091AE0806 +:104210009A83811106C081E02091F703291301C020 +:1042200080E0909123049B83811105C08091F80365 +:1042300011E08917C9F010E000E030E020E043E031 +:1042400050E0BE016F5F7F4F89E00E948E20182FE3 +:10425000882351F00E940F09609324047093250471 +:104260008093260490932704812F2396E4E00C94F6 +:10427000F243A4E0B0E0EFE3F1E20C94D6434091C6 +:1042800011045091120460911304709114042FB71B +:10429000F8948091BA089091BB08A091BC08B091A5 +:1042A000BD082FBF841B950BA60BB70B11E08436FE +:1042B0009105A105B10518F10E9461166E5F7F4F4F +:1042C0008F4F9F4F69837A838B839C8310E000E03C +:1042D00030E020E044E050E0BE016F5F7F4F85E0BA +:1042E0000E948E20182F882351F00E940F0960939E +:1042F0001104709312048093130490931404812F7B +:104300002496E4E00C94F2438F929F92AF92BF9276 +:10431000EF92FF920F931F93CF937B01942FB901DC +:10432000A801F70180809180A280B380EFB7F89454 +:104330000091BA081091BB082091BC083091BD08CB +:10434000EFBF081919092A093B090436110521058F +:10435000310518F4C1E0992381F010E000E030E06D +:1043600020E00E948E20C82F882339F00E940F0978 +:10437000F70160837183828393838C2FCF911F9188 +:104380000F91FF90EF90BF90AF909F908F90089506 +:104390000F931F9341E02091F1033091F20380913C +:1043A0002209909123092817390709F440E002E017 +:1043B00010E022E239E06BE174E086E00E948421A3 +:1043C0008823B1F041E02091F3033091F403809110 +:1043D000190490911A042817390709F440E002E003 +:1043E00010E029E134E065E174E087E00E94842177 +:1043F0001F910F910895CF92DF92FF920F931F9319 +:10440000CF93DF93F82E6B01EA01A801B901CE0129 +:104410000E94BC4541E0892B09F440E09E01B601B1 +:104420008F2D0E948421DF91CF911F910F91FF90DA +:10443000DF90CF900895A7E0B0E0E1E2F2E20C94C3 +:10444000D64386E0E3EFF8E0DE01119601900D928D +:104450008A95E1F78091C3058F8307E010E029EF8B +:1044600033E0AE014F5F5F4F68E274E08AE00E9484 +:10447000FB212796E4E00C94F243A1E0B0E0E3E4F2 +:10448000F2E20C94D6430E945B13898301E010E0B2 +:1044900025EF33E0AE014F5F5F4F6FE174E088E0DE +:1044A0000E94FB212196E4E00C94F2430F931F93AA +:1044B00005E010E026EE33E0AC0169E074E082E054 +:1044C0000E94FB211F910F910895A1E0B0E0EBE65F +:1044D000F2E20C94CD43762E4A015901680101E0C5 +:1044E00010E09E012F5F3F4F50E040E070E060E041 +:1044F0000E948E20182F882309F440C0F4014081C7 +:104500005181628173812FB7F8948091BA0890919C +:10451000BB08A091BC08B091BD082FBF841B950BB0 +:10452000A60BB70B84369105A105B10538F4B70188 +:10453000C6010E94C4099981891701F1870195017B +:1045400050E040E070E060E0872D0E948E20B82EA1 +:10455000B701C6010E94C40911E09981981310E0C7 +:104560001B2139F00E940F09F4016083718382835B +:104570009383812F2196EDE00C94E943A701B601C6 +:10458000C5010E94C945F5CFA5E0B0E0EAECF2E232 +:104590000C94D2436B0185E0E82EF12C01EE13E080 +:1045A0009E012F5F3F4F45E054E061E080E00E94B4 +:1045B0006522882349F095E0FE013196A0E0B4E041 +:1045C00001900D929A95E1F795E0E0E0F4E0D601D4 +:1045D00001900D929A95E1F72596E8E00C94EE4350 +:1045E00090E080E00E94EA45883E9E4F19F40E94C8 +:1045F0008318089580E0089568EE7EEF90E080E0F3 +:104600000E941E4660E082E090E00E94004660E06A +:1046100083E090E00E94004610921A041092190460 +:1046200060E084E090E00E94004664E182E290E075 +:104630000E94004660E085E090E00E94004660E055 +:1046400086E090E00E9400466FEF87E090E00E94D5 +:10465000004640E050E0BA0188E090E00E94124637 +:1046600060E08DE090E00E94004640E050E0BA013A +:1046700088E190E00E94124660E087E190E00E94AD +:10468000004640E050E0BA018CE190E00E94124602 +:1046900070E060E080E290E00E941E4640E050E062 +:1046A000BA0188E190E00E94124680E00E94431720 +:1046B0000E945C171F920F920FB60F9211242F9336 +:1046C0003F934F935F936F937F938F939F93AF939A +:1046D000BF93EF93FF938091E10082FF09C0809127 +:1046E000E20082FF05C08091E1008B7F8093E100B2 +:1046F0008091DA0080FF24C08091D80080FF20C024 +:104700008091DA008E7F8093DA008091D90080FF5B +:104710009DC080E189BD82E189BD09B400FEFDCF65 +:1047200081E08093E5088091C008811109C00E9452 +:10473000A1070E9442088091E20084608093E20019 +:104740008091E10080FF17C08091E20080FF13C0DC +:104750008091E2008E7F8093E2008091E200806190 +:104760008093E2008091D80080628093D80019BCC9 +:1047700085E08093E5088091E10084FF2BC0809163 +:10478000E20084FF27C080E189BD82E189BD89B54F +:10479000982F917080FFFBCF8091D8008F7D809300 +:1047A000D8008091E1008F7E8093E1008091E2004B +:1047B0008F7E8093E2008091E20081608093E2002E +:1047C0008091E608882309F447C084E08093E508D7 +:1047D0008091E5088091E10083FF27C08091E2008D +:1047E00083FF23C08091E100877F8093E10082E016 +:1047F0008093E5081092E6088091E1008E7F809317 +:10480000E1008091E2008E7F8093E2008091E200DF +:1048100080618093E20042E060E080E00E94100846 +:104820008091F00088608093F000FF91EF91BF913C +:10483000AF919F918F917F916F915F914F913F9138 +:104840002F910F900FBE0F901F90189519BC1092CA +:10485000E5081092C00874CF8091E30087FD93E0D3 +:104860009093E508B5CF78941F921FB61F9211243C +:104870008F939F93AF93BF938091BA089091BB0899 +:10488000A091BC08B091BD080196A11DB11D8093F7 +:10489000BA089093BB08A093BC08B093BD08BF9121 +:1048A000AF919F918F911F901FBE1F9018959C01F3 +:1048B0004FB7F8948091BA089091BB08A091BC08BA +:1048C000B091BD084FBF821B930B08952FB7F8948A +:1048D0008091BA089091BB08A091BC08B091BD0826 +:1048E0002FBF08950E9466249C01909190048091AE +:1048F0009104982B21F030938D0420938C04909197 +:10490000920480919304982B21F030938B04209390 +:104910008A04E091B508F091B608309749F082E03A +:1049200080938E040480F581E02D8EE894E0099553 +:10493000089590E080E00E949F0990E080E00E944E +:104940007A091092AE080E94AA1886E0EEE8F4E018 +:10495000DF011D928A95E9F710928704109288046E +:10496000109289040E9472240895909323098093E1 +:1049700022090E9499240895809122099091230987 +:104980009C01267033272630310521F488600E946F +:10499000B5240895877FFBCF21E030E002C0220FCD +:1049A000331F8A95E2F720953095809122099091E6 +:1049B0002309822393230E94B52408959091B20382 +:1049C000809589238093B203282F277091F4282F94 +:1049D000082E000C330B9217130659F09091BF0864 +:1049E00092FF07C08595859585950E94CC241092ED +:1049F000B2030895CF93C091BF08C2FB992790F9E5 +:104A0000981791F080FBC2F9C093BF086091BE086F +:104A100084E090E00E9400466C2F82E290E00E94C9 +:104A2000004682E00E94DE24CF91089521E030E02C +:104A300002C0220F331F8A95E2F7809122099091DC +:104A40002309822B932B0E94B524089590931A0476 +:104A5000809319040E94992408951092AF088091C0 +:104A60009501EAE2F3E0882361F08091BE0887FFB8 +:104A700008C08EE1DF011D928A95E9F70E94992412 +:104A8000089586E0F7CFAAE2B0E0E9E4F5E20C94FD +:104A9000D74387EE98E02091F100DC012D93CD0102 +:104AA000B8E08F3E9B07B9F78091E808833009F49E +:104AB00072C0B8F4813009F449C0823009F4B3C03F +:104AC0008091E80083FF8BC28091E7089091E8080D +:104AD0009A3008F084C2E92FF0E0EC54F94B0C94C2 +:104AE0001F448A3009F48EC08B3009F471C08930BC +:104AF00039F78091E708813219F78091EB0890919E +:104B0000EC08009711F00297D9F68091E800877FB2 +:104B10008093E8008091E80082FF38C09091F30014 +:104B20008091F200029731F48091F100813011F010 +:104B3000863021F48091F1008093C2088091E800D2 +:104B40008B778093E8000E94F107BACF8091E70845 +:104B5000813A09F0B5CF8091E800877F8093E80023 +:104B60008091EB089091EC08892B61F460E283EC72 +:104B700098E070E00E949D088091E8008B77809318 +:104B8000E8009ECF60E090E080E0F3CF8091E50800 +:104B90008111C0CF95CF8091E708813A09F090CF7D +:104BA0008091EB089091EC08892B09F089CF8091D6 +:104BB000E800877F8093E8008091E80080FFFCCFC9 +:104BC000809195018093F1008091E8008E77B9CFB4 +:104BD0008091E708813209F073CF8091EB089091C2 +:104BE000EC08892B09F06CCF8091E800877F8093D7 +:104BF000E8000E94F1078091E908809395010E94E6 +:104C00002D255ECF8091E708813209F059CF809140 +:104C1000E800877F8093E8000E94F1078091EA080E +:104C20008093C1084DCF8091E708813A09F048CFC1 +:104C30008091E800877F8093E8008091E80080FF02 +:104C4000FCCF8091C108BECF803899F0823809F03E +:104C5000C6C18091EB088F70873008F0C0C1809387 +:104C6000E9008091EB0085FB882780F91092E9002C +:104C700006C08091E3089091E408911182609091C0 +:104C8000E800977F9093E8008093F1001092F10084 +:104C90008091E8008E779FC1882309F48DC182300E +:104CA00009F09DC18091E908811190C18091EB08C4 +:104CB0008F702FEF280F263008F091C18093E90004 +:104CC0002091EB0020FF82C1933031F48091EB0002 +:104CD00080628093EB007AC19091EB009061909399 +:104CE000EB0021E030E001C0220F8A95EAF7209323 +:104CF000EA001092EA008091EB008860EACF81110F +:104D00006EC11091E9081F778091E3008078812BB4 +:104D10008093E3008091E800877F8093E8000E9401 +:104D2000F1078091E80080FFFCCF8091E30080686C +:104D30008093E30082E0111183E08093E5084FC186 +:104D40008058823008F04BC12091E9083091EA0880 +:104D50002C3DE3E03E07A1F583E08A838AE2898364 +:104D60004FB7F894DE01139620E03EE051E2E32FC6 +:104D7000F0E050935700E49120FF03C0E295EF70FC +:104D80003F5FEF708E2F90E0EA30C0F0C7968D93B2 +:104D90009D932F5F243159F74FBF8091E800877FA3 +:104DA0008093E8006AE270E0CE0101960E949D08BF +:104DB0008091E8008B778093E80011C1C096E7CF1F +:104DC0008091EB089091EC08432F55274330510513 +:104DD00009F44AC078F54130510509F47AC08BE5F1 +:104DE00090E0E8E6FEE04230510509F0F8C020917D +:104DF000E800277F2093E8002091ED083091EE082D +:104E00008217930708F49C0140E02115310509F051 +:104E100065C0411163C08091E80082FDC9CF8091D7 +:104E2000E508882329F2853019F28091E80083FF94 +:104E3000F2CFBECF4132510509F43CC04232510598 +:104E400009F0CDC08330910508F0C9C0FC01EE0F18 +:104E5000FF1FEB5FFD4F0190F081E02D8E5F9D4FB6 +:104E6000DC018C9190E01AC0332721303105D1F05C +:104E70002115310561F02230310509F0B0C0E5EDB2 +:104E8000FEE0E4918E2F90E0E5EDFEE007C0EFEF4D +:104E9000FEE0E4918E2F90E0EFEFFEE0009709F442 +:104EA0009EC0A5CFE3EEFEE0E4918E2F90E0E3EE0E +:104EB000FEE0F4CF8330910508F091C0880F991F70 +:104EC000FC01E55FFD4F0190F081E02D89E090E06D +:104ED0008ECF82E190E0E3ECFEE089CF8091E5089F +:104EE000882309F465CF853009F462CF8091E8000A +:104EF00083FD5ECF8091E80082FD8DCF8091E80038 +:104F000080FF83CF9091F3008091F200211531054D +:104F100019F08830910550F041E0089709F040E021 +:104F20008091E8008E778093E8006FCF44914093A2 +:104F3000F1003196215031090196E8CF803809F00F +:104F40004EC08091E800877F8093E8008091E6085A +:104F50008093F1009DCE811142C01091E90812307A +:104F6000F0F58091E800877F8093E8001093E608D1 +:104F70000E94F107112311F084E005C08091E30045 +:104F800087FDFACF81E08093E50842E061EC81E0A3 +:104F90000E94100842E261EC84E00E94100842E2A4 +:104FA00061EC82E00E94100842E260EC83E00E9423 +:104FB00010088091E50813C08091E908813079F4E8 +:104FC00081E0933009F080E08093E4081092E900DA +:104FD0008091E800877F8093E8000E94F10780912C +:104FE000E80083FF0AC08091E800877F8093E80093 +:104FF0008091EB0080628093EB00AA96E3E00C9432 +:10500000F3431F920F920FB60F9211242F933F93E9 +:105010004F935F936F937F938F939F93AF93BF93C0 +:10502000CF93DF93EF93FF93D091E900DF708091EE +:10503000EC00C82FC17080FDC0E81092E90080919B +:10504000F000877F8093F00078940E9443251092AF +:10505000E9008091F00088608093F000CD2BCF7044 +:10506000C093E900FF91EF91DF91CF91BF91AF9194 +:105070009F918F917F916F915F914F913F912F9170 +:105080000F900FBE0F901F9018950E942D252FEFA7 +:1050900084E39CE0215080409040E1F700C0000094 +:1050A00088E19AE00FB6F894A895809360000FBE4F +:1050B00090936000FFCF662309F45DC0803F41F408 +:1050C0000E94310F8195809391040E94722408956B +:1050D000813F19F40E94310FF6CF823F31F40E94D4 +:1050E000310F819580939004F0CF833F19F40E9493 +:1050F000310FF8CF893F29F40E940F0F809392045B +:10510000E4CF8A3F21F40E940F0F8195F7CF8B3FA8 +:1051100031F40E940F0F819580939304D6CF8C3F7A +:1051200019F40E940F0FF8CF9CE0980F953070F49F +:10513000845F990B21E030E001C0220F8A95EAF7E5 +:1051400080918F04822B80938F04BFCF8D3F31F4E9 +:1051500080918904816080938904B7CF8E3F21F4C8 +:10516000809189048260F7CF8F3F09F0AECF8091A4 +:1051700089048460F0CF40919004803F59F480917D +:10518000910487FF0DC01092910441110BC0109241 +:10519000870408C0813F81F48091910418169CF324 +:1051A000442381F08091920490919304892B09F01B +:1051B0008CCF1092880489CF823F49F447FFF0CF0B +:1051C00010929004809191048111ECCFE0CF833F45 +:1051D00019F41416ACF3E4CF90919204893F29F4AA +:1051E0001916F4F610929204DBCF8A3F19F497FF58 +:1051F000D7CFF8CF909193048B3F29F497FFD0CF6E +:1052000010929304CDCF8C3F19F41916CCF3C8CF6C +:105210009CE0980F953090F4845F990B21E030E08A +:10522000B90102C0660F771F8A95E2F7CB0180951E +:1052300090918F04892380938F04B2CF8D3F31F4F6 +:10524000809189048E7F80938904AACF8E3F21F4B8 +:10525000809189048D7FF7CF8F3F09F0A1CF809196 +:1052600089048B7FF0CF882389F19CEF980F913AC6 +:1052700040F4682F88E293E00E941B090E94AA185C +:10528000089590E2980F983050F4877091E001C033 +:10529000990F8A95EAF7892F0E945711EFCF9BE566 +:1052A000980F933028F490E080E00E949F090895C1 +:1052B00098E5980F993128F490E080E00E947A09EF +:1052C0000895803F18F060E00E945B280895CF9316 +:1052D000DF93EC010E943329CE010E94EF110E945E +:1052E0004419DF91CF91089580914803833049F0AC +:1052F000843011F0823041F487E292E00E94672905 +:10530000089580E40E9455190895809148038330E0 +:1053100049F0843011F0823041F486E292E00E943C +:105320006729089581E00E9455190895CF93C82FE9 +:105330008823D9F18CEF8C0F813AC8F580919501C3 +:10534000882311F18091BE0887FF1EC0EC2FE695DF +:10535000E695E695F0E0E85DFC4F828190E04C2F09 +:10536000477021E030E002C0220F331F4A95E2F778 +:1053700082239323892B91F06C2F88E293E00E9483 +:105380001B090E94AA180AC0EAE2F3E080E393E056 +:105390002191C21789F38E179F07D1F76C2F88E2EE +:1053A00093E00E9445090E94AA18CF91089580E2D7 +:1053B0008C0F883068F4C77021E030E001C0220F04 +:1053C000CA95EAF78091AF08822B8093AF08EBCFA4 +:1053D000EBE5EC0FE33040F4F0E0E456FE4F808163 +:1053E00090E00E949F09E1CFE8E5EC0FE93150F42D +:1053F000F0E0EE0FFF1FE156FE4F808191810E9489 +:105400007A09D3CFC03F88F261E08C2F0E945B28DD +:10541000CCCF1F93CF93DF93182FEB010E949629D7 +:105420008FE99FE00197F1F700C000002197C1F7D5 +:10543000812F0E943329DF91CF911F910895CF933F +:10544000C82F0E94EF110E944B198C2F0E949629A1 +:10545000CF9108950E94F11180934803833049F061 +:10546000843059F0823021F487E292E00E941F2AB2 +:10547000089580E40E945C19089587E292E00E94FA +:105480001F2A8AE090E0EFE9FFE03197F1F700C0D2 +:1054900000000197C1F787E292E00E946729E4CFFC +:1054A0000E94F11180934803833049F0843059F011 +:1054B000823021F486E292E00E941F2A089581E062 +:1054C0000E945C19089586E292E00E941F2A8AE0F9 +:1054D00090E0EFE9FFE03197F1F700C0000001979D +:1054E000C1F786E292E00E946729E4CFA1E1B0E033 +:1054F000ECE7FAE20C94C9438E010F5F1F4F8AE07C +:10550000D8011D928A95E9F753EDC52E51E0D52EAD +:10551000F12CE12CAA24A394B12CF60181916F0106 +:105520008F3F09F443C0F894E82FE295EF70F0E064 +:1055300021A18F70A50102C0440F551F8A95E2F783 +:10554000CA01922F982B91A392A18095892382A3BF +:10555000789400C0E8EDF1E0912C31E021912F3FEB +:1055600009F4C8C0A22FA295AF70B0E090968C91BC +:1055700090E02F7002C0959587952A95E2F780FDFF +:10558000B9C0832F982A330F51E0EE3DF50731F76C +:10559000F601319780818F3F11F00E94530F80EA0E +:1055A0008A95F1F7F801EE0DFF1D90829FEFE91A41 +:1055B000F90AA5E0EA16F10409F0AFCF4AE050E09D +:1055C000B80183E394E00E94BC457C01892B41F043 +:1055D0008AE0F801A3E3B4E001900D928A95E1F727 +:1055E00000913E0410E003581B4F1092D703D09057 +:1055F000D603DD2009F4ECC10E9466242091D40377 +:105600003091D503BC01621B730B9093D50380933B +:10561000D4036F3F710511F008F06EC0611571057C +:1056200009F464C0362EE0913104F09132041092F6 +:10563000D6031092D30330E020E0512C412CC12C32 +:10564000AA24A394B12C50E040E0C801820F931F1C +:10565000998B888BD901AD5CBB4F3D01CF01840F85 +:10566000951FDC019C90892CE89480F8882061F1DA +:10567000892C8694B92DB1709B2E8616170611F0D1 +:105680000CF03DC0DC019C92911040C0A889B98902 +:105690009C90D3018C90C501042E01C0880F0A9400 +:1056A000EAF7982D982380958921892B992D9827A1 +:1056B000842C912C892A442443948114910409F464 +:1056C000412CA889B9898C934F5F5F4F46305105B3 +:1056D00029F636962F5F3F4F2530310509F0B3CFBD +:1056E000C092D6034092D7035092D303EF2809F01B +:1056F0007EC170C180E046CF6FEF70E093CF83181A +:10570000880C8B2ADC018C92CD2CDECF5D2CDCCF7B +:10571000772021F040FD02C041704C932F5F3F4F36 +:105720002630310509F081C1069631960817190710 +:1057300009F070C15093D6038092D703C090D7036D +:105740000E943813D82EE0913E04AE01455F5F4FB2 +:105750007A01882309F4A0C085E0DA011D928A95B8 +:10576000E9F70E2F10E003581B4F80912C048A306C +:1057700008F05FC044EC52E2B701C8010E94051373 +:10578000882309F478C046E552E2B701C8010E94B7 +:105790000513882309F46FC042EE57E3B701C8012F +:1057A0000E940513882309F466C049E351E2B7015A +:1057B000C8010E940513882309F45DC048EC51E23A +:1057C000B701C8010E940513882309F454C04DE3B2 +:1057D00052E2B701C8010E940513882309F44BC0A7 +:1057E00046ED50E2B701C8010E940513882309F471 +:1057F00042C04BE152E2B701C8010E940513882361 +:10580000D1F110922C0480913D0490E045E050E0ED +:10581000B70183589B4F0E94BC4521E02093DE03D3 +:10582000892BE1F4D12C8D2D8C296196E1E10C942A +:10583000E5438091D8039091D9030E945724843F77 +:10584000914008F097CF8091DE03882359F385E0DB +:10585000F70111928A95E9F71092DE03A0913D04B9 +:10586000B0E0A358BB4F85E0FE013B9601900D923E +:105870008A95E1F7D8CF80912C048F3F31F08F5F6C +:1058800080932C048A3008F4BECF0E946624909343 +:10589000D9038093D803D7CF00913D0410E003587B +:1058A0001B4FF0E0E358FB4F85E0A1EEB3E0019021 +:1058B0000D928A95E1F765E070E081EE93E00E9439 +:1058C000C4098093E00385E0E6EEF3E0D80101909F +:1058D0000D928A95E1F74091550450E0609154048F +:1058E00070E0605B7B4FC7010E94C9458B85809348 +:1058F000EC0361E070E0C7010E94C4098093EB03F0 +:105900008090ED039090EE03A090EF03B090F00331 +:105910008091DA039091DB03A091DC03B091DD0369 +:1059200088169906AA06BB06D1F08092DA039092F7 +:10593000DB03A092DC03B092DD030E9438138111D7 +:105940000EC00E940F09861A970AA80AB90A809207 +:105950002D0490922E04A0922F04B09230048091D6 +:10596000F1039091F203909323098093220980918F +:10597000F3039091F40390931A0480931904809197 +:10598000F5038093B2088091F7039091F60390930A +:10599000AF088093AE088091F8030E94461186E01C +:1059A000E9EFF3E0A3EFB8E001900D928A95E1F7FB +:1059B0001091FF03112349F08091C305811105C0A7 +:1059C0000E94661A80E00E948D0A1093C3052BCFB7 +:1059D000EF2839F48091D303882309F4AFCED11096 +:1059E00006C00E9466249093D5038093D4038091CF +:1059F0003104909132045091D6038090D70323E371 +:105A0000422E24E0522EF8018C01025E1F4FEE243C +:105A1000E394F12CD2019D902D012081922630E05B +:105A200020E06D01B1E0CB1AD108BC01620F731FF9 +:105A30005701022E02C0AA0CBB1C0A94E2F7DB013C +:105A40004C91742EE89470F8692C6A2009F460CEA9 +:105A5000711064CED6015C915A2141E009F440E016 +:105A60004A60DB014C9340FF05C04081A426A08220 +:105A70008824839451E052CEA4E0B0E0E2E4FDE259 +:105A80000C94C9438C01DC0113968D919C91149761 +:105A9000892B49F04C9111965C911197842F8523A5 +:105AA0008F3F09F091C62496E1E10C94E543C401CF +:105AB0000E94E245811101C0EA942FEF821A920AF6 +:105AC000D8C64701CE0101967C01D7012C91222333 +:105AD00009F4D7C6213009F062C011968C91119754 +:105AE0008130E1F46701B2E0CB0ED11CF701828175 +:105AF0006AE070E0893311F460E570E00E94092AE1 +:105B000076019FEFE91AF90A8BE08150F1F2AFE9D3 +:105B1000BFE01197F1F700C00000F7CF823049F4E1 +:105B20006701F2E0CF0ED11C12968C910E9496294B +:105B3000E7CF833049F46701B2E0CB0ED11CF70107 +:105B400082810E943329DCCF843021F0FFEFEF1AED +:105B5000FF0AD7CF12962C91F70132967F0190E081 +:105B600080E0A7014F5F5F4F2053330B2A30310590 +:105B700048F0019730F2EFE9FFE03197F1F700C00C +:105B80000000F7CF389EB001399E700D1124C90175 +:105B9000860F971FD70111962C917A01E2CFE22F41 +:105BA000F0E0E259FD4F5490822F869586958695B8 +:105BB00090E0FC01E25AFD4F64902770712C022E98 +:105BC00002C0759467940A94E2F731E06322772467 +:105BD000FC01E25BFD4FA490B12C022E02C0B594F3 +:105BE000A7940A94E2F741E0A422BB24FC01E25C02 +:105BF000FD4FC490D12C02C0D594C7942A95E2F7EA +:105C000051E0C522DD246114710419F081EE0E9477 +:105C10009629A114B10419F086EE0E94962989E311 +:105C20006AE070E0581202C060E570E0852D0E94C5 +:105C3000092AA114B10419F086EE0E9433296114D7 +:105C4000710419F081EE0E943329C114D10409F4C2 +:105C500058CF6AE070E08CE20E94092A52CF81E0BE +:105C60000E9416250E94BC2427C681E00E94CC24F5 +:105C7000F9CF82E0FBCF9E2D8F2D3EC5F9018581A6 +:105C800081FF3EC5C9010E94FF183AC5F5EAEF162B +:105C9000FDE5FF0609F44BC5F0F431E6E3163DE5FA +:105CA000F30609F444C546E1E4164CE5F40609F0B0 +:105CB000E0C18091AF088A7A91E009F490E0909376 +:105CC000520369E2811165E388E293E00E9445098D +:105CD0000E94AA18F1C5C7018D5A9D45039718F770 +:105CE00026C58091BE08806237E0E3163CE5F306E6 +:105CF000F1F18091BE08806148E0E4164CE5F406BD +:105D0000B0F18091BE08806432C05DE0E5165CE5CC +:105D1000F50609F4D3C0A0F48091BE088E7F9BE005 +:105D2000E9169CE5F90619F18091BE088C60ACE09B +:105D3000EA16ACE5FA06D8F08091BE088D7F17C050 +:105D4000BFE0EB16BCE5FB0609F4C8C008F4BAC016 +:105D5000F0E1EF16FCE5FF0609F4C4C08091BE082F +:105D60008F7B21E1E2162CE5F20609F00FC5809346 +:105D7000BE080CC53FEFE3163CE5F30609F4C0C0CE +:105D8000D8F55AEFE5165CE5F50609F485C0D0F4C0 +:105D900094E1E9169CE5F90609F4C0C008F4ACC02A +:105DA000B5E1EB16BCE5FB0609F0F0C48091BE0836 +:105DB00082FB992790F921E0922790FB82F990FBD2 +:105DC00083F9D5CFECEFEE16ECE5FE0609F47EC0C4 +:105DD00008F466C02DEFE2162CE5F20609F47AC04D +:105DE0008091BF0883603EEFE3163CE5F30609F0BF +:105DF000CDC48093BF08CAC441E6E4164DE5F4065D +:105E000009F497C0A0F481E0E8168DE5F80609F4DE +:105E10008EC008F479C060E0A2E0EA16ADE5FA06AB +:105E200009F0B4C48EE090E00E940046AFC4BDEA21 +:105E3000EB16BDE5FB0601F168F49091BE08892FD1 +:105E40008E7F90FF8160F5EAEF16FDE5FF0609F40D +:105E50008ECF9CC42EEAE2162DE5F20659F13FEAF8 +:105E6000E3163DE5F30609F091C49091BF08892F30 +:105E7000877F93FF8860BDCF8091BF088860B9CFCE +:105E80008091BE08826073CF8091BE0884606FCF1E +:105E90008091BE0888606BCF8091BF088160A9CFD8 +:105EA0008091BF088260A5CF0E942D258091BE08F9 +:105EB00080685DCF8091BF08877F9BCF8091BE08AF +:105EC0008B7F55CF8091BE08877F51CF8091BF08CF +:105ED0008E7F8FCF8091BF088D7F8BCF8091BE0842 +:105EE0008F7E45CF8091BE088F7D41CF0E942D25AA +:105EF0008091BE088F773BCF8091BE08837F37CFDC +:105F00008091BF088C7F75CF8091BF08982F9095A6 +:105F100091708E7F892B90FB81F96BCF0E942D258C +:105F20009091BE08892F97FB87F9805820CF61E0B8 +:105F300079CF9091BE08892F8F7E94FF806117CF13 +:105F40008091520369E2811165E388E293E00E9447 +:105F50001B09BECE37ECE3163CE5F30609F46AC034 +:105F600008F463C058ECE5165CE5F50609F467C073 +:105F70004FE05AE06DE17AE099ECE9169CE5F9060C +:105F800009F0D4C40E94DA0997C4AFECEA16ACE574 +:105F9000FA0609F46BC0C8F4ECECEE16ECE5FE066C +:105FA00009F45CC008F455C02DECE2162CE5F206AD +:105FB00009F459C061E085E03EECE3163CE5F306E8 +:105FC00009F0B4C40E945D0A77C446EDE4164CE5BE +:105FD000F40640F461E082E151EDE5165CE5F5067A +:105FE00088F36AC48DE5E816F80609F465C49EC412 +:105FF0008091F30891E089278093F308109294012F +:106000008091C40581608093C40556C446E75AE078 +:1060100061E87AE0B7CF41E85AE066E77AE0B2CFCC +:1060200047E45AE062E57AE0ADCF42E55AE067E442 +:106030007AE0A8CF4BE25AE069E37AE0A3CF49E3E4 +:106040005AE06BE27AE09ECF4DE15AE06FE07AE0F1 +:1060500099CF40EE59E06EEE79E094CF4EEE59E0E4 +:1060600060EE79E08FCF61E081E0ACCF61E08DE060 +:10607000A9CF9AE5E9169DE5F906B9F188F4E1148E +:10608000BCE5FB06D9F0EEEDEE16ECE5FE0609F0F8 +:106090004DC46FEF7FEF90E080E00E941E460CC081 +:1060A000FCE5EF16FDE5FF06B1F008F137EAE3166F +:1060B0003DE5F30609F03AC40E9445280E942D25CB +:1060C0004FEF54E38CE0415050408040E1F700C076 +:1060D00000000E94FE088091BF0882FB882780F99B +:1060E00091E089270E94FA2421C481E0FBCF80E05F +:1060F000F9CFC7010E948F11D82E27C4FD2DFF7044 +:10610000CF2E8D2D807F19F0C29490EFC922EE2002 +:10611000B9F0CC2069F080E28F0D883010F0A1102A +:1061200009C08091AF08C82AC092AF080E94AA187F +:106130008F2D4DC08091AE08C82AC092AE08F6CF10 +:106140008F2D0E943329CC2009F443C080E28F0DAB +:10615000883010F0A11004C08C2D0E94571103C08C +:106160008C2D0E9450110E94AA1833C02D2D2F7023 +:10617000C22E8D2D807F803219F0C29480EFC8220C +:10618000AA20A1F031E0A31609F487C0EE2009F49B +:1061900091C0BB2009F487C0D80115968C91159742 +:1061A00080FFC6CF8F7015968C937DC08091BF08FD +:1061B00082FD51C0EE2009F447C0CC2039F0809117 +:1061C000AF08C82AC092AF080E94AA1880E00E94B7 +:1061D0009629282D2850330B2430310510F40E94C5 +:1061E0005B13EE2079F08D2D807F803619F436EF29 +:1061F000A31641F080915303823009F01CC283E062 +:10620000809353039920B1F08091B20380FD12C0B6 +:10621000D80112961C928595859585950E94162524 +:10622000C8010E943C2D8091B20385958595859586 +:106230000E94CC2420E0F801408151816281738169 +:1062400084810E9460182FCC80E00E943329CC20EA +:1062500009F4BFCF81CFEE2071F0809123048C2907 +:10626000B11003C00E945C19B4CF41E0B412FACF60 +:106270000E944611AECFB11006C00E9440118C2D75 +:106280000E945519A6CF51E0B51609F4A2CF8C2D66 +:106290000E9455190E9440119CCFEE2031F085E0FC +:1062A0008B1508F496CF8C2DDDCF94E09B1508F468 +:1062B00090CFE5CFBB2019F3B9E3AB1245C1EFEFA7 +:1062C000F7EE23E0E150F0402040E1F700C000008D +:1062D0008F2D0E9433297DCF8D2D869586958370D5 +:1062E00069F0813009F075CF8F2D9D2D9370E110ED +:1062F00002C080E090E00E947A096BCF8F2D9D2D27 +:106300009370E11002C080E090E00E949F0961CF8D +:106310006E2D8F2D0E945B285CCF8D2D837009F030 +:1063200040C0E11056CF4F2D429546954770440F1F +:10633000440F8F2D8F7090E0042E02C0880F991F9C +:106340000A94E2F730E020E0F4FE09C02FE030E0EC +:1063500002C0220F331F4A95E2F7209530954D2D4C +:10636000469546954370423099F078F4609119044F +:1063700070911A04413039F0822B932B8623972396 +:106380000E94262526CF862B972B822B932BF8CF86 +:10639000822B932B2091190430911A048227932782 +:1063A000EFCF8695EE2011F08D2D8170882309F4B2 +:1063B00010CF4F2D429546954770440F440F8F2DB7 +:1063C0008F7090E0042E02C0880F991F0A94E2F7A4 +:1063D00030E020E0F4FE09C02FE030E002C0220FE0 +:1063E000331F4A95E2F7209530954D2D46954695F9 +:1063F0004370423099F078F460912209709123093A +:10640000413039F0822B932B862397230E94B524A9 +:10641000E0CE862B972B822B932BF8CF822B932BBE +:10642000209122093091230982279327EFCF9D2DB8 +:106430009F70C92EEE2029F0892F0E9416258F2DDE +:1064400011CF8F2D0E9455198C2D0E94CC24C1CEC6 +:106450008F2DA2EFAA16A1F1AA1570F0B0EFAB161E +:10646000D1F0E1EFAE1691F0EE2009F461C0B11069 +:106470005FCE8D2D8F7128C0F3EFAF1641F124EF61 +:10648000A212F2CF8091BF0882FD32C08D2D8F7194 +:10649000EE20D9F219C0EE2071F034E03B1508F47B +:1064A00098CE2D2D2F7181E090E002C0880F991FAA +:1064B0002A95E2F7B5CF45E04B1508F48ACEF1CF27 +:1064C0008D2D8F71E110C1CF0E94162582CE90E0F4 +:1064D00080E0EE2009F49ACF21E030E09D2D9F71FD +:1064E000D90102C0AA0FBB1F9A95E2F7CD018ECF4A +:1064F000EE2099F0BD2DBF71FB2E8B2F0E9416252B +:106500008091BF0882FF07C0E8E0FE9EC001112411 +:1065100083608093B2038F2DD7CF81E00E94DE2469 +:10652000F1E0FB1508F055CE82E00E94DE2451CE4A +:10653000BB2079F0893341F42FEF37EE43E021504F +:1065400030404040E1F7C2CE8FE39CE90197F1F77C +:10655000BDCE8D2D8F7179CFE0E1EF0DE73008F0E2 +:106560003FC0F0E0E254F94B0C941F44EE2009F4D4 +:1065700030CE8091790391E089278093790329CEE9 +:10658000E092790326CE81E08E25F7CFE11021CE6F +:1065900081E0F3CFE1101DCE109279031ACEEE20E8 +:1065A00021F082E080935303F3CF80915303823034 +:1065B00021F481E0809353030CCE833009F009CE9F +:1065C00010925303E9CFEE2039F0809178038823AD +:1065D00081F210927803FDCD94E09B1550F6F9CD31 +:1065E00080917803BB20D9F0882341F08091790312 +:1065F00091E089278093790310927803E11098CD78 +:10660000AFE3BCE91197F1F700C000008F2D0E94A5 +:10661000332986E0F80111928A95E9F7DACD8823CB +:1066200009F4D7CDE110D5CD8091790391E0892788 +:1066300080937903CECF813009F0E4CD10925303DB +:1066400010927903DFCDF0E1EF16FFE5FF0609F4C4 +:106650000CCB21E1E2162FE5F20609F40ACB9701F3 +:1066600037552F3F310511F008F04AC05701BB24C0 +:10667000BEE0EB9EF00111249F0125593E4F6901B8 +:10668000E059FE4F908180FB90F99083882309F4B4 +:10669000F5CA0E94662490934F0480934E04D6015D +:1066A00012968C9112978F5F12968C93129780910D +:1066B000AE089091AF08892B13968C931397809115 +:1066C000230414968C9314971696ED91FC911797CA +:1066D000309729F01C966D917C91C60109958EE04A +:1066E0008A9DF0018B9DF00D1124E559FE4F8581A7 +:1066F00081FFC1CA90E080E09093B0088093B10818 +:10670000D80112968C91882309F4E9C0B3E0EB1606 +:10671000BDE5FB0608F0BACAEAEFEE16ECE5FE06A8 +:1067200030F4C70182509C45449708F0BCCA0E94CF +:106730009C189093BF088093BE0842E1E4164CE594 +:10674000F40609F4D3CB08F015CB89E0E8168CE504 +:10675000F80609F4A9CB08F0D8CAA5E0EA16ACE51A +:10676000FA0609F495CB08F0BCCAE3E0EE16ECE5B6 +:10677000FE0609F485CB08F087CB8091BE088160C6 +:1067800022E0E2162CE5F20609F4F1CA6091BE0897 +:10679000F090BF0884E090E00E9400466F2D82E2F6 +:1067A00090E00E9400460E942D2586C030E1E3164D +:1067B0003FE5F30609F453CA41E1E4164FE5F40658 +:1067C00009F04DCF82E04CCA21E012966C911297ED +:1067D00013967C91139714968C910E9460187C01FB +:1067E000F8018281882369F18091B0089091B10805 +:1067F000009739F18E159F0521F1BEE08B9FC001F6 +:106800001124FC01E059FE4F20812460208385592A +:106810009E4FFC01F182E0820E9419191092AE088D +:1068200021E0D8014C9111965C91119712966C91D0 +:10683000129713967C91139714968C910E9460186E +:106840007C01F8018281882309F4FDCE9701225151 +:106850003F452031310508F0A9CF8FEF93E00E942A +:10686000E245811129C0FEEEEF0E57EA852E54E075 +:10687000952EE1101CC91C821B82442443944AE0DB +:10688000342E74013FEFE31AF30AC4010E94E2457B +:1068900089831A82882381F09FEF980F933008F044 +:1068A00010C98A83498242E0840E911CC7010E946C +:1068B000E2458B83811106C98091B203877009F488 +:1068C000F2C8D80112968C91882309F4ECC8809103 +:1068D000BF0882FFE8C882E00E94DE24E4C8F6E137 +:1068E000EF16FCE5FF0609F42BCB8091AF0882720E +:1068F0005AECE5165CE5F50609F4A6CB08F045CBA5 +:10690000A5ECEA16ACE5FA0609F48ACB08F022CB2E +:10691000E3ECEE16ECE5FE0609F478CB08F07BCB51 +:1069200022ECE2162CE5F20609F462CBF801828132 +:10693000E080F180882309F4DCCBC7010E94F517C1 +:10694000D82E682FC7010E94D511B7018D2D0E9446 +:10695000D6170E94AD0FF82ED92EA82ED801129668 +:10696000EC9012971596BC90B2943FE0B3228091C0 +:10697000B2038770E9F09E2CEE20D9F0892F807F3A +:10698000803449F090E29F0D983090F0803619F4F1 +:10699000B6EFFB1669F08091BF0882FF09C082E064 +:1069A0000E94DE248091B203877099249394811110 +:1069B000912C8D2C82942FE08222EBE0E81508F4D4 +:1069C00008CCE82DF0E0EB53F94B0C941F441F93D7 +:1069D000CF93DF9380917F03807F09F049C080913E +:1069E0007C03882309F444C08091B103D0918003D3 +:1069F00060917A0370917B03A0917D03B0917E0337 +:106A0000C62FC72316E0D81799F190E0109711F020 +:106A1000CF3F19F401968770F6CF189F9001199F08 +:106A2000300D1124F901EF57FC4F41814713F2CF8C +:106A300040814613EFCF42814111ECCF4381548115 +:106A40004A1B5B0B483C510528F780917F038F70F0 +:106A5000806180937F03F901EA57FC4F80818F703A +:106A6000806180838AE793E00E943C2D0E945E1142 +:106A7000DF91CF911F910895A1E1B0E0E2E4F5E349 +:106A80000C94D0438C0185E0F801DE011D96019045 +:106A90000D928A95E1F7F801E2808AE7A82E83E05B +:106AA000B82E60917D0370917E036115710509F424 +:106AB00026C190917A0340917B03892F84238F3FD5 +:106AC00009F41DC120813181C380D480F0907C0302 +:106AD000F601E61BF70BFF2009F4DCC080917F0371 +:106AE000582F507FE83CF10508F09FC051116BC052 +:106AF000FE2C431314C0921312C0E11010C08F700B +:106B0000806180937F03C5010E943C2D80917F03AB +:106B1000F80185838F2D6196EAE00C94EC43C11453 +:106B2000D10429F0822F83238F3F09F011C180E027 +:106B3000F82FF170DF2E80FF3CC08091B1034091AF +:106B4000800356E0841315C02D873E878D859E8572 +:106B50000E942918292F22952F702230F0F024301E +:106B600018F59F70F1F0F8019581907FD1F4D12C48 +:106B70001EC090E0589FF001599FF00D1124EF576F +:106B8000FC4F6181361306C06081261303C0628109 +:106B9000E6120FC001968770D5CF9F7011F0882341 +:106BA00031F3805E883018F3C8010E943C2DFD2C23 +:106BB000B1CFEE2009F4AECF80917F038160809346 +:106BC0007F03F12CA7CF431306C0921304C0F80132 +:106BD000EE2009F479C0C8010E943618882309F113 +:106BE000EE20F9F080917F03803270F020917A03DB +:106BF00030917B0338872F831986DB86CA868C8782 +:106C0000CE0107960E943C2D86E0F801AAE7B3E08A +:106C100001900D928A95E1F70E94E734FF24F394E6 +:106C200079CFC8010E943C2DF9CF51110AC08AE7E3 +:106C300093E00E943C2D86E0F50111928A95E9F7D8 +:106C4000C0CF43130FC092130DC0E1100BC0F80169 +:106C50008583C8010E943C2D86E0F50111928A953A +:106C6000E9F758CFC8010E9436188823D1F2EE20E8 +:106C7000C1F280917F03803238F220917A03309103 +:106C80007B033A8329831B82DD82CC828E83CE01F3 +:106C90000196B8CFE83CF105F8F6FE2CEE2009F29B +:106CA00043131FC092131DC080917F0380FD10C04D +:106CB000982F907F69F0F8018583903F31F0982FED +:106CC000907F905F8F70892B8583C8010E943C2D37 +:106CD00086E0F801AAE7B3E001900D928A95E1F70A +:106CE00019CFC8010E94361881118ECF80917F0381 +:106CF000816080937F03C8010E943C2D0BCFEE2062 +:106D000009F48FCFC8010E943618F82E882309F4A1 +:106D100088CF86E0F801AAE7B3E001900D928A954A +:106D2000E1F780917A0390917B030E942918929554 +:106D30009F70963051F4863F41F08091790391E045 +:106D4000892780937903909378030E94E734E2CEF9 +:106D500081E08E25EDCEA7E1B0E0E1EBF6E30C9407 +:106D6000D7436D8B7E8B8F8B61111092AE088E890D +:106D70009F89892BB9F15F3F09F0B3C04F3F91F56F +:106D8000542F30C0463070F5E42FF0E086E0589F75 +:106D9000E00DF11D1124CF018770992721E030E02B +:106DA00001C0220F8A95EAF7DF0173E0B695A79537 +:106DB0007A95E1F7A65BBC4F7C91809179036111D4 +:106DC00002C0872F82238823A1F1CF01880F991F4A +:106DD000FC01E953FE4F5491FC01EA53FE4F4491EC +:106DE000272B2C931A8A198A4B8B5C8B85E0FE012A +:106DF0007396DE011D9601900D928A95E1F786E06B +:106E0000FE013D96DE01179601900D928A95E1F7FD +:106E1000CE0107960E943C35882389F016E08091C8 +:106E2000B10390918003891349C06796E3E00C9405 +:106E3000F34320952723D5CF809582237AC086E01F +:106E4000FE013796DE01119601900D928A95E1F7C9 +:106E50008A859B85892B11F38F81988589238F3FA4 +:106E6000E9F22091800330E0C901019687709927EB +:106E70004091B1034817190671F40E942D25109214 +:106E800080031092B10386E0EAE7F3E0DF011D9290 +:106E90008A95E9F7C3CF96E0929FD001939FB00DFA +:106EA0001124AF57BC4FFE01319601900D929A9577 +:106EB000E1F7809380030E945E11B0CF819FC001F3 +:106EC00011248F579C4F0E943C35882309F4ADCF85 +:106ED0008091B10390E00196877099278093B10368 +:106EE0009ECF5A3008F44ECF84E0850F823008F0F0 +:106EF00079CFE42FF0E0242F277081E090E001C0EB +:106F0000880F2A95EAF7DF0193E0B695A7959A9541 +:106F1000E1F7A75BBC4F2C9130917903611102C05E +:106F2000322F3823332309F487CFEC53FE4F44919B +:106F3000822B8C9357CFAAE0B0E0E1EAF7E30C9400 +:106F4000D643182F062F662399F10E9466241E83CC +:106F50002DEF2F8321E0288781609A8789874E81D2 +:106F60005F81688579858A850E94AB368FE39CE9CD +:106F70000197F1F700C000000023F9F00E94662499 +:106F800019832DEF2A831B8281609D838C83498125 +:106F90005A816B817C818D810E94AB368FE39CE9A5 +:106FA0000197F1F700C000002A96E4E00C94F24348 +:106FB0000E9466241E832CEFCCCF0E946624198386 +:106FC0002CEFE0CFA1E0B0E0E8EEF7E30C94D14382 +:106FD000EE24E394F12C0CEE13E09E012F5F3F4F63 +:106FE0004DE054E064E083E00E946522C82E8823CF +:106FF00039F100E080E01DC0D0904004D00E2D2D6E +:1070000030E0A901405B5B4F7A01E1E0F0E0EC0F7A +:10701000FD1FE00FF11D1081FA019081191BB12EA7 +:107020001B149CF0912F17FD90E0191B111118C033 +:107030000F5F90913F040917F8F281110E943D11F2 +:107040008C2D2196E9E00C94ED43BA94F7018081F0 +:107050008F5F808360E08D2D0E949B378C2DE0CF69 +:107060001F5FF70180818150808361E08D2D0E9438 +:107070009B378C2DDBCF1F921FB61F9211248F934D +:107080009F93AF93BF938091B908811113C08091F2 +:10709000BA089091BB08A091BC08B091BD08419678 +:1070A000A11DB11D8093BA089093BB08A093BC08A2 +:1070B000B093BD08BF91AF919F918F911F901FBE5C +:1070C0001F901895CDB7DEB7E1970FB6F894DEBFE5 +:1070D0000FBECDBF85B7806885BF85B7806885BF87 +:1070E00084B7877F84BF0FB6F894A895809160001D +:1070F000886180936000109260000FBE80E890E08D +:107100000FB6F89480936100909361000FBE81E503 +:107110009FE090932703809326030E94A1070E947B +:1071200042088091E20084608093E200789480912C +:10713000E5088823A1F01091E9001F709091EC0000 +:10714000892F817090FD80E8182B1092E9008091C2 +:10715000E80083FD0E9443251F701093E90082E040 +:1071600084BD93E095BD9AEF97BD80936E00109219 +:107170002D0410922E0410922F04109230040E94BD +:107180008318811102C00E945C170E9438138093FB +:1071900062010E94381381110E9452428091620163 +:1071A0008091620195E0811190E090933E0485E02A +:1071B000891B80933D0403ED11E0D8018D918D0171 +:1071C0008F3F11F00E94530FB1E0083D1B07A9F754 +:1071D00008ED11E06EEDE62E61E0F62EF8018191EA +:1071E0008F018F3F11F00E94530FE016F106B1F7A7 +:1071F0008AE0EDE7F4E0DF01282F1D922A95E9F7F8 +:10720000E3E3F4E0DF011D928A95E9F78EE190E077 +:107210000E949144BC01909332048093310430E089 +:1072200020E0FB01E20FF31F96E0408141704193A3 +:107230009150D9F72A5F3F4F2E31310591F70E94C7 +:10724000F022811102C00E94FC2282E090E00E94A4 +:10725000E245809343040E949C189093BF0880935A +:10726000BE080E94762AEFE3FCE93197F1F700C0EF +:1072700000000E94762A80917D0480FF08C06FEF95 +:107280007FEF90E080E00E941E460E94FE0883E0AF +:1072900090E00E94E24590E00E9426251092F908B5 +:1072A0008FEF9FEF90931309809312099093150924 +:1072B00080931409909317098093160990931909E4 +:1072C0008093180990931B0980931A0990931D09C4 +:1072D00080931C0990931F0980931E0990932109A4 +:1072E00080932009109296059093B0058093AF0586 +:1072F0009093B2058093B1059093B4058093B30544 +:107300009093B6058093B5059093B8058093B70523 +:107310009093BA058093B9059093BC058093BB0503 +:107320009093BE058093BD050E94F022E82E88232D +:1073300009F489CF46E050E06CE170E083EF98E01B +:107340000E94D2451092C4058091F3088C7F11F4FD +:107350000E947A200E943813882309F4A9C083E090 +:107360008093780480FDA6C080E880939D060E94EB +:107370000C416DE070E081E093E00E940412892BE3 +:10738000E9F58091780463E070E081FD95C08EEFAF +:1073900092E00E940412892B89F56DE070E08EEE78 +:1073A00092E00E940412892B49F50E940F09605A4D +:1073B00075418F4F9F4F6093A8087093A9088093E1 +:1073C000AA089093AB08E0EAF6E080E092E0DF01E3 +:1073D0009C011D9221503040E1F7F093A708E09303 +:1073E000A6088FEF9FEF90939F0680939E0681E003 +:1073F0008093AD088093AC0810927904909162015B +:1074000081E0982790935404382F391B309340041F +:1074100090916201809355049091620180933F04A2 +:1074200080916201811106C084EF8093880185EF0D +:107430008093870180918801E82FE295EF70F0E05A +:1074400061A18F7021E030E0A90101C0440F8A954D +:10745000EAF7942F9095962391A382A1842B82A37F +:1074600090918701E92FE295EF70F0E041A19F70C4 +:10747000B90102C0660F771F9A95E2F7CB01962FEC +:107480009095942391A392A1892B82A38FE891E0F8 +:107490000197F1F700C000001091550446E554E053 +:1074A00028E831E087E8C82E81E0D82EFA012FC005 +:1074B00080E056CF80E259CF8BEF92E06ACFD901BE +:1074C0006D919D01862F82958F7090E0DC019096E2 +:1074D0008C9190E06F7002C0959587956A95E2F760 +:1074E0008170D6019D916D01692F62956F7070E07A +:1074F000DB0190966C9170E09F7002C07595679566 +:107500009A95E2F790E060FD92E0892B81938E2FAF +:10751000841B8117A0F20E943813811102C00E94BF +:10752000554283E691E09093B6088093B5088DE7C5 +:1075300094E0BAE0B80FB9AB8091E508853089F4E2 +:1075400050E4F52EDD24D39400E112E18091E508AA +:10755000853009F4C4C00E942D250E945B1310924F +:10756000C3050E94762A44E4242E44E0342E4DE7DD +:1075700054E05CA74BA72EE434E0DA01F1019191CD +:107580008D912E173F0709F4F1C09817C1F30E949F +:10759000381388AB31E1832E32E0932E6DE774E02F +:1075A0007FA76EA7712CAEA5BFA56D90BFA7AEA794 +:1075B000F10141901F01461409F486C04624D12CE4 +:1075C000C12C55245394842D852109F471C0F62CC7 +:1075D000F520F8A9FF2399F0CEA27FA281E0F11057 +:1075E00001C080E088A70E9466248160782F9AA756 +:1075F00089A74EA15FA168A58AA50E94AB36FF208E +:1076000051F0F401EC0DFD1D8081F12C8F3F19F03C +:107610008DA7FF24F3940F2D10E080919605800F25 +:10762000912F911D09976CF188E0A82EB12CA01A1A +:10763000B10AB80169567A4FA50187E995E00E9421 +:10764000C945B80161567A4FA5018FE995E00E94BE +:10765000C945A501440F551FB801660F771F615535 +:107660007A4F8FEA95E00E94C945B80169557A4F73 +:10767000A50187EA95E00E94C94588E08F198093AB +:1076800096058091960590E02DA5A22FB0E09D0172 +:10769000220F331F235B3D4FAA0FBB1FBD01625B4F +:1076A0007D4F41E0480F9F1508F4E9C1809396058E +:1076B000550CEFEFCE1ADE0AF6E0CF16D10409F032 +:1076C00082CFF10131976082739426E0820E911C83 +:1076D0003AE0731268CF0E940F09BE2C68C08091F7 +:1076E000E508843009F432C00E94D41F8091C3059C +:1076F000811105C00E94661A80E00E948D0AD09216 +:10770000C3050E942E121092B908E8E1F0E00FB60E +:10771000F894A895E09360000FBEF092600083B7E4 +:10772000817F846083BF83B7816083BF78948895AD +:1077300083B78E7F83BF0FB6F894A89580916000C1 +:10774000886180936000109260000FBE8091E40811 +:10775000882309F4FBCE0E94762AEDE7F4E08191BC +:10776000811131C529A92E13FACFF0CE98130FCF6E +:107770000E9466248C018091410490914204081774 +:107780001907A1F08FEF89A38AA31BA20E94662488 +:107790008160782F9DA38CA349A15AA16BA18DA1D3 +:1077A0000E94AB361093420400934104B12C0E9416 +:1077B00038138823F1F00091B0081091B108011539 +:1077C0001105B9F080914E0490914F040E94572406 +:1077D000893C910570F04EE0049FC0011124FC012A +:1077E000E059FE4F208122FD04C085599E4F0E9422 +:1077F00019190E94D41F912CF12CF4E0CF2ED12C1A +:1078000080915504981608F450C1F1100E943D1162 +:107810008091AD08882351F180917A0490917B0486 +:107820000E945724C29708F0B0C120919E06309163 +:107830009F062115310509F03CC28091AC088823D0 +:10784000A9F00E940F090091A8081091A9082091A1 +:10785000AA083091AB08601B710B820B930B6F3F32 +:107860007F4F8F4F9F4710F40E942E12B11001C01E +:10787000F1100E94491286E0EEE8F4E0DE01119674 +:1078800001900D928A95E1F7109290041092910464 +:1078900010929204109293048B819C81892B09F49D +:1078A0004AC080918C0490918D040E9457249C01C1 +:1078B00090918704992309F4AAC425313105D8F1A0 +:1078C0009F3F19F09F5F909387041B81112359F00C +:1078D0000E94310F9FEF11160CF491E0899F802DCB +:1078E0001124809390041C81112359F00E94310FC0 +:1078F0009FEF11160CF491E0899F802D1124809345 +:107900009104309190043323B1F02091910422230B +:1079100091F045EB3403C0011124992309F49BC273 +:107920009093900455EB250390011124332309F41F +:1079300096C2309391048D819E81892B09F44AC0AF +:1079400080918A0490918B040E9457249C0190910D +:107950008804992309F456C421353105D8F19F3F95 +:1079600019F09F5F909388041D81112359F00E94A4 +:107970000F0F9FEF11160CF491E0899F802D1124B9 +:10798000809392041E81112359F00E940F0F9FEFE4 +:1079900011160CF491E0899F802D1124809393049B +:1079A000309192043323B1F020919304222391F07B +:1079B00065EB3603C0011124992309F454C2909356 +:1079C000920475EB270390011124332309F44FC26D +:1079D0003093930446E050E0BE016F5F7F4F8EE826 +:1079E00094E00E94BC45892B61F4809190049091B1 +:1079F0009104892B90919204892B90919304892B67 +:107A000011F00E94722486E0FE013196AEE8B4E0E7 +:107A100001900D928A95E1F70E945B1390917C048E +:107A2000891721F080937C040E940F098091E5085A +:107A3000843009F081CD83E08093E9008091E800F3 +:107A400082FF7ACD8091E80090E085FF06C00E9419 +:107A5000C007882309F40FC29E2D8091E8008B7720 +:107A60008093E800992309F467CDE981E150E5317D +:107A700008F056C2F0E0EF52F94B0C941F4490E02E +:107A8000FC01EA56FA4FD9015C915183DB015C910C +:107A90005187BDA5B18B880F991FFC01EA56FA4F9B +:107AA000128E118E91E0842FFCCD092D10E0F8018B +:107AB000E857FE4F8081E82FE295EF70F0E0E0A1FB +:107AC000F0E08F7002C0F595E7958A95E2F7E170D6 +:107AD000D801A957BE4F2C91A22FA295AF70B0E04C +:107AE00090968C9190E02F7002C0959587952A957D +:107AF000E2F780FD48C080E08E2BD801AA5ABB4F28 +:107B0000EC919E2F93708917E1F1EE0FEE0FE82BA9 +:107B1000EC93A0905404A90CEF70F0E0E252FE4FF9 +:107B20000E5A1B4F8081D8019C91890F8C9320E0C5 +:107B3000843064F0EA2DF0E0E05BFB4F80818F5FE2 +:107B4000808360E08A2D0E949B372E2DF801808172 +:107B50008D3F64F4EA2DF0E0E05BFB4F80818150C3 +:107B6000808361E08A2D0E949B372E2DD8018C9155 +:107B7000082E000C990BB6010E940B44F80180837B +:107B8000F22A93943DCE82E0B7CF0E946624909370 +:107B90007B0480937A0480EA96E09093A708809310 +:107BA000A6080E94381360E0882309F47DC081E6AE +:107BB00093E00E94F71960E08BE593E00E943C1A85 +:107BC0008091220990912309292F3327E0E0211584 +:107BD000310511F0C901E8E09C0174E03695279564 +:107BE0007A95E1F72115310511F0EC5FC9019C018F +:107BF00036952795369527952115310511F0EE5FBD +:107C0000C90196958795892B09F0EF5FE93008F057 +:107C100045C0F0E0EA51F94B60E00C941F4485E563 +:107C200093E00E94F71960E080E293E00E94F71968 +:107C30000E945B13082F017082FB112710F981FB52 +:107C4000662760F98AE193E00E943C1A602F84E184 +:107C500093E00E943C1A612F8EE093E00E943C1A50 +:107C60008091AD08882309F4E8CDDFCD8FE493E05F +:107C7000D8CF8AE493E0D5CF84E493E0D2CF8EE3EB +:107C800093E0CFCF88E393E0CCCF83E393E0C9CFF9 +:107C90008EE293E0C6CF88E293E0C3CF60E083E258 +:107CA00093E00E943C1ABFCF84E693E00E94F7194C +:107CB000D7CF8091790461E070E08111BECD082FAB +:107CC00010E06B01082E02C0CC0CDD1C0A94E2F718 +:107CD000A9014C215D21452B09F447C090917804FE +:107CE00090FD45C08295880F807680938B01980126 +:107CF000369527953695279520938E01815E809342 +:107D00008C0110928F0124E630E047E050E069E8F2 +:107D100071E088E70E94AC41892B09F08ECDA80163 +:107D200035E0440F551F3A95E1F78091780480FDC6 +:107D30002CC04056594F04E610E020E230E060E4E9 +:107D400088E70E94CD41892B09F077CD0E94491226 +:107D5000C094D09480919E0690919F06C822D9220B +:107D6000D0929F06C0929E0668CD8F5FA8CF880FE5 +:107D7000880F880F80938B0110928E01895F80930A +:107D80008C0183E080938F01BECFE8E5F4E080E2D0 +:107D9000DF011D928A95E9F7E2EFF1E0FFA7EEA778 +:107DA0000EEE11E026EF222E21E0322EAEA5BFA569 +:107DB0002D91BFA7AEA7F80141908F01440E552E1B +:107DC000511CB2016056794F2B01E22FF0E0E85AC6 +:107DD000FB4F30E020E097E0692E621AAA24A394BA +:107DE000022E01C0AA0C0A94EAF7420190E0D401E5 +:107DF0008D914D018A21662D691B6770762E062EA6 +:107E0000000C770BB82F01C0BB0F7A94EAF77B2EDA +:107E10007195619571096770772701C086956A959C +:107E2000EAF7782A8081782A70829F5F9830F9F685 +:107E30002F5F3F4F31962830310569F6EEA5FFA53B +:107E40002E163F0609F0B2CF04E610E020E230E043 +:107E500048E554E074CF81E08093900463CD81E0E5 +:107E60008093910468CD81E080939204AACD81E053 +:107E700080939304AFCD00E210E0CE0101966C0137 +:107E80008091E80085FD0AC08091E8008B7780939F +:107E9000E8000E94C007882399F3DECD8091F100AD +:107EA000D6018D936D010150110951F7D5CD1A827C +:107EB0008AE08B8310C08A81823009F49AC18330B2 +:107EC00099F0813069F50E940F090E9425446B8367 +:107ED0007C838D839E8340E250E0BE016F5F7F4FC5 +:107EE00082E00E94711228CBFE01339687E894E06D +:107EF000ABA5BCA52D91BCA7ABA721938A179B0767 +:107F0000B9F7E9CF8A81823059F46B817C818D8108 +:107F10009E810E94254486E290E00E940046DBCFCD +:107F20008FEF8983D8CF4C816B818A810E94A717FC +:107F30009827892798279E838D83CDCF2D813E81D9 +:107F40003227232732274C816B818A810E94CD16EC +:107F5000C2CF0E94F316BFCF8A818138E9F088F43E +:107F6000803809F0B8CF4B8128E7429F412D11247A +:107F70008091F40820E06091F50890E00E94FC09EF +:107F8000AACF823819F1833809F0A5CF8B8120E080 +:107F90004091F6086C81F1CF60E08B810E945D0A10 +:107FA0009B818091F308911109C0982F937011F073 +:107FB000109294018C7F8093F3088DCF982F93704B +:107FC00011F4109294018C7F8160F5CFEB818FE7E3 +:107FD000E43020F4F0E0EA50FE4F80818093F7080F +:107FE0007ACF8A818138E1F078F4803809F073CF54 +:107FF0008091F608BFEF8B9FC001112468E770E005 +:108000000E94B4436B8367CF823879F0833809F0DC +:1080100062CF8091F4088B838091F5088C835BCFCD +:108020008091F3088695869544CF8091F708873232 +:1080300030F08F3530F08E3930F083E03ACF80E089 +:1080400038CF81E036CF82E034CF0E94C91F43CFC2 +:1080500080E18A8340CF8FEF8A8389E52ACF0A8126 +:108060001B81102701271027FE0131966F01AC807C +:108070009F012A0D311D5901C80189559B4FAC1430 +:10808000BD0409F428CF09353FEF130758F40E94C7 +:10809000E245D60114968C930F5F1F4FFFEFCF1A66 +:1080A000DF0AEACFF6011482F7CF0A811B8110277D +:1080B000012710279E012F5F3F4F5901CC80C00E32 +:1080C000D12ED11CC80189559B4F0C151D0509F4F3 +:1080D00002CF09353FEF130728F4D50114966C91B0 +:1080E0000E940046BFEFAB1ABB0A0F5F1F4FEACFDB +:1080F00007EA14E060E0C8010E9400460F5F1F4FCE +:10810000F9CF89E0A6CF0A811B811027012710270C +:10811000FE0131966F01AC809F012A0D311D59017E +:10812000C8018796CA14DB0409F4D5CE083334E0BD +:10813000130758F40E94E245D60114968C930F5F02 +:108140001F4FFFEFCF1ADF0AEBCFF6011482F7CFF4 +:108150000A811B811027012710279E012F5F3F4FA7 +:108160005901CC80C00ED12ED11CC8018796C016F3 +:10817000D10609F4B0CE083334E0130728F4D50152 +:1081800014966C910E940046BFEFAB1ABB0A0F5FBA +:108190001F4FEBCF41E08C81811101C040E06B812A +:1081A0008A810E946E17C4CE2D813E8132272327FB +:1081B000322741E08C81811101C040E06B818A81CE +:1081C0000E949C1688CE09BD19BD09B400FEFDCFE2 +:1081D0008091D8008F7D8093D8008091E0008260EC +:1081E0008093E0008091E00081FDFCCF0E942D256E +:1081F000ADC986E290E00E94E2451B821C821D828E +:108200008E8369CE2B30310508F0ABCBE3CB2B301E +:10821000310508F057CB8FCB1092B9008CE08093DA +:10822000B8000895B0E0A0E0E8E1F1E40C94CF4399 +:10823000B82EEB010E9466246C01EE24E394F12C2D +:10824000C431D10560F025E0E22EF12CCF3FDC07F0 +:1082500031F0CE0164E170E00E94B4437B0184EA16 +:10826000A82E94E8992E1092BC00A092BC000E9407 +:1082700066248C018091BC0087FF0DC08091B900FD +:10828000887F8830F9F08091B900887F8031D1F003 +:108290000FEF1FEF08C0C8010E945724E816F90627 +:1082A00048F70EEF1FEFCF3FDC07E9F2C6010E944F +:1082B0005724C817D907B8F6C801CDB7DEB7EBE029 +:1082C0000C94EB43B092BB009092BC000E946624D9 +:1082D0008C018091BC0087FF0AC08091B900887F23 +:1082E000883111F08034A1F610E000E0E5CFC8013C +:1082F0000E945724E816F90660F7D3CF0F931F9317 +:10830000CF93DF93EB018093BB0084E88093BC00A4 +:108310000E9466248C018091BC0087FF11C02091CF +:10832000B900287F81E090E0283211F490E080E0ED +:10833000919581959109DF91CF911F910F910895AA +:10834000CF3FDC0741F3C8010E945724C817D90763 +:1083500010F78EEF9FEFEFCFB0E0A0E0E2EBF1E49B +:108360000C94D2436B018A017901B9010E94124138 +:10837000E6010C0D1D1DC017D10711F097FF08C0B5 +:1083800024E92093BC00CDB7DEB7E8E00C94EE43BF +:10839000B70189910E947E41EECFB0E0A0E0E3ED0D +:1083A000F1E40C94D243C62F6A017901B8010E940E +:1083B000124197FD0CC0B8018C2F0E947E41E6014E +:1083C000EC0CFD1CCE15DF0511F097FF08C024E969 +:1083D0002093BC00CDB7DEB7E8E00C94EE43B801C3 +:1083E00089910E947E41EECF84E98093BC0008957C +:1083F0008EE14A9B02C08150E1F74A9BFECF08956F +:108400005A9880E28A95F1F75A9A0895FC013BE068 +:108410003A95F1F798E020E080E031E040E14A95BC +:10842000F1F7880F4A9B02C08160232742E04A95FA +:10843000F1F7000040E14A95F1F7915079F790E1AA +:108440009A95F1F799B132E03A95F1F7000040E1E1 +:108450004A95F1F792FB992790F992272081920F84 +:1084600090830895A1E0B0E0E8E3F2E40C94D443F3 +:1084700019828C017C01E60EF11C0E151F0541F4DA +:1084800081E09981911180E02196E6E00C94F0431F +:108490000E94F841CE0101960E940642F8018193A4 +:1084A0008F01EBCF529A5A9A089552985A9AEA9AA3 +:1084B000E9E6F0E080818F7C808308956150770B3E +:1084C00091E001C0990F6A95EAF720E031E091113F +:1084D00008C0222391F05A9A80E28A95F1F75A98BF +:1084E0000895492F482339F05A9A232740E24A95A4 +:1084F000F1F79695ECCF5A98F9CF5A98EDCFFF92B5 +:108500000F931F93CF93DF93EC018C01060F111D86 +:10851000C017D10729F4CDB7DEB7E5E00C94F143DD +:10852000F9900E94004268E08F2D0E945E42F0CFD9 +:108530001F920F920FB60F9211240F931F932F9338 +:108540003F934F935F936F937F938F939F93AF93DB +:10855000BF93EF93FF93CF93DF930F92CDB7DEB727 +:1085600019820E94F841CE0101960E940642082F0E +:10857000069506950695282F22952570902F9570C3 +:10858000290F922F937026952695920F9827977012 +:108590008981982B09F05CC00C3008F059C080E14B +:1085A0008A95F1F75A9A529A82E08A95F1F700C0BB +:1085B0005A9888E0089F80011124D801A65FBE4F19 +:1085C0001696ED91FC9117973097A9F06091D10123 +:1085D0007091D20114962D913C911597260F371F5B +:1085E00011968D919C911297680F791F13964C915B +:1085F00013978C910995F801E65FFE4F638166231E +:1086000051F02091D1013091D20184819581820F66 +:10861000931F0E947F420E94004280E18A95F1F7F9 +:108620005A9852985A9A80E18A95F1F7F801E65FD4 +:10863000FE4F6081662351F02091D1013091D2012B +:1086400081819281820F931F0E9432420E94F841E1 +:108650000F90DF91CF91FF91EF91BF91AF919F91DB +:108660008F917F916F915F914F913F912F911F91CA +:108670000F910F900FBE0F901F9018950F931F939F +:10868000CF93DF93EC010C970CF04CC0F894529A06 +:108690005A9885E08A95F1F700009C2F9695957081 +:1086A0008C2F8570980F892F83709695969523E06F +:1086B000CC0FDD1F2A95E1F7980F8E01092B0E9440 +:1086C000004200C068E0802F0E945E4280E18A95EF +:1086D000F1F752985A9A4A9B1EC087E090E04A9957 +:1086E0001CC0FE01E65FFE4F63816623F9F0209116 +:1086F000D1013091D20184819581820F931F0E9414 +:108700003242811113C0529A5A9A7894DF91CF91D4 +:108710001F910F91089500C0DECF019729F4529A5E +:108720005A9A789480E0F2CF00C0D9CF0E94F841E5 +:1087300080E28A95F1F75A98529A80E18A95F1F78A +:10874000C65FDE4F6881662351F02091D1013091E0 +:10875000D20189819A81820F931F0E947F420E94D9 +:108760000042789481E0D2CFAA1BBB1B51E107C025 +:10877000AA1FBB1FA617B70710F0A61BB70B881FB1 +:10878000991F5A95A9F780959095BC01CD01089540 +:108790002F923F924F925F926F927F928F929F9211 +:1087A000AF92BF92CF92DF92EF92FF920F931F93FF +:1087B000CF93DF93CDB7DEB7CA1BDB0B0FB6F894B0 +:1087C000DEBF0FBECDBF09942A88398848885F84F0 +:1087D0006E847D848C849B84AA84B984C884DF8061 +:1087E000EE80FD800C811B81AA81B981CE0FD11D45 +:1087F0000FB6F894DEBF0FBECDBFED010895991BF3 +:1088000079E004C0991F961708F0961B881F7A9587 +:10881000C9F78095089597FB072E16F4009407D0AA +:1088200077FD09D00E94B44307FC05D03EF4909533 +:1088300081959F4F0895709561957F4F0895EE0F34 +:10884000FF1F0590F491E02D099469279627692769 +:1088500078278727782708958F929F92AF92BF92AB +:10886000CF92DF92EF92FF92CF93DF93EC0168817A +:1088700079818A819B81611571058105910521F4BA +:1088800064E279ED8BE597E02DE133EF41E050E0D4 +:108890000E94244649015A019B01AC01A7EAB1E4B8 +:1088A0000E9443466B017C01ACEEB4EFA50194013C +:1088B0000E945146DC01CB018C0D9D1DAE1DBF1DDC +:1088C000B7FF03C00197A109B04888839983AA83A1 +:1088D000BB839F77DF91CF91FF90EF90DF90CF9098 +:1088E000BF90AF909F908F9008950E942C44089560 +:1088F00080E091E00E942C440895B0E0A0E08093D5 +:10890000000190930101A0930201B0930301089527 +:10891000FB01DC0102C005900D9241505040D8F798 +:1089200008950F931F93CF93DF938230910510F436 +:1089300082E090E0E0912609F091270930E020E004 +:10894000B0E0A0E0309799F42115310509F447C053 +:10895000281B390B24303105C0F58A819B816115B4 +:10896000710571F1FB0193838283FE0111C0408187 +:1089700051810281138148175907F8F048175907A8 +:1089800099F4109761F012960C93129713961C931A +:108990003296CF01DF91CF911F910F9108950093EF +:1089A000260910932709F4CF2115310519F0421734 +:1089B000530718F49A01BD01EF01DF01F801C2CF9E +:1089C0009093270980932609D0CFFE01E20FF31F71 +:1089D000819391932250310939832883DACF2091F2 +:1089E000240930912509232B41F42091060130916F +:1089F0000701309325092093240920910401309127 +:108A000005012115310541F42DB73EB7409108010C +:108A100050910901241B350B4091240950912509DF +:108A20004217530708F0B5CF241B350B2817390719 +:108A300008F4AFCFBC016E5F7F4F2617370708F4ED +:108A4000A8CF640F751F7093250960932409FA015C +:108A5000819391939ECFCF93DF930097E9F0FC0130 +:108A6000329713821282C0912609D0912709DE0124 +:108A700030E020E02097A1F420813181820F931F04 +:108A800020912409309125092817390709F067C07A +:108A9000F0932509E0932409DF91CF910895DA013D +:108AA000AE17BF0708F040C012964D915C91139726 +:108AB0009D014115510599F7D9011396FC93EE9349 +:108AC00012974D915D91A40FB51FEA17FB0779F43A +:108AD000808191810296840F951FD90111969C93F4 +:108AE0008E938281938113969C938E931297B0E01C +:108AF000A0E08A819B810097B9F5FE018191919157 +:108B0000E80FF91F80912409909125098E179F077E +:108B100019F6109761F51092270910922609D09343 +:108B20002509C0932409B8CFB383A2834081518122 +:108B3000840F951FA817B90771F44E5F5F4F8D9191 +:108B40009C911197480F591F5183408312968D9124 +:108B50009C91938382832115310509F0ADCFF09369 +:108B60002709E093260998CFDE01EC01C2CF1396C6 +:108B70001C921E921297D3CFFB01DC0104C08D9191 +:108B80000190801921F441505040C8F7881B990B7F +:108B90000895FB01DC0102C001900D92415050404C +:108BA000D8F70895DC01CB01FC01F999FECF06C08E +:108BB000F2BDE1BDF89A319600B40D92415050409B +:108BC000B8F70895F999FECF92BD81BDF89A99271B +:108BD00080B50895A8E1B0E042E050E00C94D4459F +:108BE000DC01A40FB51F4150504048F0CB01840F69 +:108BF000951F2E910E94014641505040D0F7089594 +:108C0000262FF999FECF92BD81BDF89A019700B445 +:108C1000021639F01FBA20BD0FB6F894FA9AF99AE5 +:108C20000FBE08950396272F0E9401460E9400461A +:108C3000252F0E940146242F0C9401460196272FD0 +:108C40000E9401460C940046052E97FB1EF40094EA +:108C50000E943B4657FD07D00E94564607FC03D0B2 +:108C60004EF40C943B4650954095309521953F4FDE +:108C70004F4F5F4F089590958095709561957F4F08 +:108C80008F4F9F4F08950E947846A59F900DB49FE7 +:108C9000900DA49F800D911D11240895B7FF0C9491 +:108CA00043460E944346821B930B0895A1E21A2E6D +:108CB000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F80 +:108CC000A217B307E407F50720F0A21BB30BE40BD0 +:108CD000F50B661F771F881F991F1A9469F7609517 +:108CE0007095809590959B01AC01BD01CF010895D1 +:108CF000A29FB001B39FC001A39F700D811D1124DD +:108D0000911DB29F700D811D1124911D0895F8943D +:108D1000FFCF961AA21ADB1A251B701BBF1B101C53 +:108D2000151C181C1E1C211C261C291C2C1C2F1C4D +:108D3000321C351C381C3B1C3E1C411C461C491C6B +:108D40004C1C961CF61C471D4A1D4D1DCC1DBD1EFE +:108D5000781F7D1F801F8D1F911F9C1F9F1FAA1FA3 +:108D6000AD1FB81FBB1FC61F24264C26EF274C265D +:108D7000EF277F26A026EF279E27AB27B632E332C8 +:108D8000C032C332CA32C632CF327E307E30B630C5 +:108D9000B6306C318831AC32E9308D31173228323F +:108DA0002832573F5B3F823F933F9E3FA93FAC3FF6 +:108DB000F13F2540903F903F28402B402F405540A9 +:108DC000784081408340A840CA40D4400F3E363EA0 +:0E8DD000453E4B3E3F3E393E483E3C3E423E15 +:108DDE000100000000002809200000000001000032 +:108DEE000000000000050100000005060000000064 +:108DFE000000000000010B000000000000010C004C +:108E0E000000040D00000000000002110000000030 +:108E1E000000021300000000000001150000000019 +:108E2E0000000316000000000000071900000000FB +:108E3E00000001FB08BA12B312AC120000000000D1 +:108E4E00000000502A8529000000000000000000EC +:108E5E00002A2A74290000F4F50021007F22000365 +:108E6E003905FFFF030100FF0000FF78818283E2D6 +:108E7E0000E900EA00B500B600B700CD008301CCD2 +:108E8E00008A019201940121022302240225022666 +:108E9E000227022A02B300B4006F0070009F01CBBC +:108EAE0001E0036697C63435F6F73133323600FFEC +:108EBE000100010000FFFF0000010001FF0000089B +:108ECE001018181008000F3F7FBD003131295A1BB2 +:108EDE00750A4022B684016201AC007A0E930EB37D +:108EEE000E0B0C15161F200A0D14171E21090E133A +:108EFE00181D22080F12191C230710111A1BFF2F01 +:108F0E0030393A43442E31383B42452D32373C41BD +:108F1E00462C33363D40472B34353E3FFF602810FC +:108F2E0014300A5012583C3839183C2039003000A1 +:108F3E00240018000C100C1018102410303037407C +:108F4E0039202D20212015200930073013301F30F5 +:108F5E002B503B6040402D402140154009500A5097 +:108F6E00165022502F8028D014B00A9012883CA898 +:108F7E0039C83CC039E030E024E018E00CD00CD009 +:108F8E0018D024D030B037A039C02DC021C015C0A4 +:108F9E0009B007B013B01FB02B903B8040A02DA09E +:108FAE0021A015A009900A90169022902F0002027F +:108FBE00020202020404040404040404040404046B +:108FCE000404040404040404040404040404040453 +:108FDE000400020202020202040404040404040453 +:108FEE000404040404040404040404040404040433 +:068FFE0004040404040059 +:00000001FF diff --git a/sofle_rev1_via.hex b/sofle_rev1_via.hex new file mode 100644 index 000000000000..fdf2ddb1b818 --- /dev/null +++ b/sofle_rev1_via.hex @@ -0,0 +1,1681 @@ +:100000000C946D060C948A060C948A060C946A3142 +:100010000C948A060C948A060C948A060C948A0620 +:100020000C948A060C948A060C946A1A0C94261A6C +:100030000C9443280C948A060C948A060C948A0625 +:100040000C948A060C948A060C948A060C948A06F0 +:100050000C948A060C94431B0C948A060C948A0612 +:100060000C948A060C948A060C948A060C948A06D0 +:100070000C948A060C948A060C948A060C948A06C0 +:100080000C948A060C948A060C948A060C948A06B0 +:100090000C948A060C948A060C948A060C948A06A0 +:1000A0000C948A060C948A060C948A060501098031 +:1000B000A101850319012AB700150126B700950192 +:1000C00075108100C0050C0901A101850419012AE0 +:1000D000A002150126A002950175108100C00660DE +:1000E000FF0961A1010962150026FF00952075082E +:1000F00081020963150026FF00952075089102C052 +:1001000005010906A101050719E029E715002501E8 +:10011000950875018102950175088101050719008F +:1001200029FF150026FF00950675088100050819AE +:10013000012905950575019102950175039101C08D +:100140000005010502050305040505050006010675 +:100150000206030604060506000701070207030757 +:100160000407050700080108020803080408050839 +:100170000009010902090309040905090000010039 +:100180000200030004000500000101010201030157 +:100190000401050100020102020203020402050239 +:1001A0000003010302030303040305030004010425 +:1001B0000204030404040504000000000000000021 +:1001C000000000000000000000000000000000002F +:1001D0000000000000000000000000007E0F00D4BE +:1001E000FFFFFFC7000000780000000000000000D3 +:1001F0002A2B280000000000000000000000000082 +:1002000000000029000000002C1E3420212224348C +:100210002627252E362D3738271E1F20212223245E +:1002200025263333362E37381F0405060708090AFA +:100230000B0C0D0E0F101112131415161718191A96 +:100240001B1C1D2F3130232D350405060708090A14 +:100250000B0C0D0E0F101112131415161718191A76 +:100260001B1C1D2F3130354C00DA0281FFD9F1DB28 +:1002700020A4A62EAF00A0C000A1C800AED580A8C3 +:100280001FD300408D14200000047F3F1F643214F0 +:10029000643214783C1E1E140A054350534C4B0024 +:1002A0000A0A00556E646566004C6F7765720052ED +:1002B0006169736500426173650A004C415945529A +:1002C000000A0A004D6F640A00436C6D6B005177A1 +:1002D0007274000A0A0080818283848586878889F7 +:1002E0008A8B8C8D8E8F9091929394A0A1A2A3A4BF +:1002F000A5A6A7A8A9AAABACADAEAFB0B1B2B3B436 +:10030000C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF75 +:10031000D0D1D2D3D40000010101010101010101BA +:1003200002020202020202020203030303030303A6 +:100330000304040404040404050505050506060673 +:100340000606070707070708080808090909090A30 +:100350000A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0FD5 +:100360000F10101111111212131314141515161663 +:100370001717181819191A1A1B1B1C1D1D1E1E1FD2 +:100380002020212222232424252626272829292A21 +:100390002B2C2D2D2E2F3031323233343536373849 +:1003A000393A3B3C3D3E3F40414243444546474845 +:1003B000494A4C4D4E4F50515354555658595A5B1B +:1003C0005D5E5F616264656668696B6C6D6F7072BB +:1003D000737577787A7B7D7E8082838587888A8C27 +:1003E0008E8F91939596989A9C9EA0A2A3A5A7A95B +:1003F000ABADAFB1B3B5B7BABCBEC0C2C4C6C9CB52 +:10040000CDCFD1D4D6D8DBDDDFE2E4E7E9EBEEF007 +:10041000F3F5F8FAFDFFFFAA7F5540222325262891 +:10042000292A2C2D2F3032333536383A3B3D3E4089 +:1004300042434547494A4C4E5051535557595A5CCF +:100440005E6062646668696B6D6F71737577797BE6 +:100450007D7F81838587898A8C8E90929496989AE5 +:100460009C9E9FA1A3A5A7A8AAACAEAFB1B3B4B6FA +:10047000B8B9BBBCBEBFC1C2C3C5C6C7C9CACBCC55 +:10048000CDCED0D1D2D2D3D4D5D6D7D7D8D9D9DA28 +:10049000DADBDBDBDCDCDCDCDCDDDDDDDDDCDCDC9D +:1004A000DCDCDBDBDBDADAD9D9D8D7D7D6D5D4D3C5 +:1004B000D2D2D1D0CECDCCCBCAC9C7C6C5C3C2C19A +:1004C000BFBEBCBBB9B8B6B4B3B1AFAEACAAA8A7F7 +:1004D000A5A3A19F9E9C9A98969492908E8C8A89AF +:1004E000878583817F7D7B79777573716F6D6B698C +:1004F00068666462605E5C5A5957555351504E4C61 +:100500004A4947454342403E3D3B3A38363533320F +:10051000302F2D2C2A29282625232207087F08077B +:10052000003E5B4F5B3E003E6B4F6B3E001C3E7CD3 +:100530003E1C00183C7E3C18001C577D571C001CBC +:100540005E7F5E1C0000183C180000FFE7C3E7FF59 +:1005500000001824180000FFE7DBE7FF0030483AEE +:10056000060E00262979292600407F050507004050 +:100570007F05253F005A3CE73C5A007F3E1C1C0883 +:1005800000081C1C3E7F0014227F2214005F5F00C5 +:100590005F5F0006097F017F00006689956A006041 +:1005A000606060600094A2FFA2940008047E0408CA +:1005B0000010207E20100008082A1C0800081C2AB1 +:1005C0000808001E10101010000C1E0C1E0C00302D +:1005D000383E383000060E3E0E06000000000000D7 +:1005E0000000005F000000000700070000147F14F7 +:1005F0007F1400242A7F2A12002313086462003625 +:100600004956205000000807030000001C2241004A +:10061000000041221C00002A1C7F1C2A0008083E02 +:100620000808000080703000000808080808000072 +:1006300000606000002010080402003E5149453E61 +:100640000000427F4000007249494946002141496B +:100650004D33001814127F10002745454539003CE2 +:100660004A494931004121110907003649494936B3 +:1006700000464949291E00000014000000004034D3 +:100680000000000008142241001414141414000087 +:1006900041221408000201590906003E415D594EED +:1006A000007C1211127C007F49494936003E4141CD +:1006B0004122007F4141413E007F49494941007F3D +:1006C00009090901003E41415173007F0808087F74 +:1006D0000000417F4100002040413F01007F08149D +:1006E0002241007F40404040007F021C027F007F8B +:1006F0000408107F003E4141413E007F0909090680 +:10070000003E4151215E007F0919294600264949D2 +:1007100049320003017F0103003F4040403F001F7A +:100720002040201F003F4038403F006314081463FE +:10073000000304780403006159494D4300007F41E0 +:10074000414100020408102000004141417F0004A3 +:10075000020102040040404040400000030708003E +:10076000002054547840007F2844443800384444E2 +:10077000442800384444287F00385454541800005A +:10078000087E09020018A4A49C78007F080404785D +:100790000000447D4000002040403D00007F1028C4 +:1007A00044000000417F4000007C04780478007C15 +:1007B0000804047800384444443800FC1824241801 +:1007C0000018242418FC007C080404080048545431 +:1007D00054240004043F4424003C4040207C001C7E +:1007E0002040201C003C4030403C0044281028445D +:1007F000004C9090907C004464544C4400000836B7 +:1008000041000000007700000000413608000002AF +:1008100001020402003C2623263C000000000000E8 +:1008200000404040F0F8F8FF38FFF8F83FF8F8FFD4 +:1008300038FFF8F8F040404000000000000080C0A1 +:10084000C0C0800000C0C08000000080C0C000C0E8 +:10085000C0000080C0C00000000000C0C0C0C0C018 +:1008600000C0C00000000000000000000000000008 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:1008900000000000000000000000C0F0F8FC3E1E58 +:1008A00006010000007F4141417F007F4141417FBF +:1008B000000080C0E07E5B4F5BFEC00000C000DC3B +:1008C000D7DEDEDED7DC00C0000000000000000044 +:1008D0000000000000000000000000000000000018 +:1008E00000494949FFFFFFFFE0DFBFBF00BFBFDF97 +:1008F000E0FFFFFFFF49494900000000001F3F6083 +:1009000060E0BF1F007F7F071E381E077F7F007FCC +:100910007F0E1F3B716000000000007F7F0C0C0CFD +:10092000007E7E007F7E0303007F7E03037E7E03C6 +:10093000037F7E000F3E703C063C703E0F00327B12 +:1009400049493F7E007F7E0303001E3F69696F2691 +:1009500000000000000000000000030F1F3F3C7873 +:1009600070600000007F4141417F007F4141417F35 +:1009700000307B7F7830202030787F3B0003000FF1 +:100980007F0F0F0F7F0F000300000000000000002A +:100990000000000000000000000000000000000057 +:1009A00000010101070F0F7F0F7F0F0F7E0F0F7FD9 +:1009B0000F7F0F0F07010101000000000000000081 +:1009C0000000010100000000000000000000000025 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A5000000000000000000000000000AF00AE3504 +:100A6000001E001F00200021002200290014001A8F +:100A7000000800150017002B0004001600070009ED +:100A8000000A00E1001D001B00060019000500E33C +:100A900000E200E00002512800A8003500270026EF +:100AA000002500240023002A00130012000C001867 +:100AB000001C00340033000F000E000D000B00E599 +:100AC0000038003700360010001100E700E600E4AF +:100AD0000003512C00000035001E001F00200021E3 +:100AE000002200290014001A00090013000A002B3C +:100AF0000004001500160017000700E1001D001B90 +:100B000000060019000500E300E200E000010028F3 +:100B100000A8003500270026002500240023002A15 +:100B20000033001C0018000F000D00340012000CF0 +:100B300000080011000B00E50038003700360010F7 +:100B4000000E00E700E600E40001002C00000001B8 +:100B5000003A003B003C003D003E0035001E001FF7 +:100B60000020002100220001001E021F022002219D +:100B700002220201002E002D002E022F023002015F +:100B80000001000100010001000100440043004297 +:100B900000410040003F00450027002600250024BA +:100BA000002300310227022602250224022302012B +:100BB0000031003302330030002F0001000100013A +:100BC000000100010001000100010001000100011D +:100BD000000100010049004600650000000000011E +:100BE00000E200E000E1000000390001007A007B33 +:100BF000007C007D000000010001000100010001F7 +:100C00000001000100010001000100010001002AB3 +:100C10000001000100520001004B002A004C004F6F +:100C200000510050004E00010000000100000001D2 +:100C300000000001000100010001000100010009A5 +:100C4000025B00030100A0FA090400000103010196 +:100C5000000921110100012240000705810308005D +:100C60000109040100020300000009211101000133 +:100C7000222200070582032000010705030320004C +:100C80000109040200010300000009211101000113 +:100C90002232000705840320000112010002000037 +:100CA000000832FC87020100010200010C0353001E +:100CB0006F0066006C00650000001A034A006F00B8 +:100CC0007300650066004100640061006D00630010 +:100CD00069006B0000000403090411241FBECFEF5C +:100CE000DAE0DEBFCDBF11E0A0E0B1E0EAE0F8E677 +:100CF00002C005900D92A23EB107D9F726E0A2EE00 +:100D0000B1E001C01D92A330B207E1F70E946A284A +:100D10000C94D3330C940000E8EDF0E080818E7FDA +:100D200080831092E2001092DA001092E100A0EEAF +:100D3000B0E08C9181608C9380818F77808319BC27 +:100D4000A7EDB0E08C918E7F8C9380818F7E808325 +:100D50001092E80508952091E4003091E50095E6B1 +:100D6000A9012091EC00822F817020FF06C08091A4 +:100D7000E80080FF06C080E008952091E80022FD91 +:100D80001AC08091F505882389F0853089F080911B +:100D9000EB0085FD0FC02091E4003091E500421783 +:100DA0005307F9F29150E1F684E0089582E0089546 +:100DB00083E0089581E00895EF92FF920F931F93CF +:100DC000CF937C018B010E94AB06C82F811117C005 +:100DD0008091E80085FD0BC08091E8008E778093BC +:100DE000E8000E94AB06882399F3C82F08C0F701DA +:100DF00081917F018093F1000150110949F78C2FF7 +:100E0000CF911F910F91FF90EF9008958091F7057A +:100E100087FF13C08091E80082FF06C08091E80040 +:100E20008B778093E80004C08091F5058111F2CFA3 +:100E300008958091F5058823D9F38091E80080FF1B +:100E4000F8CF8091E8008E77ECCF982F9093E9004F +:100E5000242F762F50E0891731F07091EC0020910B +:100E6000ED005091F00021FD07C09F5F973071F7B2 +:100E70008093E90081E008953091EB003E7F30934C +:100E8000EB003091ED003D7F3093ED003091EB00B1 +:100E900031603093EB007093EC002093ED005093A1 +:100EA000F0002091EE0027FDE0CF80E00895B0E053 +:100EB000A0E0EDE5F7E00C94A432C8EDD0E0888125 +:100EC0008F7E8883E7EDF0E080818160808384E01D +:100ED00082BF81E08093E80588818E7F888302EE5F +:100EE00010E0F80110821092DA0081EEC82ED12CA9 +:100EF000F601108288818F77888388818068888353 +:100F000088818F7D888319BC1092F5051092F605B3 +:100F10001092F4051092F30590EEE92EF12CF701F2 +:100F200080818B7F808388818160888342E060E05C +:100F300080E00E942507F60180818E7F8083F80182 +:100F4000808181608083808188608083F7018081D7 +:100F50008E7F8083888180618883CDB7DEB7E8E0AB +:100F60000C94C032FC018091FD059091FE0586171E +:100F70009707A0F06115710529F49091E8009E771C +:100F80009093E80090E06115710551F4911108C04B +:100F90008091E80082FF34C080E00895BC01F2CF68 +:100FA0008091F5058823C1F18530C1F18091E80079 +:100FB00083FD30C08091E80082FDEACF8091E80097 +:100FC00080FFE1CF8091F3002091F200382F61156E +:100FD000710519F02830310558F091E028303105BD +:100FE00009F090E02091E8002E772093E800CBCF25 +:100FF00081918093F100615071092F5F3F4FE7CFDE +:101000008091F505882341F0853041F08091E8001A +:1010100083FFBECF81E0089582E0089583E00895C4 +:101020000895089508958091EA05089587E797E760 +:10103000909301088093000888E19AE00FB6F89435 +:10104000A895809360000FBE90936000FFCF2FB7EC +:10105000F8946091E1057091E2058091E30590912B +:10106000E4052FBF08959C01FC0132969FEF80E0BC +:101070004191461751F09F3F19F4411101C0982F3B +:101080008F5F8630A9F79F3F09F40895290F311D1E +:1010900097FD3A95F901628308952091DE0530911C +:1010A000DF052817390781F09093DF058093DE056F +:1010B000E091DC05F091DD05309731F00680F78195 +:1010C000E02DBC0184E0099508952091DA05309166 +:1010D000DB052817390781F09093DB058093DA054B +:1010E000E091DC05F091DD05309731F00680F78165 +:1010F000E02DBC0183E009950895FC01680F791F7C +:101100008FEF91E32191822728E030E087FF09C02B +:10111000880F892721503109C9F7E617F70791F79A +:101120000895880FF7CFFA01811101C0FB010995DD +:101130000895ECEEF2E0118282818460828308954A +:101140008091C403982F9E7F61F4817082608093A8 +:10115000C4038091C703893718F088E78093C703D9 +:1011600008958A34B0F381708864F1CFAF92BF9252 +:10117000DF92EF92FF920F931F93CF93DF93082F8D +:10118000162FE901E42FF0E0EA5EFC4F611110C078 +:10119000E4915E2F4E2F4983E8835A83DF91CF91EC +:1011A0001F910F91FF90EF90DF90BF90AF90089547 +:1011B000E62EF12C4491D42EE42FF0E026E0829F1D +:1011C000C00111242FEF30E0B9010E948632802F38 +:1011D00090E0880F991F55E5569FD001579FB00D9D +:1011E00011248A1B9B0B982F990F890F5901AE1858 +:1011F000BF08AE9ED001AF9EB00DBE9EB00D1124B3 +:101200005B2F189F80011124012F11275901A01A6B +:10121000B10AAE9E8001AF9E100DBE9E100D11242E +:101220005901A81AB108AE9CC001AF9C900DBE9C9C +:10123000900D1124892F9927281B390B2E9FC0014F +:101240002F9F900D3E9F900D1124E92F6230710564 +:10125000A1F050F46115710509F49DCF613071055D +:1012600081F0EB2F512F97CF6430710569F080F03A +:101270006630710509F48FCFF4CFE42F4B2F592F2F +:101280008ACFE42F412F87CFEB2F542F492F83CFC5 +:101290004B2F5D2DE12F7FCF80E00895F894E82F4C +:1012A000E295EF70F0E031A1282F2F7081E090E0FF +:1012B00001C0880F2A95EAF7982F9095932391A360 +:1012C00092A1892B82A37894089590919A0292FF1B +:1012D00006C0282F28712830F9F4877F846093FF97 +:1012E00006C0282F28712831F1F4877E846120916F +:1012F0009B0220FF06C0382F38713830D9F4877F21 +:10130000816021FF06C0282F28712831D1F4877E03 +:10131000816194FD877E0895282F24712430F9F689 +:101320008B7F8860DCCF282F2471243101F78B7EDE +:101330008861DDCF382F3171313019F78E7F8860A9 +:10134000E0CF282F2171213121F78E7E8861E1CFF6 +:10135000CF93DF93EC0182389105B1F108F040C0E2 +:101360008133910509F49DC048F58932910509F44E +:101370008DC08A9709F49CC0C11522E5D20708F0F8 +:10138000BDC0C11531E5D30708F027C1C83ED1055E +:1013900008F0A3C0C13ED10588F5C83AD10508F0D0 +:1013A0008EC0C53AD10508F0F9C0C130D10531F180 +:1013B000209721F1C430D10508F545C0853391054A +:1013C00009F45FC0C997C1F680919A02837009F051 +:1013D0003EC180919B0283FF11C0C9E2D0E00EC0E4 +:1013E000833E910599F170F4803E910501F1823EB2 +:1013F000910511F680919A0282FD21C0CE01DF9104 +:10140000CF910895863E910561F1873E910571F176 +:10141000843E910509F0B0CF80919B0281FFEECF11 +:1014200080919A02C7EED0E084FD0DC0E7CF809195 +:101430009A0280FD33C090919B0290FFDFCFC3EEF4 +:10144000D0E084FFDBCFD0E0C0E0D8CF80919A021B +:1014500082FDFAC090919B0290FDF9C084FFCECF2F +:10146000F2CF80919A0283FDDDCFC8CF80919A029E +:1014700083FDF0C090919B0291FFF0CFC4EED0E0CD +:10148000BDCF80919A0285FFB9CFA7CF80919A02F4 +:1014900085FDE3C080919B0283FFB0CFC9E3D0E01C +:1014A000ADCF80919A0286FFA9CFCAE2D0E0A6CF45 +:1014B00080919A0286FFA2CFC1E3D0E09FCFCF3BBD +:1014C000D10508F6C85AD0E0CC0FDD1FC55ADE4F53 +:1014D0000990D881C02DD46491CFC11540E5D407BF +:1014E00008F067C0C11580E4D80708F05FC0CE01DE +:1014F0009A9581159F4108F481CFA5CFC11536E596 +:10150000D30718F5C11545E5D40708F07FC0C1150C +:1015100084E5D80708F075C09E01237033279C2FFF +:1015200096959695C115D34508F45CC0C1E0D0E00E +:1015300002C0CC0FDD1F2A95E2F730E2939FC00175 +:101540001124C82BD92BDA6859CFC11589E5D807E2 +:1015500068F4C11528E5D20708F063C0C11537E566 +:10156000D30708F070CFDD27D06648CFC1154AE514 +:10157000D40708F45BC0CE0190568115904208F064 +:1015800062CF8D2F8F710E94650990E0982F882778 +:1015900088279F719C012C2BE90141C0C55AD0E0DE +:1015A000C85ADE4FC881D0E0D06428CFDF70D06A3F +:1015B00025CFCE018370992721E030E002C0220FB1 +:1015C000331F8A95E2F7C695C69540E2C49FE001B5 +:1015D0001124C22BD32BDD6811CFDC2FCC27C16F98 +:1015E000D06A0CCFC1E0D0E002C0CC0FDD1F2A953D +:1015F000E2F720E2929FC0011124C82BD92BDC68AE +:10160000FDCEDC2FCC27C46FD06AF8CE8C2F0E9481 +:101610006509C82FD0E0DC2FCC27CC27DF71D06242 +:10162000EDCEDC2FCC27C06FD06AE8CE8C2F8F7028 +:101630000E94650934E0D695C7953A95E1F7CF70D9 +:101640009C2FEC01D069DACEC2EED0E0D7CEC0EE4E +:10165000D0E0D4CEC6EED0E0D1CEC5E3D0E0CECE41 +:101660000E9427080895809153028111109253021D +:101670000895809590915202982390935202089574 +:101680008091470290911602981301C008958F5FD0 +:101690008770FACF292F9A3078F5863068F590E078 +:1016A00036E0239F800D911D1124682F677023E081 +:1016B000969587952A95E1F7FC01EE0FFF1FE80F3D +:1016C000F91FEA50FE4F50E040E080E0219130E009 +:1016D000062E02C0369527950A94E2F7217033272B +:1016E000042E01C0220F0A94EAF7822B4F5F5F4F4E +:1016F0004330510559F7089580E00895292F9A3015 +:1017000098F5863088F590E036E0239F800D911D96 +:101710001124282F277041E001C0440F2A95EAF7D1 +:1017200023E0969587952A95E1F7FC01EE0FFF1FC0 +:10173000E80FF91FEA50FE4F30E020E070E05191D1 +:10174000DF011197CB01022E02C0969587950A946E +:10175000E2F7817081958527842385278C932F5FFD +:101760003F4F2330310559F70895982F92959F7078 +:1017700011F0892F94E0282F2695269511F09E5F71 +:10178000822F869509F09F5F892F0895B0E0A0E031 +:10179000ECECFBE00C94A4326C017B0164E670E09D +:1017A00088E70E94E42FEC0197FD12C010E000E0F2 +:1017B000F601E00FF11F849164E670E00E94503062 +:1017C000EC01892B29F40F5F1F4F0E151F0581F7C0 +:1017D0000E94C630CE01CDB7DEB7E8E00C94C0322F +:1017E0008091D8059091D905911103C091E0892786 +:1017F0000895882369F062E070E08DE59AE00E9428 +:10180000C60B892B19F08091D80508951092D80540 +:101810008091D805EBCFCF93C091D8058091D905A1 +:101820008823D1F00E942708605A75418F4F9F4F3F +:101830006093D4057093D5058093D6059093D70512 +:10184000C11108C062E070E08BE59AE00E94C60B0F +:10185000892B29F0C091D8058C2FCF91089581E074 +:101860008093D805F7CF8093E5057093E7056093E3 +:10187000E6058091F5058430F9F48093E9008FEF57 +:101880009091E800815095FD06C095ED9A95F1F78D +:1018900000008111F5CF8091E80085FF0DC050E078 +:1018A00040E063E070E085EE95E00E94DC06809108 +:1018B000E8008E778093E8000895CF93DF93EC01E2 +:1018C00081E08093E9008FEF9091E800815095FDD1 +:1018D00006C095ED9A95F1F700008111F5CF809142 +:1018E000E80085FF14C050E040E068E070E0CE0101 +:1018F0000E94DC068091E8008E778093E80088E003 +:10190000FE01ABEEB5E001900D928A95E1F7DF9113 +:10191000CF910895609153018091C40380FF20C04E +:101920008091520143E0849FC00111248E509D4F4D +:10193000539A2BB1277F3BB138605FB7F894FC0115 +:10194000649FE00DF11D1124BF0168177907D1F4E0 +:101950005FBF8FE594E00197F1F700C000000895A4 +:10196000809154019091550123E0829FF001112450 +:10197000EE50FD4F8917A0F61182108212828F5F00 +:101980003396F8CFFC014191CF01E8E03BB900006C +:1019900000C047FF2BB9440F000000C000C000C0CA +:1019A0002BB900C0EA9591F7D0CF0F931F93CF9337 +:1019B000DF93EC0110E000E09091560190171106C2 +:1019C00009F06CF40E948A0C8C8190E00196817081 +:1019D00099278C83DF91CF911F910F9108952091CA +:1019E0005401A801420F511D9A01220F331F240FE9 +:1019F000351F2E503D4F4C816091C6038091C50329 +:101A000096959017110669F064F0442361F04091B7 +:101A1000C703493708F048E70E94B6080F5F1F4F19 +:101A2000CBCF4423A1F340E0F7CFB0E0A0E0EBE15F +:101A3000FDE00C94A032EC014C81042F10E09801E1 +:101A4000D8010E9436339B01AC010E944C334B01FC +:101A50005C01E0E2F0E0E01BF10BA5E5B0E0AC01D9 +:101A60009B010E944C336B017C019F01DF010E94AE +:101A70002E339B01AC010E9457339B01AC01280D12 +:101A8000391D4A1D5B1DC701B6010E94FF32F22EAF +:101A9000822F90E039E23F1520F143E0249F90012E +:101AA000112435952795122F109500E085E5E82E35 +:101AB000EF1880915601081718F10E948A0C9C813A +:101AC00081E0992319F0903219F48FEF809351013E +:101AD00080915101890F8C83CDB7DEB7ECE00C9477 +:101AE000BC3225E530E0B901681B790B9B01220F60 +:101AF000331F260F371F37FFD4CF2F5F3F4FD1CF74 +:101B00008E2D01FD8F2D20915401622F600F7727BC +:101B1000771F9B01220F331F260F371F2E503D4F7B +:101B2000412F193708F048E76091C6030E94B608B4 +:101B30000F5FBFCFEF92FF920F931F93CF93DF936F +:101B4000EC018C81811109C081E08C831092F0023C +:101B500092E09093500180934F01809154019091B5 +:101B6000550123E0829FF0011124EE50FD4F8917AB +:101B700058F110E003E060915601161758F10E94E9 +:101B80008A0C80914F012091F002280F2093F002DF +:101B900090915001980F90935001191654F4022E11 +:101BA000000C330B409156014150550B241735075B +:101BB00034F0819580934F01813009F41C82CDB7B8 +:101BC000DEB7E6E00C94C2321182108212828F5F7F +:101BD0003396CDCFE12EF12C70E0C7010E94EB329D +:101BE00020915401820F482F50E02091F002022EE4 +:101BF000000C330BE216F306D4F020915001022EB4 +:101C0000000C330B2E153F0594F0809F900111249A +:101C10002E503D4F4091C703493708F048E7609187 +:101C2000C6038091C5030E94B6081F5FA4CFFA01C6 +:101C3000EE0FFF1FE40FF51FEE50FD4F11821082D3 +:101C40001282F3CFB0E0A0E0E8E2FEE00C94A03214 +:101C5000EC018A81BB24BA9480FD02C0BB24B394FA +:101C6000A09056018C81811109C081E0B81220C07A +:101C70008FEF8A0D8093EF0281E08C83F12CE12CB1 +:101C800046E4842EEA14B8F00E948A0C8091EF0298 +:101C900091E0B9125AC0811153C080915601815010 +:101CA0008093EF021C82CDB7DEB7ECE00C94BC321F +:101CB0001092EF02E1CF009154010E0D1F2D111D66 +:101CC000C801880F991F080F191F0E501D4FF801EA +:101CD00011821082128234E0C32ED12C912C80917B +:101CE000EF02890D873444F1682D0E94DD32892F7F +:101CF000082E000C990B8E159F05A9F48091C7033F +:101D00008C9DA0018D9D500D11245595479555959D +:101D10004795493708F048E798016091C6038091DC +:101D2000C5030E94B6089B0CF1E0CF1AD108B9F6A2 +:101D30008FEFE81AF80AA6CF87FFDACF8A0DD8CF3F +:101D400081508093EF02BC82AECF90E0019660910B +:101D5000560170E00E94EB328093EF028C83A3CF98 +:101D6000EF92FF921F93CF93DF93EC0110E0EE24EC +:101D7000EA94F12C60915601161770F00E948A0CBB +:101D80009A818C8190FF2AC08F5F8C83DF91CF91E5 +:101D90001F91FF90EF90089520915401422F410F21 +:101DA0005527551FCA019A01220F331F280F391FCB +:101DB0002E503D4F4091C703493708F048E770E087 +:101DC000C7010E94EB32962F8C816091C603199F48 +:101DD000800D11240E94B6081F5FCCCF8150D5CF53 +:101DE0009091C40390FF0EC0909154012091550131 +:101DF00033E0939FF0011124EE50FD4F921718F03D +:101E00000E948A0C08958183608342839F5F33968A +:101E1000F5CFA3E0B0E0EFE0FFE00C94A8328C0136 +:101E20008091F10281110AC09E012F5F3F4F48E768 +:101E30006FEF0E94B6088A818093F102F8016481F5 +:101E4000613069F08091F10240E0662361F040E08A +:101E5000623011F44091F10280E060E004C06091D2 +:101E6000F10240E080E00E94F00EF801848190E0F1 +:101E7000019663E070E00E94EB3284832396E4E0F5 +:101E80000C94C432A3E0B0E0E8E4FFE00C94AA3282 +:101E90009091C40390FF0DC0493708F048E79E01B8 +:101EA0002F5F3F4F0E94B6084B8169818A810E9453 +:101EB000F00E2396E2E00C94C632CF93DF93EC0150 +:101EC000E4ECF3E0438162818C810E94420F8C81BB +:101ED0008F5F8C83DF91CF910895CF93DF93EC01D7 +:101EE000EC81F0E0E55EFB4F4491E4ECF3E06281CD +:101EF00081810E94420F8C818F5F8C83DF91CF9113 +:101F00000895E4ECF3E080818E7F80830E9499083D +:101F1000ECEEF2E08281816082832FEF80E792E035 +:101F2000215080409040E1F700C000000E948A0CE0 +:101F30000895B0E0A0E0EFE9FFE00C94A2327C014C +:101F40005B016A018091890201E010E08A3010F49F +:101F50000AE010E0C1E0D0E0B501C701F601099543 +:101F6000811104C021960C171D072CF4CDB7DEB7E4 +:101F7000EAE00C94BE32CC9F9001CD9F300D300D25 +:101F8000112490E080E045E34A95F1F700000196C6 +:101F900082179307C1F7E0CF80915F02811110C0D3 +:101FA0008091D80080618093D8008AE18A95F1F70A +:101FB00000C08091D90080FF0AC081E080935F0259 +:101FC00081E090915F02913009F080E0089582E015 +:101FD00080935F020E948C061092F505F1CF0E945B +:101FE000CC0F882359F0E091DC05F091DD053097A6 +:101FF00029F00190F081E02D0995089580E0089581 +:102000000F931F930E94CC0F882329F00E9427086A +:102010001F910F9108950E94270800918A02109144 +:102020008B0220918C0230918D02600F711F821FF4 +:10203000931FEECFCF93DF93C7E0D2E060E0CE01F5 +:102040000E949F332196C11584E0D807B9F7DF912C +:10205000CF9108951F93CF93DF93122F8430E0F434 +:102060006A30D0F44630C0F4C42FD0E0CC0FDD1F6E +:102070009CE0699FC00DD11D112498E7899FC00D78 +:10208000D11D1124632FCE0187960E949F33612FAB +:10209000CE0188960E949F33DF91CF911F910895C2 +:1020A000AF92BF92CF92DF92EF92FF921F93CF93A6 +:1020B000DF938FE5C82E8AE0D82ED0E07601C0E00D +:1020C00014C0F50125913491412F6C2F8D2F0E9462 +:1020D0002A1082E0A80EB11C1F5F163091F78CE029 +:1020E000E80EF11CCF5FCA3019F0570110E0E9CFBC +:1020F000DF5F88E7C80ED11CD43001F7DF91CF91A4 +:102100001F91FF90EF90DF90CF90BF90AF90089518 +:10211000CF93C82F6FEF811162E283E290E00E94BB +:102120009F336FEFC11169E084E290E00E949F331A +:102130006FEFC11165E285E290E00E949F33CF917D +:10214000089580E00E94881060E086E290E00E949E +:102150009F330E9450100E941A1081E00E94881044 +:1021600008950F931F93CF93DF93843030F56A3037 +:1021700020F5463010F5C42FD0E0CC0FDD1F2CE049 +:10218000629FC00DD11D112438E7839FC00DD11D62 +:102190001124CE0187960E948B33082F10E0102F58 +:1021A0000027CE0188960E948B339801282BC90105 +:1021B000DF91CF911F910F91089590E080E0F8CFCB +:1021C000462F843040F47A3030F4663020F4672FA4 +:1021D0000E94B110089590E080E00895CF92DF92C0 +:1021E000FF920F931F93CF93DF936C010091020630 +:1021F00080915402082BC7E0D0E010E0FC2EC8010B +:102200000C2E02C0959587950A94E2F780FD0CC0CC +:102210002197A0F7F12C8F2DDF91CF911F910F9176 +:10222000FF90DF90CF900895B6018C2F0E94E010B0 +:102230000E94A809019761F3EECFCF93DF93EC01E1 +:102240000E94EE10BE010E94E0100E94A809DF91DA +:10225000CF910895FC0183819481892B29F080819D +:10226000918189238F3F51F480E00895843FE1F705 +:1022700017C0883EA8F0813FB9F712C080819181D4 +:102280000E941D1192959F70963099F358F4925FB9 +:102290009F70923048F7803F19F040F7883E20F752 +:1022A00081E008959A5FF4CF83E290E00E948B333F +:1022B000823289F484E290E00E948B33893059F4B1 +:1022C00085E290E00E948B3391E0853209F090E046 +:1022D000892F8170089580E0FCCFCF9384E090E057 +:1022E0000E948B33C82F82E290E00E948B33982F9C +:1022F0008C2FCF9108958091520290915102892B99 +:102300008093E40190915302992391F0892B80935B +:10231000E40120E086EE91E0FC013191CF01311122 +:102320002F5FF1E08C3E9F07B9F721110E94330B1C +:1023300048E050E069E472E084EE91E00E94753379 +:10234000892BA9F088E0E4EEF1E0A9E4B2E0019085 +:102350000D928A95E1F7E091DC05F091DD0530976B +:1023600031F00280F381E02D84EE91E0099508952B +:1023700090E080E00E94650890E080E00E944D08B7 +:10238000109251020E947B110895809302060E94D0 +:10239000B811089580910206982F9670963021F416 +:1023A00088600E94C5110895877FFBCF21E030E04F +:1023B00001C0220F8A95EAF72095809102068223B8 +:1023C0000E94C511089590914802809589238093B9 +:1023D0004802282F277091F4282F082E000C330B69 +:1023E0009217130659F090919B0292FF07C08595B2 +:1023F000859585950E94D611109248020895CF9335 +:10240000C0919B02C2FB992790F9981791F080FB2D +:10241000C2F9C0939B0260919A0284E090E00E940E +:102420009F336C2F82E290E00E949F3382E00E94F3 +:10243000E311CF91089521E030E001C0220F8A9589 +:10244000EAF780910206822B0E94C51108958093BD +:1024500054020E94B8110895882321F00E94390B7C +:102460000E947B110895882339F090915202982B95 +:10247000909352020E947B110895882391F19CEF62 +:10248000980F913A80F4E6EEF1E02CEE31E0919174 +:10249000891303C0DF0111971C922E173F07B9F76C +:1024A0000E947B11089590E2980F983050F4877045 +:1024B00091E001C0990F8A95EAF7892F0E94390BA4 +:1024C000EFCF9BE5980F933028F490E080E00E94D6 +:1024D00065080895885A873120F490E080E00E94D2 +:1024E0004D080895CF93C82F8823B1F08CEF8C0F3F +:1024F000813A00F5E6EEF1E08CEE91E0DF012D91FE +:10250000C21761F08A179B07D1F76C2F84EE91E018 +:102510000E9433080E947B11CF9108952191C2132C +:1025200003C0DF0111971C928E179F07B9F70E9415 +:102530007B11EBCF80E28C0F883068F4C77021E00C +:1025400030E001C0220FCA95EAF780915202822B37 +:1025500080935202DFCFEBE5EC0FE33040F4F0E084 +:10256000E85AFE4F808190E00E946508D5CFC85A96 +:10257000C73190F6EC2FF0E0EE0FFF1FE55AFE4F4B +:10258000808191810E944D08C7CF1F93CF93DF9325 +:10259000182FCAE0D0E0893311F4C0E5D0E0812FD4 +:1025A0000E9472128FE99FE00197F1F700C00000CE +:1025B0002197C1F7812F0E943D12DF91CF911F918A +:1025C00008951F93CF93DF93162F8A3039F481E05B +:1025D0000E948413DF91CF911F9108958D3011F4E3 +:1025E00080E0F6CFC091D205D091D30596E0FE01F0 +:1025F000ACECB5E001900D929A95E1F7803E90F138 +:1026000086E0FE0111928A95E9F7C091D205D0913A +:10261000D305111133C046E050E0BE018CEC95E0CB +:102620000E9475339E012C5C3340892B91F52A5F03 +:102630003F4F4091C903642F70E0C9010E94863268 +:10264000481B463010F4240F311D211572E0370766 +:1026500010F030E020E024533C4F3093D30520931A +:10266000D205B8CFF6E08F9FB0011124655E7A4F96 +:1026700046E050E0CE010E945F33C7CF9E012A5F43 +:102680003F4FFE012E173F0731F2808180958193E5 +:10269000F9CFC90145E0969587954A95E1F741E064 +:1026A00050E0BA0102C0660F771F8A95E2F7CB01AE +:1026B0006091CA037091CB03862B972BB9016B5F96 +:1026C0007F4FE5E076956795EA95E1F702C0440F04 +:1026D000551F6A95E2F7842B952B9093CB0380933B +:1026E000CA03A5CF1F93CF93DF93EC01162FFE01F2 +:1026F0008491811104C0DF91CF911F910895612FC2 +:102700000E94E1122196F3CFCF93382FE091D205AA +:10271000F091D305EC5CF3402091C903622F70E087 +:10272000CF010E948632281B822F332369F066E096 +:102730000E94D132C82FC15010F4CF91089560E0AB +:1027400080E20E94E112F7CF9F01280F311D211571 +:10275000324018F080E0F0E0E0E08E0F9F2F911DF6 +:1027600084539C4F9093D3058093D205E6CF0E946B +:10277000721381E00E948413089510925202E6EED3 +:10278000F1E086E0DF011D928A95E9F70E94B81119 +:102790000895AAE2B0E0EFECF3E10C94A93287EFE0 +:1027A00095E02091F100DC012D93CD01B5E08F3F44 +:1027B0009B07B9F78091F805833009F472C0B8F42B +:1027C000813009F449C0823009F4B3C08091E80037 +:1027D00083FF8BC28091F7059091F8059A3008F03D +:1027E00084C2E92FF0E0EB52FC4C0C9421338A3088 +:1027F00009F48EC08B3009F471C0893039F78091AB +:10280000F705813219F78091FB059091FC0500973F +:1028100011F00297D9F68091E800877F8093E80055 +:102820008091E80082FF38C09091F3008091F2001F +:10283000029731F48091F100813011F0863021F45B +:102840008091F1008093EA058091E8008B77809376 +:10285000E8000E940607BACF8091F705813A09F097 +:10286000B5CF8091E800877F8093E8008091FB05D9 +:102870009091FC05892B61F468E08BEE95E070E0A7 +:102880000E94B2078091E8008B778093E8009ECF8A +:1028900060E090E080E0F3CF8091F5058111C0CF3A +:1028A00095CF8091F705813A09F090CF8091FB0593 +:1028B0009091FC05892B09F089CF8091E800877FF2 +:1028C0008093E8008091E80080FFFCCF8091570161 +:1028D0008093F1008091E8008E77B9CF8091F70561 +:1028E000813209F073CF8091FB059091FC05892B13 +:1028F00009F06CCF8091E800877F8093E8000E9408 +:1029000006078091F905809357010E94BD135ECFA1 +:102910008091F705813209F059CF8091E800877FD7 +:102920008093E8000E9406078091FA058093E905EC +:102930004DCF8091F705813A09F048CF8091E800AA +:10294000877F8093E8008091E80080FFFCCF809132 +:10295000E905BECF803899F0823809F0C6C1809170 +:10296000FB058F70873008F0C0C18093E90080912B +:10297000EB0085FB882780F91092E90006C0809162 +:10298000F3059091F405911182609091E800977F92 +:102990009093E8008093F1001092F1008091E8009C +:1029A0008E779FC1882309F48DC1823009F09DC1C3 +:1029B0008091F905811190C18091FB058F702FEFF7 +:1029C000280F263008F091C18093E9002091EB0098 +:1029D00020FF82C1933031F48091EB0080628093BC +:1029E000EB007AC19091EB0090619093EB0021E0B5 +:1029F00030E001C0220F8A95EAF72093EA00109296 +:102A0000EA008091EB008860EACF81116EC11091DD +:102A1000F9051F778091E3008078812B8093E30094 +:102A20008091E800877F8093E8000E9406078091EC +:102A3000E80080FFFCCF8091E30080688093E30092 +:102A400082E0111183E08093F5054FC180588230F8 +:102A500008F04BC12091F9053091FA052C3DE3E0D7 +:102A60003E07A1F583E08A838AE289834FB7F89411 +:102A7000DE01139620E03EE051E2E32FF0E05093B8 +:102A80005700E49120FF03C0E295EF703F5FEF70C5 +:102A90008E2F90E0EA30C0F0C7968D939D932F5F04 +:102AA000243159F74FBF8091E800877F8093E80079 +:102AB0006AE270E0CE0101960E94B2078091E800C0 +:102AC0008B778093E80011C1C096E7CF8091FB051A +:102AD0009091FC05432F55274330510509F44AC016 +:102AE00078F54130510509F47AC08BE590E0EFE3C9 +:102AF000FCE04230510509F0F8C02091E800277F42 +:102B00002093E8002091FD053091FE058217930780 +:102B100008F49C0140E02115310509F065C0411120 +:102B200063C08091E80082FDC9CF8091F5058823BC +:102B300029F2853019F28091E80083FFF2CFBECFF1 +:102B40004132510509F43CC04232510509F0CDC073 +:102B50008330910508F0C9C0FC01EE0FFF1FEA5257 +:102B6000FE4F0190F081E02D8D529E4FDC018C9143 +:102B700090E01AC0332721303105D1F021153105FD +:102B800061F02230310509F0B0C0ECEAFCE0E491DC +:102B90008E2F90E0ECEAFCE007C0E6EDFCE0E4916B +:102BA0008E2F90E0E6EDFCE0009709F49EC0A5CFE3 +:102BB000EAEBFCE0E4918E2F90E0EAEBFCE0F4CF4E +:102BC0008330910508F091C0880F991FFC01E452F1 +:102BD000FE4F0190F081E02D89E090E08ECF82E100 +:102BE00090E0EAE9FCE089CF8091F505882309F4BB +:102BF00065CF853009F462CF8091E80083FD5ECF18 +:102C00008091E80082FD8DCF8091E80080FF83CF26 +:102C10009091F3008091F2002115310519F0883070 +:102C2000910550F041E0089709F040E08091E800FC +:102C30008E778093E8006FCF44914093F1003196F6 +:102C4000215031090196E8CF803809F04EC08091BB +:102C5000E800877F8093E8008091F6058093F1007B +:102C60009DCE811142C01091F9051230F0F580918E +:102C7000E800877F8093E8001093F6050E9406071E +:102C8000112311F084E005C08091E30087FDFACFA5 +:102C900081E08093F50542E061EC81E00E94250728 +:102CA00042E261EC84E00E94250742E261EC82E0AE +:102CB0000E94250742E260EC83E00E942507809194 +:102CC000F50513C08091F905813079F481E09330E6 +:102CD00009F080E08093F4051092E9008091E8000B +:102CE000877F8093E8000E9406078091E80083FFB9 +:102CF0000AC08091E800877F8093E8008091EB0014 +:102D000080628093EB00AA96E3E00C94C5320E94A7 +:102D1000BD132FEF84E39CE0215080409040E1F709 +:102D200000C0000088E19AE00FB6F894A89580935F +:102D300060000FBE90936000FFCFCF92DF92EF92C2 +:102D4000FF926B017C010E94A008B701A60188E0F8 +:102D500090E00E94B133FF90EF90DF90CF90089504 +:102D6000A3E0B0E0E6EBF6E10C94A332F82ED62E09 +:102D7000042FC22E9091C40390FF3EC0E92FE69528 +:102D8000AE2FB0E0A255BE4F8C918093EC029E7F97 +:102D90009230B1F5493708F048E79E012F5F3F4F69 +:102DA0006D2D8F2D0E94B6084B8169818A810E940A +:102DB000F00E8091C5038F1108C08091C6038D115C +:102DC00004C08091C703801729F08091EE028260D1 +:102DD0008093EE02F092C503D092C6030093C7031E +:102DE000CC2051F06091C4037091C5038091C6035B +:102DF0009091C7030E949D162396E9E00C94BF3280 +:102E0000823019F40091C703D4CF863019F4F090C2 +:102E1000C503CFCF8930D9F3893159F6E9516E2FE7 +:102E20006170B62EE695F0E0EA5EFB4F1491E12C5E +:102E300060915601E61618F00E948A0CBACFE19E06 +:102E4000C001112470E00E9486328F2DB11017C08E +:102E5000860F20915401622F6E0D7727771F9B01FB +:102E6000220F331F260F371F2E503D4F402F09379B +:102E700008F048E76D2D0E94B608E394D9CF861B71 +:102E8000E8CFE4ECF3E0438121E1421B08F440E0A9 +:102E900021E0628181810E94B0160895E4ECF3E0A4 +:102EA000438121E1420F08F44FEF21E062818181EB +:102EB0000E94B0160895E4ECF3E0628121E1621B08 +:102EC00008F460E021E0438181810E94B0160895FA +:102ED000E4ECF3E0628121E1620F08F46FEF21E09E +:102EE000438181810E94B0160895E4ECF3E0818172 +:102EF00021E0438162818A500E94B0160895E4EC7B +:102F0000F3E0818121E043816281865F0E94B016F7 +:102F100008958091C803882319F081508093C803D5 +:102F20006091C4037091C5038091C6039091C7035B +:102F30000E949D1608958091C803833018F48F5F16 +:102F40008093C8036091C4037091C5038091C60348 +:102F50009091C7030E949D160895E4ECF3E083E08E +:102F6000808311828FEF828388E783831482ACEEA3 +:102F7000B2E012968C911297836012968C936081C6 +:102F80007181828193810E949D16089568EE7EEF83 +:102F900090E080E00E94BD3360E082E090E00E941B +:102FA0009F3360E083E090E00E949F3310925402D0 +:102FB00060E084E090E00E949F3364E082E290E071 +:102FC0000E949F3360E085E090E00E949F3360E0C4 +:102FD00086E090E00E949F336FEF87E090E00E94D0 +:102FE0009F3340E050E0BA0188E090E00E94B133A6 +:102FF00060E08DE090E00E949F3340E050E0BA0135 +:1030000088E190E00E94B13360E087E190E00E94A7 +:103010009F3340E050E0BA018CE190E00E94B13370 +:1030200070E060E080E290E00E94BD3340E050E05C +:10303000BA0188E190E00E94B13380E00E948810DC +:103040000E94A11040E050E0BA018FE090E00E94A1 +:10305000B13340E050E0BA0183E190E00E94B13327 +:103060000895A8E0B0E0E7E3F8E10C94AA3285E027 +:10307000E4ECF3E0DE01119601900D928A95E1F700 +:103080008091EC029091ED02A091EE028E839F83DD +:10309000A887288540918502509186026091870219 +:1030A000709188023FB7F8948091E1059091E20514 +:1030B000A091E305B091E4053FBF841B950BA60BDF +:1030C000B70B84369105A105B10510F4222319F13F +:1030D0008091290190912A018F589D4F409128019C +:1030E00050E04930510510F048E050E0BE016F5FFC +:1030F0007F4F0E94823385E090E00E941032882347 +:1031000069F00E942708609385027093860280937D +:103110008702909388021092EE0281E02896E2E006 +:103120000C94C632A4E0B0E0E8E9F8E10C94A932CE +:1031300040916D0250916E0260916F027091700229 +:103140002FB7F8948091E1059091E205A091E305F5 +:10315000B091E4052FBF841B950BA60BB70B11E0B4 +:1031600084369105A105B10570F10E9400106E5FD3 +:103170007F4F8F4F9F4F69837A838B839C8380918E +:103180002101909122018F589D4F4091200150E0E4 +:103190004530510510F044E050E0BE016F5F7F4FB5 +:1031A0000E94823384E090E00E941032182F88231E +:1031B00051F00E94270860936D0270936E02809315 +:1031C0006F0290937002812F2496E3E00C94C53235 +:1031D0004F925F927F928F929F92AF92BF92CF92C7 +:1031E000DF92EF92FF920F931F93CF93DF930F9293 +:1031F000CDB7DEB7C62E4A015901482E880F5508B3 +:10320000C2010E941032782E882309F480C0C201C6 +:1032100033E0880F991F3A95E1F7FC01E050FF4F2A +:10322000438150E04115510511F041E050E08050DC +:103230009F4FFC01648175816F587D4FCE010196CF +:103240000E948233F40140815181628173812FB7E2 +:10325000F8948091E1059091E205A091E305B09189 +:10326000E4052FBF841B950BA60BB70B8436910585 +:10327000A105B10540F4B701C8010E947D089981FC +:10328000891709F444C00C2C000CDD08C6010E940B +:103290001032782E811113C0712C872D0F90DF9181 +:1032A000CF911F910F91FF90EF90DF90CF90BF9043 +:1032B000AF909F908F907F905F904F900895C60140 +:1032C00023E0880F991F2A95E1F7FC01E050FF4F9A +:1032D000438150E0E416F50608F4A70180509F4FA3 +:1032E000FC01648175816F587D4FC5010E94823356 +:1032F000B701C8010E947D0899818913CDCF0E9432 +:103300002708F4016083718382839383C6CFA7016A +:10331000B801C5010E948233C0CFA1E0B0E0E3E96B +:10332000F9E10C94A332EE24E394F12C08E712E0C7 +:103330009E012F5F3F4F49E652E063E082E00E942A +:10334000E818C82E882339F1D12C80E01DC00091E7 +:103350009E020D0D202F30E0A90141555D4F7A01ED +:10336000E1E0F0E0EC0FFD1FED0DF11D1081FA0121 +:103370009081191BB12E1B149CF0912F17FD90E02A +:10338000191B11111CC0D39490919D02D916F8F20B +:1033900081110E94300B8C2D2196E9E00C94BF32F4 +:1033A000BA94F70180818F5F80838AEA002319F045 +:1033B000013019F48BE40E94C5128C2DDCCF1F5F05 +:1033C000F70180818150808389EA002319F0013060 +:1033D00019F48EE40E94C5128C2DD3CFA5E0B0E085 +:1033E000E4EFF9E10C94A4326B0185E0E82EF12CB6 +:1033F00002E712E09E012F5F3F4F45E652E061E099 +:1034000080E00E94E818882349F095E0FE0131969B +:10341000A0E6B2E001900D929A95E1F795E0E0E622 +:10342000F2E0D60101900D929A95E1F72596E8E039 +:103430000C94C03290E080E00E949933883E9E4F09 +:1034400019F40E945411089580E008951F920F927C +:103450000FB60F9211242F933F934F935F936F9367 +:103460007F938F939F93AF93BF93CF93DF93EF930C +:10347000FF93D091E900DF708091EC00C82FC170FC +:1034800080FDC0E81092E9008091F000877F809372 +:10349000F00078940E94C9131092E9008091F00026 +:1034A00088608093F000CD2BCF70C093E900FF912E +:1034B000EF91DF91CF91BF91AF919F918F917F91CC +:1034C0006F915F914F913F912F910F900FBE0F9091 +:1034D0001F9018951F920F920FB60F9211242F93E1 +:1034E0003F934F935F936F937F938F939F93AF938C +:1034F000BF93EF93FF938091E10082FF09C0809119 +:10350000E20082FF05C08091E1008B7F8093E100A3 +:103510008091DA0080FF24C08091D80080FF20C015 +:103520008091DA008E7F8093DA008091D90080FF4D +:103530009DC080E189BD82E189BD09B400FEFDCF57 +:1035400081E08093F5058091E805811109C00E9412 +:103550008C060E9457078091E20084608093E2000D +:103560008091E10080FF17C08091E20080FF13C0CE +:103570008091E2008E7F8093E2008091E200806182 +:103580008093E2008091D80080628093D80019BCBB +:1035900085E08093F5058091E10084FF2BC0809148 +:1035A000E20084FF27C080E189BD82E189BD89B541 +:1035B000982F917080FFFBCF8091D8008F7D8093F2 +:1035C000D8008091E1008F7E8093E1008091E2003D +:1035D0008F7E8093E2008091E20081608093E20020 +:1035E0008091F605882309F447C084E08093F505AF +:1035F0008091F5058091E10083FF27C08091E20072 +:1036000083FF23C08091E100877F8093E10082E007 +:103610008093F5051092F6058091E1008E7F8093EE +:10362000E1008091E2008E7F8093E2008091E200D1 +:1036300080618093E20042E060E080E00E94250724 +:103640008091F00088608093F000FF91EF91BF912E +:10365000AF919F918F917F916F915F914F913F912A +:103660002F910F900FBE0F901F90189519BC1092BC +:10367000F5051092E80574CF8091E30087FD93E093 +:103680009093F505B5CF78941F921FB61F92112421 +:103690008F939F93AF93BF938091E1059091E20543 +:1036A000A091E305B091E4050196A11DB11D8093A1 +:1036B000E1059093E205A093E305B093E405BF9183 +:1036C000AF919F918F911F901FBE1F9018959C01E5 +:1036D0004FB7F8948091E1059091E205A091E30540 +:1036E000B091E4054FBF821B930B08952FB7F89458 +:1036F0008091E1059091E205A091E305B091E40588 +:103700002FBF08950F931F93CF93DF93C62FD42F0E +:10371000022FFC0182818823A9F0609301060E9498 +:10372000761B909300068093FF05C77081E001C06F +:10373000880FCA95EAF70E943312DF91CF911F914B +:103740000F91089580910106681332C08091FF05A2 +:10375000909100060E94671B8436910548F510E29F +:103760001D0FCD17B9F080E28C0F883040F4C77080 +:1037700081E001C0880FCA95EAF70E942C12183028 +:1037800048F481E09D2F977001C0880F9A95EAF761 +:103790000E943312802F0E94C512183070F6D77025 +:1037A00081E001C0880FDA95EAF70E942C12C5CF9C +:1037B000C77081E001C0880FCA95EAF7F6CF0E9472 +:1037C000CC0F882319F00E94761B08950E940010E8 +:1037D000CB0108956091C403669570E04BE050E022 +:1037E00084E491E00E946833892B19F481E080938E +:1037F000ED020E94DF1B9093E7028093E602809126 +:10380000EE0284608093EE0208959091C40390FFCD +:1038100031C0917081112FC092609093C403809148 +:10382000EE0281608093EE02662351F06091C40342 +:103830007091C5038091C6039091C7030E949D16A5 +:103840006091C403669570E04BE050E084E491E041 +:103850000E946833892BB1F00E94990881E080931F +:10386000E90220E04091C7036091C6038091C5033F +:103870000E94B0160895853210F09864CECF880F5C +:10388000982BCBCF0E94EA1BE9CF8091C403869589 +:10389000815009F484E261E00E94051C0895809142 +:1038A000C40386958F5F853208F081E061E00E9455 +:1038B000051C08959091C40390FF08C09695981731 +:1038C00028F0961718F40E944F1C089561E00E949A +:1038D000051C0895A5E0B0E0E0E7FCE10C949B3204 +:1038E0008C01FC0183819481892B31F0808191814D +:1038F00089238F3F09F076C62596E1E10C94B73213 +:103900000E94EE10F82E682F89819A810E947E0B0A +:1039100069817A818F2D0E94E0107C01F8018281FB +:10392000882309F425C6970122513F4520313105EE +:1039300008F04BC68FEF93E00E948B33811128C0B3 +:10394000FEEEEF0E57E0852E52E0952EE11032C0CC +:103950001C821B82442443944AE0342E74018FEF6E +:10396000E81AF80AC4010E948B3389831A828823DB +:1039700079F09FEF980F933058F58A83498292E04F +:10398000890E911CC7010E948B338B83811121C04A +:1039900080914802877009F4AFCFF80182818823B3 +:1039A00009F4AACF80919B0282FFA6CF82E00E94F9 +:1039B000E311A2CF811424E0920651F3C4010E94C6 +:1039C0008B33811101C0EA943FEF831A930ABECF73 +:1039D0004701FE0131967F01F7012081222309F47E +:1039E000BDCF213009F058C081818130B1F4670129 +:1039F000F2E0CF0ED11CF70182810E94C512760140 +:103A00002FEFE21AF20A8BE0815031F3EFE9FFE089 +:103A10003197F1F700C00000F7CF823049F4670119 +:103A2000F2E0CF0ED11CF70182810E947212E7CF23 +:103A3000833049F46701F2E0CF0ED11CF701828197 +:103A40000E943D12DCCF843021F0FFEFEF1AFF0A15 +:103A5000D7CF2281C70102967C0190E080E0A701C8 +:103A60004F5F5F4F2053330B2A30310548F00197E9 +:103A700038F2EFE9FFE03197F1F700C00000F7CF2F +:103A8000389EB001399E700D1124C901860F971F11 +:103A9000F70121817A01E3CFE22FF0E0E851FE4FF8 +:103AA0005490822F86958695869590E0FC01E85289 +:103AB000FE4F64902770712C022E02C0759467949B +:103AC0000A94E2F731E063227724FC01E853FE4FC9 +:103AD000A490B12C022E02C0B594A7940A94E2F7E8 +:103AE000E1E0AE22BB24FC01E854FE4FC490D12C8F +:103AF00002C0D594C7942A95E2F7F1E0CF22DD24E5 +:103B00006114710419F081EE0E947212A114B104C3 +:103B100019F086EE0E947212852D0E94C512A11422 +:103B2000B10419F086EE0E943D126114710419F07F +:103B300081EE0E943D12C114D10409F461CF8CE2E0 +:103B40000E94C5125DCF81E00E941B120E94CA1123 +:103B50001FCF81E00E94D611F9CF82E0FBCFF5EFB5 +:103B6000EF16FCE5FF0609F46CC008F466C027E216 +:103B700045EE66EE36EFE3163CE5F30609F421C5A3 +:103B8000882309F440C51092010683E0E8168DE50C +:103B9000F80608F05DC09AEFE9169CE5F90630F4E6 +:103BA000C70182509C45449708F05FC00E946D1188 +:103BB00090939B0280939A0232E1E3163CE5F30670 +:103BC00009F478C108F0B6C099E0E9169CE5F90659 +:103BD00009F44AC108F07BC0F5E0EF16FCE5FF06EA +:103BE00009F436C108F05FC033E0E3163CE5F306A4 +:103BF00009F426C108F028C180919A02816092E000 +:103C0000E9169CE5F90609F492C060919A02F090D9 +:103C10009B0284E090E00E949F336F2D82E290E04F +:103C20000E949F330E94BD13B3CE27E245EE65EE9E +:103C3000C8C426E241EE60EEC4C427E245EE64EE5D +:103C4000C0C426E241EE62EEBCC428E241E0EFCF00 +:103C5000E5EAEE16EDE5FE0609F4A8CFF0F421E65C +:103C6000E2162DE5F20609F4A1CFF6E1EF16FCE528 +:103C7000FF0609F08CC5809152028A7A91E009F41E +:103C800090E09093F40169E2811165E384EE91E0A4 +:103C90000E9433080E947B117BCEC7018D5A9D453F +:103CA000039718F783CF80919A028062E7E0EE16BF +:103CB000ECE5FE06E1F180919A028061F8E0EF16F2 +:103CC000FCE5FF06A0F180919A02806430C02DE0EF +:103CD000E2162CE5F20609F4D5C090F48BE0E81664 +:103CE0008CE5F80609F4C6C080919A028C609CE0CD +:103CF000E9169CE5F906D8F080919A028D7F17C0ED +:103D0000EFE0EE16ECE5FE0609F4CCC008F4BEC008 +:103D100020E1E2162CE5F20609F4C8C080919A026F +:103D20008F7B31E1E3163CE5F30609F06ECF80931B +:103D30009A026BCF8FEFE8168CE5F80609F4C4C041 +:103D4000D8F5EAEFEE16ECE5FE0609F485C0D0F4EE +:103D500024E1E2162CE5F20609F4C4C008F4B0C070 +:103D600085E1E8168CE5F80609F04FCF80919A02BC +:103D700082FB992790F921E0922790FB82F990FB32 +:103D800083F9D5CF9CEFE9169CE5F90609F482C0CA +:103D900008F466C0FDEFEF16FCE5FF0609F47EC0EF +:103DA00080919B0283602EEFE2162CE5F20609F06B +:103DB0002CCF80939B0229CF31E6E3163DE5F30635 +:103DC00009F49BC0A0F491E0E9169DE5F90609F419 +:103DD00092C008F47DC060E0F2E0EF16FDE5FF065A +:103DE00009F013CF8EE090E00E949F330ECF2DEAB2 +:103DF000E2162DE5F20601F168F485EAE8168DE594 +:103E0000F80609F002CF90919A02892F8E7F90FFD9 +:103E100081608DCF9EEAE9169DE5F90679F1EFEA1A +:103E2000EE16EDE5FE0609F0F0CE90919B02892F8B +:103E3000877F93FF8860BDCF80919B028860B9CF58 +:103E400080919A02826073CF80919A0284606FCFD2 +:103E500080919A0288606BCF80919B028160A9CF8C +:103E600080919B028260A5CF0E94BD1380919A022F +:103E700080685DCF80919A028E7F59CF80919B029E +:103E8000877F97CF80919A028B7F51CF80919A0242 +:103E9000877F4DCF80919B028E7F8BCF80919B023D +:103EA0008D7F87CF80919A028F7E41CF80919A0239 +:103EB0008F7D3DCF0E94BD1380919A028F7737CFBF +:103EC00080919A02837F33CF80919B028C7F71CF48 +:103ED00080919B02982F909591708E7F892B90FBFB +:103EE00081F967CF0E94BD1390919A02892F97FBA9 +:103EF00087F980581CCF61E075CF90919A02892F85 +:103F00008F7E94FF806113CF8091F40181110FC0E7 +:103F100089E2E6EEF1E02CEE31E09191891303C0E5 +:103F2000DF0111971C922E173F07B9F7B3CE85E337 +:103F3000F0CF81608093C40361E086950E94051CE8 +:103F400027CD45E45CE16FE47CE10E94930820CD3D +:103F50004FE45CE165E47CE1F8CF4FE757E165E7CA +:103F600077E1F3CF4BE557E168E677E1EECF41E447 +:103F700057E16EE477E1E9CF4EE457E161E477E1A0 +:103F8000E4CF4BE957E169E877E1DFCF61E081E019 +:103F9000D5CF65E082E00E945A1CFACC68E086E04A +:103FA000FACF64E18FE0F7CF67E185E1F4CF62E219 +:103FB00089E1F1CF61E083E2C1CF0E94BD139FEFA1 +:103FC000E4E3FCE09150E040F040E1F700C0000085 +:103FD0000E94160880919B0282FB882780F991E05D +:103FE00089270E94FF11F8018281E080F1808823F7 +:103FF00009F44BC0C7010E94EE10D82E682FC701EC +:104000000E947E0BB7018D2D0E94E0100E94A8092E +:10401000E82ED92EA82EF801F280B580B2943FE0A8 +:10402000B322809148028770E9F09F2CFF20D9F0DD +:10403000892F807F803449F090E29E0D983090F077 +:10404000803619F4F6EFEF1669F080919B0282FF3B +:1040500009C082E00E94E311809148028770992490 +:1040600093948111912C8D2C82942FE082222BE04D +:10407000281508F479C0E82DF0E0E152FC4C0C94CE +:10408000213381E0AECF80E0ACCFC7010E944A0B64 +:10409000D82EB8CF3D2D3F70C32E8D2D807F19F0C7 +:1040A000C29490EFC922FF20B9F0CC2069F080E2E1 +:1040B0008E0D883010F0A11009C080915202C82ADC +:1040C000C09252020E947B118E2D4CC080915102F1 +:1040D000C82AC0925102F6CF8E2D0E943D12CC20EC +:1040E00009F442C080E28E0D883010F0A11004C0A7 +:1040F0008C2D0E94390B06C0C09480915102C822B9 +:10410000C09251020E947B112FC08D2D8F70C82E3E +:104110008D2D807F803219F0C29480EFC822AA20B2 +:1041200089F091E0A91609F47AC0FF2009F484C04F +:10413000BB2009F47AC0F801858180FFC5CF8F705C +:10414000858373C020919B0222FD46C0FF20F1F1C0 +:10415000CC2039F080915202C82AC09252020E94AB +:104160007B1180E00E947212282D2850330B2430DE +:10417000310510F40E94EF0FFF2079F08D2D807F24 +:10418000803619F436EFA31641F08091F5018230A4 +:1041900009F0E6C183E08093F501992009F4ACCBE6 +:1041A0008091480280FDA8CBF80112828595859503 +:1041B00085950E941B12C8010E946A1C80914802CA +:1041C0008595859585950E94D61196CB80E00E94B5 +:1041D0003D12CC2049F28CCFFF20A1F090915302E8 +:1041E0008C2D892BB11003C00E943312BDCFE1E0AA +:1041F000BE12FACF22FFB8CF981709F4B5CF80933B +:104200005302B2CFB11006C00E94330B8C2D0E9416 +:104210002C12AACFF1E0BF1609F4A6CFF5CFFF20EC +:1042200031F025E02B1508F49FCF8C2DDDCF34E045 +:104230003B1508F499CFEACFBB2041F3F9E3AF1265 +:1042400018C12FEF37EE83E0215030408040E1F776 +:1042500000C000008E2D0E943D1286CF8D2D8695C8 +:104260008695837069F0813009F07ECF8E2D9D2D6B +:104270009370F11002C090E080E00E944D0874CF6E +:104280008E2D9D2D9370F11002C090E080E00E9471 +:1042900065086ACF8D2D837091F5F11065CF4E2D95 +:1042A000429546954770440F440F8E2D8F70042E13 +:1042B00001C0880F0A94EAF72E2D2071E4FE07C092 +:1042C0002FE030E001C0220F4A95EAF720953D2DFE +:1042D000369536953370323069F050F4409154027F +:1042E000313029F0822B84230E9427123DCF842B6A +:1042F000822BFACF282B809154028227F5CF869506 +:10430000FF2011F08D2D8170882309F42DCF4E2DC3 +:10431000429546954770440F440F8E2D8F70042EA2 +:1043200001C0880F0A94EAF72E2D2071E4FE07C021 +:104330002FE030E001C0220F4A95EAF720953D2D8D +:10434000369536953370323069F050F4409102065C +:10435000313029F0822B84230E94C51105CF842B94 +:10436000822BFACF282B809102068227F5CFFD2DD4 +:10437000FF70CF2EFF2029F08F2F0E941B128E2D51 +:1043800033CF8E2D0E942C128C2D0E94D611ECCE94 +:104390008E2D22EFA216B1F12A1570F030EFA31680 +:1043A000D1F091EFA91691F0FF2009F45DC0B11092 +:1043B0008BCE8D2D8F712AC0E3EFAE1651F1F4EF45 +:1043C000AF12F2CF80919B0282FD2FC08D2D8F7195 +:1043D000FF20D9F21BC0FF2081F024E02B1508F448 +:1043E000C3CE2D2D2F7181E090E001C0880F2A955A +:1043F000EAF7909102068927AFCF35E03B1508F424 +:10440000B3CEEFCF8D2D8F71F110BFCF0E941B1255 +:10441000ABCE80E0FF2009F49FCF81E09D2D9F71FE +:1044200001C0880F9A95EAF797CFFF2091F08D2D64 +:104430008F71E82E0E941B1280919B0282FF07C0A1 +:10444000E8E0EE9EC00111248360809348028E2D27 +:10445000DDCF81E00E94E311F1E0FB1508F084CE8E +:1044600082E00E94E31180CEBB2041F0893309F441 +:10447000E8CEEFE3FCE93197F1F7EACE8D2D8F71AD +:1044800084CFE0E1EE0DE73008F03FC0F0E0E55109 +:10449000FC4C0C942133FF2009F466CE80910F026E +:1044A00091E0892780930F025FCEF0920F025CCEDD +:1044B00081E08F25F7CFF11057CE81E0F3CFF110D7 +:1044C00053CE10920F0250CEFF2021F082E0809355 +:1044D000F501F3CF8091F501823021F481E08093E2 +:1044E000F50142CE833009F03FCE1092F501E9CFBD +:1044F000FF2039F080910E02882381F210920E0283 +:1045000033CEF4E0FB1550F62FCE80910E02BB2087 +:10451000D9F0882341F080910F0291E089278093A0 +:104520000F0210920E02F110CFCD8FE39CE901979C +:10453000F1F700C000008E2D0E943D1286E0F801C8 +:1045400011928A95E9F710CE882309F40DCEF11067 +:104550000BCE80910F0291E0892780930F02CECF7E +:10456000813009F01ACE1092F50110920F0215CE8B +:10457000F0E1EF16FFE5FF0609F4EBCA21E1E216D0 +:104580002FE5F20609F4E9CAF3EFEF16FCE5FF06A2 +:1045900009F44FCB08F0E3CA38EDE3163CE5F30627 +:1045A00009F443CB99EDE9169CE5F90609F44DCBE6 +:1045B000E7EDEE16ECE5FE0609F0E2CA26E241EE72 +:1045C00061EEC8010E94821BE3C930E1E3163FE5BA +:1045D000F30609F4B8CA91E1E9169FE5F906A1F6D8 +:1045E00082E0B2CA85E0DE01119601900D928A95B3 +:1045F000E1F7F801228189819A81211181C90E9404 +:104600004A0BF82E85C9F6E1EF16FCE5FF0609F422 +:104610007BCC8091520282722CECE2162CE5F206E1 +:1046200009F4AFCC08F073C096ECE9169CE5F906E6 +:1046300009F493CC08F042C0F3ECEF16FCE5FF065A +:1046400009F47FCC50F532ECE3163CE5F30609F0B3 +:10465000CACC8091C40380FF6CCC8E7F8093C4034E +:104660006091C4037091C5038091C6039091C70304 +:104670000E949D160E9499088091EE0281608093AD +:10468000EE022FEF30E782E0215030408040E1F72A +:1046900000C000000E948A0C7BC994ECE9169CE5DE +:1046A000F90609F455CC45E757E16FE777E1E5EC0A +:1046B000EE16ECE5FE0609F448CC95CCF9ECEF16C5 +:1046C000FCE5FF0609F453CC88F437ECE3163CE52F +:1046D000F30609F447CC48E657E16BE577E198EC3F +:1046E000E9169CE5F90609F430CC7DCCEAECEE162F +:1046F000ECE5FE0609F440CC49E857E16BE977E1C7 +:10470000FBECEF16FCE5FF0609F41FCC6CCC21EDA9 +:10471000E2162CE5F20609F444CCB8F48EECE81667 +:104720008CE5F80609F435CC08F430CCEFECEE1645 +:10473000ECE5FE0609F432CC6EE089E0F0EDEF1610 +:10474000FCE5FF0609F427CC4ECC24EDE2162CE55F +:10475000F20609F42CCC78F482EDE8168CE5F80624 +:1047600009F422CC61E088E193EDE9169CE5F906B5 +:1047700009F4E4CB38CCE5EDEE16ECE5FE0609F4E1 +:1047800019CCFDE5EF16FF0609F402C92CCC2AE589 +:10479000E2162DE5F20609F474CC98F4E1148CE5E8 +:1047A000F80609F40ACC9EEDE9169CE5F90609F035 +:1047B0001ACC6FEF7FEF90E080E00E94BD330E9443 +:1047C0008716ECE5EE16EDE5FE0609F403CC08F4D9 +:1047D0005ACC27EAE2162DE5F20689F304CC1F93A2 +:1047E000CF93DF9380911502807F09F049C08091BB +:1047F0001202882309F444C080914702D091160226 +:104800006091100270911102A0911302B0911402F4 +:10481000C62FC72316E0D81799F190E0109711F032 +:10482000CF3F19F401968770F6CF189F9001199F1A +:10483000300D1124F901E95EFD4F41814713F2CF9C +:1048400040814613EFCF42814111ECCF4381548127 +:104850004A1B5B0B4436510528F7809115028F7077 +:10486000806180931502F901E45EFD4F80818F70B5 +:104870008061808380E192E00E946A1C0E94400B6C +:10488000DF91CF911F910895A1E1B0E0EAE4F4E255 +:104890000C94A2328C0185E0F801DE011D96019096 +:1048A0000D928A95E1F7F801E28080E1A82E82E07E +:1048B000B82E60911302709114026115710509F40C +:1048C00026C19091100240911102892F84238F3FBD +:1048D00009F41DC120813181C380D480F09012027F +:1048E000F601E61BF70BFF2009F4DCC080911502EE +:1048F000582F507FE436F10508F09FC051116BC06E +:10490000FE2C431314C0921312C0E11010C08F701C +:10491000806180931502C5010E946A1C8091150276 +:10492000F80185838F2D6196EAE00C94BE32C114A4 +:10493000D10429F0822F83238F3F09F011C180E039 +:10494000F82FF170DF2E80FF3CC08091470240912C +:10495000160256E0841315C02D873E878D859E85EF +:104960000E941D11292F22952F702230F0F0243043 +:1049700018F59F70F1F0F8019581907FD1F4D12C5A +:104980001EC090E0589FF001599FF00D1124E95E80 +:10499000FD4F6181361306C06081261303C062811A +:1049A000E6120FC001968770D5CF9F7011F0882353 +:1049B00031F3805E883018F3C8010E946A1CFD2C18 +:1049C000B1CFEE2009F4AECF8091150281608093C3 +:1049D0001502F12CA7CF431306C0921304C0F801AF +:1049E000EE2009F479C0C8010E942A11882309F138 +:1049F000EE20F9F080911502803270F020911002C3 +:104A00003091110238872F831986DB86CA868C87FE +:104A1000CE0107960E946A1C86E0F801A0E1B2E090 +:104A200001900D928A95E1F70E94EF23FF24F39401 +:104A300079CFC8010E946A1CF9CF51110AC080E1E8 +:104A400092E00E946A1C86E0F50111928A95E9F7CE +:104A5000C0CF43130FC092130DC0E1100BC0F8017B +:104A60008583C8010E946A1C86E0F50111928A952F +:104A7000E9F758CFC8010E942A118823D1F2EE200D +:104A8000C1F280911502803238F2209110023091EB +:104A900011023A8329831B82DD82CC828E83CE0170 +:104AA0000196B8CFE436F105F8F6FE2CEE2009F2B7 +:104AB00043131FC092131DC08091150280FD10C0CA +:104AC000982F907F69F0F8018583903F31F0982FFF +:104AD000907F905F8F70892B8583C8010E946A1C2C +:104AE00086E0F801A0E1B2E001900D928A95E1F72D +:104AF00019CFC8010E942A1181118ECF8091150211 +:104B0000816080931502C8010E946A1C0BCFEE20C1 +:104B100009F48FCFC8010E942A11F82E882309F4C6 +:104B200088CF86E0F801A0E1B2E001900D928A956D +:104B3000E1F780911002909111020E941D1192954F +:104B40009F70963051F4863F41F080910F0291E0C2 +:104B5000892780930F0290930E020E94EF23E2CEEA +:104B600081E08E25EDCEA7E1B0E0E9EBF5E20C9413 +:104B7000A8326D8B7E8B8F8B252F61111092510285 +:104B80008E899F89892B19F02F3F09F07DC01A8AE1 +:104B9000198A4B8B2C8B85E0FE017396DE011D96E6 +:104BA00001900D928A95E1F786E0FE013D96DE01C7 +:104BB000179601900D928A95E1F7CE0107960E9413 +:104BC0004424882379F016E08091470290911602E0 +:104BD000891347C06796E4E00C94C432802F809517 +:104BE000892387C086E0FE013796DE011196019089 +:104BF0000D928A95E1F78A859B85892B21F388851B +:104C00009F8189238F3FF9F22091160230E0C9017C +:104C1000019687709927409147024817190671F449 +:104C20000E94BD13109216021092470286E0E0E146 +:104C3000F2E0DF011D928A95E9F7C5CF96E0929FD9 +:104C4000D001939FB00D1124A95EBD4FFE01319696 +:104C500001900D929A95E1F7809316020E94400B05 +:104C6000B2CF819FC0011124895E9D4F0E944424D0 +:104C7000882309F4AFCF8091470290E001968770B6 +:104C8000992780934702A0CF2A3008F080CF463082 +:104C900008F07DCFE42FF0E086E0289FE00DF11DC5 +:104CA0001124DF01A770BB2701E010E001C0000F55 +:104CB000AA95EAF7DF0193E0B695A7959A95E1F7F3 +:104CC000A451BE4F9C9180910F02611102C0892FA7 +:104CD0008023882309F482CFAF01440F551FFA01C6 +:104CE000EF5BFE4F2491405C5E4FFA014491892FA7 +:104CF000802B8C934CCFAFE0B0E0E1E8F6E20C946F +:104D00009F328E010F5F1F4F8AE0D8011D928A9556 +:104D1000E9F78BE8C82E81E0D82EF12CE12CAA24EB +:104D2000A394B12C26E9822E21E0922EF6018191E6 +:104D30006F018F3F09F442C0F894E82FE295EF70BD +:104D4000F0E021A18F70A50102C0440F551F8A9584 +:104D5000E2F7CA01922F982B91A392A18095892303 +:104D600082A3789400C0E0E9F1E0712C31E0219158 +:104D70002F3F09F46BC0A22FA295AF70B0E09096C0 +:104D80008C9190E02F7002C0959587952A95E2F757 +:104D900080FD5CC0832F782A330F8E169F0639F76B +:104DA000F601319780818F3F11F00E944E0950EA41 +:104DB0005A95F1F7F801EE0DFF1D70828FEFE81A9A +:104DC000F80A95E0E916F10409F0B0CF4AE050E0A6 +:104DD000B8018EE892E00E947533009741F02AE016 +:104DE000F801AEE8B2E001900D922A95E1F700914A +:104DF0009902892B69F181E0809357020E94761B0A +:104E000090935602809355028091550290915602DC +:104E10000E94671B059700F110E004521D4F45E00A +:104E200050E06EE872E0C8010E947533D12C892BE6 +:104E300051F085E0EEE8F2E0D80101900D928A95FC +:104E4000E1F7DD24D3941092570207C080E0A3CF8E +:104E5000809157028111D8CFD12C0E94CC0FC82E3F +:104E6000E0919902DE011B967D01882309F47AC046 +:104E700085E01D928A95E9F70E2F10E004521D4F30 +:104E8000809189028A30D8F54EEE59E1B701C80108 +:104E90000E94990F882309F454C04DE859E1B701E5 +:104EA000C8010E94990F882309F44BC042E958E1D8 +:104EB000B701C8010E94990F882309F442C041E359 +:104EC00058E1B701C8010E94990F8823D1F11092CF +:104ED00089028091980290E045E050E0B701845249 +:104EE0009D4F0E94753321E020935E02892BE1F4EF +:104EF000C12C8C2D8D292F96EDE00C94BB32809126 +:104F00005802909159020E94671B843F914008F01B +:104F1000BBCF80915E02882359F385E0F70111929F +:104F20008A95E9F710925E02A0919802B0E0A4522F +:104F3000BD4F85E0FE013B9601900D928A95E1F709 +:104F4000D8CF809189028F3F31F08F5F80938902A3 +:104F50008A3008F4BECF0E94761B9093590280934A +:104F60005802D7CFF0E0E452FD4F85E0A2E7B2E06F +:104F700001900D928A95E1F765E070E082E792E09A +:104F80000E947D08809371024091B40250E06091CC +:104F9000B30270E061557D4FC7010E9482338B855B +:104FA0008093780261E070E0C7010E947D088093E1 +:104FB00077028090790290907A02A0907B02B09064 +:104FC0007C0280915A0290915B02A0915C02B091A8 +:104FD0005D0288169906AA06BB06D1F080925A0295 +:104FE00090925B02A0925C02B0925D020E94CC0F94 +:104FF00081110EC00E942708861A970AA80AB90ACA +:1050000080928A0290928B02A0928C02B0928D02C2 +:1050100080918402882309F46CCF80FF0DC08091B9 +:105020007D0280FF2AC09091C40391609093C403D5 +:1050300060E086950E94051C8091840281FF09C072 +:1050400020E04091800260917F0280917E020E9468 +:10505000B0168091840282FF06C08091830288236B +:1050600079F00E94EA1B8091840283FF03C081E0F3 +:105070008093E902109284023CCF0E94810FDCCF22 +:105080000E949908F0CF1F921FB61F9211248F9390 +:105090009F93AF93BF938091E005811113C08091DE +:1050A000E1059091E205A091E305B091E4054196F8 +:1050B000A11DB11D8093E1059093E205A093E30546 +:1050C000B093E405BF91AF919F918F911F901FBE48 +:1050D0001F901895CDB7DEB7AD970FB6F894DEBF29 +:1050E0000FBECDBF85B7806885BF85B7806885BF97 +:1050F00084B7877F84BF0FB6F894A895809160002D +:10510000886180936000109260000FBE80E890E09C +:105110000FB6F89480936100909361000FBE8CE409 +:1051200099E09093E3018093E2010E948C060E9433 +:1051300057078091E20084608093E2007894809128 +:10514000F5058823A1F01091E9001F709091EC0003 +:10515000892F817090FD80E8182B1092E9008091D2 +:10516000E80083FD0E94C9131F701093E90082E0DC +:1051700084BD93E095BD9AEF97BD80936E00109229 +:105180008A0210928B0210928C0210928D020E9461 +:105190005411811102C00E94A1100E94CC0F809373 +:1051A000300180913001882309F46DC010925201C2 +:1051B00084E2809353010E94CC0F81110E9424311C +:1051C000809130018091300195E0811190E09093C1 +:1051D000990285E0891B809398020BE811E060E951 +:1051E000E62E61E0F62ED8018D918D018F3F11F0F2 +:1051F0000E944E09E016F106B1F700E911E056E908 +:10520000E52E51E0F52EF80181918F018F3F11F0CD +:105210000E944E09E016F106B1F78AE0ECEDF2E0EB +:10522000DF01282F1D922A95E9F7EEE8F2E0DF0171 +:105230001D928A95E9F70E941A1A811102C00E94F4 +:10524000C61782E090E00E948B338093A1020E94F7 +:105250006D1190939B0280939A020E947B26EFE34C +:10526000FCE93197F1F700C000000E947B26809195 +:10527000DC0280FF0CC06FEF7FEF90E080E00E94C7 +:10528000BD330E94160884E28093520192CF83E0DE +:1052900090E00E948B330E9427120E94CC0F88233B +:1052A00009F4E2C083E08093D70280FDDFC080E88C +:1052B0008093C9030E94DE2F6DE070E08BE792E0DF +:1052C0000E94C60B892BE9F58091D70263E070E05C +:1052D00081FDCEC088E792E00E94C60B892B89F53C +:1052E0006DE070E088E692E00E94C60B892B49F5DC +:1052F0000E942708605A75418F4F9F4F6093D405D5 +:105300007093D5058093D6059093D705ECECF3E028 +:1053100080E092E0DF019C011D9221503040E1F7D6 +:10532000F093D305E093D2058FEF9FEF9093CB03DB +:105330008093CA0381E08093D9058093D8051092A9 +:10534000D80280919C02811138C00E941A1A8111E2 +:1053500004C00E94C6170E94AD1788E090E00E942A +:1053600093336093C4037093C5038093C6039093F3 +:10537000C7038091EE0283608093EE026E7F71F42A +:105380000E94AD1788E090E00E9493336093C403BD +:105390007093C5038093C6039093C7030E94A0082F +:1053A0000E9499088091C40380FF04C060E0869544 +:1053B0000E94051C81E080939C029091300181E065 +:1053C00098279093B302382F391B30939E02909107 +:1053D00030018093B4029091300180939D028091BE +:1053E0003001811106C084EF80933C0185EF8093EA +:1053F0003B0120913C01E22FE295EF70F0E061A1CA +:105400002F7081E090E0AC0101C0440F2A95EAF7CB +:10541000342F3095362331A322A1242B22A32091AF +:105420003B01E22FE295EF70F0E031A12F7001C057 +:10543000880F2A95EAF7982F9095932391A392A12C +:10544000892B82A3EFE8F1E03197F1F700C000006B +:105450001091B40265EB72E04CE351E08BE3E82E6F +:1054600081E0F82EFB012FC080E01DCF80E220CF2D +:1054700085E792E031CFDA012D91AD01822F82953F +:105480008F7090E0DC0190968C9190E02F7002C0BC +:10549000959587952A95E2F78170D7019D917D01B9 +:1054A000292F22952F7030E0D90190962C9130E071 +:1054B0009F7002C0359527959A95E2F790E020FD00 +:1054C00092E0892B81938E2F861B8117A0F20E9478 +:1054D000CC0F811102C00E94273181E391E09093AB +:1054E000DD058093DC058091F50500E112E1853052 +:1054F00009F48DC00E947B2632EAE32E32E0F32EBF +:105500004CED442E42E0542E2CEA32E0D201F70159 +:1055100091918D912E173F0709F483C09817C1F31D +:105520000E94CC0F882E2CEDC22E22E0D22E10E04D +:10553000D6010D916D01F70191907F01901629F12F +:105540009026B12CAA24A394892D8A21B1F0882019 +:10555000A1F0BEA21FA391E0802F8A2109F490E060 +:1055600098A70E94761B8160782F9AA789A74EA1E1 +:105570005FA168A58AA50E94B325B394AA0CF6E0A2 +:10558000BF12E2CFF701319700831F5F1A3081F617 +:105590000E942708CC24C39465C08091F50584300F +:1055A00031F10E94F00B1092E005E8E1F0E020E418 +:1055B0000FB6F894A895E09360000FBE20936000AA +:1055C00083B7817F846083BF83B7816083BF789412 +:1055D000889583B78E7F83BF0FB6F894A895809186 +:1055E0006000886180936000109260000FBE80911F +:1055F000F405882361F00E947B26ECEDF2E08191B6 +:105600008111BDC486EE92E08E179F07C1F780918D +:10561000F505853009F4C1CF0E94BD130E94EF0F3C +:1056200069CF98137DCF0E94761B8C0180919F02D9 +:105630009091A00208171907A1F08FEF89A38AA300 +:105640001BA20E94761B8160782F9DA38CA349A189 +:105650005AA16BA18DA10E94B3251093A0020093C3 +:105660009F02C12C0E94CC0F8091ED02882309F487 +:1056700064C08091EC02E091C403E695E81BE093DE +:10568000E802823009F0CFC0F0E0EA56FD4FE49125 +:105690000E2F10E09DE6E92E9FE0F92E8091E902A1 +:1056A000882361F01092E9020E94DF1B9093E702C9 +:1056B0008093E6021092EB021092EA020E94DF1B36 +:1056C000E091E602F091E7029C012E1B3F0B2F3F79 +:1056D0003F4798F52091AE022223B1F01092AE021E +:1056E0002091AC023091AD02821B930B8F3F9F47FC +:1056F00058F4205D3A483093AD022093AC0280917B +:10570000EE0288608093EE02A090EA02B090EB0275 +:10571000E00FF11FF093E702E093E60286EE92E0DD +:10572000F70109958091EA029091EB02892B29F407 +:10573000AB2819F081E08093AE02E12CD12C80914E +:10574000B402E81608F4C9C0D1100E94300B809151 +:10575000D905882351F18091D9029091DA020E94F3 +:10576000671BC29708F035C12091CA033091CB0363 +:105770002115310509F099C18091D8058823A9F038 +:105780000E9427080091D4051091D5052091D605D7 +:105790003091D705601B710B820B930B6F3F7F4FCE +:1057A0008F4F9F4710F40E94F00BC11001C0D11021 +:1057B0000E940B0C0E94EF0F9091DB02891721F0E1 +:1057C0008093DB020E9427088091F505843009F060 +:1057D0008ACE83E08093E9008091E80082FF83CE47 +:1057E0008091E80090E085FF0CC00E94AB0690E23B +:1057F000E92EF12C8E010F5F1F4F882309F432C26E +:1058000091E08091E8008B778093E800992309F478 +:105810006ACEE981E150E33108F088C2F0E0EE5051 +:10582000FC4C0C942133863059F4F0E0ED56FD4FDA +:10583000E4910E2F10E08DE5E82E8FE0F82E2ECFAC +:10584000893061F4E695F0E0E057FD4FE4910E2FCA +:1058500010E0B0EBEB2EBEE0FB2E20CF8F3061F4DA +:10586000E695F0E0E357FD4FE4910E2F10E0A2E241 +:10587000EA2EAEE0FA2E12CF853159F4F0E0E65769 +:10588000FD4FE4910E2F10E0FAE9EF2EFDE0FF2E20 +:1058900005CF08E210E065E1E62E6DE0F62E8831D6 +:1058A00009F4FCCE833249F4E8E8F2E00591149162 +:1058B000E9E0EE2EEFE0FE2EF1CE04EF11E075ED03 +:1058C000E72E7CE0F72E843209F4E8CE00ED17E0F5 +:1058D00051E1E52E58E0F52EE1CE0E2D10E0F80155 +:1058E000E45CFE4F8081E82FE295EF70F0E0E0A1EC +:1058F000F0E08F7002C0F595E7958A95E2F7E170C8 +:10590000D801A55CBE4F2C91A22FA295AF70B0E03C +:1059100090968C9190E02F7002C0959587952A956E +:10592000E2F780FD54C080E08E2BD801AB54BD4F10 +:10593000EC919E2F9370891709F447C0EE0FEE0F7C +:10594000E82BEC93F090B302FE0CEF70F0E0EA5617 +:10595000FE4F0F541D4F8081D8019C91890F8C936D +:1059600020E082308CF0EF2DF0E0E155FD4F80819A +:105970008F5F80838AEAFF2021F0B1E0FB1203C031 +:105980008BE40E94C51221E0F80180818F3F8CF4E6 +:10599000EF2DF0E0E155FD4F80818150808389EA51 +:1059A000FF2021F0F1E0FF1203C08EE40E94C51237 +:1059B00021E0D8018C91082E000C990B62E070E078 +:1059C0000E94EB32F8018083D22AE394B8CE82E0C1 +:1059D000ABCF0E94761B9093DA028093D9028CECB5 +:1059E00093E09093D3058093D2050E94CC0F60E0A2 +:1059F000882309F455C083ED92E00E9472138091D0 +:105A000002060E94B50B882341F0813021F160E04D +:105A100084EC92E00E94721305C060E08EEC92E08C +:105A20000E94B71360E081EC92E00E94721360E084 +:105A30008BEB92E00E94B713809102060E94B50B97 +:105A4000823031F160F0833039F160E083EA92E036 +:105A50000E94B71309C060E089EC92E0E1CF60E0FA +:105A600085EB92E00E94721360E080EA92E00E946F +:105A700072130E94EF0F81FB662760F98AE992E0BA +:105A80000E94B7138091D905882309F475CE6CCE96 +:105A900060E08FEA92E0E6CF60E089EA92E0E2CF50 +:105AA00086ED92E00E947213EDCF8091D80261E002 +:105AB00070E0811161CE082F10E07B01082E02C03A +:105AC000EE0CFF1C0A94E2F7A9014E215F21452B41 +:105AD00009F447C09091D70290FD45C08295880F88 +:105AE000807680933F0198013695279536952795C6 +:105AF00020934201815E809340011092430124E68D +:105B000030E047E050E06DE371E088E70E947E30CE +:105B1000892B09F031CEA80135E0440F551F3A9585 +:105B2000E1F78091D70280FD2CC044535C4F04E61E +:105B300010E020E230E060E488E70E949F30892B8B +:105B400009F01ACE0E940B0CE094F0948091CA03E5 +:105B50009091CB03E822F922F092CB03E092CA03A2 +:105B60000BCE8F5FA8CF880F880F880F80933F01DF +:105B700010924201895F8093400183E0809343014A +:105B8000BECFE7EBF2E080E2DF011D928A95E9F7F4 +:105B9000EAEAF1E0FDA7ECA706EA11E027E0A22E71 +:105BA00099249394ACA5BDA52D91BDA7ACA7F801F0 +:105BB00021908F01240E352E311CC10184539C4F3E +:105BC0001C01E22FF0E0E954FD4F30E020E09A2D77 +:105BD000921B9BA7B92C022E01C0BB0C0A94EAF7BA +:105BE000310190E0D3018D913D018B216BA5691BA3 +:105BF0006770862E062E000C770BB82F01C0BB0FE6 +:105C00008A94EAF78B2E71956195710967707727F1 +:105C100001C086956A95EAF7882A8081882A808261 +:105C20009F5F9830F9F62F5F3F4F3196283031054E +:105C300071F6EEEAF1E02CA53DA5E217F30709F0B5 +:105C4000B1CF04E610E020E230E047EB52E073CF42 +:105C50008091F100D8018D938D01B1E0EB1AF1082C +:105C600009F4CECD8091E80085FDF2CF8091E80067 +:105C70008B778093E8000E94AB06882399F3C0CD10 +:105C80001A828AE08B8311C08A81823009F48DC127 +:105C9000833091F1813009F049C00E9427080E94A9 +:105CA00027336B837C838D839E838091F5058430BD +:105CB00009F019CC1091E9001F709091EC00892F28 +:105CC000817090FD80E8182B82E08093E90080913C +:105CD000E80080FF0DC050E040E060E270E0CE01DF +:105CE00001960E94DC068091E8008E778093E800A0 +:105CF0001F701093E900F7CBFE013396D2018D910E +:105D00002D018193B6EE4B16B2E05B06B9F7CDCF0D +:105D10008A81823059F46B817C818D819E810E94C1 +:105D2000273386E290E00E949F33BFCF8FEF8983B5 +:105D3000BCCF4C816B818A810E94B1109827892742 +:105D400098279E838D83B1CF2D813E8132272327D3 +:105D500032274C816B818A810E942A10A6CF0E9433 +:105D60005010A3CF8A81813809F1A8F4803809F056 +:105D70009CCF8B81E8E78E9FC00111246FEF70E00C +:105D80000E948632462F20E06091C6038091C503B1 +:105D90000E94B0168ACF8238E9F0833809F085CFA7 +:105DA00020E04091C7036C818B81F2CF60E08B8152 +:105DB0000E94051C8B81811103C00E94810F75CF49 +:105DC0008091C40381608093C40360E086950E9443 +:105DD000051C6BCF8B818093C80367CF8A81813884 +:105DE000E1F078F4803809F060CF8091C703FFEFCD +:105DF0008F9FC001112468E770E00E9486326B8398 +:105E000054CF823891F0833809F04FCF8091C50389 +:105E10008B838091C6038C8348CF8091C40380FF1D +:105E200002C086952FCF80E02DCF8091C8032ACF66 +:105E30006091C4037091C5038091C6039091C7031C +:105E40000E949D1632CF80E18A832FCF81E08A8322 +:105E500089EF18CFCA80DB80DC24CD24DC248E01BE +:105E60000F5F1F4FEC80E00EF12EF11CC601895F21 +:105E70009D4F0E151F0509F418CF29EFC21621E01A +:105E8000D20658F40E948B33D80114968C93FFEFFE +:105E9000CF1ADF0A0F5F1F4FE9CFF8011482F7CF47 +:105EA0000A811B811027012710279E012F5F3F4F7A +:105EB0006901EC80E00EF12EF11CC801895F9D4F55 +:105EC000E016F10609F4F1CE093F31E0130728F49A +:105ED000D60114966C910E949F33BFEFCB1ADB0A58 +:105EE0000F5F1F4FEACF0E941A10DFCE84E0ACCFC5 +:105EF000CA80DB80DC24CD24DC248E010F5F1F4FA1 +:105F0000EC80E00EF12EF11CC6018796E016F1063A +:105F100009F4CBCEE0EECE16E1E0DE0658F40E94A6 +:105F20008B33D80114968C93FFEFCF1ADF0A0F5FE3 +:105F30001F4FEACFF8011482F7CF0A811B81102787 +:105F4000012710279E012F5F3F4F6901EC80E00E73 +:105F5000F12EF11CC8018796E016F10609F4A5CED2 +:105F6000003E31E0130728F4D60114966C910E948C +:105F70009F33BFEFCB1ADB0A0F5F1F4FEBCF09BD7B +:105F800019BD09B400FEFDCF8091D8008F7D8093AC +:105F9000D8008091E00082608093E0008091E00072 +:105FA00081FDFCCF0E94BD1332CB86E290E00E94BF +:105FB0008B331B821C821D828E8377CE1092B90098 +:105FC0008CE08093B8000895B0E0A0E0EAEEFFE234 +:105FD0000C94A132B82EEB010E94761B6C01EE24CA +:105FE000E394F12CC431D10560F025E0E22EF12CD0 +:105FF000CF3FDC0731F0CE0164E170E00E948632D1 +:106000007B0184EAA82E94E8992E1092BC00A092FD +:10601000BC000E94761B8C018091BC0087FF0DC0E4 +:106020008091B900887F8830F9F08091B900887F2D +:106030008031D1F00FEF1FEF08C0C8010E94671B2D +:10604000E816F90648F70EEF1FEFCF3FDC07E9F23D +:10605000C6010E94671BC817D907B8F6C801CDB79B +:10606000DEB7EBE00C94BD32B092BB009092BC0066 +:106070000E94761B8C018091BC0087FF0AC0809132 +:10608000B900887F883111F08034A1F610E000E07B +:10609000E5CFC8010E94671BE816F90660F7D3CF69 +:1060A0000F931F93CF93DF93EB018093BB0084E8A2 +:1060B0008093BC000E94761B8C018091BC0087FFFE +:1060C00011C02091B900287F81E090E0283211F4BE +:1060D00090E080E0919581959109DF91CF911F919A +:1060E0000F910895CF3FDC0741F3C8010E94671B61 +:1060F000C817D90710F78EEF9FEFEFCFB0E0A0E001 +:10610000E4E8F0E30C94A4326B018A017901B9014F +:106110000E94E42FE6010C0D1D1DC017D10711F0E0 +:1061200097FF08C024E92093BC00CDB7DEB7E8E0B4 +:106130000C94C032B70189910E945030EECFB0E08C +:10614000A0E0E5EAF0E30C94A432C62F6A017901DD +:10615000B8010E94E42F97FD0CC0B8018C2F0E945B +:106160005030E601EC0CFD1CCE15DF0511F097FF59 +:1061700008C024E92093BC00CDB7DEB7E8E00C945A +:10618000C032B80189910E945030EECF84E98093EB +:10619000BC0008958EE14A9B02C08150E1F74A9B02 +:1061A000FECF08955A9880E28A95F1F75A9A089599 +:1061B000FC013BE03A95F1F798E020E080E031E027 +:1061C00040E14A95F1F7880F4A9B02C0816023277E +:1061D00042E04A95F1F7000040E14A95F1F791500D +:1061E00079F790E19A95F1F799B132E03A95F1F7A4 +:1061F000000040E14A95F1F792FB992790F9922728 +:106200002081920F90830895A1E0B0E0EAE0F1E3ED +:106210000C94A63219828C017C01E60EF11C0E153D +:106220001F0541F481E09981911180E02196E6E01B +:106230000C94C2320E94CA30CE0101960E94D8301E +:10624000F80181938F01EBCF529A5A9A0895529890 +:106250005A9AEA9AE9E6F0E080818F7C808308957B +:106260006150770B91E001C0990F6A95EAF720E041 +:1062700031E0911108C0222391F05A9A80E28A9568 +:10628000F1F75A980895492F482339F05A9A23274D +:1062900040E24A95F1F79695ECCF5A98F9CF5A9883 +:1062A000EDCFFF920F931F93CF93DF93EC018C01FF +:1062B000060F111DC017D10729F4CDB7DEB7E5E0F1 +:1062C0000C94C332F9900E94D23068E08F2D0E9466 +:1062D0003031F0CF1F920F920FB60F9211240F930F +:1062E0001F932F933F934F935F936F937F938F935E +:1062F0009F93AF93BF93EF93FF93CF93DF930F924F +:10630000CDB7DEB719820E94CA30CE0101960E9435 +:10631000D830082F069506950695282F22952570CA +:10632000902F9570290F922F937026952695920F96 +:10633000982797708981982B09F05CC0073008F086 +:1063400059C080E18A95F1F75A9A529A82E08A956B +:10635000F1F700C05A9888E0089F80011124D80105 +:10636000A050BF4F1696ED91FC9117973097A9F06A +:106370006091890170918A0114962D913C91159735 +:10638000260F371F11968D919C911297680F791FD8 +:1063900013964C9113978C910995F801E050FF4F9B +:1063A0006381662351F02091890130918A018481B3 +:1063B0009581820F931F0E9451310E94D23080E15B +:1063C0008A95F1F75A9852985A9A80E18A95F1F78E +:1063D000F801E050FF4F6081662351F02091890160 +:1063E00030918A0181819281820F931F0E94043132 +:1063F0000E94CA300F90DF91CF91FF91EF91BF9132 +:10640000AF919F918F917F916F915F914F913F914C +:106410002F911F910F910F900FBE0F901F90189505 +:106420000F931F93CF93DF93EC0107970CF04CC0B1 +:10643000F894529A5A9885E08A95F1F700009C2FBB +:10644000969595708C2F8570980F892F83709695EF +:10645000969523E0CC0FDD1F2A95E1F7980F8E016A +:10646000092B0E94D23000C068E0802F0E9430319A +:1064700080E18A95F1F752985A9A4A9B1EC087E0AC +:1064800090E04A991CC0FE01E050FF4F63816623F3 +:10649000F9F02091890130918A0184819581820FE0 +:1064A000931F0E940431811113C0529A5A9A789412 +:1064B000DF91CF911F910F91089500C0DECF01971A +:1064C00029F4529A5A9A789480E0F2CF00C0D9CF3A +:1064D0000E94CA3080E28A95F1F75A98529A80E178 +:1064E0008A95F1F7C050DF4F6881662351F0209103 +:1064F000890130918A0189819A81820F931F0E94BC +:1065000051310E94D230789481E0D2CFAA1BBB1BBC +:1065100051E107C0AA1FBB1FA617B70710F0A61BA3 +:10652000B70B881F991F5A95A9F780959095BC01C4 +:10653000CD0108952F923F924F925F926F927F927A +:106540008F929F92AF92BF92CF92DF92EF92FF9283 +:106550000F931F93CF93DF93CDB7DEB7CA1BDB0B2F +:106560000FB6F894DEBF0FBECDBF09942A883988D4 +:1065700048885F846E847D848C849B84AA84B984DB +:10658000C884DF80EE80FD800C811B81AA81B981E7 +:10659000CE0FD11D0FB6F894DEBF0FBECDBFED01FB +:1065A0000895991B79E004C0991F961708F0961B6F +:1065B000881F7A95C9F78095089587FB082E0626CF +:1065C00087FD819567FD61950E94D1320EF491950A +:1065D00007FC8195089597FB072E16F4009407D0C9 +:1065E00077FD09D00E94863207FC05D03EF49095D5 +:1065F00081959F4F0895709561957F4F0895A1E211 +:106600001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F2C +:10661000FF1FA217B307E407F50720F0A21BB30B77 +:10662000E40BF50B661F771F881F991F1A9469F7F3 +:1066300060957095809590959B01AC01BD01CF014F +:106640000895EE0FFF1F0590F491E02D099469273E +:106650009627692778278727782708950E94363359 +:10666000332312F48A1B9B0B0C944733A29FB00177 +:10667000B39FC001A39F700D811D1124911DB29F76 +:10668000700D811D1124911D08950E943633B7FFAE +:106690000895821B930B08950E943633A59F900D99 +:1066A000B49F900DA49F800D911D11240895B7FFF4 +:1066B0000C944C330E944C33821B930B0895FB01C6 +:1066C000DC0102C005900D9241505040D8F708956A +:1066D000FC014150504030F001900616D1F731973F +:1066E000CF010895882799270895FB01DC0104C094 +:1066F0008D910190801921F441505040C8F7881BBA +:10670000990B0895FB01DC0102C001900D924150EC +:106710005040D8F70895F999FECF92BD81BDF89AFF +:10672000992780B50895A6E1B0E044E050E00C94CC +:10673000C533A8E1B0E042E050E00C94C533262F09 +:10674000F999FECF92BD81BDF89A019700B4021667 +:1067500039F01FBA20BD0FB6F894FA9AF99A0FBE15 +:1067600008950396272F0E94A0330E949F33252F60 +:106770000E94A033242F0C94A0330196272F0E944F +:10678000A0330C949F33DC01CB01FC01F999FECFBF +:1067900006C0F2BDE1BDF89A319600B40D924150A9 +:1067A0005040B8F70895F894FFCFAA14D214751684 +:1067B000D2147516051526157516241631164A209D +:1067C0004A20852085202E21B4204122B4204A2150 +:1067D000B721C821C8214B227822552258225F2296 +:1067E0005B226422402E442E882E992EA42EAF2E9A +:1067F000B22EEE2E182F962E962E232F262F2A2FCE +:0A680000502F732F762F782F9D2F55 +:10680A000000000100000000000000050100000077 +:10681A00000000010600000000000001070000005F +:10682A000408000000000000080C0000000000003E +:10683A000113085D0C1208330C1008F4F50021004E +:10684A007F22000301191A1B1C1D1E1F2021220171 +:10685A000201004600464601818283E200E900EA1D +:10686A0000B500B600B700CD008301CC008A0192C2 +:10687A000194012102230224022502260227022A68 +:10688A0002B300B4006F00700071026697C6343517 +:10689A00F6F73133323600FF0100010000FFFF0036 +:1068AA0000010001FF00000810181810080000017C +:1068BA00020202020606060909090909090F0F0F51 +:1068CA000F0F0F1515151819191919191919191959 +:1068DA001923244022320001DE00AC00510C6A0C5C +:0268EA008A0C16 +:00000001FF