Compare commits
2224 Commits
Author | SHA1 | Date |
---|---|---|
![]() |
835cc3134c | |
![]() |
02b30153ee | |
![]() |
d09dc5a2a5 | |
![]() |
98d9a30027 | |
![]() |
5cb4bc15bd | |
![]() |
bb2aba04d5 | |
![]() |
82e9b0bd6a | |
![]() |
47575d3449 | |
![]() |
32e2582ded | |
![]() |
d58dda6f50 | |
![]() |
648954d533 | |
![]() |
4aa38f4582 | |
![]() |
b3ba1aef13 | |
![]() |
2a6cbd39b7 | |
![]() |
ce5bcb9b85 | |
![]() |
5a3821ad3e | |
![]() |
fd0032b24c | |
![]() |
226719b36e | |
![]() |
fcfee53928 | |
![]() |
285ae34b50 | |
![]() |
a170a97688 | |
![]() |
a770f57b28 | |
![]() |
5757fc20c9 | |
![]() |
421289f63b | |
![]() |
ac85316578 | |
![]() |
08af9be061 | |
![]() |
ead0fbbd1e | |
![]() |
dc85a808f8 | |
![]() |
aecfa814f9 | |
![]() |
436f3d3c36 | |
![]() |
68a8187964 | |
![]() |
f30e4c12fe | |
![]() |
686514ed1d | |
![]() |
d795da1750 | |
![]() |
3219ff7c6e | |
![]() |
33567a2cfd | |
![]() |
85310bfbff | |
![]() |
d1d79a37b7 | |
![]() |
d95592acc9 | |
![]() |
f6a3fb65da | |
![]() |
6788cca363 | |
![]() |
1fb442e096 | |
![]() |
6e64ff61c5 | |
![]() |
dd8fe68a11 | |
![]() |
a3829089f9 | |
![]() |
174c1ee791 | |
![]() |
b8793fd2b6 | |
![]() |
31986ca3a0 | |
![]() |
10ff740f75 | |
![]() |
83fbab63c0 | |
![]() |
c4670946e6 | |
![]() |
e5239d952e | |
![]() |
a57783a9d8 | |
![]() |
001a6e4fda | |
![]() |
dd621038f9 | |
![]() |
288c233447 | |
![]() |
399c6e792b | |
![]() |
0be6facba4 | |
![]() |
dc7247a12d | |
![]() |
377c4fd104 | |
![]() |
252d496dc2 | |
![]() |
83e334c3f8 | |
![]() |
e72ad10dfc | |
![]() |
9ef392c575 | |
![]() |
76057efbb7 | |
![]() |
dcb121750a | |
![]() |
13fa769e9e | |
![]() |
3143991239 | |
![]() |
1ae0c5aa4d | |
![]() |
5ea39f86f7 | |
![]() |
d6a946e096 | |
![]() |
b68c1fbd04 | |
![]() |
07d3629622 | |
![]() |
15daa9acef | |
![]() |
817a4a03b6 | |
![]() |
e63386e9eb | |
![]() |
402acdfea9 | |
![]() |
b440206d07 | |
![]() |
c7bea4a743 | |
![]() |
2528d87b8f | |
![]() |
405d74fada | |
![]() |
b311220132 | |
![]() |
66b47457b1 | |
![]() |
6e9f9f8bf8 | |
![]() |
88a113dc8f | |
![]() |
a61f860466 | |
![]() |
729a4607bd | |
![]() |
d81dcc9aa2 | |
![]() |
1e4f3fa82b | |
![]() |
150a1d63c4 | |
![]() |
6b481733b9 | |
![]() |
e07b9b1550 | |
![]() |
99c2b53ec6 | |
![]() |
2a93e5d2a3 | |
![]() |
3661207602 | |
![]() |
92845728cc | |
![]() |
c99753fc8c | |
![]() |
688e6022a0 | |
![]() |
5408d994be | |
![]() |
003c9766bc | |
![]() |
82e9c257ce | |
![]() |
6167cc7c4b | |
![]() |
1bacecf8d4 | |
![]() |
d102686379 | |
![]() |
1160955629 | |
![]() |
e60f765a50 | |
![]() |
d3db696616 | |
![]() |
b8d16c6e4d | |
![]() |
b22923d12f | |
![]() |
1ea307efdd | |
![]() |
d98cff878f | |
![]() |
dd11708f9f | |
![]() |
665a7818c9 | |
![]() |
d75b907ae4 | |
![]() |
f051bc4812 | |
![]() |
9773f78506 | |
![]() |
f4b7c99c31 | |
![]() |
97519b2307 | |
![]() |
806ca5028a | |
![]() |
db89e3a1a0 | |
![]() |
6030a78b91 | |
![]() |
99ec82795c | |
![]() |
b1e8b591ba | |
![]() |
ac9e16632d | |
![]() |
d8f977b57a | |
![]() |
c3283c47f6 | |
![]() |
2b86f2d741 | |
![]() |
9f6389845a | |
![]() |
7489fd0aaf | |
![]() |
7e1c379fd3 | |
![]() |
c0765120e8 | |
![]() |
7e10de32cb | |
![]() |
145d61fe5e | |
![]() |
72b278de6e | |
![]() |
5e977e8dc4 | |
![]() |
109eb31aa5 | |
![]() |
1b6f3005f5 | |
![]() |
d02f894d4a | |
![]() |
20561e2938 | |
![]() |
a3724d739b | |
![]() |
cf1da34e16 | |
![]() |
5454950838 | |
![]() |
ed7abe3571 | |
![]() |
b14bf93ef9 | |
![]() |
3436bbe52b | |
![]() |
1a26e77dd9 | |
![]() |
da1fc0a2f0 | |
![]() |
d1fd5ae881 | |
![]() |
8c04e7d2d3 | |
![]() |
3fc1adc503 | |
![]() |
691c9f378a | |
![]() |
a769385219 | |
![]() |
f1f23fa220 | |
![]() |
99ef0d9f81 | |
![]() |
5597c485d1 | |
![]() |
7f08ba27e6 | |
![]() |
99614aecdc | |
![]() |
726db7f0c9 | |
![]() |
67c39fd9d9 | |
![]() |
23d4eb77b2 | |
![]() |
124ec078aa | |
![]() |
e6c9bc447e | |
![]() |
7bc4b652fa | |
![]() |
6ab1f5c844 | |
![]() |
816ff2ed08 | |
![]() |
6ca36ebbb5 | |
![]() |
f511e4556e | |
![]() |
36515432c7 | |
![]() |
47782c0168 | |
![]() |
3a370f2827 | |
![]() |
90f5596cb2 | |
![]() |
75439a600e | |
![]() |
f46960fdd0 | |
![]() |
f684780842 | |
![]() |
6c8631f1cd | |
![]() |
0311602539 | |
![]() |
b5e8098d20 | |
![]() |
111be57b59 | |
![]() |
76e19c8469 | |
![]() |
ccff016820 | |
![]() |
021e282b1c | |
![]() |
6699fcc1e7 | |
![]() |
f3ea192974 | |
![]() |
9c1a93f4c1 | |
![]() |
2c23f18e89 | |
![]() |
c88d2cdae9 | |
![]() |
8235e55357 | |
![]() |
754e6bbd72 | |
![]() |
e27d8874ef | |
![]() |
c310cc52d5 | |
![]() |
073cce825d | |
![]() |
a04fb59db7 | |
![]() |
f8ed871f8e | |
![]() |
fae97613d1 | |
![]() |
27df24f369 | |
![]() |
5bb95f59c0 | |
![]() |
bcabaab14c | |
![]() |
033f3472cb | |
![]() |
8fbd75ce94 | |
![]() |
3a38b59a4d | |
![]() |
c29b659afb | |
![]() |
ece161fac0 | |
![]() |
b57ab92269 | |
![]() |
5a3aa553cd | |
![]() |
a2f48dd007 | |
![]() |
4f10f38581 | |
![]() |
ea0dc0c6f1 | |
![]() |
93f536bf21 | |
![]() |
497ab62ee6 | |
![]() |
784a14f853 | |
![]() |
95447dd3f0 | |
![]() |
2cff8edb59 | |
![]() |
e4c0796e5e | |
![]() |
e3010fcd43 | |
![]() |
08b66d5e5a | |
![]() |
c618956639 | |
![]() |
c6ddb75630 | |
![]() |
1fd7b97ce6 | |
![]() |
fa5be193ad | |
![]() |
63874c8b4e | |
![]() |
b4dbfcd808 | |
![]() |
7a9b72a33a | |
![]() |
6db34b9cee | |
![]() |
ead51ae676 | |
![]() |
9a77aae56b | |
![]() |
3182f28359 | |
![]() |
a274b0c839 | |
![]() |
199b9249e4 | |
![]() |
08ba649a91 | |
![]() |
a0eb43188f | |
![]() |
b1bd5190c1 | |
![]() |
7fb5c8a378 | |
![]() |
26b1fad5a4 | |
![]() |
f028aefab8 | |
![]() |
f0d66300c4 | |
![]() |
12b291cf0b | |
![]() |
a8f686eb61 | |
![]() |
98bf4d21ac | |
![]() |
d5a82ab2b3 | |
![]() |
d5d7709c9f | |
![]() |
cfc197cdc0 | |
![]() |
e8cfb840fe | |
![]() |
f01f4926eb | |
![]() |
83a4e0a114 | |
![]() |
4b8a905d2a | |
![]() |
08ae8dceb5 | |
![]() |
ad28e7c638 | |
![]() |
9ba8047066 | |
![]() |
9ba9ec1556 | |
![]() |
ce2658b6e2 | |
![]() |
f3cc033182 | |
![]() |
7b44d163ca | |
![]() |
72d24a1cb0 | |
![]() |
c2c520fe27 | |
![]() |
ad55459649 | |
![]() |
dfac3f1825 | |
![]() |
adecbf8945 | |
![]() |
a371fabc70 | |
![]() |
c04ffdfc24 | |
![]() |
572721c57f | |
![]() |
4af09224d7 | |
![]() |
7f1ac9bea0 | |
![]() |
ce93b2b4c6 | |
![]() |
d98ed6649e | |
![]() |
468422084a | |
![]() |
395167aafa | |
![]() |
803cf59f11 | |
![]() |
133511aeec | |
![]() |
be024c1bbe | |
![]() |
6f10c71623 | |
![]() |
adb2430d71 | |
![]() |
990453cdad | |
![]() |
7cf69f6993 | |
![]() |
5822110c87 | |
![]() |
669a88c1ff | |
![]() |
6a8c77b578 | |
![]() |
a93d12df03 | |
![]() |
80096c5e71 | |
![]() |
307b084214 | |
![]() |
1e0f3b69fb | |
![]() |
550d0d3c40 | |
![]() |
96f8fe680f | |
![]() |
b48adc7a62 | |
![]() |
6db016060b | |
![]() |
ecb0b3e9d0 | |
![]() |
8c060314da | |
![]() |
a040a605d4 | |
![]() |
09fb76d148 | |
![]() |
ddda5b3cc1 | |
![]() |
cff425f916 | |
![]() |
76d54f0a95 | |
![]() |
2093c472b5 | |
![]() |
1009c62ea0 | |
![]() |
2cd94fcd5f | |
![]() |
cb35b14311 | |
![]() |
6b3cb712c7 | |
![]() |
cfbafffe46 | |
![]() |
2913a85368 | |
![]() |
5c160d75a6 | |
![]() |
f14b1b71e7 | |
![]() |
4e3a56e466 | |
![]() |
30716b57e6 | |
![]() |
b18559aa5e | |
![]() |
6d8ef35bd6 | |
![]() |
8146e0e7f2 | |
![]() |
23b8e2dd76 | |
![]() |
e12dc28052 | |
![]() |
6538442b0b | |
![]() |
4a9cc603d2 | |
![]() |
d4aa8fb377 | |
![]() |
977fd80d0c | |
![]() |
ad64743874 | |
![]() |
436c469b1d | |
![]() |
7d05d0c884 | |
![]() |
1afbcacec3 | |
![]() |
9b5464b9a5 | |
![]() |
da8e912a95 | |
![]() |
a4cbfd9235 | |
![]() |
5e0c5e39f6 | |
![]() |
e798e3d6e2 | |
![]() |
937ab55456 | |
![]() |
aa0882c449 | |
![]() |
f5b70d5a23 | |
![]() |
6d818f40d2 | |
![]() |
6a5f185c80 | |
![]() |
62b7679408 | |
![]() |
c11aa205a3 | |
![]() |
47af7a5da6 | |
![]() |
89b645b334 | |
![]() |
62c9fe6011 | |
![]() |
a45c39ed91 | |
![]() |
f35d206044 | |
![]() |
f46694f2d0 | |
![]() |
5c493d413b | |
![]() |
32fc655326 | |
![]() |
9cf63c2cfa | |
![]() |
b59c919733 | |
![]() |
e66af1e1d2 | |
![]() |
f1cf802746 | |
![]() |
d1387f5183 | |
![]() |
9190b208eb | |
![]() |
fdd934ae0c | |
![]() |
b1c8070fc3 | |
![]() |
56753d3614 | |
![]() |
66966e6729 | |
![]() |
0f7639da6d | |
![]() |
2a81054f64 | |
![]() |
22ea3ff2ad | |
![]() |
d3e76a1c2d | |
![]() |
72326d220e | |
![]() |
52dfaf18c1 | |
![]() |
40acb33bbd | |
![]() |
74d5d3540f | |
![]() |
3ba90705ff | |
![]() |
6c14f80791 | |
![]() |
5fa964ed50 | |
![]() |
da28828880 | |
![]() |
21c8c6d267 | |
![]() |
5868b4f0f9 | |
![]() |
d53afe2538 | |
![]() |
96b7e8d859 | |
![]() |
60e42cea07 | |
![]() |
43ec860bfe | |
![]() |
1f971c7490 | |
![]() |
5e7de49999 | |
![]() |
35c1ab93a0 | |
![]() |
a85107cc51 | |
![]() |
46dae11085 | |
![]() |
c885e4ceda | |
![]() |
26bce739d7 | |
![]() |
3747417865 | |
![]() |
4c0248ca00 | |
![]() |
fd9c03ac2f | |
![]() |
d11e8d4fe2 | |
![]() |
56a807f294 | |
![]() |
cf71f89077 | |
![]() |
3ff077ea04 | |
![]() |
697df8a7fe | |
![]() |
c2ccfd02da | |
![]() |
1e9b1618f1 | |
![]() |
d92da4b6e4 | |
![]() |
67debca9d9 | |
![]() |
a0bee1846e | |
![]() |
73192f5762 | |
![]() |
a1e32f8b89 | |
![]() |
2002db7807 | |
![]() |
07374ceeee | |
![]() |
d02be1521d | |
![]() |
5c92f3e3e0 | |
![]() |
41a5a3a791 | |
![]() |
42a89129d4 | |
![]() |
2617925cd8 | |
![]() |
7a0b6e9262 | |
![]() |
3f5c168ffc | |
![]() |
09d9f50160 | |
![]() |
d274fda428 | |
![]() |
58a2b6714e | |
![]() |
4c3659f857 | |
![]() |
b8dc9c0d25 | |
![]() |
c4f28a6ac5 | |
![]() |
1ab52cb174 | |
![]() |
f315c8b134 | |
![]() |
8bfac0f6ff | |
![]() |
4bed9f726c | |
![]() |
0145492773 | |
![]() |
2188c22425 | |
![]() |
e9c419529d | |
![]() |
6ee647b249 | |
![]() |
5676435473 | |
![]() |
8cf28fcaba | |
![]() |
237899c91a | |
![]() |
73e4e83ced | |
![]() |
5b63667bc2 | |
![]() |
00ce5d70c9 | |
![]() |
b3d14d853c | |
![]() |
c1af0c6115 | |
![]() |
f3bb7aac96 | |
![]() |
cd84f6329a | |
![]() |
b4fa9c2934 | |
![]() |
9db6ddaf98 | |
![]() |
ed55e060aa | |
![]() |
bb37b89d35 | |
![]() |
07fc98670c | |
![]() |
25aecf82a6 | |
![]() |
242fbfaaa7 | |
![]() |
ef5a1c223c | |
![]() |
8637f176c1 | |
![]() |
4c5300be12 | |
![]() |
1ccd7766bc | |
![]() |
9711c99217 | |
![]() |
10f45b6b4c | |
![]() |
7c44b92bce | |
![]() |
4784b13c86 | |
![]() |
a8c8c017f6 | |
![]() |
c98e4430b1 | |
![]() |
adf94990c2 | |
![]() |
e78021a538 | |
![]() |
3c38ecdd97 | |
![]() |
12021fcf15 | |
![]() |
1031ab3a18 | |
![]() |
e75c575a32 | |
![]() |
9c91222fff | |
![]() |
d0eb2a441a | |
![]() |
5c6d544562 | |
![]() |
ceca53a75d | |
![]() |
6eaed063ec | |
![]() |
bc5eb1b5f0 | |
![]() |
1a11eb6a6b | |
![]() |
cff67a3b1d | |
![]() |
3518ac7cb2 | |
![]() |
f2d7ef41da | |
![]() |
87e0f132d1 | |
![]() |
9306018111 | |
![]() |
19d33a44ea | |
![]() |
e755b60807 | |
![]() |
f50bcd0785 | |
![]() |
fc6481acae | |
![]() |
de0651bb47 | |
![]() |
358b1e8bf3 | |
![]() |
84b94c614e | |
![]() |
3fa848bb5a | |
![]() |
533566fde8 | |
![]() |
6ab1adfe5b | |
![]() |
205dcf6ff1 | |
![]() |
beaee8764c | |
![]() |
d22188ea2a | |
![]() |
53ef0be7b8 | |
![]() |
e3edb09f38 | |
![]() |
316f3c1bb0 | |
![]() |
6948335ea7 | |
![]() |
25decd0514 | |
![]() |
a35c75717e | |
![]() |
8d6d3c9e18 | |
![]() |
91df5350ad | |
![]() |
22740fb16c | |
![]() |
0316bbc1cd | |
![]() |
8bac53e9be | |
![]() |
42e2569569 | |
![]() |
dd81201a95 | |
![]() |
805e1ce771 | |
![]() |
322badd209 | |
![]() |
8438d32ce9 | |
![]() |
3446ed2d6b | |
![]() |
6a51834f82 | |
![]() |
89461244bd | |
![]() |
b1847b8c41 | |
![]() |
11eed2c89d | |
![]() |
b971b716bf | |
![]() |
9f8a1f08be | |
![]() |
c1ac349211 | |
![]() |
1804fcfbe1 | |
![]() |
303addae42 | |
![]() |
9e80f7b051 | |
![]() |
0e32d835ef | |
![]() |
462b198895 | |
![]() |
34e2833555 | |
![]() |
8b180ea423 | |
![]() |
a90400c280 | |
![]() |
e49a1932f3 | |
![]() |
abf83821d9 | |
![]() |
6ed50c4206 | |
![]() |
edab8dd93b | |
![]() |
ab03633431 | |
![]() |
67b554c68f | |
![]() |
68f3a280a5 | |
![]() |
5db4f8cf26 | |
![]() |
3e57d0092a | |
![]() |
36408d74ad | |
![]() |
9aa9305755 | |
![]() |
6f9cdb9dda | |
![]() |
0aa370aeb9 | |
![]() |
27fee8e10c | |
![]() |
ac1e4ad9a2 | |
![]() |
73f2fe4fd0 | |
![]() |
8b4318c06e | |
![]() |
7636ea480d | |
![]() |
54e5f2149b | |
![]() |
b1f0a4247a | |
![]() |
8d6cdafc23 | |
![]() |
5711576a0d | |
![]() |
6df9b1e019 | |
![]() |
c2e7abcfca | |
![]() |
b6c58f16e7 | |
![]() |
b47a3c65aa | |
![]() |
0315d610e0 | |
![]() |
3714e71297 | |
![]() |
9f4b0aec6b | |
![]() |
0ea5bc2dcc | |
![]() |
64608c7e62 | |
![]() |
2d8c0a5306 | |
![]() |
81c451d31f | |
![]() |
d04aa313fc | |
![]() |
45ab822fba | |
![]() |
c893216874 | |
![]() |
a1a869181b | |
![]() |
f5cbd8d491 | |
![]() |
17917f3257 | |
![]() |
19be33b17d | |
![]() |
cfcca0d782 | |
![]() |
5592a8d376 | |
![]() |
0c0ebb2ebb | |
![]() |
d6d78d1e99 | |
![]() |
b6da7019d0 | |
![]() |
a123e20b05 | |
![]() |
856334cf30 | |
![]() |
3f5b2afbd5 | |
![]() |
ad35c89d7d | |
![]() |
71a0ce8fb0 | |
![]() |
d53a3b4d64 | |
![]() |
bd0c66466f | |
![]() |
0a751919aa | |
![]() |
cae68947df | |
![]() |
2b833b5141 | |
![]() |
b24c0ba2f3 | |
![]() |
3b8126781d | |
![]() |
a1a63f2c35 | |
![]() |
334c9f852a | |
![]() |
17128a889b | |
![]() |
d2b99f200b | |
![]() |
5f4a77f2d8 | |
![]() |
3614997fa9 | |
![]() |
5f76d304f6 | |
![]() |
e8688c0ce4 | |
![]() |
641a12d640 | |
![]() |
169741d5a1 | |
![]() |
4aec2a7ade | |
![]() |
ee9cba328f | |
![]() |
c421be9e91 | |
![]() |
7a1768ca87 | |
![]() |
b9e9ab89f7 | |
![]() |
b9f3c3f4e2 | |
![]() |
dc842b479b | |
![]() |
02e6fb88aa | |
![]() |
c10310af3a | |
![]() |
7e41fe73e7 | |
![]() |
c122457565 | |
![]() |
0ea0acfaa5 | |
![]() |
866ad8b13b | |
![]() |
c5d4e199fc | |
![]() |
1a8946b151 | |
![]() |
9c0e19e198 | |
![]() |
816f809ca7 | |
![]() |
32a995f678 | |
![]() |
dac3187866 | |
![]() |
60cdec3ae4 | |
![]() |
ed4adf21f4 | |
![]() |
a8f0e239cf | |
![]() |
be1a183e62 | |
![]() |
d88cedb614 | |
![]() |
9880152290 | |
![]() |
0a1bd46ca9 | |
![]() |
83ef17d302 | |
![]() |
cb6473920f | |
![]() |
d8c769433a | |
![]() |
fd7a0f4051 | |
![]() |
7899312e73 | |
![]() |
784d8223e8 | |
![]() |
344a9e6fe5 | |
![]() |
22e78c03e1 | |
![]() |
b67ca5c42d | |
![]() |
bdec8b842e | |
![]() |
3bc7c28a97 | |
![]() |
a4992e905c | |
![]() |
c8381eb808 | |
![]() |
0aabc72652 | |
![]() |
3d4204f080 | |
![]() |
dc3fed3408 | |
![]() |
a12a3c74f4 | |
![]() |
3c83dbe0ff | |
![]() |
4970214324 | |
![]() |
a5ae5ad8e9 | |
![]() |
54808f32ea | |
![]() |
4e4c532813 | |
![]() |
aac4dba641 | |
![]() |
17f1b60a9b | |
![]() |
2a10191926 | |
![]() |
87ec7d8773 | |
![]() |
e518d4c117 | |
![]() |
c4dfc7b11d | |
![]() |
0c04c04590 | |
![]() |
11b2b16233 | |
![]() |
4c6805510d | |
![]() |
cb01d32e19 | |
![]() |
89a5bfba20 | |
![]() |
87a2db1745 | |
![]() |
387227cc1f | |
![]() |
fdb3b308e1 | |
![]() |
b33aff51c1 | |
![]() |
be09fbb5ac | |
![]() |
2b4a804934 | |
![]() |
fcfba41805 | |
![]() |
d14a06528c | |
![]() |
c336c8cb0d | |
![]() |
755d870a10 | |
![]() |
4ed301f531 | |
![]() |
263fcbe001 | |
![]() |
883f760292 | |
![]() |
5af8a2168d | |
![]() |
50badaef2b | |
![]() |
4c20115705 | |
![]() |
e21583eafd | |
![]() |
983763c48d | |
![]() |
75ceee5449 | |
![]() |
572c57d3a7 | |
![]() |
4f98eaf85b | |
![]() |
44a1c87484 | |
![]() |
b18dd7c01a | |
![]() |
356e8f0934 | |
![]() |
1288e0361a | |
![]() |
8f95ba290a | |
![]() |
5a603a084f | |
![]() |
f144934cd7 | |
![]() |
9473e419b4 | |
![]() |
a081a8fdf9 | |
![]() |
e660ce6a31 | |
![]() |
5c7b10299b | |
![]() |
42957dbb16 | |
![]() |
c3df892f1c | |
![]() |
26f386ad31 | |
![]() |
b861280548 | |
![]() |
9d22293927 | |
![]() |
c3d8f4090e | |
![]() |
3f00dba937 | |
![]() |
9f00aed4fa | |
![]() |
685d0f4bac | |
![]() |
a805c8f75a | |
![]() |
ce23a39f83 | |
![]() |
c0a971a27b | |
![]() |
7f567f6e9d | |
![]() |
865fcee12d | |
![]() |
6b3fc39a1d | |
![]() |
7b1f36cb9c | |
![]() |
f6f308baa2 | |
![]() |
e170ed608e | |
![]() |
a432d78953 | |
![]() |
b369dc31f2 | |
![]() |
778eb0474f | |
![]() |
8c1f196675 | |
![]() |
e25ac66abf | |
![]() |
a2a334bdac | |
![]() |
8331b30d73 | |
![]() |
7083577db2 | |
![]() |
1b91c97c24 | |
![]() |
cca6cdf95d | |
![]() |
7c02a51a46 | |
![]() |
0e34fdaa8d | |
![]() |
e2f05d9a64 | |
![]() |
13437c56d4 | |
![]() |
4b4b3c341f | |
![]() |
c2f8f5cfab | |
![]() |
d4c883a5d7 | |
![]() |
520366c4ac | |
![]() |
342b4cddc4 | |
![]() |
6ea85341b9 | |
![]() |
9af8a71e17 | |
![]() |
33488d716d | |
![]() |
a5ff8bbdb6 | |
![]() |
16bb32b86c | |
![]() |
8826a7b984 | |
![]() |
5b419cb8ab | |
![]() |
db21f4eb13 | |
![]() |
3a7ac06ce3 | |
![]() |
0c8279311e | |
![]() |
331b2b396a | |
![]() |
a20473d718 | |
![]() |
1a12430322 | |
![]() |
7a416c0ff7 | |
![]() |
81e392c0f6 | |
![]() |
71c2d3aaad | |
![]() |
19bbd4215c | |
![]() |
5301498978 | |
![]() |
1d887967d9 | |
![]() |
a95b97b3c0 | |
![]() |
007637a557 | |
![]() |
6ded1c62e5 | |
![]() |
27f1eec967 | |
![]() |
821f46481e | |
![]() |
6b97505f66 | |
![]() |
df471161a7 | |
![]() |
da627f71e5 | |
![]() |
78079588ea | |
![]() |
b4ebd6c08a | |
![]() |
e6f2f518e6 | |
![]() |
aff89371e6 | |
![]() |
98a7a71b87 | |
![]() |
98a0717bba | |
![]() |
7c8c8a754f | |
![]() |
ab13e716ad | |
![]() |
f2c31d866d | |
![]() |
e169206821 | |
![]() |
cd77d659a5 | |
![]() |
b6f38a73dc | |
![]() |
c384920275 | |
![]() |
097fc9b3e9 | |
![]() |
b8fbfdee55 | |
![]() |
8c0b73625d | |
![]() |
55cd75b5f4 | |
![]() |
f8f519e882 | |
![]() |
799dca7e1b | |
![]() |
eae1bdf3a6 | |
![]() |
ea27259a67 | |
![]() |
ebe195f078 | |
![]() |
e2b68788bd | |
![]() |
c8ca4fcfce | |
![]() |
2c38433a2b | |
![]() |
ee0b13dab2 | |
![]() |
4d2347cf84 | |
![]() |
7cf40a9ee4 | |
![]() |
70f678119a | |
![]() |
0a2b967e36 | |
![]() |
a2367299b7 | |
![]() |
bbcc36647d | |
![]() |
906140686f | |
![]() |
cecaf314f9 | |
![]() |
4a3bb89259 | |
![]() |
d7db836e30 | |
![]() |
1eca4bcec7 | |
![]() |
c02052a982 | |
![]() |
be841f0426 | |
![]() |
6c4743d7ed | |
![]() |
726d6cf4b0 | |
![]() |
35cedbdbb3 | |
![]() |
17597e2c30 | |
![]() |
1bb705014f | |
![]() |
204dd76e7b | |
![]() |
3e41a11197 | |
![]() |
68d4617e46 | |
![]() |
4654025423 | |
![]() |
231afa8ed6 | |
![]() |
c3ff71ff85 | |
![]() |
0e99b219c1 | |
![]() |
13508b449d | |
![]() |
e57e1f51ea | |
![]() |
c345ab1419 | |
![]() |
bee869340d | |
![]() |
1de4680ded | |
![]() |
bba1165c77 | |
![]() |
a5c7aaab3b | |
![]() |
93cd1fd07d | |
![]() |
cfaf581ae1 | |
![]() |
665c1d5fe4 | |
![]() |
8d8c1a8080 | |
![]() |
8827bdb8b0 | |
![]() |
cd81f925cb | |
![]() |
d7f4c651b6 | |
![]() |
f2159f1031 | |
![]() |
581c94f6b3 | |
![]() |
9eb8eaa906 | |
![]() |
9915ef8b19 | |
![]() |
2d784b48f4 | |
![]() |
cee2a6ec34 | |
![]() |
64e855ab2d | |
![]() |
5aa921ae4b | |
![]() |
40a72458e2 | |
![]() |
dc2be5c410 | |
![]() |
640ec66abc | |
![]() |
3aedcfdd06 | |
![]() |
71fe549ee6 | |
![]() |
cbe1de98a5 | |
![]() |
5a58c1c6ce | |
![]() |
591d44dee4 | |
![]() |
6da58ef6bb | |
![]() |
85d5de9791 | |
![]() |
5ce78f4b32 | |
![]() |
2499f8c0ab | |
![]() |
3f2eb1047e | |
![]() |
ac79bbb99b | |
![]() |
1c4fb0b5ea | |
![]() |
2e2d0dd6f6 | |
![]() |
a6c91d5e27 | |
![]() |
949206738b | |
![]() |
4dc715a39a | |
![]() |
36d7554b46 | |
![]() |
d42e8f66ca | |
![]() |
244b7e5bd1 | |
![]() |
ca7a7c1f91 | |
![]() |
504221ce28 | |
![]() |
1e643b8164 | |
![]() |
0944c0708f | |
![]() |
17575fc6a1 | |
![]() |
1354b884b4 | |
![]() |
1ace26b67f | |
![]() |
117336a6b4 | |
![]() |
d1cce95abe | |
![]() |
22fbb7b5bd | |
![]() |
34ebab7c21 | |
![]() |
5e8579e4dc | |
![]() |
4721f66dab | |
![]() |
02b313f2e6 | |
![]() |
b0ae424adb | |
![]() |
5a6fb990c7 | |
![]() |
c294df6b26 | |
![]() |
c3e4563aeb | |
![]() |
525fd3145d | |
![]() |
32452d918a | |
![]() |
e524c50b65 | |
![]() |
96952c3fef | |
![]() |
ad710de008 | |
![]() |
21ff9d200c | |
![]() |
a1c6f5d5fd | |
![]() |
6d64d17b7d | |
![]() |
695d088f60 | |
![]() |
bcb888100c | |
![]() |
146e108874 | |
![]() |
4837a01812 | |
![]() |
48f4837a24 | |
![]() |
8b320d2f09 | |
![]() |
ac22b14358 | |
![]() |
4d5a403d6d | |
![]() |
9dc424cc75 | |
![]() |
1b75753a3d | |
![]() |
a7b300d233 | |
![]() |
68e42b8b36 | |
![]() |
e061d95ae6 | |
![]() |
6b517adbe8 | |
![]() |
33c0732c08 | |
![]() |
f1e0350433 | |
![]() |
d5f486d1ad | |
![]() |
7fb8337095 | |
![]() |
7adf63dfa8 | |
![]() |
d2f7e6142f | |
![]() |
b62727b046 | |
![]() |
f0a337e0ed | |
![]() |
5c755bc121 | |
![]() |
4d0631ba38 | |
![]() |
d4962bb2ab | |
![]() |
cf319a2604 | |
![]() |
256db71aa4 | |
![]() |
de8601ded4 | |
![]() |
a96f3b1eb7 | |
![]() |
a7aa1fa5ec | |
![]() |
bbd12a0381 | |
![]() |
027ca8d639 | |
![]() |
a0f60dddb2 | |
![]() |
a3038c46fd | |
![]() |
d98f152009 | |
![]() |
68beee12d3 | |
![]() |
4b59b9f65d | |
![]() |
85d390e18d | |
![]() |
3f89286946 | |
![]() |
554b8d195b | |
![]() |
7f5fa44fd3 | |
![]() |
c95d60ab0f | |
![]() |
60a82a3ad9 | |
![]() |
2f9af2e2d0 | |
![]() |
858fdcec59 | |
![]() |
3eb1782a64 | |
![]() |
0e14d167dc | |
![]() |
c701a2b5f9 | |
![]() |
b3442ee108 | |
![]() |
1bde3b4ec9 | |
![]() |
e83c6f92cb | |
![]() |
06cca44376 | |
![]() |
3f3898c774 | |
![]() |
f8a380fd59 | |
![]() |
f28525129e | |
![]() |
d2cbbd309b | |
![]() |
74d78f4bca | |
![]() |
68af931128 | |
![]() |
5331afb763 | |
![]() |
069b1ff689 | |
![]() |
009d6be057 | |
![]() |
da4b592e54 | |
![]() |
81f3519408 | |
![]() |
8c09112cff | |
![]() |
8983256ade | |
![]() |
d323292162 | |
![]() |
1714a0225e | |
![]() |
fd3b0a92ce | |
![]() |
9b1dd771ad | |
![]() |
441e80e0e8 | |
![]() |
4634266e14 | |
![]() |
10fd25607d | |
![]() |
946f68e4ef | |
![]() |
a4ceb8bd2c | |
![]() |
545b72cc3e | |
![]() |
9e229a1c0f | |
![]() |
ddfd0653ac | |
![]() |
6bb8c18857 | |
![]() |
66eee86eb3 | |
![]() |
eaeae7ad98 | |
![]() |
a3eeee9b57 | |
![]() |
6d46ac67de | |
![]() |
db6be20864 | |
![]() |
5e8e9fa19f | |
![]() |
ebff286c31 | |
![]() |
0f805d57e3 | |
![]() |
33adb92902 | |
![]() |
a85422f29e | |
![]() |
aa933d9a09 | |
![]() |
8a9c8edf39 | |
![]() |
74e3605ec6 | |
![]() |
dc44af6968 | |
![]() |
a4a130bfc6 | |
![]() |
2fb5d8fe11 | |
![]() |
1772edd37c | |
![]() |
b4bd9e9c7b | |
![]() |
994faf94d6 | |
![]() |
048abaeeed | |
![]() |
f3fa3c2ae2 | |
![]() |
ee87cbc25c | |
![]() |
4ce32c415e | |
![]() |
c60411c901 | |
![]() |
9f24d0d1ce | |
![]() |
684f85b45e | |
![]() |
83d9419131 | |
![]() |
1fe233bc91 | |
![]() |
70ae8365fe | |
![]() |
038d15ecf3 | |
![]() |
86fc492af4 | |
![]() |
eed634217e | |
![]() |
122036fd14 | |
![]() |
a150c3cd4a | |
![]() |
01b7e81f44 | |
![]() |
e1456f530c | |
![]() |
5d86b6cf50 | |
![]() |
76a72c8341 | |
![]() |
7b52b22c5f | |
![]() |
c84a79d3f5 | |
![]() |
0dd49b7c9b | |
![]() |
f8b9cdaead | |
![]() |
b83e3c967d | |
![]() |
5ed34c149a | |
![]() |
cf2b3485ad | |
![]() |
8740c286a0 | |
![]() |
ffea5bd3ae | |
![]() |
0820735fa2 | |
![]() |
549275e5dc | |
![]() |
e268f769b7 | |
![]() |
0af356823a | |
![]() |
b5fc88bc8e | |
![]() |
86528a3335 | |
![]() |
f6d994e6a4 | |
![]() |
533d4aead1 | |
![]() |
094ef7e173 | |
![]() |
086b6253bc | |
![]() |
d3a5be365e | |
![]() |
87cc894512 | |
![]() |
c99eedd5c8 | |
![]() |
7643588b00 | |
![]() |
ce457e4ad4 | |
![]() |
ae63213809 | |
![]() |
c44a35a6c4 | |
![]() |
cc8f10f971 | |
![]() |
13f7ce0cad | |
![]() |
e1f3bd2f41 | |
![]() |
6bc2e0cca5 | |
![]() |
a4e51dd4a7 | |
![]() |
0eaf63f5f7 | |
![]() |
bd5ded7333 | |
![]() |
6d1dbfad1e | |
![]() |
96059d156c | |
![]() |
30c57cf998 | |
![]() |
d1dc8140e4 | |
![]() |
bf7919a877 | |
![]() |
25044beaef | |
![]() |
81941bb140 | |
![]() |
d6794e6de8 | |
![]() |
b3ed044408 | |
![]() |
1e438764a0 | |
![]() |
9e875f4039 | |
![]() |
5f7ddcb8ce | |
![]() |
e73ac58ff3 | |
![]() |
bcc856bc6b | |
![]() |
6473ddaf9f | |
![]() |
ce9a4c6b3d | |
![]() |
006a67ee01 | |
![]() |
ae6b745e68 | |
![]() |
7599271f31 | |
![]() |
2c2ef33565 | |
![]() |
d965e29867 | |
![]() |
67dddf5391 | |
![]() |
7116efe207 | |
![]() |
6a854ab070 | |
![]() |
5083a80ba2 | |
![]() |
37be465174 | |
![]() |
fd68da9566 | |
![]() |
6917724700 | |
![]() |
2c33d1f7f0 | |
![]() |
f612fcbf00 | |
![]() |
afc9f91dc3 | |
![]() |
2952331998 | |
![]() |
da6aecc3f2 | |
![]() |
ad522dd745 | |
![]() |
b0fcedd3f3 | |
![]() |
fe319e58fe | |
![]() |
45545d86b4 | |
![]() |
c59494f604 | |
![]() |
523d226b91 | |
![]() |
27aa21a47a | |
![]() |
4984ae996e | |
![]() |
f494cbbb7a | |
![]() |
ef19f4723e | |
![]() |
1adf372de9 | |
![]() |
fe884ae436 | |
![]() |
ae651e08e9 | |
![]() |
b24e0ef178 | |
![]() |
3578698a86 | |
![]() |
1319793123 | |
![]() |
47c786a98a | |
![]() |
bc1f93dd89 | |
![]() |
976ea796f8 | |
![]() |
a746d6a03e | |
![]() |
393362c8fb | |
![]() |
af8f7b0c9f | |
![]() |
1c63b8a05d | |
![]() |
dfa7987756 | |
![]() |
7737dacd05 | |
![]() |
b75c7716c9 | |
![]() |
7e2be8bb19 | |
![]() |
399f8a790d | |
![]() |
fdfd0a6454 | |
![]() |
88b46bc359 | |
![]() |
fcebb43f35 | |
![]() |
e7b0acb5a0 | |
![]() |
e22e7f7af8 | |
![]() |
7a82d9e860 | |
![]() |
4804cd6ccb | |
![]() |
44f0effba5 | |
![]() |
5fd62c8050 | |
![]() |
8bda3e9b4d | |
![]() |
0154a7e97b | |
![]() |
fdfd961390 | |
![]() |
43359d771c | |
![]() |
ff71042bb0 | |
![]() |
68c0133381 | |
![]() |
dfd0208394 | |
![]() |
0229482be8 | |
![]() |
e78089a509 | |
![]() |
5e259f50f8 | |
![]() |
0bbd7b506a | |
![]() |
1ddb93bd5d | |
![]() |
2e512e61b2 | |
![]() |
37ecd7ec4e | |
![]() |
67747f85eb | |
![]() |
b5a5baa1bf | |
![]() |
bca83da8c9 | |
![]() |
ce0d9e826c | |
![]() |
8d33d80e1c | |
![]() |
30a886d84a | |
![]() |
bb2c3e54a5 | |
![]() |
aa3226ce43 | |
![]() |
f263cfac24 | |
![]() |
d122e27578 | |
![]() |
7e82ae8a85 | |
![]() |
a8d60582d0 | |
![]() |
605e869413 | |
![]() |
a89d186730 | |
![]() |
6647595a3a | |
![]() |
c9e681c242 | |
![]() |
c13884414d | |
![]() |
b7a769e883 | |
![]() |
93f08b715b | |
![]() |
07dde5b1fa | |
![]() |
e67c08ff02 | |
![]() |
72dd93503a | |
![]() |
da5e0ac99c | |
![]() |
3ab4fd8a9a | |
![]() |
626b6cec64 | |
![]() |
e5078f4160 | |
![]() |
5373512d9b | |
![]() |
26404843c2 | |
![]() |
f236abdca9 | |
![]() |
382ee68125 | |
![]() |
5908e39e52 | |
![]() |
17672e674b | |
![]() |
6841594a9a | |
![]() |
e7f5a2e118 | |
![]() |
064065cfe1 | |
![]() |
da58d2e8b5 | |
![]() |
13364f1c9c | |
![]() |
ccb5a1ce56 | |
![]() |
e9f533d600 | |
![]() |
05b3abd290 | |
![]() |
6cac091c27 | |
![]() |
0332027963 | |
![]() |
9617890ab6 | |
![]() |
47637eca75 | |
![]() |
d32959b8b9 | |
![]() |
050118f26c | |
![]() |
43bc873bcb | |
![]() |
1b6a846102 | |
![]() |
88b063ca8e | |
![]() |
2bf1709dba | |
![]() |
1dffb1f40b | |
![]() |
00d909f16c | |
![]() |
91275f4332 | |
![]() |
976aecd8f2 | |
![]() |
9bc29cc66e | |
![]() |
a6db490f49 | |
![]() |
2c6ae62c7e | |
![]() |
05c08ca51f | |
![]() |
dc1acf140f | |
![]() |
90c256ed76 | |
![]() |
88e563501a | |
![]() |
bd72246715 | |
![]() |
2060a41f5d | |
![]() |
fdc9330195 | |
![]() |
e94a7c50a4 | |
![]() |
f9e278cc75 | |
![]() |
3168012fde | |
![]() |
5e2b5975ed | |
![]() |
d6cb8f74fe | |
![]() |
59bbc8d8ef | |
![]() |
7954ebd764 | |
![]() |
92612fc616 | |
![]() |
3437c36b87 | |
![]() |
3574d6a5ba | |
![]() |
9a72a7425e | |
![]() |
5707da5f72 | |
![]() |
bff6057e0c | |
![]() |
ecf7f872cb | |
![]() |
22485bc26a | |
![]() |
deaa680aae | |
![]() |
1f5cf04eb6 | |
![]() |
cfdf3e0b4a | |
![]() |
4f451e3822 | |
![]() |
f4692c5e32 | |
![]() |
327fb09973 | |
![]() |
7046316d60 | |
![]() |
67142ca7db | |
![]() |
1e977fb407 | |
![]() |
e418964819 | |
![]() |
fab7371d66 | |
![]() |
e0de230ef2 | |
![]() |
f255c010cd | |
![]() |
e7e79c9ac8 | |
![]() |
963d9e61d8 | |
![]() |
779a59c87e | |
![]() |
160e6699e3 | |
![]() |
9b7b5d3b02 | |
![]() |
ca9264a672 | |
![]() |
43e95bbba8 | |
![]() |
6380f9fc33 | |
![]() |
df0f823f1d | |
![]() |
ff3ef34784 | |
![]() |
4cfa4ee466 | |
![]() |
b9145b5b85 | |
![]() |
5be5002ea1 | |
![]() |
d88caab321 | |
![]() |
99e9ce3852 | |
![]() |
eae9d67649 | |
![]() |
2eaafdb1ac | |
![]() |
0be09f6cf8 | |
![]() |
afacd9cfbb | |
![]() |
7123f5f100 | |
![]() |
522e798669 | |
![]() |
201af9473e | |
![]() |
fae6fc8511 | |
![]() |
847d88a628 | |
![]() |
7cf1cf36fa | |
![]() |
bd19a633b0 | |
![]() |
8419bc51c1 | |
![]() |
9f6394eae3 | |
![]() |
6b94437b89 | |
![]() |
fca89aaaa6 | |
![]() |
5931bffca3 | |
![]() |
5938e39d99 | |
![]() |
36a2fb1ec5 | |
![]() |
c7db7fc2a7 | |
![]() |
d1d2610416 | |
![]() |
f528ef6bda | |
![]() |
fadd0574ac | |
![]() |
01cacb3ef6 | |
![]() |
c9a20b7fcf | |
![]() |
48ee29b621 | |
![]() |
78a61dc60f | |
![]() |
fdb6ddd540 | |
![]() |
3a09dfb066 | |
![]() |
877b59d0d3 | |
![]() |
5df556f96e | |
![]() |
cd936201b5 | |
![]() |
807cb9241b | |
![]() |
5ba8c41850 | |
![]() |
7ba43f8763 | |
![]() |
666960a9bd | |
![]() |
8c2f59ecf1 | |
![]() |
1be6992da0 | |
![]() |
050f8d40e0 | |
![]() |
77f4b7f0ec | |
![]() |
eb9e3dd4c6 | |
![]() |
2962d1fc9f | |
![]() |
b51e675291 | |
![]() |
0373d81199 | |
![]() |
a9d488b748 | |
![]() |
c9d9feb63f | |
![]() |
bea87f5be8 | |
![]() |
9fb914fb70 | |
![]() |
a49551f7bb | |
![]() |
0cfb6d36ca | |
![]() |
dcb2704a28 | |
![]() |
8c5796e4f6 | |
![]() |
41b7906612 | |
![]() |
1dd01e186b | |
![]() |
0af22b21d4 | |
![]() |
16763c4a3e | |
![]() |
12a5bd35d5 | |
![]() |
57e73050cd | |
![]() |
df7d9fa0da | |
![]() |
b1f4fb637e | |
![]() |
a37bccfbb2 | |
![]() |
287e2c9cd2 | |
![]() |
401f67382d | |
![]() |
b23a5ba7ac | |
![]() |
4fba4049e1 | |
![]() |
4329517b0f | |
![]() |
dcd69d7b29 | |
![]() |
cebaba2de3 | |
![]() |
8e71ee5a5c | |
![]() |
145df5e7cc | |
![]() |
f13726d8e2 | |
![]() |
4b9084bee4 | |
![]() |
6b96bdbc3b | |
![]() |
227b2cc0d8 | |
![]() |
08271deea1 | |
![]() |
d3c3de5a79 | |
![]() |
9b9162346b | |
![]() |
210d085caf | |
![]() |
058fd2f7b5 | |
![]() |
8b85c829d6 | |
![]() |
79af725f7f | |
![]() |
728aab8e95 | |
![]() |
1bded3121e | |
![]() |
e01567bd6a | |
![]() |
01b54a37bc | |
![]() |
44832fb11a | |
![]() |
fca1d49506 | |
![]() |
842f0d6229 | |
![]() |
0ac1cf240d | |
![]() |
13e9c53520 | |
![]() |
91a658db44 | |
![]() |
c581ba1b75 | |
![]() |
a9a45e0f20 | |
![]() |
6a11d3049a | |
![]() |
729657f345 | |
![]() |
5ca04f0652 | |
![]() |
a965dc9515 | |
![]() |
98261a864d | |
![]() |
2ec2df6efd | |
![]() |
21c70124e5 | |
![]() |
10abf0353f | |
![]() |
1f85d4d2f4 | |
![]() |
3b66d320e8 | |
![]() |
21a8554d6f | |
![]() |
8706e9ef0f | |
![]() |
64ac3677b1 | |
![]() |
cbc727f951 | |
![]() |
66721d80b5 | |
![]() |
0d660ac523 | |
![]() |
8984be5c3e | |
![]() |
ebeae46991 | |
![]() |
9a652e3748 | |
![]() |
1f1d748687 | |
![]() |
d406384dd0 | |
![]() |
0994c1f94f | |
![]() |
7664266dfe | |
![]() |
663af3ca83 | |
![]() |
e793a8d380 | |
![]() |
61c913b55b | |
![]() |
cc1aee6842 | |
![]() |
80ce233e6d | |
![]() |
9aeb5972cd | |
![]() |
f085364760 | |
![]() |
1f4c2df3ae | |
![]() |
32326471b1 | |
![]() |
8d7261a24a | |
![]() |
7e2fca9059 | |
![]() |
26fbac6bbc | |
![]() |
eaa8d3a03a | |
![]() |
4fa91563a5 | |
![]() |
09cff282cb | |
![]() |
52f8c1cf31 | |
![]() |
15f683d4c9 | |
![]() |
4dfe349802 | |
![]() |
0eddaf86eb | |
![]() |
cb2536437b | |
![]() |
194c1c1ff8 | |
![]() |
aae9653a4a | |
![]() |
c52f1eb0b8 | |
![]() |
f37058779a | |
![]() |
44b9450efa | |
![]() |
06b3b70272 | |
![]() |
4e46675f94 | |
![]() |
4a7a9ae1db | |
![]() |
35338dd104 | |
![]() |
14822ab51a | |
![]() |
0043292b25 | |
![]() |
fad9a5336a | |
![]() |
2453797400 | |
![]() |
0b1dabd80b | |
![]() |
da702bd40a | |
![]() |
600991fd50 | |
![]() |
8d70e9cd54 | |
![]() |
c502ee8909 | |
![]() |
9301ad627c | |
![]() |
702b770058 | |
![]() |
1db9ad3425 | |
![]() |
8bb388fb25 | |
![]() |
fa9c0d2f94 | |
![]() |
997ae3369d | |
![]() |
31655e558c | |
![]() |
49103b1c49 | |
![]() |
45c372b71c | |
![]() |
00cc38ae33 | |
![]() |
34435465a3 | |
![]() |
e25c3fe846 | |
![]() |
224b51f1c3 | |
![]() |
01655f0c04 | |
![]() |
aa7e6ab160 | |
![]() |
f05517a0a4 | |
![]() |
d4c71452bc | |
![]() |
08b791e547 | |
![]() |
f3aef1d61d | |
![]() |
f71d79fd90 | |
![]() |
0ec190612b | |
![]() |
fc2a374344 | |
![]() |
39c83b7fa6 | |
![]() |
67f7111f66 | |
![]() |
bf0c74b516 | |
![]() |
bcdd694ec9 | |
![]() |
208ca763ab | |
![]() |
51f5a93da2 | |
![]() |
f69ea55967 | |
![]() |
b395ed767d | |
![]() |
18c71fe7da | |
![]() |
72b024c4f3 | |
![]() |
e7b488316b | |
![]() |
63b1e9d1e6 | |
![]() |
6e4d6307e8 | |
![]() |
2472743660 | |
![]() |
83783a9ece | |
![]() |
9fb51c57b3 | |
![]() |
ca3ce86dc5 | |
![]() |
c5a011012f | |
![]() |
6a96ce1237 | |
![]() |
5b87a928ba | |
![]() |
e314faf157 | |
![]() |
45448e23d3 | |
![]() |
fd8eaa363b | |
![]() |
93607fde0c | |
![]() |
dc7805c835 | |
![]() |
30121ecc9c | |
![]() |
64dd9cd6fb | |
![]() |
4c414e80d4 | |
![]() |
7250ab6cf9 | |
![]() |
61cbcd8bb5 | |
![]() |
5165094a1b | |
![]() |
2da3fb95c2 | |
![]() |
9245e921ce | |
![]() |
17f9487225 | |
![]() |
4ba99b654e | |
![]() |
e09afda0f2 | |
![]() |
a783072cca | |
![]() |
848af986e6 | |
![]() |
4ef24b8b85 | |
![]() |
ba4a02b501 | |
![]() |
41ff8e6445 | |
![]() |
4caab690ac | |
![]() |
c73346292e | |
![]() |
634180a6e5 | |
![]() |
1a95a7db4b | |
![]() |
a0fb11d591 | |
![]() |
a706e6f2fc | |
![]() |
6e4f90cdfb | |
![]() |
7cfd141260 | |
![]() |
5bcd43bb48 | |
![]() |
75410b4ce9 | |
![]() |
4480458bd6 | |
![]() |
932d91876b | |
![]() |
71df600173 | |
![]() |
ace7bab65e | |
![]() |
3034ea4934 | |
![]() |
fc6bb75229 | |
![]() |
3edceebd89 | |
![]() |
e65e4d116e | |
![]() |
996ab6a73f | |
![]() |
2befa12cc4 | |
![]() |
267a545ea5 | |
![]() |
18926dd58a | |
![]() |
e2e2ab74ef | |
![]() |
230e9e6560 | |
![]() |
8a799f29f7 | |
![]() |
bf648dce6c | |
![]() |
aac97dd7c4 | |
![]() |
21025e759e | |
![]() |
915db146e8 | |
![]() |
c5442f709d | |
![]() |
a97682b2a4 | |
![]() |
39da2ffdb8 | |
![]() |
7ce0ecbf62 | |
![]() |
e0ce4c00c1 | |
![]() |
889e4916ef | |
![]() |
b1edcf5810 | |
![]() |
b8116ddc58 | |
![]() |
071b60b986 | |
![]() |
2f680a9a4e | |
![]() |
801235e50b | |
![]() |
4d716439b6 | |
![]() |
7ab6daf626 | |
![]() |
e05b5c3377 | |
![]() |
2f463fad32 | |
![]() |
f18c594744 | |
![]() |
2d0ba0cc0e | |
![]() |
64385a5631 | |
![]() |
20c9dacf71 | |
![]() |
af9f0e21aa | |
![]() |
853e2a03aa | |
![]() |
5fe333c3d3 | |
![]() |
67e6a22ca7 | |
![]() |
aefab7c677 | |
![]() |
fe06db3d3c | |
![]() |
b75c8892f7 | |
![]() |
26de9a3197 | |
![]() |
eec595185c | |
![]() |
1647f8d8c2 | |
![]() |
a7a2e6b08b | |
![]() |
27dac58dda | |
![]() |
dbc40a9850 | |
![]() |
b6489cefaa | |
![]() |
aec27f2493 | |
![]() |
c046f5f92f | |
![]() |
48a086c29d | |
![]() |
cd87bd0e35 | |
![]() |
415d196954 | |
![]() |
fce24e6a6a | |
![]() |
1dae0a40b2 | |
![]() |
600eed9dbc | |
![]() |
c92a293d31 | |
![]() |
c078c7b686 | |
![]() |
2104770c9d | |
![]() |
c01f022ede | |
![]() |
0bb70aebde | |
![]() |
a6bc800436 | |
![]() |
eca427ce46 | |
![]() |
14de558305 | |
![]() |
92634a2f98 | |
![]() |
60d9bf6ef6 | |
![]() |
6b800d94e3 | |
![]() |
76730d38d4 | |
![]() |
2c8508fe32 | |
![]() |
7d09b38963 | |
![]() |
363c7e9f7c | |
![]() |
9f094a08cc | |
![]() |
8621898558 | |
![]() |
235b373f1a | |
![]() |
e0df52b6ab | |
![]() |
1896a0d558 | |
![]() |
a19570c205 | |
![]() |
5ad5eeff64 | |
![]() |
2a8c6189e4 | |
![]() |
9d7bc8a058 | |
![]() |
cb8b448da9 | |
![]() |
ca8a421a9c | |
![]() |
85db5af655 | |
![]() |
6385c15236 | |
![]() |
031e93185a | |
![]() |
9c14b44d22 | |
![]() |
30b4a8a55d | |
![]() |
5cdd9948e8 | |
![]() |
ca5467addb | |
![]() |
5791368a75 | |
![]() |
88ad25ecc7 | |
![]() |
4c5ff964e6 | |
![]() |
28c573e5c5 | |
![]() |
c5083733be | |
![]() |
981de1b9e2 | |
![]() |
bac4ce5323 | |
![]() |
4ab90e780f | |
![]() |
e41b289eb5 | |
![]() |
46d67ae88a | |
![]() |
8e7c6b45b8 | |
![]() |
63c239f36f | |
![]() |
d980a23dd3 | |
![]() |
a27d586d38 | |
![]() |
d11cfbcdaa | |
![]() |
65cf800283 | |
![]() |
7bd1fc2eea | |
![]() |
366deb02fc | |
![]() |
271101ba0b | |
![]() |
e66c1ce447 | |
![]() |
5faaaa0276 | |
![]() |
a509495b9f | |
![]() |
4345abad15 | |
![]() |
0a05c0d68a | |
![]() |
88a89bbe4f | |
![]() |
a3f9b50c8c | |
![]() |
e548f75b68 | |
![]() |
9a8f2eddef | |
![]() |
5157ad165d | |
![]() |
14a5331ecc | |
![]() |
b7aab16185 | |
![]() |
25dac4d258 | |
![]() |
cb542acbd0 | |
![]() |
d934bc4aff | |
![]() |
7372cf778d | |
![]() |
38783631c5 | |
![]() |
ecfc2ca7d6 | |
![]() |
17a8c2372b | |
![]() |
87b07d0a0e | |
![]() |
1d9e6037d9 | |
![]() |
71ac54911a | |
![]() |
b3218d636a | |
![]() |
31041f75dd | |
![]() |
ff818d721d | |
![]() |
098ac8fb17 | |
![]() |
19b88b4be0 | |
![]() |
e9b15a33b1 | |
![]() |
a5cad6731c | |
![]() |
17d7e83590 | |
![]() |
4fc630cf0a | |
![]() |
c195786ffc | |
![]() |
c44131e0dd | |
![]() |
b908b2e42e | |
![]() |
7476d4d499 | |
![]() |
23cde9cb9f | |
![]() |
4ad2cc52dd | |
![]() |
e11787c585 | |
![]() |
38776569ed | |
![]() |
b90fda127d | |
![]() |
fc49277e1d | |
![]() |
db874b6218 | |
![]() |
90b9efe5ba | |
![]() |
13343283d5 | |
![]() |
e8d4517606 | |
![]() |
79827b946d | |
![]() |
48fabda81f | |
![]() |
6cf4322127 | |
![]() |
2cc0e6c1aa | |
![]() |
a666a52f72 | |
![]() |
47371b3a19 | |
![]() |
9cdf200ae7 | |
![]() |
e714a9267f | |
![]() |
8cf6d6f2e0 | |
![]() |
2618876e62 | |
![]() |
dd9ec12b36 | |
![]() |
725c95d6d3 | |
![]() |
43fb6eb2c9 | |
![]() |
10ea33f270 | |
![]() |
731d18e4da | |
![]() |
5d07d9b429 | |
![]() |
11e42a4ce9 | |
![]() |
111bc2da2f | |
![]() |
d88556ccba | |
![]() |
2abbe56498 | |
![]() |
8a7320baab | |
![]() |
a323531dfc | |
![]() |
645bf81160 | |
![]() |
316f30196c | |
![]() |
a288d2473f | |
![]() |
87fcff3ffb | |
![]() |
0fbe5f8ce7 | |
![]() |
cb091b594d | |
![]() |
6f9f005ed9 | |
![]() |
7add5afc30 | |
![]() |
3500b2890b | |
![]() |
d57b394768 | |
![]() |
e1e3e77e08 | |
![]() |
6816a2938a | |
![]() |
0e70eea85c | |
![]() |
1f618684b8 | |
![]() |
d1988f915f | |
![]() |
623aaeb01a | |
![]() |
5251d42c2f | |
![]() |
7b578dcc56 | |
![]() |
0cd70e5da3 | |
![]() |
906bda3489 | |
![]() |
10b843d53e | |
![]() |
4362d39624 | |
![]() |
6640fa1890 | |
![]() |
fe29c78583 | |
![]() |
de5fd43b84 | |
![]() |
7d1416da67 | |
![]() |
5aed82573f | |
![]() |
8b9d923ae2 | |
![]() |
9f0eb844c2 | |
![]() |
1a9fbef1f5 | |
![]() |
5c3e7e780e | |
![]() |
497e989e76 | |
![]() |
b3f5f46e74 | |
![]() |
2bcde666d8 | |
![]() |
48e1fda6cf | |
![]() |
1f46323dc9 | |
![]() |
abda678167 | |
![]() |
f21aec5226 | |
![]() |
f9cd4e1a8a | |
![]() |
da20f417c3 | |
![]() |
e19f2ad8d7 | |
![]() |
357706f4c5 | |
![]() |
49bdd4b1fd | |
![]() |
461d3468a5 | |
![]() |
4575c3428a | |
![]() |
2d128eb0a4 | |
![]() |
ac1b5ef38d | |
![]() |
5419484825 | |
![]() |
ff1510dbcc | |
![]() |
9492bb0bc2 | |
![]() |
b42f17437c | |
![]() |
992aa63cd8 | |
![]() |
4076da01c9 | |
![]() |
708b4e5e63 | |
![]() |
8b9ccf0e0d | |
![]() |
146f64aa04 | |
![]() |
389738c278 | |
![]() |
5fe1bfed8f | |
![]() |
f002440899 | |
![]() |
722af5cec6 | |
![]() |
a375f9ed6e | |
![]() |
ddaa663067 | |
![]() |
fb0326d371 | |
![]() |
4e1b5cfc89 | |
![]() |
e9c97b89ab | |
![]() |
a544a42436 | |
![]() |
eac7f62911 | |
![]() |
ec50f750aa | |
![]() |
2f1a268cc5 | |
![]() |
e826079fc1 | |
![]() |
0f762c1e58 | |
![]() |
6b0423ebb0 | |
![]() |
b7e0de3e41 | |
![]() |
ef7009f5a1 | |
![]() |
9fc2eb559a | |
![]() |
509f44bcb1 | |
![]() |
289533b755 | |
![]() |
e3367768eb | |
![]() |
3ee59845de | |
![]() |
7c12617448 | |
![]() |
b4be857f70 | |
![]() |
626a83c8a7 | |
![]() |
006b7bed7a | |
![]() |
20abc525d3 | |
![]() |
902119fbae | |
![]() |
2a8ebbe80c | |
![]() |
0faad8d654 | |
![]() |
602258b6d8 | |
![]() |
9c488f996f | |
![]() |
48dbbb1ea3 | |
![]() |
a9b253ebad | |
![]() |
98d58b1303 | |
![]() |
7fd368f936 | |
![]() |
4d44ba673b | |
![]() |
02df356931 | |
![]() |
80170a5bbd | |
![]() |
2aa9b46c10 | |
![]() |
39fbae166f | |
![]() |
a1261cab0a | |
![]() |
f160cb9c8b | |
![]() |
7aa7d9df10 | |
![]() |
48d6098285 | |
![]() |
2e26f472ea | |
![]() |
50f0d4f91f | |
![]() |
bc05138037 | |
![]() |
e823b1c9d0 | |
![]() |
cc55db87b7 | |
![]() |
1040650ae4 | |
![]() |
8c2692caba | |
![]() |
403ffc839d | |
![]() |
c801b09e9c | |
![]() |
861d95bd06 | |
![]() |
6b96b191aa | |
![]() |
c851d2e92c | |
![]() |
9ecb14ab23 | |
![]() |
8e5f007f5b | |
![]() |
ba4ba87eec | |
![]() |
e1932b7f74 | |
![]() |
7be0ab71fc | |
![]() |
b57255487a | |
![]() |
8e308f2a65 | |
![]() |
662329c5e9 | |
![]() |
03505fcdb6 | |
![]() |
8863c20661 | |
![]() |
b75177dadd | |
![]() |
71f785cdd1 | |
![]() |
38c61484c1 | |
![]() |
5ec53510be | |
![]() |
881b33f4b6 | |
![]() |
4cd0f4fb9b | |
![]() |
32e563effc | |
![]() |
69e10f69cd | |
![]() |
f6047265e3 | |
![]() |
c8ebe4bfad | |
![]() |
e72fb0d525 | |
![]() |
149a4e0dec | |
![]() |
3ab286f81e | |
![]() |
78952f190c | |
![]() |
273a4ae50b | |
![]() |
ba0ba4b2ce | |
![]() |
a6d2e200f6 | |
![]() |
660729eaf7 | |
![]() |
8d9ba8fed9 | |
![]() |
ea8ac32a1c | |
![]() |
e9e3627339 | |
![]() |
8688a9ea7d | |
![]() |
2a29984950 | |
![]() |
cf1a9ecb91 | |
![]() |
4114a6ee26 | |
![]() |
55a6fb8697 | |
![]() |
5344fd2b1e | |
![]() |
7322ea8ba9 | |
![]() |
4a377d9648 | |
![]() |
1a6648ebf0 | |
![]() |
9ab77a8217 | |
![]() |
1d07436569 | |
![]() |
f91dff5c1b | |
![]() |
a160359413 | |
![]() |
ebe69a5369 | |
![]() |
0831320b61 | |
![]() |
4df677c28d | |
![]() |
aee8aa7483 | |
![]() |
1cc631b29d | |
![]() |
626d41480c | |
![]() |
caaa0aba8b | |
![]() |
daec28f2b0 | |
![]() |
6d1baa0639 | |
![]() |
31e94d72f7 | |
![]() |
055b3b9a25 | |
![]() |
c0fd7e41cc | |
![]() |
187b39dac1 | |
![]() |
10f686a71f | |
![]() |
eabad3bced | |
![]() |
6daeeaf866 | |
![]() |
255caea48e | |
![]() |
a46fb246ed | |
![]() |
054efe9e75 | |
![]() |
07f5c3b6d5 | |
![]() |
895f987ca9 | |
![]() |
cefa91aa13 | |
![]() |
0271df21c9 | |
![]() |
a6b89cf205 | |
![]() |
a74e425a8e | |
![]() |
191bfaca02 | |
![]() |
de1a63f7bd | |
![]() |
39e7982c64 | |
![]() |
ccbebd6855 | |
![]() |
192184e4d1 | |
![]() |
94622aa854 | |
![]() |
051edcf619 | |
![]() |
3c1c8f27a4 | |
![]() |
11ca29c2fb | |
![]() |
4eb5c183a5 | |
![]() |
bf041b54ef | |
![]() |
3c53865150 | |
![]() |
db66110556 | |
![]() |
d1371a5383 | |
![]() |
c5e0886690 | |
![]() |
6d77162321 | |
![]() |
5ebeb06520 | |
![]() |
35dadec203 | |
![]() |
9f1314e75c | |
![]() |
a21cb93d3b | |
![]() |
6cf7f8583d | |
![]() |
3787744a71 | |
![]() |
358c8e288d | |
![]() |
e5a8224c49 | |
![]() |
d34db2cbc2 | |
![]() |
c5abd4703a | |
![]() |
b63b4a31f3 | |
![]() |
8f0c9b5158 | |
![]() |
715480c429 | |
![]() |
12444400a0 | |
![]() |
9d7e1bae32 | |
![]() |
3fb10a820a | |
![]() |
565ff12946 | |
![]() |
da082999cb | |
![]() |
4fc5abe092 | |
![]() |
ecc8b3baa1 | |
![]() |
319fd6b12b | |
![]() |
cf6a9ca3b7 | |
![]() |
df8b319275 | |
![]() |
19b37a9feb | |
![]() |
633e2fb986 | |
![]() |
b24b1b7cda | |
![]() |
ab58d87acd | |
![]() |
db7f9911c9 | |
![]() |
21cc2c8beb | |
![]() |
b805ec8b2c | |
![]() |
c8f21ae02e | |
![]() |
154d916a9e | |
![]() |
e4681e2a23 | |
![]() |
e5aeea60e9 | |
![]() |
37c3f12178 | |
![]() |
72e9d2f455 | |
![]() |
e3c8befb25 | |
![]() |
8e9b59521a | |
![]() |
1c882bc52d | |
![]() |
a33a2b205d | |
![]() |
0c014877ea | |
![]() |
d5522e547c | |
![]() |
1e997efa28 | |
![]() |
01eb06ab23 | |
![]() |
42ee775176 | |
![]() |
187966d4b0 | |
![]() |
50edc74c55 | |
![]() |
29d8bba9a9 | |
![]() |
2382b1e130 | |
![]() |
e67e4ee7b9 | |
![]() |
1bf65e5706 | |
![]() |
4dfc413227 | |
![]() |
7a9ac5b035 | |
![]() |
678a756dd6 | |
![]() |
1e8f45e825 | |
![]() |
85f79d5259 | |
![]() |
5f83b20f6b | |
![]() |
c9b6a11941 | |
![]() |
4a33c39e8b | |
![]() |
05d379ba79 | |
![]() |
8aa4a7c700 | |
![]() |
04c0df30e7 | |
![]() |
0ea7990226 | |
![]() |
a96a0384b2 | |
![]() |
bf6f826c9d | |
![]() |
81bd8938fe | |
![]() |
0255164f42 | |
![]() |
4a7422039e | |
![]() |
8dfd0f2a73 | |
![]() |
5abe7c4a9e | |
![]() |
1c75af3513 | |
![]() |
214c77be13 | |
![]() |
7c62116554 | |
![]() |
4cb39d90c0 | |
![]() |
db34f5c6b0 | |
![]() |
8bfd9cdaa5 | |
![]() |
e7aeb7d1af | |
![]() |
327c08fd93 | |
![]() |
b933703f4f | |
![]() |
a5089721db | |
![]() |
5a51afd01e | |
![]() |
fc7a85a79c | |
![]() |
707afde649 | |
![]() |
a85d8e19d9 | |
![]() |
1a367d83ba | |
![]() |
05d55ea6fa | |
![]() |
9859064dc6 | |
![]() |
2d4416466c | |
![]() |
6372743f9f | |
![]() |
060c2ab0ec | |
![]() |
91dd2e6ee7 | |
![]() |
eff75f27dc | |
![]() |
8650b376ef | |
![]() |
f58ccdad4a | |
![]() |
6e020a0298 | |
![]() |
bdb22e9fb6 | |
![]() |
f6cae7c238 | |
![]() |
ad86bbb8c8 | |
![]() |
5bf01fa3c8 | |
![]() |
2fbf1e9985 | |
![]() |
2fbe862933 | |
![]() |
2d554d0086 | |
![]() |
3262eb58a9 | |
![]() |
b15f56212d | |
![]() |
6d23660361 | |
![]() |
fbb0283148 | |
![]() |
93ecab675d | |
![]() |
8820d0e674 | |
![]() |
df7f12d5bd | |
![]() |
f01ea2473c | |
![]() |
32b6e6dc48 | |
![]() |
d71acb07fd | |
![]() |
b92989ac14 | |
![]() |
d517bae2d3 | |
![]() |
889a415314 | |
![]() |
77d72d6284 | |
![]() |
206685c29d | |
![]() |
3b1c5ee3a8 | |
![]() |
a17497d9a4 | |
![]() |
cc64dfa958 | |
![]() |
f7ab2a5b59 | |
![]() |
8230b05046 | |
![]() |
29c91bdfdf | |
![]() |
bd34bd6157 | |
![]() |
70ef5cd327 | |
![]() |
c3450d50c4 | |
![]() |
e4796621b7 | |
![]() |
aefd07995d | |
![]() |
b7f46fd7f4 | |
![]() |
36d68836d4 | |
![]() |
897be73f09 | |
![]() |
3e89697b4f | |
![]() |
b78666140a | |
![]() |
52e8bc512d | |
![]() |
bb50c6f48e | |
![]() |
b02340a130 | |
![]() |
319e6db4fc | |
![]() |
5c52b3b987 | |
![]() |
72c2585e6a | |
![]() |
a64dfa8bf0 | |
![]() |
f35e867358 | |
![]() |
b200229b26 | |
![]() |
770eae466e | |
![]() |
6a86149b63 | |
![]() |
b6833d2962 | |
![]() |
a976753b93 | |
![]() |
e0885c6d6a | |
![]() |
717586cee1 | |
![]() |
23724784e2 | |
![]() |
e26b1db0c4 | |
![]() |
c687da23fe | |
![]() |
e509f16648 | |
![]() |
1919061656 | |
![]() |
90fd6199a1 | |
![]() |
d6aabd89ae | |
![]() |
406ced863f | |
![]() |
1d9e4753be | |
![]() |
aad61c5281 | |
![]() |
3543b57f53 | |
![]() |
fb927b093a | |
![]() |
01cfee0ebd | |
![]() |
c811e2a064 | |
![]() |
92e992abd2 | |
![]() |
d8feba59ea | |
![]() |
11190a8a4c | |
![]() |
143602a729 | |
![]() |
713e9e93d3 | |
![]() |
beb013122f | |
![]() |
f7fa19dcf8 | |
![]() |
44073ed15d | |
![]() |
031c64271a | |
![]() |
79d9c6f00c | |
![]() |
391b6a2085 | |
![]() |
0c22d475c3 | |
![]() |
e8e52cf7c6 | |
![]() |
b6e2ca2670 | |
![]() |
e06509ca0a | |
![]() |
cc4df4ada4 | |
![]() |
de617fed27 | |
![]() |
59c931191b | |
![]() |
ca3859d343 | |
![]() |
30df5f6158 | |
![]() |
f15b0dee3d | |
![]() |
ddda646afc | |
![]() |
be22c14356 | |
![]() |
f08539d5f9 | |
![]() |
ef10e075f6 | |
![]() |
c6f85e545f | |
![]() |
0f2812bc10 | |
![]() |
513fb57621 | |
![]() |
0878f4ab00 | |
![]() |
dc18638567 | |
![]() |
e793920ed9 | |
![]() |
b6bdaedb6d | |
![]() |
3431d30ac2 | |
![]() |
c74e9c1030 | |
![]() |
5daf0bbdc5 | |
![]() |
604ec38101 | |
![]() |
fcfd75346b | |
![]() |
6768b064f7 | |
![]() |
71124e0129 | |
![]() |
43aae6ac72 | |
![]() |
5a4e121e2b | |
![]() |
810b0fcee2 | |
![]() |
5120488766 | |
![]() |
8e9ebaa853 | |
![]() |
d862285c63 | |
![]() |
52c4114148 | |
![]() |
19feb05e9b | |
![]() |
47a36a2e56 | |
![]() |
e1fd1f0df7 | |
![]() |
46fe0f7c37 | |
![]() |
00dfb68677 | |
![]() |
0a55c0edae | |
![]() |
33162a1798 | |
![]() |
a6f53183c1 | |
![]() |
b0b24974e6 | |
![]() |
7ff3971168 | |
![]() |
ba56f3bf6e | |
![]() |
b7851955b2 | |
![]() |
5784e45e87 | |
![]() |
186d6c9bc5 | |
![]() |
6e1816d973 | |
![]() |
5e23ad66af | |
![]() |
788d20e452 | |
![]() |
032b69d564 | |
![]() |
01a55116b0 | |
![]() |
31603634ce | |
![]() |
9c99e8a27d | |
![]() |
f2d4680698 | |
![]() |
028b96589e | |
![]() |
b4bc6ff109 | |
![]() |
e21c1dc28a | |
![]() |
bebf352bd0 | |
![]() |
8369decbfc | |
![]() |
1111b98767 | |
![]() |
ffb456c466 | |
![]() |
68247caf66 | |
![]() |
c65b760ca1 | |
![]() |
8e4b5f6ee0 | |
![]() |
6e08a4b1ed | |
![]() |
0b26620901 | |
![]() |
d4c8f04331 | |
![]() |
67f0257cb4 | |
![]() |
a2de68ec1f | |
![]() |
93115073e9 | |
![]() |
19f5f9f7a5 | |
![]() |
131eab393d | |
![]() |
8f7cc5e06f | |
![]() |
b46e797728 | |
![]() |
42898de340 | |
![]() |
65fda6f4e7 | |
![]() |
e15af62927 | |
![]() |
d2a7c6734a | |
![]() |
1b9eb941d2 | |
![]() |
59263be1b5 | |
![]() |
df2b647750 | |
![]() |
4e0a23ec03 | |
![]() |
beae2087a8 | |
![]() |
2039252e69 | |
![]() |
1219eb76bc | |
![]() |
31a1fcfc46 | |
![]() |
37731b9fa7 | |
![]() |
2d8120fc1e | |
![]() |
bd0e1b135e | |
![]() |
9a2b4fb8b2 | |
![]() |
e7b9be97b0 | |
![]() |
5cea881ed9 | |
![]() |
e40b9fe82c | |
![]() |
c14c4255eb | |
![]() |
fec2679fc8 | |
![]() |
520ca3faea | |
![]() |
c8e906b00d | |
![]() |
9bddcaa181 | |
![]() |
aa4877d851 | |
![]() |
a9a2d09ae0 | |
![]() |
422c18917c | |
![]() |
ccdc5f1a9f | |
![]() |
080141e7d0 | |
![]() |
b55bd54b29 | |
![]() |
8c0951a0ea | |
![]() |
bb5744dfe9 | |
![]() |
5bf2597030 | |
![]() |
ade5cbc446 | |
![]() |
35ca5f6339 | |
![]() |
97c259f1c4 | |
![]() |
8eedc29d71 | |
![]() |
3975eabca0 | |
![]() |
1b99b6289a | |
![]() |
0b9fb52800 | |
![]() |
f1a0f11257 | |
![]() |
dea323a0b8 | |
![]() |
c0bd71fe7d | |
![]() |
85093234fa | |
![]() |
13e21fb052 | |
![]() |
e592126078 | |
![]() |
35de874ced | |
![]() |
cdc95aef68 | |
![]() |
08cc4c5bc3 | |
![]() |
5c514efa96 | |
![]() |
a9bc977764 | |
![]() |
2fa3e7a4b5 | |
![]() |
9b4f5f4366 | |
![]() |
2b55554af1 | |
![]() |
5aff38bf39 | |
![]() |
53d4989a79 | |
![]() |
d23d331463 | |
![]() |
020b1b8d4e | |
![]() |
e251a03914 | |
![]() |
1faac18e8d | |
![]() |
a23878fd0b | |
![]() |
56773ae55f | |
![]() |
dd28c89236 | |
![]() |
14331ddee5 | |
![]() |
b1a06a519f | |
![]() |
cc1938b14b | |
![]() |
c4e0cc15c9 | |
![]() |
6651b5ac3f | |
![]() |
faa7b30df5 | |
![]() |
9a638e7eb3 | |
![]() |
06770ca1af | |
![]() |
337a79efbb | |
![]() |
fd3dab39de | |
![]() |
84092e1c6f | |
![]() |
77addb5b03 | |
![]() |
68e56d9ea8 | |
![]() |
71b0077fc0 | |
![]() |
2e64e4c47b | |
![]() |
c4f4ac41e8 | |
![]() |
07f38008d8 | |
![]() |
5c70075ca0 | |
![]() |
e09fb169ae | |
![]() |
dc48d88d59 | |
![]() |
227547d7e7 | |
![]() |
00da2ef58c | |
![]() |
195e8a9b77 | |
![]() |
7cb778f884 | |
![]() |
289abee257 | |
![]() |
2c49e52f90 | |
![]() |
07968430e3 | |
![]() |
e10b78dc9b | |
![]() |
a1f9f29198 | |
![]() |
0b614022ad | |
![]() |
821a9f8749 | |
![]() |
1bb83de279 | |
![]() |
48e55c9417 | |
![]() |
5dc6327fda | |
![]() |
e1470dab3e | |
![]() |
ab0e948fe4 | |
![]() |
d5f16c0b2d | |
![]() |
66c24f246a | |
![]() |
27b1978515 | |
![]() |
8df7431743 | |
![]() |
c3443b5725 | |
![]() |
5e466e79fd | |
![]() |
4f549676bc | |
![]() |
cfd651eaab | |
![]() |
6d58d8f2f8 | |
![]() |
1a7d84a14c | |
![]() |
376471cb2d | |
![]() |
3eea2eacc3 | |
![]() |
9416be4105 | |
![]() |
e7b56fe792 | |
![]() |
7f5986aa01 | |
![]() |
fc53df5e4b | |
![]() |
c5454a8f57 | |
![]() |
3d381b7ca1 | |
![]() |
469cb2a2da | |
![]() |
8b57885002 | |
![]() |
3429d6c8ca | |
![]() |
28ad0c0acc | |
![]() |
70c6eaca03 | |
![]() |
a80d16fbd8 | |
![]() |
4fa0825bc7 | |
![]() |
2db776f93a | |
![]() |
e330ff197d | |
![]() |
b002ae6130 | |
![]() |
5c27d91fde | |
![]() |
5f94a8b155 | |
![]() |
f18f353501 | |
![]() |
0e2bf5b1c4 | |
![]() |
ea34f260df | |
![]() |
56f590dbf4 | |
![]() |
54709b608a | |
![]() |
aaea907eac | |
![]() |
ebb99040e4 | |
![]() |
d874f6becc | |
![]() |
f3d8865df5 | |
![]() |
9098bca396 | |
![]() |
e7bda2e6c1 | |
![]() |
a8534308b7 | |
![]() |
24eb3f3d9d | |
![]() |
ad2f98107a | |
![]() |
b9b28c0bd9 | |
![]() |
2b361cbcc3 | |
![]() |
39505125fd | |
![]() |
48d4a58102 | |
![]() |
c51bb8cc43 | |
![]() |
51ae2698c4 | |
![]() |
501f38357f | |
![]() |
2fc35436a4 | |
![]() |
b87e0781f6 | |
![]() |
fe1a30027a | |
![]() |
eb58553ade | |
![]() |
b28ef7abc5 | |
![]() |
8625b1bdbf | |
![]() |
9ae3b5ba69 | |
![]() |
42971a5714 | |
![]() |
7bd1a219cd | |
![]() |
336152802a | |
![]() |
d067bc2cfc | |
![]() |
f751f540ec | |
![]() |
bd576ef69c | |
![]() |
d186bc9218 | |
![]() |
ef8ca8fd15 | |
![]() |
9e4f6ccf25 | |
![]() |
d377cef33c | |
![]() |
99afa4ccc7 | |
![]() |
320a68f8cb | |
![]() |
b09590e8e7 | |
![]() |
4b63daaf48 | |
![]() |
d26247bbd6 | |
![]() |
0ab1fe3f19 | |
![]() |
00ff05bfe0 | |
![]() |
2bd94b9ae4 | |
![]() |
6d1b7667b8 | |
![]() |
51cf6e531c | |
![]() |
e5d91a8564 | |
![]() |
91fcf59656 | |
![]() |
20337f3f36 | |
![]() |
7eac80b59f | |
![]() |
8c2e38662c | |
![]() |
31617f79b3 | |
![]() |
08ec6a4ddb | |
![]() |
1a394c75c9 | |
![]() |
b604daf201 | |
![]() |
2eb0f8d9c7 | |
![]() |
839c06d968 | |
![]() |
2b32ffac01 |
|
@ -0,0 +1,15 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[package.json]
|
||||
indent_size = 2
|
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 8,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"env": {
|
||||
"browser": true,
|
||||
"node": true
|
||||
},
|
||||
"plugins": [
|
||||
"vue"
|
||||
],
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:vue/recommended"
|
||||
],
|
||||
"rules": {
|
||||
"no-unused-vars": "off",
|
||||
"no-console": "off",
|
||||
"no-empty": "off",
|
||||
"quotes": [
|
||||
"error",
|
||||
"single",
|
||||
{ "allowTemplateLiterals": true }
|
||||
],
|
||||
"prefer-template": "warn",
|
||||
"no-return-await": "error",
|
||||
"indent": [ "warn", 4 ],
|
||||
"no-lonely-if": "error",
|
||||
"no-multiple-empty-lines": [
|
||||
"warn",
|
||||
{ "max": 1 }
|
||||
],
|
||||
"no-tabs": "warn",
|
||||
"no-trailing-spaces": "warn",
|
||||
"no-unneeded-ternary": "warn",
|
||||
"no-useless-constructor": "warn",
|
||||
"no-var": "error",
|
||||
"prefer-const": "error",
|
||||
"no-else-return": "error"
|
||||
}
|
||||
}
|
|
@ -1 +1 @@
|
|||
*.sh text=auto
|
||||
*.sh text=auto
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[Bug]"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
- [ ] Used appropriate template for the issue type
|
||||
- [ ] Searched both open and closed issues for duplicates of this issue
|
||||
- [ ] Title adequately and _concisely_ reflects the feature or the bug
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
**To Reproduce**
|
||||
<!-- Steps to reproduce the behavior -->
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
**System information**
|
||||
<!-- os, discord branch etc -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context about the problem here. -->
|
||||
|
||||
**Are you willing and able to fix this?**
|
||||
<!-- "Yes" or, if "no", what can current contributors do to help you create a PR? -->
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
name: Custom issue template
|
||||
about: Describe this issue template's purpose here.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
- [ ] Used appropriate template for the issue type
|
||||
- [ ] Searched both open and closed issues for duplicates of this issue
|
||||
- [ ] Title adequately and _concisely_ reflects the feature or the bug
|
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Feature]"
|
||||
labels: feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
- [ ] Used appropriate template for the issue type
|
||||
- [ ] Searched both open and closed issues for duplicates of this issue
|
||||
- [ ] Title adequately and _concisely_ reflects the feature or the bug
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
||||
|
||||
**Are you willing and able to implement this?**
|
||||
<!-- "Yes" or, if "no", what can current contributors do to help you create a PR? -->
|
|
@ -1,15 +1,16 @@
|
|||
.idea/*
|
||||
*.name
|
||||
devjs/.idea/devjs.iml
|
||||
*.bak
|
||||
*.bak.*
|
||||
*.xpi
|
||||
Firefox/data/js/jquery-2.1.4.min.js
|
||||
*.dev.*
|
||||
/nbproject/private/
|
||||
# Generated files
|
||||
node_modules
|
||||
.sass-cache
|
||||
/*.jiiks
|
||||
Installers/dotNet/bin/
|
||||
Installers/dotNet/packages/
|
||||
Installers/dotNet/dlls/
|
||||
dist
|
||||
etc
|
||||
release
|
||||
|
||||
tests/tmp
|
||||
tests/log.txt
|
||||
|
||||
# User data
|
||||
tests/data
|
||||
user.config.json
|
||||
/.vs
|
||||
/npm-debug.log
|
||||
/tests/ext/extensions
|
||||
/tests/userdata
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"rules": {
|
||||
"no-transition-all": [ 0 ],
|
||||
"nesting-depth": [
|
||||
1,
|
||||
{ "max-depth": 5 }
|
||||
],
|
||||
"no-vendor-prefixes": [ 0 ],
|
||||
"property-sort-order": [ 0 ],
|
||||
"indentation": [
|
||||
1,
|
||||
{ "size": 4 }
|
||||
],
|
||||
"no-color-literals": [ 0 ],
|
||||
"class-name-format": [
|
||||
1,
|
||||
{
|
||||
"convention": "^bd-[a-z]"
|
||||
}
|
||||
],
|
||||
"variable-name-format": [
|
||||
2,
|
||||
{
|
||||
"convention": "camelcase"
|
||||
}
|
||||
],
|
||||
"url-quotes": [ 0 ]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
language: node_js
|
||||
|
||||
node_js:
|
||||
- stable
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libsecret-1-dev
|
|
@ -1,2 +0,0 @@
|
|||
#BetterDiscord
|
||||
BetterDiscord enhances Discord with several features
|
|
@ -1,3 +0,0 @@
|
|||
.guilds {
|
||||
background:red !important;
|
||||
}
|
|
@ -1,199 +0,0 @@
|
|||
var emotesTwitch = null, emotesTwitchSub = null, emotesFfz = null, emotesBttv = null, emotesBttv2 = null;
|
||||
|
||||
var twitchEmoteUrlStart = "https://static-cdn.jtvnw.net/emoticons/v1/";
|
||||
var twitchEmoteUrlEnd = "/1.0";
|
||||
var ffzEmoteUrlStart = "https://cdn.frankerfacez.com/emoticon/";
|
||||
var ffzEmoteUrlEnd = "/1";
|
||||
var bttvEmoteUrlStart = "https://cdn.betterttv.net/emote/";
|
||||
var bttvEmoteUrlEnd = "/1x";
|
||||
|
||||
var _emoteModule;
|
||||
function EmoteModule() {
|
||||
|
||||
}
|
||||
|
||||
EmoteModule.prototype.init = function() {
|
||||
_emoteModule.loadEmoteData();
|
||||
};
|
||||
|
||||
EmoteModule.prototype.obsCallback = function(mutation) {
|
||||
var self = this;
|
||||
for(var i = 0 ; i < mutation.addedNodes.length ; ++i) {
|
||||
var next = mutation.addedNodes.item(i);
|
||||
if (next) {
|
||||
var nodes = self.getNodes(next);
|
||||
for(var node in nodes) {
|
||||
if (nodes.hasOwnProperty(node)) {
|
||||
self.injectEmote(nodes[node]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
EmoteModule.prototype.getNodes = function(node) {
|
||||
var next;
|
||||
var nodes = [];
|
||||
var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
|
||||
|
||||
while((next = treeWalker.nextNode()) != null) {
|
||||
nodes.push(next);
|
||||
}
|
||||
return nodes;
|
||||
};
|
||||
|
||||
EmoteModule.prototype.injectEmote = function(node) {
|
||||
|
||||
if (!node.parentElement) {
|
||||
return;
|
||||
}
|
||||
|
||||
var parent = node.parentElement;
|
||||
if (parent.tagName != "SPAN") {
|
||||
return;
|
||||
}
|
||||
if(!$(parent.parentElement).hasClass("markup") && !$(parent.parentElement).hasClass("message-content")) { return; }
|
||||
|
||||
var parentInnerHTML = parent.innerHTML;
|
||||
var words = parentInnerHTML.split(/\s+/g);
|
||||
if (!words) {
|
||||
return;
|
||||
}
|
||||
|
||||
words.some(function(word) {
|
||||
if (word.length < 4) {
|
||||
return;
|
||||
}
|
||||
if(emotesTwitch != null) {
|
||||
if (emotesTwitch.emotes.hasOwnProperty(word)) {
|
||||
var len = Math.round(word.length / 4);
|
||||
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + twitchEmoteUrlStart + emotesTwitch.emotes[word].image_id + twitchEmoteUrlEnd + '" />');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(emotesTwitchSub != null) {
|
||||
if (emotesTwitchSub.hasOwnProperty(word)) {
|
||||
var len = Math.round(word.length / 4);
|
||||
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + twitchEmoteUrlStart + emotesTwitchSub[word] + twitchEmoteUrlEnd + '" />');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(emotesFfz != null) {
|
||||
if(emotesFfz.hasOwnProperty(word)) {
|
||||
var len = Math.round(word.length / 4);
|
||||
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + ffzEmoteUrlStart + emotesFfz[word] + ffzEmoteUrlEnd + '" />');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(emotesBttv != null) {
|
||||
if(emotesBttv.hasOwnProperty(word)) {
|
||||
var len = Math.round(word.length / 4);
|
||||
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + bttvEmoteUrlStart + emotesBttv[word] + bttvEmoteUrlEnd + '" />');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(emotesBttv2 != null) {
|
||||
if(emotesBttv2.hasOwnProperty(word)) {
|
||||
var len = Math.round(word.length / 4);
|
||||
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + bttvEmoteUrlStart + emotesBttv2[word] + bttvEmoteUrlEnd + '" />');
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
parent.innerHTML = parentInnerHTML.replace(new RegExp("\uFDD9", "g"), "");
|
||||
};
|
||||
|
||||
EmoteModule.prototype.loadEmoteData = function(type) {
|
||||
if(_hash == null) {
|
||||
_utils.getHash(this.loadEmoteData);
|
||||
return;
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
default:
|
||||
_emoteModule.loadEmoteData("twitch");
|
||||
break;
|
||||
case "twitch":
|
||||
_utils.log("Loading twitch global emotes");
|
||||
$.getJSON('https://twitchemotes.com/api_cache/v2/global.json', function(data) {
|
||||
_utils.log("Loaded twitch global emotes");
|
||||
emotesTwitch = data;
|
||||
_emoteModule.loadEmoteData("twitch-sub");
|
||||
});
|
||||
break;
|
||||
case "twitch-sub":
|
||||
emotesTwitchSub = {};
|
||||
_utils.log("Loading twitch subscriber emotes");
|
||||
$.getJSON('https://twitchemotes.com/api_cache/v2/subscriber.json', function(data) {
|
||||
$.each(data.channels, function(key, val){
|
||||
$.each(val.emotes, function(key, val) {
|
||||
emotesTwitchSub[val.code] = val.image_id;
|
||||
});
|
||||
});
|
||||
|
||||
_emoteModule.loadEmoteData("ffz");
|
||||
});
|
||||
break;
|
||||
case "ffz":
|
||||
emotesFfz = {};
|
||||
_utils.log("Loading FFZ emotes");
|
||||
$.getJSON('https://cdn.rawgit.com/Jiiks/BetterDiscordApp/'+_hash+'/data/emotedata_ffz.json', function(data) {
|
||||
emotesFfz = data;
|
||||
_emoteModule.loadEmoteData("bttv");
|
||||
});
|
||||
break;
|
||||
case "bttv":
|
||||
emotesBttv = {};
|
||||
_utils.log("Loading Basic BTTV emotes");
|
||||
$.getJSON('https://api.betterttv.net/2/emotes', function(data) {
|
||||
$.each(data.emotes, function(key, val) {
|
||||
emotesBttv[val.code] = val.id;
|
||||
});
|
||||
_emoteModule.loadEmoteData("bttv2");
|
||||
});
|
||||
break;
|
||||
case "bttv2":
|
||||
emotesBttv2 = {};
|
||||
_utils.log("Loading BTTV emotes");
|
||||
$.getJSON('https://cdn.rawgit.com/Jiiks/BetterDiscordApp/'+_hash+'/data/emotedata_bttv.json', function(data) {
|
||||
emotesBttv2 = data;
|
||||
});
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
var _utils;
|
||||
|
||||
var _hash = null;
|
||||
function Utils() {}
|
||||
|
||||
Utils.prototype.getHash = function(callback) {
|
||||
_utils.log("Getting HASH");
|
||||
$.getJSON("https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master", function(data){
|
||||
_hash = data.sha;
|
||||
_utils.log("HASH = " + _hash);
|
||||
callback();
|
||||
});
|
||||
};
|
||||
|
||||
Utils.prototype.log = function(message) {
|
||||
console.log("[BetterDiscord] - " + message);
|
||||
};
|
||||
|
||||
(function() {
|
||||
|
||||
_utils = new Utils();
|
||||
|
||||
_emoteModule = new EmoteModule();
|
||||
_emoteModule.init();
|
||||
|
||||
var mainObserver = new MutationObserver(function(mutations) {
|
||||
mutations.forEach(function(mutation) {
|
||||
_emoteModule.obsCallback(mutation);
|
||||
});
|
||||
});
|
||||
|
||||
mainObserver.observe(document, { childList: true, subtree: true });
|
||||
|
||||
})();
|
BIN
Firefox/icon.png
Before Width: | Height: | Size: 16 KiB |
|
@ -1,14 +0,0 @@
|
|||
"use sctrict"
|
||||
|
||||
var pageMod = require('sdk/page-mod');
|
||||
var data = require("sdk/self").data;
|
||||
|
||||
function BdPageMod(options, callbacks) {
|
||||
pageMod.PageMod({
|
||||
include: '*.discordapp.com',
|
||||
contentScriptFile: [data.url('../data/js/jquery-2.1.4.min.js'), data.url('../data/js/main.js')],
|
||||
contentStyleFile: []
|
||||
});
|
||||
}
|
||||
|
||||
exports.BdPageMod = BdPageMod;
|
|
@ -1,9 +0,0 @@
|
|||
"use strict"
|
||||
|
||||
var _bdPagemod = require('./BdPageMod.js');
|
||||
|
||||
function BetterDiscord(args) {
|
||||
_bdPagemod = new _bdPagemod.BdPageMod();
|
||||
}
|
||||
|
||||
exports.BetterDiscord = BetterDiscord;
|
|
@ -1,9 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var _betterDiscord = require("./BetterDiscord.js");
|
||||
|
||||
function main(options, callbacks) {
|
||||
_betterDiscord = new _betterDiscord.BetterDiscord();
|
||||
}
|
||||
|
||||
exports.main = main;
|
|
@ -1,18 +0,0 @@
|
|||
{
|
||||
"title": "BetterDiscord",
|
||||
"name": "betterdiscord",
|
||||
"version": "0.0.3",
|
||||
"description": "BetterDiscord enhances Discord with several features",
|
||||
"main": "lib/main",
|
||||
"author": "JiCode",
|
||||
"engines": {
|
||||
"firefox": ">=40.*"
|
||||
},
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"jetpack"
|
||||
],
|
||||
"installs_allowed_from": [
|
||||
"https://betterdiscord.net"
|
||||
]
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
var main = require("../");
|
||||
|
||||
exports["test main"] = function(assert) {
|
||||
assert.pass("Unit test running!");
|
||||
};
|
||||
|
||||
exports["test main async"] = function(assert, done) {
|
||||
assert.pass("async Unit test running!");
|
||||
done();
|
||||
};
|
||||
|
||||
exports["test dummy"] = function(assert, done) {
|
||||
main.dummy("foo", function(text) {
|
||||
assert.ok((text === "foo"), "Is the text actually 'foo'");
|
||||
done();
|
||||
});
|
||||
};
|
||||
|
||||
require("sdk/test").run(exports);
|
46
Gruntfile.js
|
@ -1,46 +0,0 @@
|
|||
module.exports = function(grunt) {
|
||||
|
||||
grunt.initConfig({
|
||||
sass: {
|
||||
dist: {
|
||||
options: {
|
||||
style: 'expanded'
|
||||
},
|
||||
files: {
|
||||
'dev/css/main.css': 'dev/css/main.sass'
|
||||
}
|
||||
}
|
||||
},
|
||||
concat: {
|
||||
js: {
|
||||
src: 'dev/js/*.js',
|
||||
dest: 'js/main.js'
|
||||
},
|
||||
css: {
|
||||
src: 'dev/css/*.css',
|
||||
dest: 'css/main.css'
|
||||
}
|
||||
},
|
||||
uglify: {
|
||||
options: {
|
||||
screwIE8: true
|
||||
},
|
||||
js: {
|
||||
files: {
|
||||
'js/main.min.js': ['js/main.js']
|
||||
}
|
||||
}
|
||||
},
|
||||
cssmin: {
|
||||
css: {
|
||||
src: 'css/main.css',
|
||||
dest: 'css/main.min.css'
|
||||
}
|
||||
}
|
||||
});
|
||||
grunt.loadNpmTasks('grunt-contrib-concat');
|
||||
grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
grunt.loadNpmTasks('grunt-contrib-sass');
|
||||
grunt.loadNpmTasks('grunt-css');
|
||||
grunt.registerTask('default', ['sass', 'concat', 'uglify', 'cssmin']);
|
||||
};
|
|
@ -1,3 +0,0 @@
|
|||
dist/
|
||||
pack.bat
|
||||
run.bat
|
|
@ -1,368 +0,0 @@
|
|||
html, body {
|
||||
margin:0;
|
||||
padding:0;
|
||||
background: rgba(34, 35, 42, 0.6);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
html, body {
|
||||
width:800px;
|
||||
height:400px;
|
||||
}
|
||||
|
||||
* {
|
||||
font-family: Calibri;
|
||||
color:#E8E8E8;
|
||||
outline:none;
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
#titleBar {
|
||||
display:flex;
|
||||
-webkit-app-region: drag;
|
||||
pointer-events: none;
|
||||
width:100%;
|
||||
height:40px;
|
||||
background:rgba(34, 35, 42, 0.6);
|
||||
border-bottom:1px solid #000;
|
||||
box-shadow:0 1px 0 0 #303030;
|
||||
background: rgba(23, 23, 23, 0.6);
|
||||
border:none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
#titleBar h3 {
|
||||
color:#FFF;
|
||||
}
|
||||
|
||||
.icon {
|
||||
display:inline-block;
|
||||
width:40px;
|
||||
height:40px;
|
||||
padding:5px;
|
||||
}
|
||||
|
||||
.icon-image {
|
||||
background:blue;
|
||||
height:30px;
|
||||
width:30px;
|
||||
}
|
||||
|
||||
.title {
|
||||
display:inline-block;
|
||||
height:40px;
|
||||
line-height:40px;
|
||||
color:#FFF;
|
||||
}
|
||||
|
||||
.main-container {
|
||||
display:flex;
|
||||
width:100%;
|
||||
height:calc(100% - 40px);
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width:200px;
|
||||
height:359px;
|
||||
border-right:1px solid #000;
|
||||
box-shadow:1px 0 0 0 #303030;
|
||||
background:rgba(34, 35, 42, 0.6);
|
||||
z-index:90001;
|
||||
margin-top: 1px;
|
||||
border:none;
|
||||
margin:0;
|
||||
box-shadow: none;
|
||||
margin-left:1px;
|
||||
}
|
||||
|
||||
.sidebar-inner {
|
||||
width:100%;
|
||||
height:100%;
|
||||
padding:5px;
|
||||
}
|
||||
|
||||
.main {
|
||||
flex-grow:1;
|
||||
padding:5px;
|
||||
transform:translateX(0);
|
||||
}
|
||||
|
||||
.panel-container {
|
||||
position:absolute;
|
||||
left:10px;
|
||||
transition: all 0.5s ease-in;
|
||||
}
|
||||
|
||||
.panel {
|
||||
display:inline-block;
|
||||
width:590px;
|
||||
position:absolute;
|
||||
}
|
||||
|
||||
#panel-1 {
|
||||
left:600px;
|
||||
}
|
||||
|
||||
#panel-2 {
|
||||
left:1200px;
|
||||
}
|
||||
|
||||
#panel-3 {
|
||||
left:1800px;
|
||||
}
|
||||
|
||||
#licensetext {
|
||||
width: 100%;
|
||||
overflow-y: scroll;
|
||||
white-space: pre-line;
|
||||
height:280px;
|
||||
}
|
||||
|
||||
#licenseform {
|
||||
float:right;
|
||||
margin-top:5px;
|
||||
margin-right:10px;
|
||||
}
|
||||
|
||||
input[type='radio'] {
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
label {
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
label, input[type='radio']{
|
||||
font-size: 16px;
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
margin-left: 3px;
|
||||
line-height: 25px;
|
||||
height: 28px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
|
||||
ul {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style:none;
|
||||
}
|
||||
|
||||
li {
|
||||
list-style:none;
|
||||
color:gray;
|
||||
}
|
||||
|
||||
li.active {
|
||||
color:#FFF;
|
||||
}
|
||||
|
||||
li.visited {
|
||||
color:#EBEBEB;
|
||||
}
|
||||
|
||||
li:before {
|
||||
content: "";
|
||||
display:inline-block;
|
||||
background:gray;
|
||||
border-radius: 50%;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin-right:3px;
|
||||
}
|
||||
|
||||
li.active:before {
|
||||
background:dodgerblue;
|
||||
}
|
||||
|
||||
li.visited:before {
|
||||
background:#00D443;
|
||||
}
|
||||
|
||||
.controls {
|
||||
position:absolute;
|
||||
bottom:5px;
|
||||
right:5px;
|
||||
}
|
||||
|
||||
button {
|
||||
color:gray;
|
||||
width:60px;
|
||||
background:#1b1c23;
|
||||
border-style:solid;
|
||||
border-color:#000;
|
||||
border-width:0 1px 1px 0;
|
||||
padding:5px;
|
||||
box-shadow:1px 1px 0 0 #303030 inset;
|
||||
cursor:pointer;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
color:#FFF;
|
||||
background:#24262f;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
background:#292929;
|
||||
border-color:#191919;
|
||||
color:gray;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
button:active {
|
||||
background: #232b2e;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background:#282828 !important;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar, ::-webkit-scrollbar-track-piece {
|
||||
background:#383838 !important;
|
||||
}
|
||||
|
||||
input.path {
|
||||
width: 450px;
|
||||
height: 23px;
|
||||
background: rgb(27, 28, 35) none repeat scroll 0% 0%;
|
||||
border: 1px solid rgb(17, 17, 17);
|
||||
box-shadow: -1px -1px 0px 0px rgb(50, 49, 49) inset;
|
||||
border-width: 1px 0px 0px 1px;
|
||||
border-style: solid;
|
||||
border-color: #111;
|
||||
}
|
||||
|
||||
.modal {
|
||||
position: absolute;
|
||||
background: rgba(29, 29, 29, 0.71);
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 900000;
|
||||
}
|
||||
|
||||
.modal-container {
|
||||
background: #212229;
|
||||
width: 600px;
|
||||
height: 200px;
|
||||
position: relative;
|
||||
margin: auto;
|
||||
top: 100px;
|
||||
box-shadow: 0px 0px 5px 5px rgba(0, 0, 0, 0.39);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
background: #212229;
|
||||
padding-left: 10px;
|
||||
border-bottom: 1px solid #000;
|
||||
box-shadow: 0 1px 0 0 #303030;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding:30px;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left:0;
|
||||
right: 0;
|
||||
height: 35px;
|
||||
padding-top:10px;
|
||||
background:#212229;
|
||||
box-shadow: 0 1px 0 0 #303030 inset;
|
||||
border-top: 1px solid #000;
|
||||
}
|
||||
|
||||
.modal-footer button {
|
||||
margin-right:5px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.splash {
|
||||
width:300px !important;
|
||||
height:100px !important;
|
||||
}
|
||||
.splash .wrapper {
|
||||
top:20px;
|
||||
width:40px;
|
||||
margin:auto;
|
||||
position:relative;
|
||||
}
|
||||
.splash .wrapper .spinner {
|
||||
width:30px;
|
||||
height:30px;
|
||||
border-radius:30px;
|
||||
border-width:5px;
|
||||
border-color:#121212 #404040 #404040 #404040;
|
||||
border-style:solid;
|
||||
animation: spin 0.7s linear infinite;
|
||||
}
|
||||
.splash .spinnertext {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
display: block;
|
||||
text-align: center;
|
||||
bottom: 10px;
|
||||
color: rgb(171, 171, 171);
|
||||
-webkit-animation: spinnertext-opacity 2s linear 0s infinite;
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes spinnertext-opacity {
|
||||
0% {opacity: 0}
|
||||
20% {opacity: 0}
|
||||
50% {opacity: 1}
|
||||
100%{opacity: 0}
|
||||
}
|
||||
|
||||
#log {
|
||||
padding: 10px;
|
||||
height:294px;
|
||||
resize: none;
|
||||
width: 563px;
|
||||
background: rgba(42, 44, 55, 0.6);
|
||||
border: none;
|
||||
-webkit-user-select: text;
|
||||
word-wrap: break-word;
|
||||
white-space: pre-line;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
progress {
|
||||
position: absolute;
|
||||
bottom: -36px;
|
||||
left:0;
|
||||
width:520px;
|
||||
height: 27px;
|
||||
-webkit-appearance:none;
|
||||
}
|
||||
|
||||
progress::-webkit-progress-bar {
|
||||
background:rgba(42, 44, 55, 0.6);
|
||||
}
|
||||
|
||||
progress[value]::-webkit-progress-value {
|
||||
background-image: -webkit-linear-gradient(left, rgba(73,155,234,1) 0%, rgba(32,124,229,1) 100%);
|
||||
}
|
||||
|
||||
.border {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
border:1px solid #55BBF7;
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="border"></div>
|
||||
<div id="titleBar">
|
||||
<div class="icon">
|
||||
<div class="icon-image"></div>
|
||||
</div>
|
||||
<div class="title">
|
||||
BetterDiscord Installer - v0.1.1
|
||||
</div>
|
||||
</div>
|
||||
<div class="main-container">
|
||||
<div class="sidebar">
|
||||
<div class="sidebar-inner">
|
||||
<ul>
|
||||
<li id="li-0" class="navli active">Introduction</li>
|
||||
<li id="li-1" class="navli">License</li>
|
||||
<li id="li-2" class="navli">Destination</li>
|
||||
<li id="li-3" class="navli">Installation</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="panel-container">
|
||||
<div class="panel" id="panel-3">
|
||||
<h2>Welcome to the BetterDiscord setup</h2>
|
||||
<p>
|
||||
The setup will install BetterDiscord on your computer.
|
||||
<br>
|
||||
Click "Next" to continue or "Cancel" to exit the setup.
|
||||
</p>
|
||||
</div>
|
||||
<div class="panel" id="panel-1">
|
||||
<div id="licensetext">The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2016 Jiiks | Jiiks.net
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
</div>
|
||||
<form action="" id="licenseform">
|
||||
<input type="radio" name="licensegroup" value="Accept" id="accept" disabled="true"><label for="accept">Accept</label>
|
||||
<input type="radio" name="licensegroup" value="Decline" id="decline" checked="true"><label for="decline">Decline</label>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="panel" id="panel-2">
|
||||
<p>Setup will install BetterDiscord to the following location. Click Install to continue.</p>
|
||||
<input class="path" id="discordPath" type="text" style="height:26px;" disabled="true" />
|
||||
<button id="path" style="height:26px;">Browse</button>
|
||||
|
||||
<p style="font-size:14px">*If the path is not pointing to the latest version of Discord then click "Browse" and select it
|
||||
<br>
|
||||
*Installer will kill Discord process
|
||||
</p>
|
||||
|
||||
<input type="checkbox" name="restart" id="restart" checked="true">
|
||||
<label for="restart" style="margin:0; line-height: 18px;">Restart Discord after installation</label>
|
||||
</div>
|
||||
|
||||
<div class="panel" id="panel-0">
|
||||
<div name="log" id="log"></div>
|
||||
<progress id="logpbar" value="0" max="100"></progress>
|
||||
</div>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<button id="uninstall" style="display: none;">Uninstall</button>
|
||||
<button id="back" style="display: none;">Back</button>
|
||||
<button id="next" style="display: none;">Next</button>
|
||||
<button id="cancel">Abort</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal" id="quit" style="display: none;">
|
||||
<div class="modal-container">
|
||||
<div class="modal-header">
|
||||
<span>Exit Setup?</span>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
Setup is not complete. If you exit now, BetterDiscord will not be installed.
|
||||
<br>
|
||||
Exit Setup?
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button id="modal-exit">
|
||||
Yes
|
||||
</button>
|
||||
<button id="modal-cancel">
|
||||
No
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
<script type="text/javascript" src="js/jquery-2.0.0.min.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(window).blur(function(){
|
||||
$(".border").css("border-color", "#F76455");
|
||||
});
|
||||
$(window).focus(function(){
|
||||
$(".border").css("border-color", "#55BBF7");
|
||||
});
|
||||
</script>
|
||||
|
||||
</html>
|
|
@ -1,139 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const ipcRenderer = require('electron').ipcRenderer;
|
||||
|
||||
(function() {
|
||||
|
||||
var currentPanel = 0;
|
||||
|
||||
$("#accept").on("change", function() {
|
||||
$("#next").prop("disabled", true);
|
||||
if($(this).prop("checked")) {
|
||||
$("#next").prop("disabled", false);
|
||||
}
|
||||
});
|
||||
|
||||
$("#decline").on("change", function() {
|
||||
$("#next").prop("disabled", true);
|
||||
if(!$(this).prop("checked")) {
|
||||
$("#next").prop("disabled", false);
|
||||
}
|
||||
});
|
||||
|
||||
$("#back").on("click", function(){
|
||||
currentPanel--;
|
||||
if(currentPanel <= 0) currentPanel = 0;
|
||||
switchPanel();
|
||||
});
|
||||
|
||||
$("#next").on("click", function() {
|
||||
currentPanel++;
|
||||
if(currentPanel >= 3) currentPanel = 3;
|
||||
switchPanel();
|
||||
});
|
||||
|
||||
$("#path").on("click", function() {
|
||||
var p = ipcRenderer.sendSync('sync', 'openDirectory');
|
||||
if(p != null) {
|
||||
$("#discordPath").val(p);
|
||||
}
|
||||
});
|
||||
|
||||
$("#cancel").on("click", quit);
|
||||
|
||||
$("#licensetext").on("scroll", function() {
|
||||
var e = $(this);
|
||||
if(e.height() + e.scrollTop() >= e[0].scrollHeight) {
|
||||
$("#accept").prop("disabled", false);
|
||||
} else {
|
||||
$("#accept").prop("disabled", true);
|
||||
$("#decline").prop("checked", true)
|
||||
$("#next").prop("disabled", true);
|
||||
}
|
||||
});
|
||||
|
||||
function switchPanel() {
|
||||
$(".panel-container").css("left", currentPanel*-600+10 + "px");
|
||||
switch(currentPanel) {
|
||||
case 0:
|
||||
$("#back").hide();
|
||||
$("#next").show();
|
||||
$("#next").text("Next");
|
||||
$("#next").prop("disabled", false);
|
||||
$(".navli").removeClass("active").removeClass("visited");
|
||||
$("#li-0").addClass("active").removeClass("visited");
|
||||
$("#li-1").removeClass("active").removeClass("visited");
|
||||
break;
|
||||
case 1:
|
||||
$("#back").show();
|
||||
$("#next").text("Next");
|
||||
$("#next").prop("disabled", !$("#accept").prop("checked"));
|
||||
$("#li-0").addClass("visited").removeClass("active");
|
||||
$("#li-1").addClass("active").removeClass("visited");
|
||||
$("#li-2").removeClass("active").removeClass("visited");
|
||||
break;
|
||||
case 2:
|
||||
$("#back").show();
|
||||
$("#next").show();
|
||||
$("#next").text("Install");
|
||||
$("#li-1").addClass("visited").removeClass("active");
|
||||
$("#li-2").addClass("active").removeClass("visited");
|
||||
$("#li-3").removeClass("active");
|
||||
break;
|
||||
case 3:
|
||||
$("#li-2").removeClass("active").addClass("visited");
|
||||
$("#li-3").addClass("active");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$(".modal").on("click", function(e) {
|
||||
if(e.target.className != "modal") return;
|
||||
$(this).hide();
|
||||
});
|
||||
$("#modal-cancel").on("click", function() {
|
||||
$(".modal").hide();
|
||||
});
|
||||
$("#modal-exit").on("click", function() {
|
||||
ipcRenderer.send('sync', 'quit');
|
||||
});
|
||||
|
||||
function quit() {
|
||||
$("#quit").show();
|
||||
}
|
||||
|
||||
$("#discordPath").val(ipcRenderer.sendSync('sync', '{ "arg": "getInstallPath" }'));
|
||||
install();
|
||||
})();
|
||||
|
||||
ipcRenderer.on('async-reply', (event, arg) => {
|
||||
console.log(arg);
|
||||
switch(arg.arg) {
|
||||
case "exists":
|
||||
switch(arg.file) {
|
||||
case "app.asar":
|
||||
if(arg.exists) {
|
||||
appendLog("Located app.asar");
|
||||
appendLog("Downloading latest BetterDiscord package");
|
||||
ipcRenderer.send('async', '{"arg": "download", "package": { "host": "https://github.com/", "path": "Jiiks/BetterDiscordApp/archive/stable16.zip" }}');
|
||||
} else {
|
||||
appendLog("Unable to locate app.asar. Check your install path.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
function install() {
|
||||
appendLog("Initiating installation");
|
||||
ipcRenderer.send('async', '{ "arg": "locate-discord" }');
|
||||
}
|
||||
|
||||
function appendLog(text) {
|
||||
var log = $("#log");
|
||||
log.append(text+"\n");
|
||||
var sh = log[0].scrollHeight - 40;
|
||||
if(log.height() + log.scrollTop() >= sh) {
|
||||
log.scrollTop(sh);
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const ipcRenderer = require('electron').ipcRenderer;
|
||||
|
||||
ipcRenderer.on('async-reply', (event, arg) => {
|
||||
switch(arg) {
|
||||
case "update":
|
||||
$(".spinnertext").text("Downloading Update");
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
$(function() {
|
||||
ipcRenderer.send('async', '{ "arg": "update" }');
|
||||
});
|
|
@ -1,16 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<head>
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
<script type="text/javascript" src="js/jquery-2.0.0.min.js"></script>
|
||||
<script type="text/javascript" src="js/splash.js"></script>
|
||||
</head>
|
||||
</head>
|
||||
<body class="splash">
|
||||
<div class="border"></div>
|
||||
<div class="wrapper">
|
||||
<div class="spinner"></div>
|
||||
</div>
|
||||
<span class="spinnertext">Checking for updates...</span>
|
||||
</body>
|
||||
</html>
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"windows": {
|
||||
"version": "0.1.1"
|
||||
},
|
||||
"osx": {
|
||||
"version": "0.1.1"
|
||||
}
|
||||
}
|
|
@ -1,173 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const utils = require('./utils');
|
||||
const _utils = new utils.utils();
|
||||
|
||||
const electron = require('electron');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const app = electron.app;
|
||||
const BrowserWindow = electron.BrowserWindow;
|
||||
const ipcMain = electron.ipcMain;
|
||||
|
||||
var mainWindow = null;
|
||||
|
||||
var lastKnownVersion = "0.0.291";
|
||||
var platform = process.platform;
|
||||
|
||||
var installPath = getInstallPath();
|
||||
var dataPath = `${__dirname}/data/`;
|
||||
|
||||
var vi = require(`${dataPath}vi.json`);
|
||||
|
||||
function getInstallPath() {
|
||||
switch(platform) {
|
||||
case "win32":
|
||||
var hver = "0.0.0";
|
||||
var path = `${process.env.LOCALAPPDATA}/Discord/app-${lastKnownVersion}/`;
|
||||
fs.readdirSync(`${process.env.LOCALAPPDATA}/Discord/`).filter(function(file) {
|
||||
var tpath = `${process.env.LOCALAPPDATA}/Discord/${file}`;
|
||||
if(fs.statSync(tpath).isDirectory()) return;
|
||||
|
||||
if(!file.startsWith("app-")) return;
|
||||
var ver = file.replace("app-", "");
|
||||
if(ver < hver) return;
|
||||
hver = ver;
|
||||
});
|
||||
return path;
|
||||
break;
|
||||
case "darwin":
|
||||
return "/Applications/Discord.app";
|
||||
break;
|
||||
default:
|
||||
return "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function loadContent(file, width, height, center) {
|
||||
if(mainWindow == null) {
|
||||
createMainWindow(file, width, height);
|
||||
return;
|
||||
}
|
||||
|
||||
mainWindow.setSize(width, height);
|
||||
if(center) mainWindow.center();
|
||||
|
||||
mainWindow.loadURL(`${dataPath}${file}.html`);
|
||||
}
|
||||
|
||||
function createMainWindow(file, width, height) {
|
||||
mainWindow = new BrowserWindow({
|
||||
width: width,
|
||||
height: height,
|
||||
fullscreenable: false,
|
||||
maximizable: false,
|
||||
frame: false,
|
||||
resizable: true,
|
||||
alwaysOnTop: true,
|
||||
transparent: true
|
||||
});
|
||||
|
||||
mainWindow.loadURL(`${dataPath}${file}.html`);
|
||||
}
|
||||
|
||||
function update() {
|
||||
var promises = [
|
||||
new Promise((resolve, reject) => {
|
||||
downloadResource("default", "/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/index.html", (error, data) => {
|
||||
if(error) {
|
||||
error(data);
|
||||
reject();
|
||||
return;
|
||||
}
|
||||
_utils.log("Succesfully loaded index.html");
|
||||
resolve();
|
||||
});
|
||||
}),
|
||||
new Promise((resolve, reject) => {
|
||||
downloadResource("default", "/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/js/main.js", (error, data) => {
|
||||
if(error) {
|
||||
error(data);
|
||||
reject();
|
||||
return;
|
||||
}
|
||||
_utils.log("Succesfully loaded main.js");
|
||||
resolve();
|
||||
});
|
||||
}),
|
||||
new Promise((resolve, reject) => {
|
||||
downloadResource("default", "/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/css/main.css", (error, data) => {
|
||||
if(error) {
|
||||
error(data);
|
||||
reject();
|
||||
return;
|
||||
}
|
||||
_utils.log("Succesfully loaded main.css");
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
];
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
function checkForUpdates(okCb, errorCb) {
|
||||
_utils.downloadResource("default", "/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/vi.json", (error, data) => {
|
||||
if(error) {
|
||||
errorCb(data);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
data = JSON.parse(data);
|
||||
}catch(err) {
|
||||
errorCb(err);
|
||||
return;
|
||||
}
|
||||
|
||||
switch(platform) {
|
||||
case "win32":
|
||||
okCb(data.windows.version < vi.windows.version);
|
||||
break;
|
||||
case "darwin":
|
||||
okCb(data.osx.version < vi.osx.version);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
ipcMain.on('async', (event, arg) => {
|
||||
var obj = JSON.parse(arg);
|
||||
|
||||
switch(obj.arg) {
|
||||
case "update":
|
||||
checkForUpdates((update) => {
|
||||
if(update) {
|
||||
event.sender.send('async-reply', "update");
|
||||
update().then(() => {
|
||||
_utils.log("Update OK!");
|
||||
loadContent("index", 800, 400, true);
|
||||
}, () => {
|
||||
error("Update Failed!");
|
||||
});
|
||||
} else {
|
||||
loadContent("index", 800, 400, true);
|
||||
}
|
||||
}, (err) => {
|
||||
error(err);
|
||||
});
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
function error(error) {
|
||||
_utils.log(error);
|
||||
loadContent("error");
|
||||
}
|
||||
|
||||
app.on('ready', function() {
|
||||
//loadContent("https://raw.githubusercontent.com/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/index.html", 800, 400 ,true);
|
||||
//loadContent("splash", 300, 100, true);
|
||||
});
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"name": "Install",
|
||||
"description": "Better Discord enhances Discord.",
|
||||
"version": "0.1.1",
|
||||
"homepage": "https://github.com/Jiiks/BetterDiscordApp",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"electron-prebuilt": "^1.0.0"
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const https = require('https');
|
||||
const fs = require('fs');
|
||||
const eol = require('os').EOL;
|
||||
|
||||
function utils() {}
|
||||
|
||||
var logs = "";
|
||||
utils.prototype.log = (message) => {
|
||||
var d = new Date();
|
||||
var ds = ("00" + (d.getDate() + 1)).slice(-2) + "/" +
|
||||
("00" + d.getMonth()).slice(-2) + "/" +
|
||||
d.getFullYear() + " " +
|
||||
("00" + d.getHours()).slice(-2) + ":" +
|
||||
("00" + d.getMinutes()).slice(-2) + ":" +
|
||||
("00" + d.getSeconds()).slice(-2);
|
||||
console.log(`[${ds}] ${message}`);
|
||||
logs += `[${ds}] ${message}${eol}`;
|
||||
}
|
||||
utils.prototype.saveLogs = () => {
|
||||
|
||||
}
|
||||
utils.prototype.downloadResource = (host, resource, callback) => {
|
||||
https.get({
|
||||
host: host == "default" ? "raw.githubusercontent.com" : host,
|
||||
path: resource,
|
||||
headers: { 'user-agent': 'Mozilla/5.0' }
|
||||
},
|
||||
(response) => {
|
||||
var data = "";
|
||||
response.on("data", (chunk) => {
|
||||
data += chunk;
|
||||
});
|
||||
response.on("end", () => {
|
||||
callback(false, data);
|
||||
});
|
||||
response.on("error", (e) => {
|
||||
callback(true, e);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
exports.utils = utils;
|
|
@ -1 +0,0 @@
|
|||
{ "version": "0.0.9" }
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"init": "init"
|
||||
}
|
|
@ -1,248 +0,0 @@
|
|||
/*
|
||||
* BetterDiscordApp Installer v0.3.2
|
||||
*/
|
||||
|
||||
var dver = "0.0.284";
|
||||
|
||||
var asar = require('asar');
|
||||
var wrench = require('wrench');
|
||||
var fs = require('fs');
|
||||
var readline = require('readline');
|
||||
var util = require('util');
|
||||
|
||||
var _importSplice;
|
||||
var _functionSplice;
|
||||
var _functionCallSplice;
|
||||
|
||||
var _discordPath;
|
||||
var _appFolder = "/app";
|
||||
var _appArchive = "/app.asar";
|
||||
var _packageJson = _appFolder + "/package.json";
|
||||
var _index = _appFolder + "/app/index.js";
|
||||
|
||||
var _force = false;
|
||||
|
||||
// Get Arguments
|
||||
process.argv.forEach(function (val, index, array) {
|
||||
if (val == "--force") {
|
||||
_force = true;
|
||||
}
|
||||
|
||||
if (val == "-d" || val == "--directory") {
|
||||
_discordPath = array[(index+1)]
|
||||
}
|
||||
});
|
||||
|
||||
function install() {
|
||||
|
||||
if (typeof _discordPath == 'undefined') {
|
||||
var _os = process.platform;
|
||||
if (_os == "win32") {
|
||||
_importSplice = 89;
|
||||
_functionCallSplice = 497;
|
||||
_functionSplice = 601;
|
||||
_discordPath = process.env.LOCALAPPDATA + "/Discord/app-"+dver+"/resources";
|
||||
} else if (_os == "darwin") {
|
||||
_importSplice = 67;
|
||||
_functionCallSplice = 446;
|
||||
_functionSplice = 547;
|
||||
_discordPath = "/Applications/Discord.app/Contents/Resources" // Defaults to Applications directory
|
||||
}
|
||||
}
|
||||
console.log("Looking for discord resources at: " + _discordPath);
|
||||
|
||||
fs.exists(_discordPath, function(exists) {
|
||||
|
||||
if(exists) {
|
||||
console.log("Discord resources found at: " + _discordPath + "\nLooking for app folder");
|
||||
|
||||
if(fs.existsSync(_discordPath + _appFolder)) {
|
||||
console.log("Deleting " + _discordPath + _appFolder + " folder.");
|
||||
wrench.rmdirSyncRecursive(_discordPath + _appFolder);
|
||||
console.log("Deleted " + _discordPath + _appFolder + " folder.");
|
||||
}
|
||||
|
||||
if(fs.existsSync(_discordPath + "/node_modules/BetterDiscord")) {
|
||||
console.log("Deleting " + _discordPath + "/node_modules/BetterDiscord" + " folder.");
|
||||
wrench.rmdirSyncRecursive(_discordPath + "/node_modules/BetterDiscord");
|
||||
console.log("Deleted " + _discordPath + "/node_modules/BetterDiscord" + " folder.");
|
||||
}
|
||||
|
||||
console.log("Looking for app archive");
|
||||
if(fs.existsSync(_discordPath + _appArchive)) {
|
||||
console.log("App archive found at: " + _discordPath + _appArchive);
|
||||
} else {
|
||||
console.log("Failed to locate app archive at: " + _discordPath + _appArchive);
|
||||
process.exit();
|
||||
}
|
||||
|
||||
console.log("Extracting app archive");
|
||||
asar.extractAll(_discordPath + _appArchive, _discordPath + _appFolder);
|
||||
|
||||
console.log("Copying BetterDiscord");
|
||||
|
||||
fs.mkdirSync(_discordPath + "/node_modules/BetterDiscord");
|
||||
|
||||
wrench.copyDirSyncRecursive(__dirname + "/BetterDiscord/", _discordPath + _appFolder + "/node_modules/BetterDiscord/", {forceDelete: true});
|
||||
|
||||
if(!fs.existsSync("splice")) {
|
||||
console.log("Missing splice file");
|
||||
process.exit();
|
||||
}
|
||||
|
||||
var splice = fs.readFileSync("splice");
|
||||
|
||||
|
||||
fs.exists(_discordPath + _appFolder, function(exists) {
|
||||
if(exists) {
|
||||
console.log("Extracted to: " + _discordPath + _appFolder);
|
||||
console.log("Injecting index.js");
|
||||
|
||||
var data = fs.readFileSync(_discordPath + _index).toString().split("\n");
|
||||
data.splice(_importSplice, 0, 'var _betterDiscord = require(\'betterdiscord\');\n');
|
||||
data.splice(_functionCallSplice, 0, splice);
|
||||
|
||||
fs.writeFile(_discordPath + _index, data.join("\n"), function(err) {
|
||||
if(err) return console.log(err);
|
||||
console.log("Injected index.js");
|
||||
|
||||
console.log("Deleting old cache files");
|
||||
|
||||
var counter = 0;
|
||||
var _prefsPath = '/Library/Preferences/BetterDiscord/';
|
||||
|
||||
var emotes_twitch_global = 'emotes_twitch_global.json';
|
||||
fs.exists(process.env.HOME + _prefsPath + emotes_twitch_global, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + emotes_twitch_global);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_twitch_global, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + emotes_twitch_global);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
|
||||
});
|
||||
|
||||
var emotes_twitch_subscriber = 'emotes_twitch_subscriber.json';
|
||||
fs.exists(process.env.HOME + _prefsPath + emotes_twitch_subscriber, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + emotes_twitch_subscriber);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_twitch_subscriber, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + emotes_twitch_subscriber);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
});
|
||||
|
||||
var emotes_bttv = 'emotes_bttv.json';
|
||||
fs.exists(process.env.HOME + _prefsPath + emotes_bttv, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + emotes_bttv);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_bttv, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + emotes_bttv);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
});
|
||||
|
||||
var emotes_bttv_2 = "emotes_bttv_2.json";
|
||||
fs.exists(process.env.HOME + _prefsPath + emotes_bttv_2, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + emotes_bttv_2);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_bttv_2, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + emotes_bttv_2);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
});
|
||||
|
||||
var emotes_ffz = "emotes_ffz.json";
|
||||
fs.exists(process.env.HOME + _prefsPath + emotes_ffz, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + emotes_ffz);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_ffz, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + emotes_ffz);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
|
||||
});
|
||||
var user_pref = "user.json";
|
||||
fs.exists(process.env.HOME + _prefsPath + user_pref, (exists) => {
|
||||
if (exists) {
|
||||
console.log("Deleting " + user_pref);
|
||||
fs.unlinkSync(process.env.HOME + _prefsPath + user_pref, (err) => {
|
||||
if(err) throw err;
|
||||
});
|
||||
console.log("Deleted " + user_pref);
|
||||
}
|
||||
counter++;
|
||||
finished();
|
||||
});
|
||||
|
||||
function finished() {
|
||||
if(counter => 6) {
|
||||
console.log("Looks like we're done here");
|
||||
process.exit();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} else {
|
||||
console.log("Something went wrong. Please try again.");
|
||||
process.exit();
|
||||
}
|
||||
});
|
||||
|
||||
} else {
|
||||
console.log("Discord resources not found at: " + _discordPath);
|
||||
process.exit();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function init() {
|
||||
|
||||
console.log("BetterDiscord Simple Installer v0.3 for Discord "+dver+" by Jiiks.");
|
||||
console.log("If Discord has updated then download the latest installer.");
|
||||
|
||||
var rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
||||
|
||||
if (_force == false) {
|
||||
rl.question("The following directories will be deleted if they exists: discorpath/app, discordpath/node_modules/BetterDiscord, is this ok? Y/N", function(answer) {
|
||||
|
||||
var alc = answer.toLowerCase();
|
||||
|
||||
switch(alc) {
|
||||
case "y":
|
||||
install();
|
||||
break;
|
||||
case "yes":
|
||||
install();
|
||||
break;
|
||||
case "n":
|
||||
process.exit();
|
||||
break;
|
||||
case "no":
|
||||
process.exit();
|
||||
break;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
install();
|
||||
}
|
||||
}
|
||||
|
||||
init();
|
|
@ -1,11 +0,0 @@
|
|||
@echo off
|
||||
where node.exe >nul 2>nul
|
||||
if %errorlevel%==1 (
|
||||
echo "Node.exe not found, opening your browser..."
|
||||
start "" "https://nodejs.org/dist/latest/win-x86/node.exe"
|
||||
pause
|
||||
) else (
|
||||
taskkill /f /im "Discord.exe" >nul 2>nul
|
||||
cmd /k node.exe index.js
|
||||
)
|
||||
exit
|
|
@ -1,7 +0,0 @@
|
|||
#!/bin/bash
|
||||
# As there is no Linux support, this script assumes OS X as the host system.
|
||||
|
||||
command -v node > /dev/null || (echo 'Node not found, please download it!' && open 'https://nodejs.org/en/' && sleep 5 && exit)
|
||||
|
||||
node index.js
|
||||
exit
|
|
@ -1,63 +0,0 @@
|
|||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
|
@ -1,156 +0,0 @@
|
|||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
|
||||
!packages/*/build/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
|
||||
# NuGet Packages Directory
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||
#packages/
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
|
||||
#LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
|
||||
# =========================
|
||||
# Windows detritus
|
||||
# =========================
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac desktop service store files
|
||||
.DS_Store
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.21005.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterDiscordWI", "BetterDiscordWI\BetterDiscordWI.csproj", "{469F7547-7664-4DE8-A568-E89525981539}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{469F7547-7664-4DE8-A568-E89525981539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{469F7547-7664-4DE8-A568-E89525981539}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{469F7547-7664-4DE8-A568-E89525981539}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{469F7547-7664-4DE8-A568-E89525981539}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
|
||||
</startup>
|
||||
</configuration>
|
|
@ -1,12 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity version="1.0.0.0" name="BetterDiscord Installer"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
Before Width: | Height: | Size: 170 KiB |
|
@ -1,158 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{469F7547-7664-4DE8-A568-E89525981539}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>BetterDiscordWI</RootNamespace>
|
||||
<AssemblyName>BetterDiscordWI</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>Resources\BetterDiscord-icon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup />
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>App.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="asardotnet">
|
||||
<HintPath>..\dlls\asardotnet.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.IO.Compression.FileSystem" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="components\CTextBox.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FormMain.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FormMain.Designer.cs">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="panels\IPanel.cs" />
|
||||
<Compile Include="panels\Panel0.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel0.Designer.cs">
|
||||
<DependentUpon>Panel0.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel1.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel1.Designer.cs">
|
||||
<DependentUpon>Panel1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel2.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel2.Designer.cs">
|
||||
<DependentUpon>Panel2.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel3.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="panels\Panel3.Designer.cs">
|
||||
<DependentUpon>Panel3.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Utils.cs" />
|
||||
<EmbeddedResource Include="FormMain.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="panels\Panel0.resx">
|
||||
<DependentUpon>Panel0.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="panels\Panel1.resx">
|
||||
<DependentUpon>Panel1.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="panels\Panel2.resx">
|
||||
<DependentUpon>Panel2.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<None Include="App.manifest" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\bd_logo2.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\bd_logo_64x64.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\bd_logo_64x64_nobg.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\bd_logo_large_nobg.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="BetterDiscord-icon.ico" />
|
||||
<Content Include="Resources\BetterDiscord-icon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
|
@ -1,137 +0,0 @@
|
|||
namespace BetterDiscordWI
|
||||
{
|
||||
partial class FormMain
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.panelContainer = new System.Windows.Forms.Panel();
|
||||
this.btnNext = new System.Windows.Forms.Button();
|
||||
this.btnBack = new System.Windows.Forms.Button();
|
||||
this.lblPanelTitle = new System.Windows.Forms.Label();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Location = new System.Drawing.Point(438, 328);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnCancel.TabIndex = 0;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// panelContainer
|
||||
//
|
||||
this.panelContainer.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.panelContainer.Location = new System.Drawing.Point(0, 52);
|
||||
this.panelContainer.Name = "panelContainer";
|
||||
this.panelContainer.Size = new System.Drawing.Size(524, 258);
|
||||
this.panelContainer.TabIndex = 0;
|
||||
//
|
||||
// btnNext
|
||||
//
|
||||
this.btnNext.Enabled = false;
|
||||
this.btnNext.Location = new System.Drawing.Point(357, 328);
|
||||
this.btnNext.Name = "btnNext";
|
||||
this.btnNext.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnNext.TabIndex = 4;
|
||||
this.btnNext.Text = "Next >";
|
||||
this.btnNext.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnBack
|
||||
//
|
||||
this.btnBack.Enabled = false;
|
||||
this.btnBack.Location = new System.Drawing.Point(276, 328);
|
||||
this.btnBack.Name = "btnBack";
|
||||
this.btnBack.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnBack.TabIndex = 5;
|
||||
this.btnBack.Text = "< Back";
|
||||
this.btnBack.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// lblPanelTitle
|
||||
//
|
||||
this.lblPanelTitle.AutoSize = true;
|
||||
this.lblPanelTitle.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.lblPanelTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblPanelTitle.Location = new System.Drawing.Point(61, 16);
|
||||
this.lblPanelTitle.Name = "lblPanelTitle";
|
||||
this.lblPanelTitle.Size = new System.Drawing.Size(103, 16);
|
||||
this.lblPanelTitle.TabIndex = 6;
|
||||
this.lblPanelTitle.Text = "BetterDiscord";
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.panel1.BackgroundImage = global::BetterDiscordWI.Properties.Resources.bd_logo_large_nobg;
|
||||
this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
|
||||
this.panel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(64, 46);
|
||||
this.panel1.TabIndex = 0;
|
||||
//
|
||||
// FormMain
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(524, 361);
|
||||
this.Controls.Add(this.panel1);
|
||||
this.Controls.Add(this.lblPanelTitle);
|
||||
this.Controls.Add(this.btnBack);
|
||||
this.Controls.Add(this.panelContainer);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.btnNext);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "FormMain";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Setup - BetterDiscord ";
|
||||
this.TransparencyKey = System.Drawing.Color.LimeGreen;
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Panel panelContainer;
|
||||
public System.Windows.Forms.Button btnNext;
|
||||
public System.Windows.Forms.Button btnBack;
|
||||
public System.Windows.Forms.Label lblPanelTitle;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
public System.Windows.Forms.Button btnCancel;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml;
|
||||
using BetterDiscordWI.panels;
|
||||
|
||||
namespace BetterDiscordWI {
|
||||
public partial class FormMain : Form {
|
||||
|
||||
private readonly IPanel[] _panels = { new Panel0(), new Panel1(), new Panel2() };
|
||||
private int _index;
|
||||
|
||||
public string DiscordPath;
|
||||
public bool RestartDiscord = false;
|
||||
public string Sha;
|
||||
public bool Finished = false;
|
||||
|
||||
public XmlNodeList ResourceList;
|
||||
|
||||
public FormMain() {
|
||||
InitializeComponent();
|
||||
|
||||
Sha = Utils.GetHash();
|
||||
|
||||
if (Sha.Length < 1) {
|
||||
MessageBox.Show(@"Failed to get sha", @"Error", MessageBoxButtons.OK);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
foreach (IPanel ipanel in _panels) {
|
||||
panelContainer.Controls.Add((UserControl)ipanel);
|
||||
((UserControl)ipanel).Dock = DockStyle.Fill;
|
||||
((UserControl)ipanel).Hide();
|
||||
}
|
||||
((UserControl)_panels[_index]).Show();
|
||||
_panels[_index].SetVisible();
|
||||
|
||||
btnCancel.Click += (sender, args) => Close();
|
||||
btnNext.Click += (sender, args) => _panels[_index].BtnNext();
|
||||
btnBack.Click += (sender, args) => _panels[_index].BtnPrev();
|
||||
}
|
||||
|
||||
public void SwitchPanel(int index) {
|
||||
((UserControl)_panels[_index]).Hide();
|
||||
_index = index;
|
||||
((UserControl)_panels[_index]).Show();
|
||||
_panels[_index].SetVisible();
|
||||
}
|
||||
|
||||
protected override void OnFormClosing(FormClosingEventArgs e) {
|
||||
if (Finished) return;
|
||||
DialogResult dr = MessageBox.Show(@"Setup is not complete. If you exit now, BetterDiscord will not be installed. Exit Setup?", @"Exit Setup?", MessageBoxButtons.YesNo);
|
||||
if (dr == DialogResult.No) {
|
||||
e.Cancel = true;
|
||||
}
|
||||
}
|
||||
|
||||
readonly Pen _borderPen = new Pen(Color.FromArgb(160, 160, 160));
|
||||
protected override void OnPaint(PaintEventArgs e) {
|
||||
Graphics g = e.Graphics;
|
||||
g.FillRectangle(SystemBrushes.Window, new Rectangle(0, 0, Width, 50));
|
||||
g.DrawLine(_borderPen, 0, 50, Width, 50);
|
||||
g.DrawLine(SystemPens.Window, 0, 51, Width, 51);
|
||||
|
||||
g.DrawLine(_borderPen, 0, 310, Width, 310);
|
||||
g.DrawLine(SystemPens.Window, 0, 311, Width, 311);
|
||||
|
||||
base.OnPaint(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,659 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA
|
||||
IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD5AAAA+wAA
|
||||
APsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD5AAAA+wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAA
|
||||
APsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APsAAAD7AAAA/wEBCf8NClr/FBCI/wMCGP8AAAD/AAAA/wAAAP8AAAD/AwIW/xQQif8NClv/AQEK/wAA
|
||||
AP8AAAD7AAAA+wQDH/8cFr7/HhjN/xkTqf8QDW7/EQ1z/xURkf8VEZH/EQ10/xANbf8YE6j/HhjN/xwW
|
||||
v/8EAyH/AAAA+wAAAPsPDGn/HhjL/x0Xxv8aFbT/HxnV/x4Y0P8eGMz/HhjM/x4Y0P8fGdT/GhW1/x0X
|
||||
xf8eGMv/EAxs/wAAAPsAAAD7DQpb/x4YzP8eGMz/HRfK/wcFMP8JB0D/HhjP/x4Yz/8JB0P/BgUu/x0X
|
||||
yf8eGMz/HhjM/w0LXf8AAAD7AAAA+wgGN/8eGM//HhjM/xoVtf8AAAD/AAAC/x0XyP8dF8r/AAAD/wAA
|
||||
AP8aFbL/HhjM/x4Yz/8IBzv/AAAA+wAAAPsBAQn/HhjP/x4YzP8eGM7/FBCK/xYRlv8eGM3/HhjN/xYR
|
||||
l/8UEIn/HhjO/x4YzP8eGND/AQEL/wAAAPsAAAD7AAAA/xcSnP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/FxKf/wAAAP8AAAD7AAAA+wAAAP8LCU3/HhjP/x4Yy/8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMv/HhjP/wsJUP8AAAD/AAAA+wAAAPsAAAD/AAAD/xYRlP8XEp3/GhSw/x4Y
|
||||
0f8fGdX/HxnV/x4Y0f8aFLH/FxKd/xYRlv8AAAT/AAAA/wAAAPsAAAD7AAAA/wAAAP8AAAD/CQc8/wwK
|
||||
Uf8EAxn/AwMa/wMDGv8EAxj/DApR/wkHPf8AAAD/AAAA/wAAAP8AAAD7AAAA+wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAAAPsAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPsAAAD5AAAA+wAA
|
||||
APsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD5AAD//wAA
|
||||
//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA
|
||||
AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1AAAA+QAAAPkAAAD5AAAA+QAA
|
||||
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
|
||||
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA9QAAAPkAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQAG/wYE
|
||||
J/8IBjj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CAY3/wYE
|
||||
KP8BAAb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/BgQn/xYR
|
||||
lf8eGM3/IBnc/yIb5v8OC2L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0L
|
||||
W/8iG+j/IBnc/x4Yzv8WEpn/BgQq/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/xEN
|
||||
df8gGt//HhjO/x4Yy/8eGMv/IBna/xwWwf8BAQr/AAAE/wUEI/8JBz//CwlO/wsJTv8JB0D/BQQk/wAA
|
||||
Bf8BAQj/HBa8/yAa2/8eGMv/HhjL/x4Yzv8hGt//Eg56/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAA
|
||||
AP8SDn7/IBra/x4Yy/8eGMz/HhjP/x0Xxf8IBzv/CghK/xgTov8dGMv/IBnb/yAa3v8gGdr/IBna/yAa
|
||||
3v8gGdz/HhjM/xgTpf8LCUz/CAY5/xwWwv8eGM//HhjM/x4Yy/8fGdn/Ew+E/wAAAP8AAAD/AAAA+QAA
|
||||
APkAAAD/AQAF/x8Z1P8eGMv/HhjM/x4Yzf8bFbj/Dgxk/x4Yzv8gGtv/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAZ2v8eGM//Dwxm/xoVtP8eGM3/HhjM/x4Yy/8fGdb/AQEK/wAA
|
||||
AP8AAAD5AAAA+QAAAP8AAAD/HRjK/x4YzP8eGMz/HhjM/x0XyP8fGdX/HhjL/x4Y0P8gGdz/IBnc/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAZ3P8gGdz/HhjQ/x4Yy/8fGdX/HRfI/x4YzP8eGMz/HhjM/x4Y
|
||||
zf8AAAP/AAAA/wAAAPkAAAD5AAAA/wAAAP8cFsH/HhjM/x4YzP8eGMz/HhjM/x4YzP8fGNP/FhGW/wYF
|
||||
Kv8HBjX/GxW4/x4Yzv8eGMz/HhjM/x4Yzf8bFrz/CAY3/wYFKf8VEZH/HxnU/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HBfF/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/xkUrf8eGMz/HhjM/x4YzP8eGMz/HhjM/xwW
|
||||
v/8AAAD/AAAA/wAAAP8DAhX/HxnW/x4YzP8eGMz/HxnX/wMDGf8AAAD/AAAA/wAAAP8bFrr/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8aFLL/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/FBCK/x4Yzv8eGMz/HhjM/x4Y
|
||||
zP8eGM3/FBCJ/wAAAP8AAAD/AAAA/wAAAP8aFbj/HhjM/x4YzP8cFr3/AAAA/wAAAP8AAAD/AAAA/xIP
|
||||
gP8eGM//HhjM/x4YzP8eGMz/HhjN/xURkv8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8MCVT/IBnZ/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8aFbP/AAAA/wAAAP8AAAD/AQEK/x4Y0P8eGMz/HhjM/x8Z0/8CAQ3/AAAA/wAA
|
||||
AP8AAAD/GRSt/x4YzP8eGMz/HhjM/x4YzP8fGdf/DQpb/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wUE
|
||||
Jf8gGtz/HhjM/x4YzP8eGMz/HhjM/x8Z1v8RDnb/AgEN/wMCFv8XEp3/HhjR/x4YzP8eGMz/HhjQ/xgT
|
||||
ov8DAhj/AQEM/xANcf8gGdf/HhjM/x4YzP8eGMz/HhjM/yAa3v8GBSv/AAAA/wAAAP8AAAD5AAAA+QAA
|
||||
AP8AAAD/AAAC/x0Xyf8eGMv/HhjM/x4YzP8eGMz/HhjL/x8Z1f8fGNL/HxnV/x4Y0P8eGMv/HhjM/x4Y
|
||||
zP8eGMz/HhjP/x8Z1v8eGNH/HxnV/x4Yy/8eGMz/HhjM/x4YzP8eGMv/HhjM/wAAA/8AAAD/AAAA/wAA
|
||||
APkAAAD5AAAA/wAAAP8AAAD/FBCJ/x4Yz/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yzv8VEZL/AAAA/wAA
|
||||
AP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8IBzv/IBre/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IRrd/wkH
|
||||
Qf8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAf8dF8f/HhjL/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
y/8dGMr/AAAD/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/w8Ma/8fGNT/HxjT/x4Y
|
||||
y/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
y/8fGNP/HxjT/xENc/8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AQEM/yAa
|
||||
2f8WEZT/GRSu/yAa3P8eGNH/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4Y
|
||||
0P8gGtz/GhSw/xURkv8hGt3/AgIQ/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/BQQk/xwWvf8ZFKb/CghG/xANcP8bFbb/HhjR/yAZ2v8gGt7/IBre/yAa3v8gGt7/IBnb/x4Y
|
||||
0f8bFrj/EA1y/woIRv8ZE6L/HBfA/wYEJ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkHQf8aFa7/GRSn/w0LXP8EBBz/BAQg/wcFL/8IBjn/CAY5/wcF
|
||||
MP8EBCH/BAMb/w0LWv8ZFKX/GxWw/woIRP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAA
|
||||
APkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQj/CQg6/wcGKP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8HBiX/Cgg8/wICCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPUAAAD5AAAA+QAA
|
||||
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
|
||||
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD1AAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAA7wAAAPcAAAD3AAAA9wAA
|
||||
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAA
|
||||
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAA
|
||||
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAADvAAAA+wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD7AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAT/AgIR/wQDG/8EAxr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwMZ/wQDHP8CAhL/AAAF/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AwIY/woIRP8PDGv/FhKY/xoUsf8bFbP/BQQj/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EAx7/GhWx/xoU
|
||||
s/8WEpn/EAxt/woIRv8EAxr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBCP8LCU//GhSz/x8Z1v8fGdb/HxjU/x8Z1f8hGt//GBOk/wMC
|
||||
Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIC
|
||||
Ef8XEpz/IRrh/x8Z1f8fGNT/HxnW/x8Z1/8aFbb/CwlT/wEBC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/CAY4/xkUrf8iG+j/HxjS/x4Yyv8eGMv/HhjL/x4Y
|
||||
zv8fGNL/IRrk/xEOev8BAAf/AAAB/wEBCf8CAhT/BAMe/wUEJP8FBCf/BQQn/wUEJP8EAx7/AgIU/wEB
|
||||
Cf8AAAH/AAAG/xENcv8iG+H/HxnS/x4Yzv8eGMv/HhjL/x0Xyv8fGNH/Ihvp/xoUsv8IBzz/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8HBjP/HhjK/yAa3f8eGMz/HhfM/x4Y
|
||||
zP8dF8r/HxjU/x8Z1v8XEp7/CwhL/wUEJf8HBjT/DApX/xIPfP8XEp7/GhW1/xwWvv8cF8P/HBbD/xwW
|
||||
vv8bFbb/FxKf/xIOfv8NCln/BwY1/wUEJf8LCEn/FhKa/x8Z1f8fGdX/HRfK/x4XzP8dF8z/HhjM/yAa
|
||||
3f8eGM7/CAY4/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wUEKf8cFr7/HxnX/x4Y
|
||||
y/8eGMv/HhjM/x0Yyv8fGdb/HRfM/w0KV/8EAxv/Dgth/xcTpP8eGM7/HxnW/x8Z1f8fGNT/HxnV/x8Z
|
||||
1P8fGNP/HxjT/x8Z1P8fGdX/HxjV/x8Z1f8fGdb/HhjP/xgTpv8OC2T/BAMc/wwJUv8dF8j/HxnX/x0X
|
||||
yv8eGMz/HhjL/x4Yy/8fGdb/HBfC/wYFLv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAC/xAM
|
||||
bP8gGdr/HhjK/x4YzP8eGMz/HhjM/x8Y0/8bFrv/CQc//xIOev8fGNL/IRvm/x8Z1f8eGMv/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x0XzP8eGMz/HhjM/x0XzP8eGMz/HhjL/x8Y1P8hG+b/HxjU/xIO
|
||||
f/8JBz3/GhW3/x8Y0/8eGMz/HhjM/x0XzP8eGMv/IBnZ/xEOdv8AAAX/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAB/w4LYv8fGdX/HhfM/x4YzP8dF8z/HhfN/x4XzP8XE6D/GhW3/yAa3P8eGNL/HhfL/x4Y
|
||||
zP8eF83/HhfM/x4YzP8eF8z/HhfM/x4YzP8eF8z/HhfM/x4XzP8dF8z/HhfM/x4XzP8dF8z/HhfN/x4X
|
||||
zP8dF8v/HxjS/yAa3P8bFbr/FxKe/x0Xyv8eGM3/HhfM/x4XzP8dF8z/HxnU/xAMbP8AAAT/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/w0KWP8fGdX/HhjM/x0YzP8eGMz/HhjM/x4Xy/8eGM7/HxjS/x4Y
|
||||
zP8eGMv/HhjO/yAa4P8hGuH/IRrj/yAZ2/8dGMv/HhjM/x0Xy/8eGMz/HhjM/x4YzP8eGMz/HhjL/yAZ
|
||||
2v8hGuL/IRrh/yEa4f8eGM7/HhjL/x4YzP8fGNL/HhjO/x4Yy/8eGMv/HhjM/x4YzP8eGMz/HxnV/w4L
|
||||
YP8AAAH/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wsJTf8fGdb/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x0Xy/8eGNH/HRfI/xAMb/8IBjf/CQhD/xURkf8fGdb/HRfL/x4Yy/8eGMz/HhjM/x0X
|
||||
y/8dF8v/HxnW/xURlf8KCEX/BwY2/w8Ma/8dF8X/HhjS/x0Xy/8eGMz/HhjM/x0XzP8eGMz/HhjM/x0X
|
||||
zP8eGMz/HxnW/wwJU/8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wkHQP8fGNT/HhfM/x4Y
|
||||
zP8dF8z/HhfM/x4YzP8dF8z/HhfM/x4Y0P8fGdn/CQc+/wAAAv8AAAD/AAAA/wICEP8SDnv/IRrf/x4Y
|
||||
y/8eF8z/HhfM/x4Xy/8gGt//Ew+D/wICEv8AAAD/AAAA/wAAAP8IBjr/HxnW/x4Y0f8dF8z/HhfM/x4X
|
||||
zP8dF8z/HhfM/x4XzP8dF8z/HxnV/woIRv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wcF
|
||||
Mf8dF83/HhjM/x0YzP8eGMz/HhjM/x0YzP8eGMz/HhjM/yAa3f8WEpj/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8CAQ//HhjM/x8Y0/8eGMz/HhjM/x4Y0f8eGNH/AgIT/wAAAP8AAAD/AAAA/wAAAP8AAAD/FRGP/yAZ
|
||||
3f8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjQ/wgGNv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wQDHf8bFrr/HhjO/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x8Z2f8NC17/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/FhKd/yAa3v8eGMz/HhjM/yAZ3P8YE6b/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/DApU/x8Z1/8eGM3/HhjM/x0XzP8eGMz/HhjM/x0XzP8eGM3/HBbA/wUEIv8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wEBCf8XEpv/HxnV/x4YzP8dF8z/HhfM/x4YzP8dF8z/HhfM/yAZ
|
||||
2/8ODGj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GBOm/yAZ3P8eF8z/HhfM/yAZ2v8aFK7/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/Dgtf/yAZ2f8eGM3/HhfM/x4XzP8dF8z/HhfM/x4XzP8fGdP/GBOk/wIB
|
||||
Dv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8RDXb/IRri/x0YzP8eGMz/HhjM/x0Y
|
||||
zP8eGMz/HhjM/yAZ2/8YE6X/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAhb/HxjW/x4Y0f8eGMz/HhjM/x4Y
|
||||
0P8gGdr/BAMd/wAAAP8AAAD/AAAA/wAAAP8AAAD/FxKc/yAa3P8eGMv/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8hGt//Eg9//wAAAf8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8JB0H/Ihvn/x4Y
|
||||
zP8eGMv/HhjL/x4YzP8eGMv/HhjM/x4Yy/8hGuH/EA1v/wMCFf8AAAT/AQAH/wUEJP8YE6X/IBnb/x4Y
|
||||
y/8eGMz/HhjM/x4Yy/8gGdn/GRSr/wUEKP8BAAj/AAAE/wICFP8PDGf/IRrh/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4Yy/8iG+j/CwlK/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8DAhX/HxnV/x4Y0f8eGMz/HhjM/x4YzP8eGMz/HhjM/x0Xy/8eGM7/HxnV/xcSnP8QDGz/EQ12/xoU
|
||||
s/8fGdj/HRfK/x0Xy/8eGMz/HRfL/x4YzP8dF8r/HxnX/xoVtv8RDnn/Dwxr/xYRmf8fGdT/HhjO/x4Y
|
||||
y/8eGMz/HRfL/x4YzP8eGMz/HRfL/x4Yz/8fGdn/BAMc/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAH/GhWz/yAZ2/8eGMv/HhjM/x4YzP8eGMz/HRfM/x4YzP8eGMv/HhjO/x8Z
|
||||
1P8fGdX/HxnV/x4Y0/8eGMz/HRfL/x4YzP8eGMz/HhjM/x4XzP8eGMz/HhfM/x4Y0v8fGdT/HxnV/x8Y
|
||||
1P8eGM7/HhjL/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjL/yAZ2f8bFrr/AAAC/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/EAxs/yAZ3P8eGMz/HhjL/x4YzP8eGMv/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAa3v8RDXb/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/BwYz/x4Yzf8eGNH/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HRfL/x4Y
|
||||
zP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HhjQ/x4Y
|
||||
z/8IBjn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AwMZ/xkU
|
||||
rP8fGdX/HhjM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4Y
|
||||
zP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4X
|
||||
zP8eGMz/HxnU/xoUsv8EAxz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAB/w4LXf8gGdj/HhjL/x4YzP8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMv/HxnX/w4LZf8AAAL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYFKv8dF8n/HhjN/x4YzP8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0X
|
||||
y/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4Y
|
||||
zP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HhjN/wcGMP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAABf8TD4X/IBrg/x4Yzf8fGdf/HRfL/x4Y
|
||||
y/8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4X
|
||||
zP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4Xy/8eGMr/HxnX/x4Xzv8gGt3/FRCP/wAABv8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAxz/IBrg/xwW
|
||||
vf8VEZP/HRfI/x8Y0/8fGdT/HhjP/x4YzP8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4YzP8eGM7/HxnU/x8Y0/8dF8r/FRGU/xsWuv8hG+T/BQQj/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/EA1u/x8Z0f8cFrz/Dgtj/xANcf8YFKf/HhjS/yAZ3P8gGtz/HxjT/x4Yz/8eGM3/HhjM/x0X
|
||||
y/8eGMz/HRfL/x4YzP8eGMz/HhfN/x4Yz/8fGNP/IBrc/yAa3P8eGNL/GRSp/xENdP8OC2H/Gxa5/yAZ
|
||||
0v8RDnb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AQEJ/woISf8aFbL/IRvX/xURkv8HBjT/CAY3/w8Maf8YE6T/HRjK/x8Z
|
||||
2f8gGuH/IRvm/yIb6P8hG+f/IRvn/yIb6P8hG+b/IBri/x8Z2v8dGMr/GBOm/w8MbP8IBjj/BwUz/xQQ
|
||||
jf8hGtX/GxW3/wsJTf8BAQv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CwlQ/xkUqf8hGtv/FhKb/wsJ
|
||||
TP8GBSr/AwIV/wQDH/8HBjT/CghE/wsJT/8MClb/DApW/wsJT/8KCEX/BwY1/wQDIP8DAhT/BgUp/wsJ
|
||||
Sf8WEZb/IRrc/xoVrP8MClT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIB
|
||||
Df8IBjn/Eg9z/xcTk/8XEpX/Dw1X/wEBBf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB
|
||||
BP8ODFH/FxKV/xcTlP8SD3T/CAc7/wIBDv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAC/wICEP8FBCD/BQQb/wAAAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAv8EBBn/BQQh/wMCEP8AAAL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA+wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD7AAAA7wAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
|
||||
APUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
|
||||
APUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
|
||||
APUAAAD1AAAA9QAAAPUAAADvAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
|
||||
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
|
||||
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
|
||||
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
|
||||
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
|
||||
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
|
||||
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA
|
||||
AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAOUAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAOUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
|
||||
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EAxj/CghA/w4L
|
||||
Xf8TD4D/Dwxj/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4LXP8TEIP/Dgtf/woI
|
||||
Qv8EAxv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAMc/xAN
|
||||
bf8YE6X/HhjP/yIb6P8jHPD/JR35/yce//8OC1//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwK
|
||||
Uv8mHv//JR37/yMc8f8iG+j/HxnR/xkUqP8RDXH/BQQh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8EAxj/FBCF/yAZ1/8kHff/Ihzr/yAZ2P8eGM7/HhjM/x4Yyf8gGtn/JBzx/wkHOf8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wcGLv8jHOz/IRrd/x4Yyf8eGMz/HhjO/yAZ1/8iG+n/JB33/yAa2/8UEIv/BAMe/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8NClf/IBrZ/yUd+v8gGdn/HhjK/x4Yy/8eGMz/HhjM/x4YzP8eGMr/HhjJ/yYe
|
||||
//8lHvz/BgUq/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUEIv8kHfL/Jx///x4Yyv8eGMr/HhjM/x4YzP8eGMz/HhjL/x4Y
|
||||
yv8gGdf/JR35/yEa3v8OC2D/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UEIT/JR36/yEb4f8dGMj/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
y/8eGMn/Ihvp/yMc7/8ZFKr/Dgth/wAAAP8AAAD/AAAA/wMCEv8IBzb/DQtZ/xEOdf8UEIn/FxKY/xgT
|
||||
oP8YE6D/FxKY/xQQiv8SDnf/DQtb/wgHOP8DAhT/AAAA/wAAAP8AAAD/Dgtc/xkUpv8jHO3/Ihzr/x4Y
|
||||
yv8eGMv/HhjM/x4YzP8eGMz/HhjM/x0YyP8hGt7/JR78/xURj/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UEIr/Jh7+/x8Z0v8eGMr/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x0YyP8fGdX/JR35/xoVsP8HBi//AAAA/wAAAP8IBjX/Eg55/xgTov8dGMj/IRvj/yMc
|
||||
8P8kHPL/Ixzu/yMc6/8iG+j/Ihvo/yMc6/8jHO7/JBzy/yMc8P8iG+T/HhjK/xgTpf8SD3v/CQc6/wAA
|
||||
AP8AAAD/BgUo/xkUqf8lHfn/IBnX/x0YyP8eGMz/HhjM/x4YzP8eGMz/HhjK/x4Y0P8lHv7/FhKX/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8QDW//Jh7//x4Z
|
||||
z/8eGMr/HhjM/x4YzP8eGMz/HhjM/x0YyP8hG+H/Ihvr/w4LW/8AAAD/AgEO/xANbv8bFrz/Ihzp/yQd
|
||||
9P8iG+n/IBra/x8Y0P8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjQ/yAa
|
||||
2f8iG+j/JB30/yMc6/8cF7//EQ1z/wMCE/8AAAD/DApR/yIb5/8iG+T/HRfH/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMv/HhjN/yYe//8SD3v/AAAB/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
|
||||
AP8CAQr/HxnT/yEa4P8eGMr/HhjM/x4YzP8eGMz/HhjM/x4Yy/8hGt7/HhjL/wcFLf8DAxf/FhGS/yIb
|
||||
5P8kHfX/IRvi/x4Yzv8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yy/8eGM7/IRrg/yQd9f8iG+b/FxKZ/wQDHP8GBST/HRfE/yEa
|
||||
4P8eGMr/HhjM/x4YzP8eGMz/HhjM/x4Yy/8gGtv/IRrc/wMDFP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
|
||||
APMAAAD/AAAA/wAAAP8AAAD/AgEK/xwXw/8gGtv/HhjM/x4YzP8eGMz/HhjM/x4YzP8fGNH/HxnT/w8M
|
||||
Zf8PDWj/Ihvn/yMc8P8fGdL/HhjK/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMr/HxjR/yMc
|
||||
7/8iHOr/EQ1x/w4MYP8eGM//HxnS/x4YzP8eGMz/HhjM/x4YzP8eGMz/IBrY/x4Yy/8DAxb/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAA/8bFrn/IRrf/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HxjQ/xwWvf8cF8H/Ixzu/x8Z0f8eGMr/HhjM/x4YzP8eGMz/HhjN/x4Yz/8eGM7/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGM7/HhjP/x4Y
|
||||
zf8eGMz/HhjM/x4YzP8eGMr/HxjP/yMc7v8dF8P/Gxa6/x8Z0P8eGMz/HhjM/x4YzP8eGMz/HhjM/yAa
|
||||
2/8dF8P/AgEM/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/GhWu/yEb
|
||||
4/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yy/8fGND/HxnU/x4Yy/8eGMz/HhjM/x4Yy/8eGMn/IRrg/yMc
|
||||
7/8iG+b/Ihvp/yMc7v8fGdP/HRjI/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjJ/x8Z
|
||||
0f8jHO3/Ihvp/yIb5v8jHO7/IRvi/x4Yyf8eGMv/HhjM/x4YzP8eGMv/HxnU/x8Z0P8eGMr/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8hGt//Gxa5/wAAA/8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/xgToP8iG+n/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
y/8eGMr/Ixzt/xwWv/8PDGn/CghA/wsJSf8UEIv/Ihvj/yEa4P8dF8f/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HRfI/yAa3f8iG+b/FRGQ/wsJTP8JCED/Dwxk/xsWuf8jHO7/HhjM/x4Yy/8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IRvl/xkUq/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8VEY3/Ixzu/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8dF8j/Ixzw/xgUpf8BAQj/AAAA/wAAAP8AAAD/AAAA/woIQP8hGuD/IBrb/x4Y
|
||||
yv8eGMz/HhjM/x4YzP8eGMz/HhjL/yAZ2P8iG+T/CwlJ/wAAAP8AAAD/AAAA/wAAAP8AAAP/FxKa/yMc
|
||||
8P8dGMn/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/yMc6/8WEpn/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/EQ51/yMc8v8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IRrg/x0Xxv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/DApV/yQd8/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yy/8kHfT/Dwxj/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8cFrz/IRvk/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8jHPD/Ew+B/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/w4L
|
||||
XP8jHPH/HhjN/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/yQd9P8PDGL/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cFrn/IRrg/x4YzP8eGMz/HhjM/x4YzP8gGtz/HRfE/wAA
|
||||
Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQtW/yQc8/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/Ixzy/w8MZv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8KCET/Ihzp/x4Yzv8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
z/8hG+X/CAY0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExCD/yMc8P8eGMz/HhjM/x4Y
|
||||
zP8eGMz/Ixzt/xURkP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYFKf8gGt7/HxnS/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjN/yMc7P8MCU3/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/BQQj/yAZ2P8fGdP/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8fGND/IRvg/wYFLv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xIP
|
||||
ff8jHPH/HhjM/x4YzP8eGMz/HhjM/yQc7/8UEIn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8FBCP/IBrY/x8Z0/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x8Z0f8hGuD/BwYv/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAv8cFrv/IRrf/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjN/yQc8f8LCk//AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8YE6L/Ihvn/x4YzP8eGMz/HhjM/x4YzP8iG+P/GhWu/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/CghD/yMc7v8eGM7/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8gGtv/HRfF/wEBCv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/FhGU/yMc7v8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8jG+r/GBSj/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GBSj/Ihvo/x8Y0f8eGMz/HhjM/x4YzP8eGMz/HhjP/yMc
|
||||
7f8IBzX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xcSl/8jHO3/HhjL/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/Ixzq/xgToP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8MZP8kHfT/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/yQc7/8QDWn/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQr/HBe//yIb6f8eGMr/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4Yyv8iG+b/HhjH/wICEf8AAAD/AAAA/wAAAP8AAAD/AAAA/w4LXP8jHO3/HxjO/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/yQd9f8RDnH/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBjL/Ihvk/x8Y0P8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yyv8fGdX/Ixzu/xQQhP8GBSn/AgEL/wMCEf8LCEf/HBa+/yMc
|
||||
7f8dF8j/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HRfH/yMc6/8dF8X/CwlM/wMCFP8CAQv/BQQm/xIO
|
||||
fP8jHOz/IBnY/x4Yyf8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yzv8iHOr/CQc9/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEI/x0X
|
||||
xv8gGtz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjJ/x8Y0P8jHO7/IBnX/x0X
|
||||
wv8dF8b/Ihvn/yEb5P8dF8j/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8dF8f/IRrh/yIb
|
||||
6f8dGMj/HBfB/x8Z1f8jHO//HxnS/x4Yyf8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8gGdj/HhjO/wICD/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8WEpT/Ixzw/x4Yy/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjL/x8Z1P8gGtz/IBra/x4Yz/8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4Yy/8eGM7/IBrZ/yAa3P8fGdX/HhjL/x4Yy/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMv/Ixzs/xgToP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
|
||||
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DApT/yQc8/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/yQd9v8OC2D/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMCEP8fGdH/IBnY/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x8Z1f8gGtn/BAMa/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/FxKc/yMc7/8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
y/8jHOv/GRSm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwKUv8kHfX/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMr/JR33/w4LYP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQf/HhjI/yEa3f8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IBrY/x8Y0v8CAg//AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMP
|
||||
gf8lHfj/HhjK/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjK/yQd9f8UEYz/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8GBSn/Ihzp/x8Y0f8eGMz/HhjN/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zv8jHO//CAc1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xcSnP8jHPH/HRfF/yAZ1/8gGt3/HhjL/x4Y
|
||||
y/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4Y
|
||||
yv8gGtz/IBnZ/x0Xxf8jHO3/GRSp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBjP/JB35/x8Z
|
||||
0v8WEZT/FxOe/yMc7f8iG+f/HhjO/x4Yyv8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMr/HhjN/yIb5f8jHO//GBOj/xURkf8eGM7/JR79/woIQP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/xcTnf8oIP//HBa+/w8MY/8LCU3/FhKX/yIb5v8kHfP/IBrd/x4Yz/8eGMv/HhjM/x4Y
|
||||
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zP8eGMz/HhjL/x4Yzv8gGtv/JB3y/yIb6f8XEp3/DAlP/w4LX/8bFrf/KCD//xkUqv8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQX/FRGM/yYf//8mHv//Eg9+/wUEJf8GBCb/EQ5y/x0X
|
||||
wv8iG+b/JB3z/yMc7P8hGt7/HxnV/x8Y0P8eGM7/HhjN/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
|
||||
zf8eGM7/HxjQ/x8Z1P8hGt3/Ixzr/yQd8/8iG+f/HRfF/xIOeP8GBSn/BQQj/xEOdv8lHv7/Jx///xYR
|
||||
lf8CAQr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCEH/Gxa3/ykh
|
||||
//8lHfj/EQ51/wIBDf8AAAD/BAMZ/w4LYv8XEpr/HBe//x8Z1f8hG+P/Ihvq/yMc7v8kHPL/JBzy/yMc
|
||||
8P8jHPD/Ixzy/yQd8v8jHO7/Ihzq/yEb5P8fGdb/HBfA/xcTnf8PDGb/BAMd/wAAAP8BAQr/EA1t/yQc
|
||||
8v8qIf//HBa+/wsJSP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8MClP/GhW0/ygg//8mHv//FxOh/wcFMf8AAAD/AAAA/wAAAP8EAxz/CAc4/wsJ
|
||||
S/8NC1n/Dwxl/xANb/8RDnX/EQ51/xANb/8PDGb/DQta/wsJTP8IBzn/BAMf/wAAAP8AAAD/AAAA/wYF
|
||||
K/8WEZr/Jh7//ykg//8bFrr/DQtY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IBzb/FBCG/yEc1f8mH/f/IBrX/xcS
|
||||
mf8ODFb/AAEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8OC1D/FhKW/yAa1P8mH/f/IhzY/xURi/8JBzr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAQD/BwYj/xAOXf8XE47/GRWL/wUFFf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8EBBD/GBSF/xcTkf8RDmH/CAcm/wEBAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
|
||||
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
|
||||
AP8AAAD/AAAA/wAAAOUAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
|
||||
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAOUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
|
@ -1,19 +0,0 @@
|
|||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new FormMain());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("BetterDiscordWI")]
|
||||
[assembly: AssemblyDescription("Better Discord Windows Installer")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Jiiks")]
|
||||
[assembly: AssemblyProduct("BetterDiscordWI")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015-2016")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("17adafc9-c3e6-49c2-b2c9-d6866e7f4f23")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("0.2.8.0")]
|
||||
[assembly: AssemblyFileVersion("0.2.8.0")]
|
|
@ -1,103 +0,0 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace BetterDiscordWI.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BetterDiscordWI.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap bd_logo_64x64 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("bd_logo_64x64", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap bd_logo_64x64_nobg {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("bd_logo_64x64_nobg", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap bd_logo_large_nobg {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("bd_logo_large_nobg", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap bd_logo2 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("bd_logo2", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,133 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="bd_logo2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\bd_logo2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="bd_logo_64x64" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\bd_logo_64x64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="bd_logo_64x64_nobg" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\bd_logo_64x64_nobg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="bd_logo_large_nobg" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\bd_logo_large_nobg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
|
@ -1,26 +0,0 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace BetterDiscordWI.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
Before Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 4.4 MiB |
|
@ -1,46 +0,0 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI
|
||||
{
|
||||
class Utils
|
||||
{
|
||||
public void StartDownload(ProgressBar pb, string url, string name)
|
||||
{
|
||||
Thread t = new Thread(() =>
|
||||
{
|
||||
WebClient webClient = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
|
||||
webClient.DownloadProgressChanged += delegate(object sender, DownloadProgressChangedEventArgs args)
|
||||
{
|
||||
double percentage = (double.Parse(args.BytesReceived.ToString()) /double.Parse(args.TotalBytesToReceive.ToString())) * 100;
|
||||
Debug.Print(percentage.ToString());
|
||||
pb.Invoke((MethodInvoker) delegate
|
||||
{
|
||||
pb.Value = (int)Math.Truncate(percentage);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
|
||||
webClient.DownloadFile(new Uri(url), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BetterDiscord\\temp\\" + name);
|
||||
|
||||
});
|
||||
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public static string GetHash()
|
||||
{
|
||||
WebClient wc = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
|
||||
string result = wc.DownloadString(@"https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master");
|
||||
|
||||
int start = result.IndexOf("{\"sha\":");
|
||||
int end = result.IndexOf("\",\"");
|
||||
|
||||
return result.Substring(start + 8, end - 8);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI.components
|
||||
{
|
||||
class CTextBox : TextBox
|
||||
{
|
||||
|
||||
public bool CAutoSize
|
||||
{
|
||||
get { return AutoSize; }
|
||||
set { AutoSize = value; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net451" />
|
||||
</packages>
|
|
@ -1,8 +0,0 @@
|
|||
namespace BetterDiscordWI.panels {
|
||||
interface IPanel {
|
||||
void SetVisible();
|
||||
FormMain GetParent();
|
||||
void BtnNext();
|
||||
void BtnPrev();
|
||||
}
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
namespace BetterDiscordWI.panels
|
||||
{
|
||||
partial class Panel0
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Panel0));
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
|
||||
this.radioDeclineLicense = new System.Windows.Forms.RadioButton();
|
||||
this.radioAcceptLicense = new System.Windows.Forms.RadioButton();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.Location = new System.Drawing.Point(35, 18);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(455, 31);
|
||||
this.label2.TabIndex = 5;
|
||||
this.label2.Text = "Please read the following License Agreement and accept the terms before continuin" +
|
||||
"g the installation.";
|
||||
//
|
||||
// richTextBox1
|
||||
//
|
||||
this.richTextBox1.Location = new System.Drawing.Point(38, 54);
|
||||
this.richTextBox1.Name = "richTextBox1";
|
||||
this.richTextBox1.ReadOnly = true;
|
||||
this.richTextBox1.Size = new System.Drawing.Size(452, 169);
|
||||
this.richTextBox1.TabIndex = 4;
|
||||
this.richTextBox1.Text = resources.GetString("richTextBox1.Text");
|
||||
//
|
||||
// radioDeclineLicense
|
||||
//
|
||||
this.radioDeclineLicense.AutoSize = true;
|
||||
this.radioDeclineLicense.Checked = true;
|
||||
this.radioDeclineLicense.Location = new System.Drawing.Point(108, 229);
|
||||
this.radioDeclineLicense.Name = "radioDeclineLicense";
|
||||
this.radioDeclineLicense.Size = new System.Drawing.Size(61, 17);
|
||||
this.radioDeclineLicense.TabIndex = 8;
|
||||
this.radioDeclineLicense.TabStop = true;
|
||||
this.radioDeclineLicense.Text = "Decline";
|
||||
this.radioDeclineLicense.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// radioAcceptLicense
|
||||
//
|
||||
this.radioAcceptLicense.AutoSize = true;
|
||||
this.radioAcceptLicense.Location = new System.Drawing.Point(38, 229);
|
||||
this.radioAcceptLicense.Name = "radioAcceptLicense";
|
||||
this.radioAcceptLicense.Size = new System.Drawing.Size(59, 17);
|
||||
this.radioAcceptLicense.TabIndex = 7;
|
||||
this.radioAcceptLicense.Text = "Accept";
|
||||
this.radioAcceptLicense.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// Panel0
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.radioDeclineLicense);
|
||||
this.Controls.Add(this.radioAcceptLicense);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.richTextBox1);
|
||||
this.Name = "Panel0";
|
||||
this.Size = new System.Drawing.Size(524, 258);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.RichTextBox richTextBox1;
|
||||
private System.Windows.Forms.RadioButton radioDeclineLicense;
|
||||
private System.Windows.Forms.RadioButton radioAcceptLicense;
|
||||
}
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI.panels {
|
||||
public partial class Panel0 : UserControl, IPanel {
|
||||
public Panel0() {
|
||||
InitializeComponent();
|
||||
|
||||
radioAcceptLicense.CheckedChanged += (sender, args) => {
|
||||
GetParent().btnNext.Enabled = radioAcceptLicense.Checked;
|
||||
};
|
||||
}
|
||||
|
||||
public void SetVisible() {
|
||||
GetParent().btnBack.Visible = false;
|
||||
GetParent().btnNext.Enabled = false;
|
||||
GetParent().btnNext.Text = @"Next >";
|
||||
GetParent().lblPanelTitle.Text = @"BetterDiscord License Agreement";
|
||||
GetParent().btnNext.Enabled = radioAcceptLicense.Checked;
|
||||
}
|
||||
|
||||
public FormMain GetParent() {
|
||||
return (FormMain)ParentForm;
|
||||
}
|
||||
|
||||
public void BtnNext() {
|
||||
GetParent().SwitchPanel(1);
|
||||
}
|
||||
|
||||
public void BtnPrev() {}
|
||||
}
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="richTextBox1.Text" xml:space="preserve">
|
||||
<value>Copyright (c) 2015 Jiiks
|
||||
|
||||
http://jiiks.net
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -1,152 +0,0 @@
|
|||
namespace BetterDiscordWI.panels
|
||||
{
|
||||
partial class Panel1
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.btnBrowser = new System.Windows.Forms.Button();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.cbRestart = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox2 = new System.Windows.Forms.CheckBox();
|
||||
this.tbPath = new BetterDiscordWI.components.CTextBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(20, 17);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(380, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Setup will install BetterDiscord to the following location. Click Install to cont" +
|
||||
"inue.";
|
||||
//
|
||||
// btnBrowser
|
||||
//
|
||||
this.btnBrowser.Location = new System.Drawing.Point(406, 46);
|
||||
this.btnBrowser.Name = "btnBrowser";
|
||||
this.btnBrowser.Size = new System.Drawing.Size(75, 26);
|
||||
this.btnBrowser.TabIndex = 2;
|
||||
this.btnBrowser.Text = "Browse";
|
||||
this.btnBrowser.UseVisualStyleBackColor = true;
|
||||
this.btnBrowser.Click += new System.EventHandler(this.btnBrowser_Click);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(20, 75);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(422, 13);
|
||||
this.label2.TabIndex = 3;
|
||||
this.label2.Text = "*If the path is not pointing to the latest version of Discord then click browse a" +
|
||||
"nd select it.";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(20, 91);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(161, 13);
|
||||
this.label3.TabIndex = 5;
|
||||
this.label3.Text = "*Installer will kill Discord process.";
|
||||
//
|
||||
// cbRestart
|
||||
//
|
||||
this.cbRestart.AutoSize = true;
|
||||
this.cbRestart.Location = new System.Drawing.Point(23, 117);
|
||||
this.cbRestart.Name = "cbRestart";
|
||||
this.cbRestart.Size = new System.Drawing.Size(175, 17);
|
||||
this.cbRestart.TabIndex = 6;
|
||||
this.cbRestart.Text = "Restart Discord after installation";
|
||||
this.cbRestart.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox1
|
||||
//
|
||||
this.checkBox1.AutoSize = true;
|
||||
this.checkBox1.Location = new System.Drawing.Point(23, 140);
|
||||
this.checkBox1.Name = "checkBox1";
|
||||
this.checkBox1.Size = new System.Drawing.Size(137, 17);
|
||||
this.checkBox1.TabIndex = 7;
|
||||
this.checkBox1.Text = "Install to DiscordCanary";
|
||||
this.checkBox1.UseVisualStyleBackColor = true;
|
||||
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
|
||||
//
|
||||
// checkBox2
|
||||
//
|
||||
this.checkBox2.AutoSize = true;
|
||||
this.checkBox2.Location = new System.Drawing.Point(23, 163);
|
||||
this.checkBox2.Name = "checkBox2";
|
||||
this.checkBox2.Size = new System.Drawing.Size(436, 17);
|
||||
this.checkBox2.TabIndex = 8;
|
||||
this.checkBox2.Text = "Install to DiscordPTB (Can break at any time)(Installer will be updated frequentl" +
|
||||
"y for this)";
|
||||
this.checkBox2.UseVisualStyleBackColor = true;
|
||||
this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged);
|
||||
//
|
||||
// tbPath
|
||||
//
|
||||
this.tbPath.CAutoSize = false;
|
||||
this.tbPath.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.tbPath.Location = new System.Drawing.Point(23, 46);
|
||||
this.tbPath.Name = "tbPath";
|
||||
this.tbPath.Size = new System.Drawing.Size(377, 26);
|
||||
this.tbPath.TabIndex = 4;
|
||||
//
|
||||
// Panel1
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.checkBox2);
|
||||
this.Controls.Add(this.checkBox1);
|
||||
this.Controls.Add(this.cbRestart);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.tbPath);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.btnBrowser);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Name = "Panel1";
|
||||
this.Size = new System.Drawing.Size(524, 258);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Button btnBrowser;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.CheckBox cbRestart;
|
||||
internal components.CTextBox tbPath;
|
||||
private System.Windows.Forms.CheckBox checkBox1;
|
||||
private System.Windows.Forms.CheckBox checkBox2;
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI.panels {
|
||||
public partial class Panel1: UserControl, IPanel {
|
||||
public Panel1() {
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void SetVisible() {
|
||||
|
||||
GetParent().btnBack.Visible = true;
|
||||
GetParent().btnNext.Enabled = true;
|
||||
GetParent().btnBack.Enabled = true;
|
||||
GetParent().btnNext.Text = @"Install";
|
||||
GetParent().lblPanelTitle.Text = @"BetterDiscord Installation";
|
||||
|
||||
PickVersion();
|
||||
}
|
||||
|
||||
public FormMain GetParent() {
|
||||
return (FormMain)ParentForm;
|
||||
}
|
||||
|
||||
public void BtnNext() {
|
||||
GetParent().DiscordPath = tbPath.Text;
|
||||
GetParent().RestartDiscord = cbRestart.Checked;
|
||||
GetParent().SwitchPanel(2);
|
||||
}
|
||||
|
||||
public void BtnPrev() {
|
||||
GetParent().SwitchPanel(0);
|
||||
}
|
||||
|
||||
private void btnBrowser_Click(object sender, EventArgs e) {
|
||||
FolderBrowserDialog fbd = new FolderBrowserDialog { SelectedPath = tbPath.Text };
|
||||
fbd.ShowDialog(GetParent());
|
||||
|
||||
tbPath.Text = fbd.SelectedPath;
|
||||
}
|
||||
|
||||
private void checkBox1_CheckedChanged(object sender, EventArgs e) {
|
||||
PickVersion();
|
||||
}
|
||||
|
||||
private void checkBox2_CheckedChanged(object sender, EventArgs e) {
|
||||
PickVersion();
|
||||
}
|
||||
|
||||
private void PickVersion() {
|
||||
string dirPath;
|
||||
if(checkBox1.Checked) {
|
||||
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\DiscordCanary";
|
||||
if(!Directory.Exists(dirPath)) checkBox1.Checked = false;
|
||||
|
||||
checkBox2.Checked = false;
|
||||
} else if(checkBox2.Checked) {
|
||||
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\DiscordPTB";
|
||||
if(!Directory.Exists(dirPath)) checkBox2.Checked = false;
|
||||
|
||||
checkBox1.Checked = false;
|
||||
} else {
|
||||
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\Discord";
|
||||
}
|
||||
|
||||
if (!Directory.Exists(dirPath)) return;
|
||||
string[] directories = Directory.GetDirectories(dirPath);
|
||||
|
||||
string highestVersion = null;
|
||||
|
||||
foreach(string s in directories) {
|
||||
Debug.Print(s);
|
||||
if(!s.Contains("app-"))
|
||||
continue;
|
||||
if(string.IsNullOrEmpty(highestVersion)) {
|
||||
highestVersion = s;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(string.CompareOrdinal(s, highestVersion) > 0) {
|
||||
highestVersion = s;
|
||||
}
|
||||
}
|
||||
|
||||
tbPath.Text = highestVersion;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
|
@ -1,67 +0,0 @@
|
|||
namespace BetterDiscordWI.panels
|
||||
{
|
||||
partial class Panel2
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.pbMain = new System.Windows.Forms.ProgressBar();
|
||||
this.rtLog = new System.Windows.Forms.RichTextBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// pbMain
|
||||
//
|
||||
this.pbMain.Location = new System.Drawing.Point(3, 267);
|
||||
this.pbMain.Name = "pbMain";
|
||||
this.pbMain.Size = new System.Drawing.Size(518, 16);
|
||||
this.pbMain.TabIndex = 0;
|
||||
//
|
||||
// rtLog
|
||||
//
|
||||
this.rtLog.Location = new System.Drawing.Point(3, 3);
|
||||
this.rtLog.Name = "rtLog";
|
||||
this.rtLog.Size = new System.Drawing.Size(518, 252);
|
||||
this.rtLog.TabIndex = 1;
|
||||
this.rtLog.Text = "";
|
||||
//
|
||||
// Panel2
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.rtLog);
|
||||
this.Controls.Add(this.pbMain);
|
||||
this.Name = "Panel2";
|
||||
this.Size = new System.Drawing.Size(524, 258);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ProgressBar pbMain;
|
||||
private System.Windows.Forms.RichTextBox rtLog;
|
||||
}
|
||||
}
|
|
@ -1,279 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using asardotnet;
|
||||
|
||||
namespace BetterDiscordWI.panels {
|
||||
public partial class Panel2: UserControl, IPanel {
|
||||
private string _dataPath, _tempPath;
|
||||
private Utils _utils;
|
||||
|
||||
public Panel2() {
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void SetVisible() {
|
||||
GetParent().btnBack.Enabled = false;
|
||||
GetParent().btnNext.Enabled = false;
|
||||
GetParent().btnBack.Visible = false;
|
||||
GetParent().btnNext.Visible = false;
|
||||
GetParent().btnCancel.Enabled = false;
|
||||
|
||||
_utils = new Utils();
|
||||
|
||||
KillProcessIfInstalling("Discord");
|
||||
KillProcessIfInstalling("DiscordCanary");
|
||||
KillProcessIfInstalling("DiscordPTB");
|
||||
|
||||
CreateDirectories();
|
||||
}
|
||||
|
||||
private void KillProcessIfInstalling(string app) {
|
||||
if (!GetParent().DiscordPath.Contains(app + "\\")) return;
|
||||
AppendLog("Killing " + app);
|
||||
foreach(var process in Process.GetProcessesByName(app)) {
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateDirectories() {
|
||||
Thread t = new Thread(() => {
|
||||
_dataPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord";
|
||||
_tempPath = $"{_dataPath}\\temp";
|
||||
AppendLog("Deleting old cached files");
|
||||
try {
|
||||
if(File.Exists($"{_dataPath}\\emotes_bttv.json")) {
|
||||
File.Delete($"{_dataPath}\\emotes_bttv.json");
|
||||
}
|
||||
if(File.Exists($"{_dataPath}\\emotes_bttv_2.json")) {
|
||||
File.Delete($"{_dataPath}\\emotes_bttv_2.json");
|
||||
}
|
||||
if(File.Exists($"{_dataPath}\\emotes_ffz.json")) {
|
||||
File.Delete($"{_dataPath}\\emotes_ffz.json");
|
||||
}
|
||||
if(File.Exists($"{_dataPath}\\emotes_twitch_global.json")) {
|
||||
File.Delete($"{_dataPath}\\emotes_twitch_global.json");
|
||||
}
|
||||
if(File.Exists($"{_dataPath}\\emotes_twitch_subscriber.json")) {
|
||||
File.Delete($"{_dataPath}\\emotes_twitch_subscriber.json");
|
||||
}
|
||||
if(File.Exists($"{_dataPath}\\user.json")) {
|
||||
File.Delete($"{_dataPath}\\user.json");
|
||||
}
|
||||
} catch(Exception e) { AppendLog("Failed to delete one or more cached files"); }
|
||||
|
||||
if(Directory.Exists(_tempPath)) {
|
||||
AppendLog("Deleting temp path");
|
||||
Directory.Delete(_tempPath, true);
|
||||
}
|
||||
|
||||
while(Directory.Exists(_tempPath)) {
|
||||
Debug.Print("Waiting for dirdel");
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
Directory.CreateDirectory(_tempPath);
|
||||
|
||||
DownloadResource("BetterDiscord.zip", "https://github.com/Jiiks/BetterDiscordApp/archive/stable16.zip");
|
||||
|
||||
while(!File.Exists($"{_tempPath}\\BetterDiscord.zip")) {
|
||||
Debug.Print("Waiting for download");
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
AppendLog("Extracting BetterDiscord");
|
||||
|
||||
ZipArchive zar =
|
||||
ZipFile.OpenRead($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\BetterDiscord.zip");
|
||||
zar.ExtractToDirectory($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\");
|
||||
|
||||
DeleteDirs();
|
||||
});
|
||||
t.Start();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void DeleteDirs() {
|
||||
int errors = 0;
|
||||
Thread t = new Thread(() => {
|
||||
string dir = $"{GetParent().DiscordPath}\\resources\\app";
|
||||
|
||||
if(Directory.Exists(dir)) {
|
||||
try {
|
||||
AppendLog("Deleting " + dir);
|
||||
Directory.Delete(dir, true);
|
||||
} catch {
|
||||
AppendLog($"Error: Failed to Delete the '{dir}\\resources\\app' Directory.");
|
||||
errors = 1;
|
||||
Finalize(errors);
|
||||
}
|
||||
}
|
||||
|
||||
while(Directory.Exists(dir)) {
|
||||
Debug.Print("Waiting for direl");
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
dir = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
|
||||
|
||||
|
||||
if(Directory.Exists(dir)) {
|
||||
AppendLog($"Deleting {dir}");
|
||||
Directory.Delete(dir, true);
|
||||
}
|
||||
|
||||
while(Directory.Exists(dir)) {
|
||||
Debug.Print("Waiting for direl");
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
AppendLog("Extracting app.asar");
|
||||
string appAsarPath = $"{GetParent().DiscordPath}\\resources\\app.asar";
|
||||
|
||||
if(File.Exists(appAsarPath)) {
|
||||
AsarArchive archive = new AsarArchive(appAsarPath);
|
||||
AsarExtractor extractor = new AsarExtractor();
|
||||
extractor.ExtractAll(archive, $"{GetParent().DiscordPath}\\resources\\app\\");
|
||||
} else {
|
||||
AppendLog("Error: app.asar file couldn't be found in 'resources' folder. Installation cannot Continue.");
|
||||
errors = 1;
|
||||
Finalize(errors);
|
||||
}
|
||||
|
||||
if(errors == 0) {
|
||||
AppendLog("Moving BetterDiscord to resources\\node_modules\\");
|
||||
Directory.Move($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\BetterDiscordApp-stable16", $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord");
|
||||
|
||||
try {
|
||||
Splice();
|
||||
} catch {
|
||||
AppendLog("Error: Extracting app.asar: Newtonsoft.Json.dll might not be present in the Installer Folder. Installation cannot Continue.");
|
||||
errors = 1;
|
||||
Finalize(errors);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private void DownloadResource(string resource, string url) {
|
||||
AppendLog("Downloading Resource: " + resource);
|
||||
|
||||
WebClient webClient = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
|
||||
|
||||
webClient.DownloadFile(new Uri(url), $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\{resource}");
|
||||
}
|
||||
|
||||
private void Splice() {
|
||||
string indexloc = $"{GetParent().DiscordPath}\\resources\\app\\app\\index.js";
|
||||
|
||||
Thread t = new Thread(() => {
|
||||
List<string> lines = new List<string>();
|
||||
AppendLog("Spicing index");
|
||||
using(FileStream fs = new FileStream(indexloc, FileMode.Open)) {
|
||||
using(StreamReader reader = new StreamReader(fs)) {
|
||||
string line = "";
|
||||
while((line = reader.ReadLine()) != null) {
|
||||
//if(GetParent().DiscordPath.Contains("Discord\\")) {
|
||||
//if(GetParent().DiscordPath.Contains("DiscordCanary\\")) {
|
||||
//if(GetParent().DiscordPath.Contains("DiscordPTB\\")) {
|
||||
if(line.Replace(" ", "").Contains("var_fs=")) {
|
||||
lines.Add(line);
|
||||
lines.Add("var _betterDiscord = require('betterdiscord');");
|
||||
lines.Add("var _betterDiscord2;");
|
||||
} else if(line.Replace(" ", "").Contains("mainWindow=new")) {
|
||||
lines.Add(line);
|
||||
lines.Add(File.ReadAllText(@"splice"));
|
||||
} else {
|
||||
lines.Add(line);
|
||||
}
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AppendLog("Writing index");
|
||||
|
||||
File.WriteAllLines(indexloc, lines.ToArray());
|
||||
|
||||
AppendLog("Finished installation, verifying installation...");
|
||||
|
||||
int errors = 0;
|
||||
|
||||
string curPath = $"{GetParent().DiscordPath}\\resources\\app\\app\\index.js";
|
||||
|
||||
if(!File.Exists(curPath)) {
|
||||
AppendLog($"ERROR: FILE: {curPath} DOES NOT EXIST!");
|
||||
errors++;
|
||||
}
|
||||
|
||||
curPath = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
|
||||
|
||||
if(!Directory.Exists(curPath)) {
|
||||
AppendLog($"ERROR: DIRECTORY: {curPath} DOES NOT EXIST!");
|
||||
errors++;
|
||||
}
|
||||
|
||||
|
||||
string basePath = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
|
||||
string[] bdFiles = { "\\package.json", "\\betterdiscord.js", "\\lib\\BetterDiscord.js", "\\lib\\config.json", "\\lib\\Utils.js" };
|
||||
|
||||
foreach(string s in bdFiles.Where(s => !File.Exists(basePath + s))) {
|
||||
AppendLog($"ERROR: FILE: {basePath}{s} DOES NOT EXIST");
|
||||
errors++;
|
||||
}
|
||||
Finalize(errors);
|
||||
});
|
||||
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private void Finalize(int errors) {
|
||||
AppendLog($"Finished installing BetterDiscord with {errors} errors");
|
||||
|
||||
Invoke((MethodInvoker)delegate {
|
||||
GetParent().Finished = true;
|
||||
GetParent().btnCancel.Text = @"OK";
|
||||
GetParent().btnCancel.Enabled = true;
|
||||
});
|
||||
|
||||
if(GetParent().RestartDiscord) {
|
||||
if(GetParent().DiscordPath.Contains("\\Discord\\")) {
|
||||
Process.Start($"{GetParent().DiscordPath}\\Discord.exe");
|
||||
}
|
||||
if(GetParent().DiscordPath.Contains("\\DiscordCanary\\")) {
|
||||
Process.Start($"{GetParent().DiscordPath}\\DiscordCanary.exe");
|
||||
}
|
||||
if(GetParent().DiscordPath.Contains("\\DiscordPTB\\")) {
|
||||
Process.Start($"{GetParent().DiscordPath}\\DiscordPTB.exe");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public FormMain GetParent() {
|
||||
return (FormMain)ParentForm;
|
||||
}
|
||||
|
||||
public void BtnNext() { }
|
||||
|
||||
public void BtnPrev() { }
|
||||
|
||||
private void AppendLog(string message) {
|
||||
Invoke((MethodInvoker)delegate {
|
||||
rtLog.AppendText(message + "\n");
|
||||
rtLog.SelectionStart = rtLog.Text.Length;
|
||||
rtLog.ScrollToCaret();
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
|
@ -1,37 +0,0 @@
|
|||
namespace BetterDiscordWI.panels
|
||||
{
|
||||
partial class Panel3
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterDiscordWI.panels
|
||||
{
|
||||
public partial class Panel3 : UserControl
|
||||
{
|
||||
public Panel3()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
## To Compile Move the DLL's folder to ``BetterDiscordWI\bin``
|
||||
## Enjoy Building the Installer.
|
|
@ -0,0 +1,9 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-present JsSucks - https://github.com/JsSucks
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,42 +0,0 @@
|
|||
//META{"name":"agif"}*//
|
||||
|
||||
var agif = function () {};
|
||||
|
||||
agif.prototype.convert = function () {
|
||||
$(".image canvas").each(function() {
|
||||
var src = $(this).attr("src");
|
||||
if(src != undefined) {
|
||||
$(this).replaceWith('<img src="'+src+'"></img>');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
agif.prototype.onMessage = function () {
|
||||
this.convert();
|
||||
};
|
||||
agif.prototype.onSwitch = function () {
|
||||
this.convert();
|
||||
};
|
||||
agif.prototype.start = function () {
|
||||
this.convert();
|
||||
};
|
||||
|
||||
agif.prototype.load = function () {};
|
||||
agif.prototype.unload = function () {};
|
||||
agif.prototype.stop = function () {};
|
||||
agif.prototype.getSettingsPanel = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
agif.prototype.getName = function () {
|
||||
return "Autogif";
|
||||
};
|
||||
agif.prototype.getDescription = function () {
|
||||
return "Autoplay gifs without having to hover.";
|
||||
};
|
||||
agif.prototype.getVersion = function () {
|
||||
return "0.1.0";
|
||||
};
|
||||
agif.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,97 +0,0 @@
|
|||
//META{"name":"customGamePlugin"}*//
|
||||
|
||||
/*
|
||||
* #####################READ THIS!################################
|
||||
* #####################READ THIS!################################
|
||||
*
|
||||
* This plugin is discontinued and no longer works due to Discord having custom game title built in and is kept for archiving purposes only.
|
||||
*
|
||||
* #####################READ THIS!################################
|
||||
* #####################READ THIS!################################
|
||||
*/
|
||||
|
||||
|
||||
function customGamePlugin() {}
|
||||
|
||||
customGamePlugin.prototype.load = function() {
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.unload = function() {
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.start = function() {
|
||||
return;
|
||||
var self = this;
|
||||
this.enabled = true;
|
||||
this.interval = setInterval(function() {
|
||||
self.setPlaying();
|
||||
}, 60000);
|
||||
this.setPlaying();
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.stop = function() {
|
||||
return;
|
||||
var gp = this.game;
|
||||
this.game = "";
|
||||
this.setPlaying();
|
||||
this.game = gp;
|
||||
clearInterval(this.interval);
|
||||
this.enabled = false;
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.getName = function() {
|
||||
return "Custom Game";
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.getDescription = function() {
|
||||
return "Set custom game as your playing status";
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.getVersion = function() {
|
||||
return "1.0";
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.getAuthor = function() {
|
||||
return "Jiiks";
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.getSettingsPanel = function() {
|
||||
if(this.game == null) this.game = "";
|
||||
return '<label for="cgPluginGame">Game: </label> ' +
|
||||
'<input type="text" placeholder="Game.." name="cgPluginGame" id="cgPluginGame" value="'+this.game+'">' +
|
||||
'<button onclick="BdApi.getPlugin(\'Custom Game\').setGame()">Apply</button>';
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.setGame = function(game) {
|
||||
if(game == null) {
|
||||
game = document.getElementById("cgPluginGame").value;
|
||||
}
|
||||
this.game = game;
|
||||
this.setPlaying();
|
||||
};
|
||||
|
||||
customGamePlugin.prototype.setPlaying = function() {
|
||||
if(!this.enabled) return;
|
||||
if(this.uid == null) {
|
||||
if($(".account .avatar-small").css("background-image") == undefined)return;
|
||||
this.uid = $(".account .avatar-small").css("background-image").match(/\d+/);
|
||||
}
|
||||
|
||||
if(this.game == null) this.game = "";
|
||||
|
||||
var minner = $('.channel-members .member[data-reactid*="'+this.uid+'"]').find(".member-inner")
|
||||
var mgame = minner.find(".member-game");
|
||||
if(this.game != "") {
|
||||
if(mgame.length) {
|
||||
mgame.find("strong").text(this.game);
|
||||
} else {
|
||||
minner.append('<div class="member-game"><span>Playing: </span><strong>'+this.game+'</strong></div>');
|
||||
}
|
||||
} else {
|
||||
if(mgame.length) {
|
||||
mgame.remove();
|
||||
}
|
||||
}
|
||||
|
||||
BdApi.setPlaying(this.game);
|
||||
};
|
|
@ -1,35 +0,0 @@
|
|||
//META{"name":"GuildsScroller"}*//
|
||||
|
||||
function GuildsScroller() {}
|
||||
|
||||
GuildsScroller.prototype.load = function() {
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.unload = function() {
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.start = function() {
|
||||
$(".guilds").wrap('<div class="scroller-wrap fade dark"></div>').wrap('<div class="scroller" style="overflow-x:hidden;"></div>');
|
||||
};
|
||||
GuildsScroller.prototype.stop = function() {
|
||||
$(".guilds").unwrap().unwrap();
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.update = function() {
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.getName = function() {
|
||||
return "Guilds Scrollbar";
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.getDescription = function() {
|
||||
return "Adds a scrollbar to guilds/servers list";
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.getVersion = function() {
|
||||
return "1.0";
|
||||
};
|
||||
|
||||
GuildsScroller.prototype.getAuthor = function() {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,95 +0,0 @@
|
|||
//META{"name":"clockPlugin"}*//
|
||||
|
||||
//Original clock code from http://cssdeck.com/labs/minimal-css3-digital-clock
|
||||
|
||||
var clockPlugin = function () {};
|
||||
|
||||
clockPlugin.prototype.start = function () {
|
||||
BdApi.clearCSS("clockPluginCss");
|
||||
BdApi.injectCSS("clockPluginCss", '#clockPluginClock { position:absolute; color:#FFF; background:#333333; padding:0 12px 0 13px; min-width:55px; max-width:55px; z-index:100; }');
|
||||
var self = this;
|
||||
this.clock = $("<div/>", { id: "clockPluginClock" });
|
||||
$("body").append(this.clock);
|
||||
|
||||
this.pad = function(x) {
|
||||
return x < 10 ? '0'+x : x;
|
||||
};
|
||||
|
||||
this.ticktock = function() {
|
||||
var d = new Date();
|
||||
var h = self.pad(d.getHours());
|
||||
var m = self.pad(d.getMinutes());
|
||||
var s = self.pad(d.getSeconds());
|
||||
var current_time = [h,m,s].join(':');
|
||||
self.clock.html(current_time);
|
||||
};
|
||||
|
||||
this.ticktock12 = function() {
|
||||
var suffix = "AM";
|
||||
var d = new Date();
|
||||
var h = d.getHours();
|
||||
var m = self.pad(d.getMinutes());
|
||||
var s = self.pad(d.getSeconds());
|
||||
|
||||
if(h >= 12) {
|
||||
h -= 12;
|
||||
suffix = "PM";
|
||||
}
|
||||
if(h == 0) {
|
||||
h = 12;
|
||||
}
|
||||
|
||||
h = self.pad(h);
|
||||
|
||||
var current_time = [h,m,s].join(":") + suffix;
|
||||
self.clock.html(current_time);
|
||||
};
|
||||
|
||||
this.ticktock();
|
||||
this.interval = setInterval(this.ticktock, 1000);
|
||||
};
|
||||
|
||||
clockPlugin.prototype.load = function () {
|
||||
|
||||
};
|
||||
|
||||
clockPlugin.prototype.unload = function () {}
|
||||
;
|
||||
|
||||
clockPlugin.prototype.stop = function () {
|
||||
BdApi.clearCSS("clockPluginCss");
|
||||
clearInterval(this.interval);
|
||||
this.clock.remove();
|
||||
};
|
||||
|
||||
clockPlugin.prototype.onMessage = function () {
|
||||
|
||||
};
|
||||
|
||||
clockPlugin.prototype.onSwitch = function () {
|
||||
|
||||
};
|
||||
|
||||
clockPlugin.prototype.observer = function (e) {
|
||||
|
||||
};
|
||||
|
||||
clockPlugin.prototype.getSettingsPanel = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
clockPlugin.prototype.getName = function () {
|
||||
return "Clock Plugin";
|
||||
};
|
||||
|
||||
clockPlugin.prototype.getDescription = function () {
|
||||
return "Adds a clock to Discord";
|
||||
};
|
||||
|
||||
clockPlugin.prototype.getVersion = function () {
|
||||
return "0.1.0";
|
||||
};
|
||||
|
||||
clockPlugin.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,84 +0,0 @@
|
|||
//META{"name":"crr"}*//
|
||||
|
||||
function crr() {}
|
||||
|
||||
crr.prototype.start = function () {
|
||||
this.crrMt = new MutationObserver(function(mutations) {
|
||||
if($(".roles").length > 0) {
|
||||
if($("#ccpicker").length < 1) {
|
||||
|
||||
var selectedRole = $(".roles").find("li.selected");
|
||||
var roleId = selectedRole.data("reactid").split("$").slice(-1)[0];
|
||||
var serverId = $(".guilds .active").data("reactid").split("$").slice(-1)[0];
|
||||
var rgb = selectedRole.css("color").match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
|
||||
|
||||
function hex(x) {
|
||||
return ("0" + parseInt(x).toString(16)).slice(-2);
|
||||
}
|
||||
var curColour = "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
|
||||
|
||||
var picker = $("<input/>", {
|
||||
type: "color",
|
||||
class: "swatch default",
|
||||
id: "ccpicker"
|
||||
});
|
||||
|
||||
$(".color-picker .swatches").append(picker);
|
||||
picker.prop("value", curColour);
|
||||
|
||||
picker.on("change", function() {
|
||||
|
||||
var token = localStorage["token"].replace(/"/g, "");
|
||||
var newColour = parseInt($(this).prop("value").slice(1), 16);
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: 'https://discordapp.com/api/guilds/'+serverId+'/roles?token='+token,
|
||||
success: function(data) {
|
||||
for(var i = 0 ; i < data.length ; i++) {
|
||||
if(data[i]["id"] == roleId) {
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('PATCH', 'https://discordapp.com/api/guilds/'+serverId+'/roles/'+roleId+'?token='+localStorage["token"].replace(/"/g, ""), false);
|
||||
request.setRequestHeader("Content-type","application/json");
|
||||
request.send('{"color": '+newColour+', "hoist": '+data[i]["hoist"]+', "name": "'+data[i]["name"]+'", "permissions": '+data[i]["permissions"]+'}');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
this.crrMt.observe(document, {childList:true, subtree:true})
|
||||
};
|
||||
crr.prototype.stop = function () {
|
||||
this.crrMt.disconnect();
|
||||
};
|
||||
|
||||
crr.prototype.load = function () {
|
||||
//Called when plugin is loaded
|
||||
};
|
||||
|
||||
crr.prototype.unload = function () {
|
||||
//Called when plugin is unloaded
|
||||
};
|
||||
|
||||
crr.prototype.getName = function () {
|
||||
return "Custom Role Colours";
|
||||
};
|
||||
|
||||
crr.prototype.getDescription = function () {
|
||||
return "Set custom role colours";
|
||||
};
|
||||
|
||||
crr.prototype.getVersion = function () {
|
||||
return "1.0";
|
||||
};
|
||||
|
||||
crr.prototype.getAuthor = function () {
|
||||
return "Jiiks, Pohky";
|
||||
};
|
||||
|
||||
crr.prototype.getSettingsPanel = function () {
|
||||
return '';
|
||||
};
|
|
@ -1,50 +0,0 @@
|
|||
//META{"name":"dblClickEdit"}*//
|
||||
|
||||
var dblClickEdit = function () {};
|
||||
|
||||
dblClickEdit.prototype.onMessage = function () {
|
||||
};
|
||||
dblClickEdit.prototype.onSwitch = function () {
|
||||
};
|
||||
dblClickEdit.prototype.start = function () {
|
||||
$(document).on("dblclick.dce", function(e) {
|
||||
var target = $(e.target);
|
||||
if(target.parents(".message").length > 0) {
|
||||
var msg = target.parents(".message").first();
|
||||
var opt = msg.find(".btn-option");
|
||||
opt.click();
|
||||
|
||||
$.each($(".popout .btn-item"), (index, value) => {
|
||||
var option = $(value);
|
||||
if(option.text() === "Edit") {
|
||||
option.click();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
dblClickEdit.prototype.load = function () {};
|
||||
dblClickEdit.prototype.unload = function () {
|
||||
$(document).off("dblclick.dce");
|
||||
};
|
||||
dblClickEdit.prototype.stop = function () {
|
||||
$(document).off("dblclick.dce");
|
||||
};
|
||||
dblClickEdit.prototype.getSettingsPanel = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
dblClickEdit.prototype.getName = function () {
|
||||
return "Double click edit";
|
||||
};
|
||||
dblClickEdit.prototype.getDescription = function () {
|
||||
return "Double click messages to edit them";
|
||||
};
|
||||
dblClickEdit.prototype.getVersion = function () {
|
||||
return "0.1.1";
|
||||
};
|
||||
dblClickEdit.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,84 +0,0 @@
|
|||
//META{"name":"emoteBlacklist"}*//
|
||||
|
||||
var emoteBlacklist = function () {};
|
||||
|
||||
emoteBlacklist.prototype.onMessage = function () {
|
||||
};
|
||||
emoteBlacklist.prototype.onSwitch = function () {
|
||||
};
|
||||
emoteBlacklist.prototype.start = function () {
|
||||
window.ebEnabled = true;
|
||||
var self = this;
|
||||
var em = localStorage["emoteBlacklist"];
|
||||
if(em == undefined) return;
|
||||
JSON.parse(em).forEach(function(emote) {
|
||||
self.remove(emote);
|
||||
self.add(emote);
|
||||
});
|
||||
};
|
||||
emoteBlacklist.prototype.add = function(emote) {
|
||||
window.bemotes.push(emote);
|
||||
};
|
||||
emoteBlacklist.prototype.remove = function(emote) {
|
||||
var index = bemotes.indexOf(emote);
|
||||
if(index > -1) {
|
||||
window.bemotes.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
emoteBlacklist.prototype.load = function () {};
|
||||
emoteBlacklist.prototype.unload = function () {
|
||||
};
|
||||
emoteBlacklist.prototype.stop = function () {
|
||||
window.ebEnabled = false;
|
||||
this.clear();
|
||||
};
|
||||
emoteBlacklist.prototype.clear = function() {
|
||||
var self = this;
|
||||
var em = localStorage["emoteBlacklist"];
|
||||
if(em == undefined) return;
|
||||
var em = JSON.parse(em);
|
||||
em.forEach(function(emote) {
|
||||
self.remove(emote);
|
||||
});
|
||||
};
|
||||
emoteBlacklist.prototype.getSettingsPanel = function () {
|
||||
var em = localStorage["emoteBlacklist"];
|
||||
|
||||
var html = '';
|
||||
html += '<h2>Emote Blacklist</2>';
|
||||
html += '<textarea id="emoteBlistTa" style="width:100%; min-height:200px;">';
|
||||
if(em != undefined) {
|
||||
JSON.parse(em).forEach(function(item) {
|
||||
html += item + "\n";
|
||||
});
|
||||
}
|
||||
html += '</textarea>';
|
||||
html += '<button onclick="emoteBlacklist.prototype.save()">Save</button>';
|
||||
html += '<span>Add emote names here to blacklist(1 per line)</span>';
|
||||
return html;
|
||||
};
|
||||
emoteBlacklist.prototype.save = function() {
|
||||
this.clear();
|
||||
var blist = [];
|
||||
$("#emoteBlistTa").val().split("\n").forEach(function(item) {
|
||||
blist.push(item);
|
||||
});
|
||||
localStorage["emoteBlacklist"] = JSON.stringify(blist);
|
||||
if(window.ebEnabled) {
|
||||
this.start();
|
||||
}
|
||||
};
|
||||
|
||||
emoteBlacklist.prototype.getName = function () {
|
||||
return "Emote Blacklist";
|
||||
};
|
||||
emoteBlacklist.prototype.getDescription = function () {
|
||||
return "Blacklist emotes locally";
|
||||
};
|
||||
emoteBlacklist.prototype.getVersion = function () {
|
||||
return "0.1.0";
|
||||
};
|
||||
emoteBlacklist.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,61 +0,0 @@
|
|||
//META{"name":"mediaSupport"}*//
|
||||
|
||||
var mediaSupport = function () {};
|
||||
|
||||
mediaSupport.prototype.convert = function () {
|
||||
$(".message a").each(function() {
|
||||
var t = $(this);
|
||||
var href = t.attr("href");
|
||||
if(href == undefined) return true;
|
||||
href = href.replace("http:", "https:");
|
||||
if(!href.endsWith(".mp4") && !href.endsWith(".webm") && !href.endsWith(".ogg") && !href.endsWith(".mp3") && !href.endsWith(".wav")) return true;
|
||||
var video = true;
|
||||
var type = "webm";
|
||||
if(href.endsWith(".mp4")) type = "mp4";
|
||||
if(href.endsWith(".ogg")) type = "ogg";
|
||||
if(href.endsWith(".mp3")) {
|
||||
type = "mpeg";
|
||||
video = false;
|
||||
}
|
||||
if(href.endsWith(".wav")) {
|
||||
type = "wav";
|
||||
video = false;
|
||||
}
|
||||
|
||||
if(video) {
|
||||
t.replaceWith('<video width="480" height="320" src="'+href+'" type="video/'+type+'" controls></video>');
|
||||
} else {
|
||||
t.replaceWith('<audio src="'+href+'" type="audio/'+type+'" controls></audio>');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
mediaSupport.prototype.onMessage = function () {
|
||||
setTimeout(this.convert(), 2000);
|
||||
};
|
||||
mediaSupport.prototype.onSwitch = function () {
|
||||
this.convert();
|
||||
};
|
||||
mediaSupport.prototype.start = function () {
|
||||
this.convert();
|
||||
};
|
||||
|
||||
mediaSupport.prototype.load = function () {};
|
||||
mediaSupport.prototype.unload = function () {};
|
||||
mediaSupport.prototype.stop = function () {};
|
||||
mediaSupport.prototype.getSettingsPanel = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
mediaSupport.prototype.getName = function () {
|
||||
return "Media Support";
|
||||
};
|
||||
mediaSupport.prototype.getDescription = function () {
|
||||
return "Add support for html5 media";
|
||||
};
|
||||
mediaSupport.prototype.getVersion = function () {
|
||||
return "0.1.0";
|
||||
};
|
||||
mediaSupport.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,57 +0,0 @@
|
|||
//META{"name":"properTimestamps"}*//
|
||||
|
||||
var properTimestamps = function () {};
|
||||
|
||||
properTimestamps.prototype.convert = function () {
|
||||
$(".timestamp").each(function() {
|
||||
var t = $(this);
|
||||
|
||||
if(t.data("24") != undefined) return;
|
||||
|
||||
var text = t.text();
|
||||
var matches = /(.*)?at\s+(\d{1,2}):(\d{1,2})\s+(.*)/.exec(text);
|
||||
if(matches == null) return false;
|
||||
if(matches.length < 5) return false;
|
||||
|
||||
var h = parseInt(matches[2]);
|
||||
if(matches[4] == "AM") {
|
||||
if(h == 12) h -= 12;
|
||||
}else if(matches[4] == "PM") {
|
||||
if(h < 12) h += 12;
|
||||
}
|
||||
|
||||
matches[2] = ('0' + h).slice(-2);
|
||||
t.text(matches[1] + matches[2] + ":" + matches[3]);
|
||||
t.data("24", true);
|
||||
});
|
||||
};
|
||||
|
||||
properTimestamps.prototype.onMessage = function () {
|
||||
this.convert();
|
||||
};
|
||||
properTimestamps.prototype.onSwitch = function () {
|
||||
this.convert();
|
||||
};
|
||||
properTimestamps.prototype.start = function () {
|
||||
this.convert();
|
||||
};
|
||||
|
||||
properTimestamps.prototype.load = function () {};
|
||||
properTimestamps.prototype.unload = function () {};
|
||||
properTimestamps.prototype.stop = function () {};
|
||||
properTimestamps.prototype.getSettingsPanel = function () {
|
||||
return "";
|
||||
};
|
||||
|
||||
properTimestamps.prototype.getName = function () {
|
||||
return "Proper Timestamps";
|
||||
};
|
||||
properTimestamps.prototype.getDescription = function () {
|
||||
return "24 hours timestamps";
|
||||
};
|
||||
properTimestamps.prototype.getVersion = function () {
|
||||
return "0.1.0";
|
||||
};
|
||||
properTimestamps.prototype.getAuthor = function () {
|
||||
return "Jiiks";
|
||||
};
|
|
@ -1,63 +0,0 @@
|
|||
//META{"name":"typingSoundPlugin"}*//
|
||||
|
||||
function typingSoundPlugin() {}
|
||||
|
||||
typingSoundPlugin.prototype.load = function() {
|
||||
if($("#tsp-ts").length) return;
|
||||
$("head").append('<audio id="tsp-ts"><source src="//betterdiscord.net/stuff/ts4.wav"></audio>');
|
||||
this.ts = $("#tsp-ts");
|
||||
if($("#tsp-bs").length) return;
|
||||
$("head").append('<audio id="tsp-bs"><source src="//betterdiscord.net/stuff/bs.wav"></audio>');
|
||||
this.bs = $("#tsp-bs");
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.unload = function() {
|
||||
$("#tsp-ts").remove();
|
||||
$("#tsp-bs").remove();
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.start = function() {
|
||||
var self = this;
|
||||
$(document).on("keypress.ts", function(e) {
|
||||
self.ts.trigger("pause");
|
||||
self.bs.trigger("pause");
|
||||
self.ts.prop("currentTime", 0);
|
||||
self.bs.prop("currentTime", 0);
|
||||
self.ts.trigger("play");
|
||||
});
|
||||
|
||||
$(document).on("keydown.ts", function(e) {
|
||||
if(e.keyCode == 8) {
|
||||
self.bs.trigger("pause");
|
||||
self.bs.prop("currentTime", 0);
|
||||
self.bs.trigger("play");
|
||||
return;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.stop = function() {
|
||||
$(document).off("keypress.ts");
|
||||
$(document).off("keydown.ts");
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.getName = function() {
|
||||
return "Osu Sounds for Rai";
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.getDescription = function() {
|
||||
return "Plays Osu chat sounds when you type, can be used to play any sounds.";
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.getVersion = function() {
|
||||
return "1.0";
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.getAuthor = function() {
|
||||
return "Jiiks";
|
||||
};
|
||||
|
||||
typingSoundPlugin.prototype.getSettingsPanel = function() {
|
||||
return "";
|
||||
};
|
||||
|
|
@ -1 +0,0 @@
|
|||
Superseded by Media Support: https://github.com/Jiiks/BetterDiscordApp/blob/master/Plugins/mediaSupport.js
|
113
README.md
|
@ -1,107 +1,12 @@
|
|||
# BetterDiscordApp
|
||||
# BetterDiscordApp [![Travis][build-badge]][build] [![Snyk][snyk-badge]][snyk-url] [![deps][deps-badge]][deps-url] [![devdeps][devdeps-badge]][devdeps-url]
|
||||
|
||||
If you have issues then join the BD Discord server: [Here](https://discord.gg/0Tmfo5ZbORCRqbAd)
|
||||
If your Discord breaks then uninstall BD and try again
|
||||
# Do not contact Discord support about BD issues.
|
||||
[build-badge]: https://img.shields.io/travis/JsSucks/BetterDiscordApp/master.svg
|
||||
[build]: https://travis-ci.org/JsSucks/BetterDiscordApp
|
||||
|
||||
## Coming in 0.2.8 all plugins must be named `*.plugin.js` and all themes must be named `*.theme.css`
|
||||
[snyk-badge]: https://snyk.io/test/github/JsSucks/BetterDiscordApp/badge.svg
|
||||
[snyk-url]: https://snyk.io/test/github/JsSucks/BetterDiscordApp
|
||||
|
||||
Better Discord App enhances Discord desktop app with new features.
|
||||
|
||||
![ss](http://puu.sh/oIO58.png)
|
||||
|
||||
## Windows Universal Installer
|
||||
* Download the latest installer from [releases](https://github.com/Jiiks/BetterDiscordApp/releases)
|
||||
* Follow the instructions
|
||||
* .NET 4.0 required https://www.microsoft.com/en-us/download/details.aspx?id=30653
|
||||
* Windows Installer users asar.net https://github.com/Jiiks/asar.net
|
||||
|
||||
## Auto Installation
|
||||
* Download the latest package from [releases](https://github.com/Jiiks/BetterDiscordApp/releases)
|
||||
* Run the installer
|
||||
* Installer requires [node](https://nodejs.org/en/download/) download the binaries and place in the same folder as the installer if you don't have node installed.
|
||||
* Installer uses [asar](https://github.com/atom/asar) which is bundled with the installer.
|
||||
* Installer uses [wrench](https://github.com/ryanmcgrath/wrench-js) which is bundled with the installer.
|
||||
|
||||
## Manual Installation
|
||||
* Extract app.asar
|
||||
* Add BetterDiscord as a dependency
|
||||
* Add init to Discord load event
|
||||
* Move BetterDiscord to node_modules
|
||||
|
||||
## Features
|
||||
|
||||
**Emotes:**
|
||||
BetterDiscord adds all [Twitch.tv](http://twitch.tv), most [FrankerFaceZ](http://frankerfacez.com) and [BetterTTV](http://betterttv.net) emotes to Discord. Supported emotes: https://betterdiscord.net/emotes
|
||||
|
||||
**Quick Emote Menu:**
|
||||
Quick Emote Menu adds a menu for quickly adding twitch emotes and your favorite emotes.
|
||||
|
||||
**Emote Autocapitalize:**
|
||||
Automatically capitalize [Twitch.tv](http://twitch.tv) global emotes.
|
||||
|
||||
**Emote Autocomplete:**
|
||||
Automatically completes/suggests emotes.(soon)
|
||||
|
||||
**Minimal Mode:**
|
||||
Minimal mode makes elements smaller and hides certain elements.
|
||||
|
||||
**Voice Chat Mode:**
|
||||
Only display voice channels
|
||||
|
||||
**Public Servers:**
|
||||
A modal window for public servers [DiscordServers.com](https://www.discordservers.com/)
|
||||
![ss](http://puu.sh/o9oNl.png)
|
||||
|
||||
**Custom CSS**
|
||||
BetterDiscord supports custom CSS for styling Discord to your liking.
|
||||
|
||||
**Custom Themes**
|
||||
BetterDiscord comes with a theme loader for loading your own or downloading themes made by others.
|
||||
|
||||
**Plugins**
|
||||
BetterDiscord comes with a JavaScript plugin loader for loading your own or downloading plugins made by others.
|
||||
|
||||
**Spoilers**
|
||||
Add spoilers to your chat, simply add [!s] to your message.
|
||||
|
||||
**Save Logs Locally:**
|
||||
Save chatlogs locally.(soon)
|
||||
|
||||
## Adding your server to public servers
|
||||
As of JS1.60 the public server list is supplied by [DiscordServers.com](https://www.discordservers.com/)
|
||||
Add your server there and it will appear in the list!
|
||||
|
||||
## BetterDiscord Uses the following API's
|
||||
* https://twitchemotes.com/apidocs for Twitch emotes
|
||||
* https://api.betterttv.net/emotes for [BetterTTV](https://nightdev.com/betterttv/) emotes
|
||||
|
||||
## Credits
|
||||
* MacOS Installer by [Candunc](https://github.com/Candunc)
|
||||
* Emote titles by [pendo324](https://github.com/pendo324)
|
||||
* Majority of FFZ emote work by [Pohky] (https://github.com/pohky)
|
||||
* Majority of BTTV emote work by [EhsanKia] (https://github.com/EhsanKia)
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2016 Jiiks | [Jiiks.net] (https://jiiks.net)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
[deps-badge]: https://david-dm.org/JsSucks/BetterDiscordApp.svg
|
||||
[deps-url]: https://david-dm.org/JsSucks/BetterDiscordApp
|
||||
[devdeps-badge]: https://david-dm.org/JsSucks/BetterDiscordApp/dev-status.svg
|
||||
[devdeps-url]: https://david-dm.org/JsSucks/BetterDiscordApp?type=dev
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
module.exports = function(api) {
|
||||
|
||||
api.cache(true);
|
||||
|
||||
const presets = [['@babel/env', {
|
||||
targets: {
|
||||
'node': '8.6.0'
|
||||
}
|
||||
}]];
|
||||
|
||||
const plugins = [];
|
||||
|
||||
return {
|
||||
presets,
|
||||
plugins
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
module.exports = require('./lib/BetterDiscord');
|
|
@ -0,0 +1,18 @@
|
|||
module.exports = function(api) {
|
||||
|
||||
api.cache(true);
|
||||
|
||||
const presets = [['@babel/env', {
|
||||
targets: {
|
||||
'node': '8.6.0',
|
||||
'chrome': '60'
|
||||
}
|
||||
}], '@babel/react'];
|
||||
|
||||
const plugins = [];
|
||||
|
||||
return {
|
||||
presets,
|
||||
plugins
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2017",
|
||||
"allowSyntheticDefaultImports": false,
|
||||
"baseUrl": "./",
|
||||
"paths": {
|
||||
"modules": ["./src/modules/modules.js"],
|
||||
"structs": ["./src/structs/structs.js"],
|
||||
"common": ["../common/modules/common.js"],
|
||||
"ui": ["./src/ui/ui.js"],
|
||||
"builtin": ["./src/builtin/builtin.js"],
|
||||
"vue$": ["../node_modules/vue/dist/vue.esm.js"]
|
||||
}
|
||||
},
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"name": "bdclient",
|
||||
"description": "BetterDiscord client package",
|
||||
"author": "Jiiks",
|
||||
"version": "2.0.0-beta.6",
|
||||
"homepage": "https://betterdiscord.net",
|
||||
"license": "MIT",
|
||||
"main": "dist/betterdiscord.client.js",
|
||||
"contributors": [
|
||||
"Jiiks",
|
||||
"Pohky"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/JsSucks/BetterDiscordApp.git"
|
||||
},
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"build": "webpack --progress --colors",
|
||||
"watch": "webpack --progress --colors --watch",
|
||||
"release": "webpack --progress --colors --config=webpack.production.config.js"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* BetterDiscord 24 Hour Timestamps Module
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import BuiltinModule from './BuiltinModule';
|
||||
import { Reflection } from 'modules';
|
||||
|
||||
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
|
||||
|
||||
export default new class TwentyFourHour extends BuiltinModule {
|
||||
|
||||
/* Getters */
|
||||
get moduleName() { return 'TwentyFourHour' }
|
||||
|
||||
get settingPath() { return ['ui', 'default', '24-hour'] }
|
||||
|
||||
/* Patches */
|
||||
applyPatches() {
|
||||
if (this.patches.length) return;
|
||||
const { TimeFormatter } = Reflection.modules;
|
||||
this.patch(TimeFormatter, 'calendarFormat', this.convertTimeStamps);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert 12 hours timestamps to 24 hour timestamps
|
||||
*/
|
||||
convertTimeStamps(that, args, returnValue) {
|
||||
const matched = returnValue.match(twelveHour);
|
||||
if (!matched || matched.length !== 4) return;
|
||||
if (matched[3] === 'AM') return returnValue.replace(matched[0], `${matched[1] === '12' ? '00' : matched[1].padStart(2, '0')}:${matched[2]}`)
|
||||
return returnValue.replace(matched[0], `${parseInt(matched[1]) + 12}:${matched[2]}`)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* BetterDiscord Blocked Messages Module
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import BuiltinModule from './BuiltinModule';
|
||||
import { Reflection } from 'modules';
|
||||
|
||||
export default new class BlockedMessages extends BuiltinModule {
|
||||
|
||||
/* Getters */
|
||||
get moduleName() { return 'BlockedMessages' }
|
||||
|
||||
get settingPath() { return ['ui', 'default', 'blocked-messages'] }
|
||||
|
||||
async enabled(e) {
|
||||
const MessageListComponents = Reflection.module.byProps('BlockedMessageGroup');
|
||||
MessageListComponents.OriginalBlockedMessageGroup = MessageListComponents.BlockedMessageGroup;
|
||||
MessageListComponents.BlockedMessageGroup = () => null;
|
||||
this.cancelBlockedMessages = () => {
|
||||
MessageListComponents.BlockedMessageGroup = MessageListComponents.OriginalBlockedMessageGroup;
|
||||
delete MessageListComponents.OriginalBlockedMessageGroup;
|
||||
}
|
||||
}
|
||||
|
||||
disabled(e) {
|
||||
if (this.cancelBlockedMessages) this.cancelBlockedMessages();
|
||||
}
|
||||
|
||||
/* Methods */
|
||||
static isBlocked(id) {
|
||||
const { RelationshipStore } = Reflection.modules;
|
||||
return RelationshipStore.isBlocked(id);
|
||||
}
|
||||
|
||||
/* Patches */
|
||||
applyPatches() {
|
||||
if (this.patches.length) return;
|
||||
const { MessageActions } = Reflection.modules;
|
||||
this.patch(MessageActions, 'receiveMessage', this.processMessage, 'instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Ignore blocked messages completely
|
||||
*/
|
||||
processMessage(that, args, originalFunction) {
|
||||
if (args[1] && args[1].author && args[1].author.id && BlockedMessages.isBlocked(args[1].author.id)) return;
|
||||
return originalFunction(...args);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
* BetterDiscord Builtin Module Base
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import { Settings } from 'modules';
|
||||
import { Patcher, MonkeyPatch as Patch, Cache } from 'modules';
|
||||
import { ClientLogger as Logger } from 'common';
|
||||
|
||||
export default class BuiltinModule {
|
||||
|
||||
constructor() {
|
||||
this._settingUpdated = this._settingUpdated.bind(this);
|
||||
if (this.enabled) this.enabled = this.enabled.bind(this);
|
||||
if (this.disabled) this.disabled = this.disabled.bind(this);
|
||||
if (this.applyPatches) this.applyPatches = this.applyPatches.bind(this);
|
||||
this.patch = this.patch.bind(this);
|
||||
}
|
||||
|
||||
async init() {
|
||||
this.setting.on('setting-updated', this._settingUpdated);
|
||||
if (this.setting.value) {
|
||||
if (this.enabled) await this.enabled();
|
||||
if (this.applyPatches) this.applyPatches();
|
||||
}
|
||||
}
|
||||
|
||||
get setting() {
|
||||
return Settings.getSetting(...this.settingPath);
|
||||
}
|
||||
|
||||
get patches() {
|
||||
return Patcher.getPatchesByCaller(`BD:${this.moduleName}`);
|
||||
}
|
||||
|
||||
async _settingUpdated(e) {
|
||||
if (e.value) {
|
||||
if (this.enabled) await this.enabled(e);
|
||||
if (this.applyPatches) await this.applyPatches();
|
||||
if (this.rerenderPatchedComponents) this.rerenderPatchedComponents();
|
||||
} else {
|
||||
if (this.disabled) await this.disabled(e);
|
||||
this.unpatch();
|
||||
if (this.rerenderPatchedComponents) this.rerenderPatchedComponents();
|
||||
}
|
||||
}
|
||||
|
||||
get cache() {
|
||||
return {
|
||||
push: data => Cache.push(this.moduleName, data),
|
||||
find: filter => Cache.find(this.moduleName, filter)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* By default unpatch everything.
|
||||
* Override to do something else.
|
||||
*/
|
||||
unpatch() {
|
||||
Patcher.unpatchAll(`BD:${this.moduleName}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Patch a function in a module
|
||||
* @param {any} module Module to patch
|
||||
* @param {String} fnName Name of the function to patch
|
||||
* @param {Function} cb Callback
|
||||
* @param {String} [when=after] before|after|instead
|
||||
*/
|
||||
patch(module, fnName, cb, when = 'after') {
|
||||
if (!['before', 'after', 'instead'].includes(when)) when = 'after';
|
||||
return Patch(`BD:${this.moduleName}`, module)[when](fnName, cb.bind(this));
|
||||
}
|
||||
|
||||
childPatch(module, fnName, child, cb, when = 'after') {
|
||||
const last = child.pop();
|
||||
|
||||
this.patch(module, fnName, (component, args, retVal) => {
|
||||
const unpatch = this.patch(child.reduce((obj, key) => obj[key], retVal), last, function(...args) {unpatch(); return cb.call(this, component, ...args);}, when);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Logger wraps
|
||||
*/
|
||||
log(message) {
|
||||
Logger.log(this.moduleName, message);
|
||||
}
|
||||
|
||||
warn(message) {
|
||||
Logger.warn(this.moduleName, message);
|
||||
}
|
||||
|
||||
info(message) {
|
||||
Logger.warn(this.moduleName, message);
|
||||
}
|
||||
|
||||
debug(message) {
|
||||
Logger.dbg(this.moduleName, message);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
* BetterDiscord Colored Text Module
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import BuiltinModule from './BuiltinModule';
|
||||
|
||||
import { Utils } from 'common';
|
||||
import { Settings, Reflection, ReactComponents, DiscordApi } from 'modules';
|
||||
|
||||
export default new class ColoredText extends BuiltinModule {
|
||||
|
||||
/* Getters */
|
||||
get moduleName() { return 'ColoredText' }
|
||||
|
||||
get settingPath() { return ['ui', 'default', 'colored-text'] }
|
||||
|
||||
get intensityPath() { return ['ui', 'advanced', 'colored-text-intensity'] }
|
||||
|
||||
get intensitySetting() { return Settings.getSetting(...this.intensityPath) }
|
||||
|
||||
get intensity() { return 100 - this.intensitySetting.value }
|
||||
|
||||
get defaultColor() { return DiscordApi.UserSettings.theme == 'light' ? '#747f8d' : '#dcddde' }
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this._intensityUpdated = this._intensityUpdated.bind(this);
|
||||
}
|
||||
|
||||
async enabled(e) {
|
||||
this.intensitySetting.off('setting-updated', this._intensityUpdated);
|
||||
this.intensitySetting.on('setting-updated', this._intensityUpdated);
|
||||
}
|
||||
|
||||
disabled(e) {
|
||||
this.intensitySetting.off('setting-updated', this._intensityUpdated);
|
||||
}
|
||||
|
||||
rerenderPatchedComponents() {
|
||||
if (this.MessageContent) this.MessageContent.forceUpdateAll();
|
||||
}
|
||||
|
||||
/* Methods */
|
||||
_intensityUpdated() {
|
||||
this.MessageContent.forceUpdateAll();
|
||||
}
|
||||
|
||||
/* Patches */
|
||||
async applyPatches() {
|
||||
if (this.patches.length) return;
|
||||
this.MessageContent = await ReactComponents.getComponent('MessageContent');
|
||||
this.patch(this.MessageContent.component.prototype, 'render', this.injectColoredText);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set markup text colour to match role colour
|
||||
*/
|
||||
injectColoredText(thisObject, args, originalReturn) {
|
||||
const unpatch = this.patch(originalReturn.props, 'children', (obj, args, returnValue) => {
|
||||
unpatch();
|
||||
const { TinyColor } = Reflection.modules;
|
||||
const markup = Utils.findInReactTree(returnValue, m => m && m.props && m.props.className && m.props.className.includes('da-markup'));
|
||||
const roleColor = thisObject.props.message.colorString;
|
||||
if (markup && roleColor) markup.props.style = {color: TinyColor.mix(roleColor, this.defaultColor, this.intensity)};
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,396 @@
|
|||
/**
|
||||
* BetterDiscord E2EE Module
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import { Settings, Cache, Events } from 'modules';
|
||||
import BuiltinModule from '../BuiltinModule';
|
||||
import { Reflection, ReactComponents, DiscordApi, Security } from 'modules';
|
||||
import { VueInjector, Modals, Toasts } from 'ui';
|
||||
import { ClientLogger as Logger, ClientIPC } from 'common';
|
||||
import { request } from 'vendor';
|
||||
import { Utils } from 'common';
|
||||
import E2EEComponent from './E2EEComponent.vue';
|
||||
import E2EEMessageButton from './E2EEMessageButton.vue';
|
||||
import nodecrypto from 'node-crypto';
|
||||
|
||||
const userMentionPattern = new RegExp(`<@!?([0-9]{10,})>`, 'g');
|
||||
const roleMentionPattern = new RegExp(`<@&([0-9]{10,})>`, 'g');
|
||||
const everyoneMentionPattern = new RegExp(`(?:\\s+|^)@everyone(?:\\s+|$)`);
|
||||
|
||||
const START_DATE = new Date();
|
||||
const TEMP_KEY = 'temporarymasterkey';
|
||||
const ECDH_STORAGE = {};
|
||||
let seed;
|
||||
|
||||
export default new class E2EE extends BuiltinModule {
|
||||
|
||||
/* Getters */
|
||||
|
||||
get moduleName() { return 'E2EE' }
|
||||
|
||||
get settingPath() { return ['security', 'default', 'e2ee'] }
|
||||
|
||||
get database() { return Settings.getSetting('security', 'e2eedb', 'e2ekvps').value }
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.encryptNewMessages = true;
|
||||
this.ecdhDate = START_DATE;
|
||||
this.handlePublicKey = this.handlePublicKey.bind(this);
|
||||
this.fetchMasterKey = this.fetchMasterKey.bind(this);
|
||||
}
|
||||
|
||||
async enabled(e) {
|
||||
await this.fetchMasterKey();
|
||||
Events.on('discord:MESSAGE_CREATE', this.handlePublicKey);
|
||||
Settings.getSetting('security', 'default', 'use-keytar').on('setting-updated', this.fetchMasterKey);
|
||||
}
|
||||
|
||||
async disabled(e) {
|
||||
Settings.getSetting('security', 'default', 'use-keytar').off('setting-updated', this.fetchMasterKey);
|
||||
Events.off('discord:MESSAGE_CREATE', this.handlePublicKey);
|
||||
const ctaComponent = await ReactComponents.getComponent('ChannelTextArea');
|
||||
ctaComponent.forceUpdateAll();
|
||||
}
|
||||
|
||||
/* Methods */
|
||||
async fetchMasterKey() {
|
||||
try {
|
||||
if (Settings.get('security', 'default', 'use-keytar')) {
|
||||
const master = await ClientIPC.getPassword('betterdiscord', 'master');
|
||||
if (master) return this.setMaster(master);
|
||||
|
||||
if (Settings.getSetting('security', 'e2eedb', 'e2ekvps').items.length) {
|
||||
// Ask the user for their current password to save to the system keychain
|
||||
const currentMaster = await Modals.input('Save to System Keychain', 'Master Password', true).promise;
|
||||
await ClientIPC.setPassword('betterdiscord', 'master', currentMaster);
|
||||
return this.setMaster(currentMaster);
|
||||
}
|
||||
|
||||
// Generate a new master password and save it to the system keychain
|
||||
const newMaster = Security.randomBytes();
|
||||
await ClientIPC.setPassword('betterdiscord', 'master', newMaster);
|
||||
return this.setMaster(newMaster);
|
||||
}
|
||||
|
||||
const newMaster = await Modals.input('Open Database', 'Master Password', true).promise;
|
||||
return this.setMaster(newMaster);
|
||||
} catch (err) {
|
||||
Settings.getSetting(...this.settingPath).value = false;
|
||||
Toasts.error('Invalid master password! E2EE Disabled');
|
||||
Logger.err('E2EE', ['Error fetching master password', err]);
|
||||
}
|
||||
}
|
||||
|
||||
setMaster(key) {
|
||||
seed = Security.randomBytes();
|
||||
const newMaster = Security.encrypt(seed, key);
|
||||
// TODO re-encrypt everything with new master
|
||||
return (this.master = newMaster);
|
||||
}
|
||||
|
||||
encrypt(key, content, prefix = '') {
|
||||
if (!key) {
|
||||
// Encrypt something with master
|
||||
return Security.encrypt(Security.decrypt(seed, this.master), content);
|
||||
}
|
||||
|
||||
if (!content) {
|
||||
// Get key for current channel and encrypt
|
||||
const haveKey = this.getKey(DiscordApi.currentChannel.id);
|
||||
if (!haveKey) return 'nokey';
|
||||
return Security.encrypt(Security.decrypt(seed, [this.master, haveKey]), key);
|
||||
}
|
||||
return prefix + Security.encrypt(key, content);
|
||||
}
|
||||
|
||||
decrypt(key, content, prefix = '') {
|
||||
return Security.decrypt(key, content, prefix);
|
||||
}
|
||||
|
||||
async createHmac(data) {
|
||||
const haveKey = this.getKey(DiscordApi.currentChannel.id);
|
||||
if (!haveKey) return null;
|
||||
return Security.createHmac(Security.decrypt(seed, [this.master, haveKey]), data);
|
||||
}
|
||||
|
||||
getKey(channelId) {
|
||||
const haveKey = this.database.find(kvp => kvp.value.key === channelId);
|
||||
if (!haveKey) return null;
|
||||
return haveKey.value.value;
|
||||
}
|
||||
|
||||
setKey(channelId, key) {
|
||||
const items = Settings.getSetting('security', 'e2eedb', 'e2ekvps').items;
|
||||
const index = items.findIndex(kvp => kvp.value.key === channelId);
|
||||
if (index > -1) {
|
||||
items[index].value = { key: channelId, value: key };
|
||||
return;
|
||||
}
|
||||
Settings.getSetting('security', 'e2eedb', 'e2ekvps').addItem({ value: { key: channelId, value: key } });
|
||||
}
|
||||
|
||||
createKeyExchange(dmChannelID) {
|
||||
if (ECDH_STORAGE.hasOwnProperty(dmChannelID)) return null;
|
||||
ECDH_STORAGE[dmChannelID] = Security.createECDH();
|
||||
setTimeout(() => {
|
||||
if (ECDH_STORAGE.hasOwnProperty(dmChannelID)) {
|
||||
delete ECDH_STORAGE[dmChannelID];
|
||||
Toasts.error('Key exchange expired!');
|
||||
if (this.preExchangeState) this.encryptNewMessages = this.preExchangeState;
|
||||
this.preExchangeState = null;
|
||||
}
|
||||
}, 30000);
|
||||
return Security.generateECDHKeys(ECDH_STORAGE[dmChannelID]);
|
||||
}
|
||||
|
||||
publicKeyFor(dmChannelID) {
|
||||
return Security.getECDHPublicKey(ECDH_STORAGE[dmChannelID]);
|
||||
}
|
||||
|
||||
computeSecret(dmChannelID, otherKey) {
|
||||
try {
|
||||
const secret = Security.computeECDHSecret(ECDH_STORAGE[dmChannelID], otherKey);
|
||||
delete ECDH_STORAGE[dmChannelID];
|
||||
return Security.hash('sha384', secret, 'hex');
|
||||
} catch (e) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/* Patches */
|
||||
async applyPatches() {
|
||||
if (this.patches.length) return;
|
||||
|
||||
const { Dispatcher } = Reflection.modules;
|
||||
this.patch(Dispatcher, 'dispatch', this.dispatcherPatch, 'before');
|
||||
this.patchMessageContent();
|
||||
|
||||
const ChannelTextArea = await ReactComponents.getComponent('ChannelTextArea');
|
||||
this.patchChannelTextArea(ChannelTextArea);
|
||||
this.patchChannelTextAreaSubmit(ChannelTextArea);
|
||||
ChannelTextArea.forceUpdateAll();
|
||||
}
|
||||
|
||||
dispatcherPatch(_, [event]) {
|
||||
if (!event || event.type !== 'MESSAGE_CREATE') return;
|
||||
|
||||
const key = this.getKey(event.message.channel_id);
|
||||
if (!key) return; // We don't have a key for this channel
|
||||
|
||||
if (typeof event.message.content !== 'string') return; // Ignore any non string content
|
||||
if (!event.message.content.startsWith('$:')) return; // Not an encrypted string
|
||||
let decrypt;
|
||||
try {
|
||||
decrypt = this.decrypt(this.decrypt(this.decrypt(seed, this.master), key), event.message.content);
|
||||
} catch (err) { return } // Ignore errors such as non empty
|
||||
|
||||
const { MessageParser, Permissions, DiscordConstants } = Reflection.modules;
|
||||
|
||||
const currentChannel = DiscordApi.Channel.fromId(event.message.channel_id).discordObject;
|
||||
|
||||
// Create a generic message object to parse mentions with
|
||||
const parsed = MessageParser.parse(currentChannel, decrypt).content;
|
||||
|
||||
if (userMentionPattern.test(parsed))
|
||||
event.message.mentions = parsed.match(userMentionPattern).map(m => { return { id: m.replace(/[^0-9]/g, '') } });
|
||||
if (roleMentionPattern.test(parsed))
|
||||
event.message.mention_roles = parsed.match(roleMentionPattern).map(m => m.replace(/[^0-9]/g, ''));
|
||||
if (everyoneMentionPattern.test(parsed))
|
||||
event.message.mention_everyone = Permissions.can(DiscordConstants.Permissions.MENTION_EVERYONE, currentChannel);
|
||||
}
|
||||
|
||||
// TODO Received exchange should also expire if not accepted in time
|
||||
async handlePublicKey(e) {
|
||||
if (!DiscordApi.currentChannel) return;
|
||||
if (DiscordApi.currentChannel.type !== 'DM') return;
|
||||
const { id, content, author, channelId } = e.args;
|
||||
if (author.id === DiscordApi.currentUser.id || channelId !== DiscordApi.currentChannel.id) return;
|
||||
|
||||
const [tagstart, begin, key, end, tagend] = content.split('\n');
|
||||
if (begin !== '-----BEGIN PUBLIC KEY-----' || end !== '-----END PUBLIC KEY-----') return;
|
||||
|
||||
try {
|
||||
await Modals.confirm('Key Exchange', `Key exchange request from: ${author.username}#${author.discriminator}`, 'Accept', 'Reject').promise;
|
||||
// We already sent our key
|
||||
if (!ECDH_STORAGE.hasOwnProperty(channelId)) {
|
||||
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${this.createKeyExchange(channelId)}\n-----END PUBLIC KEY-----\n\`\`\``;
|
||||
if (this.encryptNewMessages) this.encryptNewMessages = false;
|
||||
Reflection.modules.DraftActions.saveDraft(channelId, publicKeyMessage);
|
||||
}
|
||||
const secret = this.computeSecret(channelId, key);
|
||||
this.setKey(channelId, secret);
|
||||
Toasts.success('Key exchange complete!');
|
||||
if (this.preExchangeState) this.encryptNewMessages = this.preExchangeState;
|
||||
this.preExchangeState = null;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
async patchMessageContent() {
|
||||
const MessageContent = await ReactComponents.getComponent('MessageContent');
|
||||
this.patch(MessageContent.component.prototype, 'render', this.beforeRenderMessageContent, 'before');
|
||||
this.childPatch(MessageContent.component.prototype, 'render', ['props', 'children'], this.afterRenderMessageContent);
|
||||
MessageContent.forceUpdateAll();
|
||||
|
||||
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper');
|
||||
this.patch(ImageWrapper.component.prototype, 'render', this.beforeRenderImageWrapper, 'before');
|
||||
ImageWrapper.forceUpdateAll();
|
||||
}
|
||||
|
||||
beforeRenderMessageContent(component) {
|
||||
if (!component.props || !component.props.message) return;
|
||||
|
||||
const key = this.getKey(component.props.message.channel_id);
|
||||
if (!key) return; // We don't have a key for this channel
|
||||
|
||||
const Message = Reflection.module.byPrototypes('isMentioned');
|
||||
const { MessageParser, Permissions, DiscordConstants } = Reflection.modules;
|
||||
const currentChannel = DiscordApi.Channel.fromId(component.props.message.channel_id).discordObject;
|
||||
|
||||
if (typeof component.props.message.content !== 'string') return; // Ignore any non string content
|
||||
if (!component.props.message.content.startsWith('$:')) return; // Not an encrypted string
|
||||
let decrypt;
|
||||
try {
|
||||
decrypt = Security.decrypt(seed, [this.master, key, component.props.message.content]);
|
||||
} catch (err) { return } // Ignore errors such as non empty
|
||||
|
||||
component.props.message.bd_encrypted = true; // signal as encrypted
|
||||
|
||||
// Create a generic message object to parse mentions with
|
||||
const message = MessageParser.createMessage(currentChannel.id, MessageParser.parse(currentChannel, decrypt).content);
|
||||
|
||||
if (userMentionPattern.test(message.content))
|
||||
message.mentions = message.content.match(userMentionPattern).map(m => { return { id: m.replace(/[^0-9]/g, '') } });
|
||||
if (roleMentionPattern.test(message.content))
|
||||
message.mention_roles = message.content.match(roleMentionPattern).map(m => m.replace(/[^0-9]/g, ''));
|
||||
if (everyoneMentionPattern.test(message.content))
|
||||
message.mention_everyone = Permissions.can(DiscordConstants.Permissions.MENTION_EVERYONE, currentChannel);
|
||||
|
||||
// Create a new message to parse it properly
|
||||
const create = Message.create(message);
|
||||
if (!create.content || !create.contentParsed) return;
|
||||
|
||||
component.props.message.mentions = create.mentions;
|
||||
component.props.message.mentionRoles = create.mentionRoles;
|
||||
component.props.message.mentionEveryone = create.mentionEveryone;
|
||||
component.props.message.mentioned = create.mentioned;
|
||||
component.props.message.content = create.content;
|
||||
component.props.message.contentParsed = create.contentParsed;
|
||||
}
|
||||
|
||||
afterRenderMessageContent(component, _childrenObject, args, retVal) {
|
||||
if (!component.props.message.bd_encrypted) return;
|
||||
|
||||
const { className } = Reflection.resolve('buttonContainer', 'avatar', 'username');
|
||||
const buttonContainer = Utils.findInReactTree(retVal, m => m && m.className && m.className.indexOf(className) !== -1);
|
||||
if (!buttonContainer) return;
|
||||
|
||||
const buttons = buttonContainer.children.props.children;
|
||||
if (!buttons) return;
|
||||
|
||||
try {
|
||||
buttons.unshift(VueInjector.createReactElement(E2EEMessageButton));
|
||||
} catch (err) {
|
||||
Logger.err('E2EE', err.message);
|
||||
}
|
||||
}
|
||||
|
||||
beforeRenderImageWrapper(component, args, retVal) {
|
||||
if (!component.props || !component.props.src) return;
|
||||
if (component.props.decrypting) return;
|
||||
component.props.decrypting = true;
|
||||
|
||||
const src = component.props.original || component.props.src.split('?')[0];
|
||||
if (!src.includes('bde2ee')) return;
|
||||
component.props.className = 'bd-encryptedImage';
|
||||
|
||||
const haveKey = this.getKey(DiscordApi.currentChannel.id);
|
||||
if (!haveKey) return;
|
||||
|
||||
const cached = Cache.find('e2ee:images', item => item.src === src);
|
||||
if (cached) {
|
||||
if (cached.invalidKey) { // TODO If key has changed we should recheck all with invalid key
|
||||
component.props.className = 'bd-encryptedImage bd-encryptedImageBadKey';
|
||||
component.props.readyState = 'READY';
|
||||
return;
|
||||
}
|
||||
Logger.info('E2EE', 'Returning encrypted image from cache');
|
||||
try {
|
||||
const decrypt = Security.decrypt(seed, [this.master, haveKey, cached.image]);
|
||||
component.props.className = 'bd-decryptedImage';
|
||||
component.props.src = component.props.original = `data:;base64,${decrypt}`;
|
||||
} catch (err) { return } finally { component.props.readyState = 'READY' }
|
||||
return;
|
||||
}
|
||||
|
||||
component.props.readyState = 'LOADING';
|
||||
Logger.info('E2EE', `Decrypting image: ${src}`);
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
const res = await request.get(src, { encoding: 'binary' });
|
||||
|
||||
const arr = new Uint8Array(new ArrayBuffer(res.length));
|
||||
for (let i = 0; i < res.length; i++) arr[i] = res.charCodeAt(i);
|
||||
|
||||
const aobindex = Utils.aobscan(arr, [73, 69, 78, 68]) + 8;
|
||||
const sliced = arr.slice(aobindex);
|
||||
const image = new TextDecoder().decode(sliced);
|
||||
|
||||
const hmac = image.slice(-64);
|
||||
const data = image.slice(0, -64);
|
||||
const validateHmac = await this.createHmac(data);
|
||||
if (hmac !== validateHmac) {
|
||||
Cache.push('e2ee:images', { src, invalidKey: true });
|
||||
if (component && component.props) {
|
||||
component.props.decrypting = false;
|
||||
component.forceUpdate();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Cache.push('e2ee:images', { src, image: data });
|
||||
|
||||
if (!component || !component.props) {
|
||||
Logger.warn('E2EE', 'Component seems to be gone');
|
||||
return;
|
||||
}
|
||||
|
||||
component.props.decrypting = false;
|
||||
component.forceUpdate();
|
||||
} catch (err) {
|
||||
console.log('request error', err);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
patchChannelTextArea(cta) {
|
||||
this.patch(cta.component.prototype, 'render', this.renderChannelTextArea);
|
||||
}
|
||||
|
||||
renderChannelTextArea(component, args, retVal) {
|
||||
if (!(retVal.props.children instanceof Array)) retVal.props.children = [retVal.props.children];
|
||||
const inner = retVal.props.children.find(child => child.props.className && child.props.className.includes('inner'));
|
||||
inner.props.children.splice(0, 0, VueInjector.createReactElement(E2EEComponent));
|
||||
}
|
||||
|
||||
patchChannelTextAreaSubmit(cta) {
|
||||
this.patch(cta.component.prototype, 'handleSubmit', this.handleChannelTextAreaSubmit, 'before');
|
||||
}
|
||||
|
||||
handleChannelTextAreaSubmit(component, args, retVal) {
|
||||
const key = this.getKey(DiscordApi.currentChannel.id);
|
||||
if (!this.encryptNewMessages || !key) return;
|
||||
component.props.value = Security.encrypt(Security.decrypt(seed, [this.master, key]), component.props.value, '$:');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
/**
|
||||
* BetterDiscord E2EE Component
|
||||
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
||||
* All rights reserved.
|
||||
* https://betterdiscord.net
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
<template>
|
||||
<div class="bd-e2eeTaContainer">
|
||||
<v-popover :popoverClass="['bd-popover', 'bd-e2eePopover', {'bd-e2eePopoverOver': popoutPositionSetting.value === 'over'}]"
|
||||
:trigger="popoutPositionSetting.value === 'over' && popoutTriggerSetting.value === 'hover' ? 'hover' : 'click'"
|
||||
:placement="popoutPositionSetting.value === 'over' ? 'top-start' : 'top'"
|
||||
:disabled="error && DiscordApi.currentChannel.type !== 'DM'">
|
||||
|
||||
<div v-if="error" class="bd-e2eeTaBtn bd-e2eeLock bd-error">
|
||||
<MiLock v-tooltip="error" />
|
||||
</div>
|
||||
<div v-else-if="state === 'loading'" class="bd-e2eeTaBtn bd-e2eeLock bd-loading bd-warn">
|
||||
<MiLock v-tooltip="'Loading'" />
|
||||
</div>
|
||||
|
||||
<div v-else-if="!E2EE.encryptNewMessages" class="bd-e2eeTaBtn bd-e2eeLock bd-warn">
|
||||
<MiLock v-tooltip="'New messages will not be encrypted.'" />
|
||||
</div>
|
||||
|
||||
<div v-else class="bd-e2eeTaBtn bd-e2eeLock bd-ok">
|
||||
<MiLock v-tooltip="'Ready!'" />
|
||||
</div>
|
||||
|
||||
<template slot="popover">
|
||||
<div @click="toggleEncrypt" :class="{'bd-warn': !E2EE.encryptNewMessages, 'bd-ok': E2EE.encryptNewMessages}"><MiLock v-tooltip="'Toggle Encryption'" /></div>
|
||||
<div v-close-popover @click="showUploadDialog" v-if="!error"><MiImagePlus v-tooltip="'Upload Encrypted Image'" /></div>
|
||||
<div v-close-popover @click="generatePublicKey" v-if="DiscordApi.currentChannel.type === 'DM'"><MiIcVpnKey v-tooltip="'Begin Key Exchange'" /></div>
|
||||
</template>
|
||||
</v-popover>
|
||||
<div class="bd-taDivider"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Utils, FileUtils, ClientIPC } from 'common';
|
||||
import { E2EE } from 'builtin';
|
||||
import { Settings, DiscordApi, Reflection } from 'modules';
|
||||
import { Toasts } from 'ui';
|
||||
import { MiLock, MiImagePlus, MiIcVpnKey } from 'commoncomponents';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MiLock, MiImagePlus, MiIcVpnKey
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
E2EE,
|
||||
DiscordApi,
|
||||
state: 'loading',
|
||||
error: null,
|
||||
popoutPositionSetting: Settings.getSetting('security', 'e2ee-popout', 'position'),
|
||||
popoutTriggerSetting: Settings.getSetting('security', 'e2ee-popout', 'trigger')
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async showUploadDialog() {
|
||||
const dialogResult = await ClientIPC.send('bd-native-open', {properties: ['openFile']});
|
||||
if (!dialogResult || !dialogResult.length) return;
|
||||
|
||||
const readFile = await FileUtils.readFileBuffer(dialogResult[0]);
|
||||
const FileActions = Reflection.module.byProps('makeFile');
|
||||
const Uploader = Reflection.module.byProps('instantBatchUpload');
|
||||
|
||||
const img = await Utils.getImageFromBuffer(readFile);
|
||||
|
||||
const canvas = document.createElement('canvas');
|
||||
canvas.height = img.height;
|
||||
canvas.width = img.width;
|
||||
const arrBuffer = await Utils.canvasToArrayBuffer(canvas);
|
||||
const encrypted = E2EE.encrypt(img.src.replace('data:;base64,', ''));
|
||||
const hmac = await E2EE.createHmac(encrypted);
|
||||
const encodedBytes = new TextEncoder().encode(encrypted + hmac);
|
||||
Uploader.upload(DiscordApi.currentChannel.id, FileActions.makeFile(new Uint8Array([...new Uint8Array(arrBuffer), ...encodedBytes]), 'bde2ee.png'));
|
||||
},
|
||||
toggleEncrypt() {
|
||||
const newState = !E2EE.encryptNewMessages;
|
||||
E2EE.encryptNewMessages = newState;
|
||||
if (!newState) {
|
||||
Toasts.warning('New messages will not be encrypted');
|
||||
return;
|
||||
}
|
||||
Toasts.success('New messages will be encrypted');
|
||||
},
|
||||
generatePublicKey() {
|
||||
const keyExchange = E2EE.createKeyExchange(DiscordApi.currentChannel.id);
|
||||
if (keyExchange === null) {
|
||||
Toasts.warning('Key exchange for channel already in progress!');
|
||||
return;
|
||||
}
|
||||
E2EE.preExchangeState = E2EE.encryptNewMessages;
|
||||
E2EE.encryptNewMessages = false; // Disable encrypting new messages so we won't encrypt public keys
|
||||
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${keyExchange}\n-----END PUBLIC KEY-----\n\`\`\``;
|
||||
Reflection.modules.DraftActions.saveDraft(DiscordApi.currentChannel.id, publicKeyMessage);
|
||||
Toasts.info('Key exchange started. Expires in 30 seconds');
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (!E2EE.master) {
|
||||
this.error = 'No master key set!';
|
||||
return;
|
||||
}
|
||||
const haveKey = E2EE.getKey(DiscordApi.currentChannel.id);
|
||||
if (!haveKey) {
|
||||
this.error = 'No key for channel!';
|
||||
return;
|
||||
}
|
||||
this.state = 'OK';
|
||||
this.error = null;
|
||||
}
|
||||
}
|
||||
</script>
|