Compare commits
1868
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5d7b2d2f8 | ||
|
|
a8e4b71efa | ||
|
|
5e5207f508 | ||
|
|
8597332738 | ||
|
|
927f3016c9 | ||
|
|
1edb6c878e | ||
|
|
ac29807afd | ||
|
|
6c2a8abf93 | ||
|
|
3b569e509a | ||
|
|
7cdb4ffaf3 | ||
|
|
f7496db953 | ||
|
|
fc5b97caf8 | ||
|
|
b8873cd4f3 | ||
|
|
505722047c | ||
|
|
06a336742c | ||
|
|
041d2f0b38 | ||
|
|
be09981ef5 | ||
|
|
7c851c26d7 | ||
|
|
b89d904d72 | ||
|
|
0b464f3628 | ||
|
|
33035603ad | ||
|
|
7924ac4162 | ||
|
|
4b963a8dc3 | ||
|
|
523490d7e5 | ||
|
|
ae1ed6e3ff | ||
|
|
4425d456d6 | ||
|
|
eac46b3393 | ||
|
|
83e5f8f3bc | ||
|
|
7459dfd074 | ||
|
|
a492ebf4e1 | ||
|
|
8db9598060 | ||
|
|
ced2bba300 | ||
|
|
d7a5953f7f | ||
|
|
8b7c3b2bc8 | ||
|
|
67d2f4b443 | ||
|
|
57c4f80eb0 | ||
|
|
9badedfbdb | ||
|
|
eb68e0181a | ||
|
|
a2480f2d21 | ||
|
|
328a82914f | ||
|
|
9a4d6ccf38 | ||
|
|
d6c739b1c5 | ||
|
|
0ee6fd05ba | ||
|
|
edb2f91006 | ||
|
|
99cb765424 | ||
|
|
1088eeaf43 | ||
|
|
ad97c8a9f1 | ||
|
|
1bf1960cde | ||
|
|
c8fbd3bcdc | ||
|
|
727be74343 | ||
|
|
2a373a243f | ||
|
|
594262930d | ||
|
|
ea52a6e0a6 | ||
|
|
64bb598d0e | ||
|
|
2ceedd593c | ||
|
|
ce336a3f8d | ||
|
|
2bd4127135 | ||
|
|
325163e5fa | ||
|
|
cf2d083905 | ||
|
|
edc3f86ad8 | ||
|
|
eea1faef81 | ||
|
|
dcaffe7aee | ||
|
|
ed273f5750 | ||
|
|
b298a69c5f | ||
|
|
d4c9d647d8 | ||
|
|
18a0a47136 | ||
|
|
65f9165b58 | ||
|
|
525822b3d3 | ||
|
|
15891ff890 | ||
|
|
488261dbd4 | ||
|
|
c2fcf04369 | ||
|
|
8a70df1ffa | ||
|
|
a4239311bb | ||
|
|
850bcf8d7f | ||
|
|
60b46413c7 | ||
|
|
c8fab584f0 | ||
|
|
64a35b2798 | ||
|
|
dda0883461 | ||
|
|
82e36eee7a | ||
|
|
87514fed5f | ||
|
|
f25d7d754d | ||
|
|
392322a432 | ||
|
|
79a03df2fb | ||
|
|
3612143d68 | ||
|
|
9d04974902 | ||
|
|
0443fd2ea2 | ||
|
|
5c3bfb1182 | ||
|
|
99ce5971dc | ||
|
|
82fc956181 | ||
|
|
440321ee21 | ||
|
|
0df88066cc | ||
|
|
0e73d7c7f4 | ||
|
|
b1f0658cc5 | ||
|
|
587f97e3b5 | ||
|
|
5ae366665b | ||
|
|
2ad273a8bb | ||
|
|
fa7f16360e | ||
|
|
e38b6bc952 | ||
|
|
e3f8d25328 | ||
|
|
f9ac2761d2 | ||
|
|
553669f460 | ||
|
|
63eb662290 | ||
|
|
533cae9c2e | ||
|
|
3d23408823 | ||
|
|
e1836ec8b4 | ||
|
|
d4f5200d3c | ||
|
|
0ee33ae86f | ||
|
|
6d22b0d6b7 | ||
|
|
be9e77f685 | ||
|
|
78693c3be9 | ||
|
|
a64163a332 | ||
|
|
fff993929f | ||
|
|
20a63bb614 | ||
|
|
71d0d1b9a5 | ||
|
|
2571590dfb | ||
|
|
5d84c6af81 | ||
|
|
f0dc0e1046 | ||
|
|
5370d814fb | ||
|
|
218282a2a0 | ||
|
|
b04916fdbf | ||
|
|
ec01ed4345 | ||
|
|
8d2295d74f | ||
|
|
eda995e011 | ||
|
|
010b5e2597 | ||
|
|
12c27519b7 | ||
|
|
ac0b03fd5f | ||
|
|
1090e64fa3 | ||
|
|
7dfe5c2397 | ||
|
|
b5dcf93c1f | ||
|
|
e5a11328ee | ||
|
|
751cd0acfb | ||
|
|
a520501258 | ||
|
|
d750a4be81 | ||
|
|
7c1bd26491 | ||
|
|
7931dab53e | ||
|
|
94e5e301c4 | ||
|
|
dc6e1bdb1c | ||
|
|
ee29bbcb11 | ||
|
|
d22287dd0e | ||
|
|
3821164970 | ||
|
|
29e89ef824 | ||
|
|
41f7aa7a20 | ||
|
|
06385eb3bf | ||
|
|
caa339d786 | ||
|
|
a29ca106b1 | ||
|
|
44bfdd4a8f | ||
|
|
79f0438079 | ||
|
|
e043fd613d | ||
|
|
cf40373829 | ||
|
|
183e848937 | ||
|
|
6675fb7d47 | ||
|
|
b6c2554f86 | ||
|
|
42b2166824 | ||
|
|
976b15d484 | ||
|
|
1f19b961db | ||
|
|
bf6bb3559d | ||
|
|
6fc2f223ad | ||
|
|
29e9ba2b1c | ||
|
|
e5f83eeccb | ||
|
|
b49237b25f | ||
|
|
8757d26487 | ||
|
|
760c8d9196 | ||
|
|
e914250f5d | ||
|
|
2949307bb3 | ||
|
|
a995068978 | ||
|
|
71de99b11b | ||
|
|
a0dc92a115 | ||
|
|
447830f4a2 | ||
|
|
5d2f74c8de | ||
|
|
d2f815d256 | ||
|
|
b1f5d42a25 | ||
|
|
b40417943a | ||
|
|
a88c860989 | ||
|
|
4d6352e089 | ||
|
|
9379d2b8c2 | ||
|
|
4b1ed89dde | ||
|
|
5e60605b58 | ||
|
|
f68ddda386 | ||
|
|
45a57d9f27 | ||
|
|
05101d8d8e | ||
|
|
c1ea907ba7 | ||
|
|
734dcfd45b | ||
|
|
862e9995cc | ||
|
|
44033decc6 | ||
|
|
40566f6059 | ||
|
|
2e977822b1 | ||
|
|
e351fe271f | ||
|
|
e6893d1db5 | ||
|
|
ee8403e39b | ||
|
|
888c1ae3e6 | ||
|
|
2584d6aeb0 | ||
|
|
959e75b256 | ||
|
|
f990734a87 | ||
|
|
2ec676defb | ||
|
|
d2811cc422 | ||
|
|
61dbbf4e53 | ||
|
|
fea83fbf87 | ||
|
|
5218b27402 | ||
|
|
2eb6f2c9c2 | ||
|
|
90e7e4c32e | ||
|
|
9eebd3e9dd | ||
|
|
a7f31eb918 | ||
|
|
84af4d9ebf | ||
|
|
8e5745bf0e | ||
|
|
dbd32e208f | ||
|
|
73e426ddad | ||
|
|
0b1eeafb36 | ||
|
|
4e73c75b8b | ||
|
|
e9418127ee | ||
|
|
6d9dddcb84 | ||
|
|
38bf0759c2 | ||
|
|
884de45ae7 | ||
|
|
bd9dd06f89 | ||
|
|
a12b89dab3 | ||
|
|
f7f5a5859c | ||
|
|
29601079c8 | ||
|
|
9d24120b9b | ||
|
|
bf854b4419 | ||
|
|
341334939f | ||
|
|
e30addb819 | ||
|
|
ecb9f0013f | ||
|
|
3530f125d3 | ||
|
|
d641a7e3b4 | ||
|
|
7388ebc629 | ||
|
|
82e54dc8f5 | ||
|
|
354a8b1126 | ||
|
|
2683476fe4 | ||
|
|
fcdc0c75b3 | ||
|
|
a7287c5261 | ||
|
|
a752730d9d | ||
|
|
a93925e520 | ||
|
|
ec582c45bc | ||
|
|
e59eb365bb | ||
|
|
2662571357 | ||
|
|
3e98e21b43 | ||
|
|
a4671b2ceb | ||
|
|
6b392e8a54 | ||
|
|
edf824b77d | ||
|
|
c7e5e48282 | ||
|
|
87765207c0 | ||
|
|
e32f5244f0 | ||
|
|
243fa7a870 | ||
|
|
05cd46bb01 | ||
|
|
0a8fcc2a03 | ||
|
|
782cdb6046 | ||
|
|
a687e50d5b | ||
|
|
12730be0d4 | ||
|
|
ed7a19eed3 | ||
|
|
3b4d9853aa | ||
|
|
ef07234b26 | ||
|
|
dbb03c4aee | ||
|
|
f9a9d02308 | ||
|
|
7e0a6c7197 | ||
|
|
55ff37c296 | ||
|
|
f77aa3d1c5 | ||
|
|
2b92426d9c | ||
|
|
2a6515b2af | ||
|
|
0609479caf | ||
|
|
9b1a54999a | ||
|
|
fe64297e55 | ||
|
|
ea7e27ad6f | ||
|
|
3d0db423ed | ||
|
|
5276fb8728 | ||
|
|
7280704a33 | ||
|
|
fd1fec92ac | ||
|
|
ee92708d40 | ||
|
|
335e32613a | ||
|
|
2018cbdc6f | ||
|
|
7852c26286 | ||
|
|
15712a67e1 | ||
|
|
be44746f79 | ||
|
|
cbfbb6e5f6 | ||
|
|
938852779b | ||
|
|
7db4fbf424 | ||
|
|
e06416ba82 | ||
|
|
aae8229048 | ||
|
|
b04812762d | ||
|
|
f3a146d25f | ||
|
|
986172f616 | ||
|
|
e4f11d5341 | ||
|
|
db348b3f51 | ||
|
|
2f4aa33cfe | ||
|
|
e7a44b7760 | ||
|
|
091a8a3c6d | ||
|
|
8d79c9255d | ||
|
|
061e513601 | ||
|
|
9b9dc4d645 | ||
|
|
c5a83c2889 | ||
|
|
726c012b2f | ||
|
|
6f67aa8382 | ||
|
|
274d8e24fa | ||
|
|
481b8fb2d8 | ||
|
|
f58dcd7e33 | ||
|
|
cdd5cebfc5 | ||
|
|
6968489d8b | ||
|
|
4125d54016 | ||
|
|
663a847351 | ||
|
|
9c1baaf306 | ||
|
|
7b3aa8da85 | ||
|
|
c18e1a776d | ||
|
|
652610bb5d | ||
|
|
73134a4f45 | ||
|
|
1758d8704c | ||
|
|
d76c79b9ab | ||
|
|
303c8a9920 | ||
|
|
bdf54265ce | ||
|
|
c24381f820 | ||
|
|
176a2a8d08 | ||
|
|
47acdceaad | ||
|
|
a9cf324199 | ||
|
|
f3a7460985 | ||
|
|
44332a13de | ||
|
|
c01c9bbca6 | ||
|
|
b81ac5fcf7 | ||
|
|
6af7fe09eb | ||
|
|
020e01237a | ||
|
|
e9ea832281 | ||
|
|
6f8d223142 | ||
|
|
591053ef40 | ||
|
|
7f0bb521d4 | ||
|
|
cff738248b | ||
|
|
4e92ff1740 | ||
|
|
65549d136c | ||
|
|
511adfd6d8 | ||
|
|
03a6e458cb | ||
|
|
bac140cf92 | ||
|
|
4623ef28a3 | ||
|
|
979b95dab9 | ||
|
|
373f0307d8 | ||
|
|
8e17897597 | ||
|
|
f5d6154be4 | ||
|
|
4e0ac054ec | ||
|
|
c1951921c0 | ||
|
|
501b447ca1 | ||
|
|
0d7db51cf8 | ||
|
|
ecc7b7d7b6 | ||
|
|
debd68e950 | ||
|
|
748ffca1e4 | ||
|
|
18c8f862ce | ||
|
|
474a9238ec | ||
|
|
6a0a654c3d | ||
|
|
4eb9697ea8 | ||
|
|
b9b3e85cdf | ||
|
|
76d289c921 | ||
|
|
0ff2809f0d | ||
|
|
be65a32245 | ||
|
|
d12d7c61c0 | ||
|
|
05b48e7500 | ||
|
|
547949b91d | ||
|
|
9760f192c2 | ||
|
|
e2bc0b7991 | ||
|
|
1638cf7567 | ||
|
|
e0f6d8e74a | ||
|
|
88537c6d18 | ||
|
|
ff7929f792 | ||
|
|
c9826af31e | ||
|
|
f75c17cca4 | ||
|
|
565ac3f325 | ||
|
|
c99d7aee2f | ||
|
|
0efb0cd566 | ||
|
|
dd90247ccc | ||
|
|
8279b3b516 | ||
|
|
c267276104 | ||
|
|
a6c948cbc8 | ||
|
|
ca12a1510e | ||
|
|
05488f499b | ||
|
|
0bf6ce548e | ||
|
|
7ed863e636 | ||
|
|
52fedb04b9 | ||
|
|
6bbfdf6b59 | ||
|
|
e19df9f327 | ||
|
|
7949ca88e9 | ||
|
|
3ae43bfb3d | ||
|
|
f53a0c5158 | ||
|
|
e8cd74ae4e | ||
|
|
c149341110 | ||
|
|
fea8c85646 | ||
|
|
98d067e392 | ||
|
|
e29001d6de | ||
|
|
35ebb597bb | ||
|
|
e3f5161156 | ||
|
|
db723fdf14 | ||
|
|
75dadff4bc | ||
|
|
3ebe1b7d11 | ||
|
|
45bbc39947 | ||
|
|
61117fb4b6 | ||
|
|
5c0b9606ea | ||
|
|
9312348299 | ||
|
|
fe0bbe93c9 | ||
|
|
2aee64489c | ||
|
|
af21d524cc | ||
|
|
4e4944c63b | ||
|
|
fb2301fd26 | ||
|
|
5b1fd7b7d2 | ||
|
|
0af57681ee | ||
|
|
017dec2ded | ||
|
|
27f4d411fc | ||
|
|
c8205c9e0b | ||
|
|
24e0845cd2 | ||
|
|
881682ea96 | ||
|
|
2d6eb2a8b8 | ||
|
|
2a88a3778a | ||
|
|
b942c855ac | ||
|
|
781f6b8fa1 | ||
|
|
17656a12c0 | ||
|
|
d6f4981278 | ||
|
|
cf0e6ebd4f | ||
|
|
562de222ec | ||
|
|
d968b07f39 | ||
|
|
d50591fd95 | ||
|
|
73053884d4 | ||
|
|
a649b5e767 | ||
|
|
ab1b96d9d1 | ||
|
|
bce399dc6e | ||
|
|
877ac25e4d | ||
|
|
74f1c7d27b | ||
|
|
0489e2e047 | ||
|
|
c343900615 | ||
|
|
60657c79fd | ||
|
|
03e4ce1f10 | ||
|
|
d69e630303 | ||
|
|
c99cbbc7a0 | ||
|
|
9247044dc0 | ||
|
|
9488ffed5d | ||
|
|
966e9f7c6a | ||
|
|
d29335489f | ||
|
|
585bb001ba | ||
|
|
9236a277f2 | ||
|
|
07c4303d93 | ||
|
|
ede40ef335 | ||
|
|
bff589c75d | ||
|
|
ff75aa5126 | ||
|
|
d474537614 | ||
|
|
88246d2b35 | ||
|
|
6dca7ae0dd | ||
|
|
5262e191e5 | ||
|
|
6812c4b257 | ||
|
|
5d9edebc2d | ||
|
|
40c7307086 | ||
|
|
d091a28c79 | ||
|
|
6532fec733 | ||
|
|
b7535dd779 | ||
|
|
3e079b21a7 | ||
|
|
91d4d395ea | ||
|
|
b4d2a17f12 | ||
|
|
bb019a7ca2 | ||
|
|
9373fd6f71 | ||
|
|
412f099ee9 | ||
|
|
eab738ddfa | ||
|
|
ba9f3bc4a4 | ||
|
|
afd73fc82e | ||
|
|
67ec986422 | ||
|
|
2645df775e | ||
|
|
2c181aaeed | ||
|
|
0fc22b5f56 | ||
|
|
243f2ec1d8 | ||
|
|
f519ad7e9f | ||
|
|
d583eb825e | ||
|
|
fafd2666c6 | ||
|
|
c143e518dd | ||
|
|
a07ca6b1f7 | ||
|
|
433addd020 | ||
|
|
18bc792f52 | ||
|
|
a0a7e52edc | ||
|
|
3f4c243da5 | ||
|
|
622bdebb80 | ||
|
|
71535da022 | ||
|
|
4fd57ad93c | ||
|
|
f241310835 | ||
|
|
6ad439a3db | ||
|
|
386ce248ae | ||
|
|
d2dd1d9f22 | ||
|
|
36e00115ed | ||
|
|
c815d07c19 | ||
|
|
22bf9fa486 | ||
|
|
0806627b02 | ||
|
|
2b44c0e0d1 | ||
|
|
aa26c4458c | ||
|
|
4de654f4dd | ||
|
|
fa862c915d | ||
|
|
e8c0893623 | ||
|
|
b4b29947bf | ||
|
|
bf12e9c84c | ||
|
|
66e3e205ef | ||
|
|
a610c99b2f | ||
|
|
055a0c60e9 | ||
|
|
996f6442fd | ||
|
|
ddb1af522f | ||
|
|
63b753e59b | ||
|
|
b55439d3a9 | ||
|
|
47c1744dbf | ||
|
|
b08828a092 | ||
|
|
e9ec8688db | ||
|
|
e4f2d51c47 | ||
|
|
3e6c66e73c | ||
|
|
1f1ca73592 | ||
|
|
2e32610862 | ||
|
|
7c6361a69b | ||
|
|
483ccbc39a | ||
|
|
51e738cb9f | ||
|
|
b4ae67503f | ||
|
|
064e98c0b1 | ||
|
|
0ef9969e55 | ||
|
|
1cb72cfbc2 | ||
|
|
cca4066e4e | ||
|
|
ba57ac8b07 | ||
|
|
e9ed6e6c10 | ||
|
|
b9e170a0bc | ||
|
|
2225ae8be0 | ||
|
|
173ba7a512 | ||
|
|
a4ac062fc0 | ||
|
|
9c66ebd8c2 | ||
|
|
3f679e8e90 | ||
|
|
b18b1f2342 | ||
|
|
b47b9b3dcf | ||
|
|
cf3c1358e1 | ||
|
|
b262400441 | ||
|
|
743885aff5 | ||
|
|
895c57aa0d | ||
|
|
a50a8b7c79 | ||
|
|
b264900b87 | ||
|
|
d3062bdc14 | ||
|
|
6858abf5e2 | ||
|
|
efd7c1ce3a | ||
|
|
f297991e20 | ||
|
|
06d0f3bf53 | ||
|
|
bec02cb3bc | ||
|
|
0374939ad6 | ||
|
|
0f3a6a9786 | ||
|
|
f208abe369 | ||
|
|
6fe27dd72b | ||
|
|
9fb12699f0 | ||
|
|
02396798b8 | ||
|
|
0bed570595 | ||
|
|
a52e9aa0a9 | ||
|
|
1d676e4931 | ||
|
|
62726d8faa | ||
|
|
15aab85030 | ||
|
|
b6d04746d6 | ||
|
|
bb9ebcfafc | ||
|
|
73728a4356 | ||
|
|
ecd0dcc761 | ||
|
|
85cc9c2c3d | ||
|
|
5d57fe0c76 | ||
|
|
fc716b9d95 | ||
|
|
5550977b52 | ||
|
|
fd2eb5eabe | ||
|
|
9a5851714c | ||
|
|
71514d580e | ||
|
|
6504f47b6f | ||
|
|
30759dc934 | ||
|
|
9c9de3ff97 | ||
|
|
8c5542226b | ||
|
|
bb4c62dd38 | ||
|
|
26e502d896 | ||
|
|
b94edd16f2 | ||
|
|
c1f41e50dd | ||
|
|
c696436769 | ||
|
|
06b5b9956c | ||
|
|
390115d789 | ||
|
|
79adad9893 | ||
|
|
541370c6a8 | ||
|
|
50e6643062 | ||
|
|
2812dc2ab1 | ||
|
|
4c9701965a | ||
|
|
dec4541210 | ||
|
|
bfc9a0ecf4 | ||
|
|
825b17d24c | ||
|
|
c7011e4183 | ||
|
|
3ac5e16c44 | ||
|
|
71d06794c0 | ||
|
|
d42f473a91 | ||
|
|
44219d2939 | ||
|
|
9bb7d70eb6 | ||
|
|
6b483d72be | ||
|
|
648f699b56 | ||
|
|
4aa11efddf | ||
|
|
2554f5592b | ||
|
|
af332691d5 | ||
|
|
b0fdd80c74 | ||
|
|
1cd04a056b | ||
|
|
60839e5138 | ||
|
|
4c5583813f | ||
|
|
e2b40dc4d6 | ||
|
|
b7fdc7feb7 | ||
|
|
a8e8f0fa9d | ||
|
|
ebe4e27890 | ||
|
|
ba6a385d55 | ||
|
|
74ade01069 | ||
|
|
4a202b909a | ||
|
|
414e25b6d5 | ||
|
|
ce7ce89150 | ||
|
|
b177bd6a67 | ||
|
|
d866b898cd | ||
|
|
6b70d02029 | ||
|
|
a50b1ef7a5 | ||
|
|
2c83973b92 | ||
|
|
31a8a5c473 | ||
|
|
72bf5129a8 | ||
|
|
94c74d0bb7 | ||
|
|
485817a623 | ||
|
|
649bc4e0a9 | ||
|
|
7763520845 | ||
|
|
a6bc5b34e8 | ||
|
|
5e138be57b | ||
|
|
cfd8aba0ea | ||
|
|
084dc6404a | ||
|
|
7c0a0b44d5 | ||
|
|
4b4a483b49 | ||
|
|
26063d4a86 | ||
|
|
d4a3e56611 | ||
|
|
f5682932c3 | ||
|
|
053bc54c01 | ||
|
|
a1e790c7bb | ||
|
|
db3c9a89d0 | ||
|
|
b7eeb0e549 | ||
|
|
0be94e7e00 | ||
|
|
a5c80fc152 | ||
|
|
ec7d8ea194 | ||
|
|
f078e82623 | ||
|
|
d9b618b42d | ||
|
|
f82968a623 | ||
|
|
297bcd5e7a | ||
|
|
a5d46133d2 | ||
|
|
b88bedb77a | ||
|
|
db9ec0194b | ||
|
|
4b719279ed | ||
|
|
78ea072b9f | ||
|
|
577bf9ec83 | ||
|
|
f36f1d2e29 | ||
|
|
7277c932fe | ||
|
|
8608836fe6 | ||
|
|
cae033fb2f | ||
|
|
b644d21826 | ||
|
|
7b53e5d48b | ||
|
|
07fe9557df | ||
|
|
f321a9663a | ||
|
|
ab98050ad1 | ||
|
|
e38d0c76d9 | ||
|
|
b0ff4e57ad | ||
|
|
f997021c0d | ||
|
|
72cf70617d | ||
|
|
fd3bddf540 | ||
|
|
5e763a4ce3 | ||
|
|
94a48d9008 | ||
|
|
96535a2dd4 | ||
|
|
777b57703a | ||
|
|
104499ab57 | ||
|
|
658bfd2b0d | ||
|
|
830a92c486 | ||
|
|
3e5b205de2 | ||
|
|
5099ac6827 | ||
|
|
a5fd41820b | ||
|
|
d1f58a7bfc | ||
|
|
1ced991ce4 | ||
|
|
68020e7832 | ||
|
|
61bfe8d130 | ||
|
|
ff6c981863 | ||
|
|
4b0eb2b003 | ||
|
|
4380c800a3 | ||
|
|
2aa4eebc90 | ||
|
|
685c2b30d6 | ||
|
|
3f2933699b | ||
|
|
d5c5eaef1e | ||
|
|
9ed09ccc14 | ||
|
|
e0be1236c1 | ||
|
|
dba49aa67d | ||
|
|
6c8f75d3e7 | ||
|
|
0eead7634c | ||
|
|
1c9ad8d48d | ||
|
|
d655becef5 | ||
|
|
d90e45c547 | ||
|
|
450a98e910 | ||
|
|
99eead9640 | ||
|
|
9a4aadc14d | ||
|
|
15489610c7 | ||
|
|
c158a6756a | ||
|
|
5da911fe0f | ||
|
|
3f2871acea | ||
|
|
b48a0e074c | ||
|
|
de2c1435fe | ||
|
|
cee91ca686 | ||
|
|
bc86fb1c42 | ||
|
|
0b86055c1b | ||
|
|
ded48eb876 | ||
|
|
bb13b0921c | ||
|
|
206b4ca0e1 | ||
|
|
d86de9d83b | ||
|
|
125360841d | ||
|
|
28a0e51cb5 | ||
|
|
1b5c479765 | ||
|
|
d37ab6ced4 | ||
|
|
5e2afac13c | ||
|
|
979670a7aa | ||
|
|
5f3023208e | ||
|
|
bc91882282 | ||
|
|
13dc420032 | ||
|
|
1aad11a320 | ||
|
|
3b76166015 | ||
|
|
ff95db85bb | ||
|
|
bd15139d1a | ||
|
|
d6a27330ac | ||
|
|
3bc9179f08 | ||
|
|
4c6d9774df | ||
|
|
c89fb16d10 | ||
|
|
1a9b7ca592 | ||
|
|
f6f333923f | ||
|
|
10d12d6083 | ||
|
|
ba0d0e42bd | ||
|
|
0954bbc876 | ||
|
|
a18618dcf4 | ||
|
|
e68729e8c0 | ||
|
|
d017dde4fa | ||
|
|
8060dc7499 | ||
|
|
6407f87d6c | ||
|
|
383b9f1368 | ||
|
|
d96d91049d | ||
|
|
3305bc5f10 | ||
|
|
0ac1ebe7cd | ||
|
|
eed2016c6f | ||
|
|
b248527726 | ||
|
|
17b493d0aa | ||
|
|
b2bac7e88a | ||
|
|
3d50b62475 | ||
|
|
81d2e6ae72 | ||
|
|
36b7584476 | ||
|
|
1b0af59b81 | ||
|
|
ea761bd83d | ||
|
|
d05cd589e8 | ||
|
|
e3883024fe | ||
|
|
34bf6aa604 | ||
|
|
98dfa77c0a | ||
|
|
f381eafe9d | ||
|
|
2f0c8ec695 | ||
|
|
07c048e126 | ||
|
|
30beda6da1 | ||
|
|
a691435125 | ||
|
|
08af36d308 | ||
|
|
cc47c888c7 | ||
|
|
259dfec08f | ||
|
|
9e365463b5 | ||
|
|
af8c869a22 | ||
|
|
f6cbbd00e9 | ||
|
|
05dd5b4f6f | ||
|
|
a928857db6 | ||
|
|
cfe425d67f | ||
|
|
2e64c18e50 | ||
|
|
1a662290e5 | ||
|
|
1c318e7685 | ||
|
|
5ab6c51f1e | ||
|
|
54cb7115e5 | ||
|
|
6cf0f8f224 | ||
|
|
7526043856 | ||
|
|
328d52a146 | ||
|
|
154519cf1b | ||
|
|
839e8f7243 | ||
|
|
a5287682d0 | ||
|
|
37ab531cf2 | ||
|
|
88c2f0f5f5 | ||
|
|
a9b0bd577e | ||
|
|
88029fa467 | ||
|
|
686360ce39 | ||
|
|
3903b2d5ce | ||
|
|
f85fbaecbc | ||
|
|
75deb00d1e | ||
|
|
50419aea1f | ||
|
|
addfe79b5f | ||
|
|
5e5f37cd11 | ||
|
|
f2d130e2c4 | ||
|
|
2ae97b6d0e | ||
|
|
a7f3f75ca8 | ||
|
|
ea0e9eab23 | ||
|
|
23792bdc13 | ||
|
|
2d01f1a7cb | ||
|
|
c7d3cd7c3b | ||
|
|
836846c0f9 | ||
|
|
eeb47fac23 | ||
|
|
69610d08b8 | ||
|
|
e8840ebb00 | ||
|
|
a682ddabda | ||
|
|
9fe7a411d5 | ||
|
|
ab69ca30e4 | ||
|
|
7c86eaf665 | ||
|
|
aee5e65dff | ||
|
|
583f367d9d | ||
|
|
57059ba2f1 | ||
|
|
548f2c233b | ||
|
|
1024de7d05 | ||
|
|
65e5046af8 | ||
|
|
30a552da36 | ||
|
|
78f8d97563 | ||
|
|
1c0a147fa4 | ||
|
|
473be41ab8 | ||
|
|
e5291af6ea | ||
|
|
bf75433755 | ||
|
|
a98d16652b | ||
|
|
93ad473a7d | ||
|
|
f4b794c8db | ||
|
|
a5380e59da | ||
|
|
8834d1e55d | ||
|
|
6a4b14dfc6 | ||
|
|
f697e02849 | ||
|
|
25c4ca5117 | ||
|
|
518e780104 | ||
|
|
5d0cd1ecdc | ||
|
|
1a0d90f0a6 | ||
|
|
e227f3afe1 | ||
|
|
3016b05731 | ||
|
|
3ddda6203e | ||
|
|
d82c50fb79 | ||
|
|
951632f453 | ||
|
|
53d830e3ee | ||
|
|
1b840f97e2 | ||
|
|
0c83eb95db | ||
|
|
9199a70e4b | ||
|
|
76ad9802b0 | ||
|
|
85465159e5 | ||
|
|
7848e7c0b8 | ||
|
|
3a99c29028 | ||
|
|
173442f714 | ||
|
|
42a0757862 | ||
|
|
fbbf18e9f4 | ||
|
|
228c102ffc | ||
|
|
b1bb4b4bcf | ||
|
|
7ee7235d1e | ||
|
|
38e464edaf | ||
|
|
e9fff1231d | ||
|
|
e70d1ae765 | ||
|
|
d971925dd5 | ||
|
|
0853baa2dd | ||
|
|
dab1361cf5 | ||
|
|
62c06a221a | ||
|
|
b08d969d25 | ||
|
|
bb0a325a71 | ||
|
|
1cd90530e8 | ||
|
|
b7205320e3 | ||
|
|
7571f8daec | ||
|
|
8cd31c844d | ||
|
|
a42a4c025c | ||
|
|
0d2d91ef09 | ||
|
|
06c81cf52b | ||
|
|
8f9fe4fdb8 | ||
|
|
5dd96a55d4 | ||
|
|
d36b7956b1 | ||
|
|
5daa0b0bea | ||
|
|
1483043e66 | ||
|
|
95a7f9e9b3 | ||
|
|
2d249162b9 | ||
|
|
f488cb0adc | ||
|
|
1c4c7b6d1c | ||
|
|
649dd52d77 | ||
|
|
005236d886 | ||
|
|
3da957018c | ||
|
|
d7d8b1e4c5 | ||
|
|
a39a86b73d | ||
|
|
5872e4bac0 | ||
|
|
9c8b4a650a | ||
|
|
fa85806ba5 | ||
|
|
f06298e3c3 | ||
|
|
528fc1dcbb | ||
|
|
a254044d3d | ||
|
|
6b4ebaf9b5 | ||
|
|
68fb354ee9 | ||
|
|
eca3763f4f | ||
|
|
34fc53c8d1 | ||
|
|
97790e3b2c | ||
|
|
ea595d9d42 | ||
|
|
1e3fc8baf4 | ||
|
|
3ec7ce333f | ||
|
|
2e6a7a99ac | ||
|
|
a695d25e69 | ||
|
|
e890c02313 | ||
|
|
348367968c | ||
|
|
fc1c1164c7 | ||
|
|
11c1437ce6 | ||
|
|
9b11bed4cf | ||
|
|
e94b8e210d | ||
|
|
b87236df92 | ||
|
|
bf32e4c6c9 | ||
|
|
f78c3017eb | ||
|
|
ac889bfa5b | ||
|
|
cee76fa119 | ||
|
|
5fc346e99b | ||
|
|
d3144edf04 | ||
|
|
48edcef0a9 | ||
|
|
aa6c162200 | ||
|
|
7343983db5 | ||
|
|
1225ca023c | ||
|
|
3d5ae7c4e0 | ||
|
|
3d14b0b766 | ||
|
|
c3c368f513 | ||
|
|
a02287cd39 | ||
|
|
73cc66c7ee | ||
|
|
9253095281 | ||
|
|
e81d4993bf | ||
|
|
98973eb80e | ||
|
|
a89e5957be | ||
|
|
9fae9ab40f | ||
|
|
90afe4f08d | ||
|
|
6a4ed210d2 | ||
|
|
f3e39682b8 | ||
|
|
95dc638191 | ||
|
|
6a5bd747af | ||
|
|
e8d0f25947 | ||
|
|
01544d03ef | ||
|
|
0bd721710d | ||
|
|
d7d2cc62af | ||
|
|
d594a79e25 | ||
|
|
2855fb6bc5 | ||
|
|
c2372e66af | ||
|
|
3f42fc5d65 | ||
|
|
0fc35f0dc2 | ||
|
|
0acdd6e04c | ||
|
|
ae4308f0fa | ||
|
|
513738a22d | ||
|
|
ac03592101 | ||
|
|
37d70849ec | ||
|
|
6d67490942 | ||
|
|
b69cca3647 | ||
|
|
0799f3c444 | ||
|
|
418efe032c | ||
|
|
b61da487a5 | ||
|
|
e9f0a95930 | ||
|
|
f0fa91914e | ||
|
|
11330b7a47 | ||
|
|
ba66b987e2 | ||
|
|
e64b09213b | ||
|
|
4faeb8c5b9 | ||
|
|
3313dc74f5 | ||
|
|
1c8d63f3fd | ||
|
|
6bab2dd21c | ||
|
|
5cf159586c | ||
|
|
6774e7b359 | ||
|
|
256a412b7c | ||
|
|
36e0d763f5 | ||
|
|
998d630b4b | ||
|
|
81b20ea2ee | ||
|
|
3f13b84a79 | ||
|
|
7673ce76b2 | ||
|
|
ef859348fb | ||
|
|
1ce7a69bbc | ||
|
|
23fa8cd932 | ||
|
|
ddf24dcc87 | ||
|
|
0f71e715e9 | ||
|
|
4f56770b56 | ||
|
|
43a396e471 | ||
|
|
c990670bbb | ||
|
|
4dc02731df | ||
|
|
c40f425797 | ||
|
|
6e6cf09f6e | ||
|
|
e7cd1702cc | ||
|
|
c7488b9155 | ||
|
|
8f2caba4a5 | ||
|
|
dbb723daac | ||
|
|
5cb1e63e69 | ||
|
|
7f23ed50f6 | ||
|
|
2ab9e02d3c | ||
|
|
e515d88a0b | ||
|
|
12b08f546a | ||
|
|
5c13d0bc55 | ||
|
|
e97d484e38 | ||
|
|
a6014ebc79 | ||
|
|
f9f480e814 | ||
|
|
1caa07032e | ||
|
|
877c4c6039 | ||
|
|
974112e619 | ||
|
|
1a26c64e61 | ||
|
|
d9e6df8251 | ||
|
|
2256722096 | ||
|
|
1a01996ff4 | ||
|
|
dd27034dc3 | ||
|
|
d9026e7505 | ||
|
|
621a72c333 | ||
|
|
b433d9e68e | ||
|
|
42df2960ad | ||
|
|
257bd207ee | ||
|
|
e011f1a4ad | ||
|
|
77abe49c7a | ||
|
|
887277f3d1 | ||
|
|
ff11ca0582 | ||
|
|
92722e2691 | ||
|
|
ee1041d969 | ||
|
|
972cb4291d | ||
|
|
6a41e52024 | ||
|
|
41c0061aa0 | ||
|
|
53b960b546 | ||
|
|
925df2e54e | ||
|
|
ac70d0e571 | ||
|
|
2a839f6b07 | ||
|
|
35952d05ff | ||
|
|
09c5f96d53 | ||
|
|
a5a9d933bf | ||
|
|
9870d01354 | ||
|
|
3276c8b8b9 | ||
|
|
3acb254e4f | ||
|
|
98bdd28afd | ||
|
|
546e055449 | ||
|
|
65482f00db | ||
|
|
03a293959e | ||
|
|
73db02b60d | ||
|
|
cb24964f97 | ||
|
|
6c0a4d3d36 | ||
|
|
ed75389ff4 | ||
|
|
62cbf56fcb | ||
|
|
9e4e622b89 | ||
|
|
a779dc4dbd | ||
|
|
857379b440 | ||
|
|
2f0dd2795a | ||
|
|
0b3e27ed04 | ||
|
|
0049d2bab2 | ||
|
|
763bf9be57 | ||
|
|
ff44777c6d | ||
|
|
fb3bb98d54 | ||
|
|
70a93a4d34 | ||
|
|
6c5d290835 | ||
|
|
a1565e26e9 | ||
|
|
e1981aef7c | ||
|
|
a58ac9775b | ||
|
|
a2912919a1 | ||
|
|
5776b7cd69 | ||
|
|
9007f98ced | ||
|
|
0668dc2d9e | ||
|
|
99dc44d896 | ||
|
|
718cc983e5 | ||
|
|
2bb78c50fb | ||
|
|
7bafbdfd59 | ||
|
|
412d579048 | ||
|
|
ff178e3b05 | ||
|
|
aff2fb9b70 | ||
|
|
5b456b6580 | ||
|
|
f7c7570d13 | ||
|
|
c22e765464 | ||
|
|
cbc9f7a034 | ||
|
|
837451ab79 | ||
|
|
730a9adccd | ||
|
|
96db250251 | ||
|
|
9e917c139e | ||
|
|
b623c88b9b | ||
|
|
2d7ed1d085 | ||
|
|
59e65e6cfd | ||
|
|
25e072b3b1 | ||
|
|
8450425827 | ||
|
|
cbda84ce9a | ||
|
|
a12baf0062 | ||
|
|
8e2d7232a1 | ||
|
|
873c7c41f1 | ||
|
|
7abd313d9a | ||
|
|
1c2c095fa9 | ||
|
|
1777628740 | ||
|
|
2f4e1e7e80 | ||
|
|
1bfe81db25 | ||
|
|
cf4f22d267 | ||
|
|
8b8f7be6e0 | ||
|
|
d6715d1a27 | ||
|
|
70cfd84837 | ||
|
|
2006a5dcbc | ||
|
|
9f7da1e5a1 | ||
|
|
bada0bdfd4 | ||
|
|
b70b5f2a9f | ||
|
|
d5948b5595 | ||
|
|
1de90e9912 | ||
|
|
9b8fc29991 | ||
|
|
0f1818b852 | ||
|
|
df523c7f3f | ||
|
|
45ba451cf2 | ||
|
|
7c9beb6cee | ||
|
|
989a9c5098 | ||
|
|
ec03837d61 | ||
|
|
fc7ea18156 | ||
|
|
173c394784 | ||
|
|
648f7f8445 | ||
|
|
14d5fbf8f4 | ||
|
|
27eb64ffac | ||
|
|
aa1f120ad2 | ||
|
|
e48cdcaba0 | ||
|
|
0e6ed30cec | ||
|
|
158cc0a55a | ||
|
|
20e72d5a81 | ||
|
|
1699ebd77f | ||
|
|
1c89aac2ff | ||
|
|
f105ba21ad | ||
|
|
82c5299d48 | ||
|
|
bbd48b7f10 | ||
|
|
d5786cc957 | ||
|
|
5071799241 | ||
|
|
013d74146c | ||
|
|
ce3dbc58b3 | ||
|
|
44fe0c6f90 | ||
|
|
266c49886e | ||
|
|
03ce51e39b | ||
|
|
4630370436 | ||
|
|
09ec038700 | ||
|
|
9e5358f864 | ||
|
|
936ce6263f | ||
|
|
4702ff93d5 | ||
|
|
cd6a74b2ee | ||
|
|
394bc5f716 | ||
|
|
e590aba2ba | ||
|
|
9b65fc77a6 | ||
|
|
6bd0738f4b | ||
|
|
302690795b | ||
|
|
576c963b24 | ||
|
|
ab65be7acb | ||
|
|
4e7d67c911 | ||
|
|
9c1d79ec7d | ||
|
|
3659e4fc69 | ||
|
|
b8e031856c | ||
|
|
34670b98a6 | ||
|
|
1c00fd4351 | ||
|
|
030c21d372 | ||
|
|
dae1164d3c | ||
|
|
6c9c4511ac | ||
|
|
07b7570def | ||
|
|
a54de8bc93 | ||
|
|
4724265316 | ||
|
|
2b69df26d0 | ||
|
|
7b24239720 | ||
|
|
80423c9e4c | ||
|
|
89aa3585ff | ||
|
|
23d77b2d05 | ||
|
|
a4ae7189b9 | ||
|
|
5c6ecdf5b4 | ||
|
|
141ddc7c4a | ||
|
|
e3594187c3 | ||
|
|
882df1293f | ||
|
|
524c530415 | ||
|
|
1b4a54de24 | ||
|
|
de692ebf95 | ||
|
|
4978522b21 | ||
|
|
7fdc0d7356 | ||
|
|
987a3cacbb | ||
|
|
3f231fbb04 | ||
|
|
506f4caedc | ||
|
|
313641a2e0 | ||
|
|
555fa9a28c | ||
|
|
59f6871a66 | ||
|
|
432554f99c | ||
|
|
ff3d03047a | ||
|
|
aa7912b714 | ||
|
|
33743283bc | ||
|
|
1ec02ea8c6 | ||
|
|
63c4d9132f | ||
|
|
fdeda61d60 | ||
|
|
6643e7f696 | ||
|
|
d24fb0bb58 | ||
|
|
52e618b0a1 | ||
|
|
27c0eb3741 | ||
|
|
acff0c9756 | ||
|
|
3118275cda | ||
|
|
d9ec0c8c49 | ||
|
|
af53c71b8f | ||
|
|
3088b5e5c9 | ||
|
|
cb5412fec1 | ||
|
|
924a4cf19e | ||
|
|
e705f5f4c5 | ||
|
|
a1e449191e | ||
|
|
4c56fdde6a | ||
|
|
5bed2f5a8e | ||
|
|
116dcae01b | ||
|
|
5de2d189ad | ||
|
|
9a6168f871 | ||
|
|
7b6f239cdd | ||
|
|
de65acf412 | ||
|
|
c6a2544e60 | ||
|
|
6efa918487 | ||
|
|
51eeb9637f | ||
|
|
05c1025899 | ||
|
|
476a1798f6 | ||
|
|
d407645d8d | ||
|
|
2a860da0e2 | ||
|
|
78b43f95c7 | ||
|
|
1c1bb330b4 | ||
|
|
bff11c2035 | ||
|
|
c7799e704a | ||
|
|
16bf1ad3b0 | ||
|
|
4953a21538 | ||
|
|
4b61c6e74b | ||
|
|
bb2de43dec | ||
|
|
3d70bffb37 | ||
|
|
00ed8594fc | ||
|
|
710df75fcf | ||
|
|
7348cad232 | ||
|
|
b929c3ec29 | ||
|
|
6fbc0710da | ||
|
|
7eb2545d4e | ||
|
|
81538898b2 | ||
|
|
0f93ec2b24 | ||
|
|
c44f140927 | ||
|
|
e87b38aa53 | ||
|
|
4401aaf2d3 | ||
|
|
367cb980be | ||
|
|
6dc99f5574 | ||
|
|
adfe8d3886 | ||
|
|
0ac81e6a10 | ||
|
|
a47c1a31ad | ||
|
|
c754382b89 | ||
|
|
936ce51b66 | ||
|
|
072cca8e6b | ||
|
|
4aba44d87f | ||
|
|
7254e97d91 | ||
|
|
2037cfac74 | ||
|
|
223522b1c7 | ||
|
|
1c49078b86 | ||
|
|
57d22430fc | ||
|
|
b7b72cf870 | ||
|
|
19b1c0f991 | ||
|
|
273300a61d | ||
|
|
33e36c0355 | ||
|
|
52864745e4 | ||
|
|
b4426e6d24 | ||
|
|
78d8a6a64a | ||
|
|
140256d348 | ||
|
|
f8868ee5c6 | ||
|
|
7cd402bc62 | ||
|
|
6e72bf0ae9 | ||
|
|
1c73ad580c | ||
|
|
04c0eb8f27 | ||
|
|
726895214f | ||
|
|
b378a449b5 | ||
|
|
ff5a649cd6 | ||
|
|
9270a2f0f3 | ||
|
|
f30697f09b | ||
|
|
ca964b0eb8 | ||
|
|
853fabadb3 | ||
|
|
112ea23194 | ||
|
|
d0716e25f2 | ||
|
|
fb5244c0e6 | ||
|
|
0dc53e3787 | ||
|
|
10885c866c | ||
|
|
6ce6e59974 | ||
|
|
c687fb8237 | ||
|
|
c5d45cb3f0 | ||
|
|
b9aca75c6f | ||
|
|
83afd6c429 | ||
|
|
389847bf2f | ||
|
|
e35de07e9e | ||
|
|
5e034e0b01 | ||
|
|
a480b1595e | ||
|
|
210f72effd | ||
|
|
0358d48454 | ||
|
|
77184086ab | ||
|
|
35f4d49289 | ||
|
|
e7e1156369 | ||
|
|
dcd9d627e2 | ||
|
|
b759e8a898 | ||
|
|
627f14460d | ||
|
|
abc2fd0c21 | ||
|
|
292818610e | ||
|
|
f3c92a7f74 | ||
|
|
88d70f7056 | ||
|
|
503ff60735 | ||
|
|
df3037ce8f | ||
|
|
50faac2f4f | ||
|
|
63dd04cc32 | ||
|
|
a6b1db6c79 | ||
|
|
def18ed292 | ||
|
|
29e5d2df79 | ||
|
|
cc997900c8 | ||
|
|
9e4a179899 | ||
|
|
9f6b62a342 | ||
|
|
4ded152850 | ||
|
|
884fb2faa9 | ||
|
|
19746d03d1 | ||
|
|
27c33865a6 | ||
|
|
5008ee4fc7 | ||
|
|
49fbc67d29 | ||
|
|
b5830d65f6 | ||
|
|
75e03b3793 | ||
|
|
672cb74c9a | ||
|
|
f121d2641f | ||
|
|
fd90a3c137 | ||
|
|
7f89d5b068 | ||
|
|
10664a3f38 | ||
|
|
ac68e37472 | ||
|
|
1499b23cb9 | ||
|
|
7e0450dd05 | ||
|
|
db59d134be | ||
|
|
6bbe5c1eb2 | ||
|
|
1c015b6cde | ||
|
|
f3eb155241 | ||
|
|
b1f08386ad | ||
|
|
0d9a5f54c2 | ||
|
|
0a3faa8b12 | ||
|
|
3f2715b53c | ||
|
|
9125e3e7f2 | ||
|
|
4df95a63f2 | ||
|
|
7ec952d432 | ||
|
|
6922b1b34c | ||
|
|
b48de42683 | ||
|
|
38e740bf43 | ||
|
|
0f53c8eba6 | ||
|
|
fd35c77b63 | ||
|
|
d5674ec982 | ||
|
|
577a80f8bc | ||
|
|
7a69073a8c | ||
|
|
9b91624038 | ||
|
|
d3375305d3 | ||
|
|
c720e20612 | ||
|
|
57d38e3d84 | ||
|
|
44ab535148 | ||
|
|
ed74a0e3d2 | ||
|
|
4eef8b4b0d | ||
|
|
e1d1065156 | ||
|
|
fd293220f5 | ||
|
|
045ed9f2f1 | ||
|
|
c78cb554cd | ||
|
|
d554d2eac6 | ||
|
|
e720cb1f3b | ||
|
|
29ad71cd78 | ||
|
|
42e4524c44 | ||
|
|
18cd4bbc25 | ||
|
|
ab54c8ed65 | ||
|
|
313a6681b9 | ||
|
|
f24f260200 | ||
|
|
fdabe46603 | ||
|
|
30aea18914 | ||
|
|
827dcbaee6 | ||
|
|
e7c22b1311 | ||
|
|
396d42c44d | ||
|
|
64d5e97771 | ||
|
|
9b2e490b30 | ||
|
|
aea9e8f707 | ||
|
|
a64dd3ccd8 | ||
|
|
c442661fbd | ||
|
|
268d5eba7c | ||
|
|
beccb0f6db | ||
|
|
7ba196cbb9 | ||
|
|
df9c77bd06 | ||
|
|
bc7843b337 | ||
|
|
c33c53348b | ||
|
|
2caf827d2e | ||
|
|
80ab62225c | ||
|
|
c70b4a6237 | ||
|
|
708a94c99d | ||
|
|
198c3ea5c8 | ||
|
|
b7beb137e0 | ||
|
|
b78b334426 | ||
|
|
e8875e171f | ||
|
|
4cdc1fd841 | ||
|
|
b4e165fbb5 | ||
|
|
534b59d702 | ||
|
|
2d91c1c57d | ||
|
|
78b5f12272 | ||
|
|
c1dade3c3f | ||
|
|
42f32bdac1 | ||
|
|
25a03359e9 | ||
|
|
1bcc755706 | ||
|
|
33cd8dc262 | ||
|
|
c0b73e702b | ||
|
|
81d3f66232 | ||
|
|
3549a6eaf7 | ||
|
|
eea8d4e9d1 | ||
|
|
0c2a91c9f7 | ||
|
|
e8388502ed | ||
|
|
8a018d0063 | ||
|
|
cf6fc83127 | ||
|
|
0ad6f69b9c | ||
|
|
4f1dd4be36 | ||
|
|
e611453c21 | ||
|
|
47b9755b4b | ||
|
|
01550df79d | ||
|
|
37c3a9e180 | ||
|
|
cd791d84b0 | ||
|
|
fb68ab2f87 | ||
|
|
22ef87ad80 | ||
|
|
1a38d502a2 | ||
|
|
ae024b2ea7 | ||
|
|
e80d1e731c | ||
|
|
3a1f99ff86 | ||
|
|
79b8b17328 | ||
|
|
a92fd87906 | ||
|
|
ca3f38f31d | ||
|
|
79696f8b47 | ||
|
|
e394e30789 | ||
|
|
4e9cc28dc4 | ||
|
|
87cca72287 | ||
|
|
80e4d73317 | ||
|
|
95e7452d66 | ||
|
|
af49f70dd4 | ||
|
|
cb22ea7541 | ||
|
|
466b08abc7 | ||
|
|
9eb2d25c3f | ||
|
|
d067bed510 | ||
|
|
1246035bbd | ||
|
|
d90f909c00 | ||
|
|
758f13fc2b | ||
|
|
84792f1bbd | ||
|
|
dd4d887489 | ||
|
|
b6e7a0be4f | ||
|
|
38db378f0d | ||
|
|
4c14f6f93d | ||
|
|
257bdac9c7 | ||
|
|
e361365078 | ||
|
|
19a765feb9 | ||
|
|
4566fae6e1 | ||
|
|
686e6c0300 | ||
|
|
3750629750 | ||
|
|
963c9d8a0e | ||
|
|
576e7cb3ad | ||
|
|
dfd85d0175 | ||
|
|
a151a381f0 | ||
|
|
36cdfc3112 | ||
|
|
ec4c4239f4 | ||
|
|
f17987410e | ||
|
|
685b223728 | ||
|
|
aab066aa64 | ||
|
|
82e4b97e03 | ||
|
|
a66e007d50 | ||
|
|
9f362e89d6 | ||
|
|
d56b825bdd | ||
|
|
e41243cd2f | ||
|
|
4a5867d944 | ||
|
|
b84729158f | ||
|
|
3932bcf6a4 | ||
|
|
fba63d84ea | ||
|
|
adadddb611 | ||
|
|
3324c90747 | ||
|
|
6786f1f754 | ||
|
|
e781805381 | ||
|
|
f4f94f4f85 | ||
|
|
a32416c64e | ||
|
|
7d32b716c4 | ||
|
|
90f068290b | ||
|
|
8b053f8b97 | ||
|
|
27024f0be0 | ||
|
|
4798cdef28 | ||
|
|
6d08bd413e | ||
|
|
1edcc74fd4 | ||
|
|
2295b6ad58 | ||
|
|
b8103f0e7c | ||
|
|
272cfdb30a | ||
|
|
73be668fc1 | ||
|
|
1ef840cd02 | ||
|
|
df2a2c41c4 | ||
|
|
788839cc56 | ||
|
|
8c79115af9 | ||
|
|
0d904c242a | ||
|
|
ba7e061a23 | ||
|
|
5114cd1f47 | ||
|
|
a4442eef5e | ||
|
|
c7c1214e43 | ||
|
|
0e60a2f323 | ||
|
|
33a58c88f6 | ||
|
|
28876851e7 | ||
|
|
b23e49a11b | ||
|
|
b891b13fc1 | ||
|
|
973ec3ddef | ||
|
|
5d95b6fad1 | ||
|
|
ebdfcc3e56 | ||
|
|
45bbc0b368 | ||
|
|
28a89d012e | ||
|
|
0570558293 | ||
|
|
d64cf914e2 | ||
|
|
5b59d0ebe0 | ||
|
|
d31407e063 | ||
|
|
25e42e316d | ||
|
|
9d8ab73c29 | ||
|
|
2eb8e76000 | ||
|
|
796d066a6c | ||
|
|
d2635919f6 | ||
|
|
80184b6d2e | ||
|
|
0de05a8532 | ||
|
|
3157df712b | ||
|
|
b0c1451fad | ||
|
|
d2615078db | ||
|
|
9db04e37ba | ||
|
|
e9f862658f | ||
|
|
993ddb8790 | ||
|
|
2e16d90cf5 | ||
|
|
d56ec6855f | ||
|
|
26c58ea965 | ||
|
|
7003e1d8dd | ||
|
|
d977e3a5a8 | ||
|
|
5f6aa78bd6 | ||
|
|
ea9d458356 | ||
|
|
4badc46160 | ||
|
|
5d109c271d | ||
|
|
bf53bac167 | ||
|
|
62c9921beb | ||
|
|
06fb9f9266 | ||
|
|
5765014072 | ||
|
|
6037109eee | ||
|
|
5070e3454b | ||
|
|
7fc57c4ada | ||
|
|
6fd070aa3e | ||
|
|
216bfad7d3 | ||
|
|
2aac12ab24 | ||
|
|
2ab52b7d8c | ||
|
|
8eb1c54e69 | ||
|
|
1013a47a37 | ||
|
|
32b123123a | ||
|
|
6e178fe3ec | ||
|
|
fbf3bce170 | ||
|
|
2a2698d4ba | ||
|
|
4638b624b0 | ||
|
|
c0cd4e18dc | ||
|
|
d345ee19a3 | ||
|
|
90ffa7b2d1 | ||
|
|
daf330944a | ||
|
|
869f43c9af | ||
|
|
a5d1ed4dec | ||
|
|
4e30c1ed9b | ||
|
|
1b3b3b61e0 | ||
|
|
6f4bc49014 | ||
|
|
d7ea3162e2 | ||
|
|
ebf1589eab | ||
|
|
66a5a3ec3d | ||
|
|
daa3eb8bad | ||
|
|
e50f56ea44 | ||
|
|
8dc645345b | ||
|
|
fc136169c4 | ||
|
|
2c3ece8c39 | ||
|
|
13345ed9e4 | ||
|
|
0752f06abf | ||
|
|
859f88dc01 | ||
|
|
a156fcff67 | ||
|
|
6c7db911cf | ||
|
|
0633aead5c | ||
|
|
c1afec7546 | ||
|
|
2ac532b604 | ||
|
|
4948e22858 | ||
|
|
8272d1dc13 | ||
|
|
99f69a24c7 | ||
|
|
8b2754ab0a | ||
|
|
e5511a1b03 | ||
|
|
2444587978 | ||
|
|
e5d3e2872c | ||
|
|
726834e7c7 | ||
|
|
c6128ffc96 | ||
|
|
24a89fcd96 | ||
|
|
be940800a5 | ||
|
|
d5e0db2a2a | ||
|
|
c7bbfcb49a | ||
|
|
f5fc9a9a50 | ||
|
|
4f8c4f4f3f | ||
|
|
2dd7f03c93 | ||
|
|
75c2936c6c | ||
|
|
c301b4ce0d | ||
|
|
ced478fdca | ||
|
|
cfe0f5dd68 | ||
|
|
4f9bca11f4 | ||
|
|
2f824e1be2 | ||
|
|
900d5eb327 | ||
|
|
a29df33b95 | ||
|
|
0471bcb75f | ||
|
|
dadaa040b4 | ||
|
|
3aa88f01da | ||
|
|
f7f3287379 | ||
|
|
2f29279c97 | ||
|
|
0c31599d19 | ||
|
|
5d87186127 | ||
|
|
54efa67c9c | ||
|
|
c315f1feef | ||
|
|
7bf9b0d245 | ||
|
|
e606fd5101 | ||
|
|
8b3c8910e1 | ||
|
|
c793cd2c2f | ||
|
|
dae98d3fd4 | ||
|
|
b6ca4ae39d | ||
|
|
8b9a34d5b6 | ||
|
|
d6037100de | ||
|
|
17fc4188d7 | ||
|
|
7683c15f8d | ||
|
|
ce0125a302 | ||
|
|
ba1adec98f | ||
|
|
a4e00bab11 | ||
|
|
fa4633a1ef | ||
|
|
017914cb18 | ||
|
|
da4fa7bae9 | ||
|
|
178b33545f | ||
|
|
f726fb7294 | ||
|
|
66e1af371c | ||
|
|
b7bca38126 | ||
|
|
83dd0e6174 | ||
|
|
6a6cdd1a32 | ||
|
|
24d6947d36 | ||
|
|
943ce362e5 | ||
|
|
c068cb2d72 | ||
|
|
7be103ef65 | ||
|
|
0a91fa3e01 | ||
|
|
e69e3c6756 | ||
|
|
9695d7b84e | ||
|
|
5cfcd397a4 | ||
|
|
34cedb77f3 | ||
|
|
95d81ac9f8 | ||
|
|
bf74302662 | ||
|
|
26da36faa8 | ||
|
|
d760d301cb | ||
|
|
6af5ea6c8c | ||
|
|
a645b491be | ||
|
|
5fe7dbdaf1 | ||
|
|
e9c2ca4ff5 | ||
|
|
f703a9093b | ||
|
|
8eb3d835f5 | ||
|
|
bb8082739a | ||
|
|
7b4f5766fb | ||
|
|
52a40b00f2 | ||
|
|
85823c45ff | ||
|
|
d6b573914e | ||
|
|
9ff6457124 | ||
|
|
d5a521c2fd | ||
|
|
61a4311bb4 | ||
|
|
1d5099eed0 | ||
|
|
ef3655f318 | ||
|
|
1e27fd1de0 | ||
|
|
d3a8560dec | ||
|
|
faee98e2ab | ||
|
|
c321034d69 | ||
|
|
aea3e978b0 | ||
|
|
b3849826e3 | ||
|
|
8fd1030556 | ||
|
|
1164595d85 | ||
|
|
6357611caa | ||
|
|
6eb8745897 | ||
|
|
4f1a68363a | ||
|
|
c22f1338ce | ||
|
|
1e0f3c5c9d | ||
|
|
7d55dbd3a1 | ||
|
|
3bd1eee1bb | ||
|
|
2c98c7855f | ||
|
|
f8d46316c4 | ||
|
|
8b05b3ae8d | ||
|
|
7c55c818e3 | ||
|
|
733b050ad8 | ||
|
|
1de839406d | ||
|
|
39a383b246 | ||
|
|
991ebf2d5f | ||
|
|
1090ecb6d6 | ||
|
|
fcea0470ad | ||
|
|
0136734f73 | ||
|
|
e372a32857 | ||
|
|
0fb705b775 | ||
|
|
10debca24f | ||
|
|
46d401ea1a | ||
|
|
835d8368a9 | ||
|
|
b0fb856843 | ||
|
|
22dc7a774c | ||
|
|
26540757dc | ||
|
|
2495bbd97f | ||
|
|
0caf35299a | ||
|
|
2793ecf07d | ||
|
|
4b688776d2 | ||
|
|
226205413a | ||
|
|
62f4f9c75f | ||
|
|
ddb15dbdc1 | ||
|
|
a28b75a50b | ||
|
|
805f6d48f3 | ||
|
|
1852c939b5 | ||
|
|
63d147131f | ||
|
|
5bac00777e | ||
|
|
ac38f35c68 | ||
|
|
b8409025f3 | ||
|
|
32e8447daa | ||
|
|
94f40cd337 | ||
|
|
1bc5ba612c | ||
|
|
74f35535e8 | ||
|
|
92632251a7 | ||
|
|
6b4a7479e4 | ||
|
|
02e23d2ab5 | ||
|
|
d33c8390e7 | ||
|
|
a4f5ab0e5b | ||
|
|
2a2ef3781d | ||
|
|
e959765710 | ||
|
|
12faa5b099 | ||
|
|
323484f4d5 | ||
|
|
dad8168f02 | ||
|
|
2f29c80bd1 | ||
|
|
f0acdf1303 | ||
|
|
37ea7f735e | ||
|
|
95d85d43c1 | ||
|
|
187fcbdd45 | ||
|
|
c8dd0cacff | ||
|
|
280c6b26d7 | ||
|
|
f0cfec5386 | ||
|
|
f3a375fd40 | ||
|
|
85bc313b89 | ||
|
|
b4f645e126 | ||
|
|
8ca0c05a1f | ||
|
|
ddfbb0a5fe | ||
|
|
3e5ae891e2 | ||
|
|
2743f4b3a4 | ||
|
|
94fa880ff4 | ||
|
|
9fb55f539f | ||
|
|
120badb432 | ||
|
|
9e9bc84333 | ||
|
|
a75e3e89a1 | ||
|
|
8ead73d8f5 | ||
|
|
314359935b | ||
|
|
b5c85c7e5e | ||
|
|
a4c7680f4b | ||
|
|
71905eabe2 | ||
|
|
f47a79778a | ||
|
|
297768b947 | ||
|
|
88290c4ecc | ||
|
|
16cace9533 | ||
|
|
158476c84c | ||
|
|
7f08741f40 | ||
|
|
ff90501e82 | ||
|
|
66b9843466 | ||
|
|
046d628a42 | ||
|
|
d525e8a10f | ||
|
|
04edc7011e | ||
|
|
4da3e39e4a | ||
|
|
c675ed3a92 | ||
|
|
5982f65852 | ||
|
|
99df705ba2 | ||
|
|
66f6ce4d2a | ||
|
|
be7ef9fbd9 | ||
|
|
786df087d4 | ||
|
|
d80dca45c5 | ||
|
|
5e392b9330 | ||
|
|
22036f00e8 | ||
|
|
70bcb9580f | ||
|
|
ad21aa8eb1 | ||
|
|
d1ffdb6704 | ||
|
|
3b653289f5 | ||
|
|
ce6c9e9f57 | ||
|
|
89fd47fc7b | ||
|
|
25d29311dd | ||
|
|
9850c4a0c6 | ||
|
|
cc6fefc49e | ||
|
|
c940c88f9b | ||
|
|
56dcdbeacd | ||
|
|
6f4be89322 | ||
|
|
e87704fe52 | ||
|
|
bde8c178f4 | ||
|
|
8366600a5d | ||
|
|
fefe33ad75 | ||
|
|
8f91a04145 | ||
|
|
1bf9e599ee | ||
|
|
914920d2dd | ||
|
|
cbdb422398 | ||
|
|
6121a6d7f9 | ||
|
|
57e5992875 | ||
|
|
9985a98942 | ||
|
|
f26b4c2dad | ||
|
|
82f0751702 | ||
|
|
5afcc26061 | ||
|
|
a5d6f1b71e | ||
|
|
4365c94a00 | ||
|
|
87edcc043d | ||
|
|
c9c0aeaca7 | ||
|
|
b3840ad8db | ||
|
|
e7d49e00d8 | ||
|
|
f24f089794 | ||
|
|
71540e4b68 | ||
|
|
b503fb38f0 | ||
|
|
e75c45293d | ||
|
|
433a779d95 | ||
|
|
6ee7c5beb2 | ||
|
|
862e3e3e86 | ||
|
|
b30a6133b3 | ||
|
|
2ccf2b9b20 | ||
|
|
3261971bf7 | ||
|
|
99ebe22860 | ||
|
|
bdbfcc817c | ||
|
|
a82db0a1b2 | ||
|
|
a6a6a9902d | ||
|
|
cc2ef4243b | ||
|
|
bed333a2e8 | ||
|
|
099e41b9c8 | ||
|
|
6ccd5bd2f1 | ||
|
|
63d2669a09 | ||
|
|
8d1dbd1b06 | ||
|
|
2f7853f552 | ||
|
|
55938d0d24 | ||
|
|
18574aaa3e | ||
|
|
977517f8ab | ||
|
|
5ca8680d98 | ||
|
|
3abeccf920 | ||
|
|
a1c246e8bf | ||
|
|
2834cb729c | ||
|
|
4185c233b3 | ||
|
|
aee40b84ea | ||
|
|
cbfe9e1209 | ||
|
|
df4ec3183b | ||
|
|
bd7f067d1c | ||
|
|
fce478ed64 | ||
|
|
8145c17dda | ||
|
|
16d36a670e | ||
|
|
69c59eddc3 | ||
|
|
605b0060ef | ||
|
|
ac9926488a | ||
|
|
997832281a | ||
|
|
61d3acacac | ||
|
|
b503ffe392 | ||
|
|
23ba403fd8 | ||
|
|
79d58631cb | ||
|
|
f52d5d8d5a | ||
|
|
1227055ffc | ||
|
|
ece93f2135 | ||
|
|
5787e13f0c | ||
|
|
66e827727f | ||
|
|
0eae061db8 | ||
|
|
c7ddbaa0d1 | ||
|
|
79020fea65 | ||
|
|
f712e1ee70 | ||
|
|
0514361d30 | ||
|
|
b60906915c | ||
|
|
42819693c0 | ||
|
|
81b1c5a738 | ||
|
|
552b6b6e1d | ||
|
|
fa06764299 | ||
|
|
53f361570e | ||
|
|
69cf9adceb | ||
|
|
db550bef7a | ||
|
|
537c9b8563 | ||
|
|
c17cb6e0ba | ||
|
|
4bb99377ed | ||
|
|
5995f20582 | ||
|
|
91766a4fe2 | ||
|
|
8f0c678f09 | ||
|
|
2e32d102de | ||
|
|
b710b0925f | ||
|
|
c07b8c5740 | ||
|
|
304be02a24 | ||
|
|
2aa2f6ed2b | ||
|
|
c7a229fe8a | ||
|
|
d304bf3673 | ||
|
|
9b76822a1c | ||
|
|
c9757544cb | ||
|
|
6c073a672a | ||
|
|
94d185a423 | ||
|
|
34cc867eff | ||
|
|
f324612e53 | ||
|
|
a0d1ce3fc8 | ||
|
|
6e4f3c4875 | ||
|
|
8e6f322760 | ||
|
|
928a548a38 | ||
|
|
21fb258903 | ||
|
|
412133e558 | ||
|
|
4186fac706 | ||
|
|
4994f03ff4 | ||
|
|
6c14a20679 | ||
|
|
8f50c4295b | ||
|
|
60fdf78534 | ||
|
|
135c795ed7 | ||
|
|
58552862f2 | ||
|
|
41dce98191 | ||
|
|
537da88983 | ||
|
|
3aebd10bf9 | ||
|
|
dd8176d34e | ||
|
|
612b9f30ee | ||
|
|
a031a59b19 | ||
|
|
316562ef7b | ||
|
|
0eefff8eef | ||
|
|
270dcf7cb3 | ||
|
|
105cb7c020 | ||
|
|
ca7db1e5e6 | ||
|
|
67bb9a21ca | ||
|
|
9160dbe203 | ||
|
|
5666455316 | ||
|
|
018718e340 | ||
|
|
34695c333b | ||
|
|
d55e7c952b | ||
|
|
8e1b3f9571 | ||
|
|
17bba97219 | ||
|
|
550af617b5 | ||
|
|
dc4b30ec12 | ||
|
|
7bea84d7d2 | ||
|
|
37e073868f | ||
|
|
40abe3a192 | ||
|
|
9620a6be4c | ||
|
|
8f82dc8403 | ||
|
|
16f869f22c | ||
|
|
a517b99294 | ||
|
|
1fcb7095dd | ||
|
|
0f3abbddb2 |
No files matched your search
@@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # See documentation for possible values
|
||||
directory: "/Client" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
@@ -3,6 +3,8 @@ name: Publish Docker image
|
||||
on:
|
||||
push:
|
||||
branches: [master, develop]
|
||||
release:
|
||||
types: [published, created, edited]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
@@ -19,12 +21,15 @@ jobs:
|
||||
run: |
|
||||
REGISTRY="ghcr.io"
|
||||
IMAGE="${REGISTRY}/${{ steps.repository.outputs.lowercase }}"
|
||||
TAGS="${IMAGE}:${{ github.sha }}"
|
||||
if [[ $GITHUB_REF == refs/heads/master ]]; then
|
||||
TAGS="${TAGS},${IMAGE}:latest"
|
||||
fi
|
||||
if [[ $GITHUB_REF == refs/heads/develop ]]; then
|
||||
TAGS="${TAGS},${IMAGE}:develop"
|
||||
TAGS="${IMAGE}:${{ github.sha }},${IMAGE}:latest"
|
||||
REF=${GITHUB_REF,,}
|
||||
PREFIX="$(dirname $REF)"
|
||||
SUFFIX="$(basename $REF)"
|
||||
if [[ $PREFIX = "refs/heads" ]]; then
|
||||
TAGS="${TAGS},${IMAGE}:${SUFFIX}"
|
||||
elif [[ $PREFIX = "refs/tags" ]]; then
|
||||
RELEASE=${SUFFIX#"superalgos-"}
|
||||
TAGS="${TAGS},${IMAGE}:${RELEASE}"
|
||||
fi
|
||||
echo ::set-output name=tags::${TAGS}
|
||||
- name: Login in to registry
|
||||
@@ -33,9 +38,17 @@ jobs:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ github.token }}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
- name: Available platforms
|
||||
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||
- name: Push to registry
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
push: true
|
||||
file: ./Docker/Dockerfile
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
+6
-1
@@ -1,13 +1,18 @@
|
||||
Data-Storage
|
||||
Log-Files
|
||||
My-Workspaces
|
||||
My-Social-Trading-Data
|
||||
My-Network-Nodes-Data
|
||||
My-Secrets
|
||||
debug.log
|
||||
.DS_Store
|
||||
*.db
|
||||
Projects/Superalgos/Icons/Thumbs.db
|
||||
Projects/Foundations/Icons/Thumbs.db
|
||||
*.bat
|
||||
!launch-windows.bat
|
||||
!create-shortcut-windows.bat
|
||||
!uninstall-shortcut-windows.bat
|
||||
*.exe
|
||||
node_modules
|
||||
launch.json
|
||||
.idea
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos\\Platform"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
Vendored
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos\\TaskServer"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
Vendored
+5
-2
@@ -4,13 +4,16 @@
|
||||
"**/Documentation": true,
|
||||
"**/Log-Files": true,
|
||||
"**/node_modules": true,
|
||||
"**/Deprecated-Code": true
|
||||
"**/Deprecated-Code": true,
|
||||
"**/My-Social-Trading-Data": true,
|
||||
},
|
||||
"search.exclude": {
|
||||
"**/Data-Storage": true,
|
||||
"**/Documentation": true,
|
||||
"**/Log-Files": true,
|
||||
"**/Deprecated-Code": true
|
||||
"**/node_modules": true,
|
||||
"**/Deprecated-Code": true,
|
||||
"**/My-Social-Trading-Data": true
|
||||
},
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
@@ -1,199 +0,0 @@
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Superalgos</title>
|
||||
<meta name="description" content="Free and Open Source Crypto Trading Tools">
|
||||
<link rel="stylesheet" href="main.css" type="text/css" charset="utf-8" />
|
||||
<link rel="stylesheet" href="credits.css" type="text/css" charset="utf-8" />
|
||||
<link rel="stylesheet" href="tutorial.css" type="text/css" charset="utf-8" />
|
||||
<link rel="stylesheet" href="docs.css" type="text/css" charset="utf-8" />
|
||||
<link rel="stylesheet" href="context-menu.css" type="text/css" charset="utf-8" />
|
||||
<link rel="stylesheet" href="font-awasome.css" type="text/css" />
|
||||
<link rel="stylesheet" href="prism.css" type="text/css" />
|
||||
<link rel="shortcut icon" type="image/png/ico" href="Images/favicon.ico" />
|
||||
<script type="text/javascript" src="WebServer/require.js"></script>
|
||||
<script type="text/javascript" src="AppPreLoader.js"></script>
|
||||
<script src="externalScripts/CCapture.all.min.js"></script>
|
||||
<script src="externalScripts/prism.js"></script>
|
||||
|
||||
<!-- Documentation Style Sheets -->
|
||||
<!-- -->
|
||||
|
||||
<script type="text/javascript">
|
||||
function loadCanvas() {
|
||||
// Prevent click-jacking
|
||||
try {
|
||||
if (window == window.top || window.chrome && chrome.app && chrome.app.window) {
|
||||
document.documentElement.style.display = 'block'
|
||||
} else {
|
||||
top.location = self.location
|
||||
}
|
||||
} catch (e) { console.error('CJ protection', e) }
|
||||
|
||||
try {
|
||||
loadSuperalgos();
|
||||
} catch (err) {
|
||||
console.log("[ERROR] UI can not be started. Please check that WebServer is running.", err);
|
||||
}
|
||||
}
|
||||
|
||||
function onResize() {
|
||||
try {
|
||||
if (canvas === undefined) { return }
|
||||
if (canvas.eventHandler === undefined) { return }
|
||||
if (DISABLE_BROWSER_RESIZE_EVENT === true) { return }
|
||||
canvas.eventHandler.raiseEvent('Browser Resized')
|
||||
} catch (err) {
|
||||
console.log('Error Resizing. ' + err.stack)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body id="body" onload="loadCanvas()"
|
||||
style="overflow:hidden; background: url(Images/superalgos-platform.jpg); background-size: cover;"
|
||||
onresize="onResize()">
|
||||
<div id="contributors" class="credits">
|
||||
<p style="font-size: 120%;">Superalgos is <span class="credits-red">open source</span>, <span class="credits-red">forever free</span> for <span class="credits-red">everyone</span>, and is <span class="credits-red">constantly improving</span> thanks to the involvement of contributors:</p>
|
||||
<p style="font-size: 100%;">Luis Fernando Molina, Julian Molina, Andreja Cobeljic, Ira Miller, matbenitez, bearcanrun, nikolabjelo, 9808us, pmmax, suttridge, Basalt09, Mhnramin, 0xperez, infin1t3, benitezme, whtv, cozed-gh, Eduardo678-dotcom, Smidy13, teehanming, 64bittuning, joenij, apronotti, Noeljarillo, ssplatt, rico4dev, DougJCook, mane, Cordo-van-Saviour, CarnivalBen, Sil3ntLight, pisukesoramame, Edodi, harrellbm, CaptainJeff, Jeff Braun, Francisco J. Santillán, Norman, Viktoria B., Guillermo V., Daniel J., Javier A., Gustavo J., Romina GS, Pedro P., Thais M., Andrey M., Loui M., Natalia M., Bashar A., Carlos V., Diego M., Sebastian E., Bogdan P., Marko V., Igor S., Niksa K., Rodrigo M., Nicanor M., Mateo H., Lan T., Leon A., Uroš R., Filip M., Vladimir J. and Pavle B.</p>
|
||||
<p style="font-size: 120%;">Please, <span class="credits-red">give a star to the Superalgos repo at GitHub.com...</span> It helps other devs find the project!</p>
|
||||
<p id="credits-page-status-paragraph" class="credits-yellow">The UI is loading...</p>
|
||||
</div>
|
||||
<div id="masterApp"></div>
|
||||
<div id="canvasApp"></div>
|
||||
<div id="docs-space-div" class="docs-page" style="position:fixed; top:100000px; left:100000px"><div id="docs-content-div"></div></div>
|
||||
<div id="chatApp" style="position:fixed; top:100000px; left:100000px">
|
||||
<iframe id="chatIFrame" style="border:none; " height="2000" width="900"></iframe>
|
||||
</div>
|
||||
<div id="textAreaDiv"></div>
|
||||
<div id="inputDiv" style="font-family:saira condensed;"> </div>
|
||||
|
||||
<!-- Tutorial Template Divs -->
|
||||
<div id="tutorialDiv" class="tutorial-step" style="position:fixed; top:100000px; left:100000px;"></div>
|
||||
<div id="tutorialFormDiv" class="tutorial-form" style="position:fixed; top:100000px; left:100000px;">
|
||||
<form>
|
||||
<table class="tutorial-buttonsTable">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<label class="tutorial-font-small tutorial-stop-button"
|
||||
onclick="UI.projects.superalgos.spaces.tutorialSpace.stop()"
|
||||
value=""> Stop </label>
|
||||
</td>
|
||||
<td align="center">
|
||||
<label class="tutorial-font-small tutorial-skip-button"
|
||||
onclick="UI.projects.superalgos.spaces.tutorialSpace.skip()"
|
||||
value=""> Skip </label>
|
||||
</td>
|
||||
<td align="center">
|
||||
<label class="tutorial-font-small tutorial-previous-button"
|
||||
onclick="UI.projects.superalgos.spaces.tutorialSpace.previous()" value="">Previous</label>
|
||||
</td>
|
||||
<td align="center">
|
||||
<label class="tutorial-font-small tutorial-next-button"
|
||||
onclick="UI.projects.superalgos.spaces.tutorialSpace.next()"
|
||||
value=""> Next </label>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="menu" class="docs-menu-table">
|
||||
<div class="menu-row">
|
||||
<div class="menu-item" onClick="window.contextMenu.editParagraph()">
|
||||
<img src="Icons/Superalgos/docs-action-edit-paragraph.png" class="menu-img" title="Edit">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toTitle()">
|
||||
<img src="Icons/Superalgos/docs-title-style.png" class="menu-img" title="Title">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toSubtitle()">
|
||||
<img src="Icons/Superalgos/docs-subtitle-style.png" class="menu-img" title="Subtitle">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toNote()">
|
||||
<img src="Icons/Superalgos/docs-note-style.png" class="menu-img" title="Note">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toJavascript()">
|
||||
<img src="Icons/Superalgos/docs-js-code-style.png" class="menu-img" title="Javascript">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toYouTubeVideo()">
|
||||
<img src="Icons/Superalgos/docs-youtube-video-style.png" class="menu-img" title="Youtube">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toBlock()">
|
||||
<img src="Icons/Superalgos/docs-block-style.png" class="menu-img" title="Block">
|
||||
</div>
|
||||
</div>
|
||||
<div class="menu-row">
|
||||
<div class="menu-item" onClick="window.contextMenu.copyLink()">
|
||||
<img src="Icons/Superalgos/docs-action-copy-to-clipboard.png" class="menu-img" title="Copy">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toText()">
|
||||
<img src="Icons/Superalgos/docs-text-style.png" class="menu-img" title="Text">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toList()">
|
||||
<img src="Icons/Superalgos/docs-list-style.png" class="menu-img" title="List">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toSuccess()">
|
||||
<img src="Icons/Superalgos/docs-success-style.png" class="menu-img" title="Success">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toJson()">
|
||||
<img src="Icons/Superalgos/docs-json-code-style.png" class="menu-img" title="Json">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toGif()">
|
||||
<img src="Icons/Superalgos/docs-gif-style.png" class="menu-img" title="Gif">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toInclude()">
|
||||
<img src="Icons/Superalgos/docs-include-style.png" class="menu-img" title="Include">
|
||||
</div>
|
||||
</div>
|
||||
<div class="menu-row">
|
||||
<div class="menu-item" onClick="window.contextMenu.toPlaceholder()">
|
||||
<img src="Icons/Superalgos/docs-placeholder-style.png" class="menu-img" title="Placeholder">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toSummary()">
|
||||
<img src="Icons/Superalgos/docs-summary-style.png" class="menu-img" title="Summary">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toCallout()">
|
||||
<img src="Icons/Superalgos/docs-callout-style.png" class="menu-img" title="Callout">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toImportant()">
|
||||
<img src="Icons/Superalgos/docs-important-style.png" class="menu-img" title="Important">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toTable()">
|
||||
<img src="Icons/Superalgos/docs-table-style.png" class="menu-img" title="Table">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toPng()">
|
||||
<img src="Icons/Superalgos/docs-png-style.png" class="menu-img" title="Png">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toSection()">
|
||||
<img src="Icons/Superalgos/docs-section-style.png" class="menu-img" title="Section">
|
||||
</div>
|
||||
</div>
|
||||
<div class="menu-row">
|
||||
<div class="menu-item" onClick="window.contextMenu.deleteParagraph()">
|
||||
<img src="Icons/Superalgos/docs-action-delete-paragraph.png" class="menu-img" title="Delete">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toWebPageLink()">
|
||||
<img src="Icons/Superalgos/docs-web-page-link-style.png" class="menu-img" title="Link">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toAnchor()">
|
||||
<img src="Icons/Superalgos/docs-anchor-style.png" class="menu-img" title="Anchor">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toWarning()">
|
||||
<img src="Icons/Superalgos/docs-warning-style.png" class="menu-img" title="Warning">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toHierarchy()">
|
||||
<img src="Icons/Superalgos/docs-hierarchy-style.png" class="menu-img" title="Hierarchy">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toError()">
|
||||
<img src="Icons/Superalgos/docs-error-style.png" class="menu-img" title="Error">
|
||||
</div>
|
||||
<div class="menu-item" onClick="window.contextMenu.toChapter()">
|
||||
<img src="Icons/Superalgos/docs-chapter-style.png" class="menu-img" title="Chapter">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,54 +0,0 @@
|
||||
<h2 id="trading-engine">Trading Engine</h2>
|
||||
|
||||
<table class="definitionTable"><tr><td>
|
||||
|
||||
<img src="images/icons/nodes/png150/trading-engine.png" />
|
||||
|
||||
</td><td>
|
||||
|
||||
<strong>The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.</strong>
|
||||
|
||||
</td></tr></table>
|
||||
|
||||
<p>You will use this hierarchy for two main purposes:</p>
|
||||
|
||||
<p>The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>To let your trading systems:</strong> This allows strategies to keep track of and react to current and past events—including those involving the exchange, such as orders placed or filled—as the bot is running.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To keep track of the actions:</strong> By analyzing runtime information, you may gain a detailed understanding of what happens, when, and why, throughout a trading session.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.</p>
|
||||
|
||||
<div class="bs-callout bs-callout-success">Este callout se usa para resaltar una idea particularmente importante. Algo se sobresale, como una conclusion, o algo por el estilo.</div>
|
||||
|
||||
<p>The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.</p>
|
||||
|
||||
<div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> Esto es una nota, algo noteworthy.</div>
|
||||
|
||||
<div class="alert alert-success" role="alert"><i class="fa fa-check-square-o"></i> <b>Tip:</b> Esto es un tip.</div>
|
||||
|
||||
<div class="alert alert-warning" role="alert"><i class="fa fa-warning"></i> <b>Important:</b> Esto es algo importante.</div>
|
||||
|
||||
<div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-circle"></i> <b>Warning:</b> Esto es una aviso de alerta.</div>
|
||||
|
||||
<h4 id="adding-a-trading-engine-node">Adding a Trading Engine Node</h4>
|
||||
|
||||
<p>Calculo que con este segundo nivel de titulo alcanza.</p>
|
||||
|
||||
<h4 id="este-es-otro-formato-tipico-de-la-doc--trading-engine">Este es otro formato tipico de la doc: Trading Engine</h4>
|
||||
|
||||
<table class="definitionTable"><tr><td>
|
||||
|
||||
<img src="images/icons/nodes/png50/trading-engine.png" />
|
||||
|
||||
</td><td>
|
||||
|
||||
The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.
|
||||
|
||||
</td></tr></table>
|
||||
@@ -1,151 +0,0 @@
|
||||
|
||||
/* Load Environment Variables */
|
||||
let ENVIRONMENT = require('../Environment.js');
|
||||
let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
|
||||
global.env = ENVIRONMENT_MODULE
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
if (err.message && err.message.indexOf("EADDRINUSE") > 0) {
|
||||
console.log("A Superalgos Client cannot be started. Reason: the port " + port + " is already in use by another application.")
|
||||
return
|
||||
}
|
||||
console.log('[ERROR] Client -> client-> uncaughtException -> err.message = ' + err.message)
|
||||
console.log('[ERROR] Client -> client-> uncaughtException -> err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Client -> client-> uncaughtException -> err = ' + err)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('[ERROR] Client -> client-> unhandledRejection -> reason = ' + JSON.stringify(reason))
|
||||
console.log('[ERROR] Client -> client-> unhandledRejection -> p = ' + JSON.stringify(p))
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
/* Callbacks default responses. */
|
||||
|
||||
global.DEFAULT_OK_RESPONSE = {
|
||||
result: "Ok",
|
||||
message: "Operation Succeeded"
|
||||
};
|
||||
|
||||
global.DEFAULT_FAIL_RESPONSE = {
|
||||
result: "Fail",
|
||||
message: "Operation Failed"
|
||||
};
|
||||
|
||||
global.DEFAULT_RETRY_RESPONSE = {
|
||||
result: 'Retry',
|
||||
message: 'Retry Later'
|
||||
}
|
||||
|
||||
global.CUSTOM_OK_RESPONSE = {
|
||||
result: 'Ok, but check Message',
|
||||
message: 'Custom Message'
|
||||
}
|
||||
|
||||
global.CUSTOM_FAIL_RESPONSE = {
|
||||
result: 'Fail Because',
|
||||
message: 'Custom Message'
|
||||
}
|
||||
|
||||
/* Servers */
|
||||
let WEB_SERVER = require('./webServer.js')
|
||||
let DATA_FILE_SERVER = require('./dataFileServer.js')
|
||||
let PROJECT_FILE_SERVER = require('./projectFileServer.js')
|
||||
let UI_FILE_SERVER = require('./uiFileServer.js')
|
||||
let PLUGIN_SERVER = require('./pluginServer.js')
|
||||
let EVENT_SERVER = require('./eventServer.js')
|
||||
let TASK_MANAGER_SERVER = require('./taskManagerServer.js')
|
||||
let CCXT_SERVER = require('./ccxtServer.js')
|
||||
let WEB3_SERVER = require('./web3Server.js')
|
||||
|
||||
/* Network Interfaces */
|
||||
let WEB_SOCKETS_INTERFACE = require('./webSocketsServer.js')
|
||||
let HTTP_INTERFACE = require('./httpInterface.js')
|
||||
|
||||
try {
|
||||
console.log('CLIENT SERVERS:')
|
||||
console.log('')
|
||||
|
||||
WEB_SERVER = WEB_SERVER.newWebServer()
|
||||
WEB_SERVER.initialize()
|
||||
WEB_SERVER.run()
|
||||
console.log('Web Server .................................................. Started')
|
||||
|
||||
UI_FILE_SERVER = UI_FILE_SERVER.newUIFileServer()
|
||||
UI_FILE_SERVER.initialize()
|
||||
UI_FILE_SERVER.run()
|
||||
console.log('UI File Server .............................................. Started')
|
||||
|
||||
PROJECT_FILE_SERVER = PROJECT_FILE_SERVER.newProjectFileServer()
|
||||
PROJECT_FILE_SERVER.initialize()
|
||||
PROJECT_FILE_SERVER.run()
|
||||
console.log('Project File Server ......................................... Started')
|
||||
|
||||
PLUGIN_SERVER = PLUGIN_SERVER.newPluginServer()
|
||||
PLUGIN_SERVER.initialize()
|
||||
PLUGIN_SERVER.run()
|
||||
console.log('Plugin Server ............................................... Started')
|
||||
|
||||
DATA_FILE_SERVER = DATA_FILE_SERVER.newDataFileServer()
|
||||
DATA_FILE_SERVER.initialize()
|
||||
DATA_FILE_SERVER.run()
|
||||
console.log('Data File Server ............................................ Started')
|
||||
|
||||
EVENT_SERVER = EVENT_SERVER.newEventServer()
|
||||
EVENT_SERVER.initialize()
|
||||
EVENT_SERVER.run()
|
||||
console.log('Events Server ............................................... Started')
|
||||
|
||||
TASK_MANAGER_SERVER = TASK_MANAGER_SERVER.newTaskManagerServer(WEB_SOCKETS_INTERFACE, EVENT_SERVER)
|
||||
TASK_MANAGER_SERVER.initialize()
|
||||
TASK_MANAGER_SERVER.run()
|
||||
console.log('Task Manager Server ......................................... Started')
|
||||
|
||||
CCXT_SERVER = CCXT_SERVER.newCCXTServer()
|
||||
CCXT_SERVER.initialize()
|
||||
CCXT_SERVER.run()
|
||||
console.log('CCXT Server ................................................. Started')
|
||||
|
||||
WEB3_SERVER = WEB3_SERVER.newWeb3Server()
|
||||
WEB3_SERVER.initialize()
|
||||
WEB3_SERVER.run()
|
||||
console.log('WEB3 Server ................................................. Started')
|
||||
|
||||
console.log('')
|
||||
console.log('CLIENT INTERFACES:')
|
||||
console.log('')
|
||||
|
||||
WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface(EVENT_SERVER)
|
||||
WEB_SOCKETS_INTERFACE.initialize()
|
||||
WEB_SOCKETS_INTERFACE.run()
|
||||
console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface(WEB_SERVER, DATA_FILE_SERVER, PROJECT_FILE_SERVER, UI_FILE_SERVER, PLUGIN_SERVER, CCXT_SERVER, WEB3_SERVER)
|
||||
HTTP_INTERFACE.initialize()
|
||||
HTTP_INTERFACE.run()
|
||||
console.log('Http Interface .............................................. Listening at port ' + global.env.HTTP_INTERFACE_PORT)
|
||||
|
||||
console.log('')
|
||||
console.log("You are running Superalgos Beta 10")
|
||||
console.log('')
|
||||
console.log("What's new? The following was implemented here:")
|
||||
console.log('')
|
||||
console.log('Market Data Structure ....................................... This allows any strategy to use data from markets different from the one it is running at.')
|
||||
console.log('Exchange Data Structure ..................................... This allows any strategy to use data from exchanges and markets different from the one it is running at.')
|
||||
console.log('Tensor Flow Integration ..................................... This allows the creation and training of ML models that later can be used for predictions.')
|
||||
console.log('SA Token .................................................... This allows the project to compensate contributors that add value to it.')
|
||||
console.log('')
|
||||
console.log("What's next? At the development pipeline we have:")
|
||||
console.log('')
|
||||
console.log('Contribution Management ..................................... This will allow us to manage contributions at scale, and distribute the SA token more efficiently at each release.')
|
||||
console.log('Infraestructure to sensor any API .......................... This will allow us to fetch data from any API, turn it into indicators and plot it.')
|
||||
console.log('Usage of ML Predictions at Trading Systems .................. This will enable a new kind of Bot that can learn from data mined. Later that knowledge can be used at trading strategies.')
|
||||
console.log('Ethereum Integration ........................................ This will allow mining data from an Ethereum network node, create indicators with it, an use it on strategies.')
|
||||
|
||||
console.log('')
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Client -> Error = ' + err.stack)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "client",
|
||||
"version": "0.0.6",
|
||||
"description": "BackendServer",
|
||||
"main": "client.js",
|
||||
"author": {
|
||||
"name": "Luis-Fernando-Molina"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/rest": "^18.0.12",
|
||||
"ccxt": "^1.23.67",
|
||||
"child_process": "^1.0.2",
|
||||
"open": "^6.4.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"simple-git": "^2.31.0",
|
||||
"web3": "^1.3.0",
|
||||
"ws": "^7.4.6"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
exports.newDesktopApp = function newDesktopApp() {
|
||||
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
/*
|
||||
Heree we will store our running objects:
|
||||
*/
|
||||
DK.running = {}
|
||||
|
||||
/*
|
||||
This is the Web Sockets client that interacts with the Superalgos Network.
|
||||
*/
|
||||
DK.running.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
|
||||
await DK.running.socialGraph.initialize()
|
||||
|
||||
/*
|
||||
This is the Web Sockets client that interacts with the Superalgos Network.
|
||||
*/
|
||||
DK.running.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
|
||||
await DK.running.webSocketsClient.initialize()
|
||||
console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
/* These are the Network Interfaces by which the UI interacts with the Desktop App.*/
|
||||
|
||||
DK.running.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
|
||||
DK.running.webSocketsInterface.initialize()
|
||||
console.log('Desktop Client Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
|
||||
DK.running.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
|
||||
DK.running.httpInterface.initialize()
|
||||
console.log('Desktop Client Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
|
||||
|
||||
return
|
||||
|
||||
let queryMessage
|
||||
let query
|
||||
/*
|
||||
Test Query User Profiles.
|
||||
*/
|
||||
queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES,
|
||||
emitterUserProfileId: SA.secrets.map.get('Social Trading Desktop').userProfileId,
|
||||
initialIndex: 'Last',
|
||||
amountRequested: 10,
|
||||
direction: 'Past'
|
||||
}
|
||||
|
||||
query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(showProfiles)
|
||||
.catch(onError)
|
||||
|
||||
async function showProfiles(profiles) {
|
||||
console.log(profiles)
|
||||
|
||||
for (let i = 0; i < profiles.length; i++) {
|
||||
let profile = profiles[i]
|
||||
|
||||
/*
|
||||
Test Following Profiles.
|
||||
*/
|
||||
let eventMessage = {
|
||||
eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
|
||||
eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE,
|
||||
emitterUserProfileId: SA.secrets.map.get('Social Trading Desktop').userProfileId,
|
||||
targetUserProfileId: profile.userProfileId
|
||||
}
|
||||
|
||||
let event = {
|
||||
requestType: 'Event',
|
||||
eventMessage: JSON.stringify(eventMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(event)
|
||||
)
|
||||
.then(followAdded)
|
||||
.catch(onError)
|
||||
|
||||
function followAdded() {
|
||||
console.log("User Profile " + profile.userProfileHandle + " followed.")
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
Test Query User Profile Stats.
|
||||
*/
|
||||
queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS,
|
||||
emitterUserProfileId: SA.secrets.map.get('Social Trading Desktop').userProfileId,
|
||||
targetUserProfileId: SA.secrets.map.get('Social Trading Desktop').userProfileId
|
||||
}
|
||||
|
||||
query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(showProfilesStats)
|
||||
.catch(onError)
|
||||
|
||||
function showProfilesStats(profile) {
|
||||
console.log(profile)
|
||||
}
|
||||
|
||||
/*
|
||||
Error Handling
|
||||
*/
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Query not executed. ' + errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
/* Root objects*/
|
||||
let UI = {
|
||||
projects: {},
|
||||
schemas: { projectSchema: undefined },
|
||||
environment: undefined,
|
||||
running: {}
|
||||
}
|
||||
|
||||
let SA = { projects: {} }
|
||||
/*
|
||||
We will use this to load functions originally intended for Nodejs
|
||||
*/
|
||||
let exports = {}
|
||||
|
||||
@@ -0,0 +1,409 @@
|
||||
function newWebApp() {
|
||||
|
||||
let thisObject = {
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
|
||||
}
|
||||
|
||||
async function initialize() {
|
||||
try {
|
||||
setupRootObject(UI, 'UI')
|
||||
setupRootObject(SA, 'SA')
|
||||
await UI.projects.socialTrading.modules.webSocketsClient.initialize()
|
||||
loadWUserProfileTimeline()
|
||||
loadWhoToFollow()
|
||||
setupEventHandlers()
|
||||
} catch (err) {
|
||||
console.log('[ERROR] initialize -> err.stack = ' + err.stack)
|
||||
}
|
||||
}
|
||||
|
||||
function setupRootObject(rootObject, rootObjectName) {
|
||||
/*
|
||||
Here we will setup the UI object, with all the
|
||||
projects and spaces.
|
||||
*/
|
||||
for (let i = 0; i < UI.schemas.projectSchema.length; i++) {
|
||||
let projectDefinition = UI.schemas.projectSchema[i]
|
||||
rootObject.projects[projectDefinition.propertyName] = {}
|
||||
let projectInstance = rootObject.projects[projectDefinition.propertyName]
|
||||
|
||||
projectInstance.utilities = {}
|
||||
projectInstance.globals = {}
|
||||
projectInstance.functionLibraries = {}
|
||||
projectInstance.modules = {}
|
||||
|
||||
if (projectDefinition[rootObjectName] === undefined) { continue }
|
||||
|
||||
/* Set up Globals of this Project */
|
||||
if (projectDefinition[rootObjectName].globals !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].globals.length; j++) {
|
||||
let globalDefinition = projectDefinition[rootObjectName].globals[j]
|
||||
|
||||
if (exports[globalDefinition.functionName] === undefined) {
|
||||
projectInstance.globals[globalDefinition.propertyName] = eval(globalDefinition.functionName + '()')
|
||||
} else {
|
||||
projectInstance.globals[globalDefinition.propertyName] = eval('exports.' + globalDefinition.functionName + '()')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Utilities of this Project */
|
||||
if (projectDefinition[rootObjectName].utilities !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].utilities.length; j++) {
|
||||
let utilityDefinition = projectDefinition[rootObjectName].utilities[j]
|
||||
|
||||
if (exports[utilityDefinition.functionName] === undefined) {
|
||||
projectInstance.utilities[utilityDefinition.propertyName] = eval(utilityDefinition.functionName + '()')
|
||||
} else {
|
||||
projectInstance.utilities[utilityDefinition.propertyName] = eval('exports.' + utilityDefinition.functionName + '()')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Function Libraries of this Project */
|
||||
if (projectDefinition[rootObjectName].functionLibraries !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].functionLibraries.length; j++) {
|
||||
let functionLibraryDefinition = projectDefinition[rootObjectName].functionLibraries[j]
|
||||
|
||||
if (exports[functionLibraryDefinition.functionName] === undefined) {
|
||||
projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()')
|
||||
} else {
|
||||
projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval('exports.' + functionLibraryDefinition.functionName + '()')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Modules of this Project */
|
||||
if (projectDefinition[rootObjectName].modules !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].modules.length; j++) {
|
||||
let functionLibraryDefinition = projectDefinition[rootObjectName].modules[j]
|
||||
|
||||
if (exports[functionLibraryDefinition.functionName] === undefined) {
|
||||
projectInstance.modules[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()')
|
||||
} else {
|
||||
projectInstance.modules[functionLibraryDefinition.propertyName] = eval('exports.' + functionLibraryDefinition.functionName + '()')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function loadWUserProfileTimeline() {
|
||||
let queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.EVENTS,
|
||||
emitterUserProfileId: undefined,
|
||||
initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_LAST,
|
||||
amountRequested: 100,
|
||||
direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST
|
||||
}
|
||||
|
||||
let query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(addToContentDiv)
|
||||
.catch(onError)
|
||||
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Query not executed. ' + errorMessage)
|
||||
console.log('[ERROR] query = ' + JSON.stringify(query))
|
||||
}
|
||||
|
||||
function addToContentDiv(events) {
|
||||
try {
|
||||
let contentDiv = document.getElementById('content-div')
|
||||
|
||||
/*
|
||||
Delete al current content.
|
||||
*/
|
||||
while (contentDiv.childNodes.length > 4) {
|
||||
let childToRemove = contentDiv.childNodes[contentDiv.childNodes.length - 1]
|
||||
contentDiv.removeChild(childToRemove)
|
||||
}
|
||||
/*
|
||||
Render the timeline.
|
||||
*/
|
||||
for (let i = 0; i < events.length; i++) {
|
||||
let event = events[i]
|
||||
|
||||
let postDiv = document.createElement("div")
|
||||
postDiv.setAttribute("class", "post-div")
|
||||
let textNode
|
||||
|
||||
switch (event.eventType) {
|
||||
case SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST: {
|
||||
textNode = document.createTextNode(event.emitterUserProfile.userProfileHandle + " POSTED " + event.postText)
|
||||
break
|
||||
}
|
||||
case SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE: {
|
||||
textNode = document.createTextNode(event.emitterUserProfile.userProfileHandle + " FOLLOWED " + event.targetUserProfile.userProfileHandle)
|
||||
break
|
||||
}
|
||||
case SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE: {
|
||||
textNode = document.createTextNode(event.emitterUserProfile.userProfileHandle + " UNFOLLOWED " + event.targetUserProfile.userProfileHandle)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
postDiv.appendChild(textNode)
|
||||
contentDiv.appendChild(postDiv)
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
console.log('[ERROR] err.stack = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function loadWhoToFollow() {
|
||||
let queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES,
|
||||
emitterUserProfileId: undefined,
|
||||
initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST,
|
||||
amountRequested: 3,
|
||||
direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP
|
||||
}
|
||||
|
||||
let query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(addWhoToFollowTable)
|
||||
.catch(onError)
|
||||
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Query not executed. ' + errorMessage)
|
||||
console.log('[ERROR] query = ' + JSON.stringify(query))
|
||||
}
|
||||
|
||||
function addWhoToFollowTable(profiles) {
|
||||
|
||||
let contextCell = document.getElementById('who-to-follow-cell')
|
||||
let table = document.createElement("table")
|
||||
let tblBody = document.createElement("tbody")
|
||||
|
||||
for (let i = 0; i < profiles.length; i++) {
|
||||
let profile = profiles[i]
|
||||
let row = document.createElement("tr")
|
||||
|
||||
let cell = document.createElement("td")
|
||||
addProfileToFollowTable(cell, profile)
|
||||
row.appendChild(cell)
|
||||
|
||||
tblBody.appendChild(row)
|
||||
}
|
||||
|
||||
table.appendChild(tblBody)
|
||||
contextCell.appendChild(table)
|
||||
table.setAttribute("class", "who-to-follow-table")
|
||||
|
||||
function addProfileToFollowTable(htmlElement, profile) {
|
||||
let table = document.createElement("table")
|
||||
let tblBody = document.createElement("tbody")
|
||||
|
||||
let row = document.createElement("tr")
|
||||
|
||||
{
|
||||
let cell = document.createElement("td")
|
||||
let textNode = document.createTextNode('Profile Picture')
|
||||
cell.appendChild(textNode)
|
||||
row.appendChild(cell)
|
||||
}
|
||||
{
|
||||
let cell = document.createElement("td")
|
||||
let textNode = document.createTextNode(profile.userProfileHandle)
|
||||
cell.appendChild(textNode)
|
||||
row.appendChild(cell)
|
||||
}
|
||||
{
|
||||
let cell = document.createElement("td")
|
||||
let span = document.createElement("span")
|
||||
let button = document.createElement("button")
|
||||
let text = document.createTextNode('Follow')
|
||||
|
||||
span.setAttribute("id", "profile-to-follow-span-" + profile.userProfileId)
|
||||
button.setAttribute("id", "profile-to-follow-button-" + profile.userProfileId)
|
||||
button.name = 'Follow Profile'
|
||||
button.userProfileId = profile.userProfileId
|
||||
|
||||
span.setAttribute("class", "profile-to-follow-span")
|
||||
button.setAttribute("class", "profile-to-follow-button")
|
||||
|
||||
button.appendChild(text)
|
||||
span.appendChild(button)
|
||||
cell.appendChild(span)
|
||||
row.appendChild(cell)
|
||||
}
|
||||
|
||||
tblBody.appendChild(row)
|
||||
|
||||
table.appendChild(tblBody)
|
||||
htmlElement.appendChild(table)
|
||||
table.setAttribute("class", "profile-to-follow-table")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setupEventHandlers() {
|
||||
/*
|
||||
Add events to process button clicks , and mouseWheel.
|
||||
*/
|
||||
document.addEventListener("click", onClick)
|
||||
document.addEventListener('mousewheel', onMouseWheel, false)
|
||||
|
||||
async function onClick(event) {
|
||||
|
||||
if (event.target && event.target.nodeName === "BUTTON") {
|
||||
switch (event.target.name) {
|
||||
case 'New Post': {
|
||||
let textArea = document.getElementById("new-post-text-area")
|
||||
await sendNewPostEvent(
|
||||
textArea.value
|
||||
)
|
||||
.then(updateTextArea)
|
||||
.catch(onError)
|
||||
|
||||
function updateTextArea() {
|
||||
textArea.value = ""
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'Follow Profile': {
|
||||
await sendTargetUserProfileEvent(
|
||||
event.target.userProfileId,
|
||||
SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE
|
||||
)
|
||||
.then(updateButton)
|
||||
.catch(onError)
|
||||
|
||||
function updateButton() {
|
||||
let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId)
|
||||
let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId)
|
||||
span.setAttribute("class", "profile-to-unfollow-span")
|
||||
button.setAttribute("class", "profile-to-unfollow-button")
|
||||
button.name = 'Unfollow Profile'
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'Unfollow Profile': {
|
||||
await sendTargetUserProfileEvent(
|
||||
event.target.userProfileId,
|
||||
SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE
|
||||
)
|
||||
.then(updateButton)
|
||||
.catch(onError)
|
||||
|
||||
function updateButton() {
|
||||
let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId)
|
||||
let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId)
|
||||
span.setAttribute("class", "profile-to-follow-span")
|
||||
button.setAttribute("class", "profile-to-follow-button")
|
||||
button.name = 'Follow Profile'
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Error Handling
|
||||
*/
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Click event failed. ' + errorMessage)
|
||||
}
|
||||
}
|
||||
|
||||
function onMouseWheel(event) {
|
||||
let scrollDiv = document.getElementById("scroll-div")
|
||||
scrollDiv.scrollTop = scrollDiv.scrollTop + event.deltaY
|
||||
}
|
||||
}
|
||||
|
||||
async function sendTargetUserProfileEvent(
|
||||
userProfileId,
|
||||
eventType
|
||||
) {
|
||||
|
||||
return new Promise((resolve, reject) => { asyncCall(resolve, reject) })
|
||||
|
||||
async function asyncCall(resolve, reject) {
|
||||
let eventMessage
|
||||
let event
|
||||
|
||||
eventMessage = {
|
||||
eventType: eventType,
|
||||
eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
|
||||
targetUserProfileId: userProfileId,
|
||||
timestamp: (new Date()).valueOf()
|
||||
}
|
||||
|
||||
event = {
|
||||
requestType: 'Event',
|
||||
eventMessage: JSON.stringify(eventMessage)
|
||||
}
|
||||
|
||||
await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
|
||||
JSON.stringify(event)
|
||||
)
|
||||
.then(resolve)
|
||||
.catch(onError)
|
||||
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Event not executed. ' + errorMessage)
|
||||
console.log('[ERROR] event = ' + JSON.stringify(event))
|
||||
reject(errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function sendNewPostEvent(
|
||||
postText
|
||||
) {
|
||||
|
||||
return new Promise((resolve, reject) => { asyncCall(resolve, reject) })
|
||||
|
||||
async function asyncCall(resolve, reject) {
|
||||
let eventMessage
|
||||
let event
|
||||
|
||||
eventMessage = {
|
||||
eventType: SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST,
|
||||
eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
|
||||
postText: postText,
|
||||
timestamp: (new Date()).valueOf()
|
||||
}
|
||||
|
||||
event = {
|
||||
requestType: 'Event',
|
||||
eventMessage: JSON.stringify(eventMessage)
|
||||
}
|
||||
|
||||
await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
|
||||
JSON.stringify(event)
|
||||
)
|
||||
.then(resolve)
|
||||
.catch(onError)
|
||||
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Event not executed. ' + errorMessage)
|
||||
console.log('[ERROR] event = ' + JSON.stringify(event))
|
||||
reject(errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
|
||||
function newWebAppLoader() {
|
||||
|
||||
let thisObject = {
|
||||
loadModules: loadModules
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function loadModules() {
|
||||
try {
|
||||
let modulesArray = [
|
||||
'WebDebugLog.js',
|
||||
'WebApp.js'
|
||||
]
|
||||
|
||||
for (let i = 0; i < UI.schemas.projectSchema.length; i++) {
|
||||
let project = UI.schemas.projectSchema[i]
|
||||
|
||||
if (project.UI !== undefined) {
|
||||
if (project.UI.functionLibraries !== undefined) {
|
||||
for (let j = 0; j < project.UI.functionLibraries.length; j++) {
|
||||
let fileName = project.UI.functionLibraries[j].fileName
|
||||
if (fileName === undefined) {fileName = project.UI.functionLibraries[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.UI.utilities !== undefined) {
|
||||
for (let j = 0; j < project.UI.utilities.length; j++) {
|
||||
let fileName = project.UI.utilities[j].fileName
|
||||
if (fileName === undefined) {fileName = project.UI.utilities[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.UI.globals !== undefined) {
|
||||
for (let j = 0; j < project.UI.globals.length; j++) {
|
||||
let fileName = project.UI.globals[j].fileName
|
||||
if (fileName === undefined) {fileName = project.UI.globals[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.UI.modules !== undefined) {
|
||||
for (let j = 0; j < project.UI.modules.length; j++) {
|
||||
let fileName = project.UI.modules[j].fileName
|
||||
if (fileName === undefined) {fileName = project.UI.modules[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Modules' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (project.SA !== undefined) {
|
||||
if (project.SA.functionLibraries !== undefined) {
|
||||
for (let j = 0; j < project.SA.functionLibraries.length; j++) {
|
||||
let fileName = project.SA.functionLibraries[j].fileName
|
||||
if (fileName === undefined) {fileName = project.SA.functionLibraries[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Function-Libraries' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.SA.utilities !== undefined) {
|
||||
for (let j = 0; j < project.SA.utilities.length; j++) {
|
||||
let fileName = project.SA.utilities[j].fileName
|
||||
if (fileName === undefined) {fileName = project.SA.utilities[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Utilities' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.SA.globals !== undefined) {
|
||||
for (let j = 0; j < project.SA.globals.length; j++) {
|
||||
let fileName = project.SA.globals[j].fileName
|
||||
if (fileName === undefined) {fileName = project.SA.globals[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Globals' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
if (project.SA.modules !== undefined) {
|
||||
for (let j = 0; j < project.SA.modules.length; j++) {
|
||||
let fileName = project.SA.modules[j].fileName
|
||||
if (fileName === undefined) {fileName = project.SA.modules[j].name.replaceAll(' ', '') + '.js'}
|
||||
modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Modules' + '/' + fileName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
downloadIncludedFiles()
|
||||
|
||||
function downloadIncludedFiles() {
|
||||
|
||||
let downloadedCounter = 0
|
||||
|
||||
for (let i = 0; i < modulesArray.length; i++) {
|
||||
let path = modulesArray[i]
|
||||
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
function onRequired(pModule) {
|
||||
try {
|
||||
|
||||
downloadedCounter++
|
||||
|
||||
if (downloadedCounter === modulesArray.length) {
|
||||
setTimeout(() => {
|
||||
UI.running.webApp = newWebApp()
|
||||
UI.running.webApp.initialize()
|
||||
}, 500)
|
||||
|
||||
}
|
||||
} catch (err) {
|
||||
console.log('[ERROR] loadModules -> onRequired -> err = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] loadModules -> err = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
|
||||
function loadSuperalgos() {
|
||||
|
||||
let browser = checkBrowserVersion()
|
||||
if ((browser.name !== "Chrome" && browser.name !== "Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
|
||||
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
|
||||
}
|
||||
|
||||
loadGlobals()
|
||||
|
||||
function loadGlobals() {
|
||||
let path = "Globals.js"
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
function onRequired(pModule) {
|
||||
setupEnvironment()
|
||||
}
|
||||
}
|
||||
|
||||
function setupEnvironment() {
|
||||
httpRequest(undefined, 'Environment', onResponse)
|
||||
|
||||
function onResponse(err, file) {
|
||||
UI.environment = JSON.parse(file)
|
||||
setupProjectsSchema()
|
||||
}
|
||||
}
|
||||
|
||||
function setupProjectsSchema() {
|
||||
httpRequest(undefined, 'ProjectsSchema', onResponse)
|
||||
|
||||
function onResponse(err, file) {
|
||||
UI.schemas.projectSchema = JSON.parse(file)
|
||||
loadModules()
|
||||
}
|
||||
}
|
||||
|
||||
function loadModules() {
|
||||
let path = "WebAppLoader.js"
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
function onRequired(pModule) {
|
||||
let APP_LOADER_MODULE = newWebAppLoader()
|
||||
APP_LOADER_MODULE.loadModules()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function httpRequest(pContentToSend, pPath, callBackFunction) {
|
||||
let xmlHttpRequest = new XMLHttpRequest()
|
||||
xmlHttpRequest.onreadystatechange = function () {
|
||||
if (this.readyState === 4 && this.status === 200) {
|
||||
try {
|
||||
callBackFunction(undefined, xmlHttpRequest.responseText)
|
||||
} catch (err) {
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> err.stack = ' + err.stack)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> pContentToSend = ' + pContentToSend)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> pPath = ' + pPath)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> xmlHttpRequest.responseText = ' + xmlHttpRequest.responseText)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> callBackFunction = ' + callBackFunction)
|
||||
|
||||
}
|
||||
return
|
||||
} else if (this.readyState === 4 && this.status === 404) {
|
||||
callBackFunction({ result: "Fail", message: xmlHttpRequest.responseText.trim(), code: xmlHttpRequest.responseText.trim() })
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (pContentToSend === undefined) {
|
||||
xmlHttpRequest.open("GET", pPath, true)
|
||||
xmlHttpRequest.send()
|
||||
} else {
|
||||
try {
|
||||
let blob = new Blob([pContentToSend], { type: 'text/plain' })
|
||||
xmlHttpRequest.open("POST", pPath, true)
|
||||
xmlHttpRequest.send(blob)
|
||||
} catch (err) {
|
||||
if (ERROR_LOG === true) { console.log("[ERROR] callServer -> err.message = " + err.message) }
|
||||
callBackFunction({ result: "Fail", message: err.message })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkBrowserVersion() {
|
||||
|
||||
let ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []
|
||||
if (/trident/i.test(M[1])) {
|
||||
tem = /\brv[ :]+(\d+)/g.exec(ua) || []
|
||||
return { name: 'IE', version: (tem[1] || '') }
|
||||
}
|
||||
if (M[1] === 'Chrome') {
|
||||
tem = ua.match(/\bOPR|Edge\/(\d+)/)
|
||||
if (tem != null) { return { name: 'Opera', version: tem[1] } }
|
||||
}
|
||||
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']
|
||||
if ((tem = ua.match(/version\/(\d+)/i)) != null) { M.splice(1, 1, tem[1]) }
|
||||
return {
|
||||
name: M[0],
|
||||
version: M[1]
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,309 @@
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'Saira';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: local('Saira Light'), local('Saira-Light'), url(Fonts/Saira.woff2) format('woff2');
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'Saira Condensed';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: local('Saira Condensed Light'), local('SairaCondensed-Light'), url(Fonts/Saira-Condensed.woff2) format('woff2');
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: segoeui;
|
||||
src: url(Fonts/segoeui.woff) format('woff');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.body{
|
||||
overflow-y: hidden;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.scroll-div {
|
||||
position:absolute;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
top:0px;
|
||||
left:0px;
|
||||
vertical-align: top;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
color: #000;
|
||||
border-color: blue;
|
||||
background-color: transparent;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.static-div {
|
||||
position: fixed;
|
||||
top:0px;
|
||||
left:18%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
background:transparent;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.content-div {
|
||||
position:relative;
|
||||
vertical-align: top;
|
||||
height: 100%;
|
||||
width: 30%;
|
||||
left: 31.2%;
|
||||
color: #000;
|
||||
border-color: blue;
|
||||
background-color:transparent;
|
||||
border-width: 1px;
|
||||
}
|
||||
|
||||
.post-placeholder {
|
||||
vertical-align: top;
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
color: #000;
|
||||
border-color: blue;
|
||||
background-color: transparent;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.post-div {
|
||||
vertical-align: top;
|
||||
height: 300px;
|
||||
width: 100%;
|
||||
color: #000;
|
||||
border-color: blue;
|
||||
background-color: transparent;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.new-post-div {
|
||||
vertical-align: top;
|
||||
height: 300px;
|
||||
width: 100%;
|
||||
color: #000;
|
||||
border-color: blue;
|
||||
background-color: transparent;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.page-table {
|
||||
top:0px;
|
||||
left:18%;
|
||||
width: 64%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
background:transparent;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.left-column {
|
||||
position:relative;
|
||||
top:0px;
|
||||
width: 20%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.middle-column {
|
||||
position:relative;
|
||||
top:0px;
|
||||
width: 50%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.right-column {
|
||||
position:relative;
|
||||
top:0px;
|
||||
left:0px;
|
||||
width: 30%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.left-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.logo-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.menu-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.profile-cell {
|
||||
vertical-align: bottom;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.middle-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.content-title-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.content-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.right-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.search-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.context-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
background:transparent;
|
||||
}
|
||||
|
||||
.menu-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 65%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.menu-item-cell {
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.who-to-follow-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 30%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.profile-to-follow-table {
|
||||
position:relative;
|
||||
width: 100%;
|
||||
height: 30%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
color: #000;
|
||||
border-width: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.profile-to-follow-span {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.profile-to-follow-button {
|
||||
float: right;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
.profile-to-unfollow-span {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.profile-to-unfollow-button {
|
||||
float: right;
|
||||
background-color: red;
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Superalgos Desktop</title>
|
||||
<meta name="description" content="Free and Open Source Crypto Social Trading">
|
||||
<link rel="stylesheet" href="main.css" type="text/css" charset="utf-8" />
|
||||
<link rel="shortcut icon" type="image/png/ico" href="Images/favicon.ico" />
|
||||
<script type="text/javascript" src="Require.js"></script>
|
||||
<script type="text/javascript" src="WebAppPreLoader.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
function loadApp() {
|
||||
// Prevent click-jacking
|
||||
try {
|
||||
if (window == window.top || window.chrome && chrome.app && chrome.app.window) {
|
||||
document.documentElement.style.display = 'block'
|
||||
} else {
|
||||
top.location = self.location
|
||||
}
|
||||
} catch (e) { console.error('CJ protection', e) }
|
||||
|
||||
try {
|
||||
loadSuperalgos()
|
||||
} catch (err) {
|
||||
console.log("[ERROR] UI can not be started. Please check that WebServer is running.", err);
|
||||
}
|
||||
}
|
||||
|
||||
function onResize() {
|
||||
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body id="body" onload="loadApp()" onresize="onResize()" class="body">
|
||||
|
||||
<div id="scroll-div" class="scroll-div">
|
||||
<div id="static-div" class="static-div">
|
||||
<table id="page-table" class="page-table">
|
||||
<tr>
|
||||
<td class="left-column">
|
||||
<table class="left-table">
|
||||
<tr>
|
||||
<td class="logo-cell">LOGO</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-cell">
|
||||
<table class="menu-table">
|
||||
<tr>
|
||||
<td class="menu-item-cell">Home</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Explore</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Notifications</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Messages</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Bookmarks</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Lists</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Profile</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">More</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="menu-item-cell">Post</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="profile-cell">PROFILE</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td class="middle-column">
|
||||
<table class="middle-table">
|
||||
<tr>
|
||||
<td class="content-title-cell">CONTENT TITLE</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="content-cell">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td class="right-column">
|
||||
<table class="right-table">
|
||||
<tr>
|
||||
<td class="search-cell">SEARCH</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="context-cell">
|
||||
<table class="context-table">
|
||||
<tr>
|
||||
<td>Who to follow</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="who-to-follow-cell">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Show more</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>>
|
||||
<div id="content-div" class="content-div">
|
||||
<div id="post-placeholder" class="post-placeholder">
|
||||
Placeholder
|
||||
</div>
|
||||
<div id="new-post-div" class="new-post-div">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Profile Pic</td>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<textarea id="new-post-text-area">Type your post here...</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Permissions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tool Bar <button name="New Post">POST</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="post-div">
|
||||
POST 2
|
||||
</div>
|
||||
<div class="post-div">
|
||||
POST 3
|
||||
</div>
|
||||
<div class="post-div">
|
||||
POST 4
|
||||
</div>
|
||||
<div class="post-div">
|
||||
POST 5
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,75 @@
|
||||
exports.newDesktopRoot = function newDesktopRoot() {
|
||||
/*
|
||||
This module represents the execution root of the Desktop App.
|
||||
We use this module that is outside the Desktop folder to
|
||||
load all node dependencies and get them ready to the actual App.
|
||||
*/
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
/*
|
||||
The DK object is accesible everywhere at the Superalgos Desktop App.
|
||||
It provides access to all modules built for this App.
|
||||
*/
|
||||
global.DK = {}
|
||||
/*
|
||||
The SA object is accesible everywhere at the Superalgos Desktop App.
|
||||
It provides access to all modules built for Superalgos in general.
|
||||
*/
|
||||
global.SA = {}
|
||||
/* Load Environment Variables */
|
||||
let ENVIRONMENT = require('./EnvironmentForDebug.js');
|
||||
let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
|
||||
global.env = ENVIRONMENT_MODULE
|
||||
/*
|
||||
First thing is to load the project schema file.
|
||||
*/
|
||||
global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
|
||||
/*
|
||||
Setting up the modules that will be available, defined at the Project Schema file.
|
||||
*/
|
||||
let MULTI_PROJECT = require('./MultiProject.js');
|
||||
let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
|
||||
MULTI_PROJECT_MODULE.initialize(DK, 'DK')
|
||||
MULTI_PROJECT_MODULE.initialize(SA, 'SA')
|
||||
/*
|
||||
Setting up external dependencies.
|
||||
*/
|
||||
SA.nodeModules = {
|
||||
fs: require('fs'),
|
||||
util: require('util'),
|
||||
path: require('path'),
|
||||
web3: require('web3'),
|
||||
ws: require('ws'),
|
||||
open: require('open'),
|
||||
http: require('http'),
|
||||
octokit: require("@octokit/rest"),
|
||||
simpleGit: require('simple-git'),
|
||||
nodeFetch: require('node-fetch')
|
||||
}
|
||||
|
||||
/*
|
||||
Setting up Secrets.
|
||||
*/
|
||||
SA.secrets = {
|
||||
array: require('./My-Secrets/Secrets.json'),
|
||||
map: new Map()
|
||||
}
|
||||
for (let i = 0; i < SA.secrets.array.length; i++) {
|
||||
let secret = SA.secrets.array[i]
|
||||
SA.secrets.map.set (secret.codeName, secret)
|
||||
}
|
||||
|
||||
run()
|
||||
|
||||
async function run() {
|
||||
DK.app = require('./Desktop/DesktopApp.js').newDesktopApp()
|
||||
await DK.app.run()
|
||||
console.log('Superalgos Desktop App is Running!')
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -18,8 +18,8 @@ RUN mkdir -p Data-Storage Log-Files My-Workspaces \
|
||||
&& useradd --no-log-init -m -g superalgos superalgos \
|
||||
&& chown -R superalgos:superalgos /app
|
||||
USER superalgos
|
||||
RUN node setup
|
||||
RUN node setup noShortcuts
|
||||
EXPOSE 34248
|
||||
EXPOSE 18041
|
||||
VOLUME ["Data-Storage", "Log-Files", "My-Workspaces"]
|
||||
ENTRYPOINT ["node", "run", "noBrowser"]
|
||||
VOLUME ["/app/Data-Storage", "/app/Log-Files", "/app/My-Workspaces"]
|
||||
ENTRYPOINT ["node", "platform", "noBrowser"]
|
||||
@@ -4,7 +4,7 @@ services:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: ./Docker/Dockerfile
|
||||
image: superalgos
|
||||
image: ghcr.io/superalgos/superalgos:latest
|
||||
command: ["minMemo"]
|
||||
ports:
|
||||
- '34248:34248'
|
||||
@@ -13,4 +13,7 @@ services:
|
||||
- ../Data-Storage:/app/Data-Storage
|
||||
- ../Log-Files:/app/Log-Files
|
||||
- ../My-Workspaces:/app/My-Workspaces
|
||||
environment:
|
||||
PUID: '1000'
|
||||
PGID: '1000'
|
||||
restart: on-failure
|
||||
+7
-9
@@ -2,19 +2,17 @@ exports.newEnvironment = function () {
|
||||
|
||||
let thisObject = {
|
||||
WEB_SERVER_URL: 'localhost',
|
||||
WEB_SOCKETS_INTERFACE_PORT: 18041,
|
||||
HTTP_INTERFACE_PORT: 34248,
|
||||
PATH_TO_TASK_SERVER: './TaskServer',
|
||||
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
|
||||
CLIENT_HTTP_INTERFACE_PORT: 34248,
|
||||
PATH_TO_DATA_STORAGE: './Data-Storage',
|
||||
PATH_TO_PROJECTS: './Projects',
|
||||
PATH_TO_LOG_FILES: './Log-Files',
|
||||
PATH_TO_PROJECTS_REQUIRED: '../Projects',
|
||||
PATH_TO_UI: './UI',
|
||||
PATH_TO_DATA_FILES: './UI/Data-Files/src',
|
||||
PATH_TO_CLIENT: './Client/',
|
||||
PATH_TO_DEFAULT_WORKSPACE: './Projects/Superalgos/Plugins/Workspaces',
|
||||
PATH_TO_PROJECTS_REQUIRED: './Projects',
|
||||
PATH_TO_PROJECT_SCHEMA: './Projects/ProjectsSchema.json',
|
||||
PATH_TO_CLIENT: './Platform',
|
||||
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
|
||||
PATH_TO_MY_WORKSPACES: './My-Workspaces',
|
||||
PATH_TO_FONTS: './Client/WebServer/Fonts'
|
||||
PATH_TO_FONTS: './Platform/WebServer/Fonts'
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
exports.newEnvironment = function () {
|
||||
|
||||
let thisObject = {
|
||||
WEB_SERVER_URL: 'localhost',
|
||||
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
|
||||
NETWORK_WEB_SOCKETS_INTERFACE_PORT: 18042,
|
||||
DESKTOP_WEB_SOCKETS_INTERFACE_PORT: 18043,
|
||||
DESKTOP_WEB_SOCKETS_INTERFACE_HOST: 'localhost',
|
||||
CLIENT_HTTP_INTERFACE_PORT: 34248,
|
||||
DESKTOP_HTTP_INTERFACE_PORT: 34249,
|
||||
PATH_TO_DATA_STORAGE: './Data-Storage',
|
||||
PATH_TO_PROJECTS: './Projects',
|
||||
PATH_TO_LOG_FILES: './Log-Files',
|
||||
PATH_TO_PROJECTS_REQUIRED: './Projects',
|
||||
PATH_TO_PROJECT_SCHEMA: './Projects/ProjectsSchema.json',
|
||||
PATH_TO_CLIENT: './Platform',
|
||||
PATH_TO_DESKTOP: './Desktop',
|
||||
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
|
||||
PATH_TO_MY_WORKSPACES: './My-Workspaces',
|
||||
PATH_TO_FONTS: './Platform/WebServer/Fonts'
|
||||
}
|
||||
|
||||
return thisObject
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const { exec } = require("child_process");
|
||||
const { exec, execSync } = require("child_process");
|
||||
const os = require("os");
|
||||
|
||||
// Get the name of the main directory
|
||||
@@ -49,7 +49,7 @@ if (os.platform() == "win32") {
|
||||
let version = os.version();
|
||||
if (version.includes("Ubuntu")) {
|
||||
// Paths and Icon for Ubuntu shortcuts
|
||||
let icon = path.join( __dirname,"..", "/Projects/Superalgos/Icons/superalgos.png");
|
||||
let icon = path.join( __dirname,"..", "/Projects/Foundations/Icons/superalgos.png");
|
||||
|
||||
// Create .desktop shortcut file
|
||||
fs.writeFileSync( `${name}.desktop`,
|
||||
@@ -92,7 +92,45 @@ if (os.platform() == "win32") {
|
||||
|
||||
// Mac Shortcuts
|
||||
} else if (os.platform() == "darwin") {
|
||||
console.log( "Automatic shortcut creation is not yet supported on Mac. If you would like to see this feature add, message @harrellbm on telegram or discord to ask how you can help!")
|
||||
const icon = path.join( __dirname,"/superalgos.ico");
|
||||
const createShortcutCommand = `chmod +x ${name}.command & cp ${name}.command ~/Desktop/${name}.command`
|
||||
const installFileIconcommand = `npm install fileicon`;
|
||||
const changeIconCommand = `./node_modules/fileicon/bin/fileicon set ~/Desktop/${name}.command ./Launch-Scripts/superalgos.ico`
|
||||
const unInstallFileIconcommand = `npm uninstall fileicon`;
|
||||
|
||||
try {
|
||||
// Create .desktop shortcut file
|
||||
fs.writeFileSync( `${name}.command`,
|
||||
`#!/bin/sh
|
||||
cd ${__dirname}
|
||||
cd ..
|
||||
node run
|
||||
"$SHELL"`,
|
||||
);
|
||||
|
||||
// Place shortcut in proper folders
|
||||
execSync( createShortcutCommand,{ timeout: 30000})
|
||||
|
||||
// Remove temporary .command file
|
||||
fs.unlinkSync( `${name}.command` )
|
||||
|
||||
//Install fileicon utility
|
||||
execSync(installFileIconcommand, {stdio: 'inherit', timeout: 30000});
|
||||
|
||||
//change Icon
|
||||
execSync(changeIconCommand, {stdio: 'inherit', timeout: 30000});
|
||||
|
||||
//Un-Install fileicon utility
|
||||
execSync(unInstallFileIconcommand, {stdio: 'inherit', timeout: 30000});
|
||||
} catch (error) {
|
||||
console.log('');
|
||||
console.log("There was an error installing a shortcut: ");
|
||||
console.log('');
|
||||
console.log( error );
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("Shortcuts added successfully!");
|
||||
|
||||
// Misc Operating System
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
const { execSync } = require("child_process");
|
||||
const os = require("os");
|
||||
|
||||
// Minimum versions required
|
||||
const npmNeededVersion = '5'
|
||||
const nodeNeededVersion = '12'
|
||||
const gitNeededVersion = '2'
|
||||
|
||||
function systemCheck () {
|
||||
try {
|
||||
|
||||
// Gather Installed Versions of Node, NPM and Git
|
||||
const npmVersionRaw = execSync( "npm -v",{ encoding: 'utf8', timeout: 30000 })
|
||||
const nodeVersionRaw = execSync( "node -v",{ encoding: 'utf8',timeout: 30000 })
|
||||
const gitVersionRaw = execSync( "git --version",{ encoding: 'utf8',timeout: 30000 })
|
||||
const npmVersion = npmVersionRaw.trim().split('.')
|
||||
const nodeVersion = nodeVersionRaw.trim().substring(1).split('.')
|
||||
const gitVersion = gitVersionRaw.trim().split(' ')[2].split('.')
|
||||
|
||||
// Make sure update version of npm is installed
|
||||
if ( npmVersion[0] < npmNeededVersion ) {
|
||||
console.log('');
|
||||
console.log("ERROR: the version of npm you have installed is out of date. Please update your installation of npm and try again.");
|
||||
console.log('');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
// Make sure update version of node is installed
|
||||
if ( nodeVersion[0] < nodeNeededVersion ) {
|
||||
console.log('');
|
||||
console.log("ERROR: the version of node you have installed is out of date. Please update your installation of node and try again.");
|
||||
console.log('');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
// Make sure updated version of git is installed
|
||||
if ( gitVersion[0] < gitNeededVersion ) {
|
||||
console.log('');
|
||||
console.log("ERROR: the version of git you have installed is out of date. Please update your installation of git and try again.");
|
||||
console.log('');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
// Check windows system
|
||||
if (os.platform() == "win32") {
|
||||
|
||||
// Verify C:\Windows\System32 is on the windows PATH
|
||||
const path = execSync( "echo %PATH%",{ encoding: 'utf8',timeout: 30000 })
|
||||
let check = path.includes('System32')
|
||||
if ( check === false ) {
|
||||
console.log('');
|
||||
console.log("ERROR: it appears C:\\Windows\\System32 is missing from your PATH. Please add to your path and try again.");
|
||||
console.log('');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log('');
|
||||
console.log("There was an error with your system: ");
|
||||
console.log('');
|
||||
console.log( error );
|
||||
return;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = systemCheck
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
exports.newMultiProject = function () {
|
||||
|
||||
let thisObject = {
|
||||
initialize: initialize
|
||||
}
|
||||
|
||||
return thisObject;
|
||||
|
||||
function initialize(rootObject, rootObjectName) {
|
||||
/*
|
||||
Here we will setup the rootObject object, with all the
|
||||
projects and modules that will have inside.
|
||||
*/
|
||||
rootObject.projects = {}
|
||||
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
let projectDefinition = PROJECTS_SCHEMA[i]
|
||||
global[rootObjectName].projects[projectDefinition.propertyName] = {}
|
||||
let projectInstance = global[rootObjectName].projects[projectDefinition.propertyName]
|
||||
|
||||
projectInstance.utilities = {}
|
||||
projectInstance.globals = {}
|
||||
projectInstance.functionLibraries = {}
|
||||
projectInstance.modules = {}
|
||||
projectInstance.taskModules = {}
|
||||
projectInstance.processModules = {}
|
||||
projectInstance.botModules = {}
|
||||
|
||||
if (projectDefinition[rootObjectName] === undefined) { continue }
|
||||
|
||||
/* Set up Utilities of this Project */
|
||||
if (projectDefinition[rootObjectName].utilities !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].utilities.length; j++) {
|
||||
let utilityDefinition = projectDefinition[rootObjectName].utilities[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Utilities' + '/' + utilityDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
let requiredFunction = requiredObject[utilityDefinition.functionName]
|
||||
projectInstance.utilities[utilityDefinition.propertyName] = requiredFunction.call()
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Globals of this Project */
|
||||
if (projectDefinition[rootObjectName].globals !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].globals.length; j++) {
|
||||
let globalDefinition = projectDefinition[rootObjectName].globals[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Globals' + '/' + globalDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
let requiredFunction = requiredObject[globalDefinition.functionName]
|
||||
projectInstance.globals[globalDefinition.propertyName] = requiredFunction.call()
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Function Libraries of this Project */
|
||||
if (projectDefinition[rootObjectName].functionLibraries !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].functionLibraries.length; j++) {
|
||||
let functionLibraryDefinition = projectDefinition[rootObjectName].functionLibraries[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Function-Libraries' + '/' + functionLibraryDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
let requiredFunction = requiredObject[functionLibraryDefinition.functionName]
|
||||
projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = requiredFunction.call()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
From here we will require and get the modules, but without instantiating thisObject.
|
||||
*/
|
||||
|
||||
/* Set up Modules for this Project */
|
||||
if (projectDefinition[rootObjectName].modules !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].modules.length; j++) {
|
||||
let taskModuleDefinition = projectDefinition[rootObjectName].modules[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Modules' + '/' + taskModuleDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
projectInstance.modules[taskModuleDefinition.propertyName] = requiredObject
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Task Modules for this Project */
|
||||
if (projectDefinition[rootObjectName].taskModules !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].taskModules.length; j++) {
|
||||
let taskModuleDefinition = projectDefinition[rootObjectName].taskModules[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Task-Modules' + '/' + taskModuleDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
projectInstance.taskModules[taskModuleDefinition.propertyName] = requiredObject
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Process Modules for this Project */
|
||||
if (projectDefinition[rootObjectName].processModules !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].processModules.length; j++) {
|
||||
let processModuleDefinition = projectDefinition[rootObjectName].processModules[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Process-Modules' + '/' + processModuleDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
projectInstance.processModules[processModuleDefinition.propertyName] = requiredObject
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up Bot Modules for this Project */
|
||||
if (projectDefinition[rootObjectName].botModules !== undefined) {
|
||||
for (let j = 0; j < projectDefinition[rootObjectName].botModules.length; j++) {
|
||||
let botModuleDefinition = projectDefinition[rootObjectName].botModules[j]
|
||||
let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Bot-Modules' + '/' + botModuleDefinition.folderName + '/' + botModuleDefinition.fileName
|
||||
|
||||
let requiredObject = require(path)
|
||||
projectInstance.botModules[botModuleDefinition.propertyName] = requiredObject
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos\\Network"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects\\Network"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects\\Social-Trading"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"files.exclude": {
|
||||
"**/Data-Storage": true,
|
||||
"**/Documentation": true,
|
||||
"**/Log-Files": true,
|
||||
"**/node_modules": true,
|
||||
"**/Deprecated-Code": true
|
||||
},
|
||||
"search.exclude": {
|
||||
"**/Data-Storage": true,
|
||||
"**/Documentation": true,
|
||||
"**/Log-Files": true,
|
||||
"**/node_modules": true,
|
||||
"**/Deprecated-Code": true
|
||||
},
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
exports.newNetworkNode = function newNetworkNode() {
|
||||
|
||||
let thisObject = {
|
||||
socialGraphService: undefined,
|
||||
storage: undefined,
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
/*
|
||||
Let's start the Network Interfaces
|
||||
*/
|
||||
NT.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface()
|
||||
NT.webSocketsInterface.initialize()
|
||||
|
||||
thisObject.socialGraphService = NT.projects.socialTrading.modules.socialGraph.newNetworkModulesSocialGraph()
|
||||
await thisObject.socialGraphService.initialize()
|
||||
|
||||
thisObject.storage = NT.projects.socialTrading.modules.storage.newSocialTradingModulesStorage()
|
||||
thisObject.storage.initialize()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
exports.newNetworkRoot = function newNetworkRoot() {
|
||||
/*
|
||||
This module represents the execution root of the Network Node.
|
||||
We use this module that is outside the Network folder to
|
||||
load all node dependencies and get them ready to the actual node.
|
||||
*/
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
/*
|
||||
The NT object is accesible everywhere at the Superalgos Network.
|
||||
It provides access to all modules built for this Network.
|
||||
*/
|
||||
global.NT = {}
|
||||
/*
|
||||
The SA object is accesible everywhere at the Superalgos Network.
|
||||
It provides access to all modules built for Superalgos in general.
|
||||
*/
|
||||
global.SA = {}
|
||||
/* Load Environment Variables */
|
||||
let ENVIRONMENT = require('./EnvironmentForDebug.js');
|
||||
let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
|
||||
global.env = ENVIRONMENT_MODULE
|
||||
/*
|
||||
First thing is to load the project schema file.
|
||||
*/
|
||||
global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
|
||||
/*
|
||||
Setting up the modules that will be available, defined at the Project Schema file.
|
||||
*/
|
||||
let MULTI_PROJECT = require('./MultiProject.js');
|
||||
let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
|
||||
MULTI_PROJECT_MODULE.initialize(NT, 'NT')
|
||||
MULTI_PROJECT_MODULE.initialize(SA, 'SA')
|
||||
/*
|
||||
Setting up external dependencies.
|
||||
*/
|
||||
SA.nodeModules = {
|
||||
fs: require('fs'),
|
||||
path: require('path'),
|
||||
util: require('util'),
|
||||
nodeFetch: require('node-fetch'),
|
||||
web3: require('web3'),
|
||||
ws: require('ws'),
|
||||
simpleGit: require('simple-git')
|
||||
}
|
||||
/*
|
||||
Setting up Secrets.
|
||||
*/
|
||||
SA.secrets = {
|
||||
array: require('./My-Secrets/Secrets.json'),
|
||||
map: new Map()
|
||||
}
|
||||
for (let i = 0; i < SA.secrets.array.length; i++) {
|
||||
let secret = SA.secrets.array[i]
|
||||
SA.secrets.map.set(secret.codeName, secret)
|
||||
}
|
||||
|
||||
NT.app = require('./Network/NetwokNode.js').newNetworkNode()
|
||||
NT.app.run()
|
||||
|
||||
console.log('Superalgos Network is Running.')
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,832 @@
|
||||
exports.newGithubServer = function newGithubServer() {
|
||||
|
||||
let thisObject = {
|
||||
getGithubStars: getGithubStars,
|
||||
getGithubWatchers: getGithubWatchers,
|
||||
getGithubForks: getGithubForks,
|
||||
mergePullRequests: mergePullRequests,
|
||||
initialize: initialize,
|
||||
finalize: finalize,
|
||||
run: run
|
||||
}
|
||||
|
||||
const GITHUB_API_WAITING_TIME = 250
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
|
||||
}
|
||||
|
||||
function run() {
|
||||
|
||||
}
|
||||
|
||||
async function getGithubStars(repository, username, token) {
|
||||
return await getGithubUsernames('activity', 'listStargazersForRepo', repository, username, token)
|
||||
}
|
||||
|
||||
async function getGithubWatchers(repository, username, token) {
|
||||
return await getGithubUsernames('activity', 'listWatchersForRepo', repository, username, token)
|
||||
}
|
||||
|
||||
async function getGithubForks(repository, username, token) {
|
||||
return await getGithubUsernames('repos', 'listForks', repository, username, token)
|
||||
}
|
||||
|
||||
async function mergePullRequests(commitMessage, username, token) {
|
||||
return await mergeGithubPullRequests(commitMessage, username, token)
|
||||
}
|
||||
|
||||
async function getGithubUsernames(endpoint, method, repository, username, token) {
|
||||
try {
|
||||
|
||||
repository = unescape(repository)
|
||||
username = unescape(username)
|
||||
token = unescape(token)
|
||||
let error
|
||||
let githubListArray = []
|
||||
|
||||
return await getRepoInfo()
|
||||
|
||||
async function getRepoInfo() {
|
||||
await doGithub()
|
||||
if (error !== undefined) {
|
||||
|
||||
let docs = {
|
||||
project: 'Governance',
|
||||
category: 'Topic',
|
||||
type: 'Gov Error - Get Repository Information',
|
||||
anchor: undefined,
|
||||
placeholder: {}
|
||||
}
|
||||
|
||||
return respondWithDocsObject(docs, error)
|
||||
}
|
||||
|
||||
return {
|
||||
result: global.DEFAULT_OK_RESPONSE.result,
|
||||
githubListArray: githubListArray
|
||||
}
|
||||
}
|
||||
|
||||
async function doGithub() {
|
||||
|
||||
const { Octokit } = SA.nodeModules.octokit
|
||||
|
||||
const octokit = new Octokit({
|
||||
auth: token,
|
||||
userAgent: 'Superalgos Beta 11'
|
||||
})
|
||||
await getList()
|
||||
|
||||
async function getList() {
|
||||
const repo = repository
|
||||
const owner = 'Superalgos'
|
||||
const per_page = 100 // Max
|
||||
let page = 0
|
||||
let lastPage = false
|
||||
|
||||
while (lastPage === false) {
|
||||
try {
|
||||
page++
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
let listResponse = await octokit[endpoint][method]({
|
||||
owner,
|
||||
repo,
|
||||
per_page,
|
||||
page
|
||||
});
|
||||
|
||||
if (listResponse.data.length < 100) {
|
||||
lastPage = true
|
||||
}
|
||||
|
||||
for (let i = 0; i < listResponse.data.length; i++) {
|
||||
let listItem = listResponse.data[i]
|
||||
let githubUsername
|
||||
switch (endpoint) {
|
||||
case 'activity': {
|
||||
githubUsername = listItem.login
|
||||
break
|
||||
}
|
||||
case 'repos': {
|
||||
githubUsername = listItem.owner.login
|
||||
break
|
||||
}
|
||||
}
|
||||
//console.log(listItem)
|
||||
|
||||
githubListArray.push(githubUsername)
|
||||
}
|
||||
console.log('[INFO] Github Server -> getRepoInfo -> doGithub -> getList -> ' + method + ' Page = ' + page)
|
||||
console.log('[INFO] Github Server -> getRepoInfo -> doGithub -> getList -> ' + method + ' Received = ' + listResponse.data.length)
|
||||
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
|
||||
if (err.stack.indexOf('last page') >= 0) {
|
||||
return
|
||||
} else {
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->Method call produced an error.')
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->repository = ' + repository)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->username = ' + username)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->token starts with = ' + token.substring(0, 10) + '...')
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> doGithub -> getList ->token ends with = ' + '...' + token.substring(token.length - 10))
|
||||
error = err
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> Method call produced an error.')
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> repository = ' + repository)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> username = ' + username)
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> token starts with = ' + token.substring(0, 10) + '...')
|
||||
console.log('[ERROR] Github Server -> getRepoInfo -> token ends with = ' + '...' + token.substring(token.length - 10))
|
||||
|
||||
let error = {
|
||||
result: 'Fail Because',
|
||||
message: err.message,
|
||||
stack: err.stack
|
||||
}
|
||||
return error
|
||||
}
|
||||
}
|
||||
|
||||
async function mergeGithubPullRequests(commitMessage, username, token) {
|
||||
try {
|
||||
commitMessage = unescape(commitMessage)
|
||||
username = unescape(username)
|
||||
token = unescape(token)
|
||||
const repository = 'Superalgos'
|
||||
|
||||
/* Unsavping # */
|
||||
for (let i = 0; i < 10; i++) {
|
||||
commitMessage = commitMessage.replace('_SLASH_', '/')
|
||||
commitMessage = commitMessage.replace('_HASHTAG_', '#')
|
||||
}
|
||||
|
||||
let error
|
||||
let githubPrListArray = []
|
||||
|
||||
return await processOpenPullRequests()
|
||||
|
||||
async function processOpenPullRequests() {
|
||||
await doGithub()
|
||||
if (error !== undefined) {
|
||||
|
||||
let docs = {
|
||||
project: 'Governance',
|
||||
category: 'Topic',
|
||||
type: 'Gov Error - Pull Requests Not Processed',
|
||||
anchor: undefined,
|
||||
placeholder: {}
|
||||
}
|
||||
|
||||
return respondWithDocsObject(docs, error)
|
||||
}
|
||||
|
||||
return {
|
||||
result: global.DEFAULT_OK_RESPONSE.result
|
||||
}
|
||||
}
|
||||
|
||||
async function doGithub() {
|
||||
try {
|
||||
const repo = repository
|
||||
const owner = 'Superalgos'
|
||||
const { Octokit } = SA.nodeModules.octokit
|
||||
const octokit = new Octokit({
|
||||
auth: token,
|
||||
userAgent: 'Superalgos Beta 11'
|
||||
})
|
||||
await getPrList()
|
||||
await mergePrs()
|
||||
await closePrsToMaster()
|
||||
|
||||
async function getPrList() {
|
||||
|
||||
const per_page = 100 // Max
|
||||
let page = 0
|
||||
let lastPage = false
|
||||
|
||||
while (lastPage === false) {
|
||||
try {
|
||||
page++
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
|
||||
let listResponse = await octokit.rest.pulls.list({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
state: 'open',
|
||||
head: 'develop',
|
||||
base: 'develop',
|
||||
sort: undefined,
|
||||
direction: undefined,
|
||||
per_page: per_page,
|
||||
page: page
|
||||
});
|
||||
|
||||
if (listResponse.data.length < 100) {
|
||||
lastPage = true
|
||||
}
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList -> Receiving Page = ' + page)
|
||||
for (let i = 0; i < listResponse.data.length; i++) {
|
||||
let pullRequest = listResponse.data[i]
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList -> Pull Request "' + pullRequest.title + '" found and added to the list to validate. ')
|
||||
githubPrListArray.push(pullRequest)
|
||||
}
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList -> Received = ' + listResponse.data.length)
|
||||
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
|
||||
if (err.stack.indexOf('last page') >= 0) {
|
||||
return
|
||||
} else {
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->Method call produced an error.')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->repository = ' + repository)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->username = ' + username)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->token starts with = ' + token.substring(0, 10) + '...')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> getPrList ->token ends with = ' + '...' + token.substring(token.length - 10))
|
||||
error = err
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function mergePrs() {
|
||||
/*
|
||||
In order to automatically merge a PRs we will run several validations first.
|
||||
We want to automate specifically the merging of Profile File changes at the
|
||||
Governance System done by the same Github user name that matches the profile
|
||||
changed. We will also not do the merge if there are more than one file at the
|
||||
PR.
|
||||
|
||||
We will go through the list of open PRs and run the validations at each one of them.
|
||||
*/
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Ready to Validate ' + githubPrListArray.length + ' pull requests. ')
|
||||
|
||||
for (let i = 0; i < githubPrListArray.length; i++) {
|
||||
let pullRequest = githubPrListArray[i]
|
||||
/*
|
||||
Lets get the files changed at this Pull Request.
|
||||
*/
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
let listResponse = await octokit.rest.pulls.listFiles({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number
|
||||
});
|
||||
let filesChanged = listResponse.data
|
||||
let fileContentUrl // URL to the only file at the PR
|
||||
let fileContent // File content of the only file at the PR
|
||||
let userProfile // User Profile Object
|
||||
let githubUsername // The Github user name of who is submitting the Pull Request
|
||||
let mergeResponse // The response received from the call to Gihub to merge the Pull Request
|
||||
|
||||
if (await validatePrHasMoreThanOneFile() === false) { continue }
|
||||
if (await validateFileNameEqualsGithubUsername() === false) { continue }
|
||||
if (await validateFileChangedIsUserProfile() === false) { continue }
|
||||
if (await validateMessageSignedIsGithubUsername() === false) { continue }
|
||||
if (await validateMessageSignedHashIsSignatureHash() === false) { continue }
|
||||
if (await validateUserProfileNodeNameEqualsGithubUsername() === false) { continue }
|
||||
if (await validateUserProfileIdDoesNotBelongtoAnotherUserProfile() === false) { continue }
|
||||
if (await validateUserProfileBlockchainAccountDoesNotBelongtoAnotherUserProfile() === false) { continue }
|
||||
if (await validateUserProfileSigningAccountsDoesNotBelongtoAnotherUserProfile() === false) { continue }
|
||||
|
||||
if (await mergePullRequest() === false) {
|
||||
console.log('[WARN] Github Server -> mergeGithubPullRequests -> Merge Failed -> Pull Request "' + pullRequest.title + '" not merged because Github could not merge it. -> mergeResponse.message = ' + mergeResponse.data.message)
|
||||
} else {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Merge Succed -> Pull Request "' + pullRequest.title + '" successfully merged. -> mergeResponse.message = ' + mergeResponse.data.message)
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothning else but that file. All validations were successfull.'
|
||||
});
|
||||
}
|
||||
|
||||
async function validatePrHasMoreThanOneFile() {
|
||||
/*
|
||||
Validation #1: If the PR has more than one file, then we will not automatically
|
||||
merge it.
|
||||
*/
|
||||
if (filesChanged.length !== 1) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #1 Failed -> Pull Request "' + pullRequest.title + '" not merged because it contains more than 1 file. -> fileCount = ' + filesChanged.length)
|
||||
/*
|
||||
We will close PRs that contains any User Profile file together with other files in the same Pull Request.
|
||||
This will avoid manual merges to include User Profile files.
|
||||
*/
|
||||
for (let j = 0; j < filesChanged.length; j++) {
|
||||
let pullRequestFile = filesChanged[j]
|
||||
let fileContentUrl = pullRequestFile.raw_url
|
||||
if (fileContentUrl.indexOf('Governance/Plugins/User-Profiles') >= 0) {
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that a User Profile file... \n\n' + fileContentUrl + '\n\n...was submitted together with ' + (filesChanged.length - 1) + ' other file/s. User Profiles files as per the Governance System rules, must be the only file present at a Pull Request in order to pass all the validations and be automatically merged.'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
break
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateFileNameEqualsGithubUsername() {
|
||||
/*
|
||||
Validation #2: File Name must be the same to the Github Username of the PR owner.
|
||||
*/
|
||||
let pullRequestFile = filesChanged[0]
|
||||
fileContentUrl = pullRequestFile.raw_url
|
||||
|
||||
if (fileContentUrl.indexOf('Governance/Plugins/User-Profiles') < 0) {
|
||||
/*
|
||||
If it is not a user profile then there is no need to auto merge.
|
||||
*/
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the file modified at the Pull Request is not a User Profile file. -> fileContentUrl = ' + fileContentUrl)
|
||||
return false
|
||||
}
|
||||
|
||||
let splittedURL = fileContentUrl.split('/')
|
||||
let fileName = splittedURL[splittedURL.length - 1]
|
||||
let splittedFileName = fileName.split('.')
|
||||
fileName = splittedFileName[0]
|
||||
githubUsername = pullRequest.user.login
|
||||
|
||||
if (githubUsername !== fileName) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the File Name. -> Github Username = ' + githubUsername + '-> fileName = ' + fileName)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that the Github User "' + githubUsername + '" who submitted it, is not equal to the name of the User Profile Plugin File.\n\n File Name = "' + fileName + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateFileChangedIsUserProfile() {
|
||||
/*
|
||||
Validation #3: The file changed at the PR is a User Profile.
|
||||
*/
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
fileContent = await PL.projects.foundations.utilities.webAccess.fetchAPIDataFile(fileContentUrl)
|
||||
userProfile = JSON.parse(fileContent)
|
||||
|
||||
if (userProfile.type !== 'User Profile') {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #3 Failed -> Pull Request "' + pullRequest.title + '" not merged because the file modified is not a User Profile. -> Type = ' + userProfile.type)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateMessageSignedIsGithubUsername() {
|
||||
/*
|
||||
Validation #4: The message signed at the config is not the Github Username.
|
||||
*/
|
||||
let config = JSON.parse(userProfile.config)
|
||||
let messageSigned = config.signature.message
|
||||
if (messageSigned !== githubUsername) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #4 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the Message Signed at the User Profile. -> Github Username = ' + githubUsername + '-> messageSigned = ' + messageSigned)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that the Github User "' + githubUsername + '" who submitted it, is not equal to the Message Signed at the User Profile.\n\n Message Signed = "' + messageSigned + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateMessageSignedHashIsSignatureHash() {
|
||||
/*
|
||||
Validation #5: The message signed has is equal to the signature messageHash.
|
||||
*/
|
||||
let config = JSON.parse(userProfile.config)
|
||||
|
||||
let serverResponse = await PL.servers.WEB3_SERVER.hashData(
|
||||
config.signature.message
|
||||
)
|
||||
let messageSignedHash = serverResponse.hash
|
||||
let signatureHash = config.signature.messageHash
|
||||
|
||||
if (messageSignedHash !== signatureHash) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #5 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Message Signed Hash is not equal to the the Signature Hash. -> messageSignedHash = ' + messageSignedHash + '-> signatureHash = ' + signatureHash)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because the Message Signed Hash is not equal to the the Signature Hash.\n\n messageSignedHash = "' + messageSignedHash + '"\n\n signatureHash = "' + signatureHash + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateUserProfileNodeNameEqualsGithubUsername() {
|
||||
/*
|
||||
Validation #6: The name of the User Profile node is not the Github Username.
|
||||
*/
|
||||
if (userProfile.name !== githubUsername) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #6 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the User Profile node\'s name. -> Github Username = ' + githubUsername + '-> userProfile.name = ' + userProfile.name)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that the Github User "' + githubUsername + '" who submitted it, is not equal to the User Profile node\'s name.\n\n User Profile Name = "' + userProfile.name + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateUserProfileIdDoesNotBelongtoAnotherUserProfile() {
|
||||
/*
|
||||
Validation #7: The id of the User Profile can not be the id of an already existing User Profile
|
||||
unless the existing one belongs to the same Github username.
|
||||
*/
|
||||
let userProfileIdMap = new Map()
|
||||
let pluginFileNames = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
|
||||
'Governance',
|
||||
'User-Profiles'
|
||||
)
|
||||
for (let i = 0; i < pluginFileNames.length; i++) {
|
||||
let pluginFileName = pluginFileNames[i]
|
||||
|
||||
let pluginFileContent = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
|
||||
'Governance',
|
||||
'User-Profiles',
|
||||
pluginFileName
|
||||
)
|
||||
|
||||
let otherUserProfile = JSON.parse(pluginFileContent)
|
||||
userProfileIdMap.set(otherUserProfile.id, otherUserProfile.name)
|
||||
}
|
||||
|
||||
let testUserProfile = userProfileIdMap.get(userProfile.id)
|
||||
if (testUserProfile === undefined) { return true }
|
||||
if (testUserProfile !== userProfile.name) {
|
||||
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #7 Failed -> Pull Request "' + pullRequest.title + '" not merged because the User Profile Id already exists and belongs to another User Profile on record. -> Profile Id = ' + userProfile.id + '-> User Profile with the same Id = ' + testUserProfile)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because the User Profile Id already exists and belongs to another User Profile on record. \n\nUser Profile Id = "' + userProfile.id + '" \n\n User Profile with the same Id = "' + testUserProfile + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function validateUserProfileBlockchainAccountDoesNotBelongtoAnotherUserProfile() {
|
||||
try {
|
||||
/*
|
||||
Validation #8 The blockchain account of the User Profile can not be the
|
||||
blockchain account of an already existing User Profile
|
||||
unless the existing one belongs to the same Github username.
|
||||
*/
|
||||
let userProfileIdMap = new Map()
|
||||
let pluginFileNames = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
|
||||
'Governance',
|
||||
'User-Profiles'
|
||||
)
|
||||
for (let i = 0; i < pluginFileNames.length; i++) {
|
||||
let pluginFileName = pluginFileNames[i]
|
||||
let pluginFileContent = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
|
||||
'Governance',
|
||||
'User-Profiles',
|
||||
pluginFileName
|
||||
)
|
||||
|
||||
let otherUserProfile = JSON.parse(pluginFileContent)
|
||||
|
||||
let config = JSON.parse(otherUserProfile.config)
|
||||
let messageSigned = JSON.stringify(config.signature)
|
||||
let serverResponse = await PL.servers.WEB3_SERVER.recoverAddress(
|
||||
messageSigned
|
||||
)
|
||||
userProfileIdMap.set(serverResponse.address, otherUserProfile.name)
|
||||
}
|
||||
|
||||
let config = JSON.parse(userProfile.config)
|
||||
let messageSigned = JSON.stringify(config.signature)
|
||||
let serverResponse = await PL.servers.WEB3_SERVER.recoverAddress(
|
||||
messageSigned
|
||||
)
|
||||
|
||||
let testUserProfile = userProfileIdMap.get(serverResponse.address)
|
||||
if (testUserProfile === undefined) { return true }
|
||||
if (testUserProfile !== userProfile.name) {
|
||||
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #8 Failed -> Pull Request "' + pullRequest.title + '" not merged because the User Profile Blockchain Account already exists and belongs to another User Profile on record. -> Profile Blockchain Account = ' + serverResponse.address + '-> User Profile with the same Blockchain Account = ' + testUserProfile)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because the User Profile Blockchain Account already exists and belongs to another User Profile on record. \n\nUser Profile Blockchain Account = "' + serverResponse.address + '" \n\n User Profile with the same Blockchain Account = "' + testUserProfile + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err.stack)
|
||||
}
|
||||
}
|
||||
|
||||
async function validateUserProfileSigningAccountsDoesNotBelongtoAnotherUserProfile() {
|
||||
try {
|
||||
|
||||
if (userProfile.signingAccounts === undefined) { return true }
|
||||
|
||||
for (let i = 0; i < userProfile.signingAccounts.signingAccounts.length; i++) {
|
||||
let signingAccount = userProfile.signingAccounts.signingAccounts[i]
|
||||
let config = JSON.parse(signingAccount.config)
|
||||
/*
|
||||
Validation #9 Signing accounts of the User Profile
|
||||
must have a signature of the same Github username of the User Profile.
|
||||
*/
|
||||
let messageSigned = config.signature.message
|
||||
|
||||
if (messageSigned !== githubUsername) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #9 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Signing Account ' + signingAccount.name + ' has not signed the current Github User Account, but something else. -> messageSigned = ' + messageSigned + '-> githubUsername = ' + githubUsername)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because the Signing Account "' + signingAccount.name + '" has not signed the current Github User Account, but something else. \n\n messageSigned = "' + messageSigned + '" \n\n githubUsername = "' + githubUsername + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
/*
|
||||
Validation #10: The message signed has is equal to the signature messageHash.
|
||||
*/
|
||||
let serverResponse = await PL.servers.WEB3_SERVER.hashData(
|
||||
config.signature.message
|
||||
)
|
||||
let messageSignedHash = serverResponse.hash
|
||||
let signatureHash = config.signature.messageHash
|
||||
|
||||
if (messageSignedHash !== signatureHash) {
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #10 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Message Signed Hash is not equal to the the Signature Hash. -> messageSignedHash = ' + messageSignedHash + '-> signatureHash = ' + signatureHash)
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because the Message Signed Hash is not equal to the the Signature Hash.\n\n messageSignedHash = "' + messageSignedHash + '"\n\n signatureHash = "' + signatureHash + '"'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
} catch (err) {
|
||||
console.log(err.stack)
|
||||
}
|
||||
}
|
||||
|
||||
async function mergePullRequest() {
|
||||
/*
|
||||
All validations passed, we will proceed an merge this Pull Request.
|
||||
*/
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
mergeResponse = await octokit.rest.pulls.merge({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
commit_title: 'Changes in User Profile done by Profile Owner ' + githubUsername + ' automatically merged by Superalgos.'
|
||||
});
|
||||
return mergeResponse.data.merged
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function closePrsToMaster() {
|
||||
|
||||
let githubPrListMaster = []
|
||||
const per_page = 100 // Max
|
||||
let page = 0
|
||||
|
||||
try {
|
||||
page++
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
|
||||
let listResponse = await octokit.rest.pulls.list({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
state: 'open',
|
||||
head: undefined,
|
||||
base: 'master',
|
||||
sort: undefined,
|
||||
direction: undefined,
|
||||
per_page: per_page,
|
||||
page: page
|
||||
});
|
||||
|
||||
if (listResponse.data.length < 100) {
|
||||
lastPage = true
|
||||
}
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster -> Receiving Page = ' + page)
|
||||
for (let i = 0; i < listResponse.data.length; i++) {
|
||||
let pullRequest = listResponse.data[i]
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster -> Pull Request "' + pullRequest.title + '" found and added to the list to validate. ')
|
||||
githubPrListMaster.push(pullRequest)
|
||||
}
|
||||
console.log('[INFO] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster -> Received = ' + listResponse.data.length)
|
||||
|
||||
for (let i = 0; i < githubPrListMaster.length; i++) {
|
||||
let pullRequest = githubPrListMaster[i]
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: pullRequest.number,
|
||||
body: 'Hi, this is the Superalgos Governance System taking notice that you have submitted a pull request directly to the master branch.\n\nThanks for submitting a PR to the Superalgos Project. We value every contribution and everyone is welcome to send PRs. Unfortunatelly we are not merging pull requests directly into the master branch. Consider resubmitting to the develop branch intstead. For your convinienve, you can swithch branches from within the app, at the footer of the Docs tab. \n\n I will close this pull request now and look forward for your next contribution either to the develop branch or any other branch available for this purpose.'
|
||||
});
|
||||
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
|
||||
await octokit.rest.pulls.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
pull_number: pullRequest.number,
|
||||
state: 'closed'
|
||||
});
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
|
||||
if (err.stack.indexOf('last page') >= 0) {
|
||||
return
|
||||
} else {
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->Method call produced an error.')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->repository = ' + repository)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->username = ' + username)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->token starts with = ' + token.substring(0, 10) + '...')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> closePrsToMaster ->token ends with = ' + '...' + token.substring(token.length - 10))
|
||||
error = err
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> err.stack = ' + err.stack)
|
||||
}
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> Method call produced an error.')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> repository = ' + repository)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> username = ' + username)
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> token starts with = ' + token.substring(0, 10) + '...')
|
||||
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> token ends with = ' + '...' + token.substring(token.length - 10))
|
||||
|
||||
let error = {
|
||||
result: 'Fail Because',
|
||||
message: err.message,
|
||||
stack: err.stack
|
||||
}
|
||||
return error
|
||||
}
|
||||
}
|
||||
|
||||
function respondWithDocsObject(docs, error) {
|
||||
|
||||
if (error.message !== undefined) {
|
||||
docs.placeholder.errorMessage = {
|
||||
style: 'Error',
|
||||
text: error.message
|
||||
}
|
||||
}
|
||||
if (error.stack !== undefined) {
|
||||
docs.placeholder.errorStack = {
|
||||
style: 'Javascript',
|
||||
text: error.stack
|
||||
}
|
||||
}
|
||||
if (error.code !== undefined) {
|
||||
docs.placeholder.errorCode = {
|
||||
style: 'Json',
|
||||
text: error.code
|
||||
}
|
||||
}
|
||||
|
||||
docs.placeholder.errorDetails = {
|
||||
style: 'Json',
|
||||
text: JSON.stringify(error, undefined, 4)
|
||||
}
|
||||
|
||||
let customResponse = {
|
||||
result: global.CUSTOM_FAIL_RESPONSE.result,
|
||||
docs: docs
|
||||
}
|
||||
|
||||
return customResponse
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
@@ -1,4 +1,4 @@
|
||||
exports.newTaskManagerServer = function newTaskManagerServer(WEB_SOCKETS_INTERFACE, EVENT_SERVER) {
|
||||
exports.newTaskManagerServer = function newTaskManagerServer() {
|
||||
|
||||
let thisObject = {
|
||||
initialize: initialize,
|
||||
@@ -63,7 +63,7 @@
|
||||
//console.log('[INFO] Client -> Task Manager Server -> runTask -> Task Name = ' + message.event.taskName)
|
||||
//console.log('[INFO] Client -> Task Manager Server -> runTask -> Task Id = ' + message.event.taskId)
|
||||
|
||||
let path = global.env.PATH_TO_TASK_SERVER + '/Task.js'
|
||||
let path = './TaskServerRoot.js'
|
||||
|
||||
/* Workarround to avoid having the same debug port at the forked process which makes it crash. */
|
||||
for (let i = 0; i < process.execArgv.length; i++) {
|
||||
@@ -263,7 +263,7 @@
|
||||
responseWaiters.set(command.callerId, responseCallBack)
|
||||
}
|
||||
|
||||
EVENT_SERVER.onMessage(JSON.stringify(command), thisObject.onMessage)
|
||||
PL.servers.EVENT_SERVER.onMessage(JSON.stringify(command), thisObject.onMessage)
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Client -> Task Manager Server -> sendCommand -> Error Sending Command to Events Server -> command = ' + JSON.stringify(command))
|
||||
console.log('[ERROR] Client -> Task Manager Server -> sendCommand -> Error Sending Command to Events Server -> error = ' + err.stack)
|
||||
File renamed without changes.
@@ -6,12 +6,17 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
getNetworkClientStatus: getNetworkClientStatus,
|
||||
createWalletAccount: createWalletAccount,
|
||||
getWalletBalances: getWalletBalances,
|
||||
signData: signData,
|
||||
hashData: hashData,
|
||||
recoverAddress: recoverAddress,
|
||||
mnemonicToPrivateKey: mnemonicToPrivateKey,
|
||||
payContributors: payContributors,
|
||||
initialize: initialize,
|
||||
finalize: finalize,
|
||||
run: run
|
||||
}
|
||||
|
||||
const Web3 = require('web3');
|
||||
const Web3 = SA.nodeModules.web3
|
||||
let web3Map = new Map()
|
||||
|
||||
return thisObject
|
||||
@@ -56,7 +61,7 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
return status
|
||||
}
|
||||
} catch (err) {
|
||||
return { error: 'Could not connect to ' + key + '. ' + err.message + '.' }
|
||||
return { error: 'Could not connect to ' + key + '. ' + err.stack + '.' }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +78,7 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not create the account. ' + err.message }
|
||||
return { error: 'Could not create the account. ' + err.stack }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,22 +121,22 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
for (let j = 0; j < walletAccount.tokenBalances.length; j++) {
|
||||
let tokenBalance = walletAccount.tokenBalances[j]
|
||||
|
||||
if (tokenBalance.referenceParent === undefined) { continue }
|
||||
if (tokenBalance.referenceParent.parentNode === undefined) { continue }
|
||||
if (tokenBalance.referenceParent.smartContracts === undefined) { continue }
|
||||
if (tokenBalance.referenceParent === undefined) { continue }
|
||||
if (tokenBalance.referenceParent.parentNode === undefined) { continue }
|
||||
if (tokenBalance.referenceParent.smartContracts === undefined) { continue }
|
||||
|
||||
if (tokenBalance.referenceParent.config.codeName === undefined) {
|
||||
tokenBalance.error = 'Reference Parent without config.codeName defined.'
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if (tokenBalance.referenceParent.smartContracts.config.address === undefined) {
|
||||
tokenBalance.error = 'Reference Parent Smart Contract without config.address defined.'
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
let tokenContractAddress = tokenBalance.referenceParent.smartContracts.config.address
|
||||
// The minimum ABI to get ERC20 Token balance
|
||||
// The minimum ABI to get ERC20 Token balance
|
||||
let minABI = [
|
||||
// balanceOf
|
||||
{
|
||||
@@ -152,8 +157,8 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
];
|
||||
|
||||
let contract = new web3.eth.Contract(minABI, tokenContractAddress);
|
||||
|
||||
try {
|
||||
|
||||
try {
|
||||
tokenBalance.value = await contract.methods.balanceOf(walletAccount.config.address).call()
|
||||
} catch (err) {
|
||||
if (err.message.indexOf('Provided address') >= 0) {
|
||||
@@ -170,7 +175,7 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
return responseData
|
||||
}
|
||||
} catch (err) {
|
||||
return { error: 'Could not connect to ' + key + '. ' + err.message + '.' }
|
||||
return { error: 'Could not connect to ' + key + '. ' + err.stack + '.' }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,4 +207,154 @@ exports.newWeb3Server = function newWeb3Server() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function signData(privateKey, data) {
|
||||
try {
|
||||
|
||||
let web3 = new Web3()
|
||||
let signature = web3.eth.accounts.sign(data, privateKey)
|
||||
|
||||
return {
|
||||
signature: signature,
|
||||
result: 'Ok'
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not sign the data. ' + err.stack }
|
||||
}
|
||||
}
|
||||
|
||||
async function hashData(data) {
|
||||
try {
|
||||
|
||||
let web3 = new Web3()
|
||||
let hash = web3.eth.accounts.hashMessage(data)
|
||||
|
||||
return {
|
||||
hash: hash,
|
||||
result: 'Ok'
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not hash the data. ' + err.stack }
|
||||
}
|
||||
}
|
||||
|
||||
async function recoverAddress(signature) {
|
||||
try {
|
||||
let signatureObject = JSON.parse(signature)
|
||||
let web3 = new Web3()
|
||||
let address = web3.eth.accounts.recover(signatureObject)
|
||||
|
||||
return {
|
||||
address: address,
|
||||
result: 'Ok'
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not recover address. ' + err.stack }
|
||||
}
|
||||
}
|
||||
|
||||
async function mnemonicToPrivateKey(mnemonic) {
|
||||
try {
|
||||
const ethers = SA.nodeModules.ethers
|
||||
let wallet = ethers.Wallet.fromMnemonic(mnemonic)
|
||||
|
||||
if (wallet.privateKey !== undefined) {
|
||||
return {
|
||||
address: wallet.address,
|
||||
privateKey: wallet.privateKey,
|
||||
result: 'Ok'
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
address: undefined,
|
||||
privateKey: undefined,
|
||||
result: 'Fail'
|
||||
}
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not convert to Private Key. ' + err.stack }
|
||||
}
|
||||
}
|
||||
|
||||
async function payContributors(contractAddress, contractAbi, paymentsArray, mnemonic) {
|
||||
try {
|
||||
let response = await mnemonicToPrivateKey(mnemonic)
|
||||
let privateKey = response.privateKey
|
||||
|
||||
for (let i = 0; i < paymentsArray.length; i++) {
|
||||
await PL.projects.foundations.utilities.asyncFunctions.sleep(10000)
|
||||
let payment = paymentsArray[i]
|
||||
sendTokens(
|
||||
i + 1,
|
||||
payment.userProfile,
|
||||
payment.from,
|
||||
payment.to,
|
||||
payment.amount
|
||||
)
|
||||
}
|
||||
|
||||
async function sendTokens(number, userProfile, fromAddress, toAddress, tokenAmount) {
|
||||
try {
|
||||
console.log('')
|
||||
console.log('---------------------------------------------------------------------------------------------------------------------------------------------------')
|
||||
console.log(' Payment # ' + number + ' - User Profile: ' + userProfile + ' - SA Tokens Amount: ' + tokenAmount / 1000000000000000000 + ' - Address: ' + toAddress)
|
||||
console.log('---------------------------------------------------------------------------------------------------------------------------------------------------')
|
||||
console.log('')
|
||||
|
||||
const Tx = SA.nodeModules.ethereumjsTx.Transaction;
|
||||
const web3 = new Web3(new Web3.providers.HttpProvider('https://bsc-dataseed.binance.org/'))
|
||||
const amount = web3.utils.toHex(tokenAmount)
|
||||
privateKey = privateKey.replace('0x', '')
|
||||
const privateKeyBuffer = Buffer.from(privateKey, 'hex')
|
||||
const contractAbiObject = JSON.parse(contractAbi)
|
||||
const contract = new web3.eth.Contract(contractAbiObject, contractAddress, { from: fromAddress })
|
||||
const Common = SA.nodeModules.ethereumjsCommon.default
|
||||
const BSC_FORK = Common.forCustomChain(
|
||||
'mainnet',
|
||||
{
|
||||
name: 'Binance Smart Chain Mainnet',
|
||||
networkId: 56,
|
||||
chainId: 56,
|
||||
url: 'https://bsc-dataseed.binance.org/'
|
||||
},
|
||||
'istanbul',
|
||||
);
|
||||
|
||||
const nonce = await web3.eth.getTransactionCount(fromAddress);
|
||||
|
||||
const rawTransaction = {
|
||||
"from": fromAddress,
|
||||
"gasPrice": web3.utils.toHex(5000000000),
|
||||
"gasLimit": web3.utils.toHex(210000),
|
||||
"to": contractAddress, "value": "0x0",
|
||||
"data": contract.methods.transfer(toAddress, amount).encodeABI(),
|
||||
"nonce": web3.utils.toHex(nonce)
|
||||
};
|
||||
|
||||
const transaction = new Tx(rawTransaction, { 'common': BSC_FORK })
|
||||
transaction.sign(privateKeyBuffer)
|
||||
|
||||
console.log('Transaction:', rawTransaction)
|
||||
const result = await web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
|
||||
console.log('Result:', result)
|
||||
return result
|
||||
} catch (err) {
|
||||
console.log('[ERROR] web3Server -> sendTokens -> err.stack = ' + err.stack)
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
address: wallet.address,
|
||||
privateKey: wallet.privateKey,
|
||||
result: 'Ok'
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
return { error: 'Could not convert to Private Key. ' + err.stack }
|
||||
}
|
||||
}
|
||||
}
|
||||
File renamed without changes.
@@ -1,30 +1,24 @@
|
||||
exports.newWebSocketsInterface = function newWebSocketsInterface(EVENT_SERVER) {
|
||||
exports.newWebSocketsInterface = function newWebSocketsInterface() {
|
||||
|
||||
const MODULE = "Web Sockets Interface"
|
||||
const LOG_INFO = false
|
||||
|
||||
let thisObject = {
|
||||
initialize: initialize,
|
||||
finalize: finalize,
|
||||
run: run
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
const WEB_SOCKET = require('ws')
|
||||
const WEB_SOCKET = SA.nodeModules.ws
|
||||
let socketServer
|
||||
let port = global.env.WEB_SOCKETS_INTERFACE_PORT
|
||||
let port = global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
|
||||
socketServer = undefined
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
|
||||
}
|
||||
|
||||
function run() {
|
||||
setUpWebSocketServer()
|
||||
setUpWebSocketServer()
|
||||
}
|
||||
|
||||
function setUpWebSocketServer() {
|
||||
@@ -48,8 +42,8 @@
|
||||
if (LOG_INFO === true) {
|
||||
console.log('Message Received: ' + message.substring(0, 1000))
|
||||
}
|
||||
|
||||
let messageArray = message.split('|*|')
|
||||
|
||||
let messageArray = message.toString().split('|*|')
|
||||
|
||||
let origin = messageArray[0]
|
||||
let nonce = messageArray[1]
|
||||
@@ -76,7 +70,7 @@
|
||||
lastNonce = nonce
|
||||
|
||||
try {
|
||||
let jsonCheck = JSON.parse(messageToEventServer)
|
||||
JSON.parse(messageToEventServer)
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Client -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. message = ' + message.substring(0, 1000))
|
||||
console.log('[ERROR] Client -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. messageToEventServer = ' + messageToEventServer)
|
||||
@@ -92,7 +86,7 @@
|
||||
}
|
||||
|
||||
|
||||
EVENT_SERVER.onMessage(messageToEventServer, onResponse)
|
||||
PL.servers.EVENT_SERVER.onMessage(messageToEventServer, onResponse)
|
||||
|
||||
function onResponse(message) {
|
||||
socket.send(message)
|
||||
@@ -103,7 +97,8 @@
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Client -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.message = ' + err.message.substring(0, 1000))
|
||||
console.log('[ERROR] Client -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.message = ' + err.message)
|
||||
console.log('[ERROR] Client -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.message = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
exports.newPlatformApp = function newPlatformApp() {
|
||||
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
if (err.message && err.message.indexOf("EADDRINUSE") > 0) {
|
||||
console.log("The Superalgos Platform Client cannot be started. Reason: the port configured migth be being used by another application, or Superalgos Platform Client might be already running.")
|
||||
return
|
||||
}
|
||||
console.log('[ERROR] Platform App -> uncaughtException -> err.message = ' + err.message)
|
||||
console.log('[ERROR] Platform App -> uncaughtException -> err.stack = ' + err.stack)
|
||||
console.log('[ERROR] Platform App -> uncaughtException -> err = ' + err)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
// Signal user that a necissary node module is missing
|
||||
if (reason.code == 'MODULE_NOT_FOUND') {
|
||||
console.log("[ERROR] Dependency library not found. Please try running the 'node setup' command and then restart the Superalgos Platform Client.")
|
||||
console.log('[ERROR] Platform App -> reason = ' + JSON.stringify(reason))
|
||||
process.exit(1)
|
||||
}
|
||||
console.log('[ERROR] Platform App -> unhandledRejection -> reason = ' + JSON.stringify(reason))
|
||||
console.log('[ERROR] Platform App -> unhandledRejection -> p = ' + JSON.stringify(p))
|
||||
process.exit(1)
|
||||
})
|
||||
try {
|
||||
/* Callbacks default responses. */
|
||||
|
||||
global.DEFAULT_OK_RESPONSE = {
|
||||
result: "Ok",
|
||||
message: "Operation Succeeded"
|
||||
};
|
||||
|
||||
global.DEFAULT_FAIL_RESPONSE = {
|
||||
result: "Fail",
|
||||
message: "Operation Failed"
|
||||
};
|
||||
|
||||
global.DEFAULT_RETRY_RESPONSE = {
|
||||
result: 'Retry',
|
||||
message: 'Retry Later'
|
||||
}
|
||||
|
||||
global.CUSTOM_OK_RESPONSE = {
|
||||
result: 'Ok, but check Message',
|
||||
message: 'Custom Message'
|
||||
}
|
||||
|
||||
global.CUSTOM_FAIL_RESPONSE = {
|
||||
result: 'Fail Because',
|
||||
message: 'Custom Message'
|
||||
}
|
||||
|
||||
/* Servers */
|
||||
let WEB_SERVER = require('./Client/webServer.js')
|
||||
let DATA_FILE_SERVER = require('./Client/dataFileServer.js')
|
||||
let PROJECT_FILE_SERVER = require('./Client/projectFileServer.js')
|
||||
let UI_FILE_SERVER = require('./Client/uiFileServer.js')
|
||||
let PLUGIN_SERVER = require('./Client/pluginServer.js')
|
||||
let EVENT_SERVER = require('./Client/eventServer.js')
|
||||
let TASK_MANAGER_SERVER = require('./Client/taskManagerServer.js')
|
||||
let CCXT_SERVER = require('./Client/ccxtServer.js')
|
||||
let WEB3_SERVER = require('./Client/web3Server.js')
|
||||
let GITHUB_SERVER = require('./Client/githubServer.js')
|
||||
|
||||
/* Network Interfaces */
|
||||
let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js')
|
||||
let HTTP_INTERFACE = require('./Client/httpInterface.js')
|
||||
/*
|
||||
Setting up servers running inside this Client.
|
||||
*/
|
||||
PL.servers = {}
|
||||
console.log('SUPERALGOS PLATFORM CLIENT SERVERS:')
|
||||
console.log('')
|
||||
|
||||
PL.servers.WEB_SERVER = WEB_SERVER.newWebServer()
|
||||
PL.servers.WEB_SERVER.initialize()
|
||||
PL.servers.WEB_SERVER.run()
|
||||
console.log('Web Server .................................................. Started')
|
||||
|
||||
PL.servers.UI_FILE_SERVER = UI_FILE_SERVER.newUIFileServer()
|
||||
PL.servers.UI_FILE_SERVER.initialize()
|
||||
PL.servers.UI_FILE_SERVER.run()
|
||||
console.log('UI File Server .............................................. Started')
|
||||
|
||||
PL.servers.PROJECT_FILE_SERVER = PROJECT_FILE_SERVER.newProjectFileServer()
|
||||
PL.servers.PROJECT_FILE_SERVER.initialize()
|
||||
PL.servers.PROJECT_FILE_SERVER.run()
|
||||
console.log('Project File Server ......................................... Started')
|
||||
|
||||
PL.servers.PLUGIN_SERVER = PLUGIN_SERVER.newPluginServer()
|
||||
PL.servers.PLUGIN_SERVER.initialize()
|
||||
PL.servers.PLUGIN_SERVER.run()
|
||||
console.log('Plugin Server ............................................... Started')
|
||||
|
||||
PL.servers.DATA_FILE_SERVER = DATA_FILE_SERVER.newDataFileServer()
|
||||
PL.servers.DATA_FILE_SERVER.initialize()
|
||||
PL.servers.DATA_FILE_SERVER.run()
|
||||
console.log('Data File Server ............................................ Started')
|
||||
|
||||
PL.servers.EVENT_SERVER = EVENT_SERVER.newEventServer()
|
||||
PL.servers.EVENT_SERVER.initialize()
|
||||
PL.servers.EVENT_SERVER.run()
|
||||
console.log('Events Server ............................................... Started')
|
||||
|
||||
TASK_MANAGER_SERVER = TASK_MANAGER_SERVER.newTaskManagerServer()
|
||||
TASK_MANAGER_SERVER.initialize()
|
||||
TASK_MANAGER_SERVER.run()
|
||||
console.log('Task Manager Server ......................................... Started')
|
||||
|
||||
PL.servers.CCXT_SERVER = CCXT_SERVER.newCCXTServer()
|
||||
PL.servers.CCXT_SERVER.initialize()
|
||||
PL.servers.CCXT_SERVER.run()
|
||||
console.log('CCXT Server ................................................. Started')
|
||||
|
||||
PL.servers.WEB3_SERVER = WEB3_SERVER.newWeb3Server()
|
||||
PL.servers.WEB3_SERVER.initialize()
|
||||
PL.servers.WEB3_SERVER.run()
|
||||
console.log('WEB3 Server ................................................. Started')
|
||||
|
||||
PL.servers.GITHUB_SERVER = GITHUB_SERVER.newGithubServer()
|
||||
PL.servers.GITHUB_SERVER.initialize()
|
||||
PL.servers.GITHUB_SERVER.run()
|
||||
console.log('Github Server ............................................... Started')
|
||||
|
||||
console.log('')
|
||||
console.log('SUPERALGOS PLATFORM CLIENT INTERFACES:')
|
||||
console.log('')
|
||||
|
||||
WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
|
||||
WEB_SOCKETS_INTERFACE.initialize()
|
||||
console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
|
||||
HTTP_INTERFACE.initialize()
|
||||
console.log('Http Interface .............................................. Listening at port ' + global.env.CLIENT_HTTP_INTERFACE_PORT)
|
||||
|
||||
console.log('')
|
||||
console.log("You are running Superalgos Beta 11")
|
||||
console.log('')
|
||||
console.log("What's new? These are the main new features in this version:")
|
||||
console.log('')
|
||||
console.log('Governance System ........................................... Automates the distribution of SA Tokens and allow users to vote on the direction of the project.')
|
||||
console.log('TensorFlow Integration ...................................... Allows creating and training ML models and use them in trading strategies.')
|
||||
console.log('')
|
||||
console.log("What's next? This is the current development pipeline:")
|
||||
console.log('')
|
||||
console.log('Superalgos P2P Network ...................................... Will allow algo-traders to share trading signals with Superalgos users consuming these signals via a mobile app.')
|
||||
console.log('Real-time Trading Signals ................................... Will allow users to emit trading signals and be rewarded with SA Tokens.')
|
||||
console.log('Superalgos Mobile ........................................... Will allow users to consume trading signals for free and autonomously execute trades from their mobile phones.')
|
||||
console.log('Ethereum Integration ........................................ Will allow mining data from an Ethereum network node, and bring it into the Superalgos workflow. [Looking for an Ethereum dev that would like to continue this line of development.]')
|
||||
|
||||
console.log('')
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Platform App -> Error = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
File renamed without changes.
@@ -116,23 +116,23 @@ function newAnimation() {
|
||||
for (const [key, timeConsumed] of performanceMap.entries()) {
|
||||
row++
|
||||
let labelToPrint = key + ' ' + timeConsumed.toFixed(4)
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(labelToPrint, 10,undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(labelToPrint, 10,undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
let percentage = timeConsumed * 100 / totalTimeConsumed
|
||||
labelToPrint = key + ' ' + percentage.toFixed(1) + '%'
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(labelToPrint, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(labelToPrint, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
}
|
||||
|
||||
/* Other Variables */
|
||||
row++
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(DEBUG.variable1, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(DEBUG.variable1, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
row++
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(DEBUG.variable2, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(DEBUG.variable2, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
row++
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(DEBUG.variable3, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(DEBUG.variable3, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
row++
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel(DEBUG.variable4, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel(DEBUG.variable4, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
row++
|
||||
UI.projects.superalgos.utilities.drawPrint.printLabel('Animation Frame Per Seconds: ' + ANIMATION_FRAME_PER_SECONDS, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
UI.projects.foundations.utilities.drawPrint.printLabel('Animation Frame Per Seconds: ' + ANIMATION_FRAME_PER_SECONDS, 300, undefined, undefined, 100 + row * 30, 1, 20, UI_COLOR.RED, 'Left')
|
||||
}
|
||||
|
||||
/* Video Recording */
|
||||
@@ -144,7 +144,7 @@ function newAnimation() {
|
||||
/* Panorama Recording */
|
||||
if (ARE_WE_RECORDING_A_MARKET_PANORAMA === true) {
|
||||
if (PANORAMA_WAS_PANNED === true) {
|
||||
UI.projects.superalgos.utilities.download.addToMarketPanorama()
|
||||
UI.projects.foundations.utilities.download.addToMarketPanorama()
|
||||
PANORAMA_WAS_PANNED = false
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
let postLoader
|
||||
|
||||
function newAppLoader() {
|
||||
const MODULE_NAME = 'App Loader'
|
||||
const INFO_LOG = false
|
||||
const ERROR_LOG = true
|
||||
const logger = newWebDebugLog()
|
||||
|
||||
|
||||
|
||||
let thisObject = {
|
||||
loadModules: loadModules
|
||||
@@ -64,16 +63,16 @@ function newAppLoader() {
|
||||
let fileArray = JSON.parse(fileList)
|
||||
for (let i = 0; i < fileArray.length; i++) {
|
||||
let item = fileArray[i]
|
||||
|
||||
project = item[0]
|
||||
fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
|
||||
|
||||
let project = item[0]
|
||||
let fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
|
||||
}
|
||||
|
||||
modulesArray = modulesArray.concat(urlArray)
|
||||
utilities()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function utilities() {
|
||||
let url = 'ListUtilitiesFiles'
|
||||
@@ -84,16 +83,16 @@ function newAppLoader() {
|
||||
let fileArray = JSON.parse(fileList)
|
||||
for (let i = 0; i < fileArray.length; i++) {
|
||||
let item = fileArray[i]
|
||||
|
||||
project = item[0]
|
||||
fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
|
||||
|
||||
let project = item[0]
|
||||
let fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
|
||||
}
|
||||
|
||||
modulesArray = modulesArray.concat(urlArray)
|
||||
globals()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function globals() {
|
||||
let url = 'ListGlobalFiles'
|
||||
@@ -104,16 +103,16 @@ function newAppLoader() {
|
||||
let fileArray = JSON.parse(fileList)
|
||||
for (let i = 0; i < fileArray.length; i++) {
|
||||
let item = fileArray[i]
|
||||
|
||||
project = item[0]
|
||||
fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
|
||||
|
||||
let project = item[0]
|
||||
let fileName = item[1]
|
||||
urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
|
||||
}
|
||||
|
||||
modulesArray = modulesArray.concat(urlArray)
|
||||
spaces()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function spaces() {
|
||||
let url = 'ListSpaceFiles'
|
||||
@@ -138,7 +137,7 @@ function newAppLoader() {
|
||||
|
||||
for (let i = 0; i < modulesArray.length; i++) {
|
||||
let path = modulesArray[i]
|
||||
|
||||
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') }
|
||||
@@ -177,13 +176,13 @@ function newAppLoader() {
|
||||
|
||||
function defaultPlotters() {
|
||||
return [
|
||||
'Plotters/Superalgos/Candles/Plotters-Candles-Volumes/Candles.js',
|
||||
'Plotters/Superalgos/Candles/Plotters-Candles-Volumes/CandlePanel.js',
|
||||
'Plotters/Superalgos/Candles/Plotters-Candles-Volumes/Volumes.js',
|
||||
'Plotters/Superalgos/Candles/Plotters-Candles-Volumes/VolumePanel.js',
|
||||
'Plotters/Superalgos/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js',
|
||||
'Plotters/Superalgos/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js',
|
||||
'Plotters/Superalgos/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js'
|
||||
'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Candles.js',
|
||||
'Plotters/Foundations/Candles/Plotters-Candles-Volumes/CandlePanel.js',
|
||||
'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Volumes.js',
|
||||
'Plotters/Foundations/Candles/Plotters-Candles-Volumes/VolumePanel.js',
|
||||
'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js',
|
||||
'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js',
|
||||
'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js'
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -14,11 +14,8 @@ function newAppPostLoader() {
|
||||
|
||||
function start() {
|
||||
try {
|
||||
/* Moving PROJECTS_ARRAY to the global variable */
|
||||
PROJECTS_ARRAY = window.PROJECTS
|
||||
window.PROJECTS = undefined
|
||||
|
||||
setBrowserEvents()
|
||||
|
||||
// autoSaveWhenClosingTheBrowser()
|
||||
setupProjectsSchema()
|
||||
|
||||
function setupProjectsSchema() {
|
||||
@@ -35,8 +32,8 @@ function newAppPostLoader() {
|
||||
let totalWebServerCalls = 0
|
||||
let webServerResponses = 0
|
||||
|
||||
for (let i = 0; i < PROJECTS_ARRAY.length; i++) {
|
||||
let project = PROJECTS_ARRAY[i]
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
let project = PROJECTS_SCHEMA[i].name
|
||||
let schemas = {
|
||||
array: {
|
||||
appSchema: [],
|
||||
@@ -213,7 +210,7 @@ function newAppPostLoader() {
|
||||
}
|
||||
}
|
||||
|
||||
function setBrowserEvents() {
|
||||
function autoSaveWhenClosingTheBrowser() {
|
||||
window.onbeforeunload = saveWorkspace
|
||||
|
||||
/* handles backspace and refresh(F5) from keyboard */
|
||||
@@ -229,7 +226,7 @@ function newAppPostLoader() {
|
||||
window.addEventListener('keydown', window.manageBackRefresh)
|
||||
|
||||
function saveWorkspace() {
|
||||
UI.projects.superalgos.spaces.designSpace.workspace.save()
|
||||
UI.projects.foundations.spaces.designSpace.workspace.save()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,78 +1,78 @@
|
||||
|
||||
/* Callbacks default responses. */
|
||||
|
||||
let GLOBAL = {};
|
||||
let GLOBAL = {}
|
||||
|
||||
GLOBAL.DEFAULT_OK_RESPONSE = {
|
||||
result: "Ok",
|
||||
message: "Operation Succeeded"
|
||||
};
|
||||
}
|
||||
|
||||
GLOBAL.DEFAULT_FAIL_RESPONSE = {
|
||||
result: "Fail",
|
||||
message: "Operation Failed"
|
||||
};
|
||||
}
|
||||
|
||||
GLOBAL.DEFAULT_RETRY_RESPONSE = {
|
||||
result: "Retry",
|
||||
message: "Retry Later"
|
||||
};
|
||||
}
|
||||
|
||||
GLOBAL.CUSTOM_OK_RESPONSE = {
|
||||
result: "Ok, but check Message",
|
||||
message: "Custom Message"
|
||||
};
|
||||
}
|
||||
|
||||
GLOBAL.CUSTOM_FAIL_RESPONSE = {
|
||||
result: "Fail Because",
|
||||
message: "Custom Message"
|
||||
};
|
||||
}
|
||||
|
||||
let browserCanvas; // This is the canvas object of the browser.
|
||||
let browserCanvas // This is the canvas object of the browser.
|
||||
|
||||
function spacePad(str, max) {
|
||||
str = str.toString();
|
||||
return str.length < max ? spacePad(" " + str, max) : str;
|
||||
str = str.toString()
|
||||
return str.length < max ? spacePad(" " + str, max) : str
|
||||
}
|
||||
|
||||
function loadSuperalgos() {
|
||||
|
||||
const MODULE_NAME = "App Pre-Loader";
|
||||
const INFO_LOG = false;
|
||||
const MODULE_NAME = "App Pre-Loader"
|
||||
const INFO_LOG = false
|
||||
|
||||
let browser = checkBrowserVersion();
|
||||
let browser = checkBrowserVersion()
|
||||
setupHTMLTextArea()
|
||||
setupHTMLInput()
|
||||
setupHTMLCanvas()
|
||||
loadDebugModule()
|
||||
|
||||
if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
|
||||
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version);
|
||||
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
|
||||
}
|
||||
|
||||
function checkBrowserVersion () {
|
||||
|
||||
let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
|
||||
let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []
|
||||
if(/trident/i.test(M[1])){
|
||||
tem=/\brv[ :]+(\d+)/g.exec(ua) || [];
|
||||
return {name:'IE',version:(tem[1]||'')};
|
||||
tem=/\brv[ :]+(\d+)/g.exec(ua) || []
|
||||
return {name:'IE',version:(tem[1]||'')}
|
||||
}
|
||||
if(M[1]==='Chrome'){
|
||||
tem=ua.match(/\bOPR|Edge\/(\d+)/)
|
||||
if(tem!=null) {return {name:'Opera', version:tem[1]};}
|
||||
if(tem!=null) {return {name:'Opera', version:tem[1]}}
|
||||
}
|
||||
M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
|
||||
if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);}
|
||||
M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']
|
||||
if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1])}
|
||||
return {
|
||||
name: M[0],
|
||||
version: M[1]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function setupHTMLTextArea() {
|
||||
let textArea = document.createElement('textarea');
|
||||
textArea.id = "textArea";
|
||||
textArea.spellcheck = false;
|
||||
let textArea = document.createElement('textarea')
|
||||
textArea.id = "textArea"
|
||||
textArea.spellcheck = false
|
||||
textArea.style = 'resize: none;' +
|
||||
' border: none;' +
|
||||
' outline: none;' +
|
||||
@@ -85,97 +85,96 @@ function loadSuperalgos() {
|
||||
'width: ' + 600 + 'px;' +
|
||||
'height: ' + 400 + 'px'
|
||||
|
||||
let textAreaDiv = document.getElementById('textAreaDiv');
|
||||
textAreaDiv.appendChild(textArea);
|
||||
let textAreaDiv = document.getElementById('textAreaDiv')
|
||||
textAreaDiv.appendChild(textArea)
|
||||
textAreaDiv.style = 'position:fixed; top:' + -1500 + 'px; left:' + 500 + 'px; z-index:10; '
|
||||
}
|
||||
|
||||
function setupHTMLInput() {
|
||||
let input = document.createElement('input');
|
||||
input.id = "input";
|
||||
input.spellcheck = false;
|
||||
input.style = "border: none; outline: none; box-shadow: none; overflow:hidden; width: 0px; height: 0px;";
|
||||
let input = document.createElement('input')
|
||||
input.id = "input"
|
||||
input.spellcheck = false
|
||||
input.style = "border: none; outline: none; box-shadow: none; overflow:hidden; width: 0px; height: 0px;"
|
||||
|
||||
let inputDiv = document.getElementById('inputDiv');
|
||||
inputDiv.appendChild(input);
|
||||
let inputDiv = document.getElementById('inputDiv')
|
||||
inputDiv.appendChild(input)
|
||||
}
|
||||
|
||||
function setupHTMLCanvas() {
|
||||
let canvas = document.createElement('canvas');
|
||||
let canvas = document.createElement('canvas')
|
||||
|
||||
canvas.id = "canvas";
|
||||
canvas.width = 1400;
|
||||
canvas.height = 600;
|
||||
canvas.style.border = "0";
|
||||
canvas.style = "position:absolute; top:0px; left:0px; z-index:1";
|
||||
canvas.id = "canvas"
|
||||
canvas.width = 1400
|
||||
canvas.height = 600
|
||||
canvas.style.border = "0"
|
||||
canvas.style = "position:absolute; top:0px; left:0px; z-index:1"
|
||||
|
||||
let canvasApp = document.getElementById('canvasApp');
|
||||
canvasApp.appendChild(canvas);
|
||||
let canvasApp = document.getElementById('canvasApp')
|
||||
canvasApp.appendChild(canvas)
|
||||
|
||||
browserCanvas = document.getElementById('canvas');
|
||||
browserCanvas = document.getElementById('canvas')
|
||||
|
||||
browserCanvas.width = window.innerWidth;
|
||||
browserCanvas.height = window.innerHeight;
|
||||
browserCanvas.style.border = "none";
|
||||
browserCanvas.width = window.innerWidth
|
||||
browserCanvas.height = window.innerHeight
|
||||
browserCanvas.style.border = "none"
|
||||
|
||||
browserCanvas.style.top = 0 + 'px';
|
||||
browserCanvas.style.top = 0 + 'px'
|
||||
}
|
||||
|
||||
function loadDebugModule() {
|
||||
let path = "WebDebugLog.js";
|
||||
REQUIREJS([path], onRequired);
|
||||
let path = "WebDebugLog.js"
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
function onRequired(pModule) {
|
||||
if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded."); }
|
||||
setUpProjects();
|
||||
}
|
||||
}
|
||||
|
||||
function setUpProjects() {
|
||||
let url = 'ProjectNames'
|
||||
httpRequest(undefined, url, onResponse)
|
||||
|
||||
function onResponse(err, projects) {
|
||||
window.PROJECTS = JSON.parse(projects)
|
||||
if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") }
|
||||
loadModules()
|
||||
}
|
||||
}
|
||||
|
||||
/* And Finally, we start loading all the scripts we will inmediatelly need. */
|
||||
function loadModules() {
|
||||
let path = "AppLoader.js";
|
||||
REQUIREJS([path], onRequired);
|
||||
let path = "AppLoader.js"
|
||||
REQUIREJS([path], onRequired)
|
||||
|
||||
function onRequired(pModule) {
|
||||
if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded."); }
|
||||
let APP_LOADER_MODULE = newAppLoader();
|
||||
APP_LOADER_MODULE.loadModules();
|
||||
if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") }
|
||||
let APP_LOADER_MODULE = newAppLoader()
|
||||
APP_LOADER_MODULE.loadModules()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function httpRequest(pContentToSend, pPath, callBackFunction) {
|
||||
let xmlHttpRequest = new XMLHttpRequest();
|
||||
let xmlHttpRequest = new XMLHttpRequest()
|
||||
xmlHttpRequest.onreadystatechange = function () {
|
||||
if (this.readyState === 4 && this.status === 200) {
|
||||
callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText);
|
||||
return;
|
||||
try {
|
||||
callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText)
|
||||
} catch(err) {
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> err.stack = '+ err.stack)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> pContentToSend = '+ pContentToSend)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> pPath = '+ pPath)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> xmlHttpRequest.responseText = '+ xmlHttpRequest.responseText)
|
||||
console.log('[ERROR] httpRequest -> httpRequest -> callBackFunction = '+ callBackFunction)
|
||||
|
||||
}
|
||||
return
|
||||
} else if (this.readyState === 4 && this.status === 404) {
|
||||
callBackFunction({ result: "Fail", message: xmlHttpRequest.responseText.trim(), code: xmlHttpRequest.responseText.trim() });
|
||||
return;
|
||||
callBackFunction({ result: "Fail", message: xmlHttpRequest.responseText.trim(), code: xmlHttpRequest.responseText.trim() })
|
||||
return
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (pContentToSend === undefined) {
|
||||
xmlHttpRequest.open("GET", pPath, true);
|
||||
xmlHttpRequest.send();
|
||||
xmlHttpRequest.open("GET", pPath, true)
|
||||
xmlHttpRequest.send()
|
||||
} else {
|
||||
try {
|
||||
let blob = new Blob([pContentToSend], { type: 'text/plain' });
|
||||
xmlHttpRequest.open("POST", pPath, true);
|
||||
xmlHttpRequest.send(blob);
|
||||
let blob = new Blob([pContentToSend], { type: 'text/plain' })
|
||||
xmlHttpRequest.open("POST", pPath, true)
|
||||
xmlHttpRequest.send(blob)
|
||||
} catch (err) {
|
||||
if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message); }
|
||||
if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message) }
|
||||
callBackFunction({ result: "Fail", message: err.message })
|
||||
}
|
||||
}
|
||||
@@ -50,12 +50,12 @@ function newCanvas() {
|
||||
|
||||
function finalize() {
|
||||
try {
|
||||
UI.projects.superalgos.spaces.tutorialSpace.finalize()
|
||||
UI.projects.superalgos.spaces.docsSpace.finalize()
|
||||
UI.projects.education.spaces.tutorialSpace.finalize()
|
||||
UI.projects.education.spaces.docsSpace.finalize()
|
||||
//thisObject.chatSpace.finalize()
|
||||
UI.projects.superalgos.spaces.sideSpace.finalize()
|
||||
UI.projects.superalgos.spaces.chartingSpace.finalize()
|
||||
UI.projects.superalgos.spaces.floatingSpace.finalize()
|
||||
UI.projects.foundations.spaces.sideSpace.finalize()
|
||||
UI.projects.foundations.spaces.chartingSpace.finalize()
|
||||
UI.projects.foundations.spaces.floatingSpace.finalize()
|
||||
thisObject.shorcutNumbers = undefined
|
||||
|
||||
if (browserCanvas.removeEventListener) {
|
||||
@@ -86,7 +86,7 @@ function newCanvas() {
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
async function initialize() {
|
||||
try {
|
||||
|
||||
browserResized()
|
||||
@@ -121,6 +121,8 @@ function newCanvas() {
|
||||
let spaceAnimationDrawMap = new Map()
|
||||
let spaceDefinitionDrawMap = new Map()
|
||||
|
||||
if (projectDefinition.UI === undefined) { continue }
|
||||
|
||||
/* Set up Globals of this Project */
|
||||
if (projectDefinition.UI.globals !== undefined) {
|
||||
for (let j = 0; j < projectDefinition.UI.globals.length; j++) {
|
||||
@@ -189,7 +191,7 @@ function newCanvas() {
|
||||
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
|
||||
let spaceInstance = spaceInitializationMap.get(j)
|
||||
if (spaceInstance !== undefined) {
|
||||
spaceInstance.initialize()
|
||||
await spaceInstance.initialize()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,12 +320,12 @@ function newCanvas() {
|
||||
break
|
||||
}
|
||||
case 118: { // F7
|
||||
UI.projects.superalgos.utilities.download.downloadPanorama('Superalgos.Market.Panorama')
|
||||
UI.projects.foundations.utilities.download.downloadPanorama('Superalgos.Market.Panorama')
|
||||
return
|
||||
break
|
||||
}
|
||||
case 119: { // F8
|
||||
UI.projects.superalgos.utilities.download.downloadCanvas('Superalgos.Image.Capture', browserCanvas)
|
||||
UI.projects.foundations.utilities.download.downloadCanvas('Superalgos.Image.Capture', browserCanvas)
|
||||
return
|
||||
break
|
||||
}
|
||||
@@ -367,7 +369,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
async function onKeyDown(event) {
|
||||
if (UI.projects.superalgos.spaces.designSpace.workspace === undefined) { return }
|
||||
if (UI.projects.foundations.spaces.designSpace.workspace === undefined) { return }
|
||||
|
||||
if (EDITOR_ON_FOCUS === true) {
|
||||
/*
|
||||
@@ -380,7 +382,7 @@ function newCanvas() {
|
||||
return
|
||||
}
|
||||
/* When the Docs is Visible, we do not process key down events of the Designer Space. */
|
||||
if (UI.projects.superalgos.spaces.docsSpace.isVisible === true) {
|
||||
if (UI.projects.education !== undefined && UI.projects.education.spaces.docsSpace.isVisible === true) {
|
||||
return
|
||||
}
|
||||
thisObject.mouse.event = event
|
||||
@@ -388,12 +390,12 @@ function newCanvas() {
|
||||
|
||||
checkMediaRecording(event)
|
||||
|
||||
event.x = thisObject.mouse.position.x
|
||||
event.y = thisObject.mouse.position.y
|
||||
event.x = thisObject.mouse.position.x
|
||||
event.y = thisObject.mouse.position.y
|
||||
|
||||
UI.projects.superalgos.spaces.chartingSpace.onKeyPressed(event)
|
||||
UI.projects.foundations.spaces.chartingSpace.onKeyPressed(event)
|
||||
|
||||
/* Shourcuts to Menu Items */
|
||||
/* Shortcuts to Menu Items */
|
||||
if ((event.keyCode >= 48 && event.keyCode <= 57)) {
|
||||
let number = event.key
|
||||
if (MENU_ITEM_ON_FOCUS !== undefined) {
|
||||
@@ -411,37 +413,79 @@ function newCanvas() {
|
||||
}
|
||||
}
|
||||
|
||||
if (event.key === 'Escape' && UI.projects.superalgos.spaces.floatingSpace.inMapMode === true) {
|
||||
UI.projects.superalgos.spaces.floatingSpace.exitMapMode()
|
||||
if (event.key === 'Escape' && UI.projects.foundations.spaces.floatingSpace.inMapMode === true) {
|
||||
UI.projects.foundations.spaces.floatingSpace.exitMapMode()
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'M' || event.key === 'm')) {
|
||||
UI.projects.superalgos.spaces.floatingSpace.toggleMapMode()
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleMapMode || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleMapMode.toLowerCase())
|
||||
) {
|
||||
UI.projects.foundations.spaces.floatingSpace.toggleMapMode()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'R' || event.key === 'r')) {
|
||||
UI.projects.superalgos.spaces.floatingSpace.toggleDrawReferenceLines()
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleDrawRelationshipLines || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleDrawRelationshipLines.toLowerCase())
|
||||
) {
|
||||
UI.projects.foundations.spaces.floatingSpace.toggleDrawReferenceLines()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'C' || event.key === 'c')) {
|
||||
UI.projects.superalgos.spaces.floatingSpace.toggleDrawChainLines()
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleDrawParentLines || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.toggleDrawParentLines.toLowerCase())
|
||||
) {
|
||||
UI.projects.foundations.spaces.floatingSpace.toggleDrawChainLines()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'S' || event.key === 's')) {
|
||||
UI.projects.superalgos.spaces.designSpace.workspace.save()
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.saveWorkspace || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.saveWorkspace.toLowerCase())
|
||||
) {
|
||||
UI.projects.foundations.spaces.designSpace.workspace.save()
|
||||
if (event.preventDefault !== undefined) {
|
||||
event.preventDefault()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
let nodeOnFocus = await UI.projects.superalgos.spaces.designSpace.workspace.getNodeThatIsOnFocus()
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.saveFloatingObjectToBeMoved || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.saveFloatingObjectToBeMoved.toLowerCase())
|
||||
|
||||
) {
|
||||
UI.projects.foundations.spaces.floatingSpace.saveFloatingObjectToBeMoved()
|
||||
if (event.preventDefault !== undefined) {
|
||||
event.preventDefault()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (
|
||||
event.shiftKey === true &&
|
||||
(event.ctrlKey === true || event.metaKey === true) &&
|
||||
(event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.moveSavedFloatingObjectToMouse || event.key === UI.projects.foundations.spaces.floatingSpace.settings.shortcuts.moveSavedFloatingObjectToMouse.toLowerCase())
|
||||
|
||||
) {
|
||||
UI.projects.foundations.spaces.floatingSpace.moveSavedFloatingObjectToMouse(thisObject.mouse.position)
|
||||
if (event.preventDefault !== undefined) {
|
||||
event.preventDefault()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
let nodeOnFocus = await UI.projects.foundations.spaces.designSpace.workspace.getNodeThatIsOnFocus()
|
||||
if (nodeOnFocus !== undefined) {
|
||||
if (nodeOnFocus.payload.uiObject.codeEditor !== undefined) {
|
||||
if (nodeOnFocus.payload.uiObject.codeEditor.visible === true) {
|
||||
@@ -492,55 +536,55 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && event.code === 'ArrowUp') {
|
||||
UI.projects.superalgos.spaces.cockpitSpace.toTop()
|
||||
UI.projects.foundations.spaces.cockpitSpace.toTop()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && event.code === 'ArrowDown') {
|
||||
UI.projects.superalgos.spaces.cockpitSpace.toBottom()
|
||||
UI.projects.foundations.spaces.cockpitSpace.toBottom()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && event.code === 'ArrowLeft') {
|
||||
UI.projects.superalgos.spaces.cockpitSpace.moveUp()
|
||||
UI.projects.foundations.spaces.cockpitSpace.moveUp()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && event.code === 'ArrowRight') {
|
||||
UI.projects.superalgos.spaces.cockpitSpace.moveDown()
|
||||
UI.projects.foundations.spaces.cockpitSpace.moveDown()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === false && event.metaKey === false) && event.code === 'ArrowLeft') {
|
||||
UI.projects.superalgos.spaces.chartingSpace.oneScreenLeft()
|
||||
UI.projects.foundations.spaces.chartingSpace.oneScreenLeft()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === false && event.metaKey === false) && event.code === 'ArrowRight') {
|
||||
UI.projects.superalgos.spaces.chartingSpace.oneScreenRight()
|
||||
UI.projects.foundations.spaces.chartingSpace.oneScreenRight()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === false && event.metaKey === false) && event.code === 'ArrowUp') {
|
||||
UI.projects.superalgos.spaces.chartingSpace.oneScreenUp()
|
||||
UI.projects.foundations.spaces.chartingSpace.oneScreenUp()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if (event.shiftKey === true && (event.ctrlKey === false && event.metaKey === false) && event.code === 'ArrowDown') {
|
||||
UI.projects.superalgos.spaces.chartingSpace.oneScreenDown()
|
||||
UI.projects.foundations.spaces.chartingSpace.oneScreenDown()
|
||||
event.preventDefault()
|
||||
return
|
||||
}
|
||||
|
||||
if ((event.ctrlKey === true || event.metaKey === true) && event.shiftKey === false && event.code === 'ArrowLeft') {
|
||||
let displaceVector = UI.projects.superalgos.spaces.floatingSpace.oneScreenLeft()
|
||||
let displaceVector = UI.projects.foundations.spaces.floatingSpace.oneScreenLeft()
|
||||
if (displaceVector !== undefined) {
|
||||
dragVector.downX = dragVector.downX + displaceVector.x
|
||||
dragVector.downY = dragVector.downY + displaceVector.y
|
||||
@@ -551,7 +595,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
if ((event.ctrlKey === true || event.metaKey === true) && event.shiftKey === false && event.code === 'ArrowRight') {
|
||||
let displaceVector = UI.projects.superalgos.spaces.floatingSpace.oneScreenRight()
|
||||
let displaceVector = UI.projects.foundations.spaces.floatingSpace.oneScreenRight()
|
||||
if (displaceVector !== undefined) {
|
||||
dragVector.downX = dragVector.downX + displaceVector.x
|
||||
dragVector.downY = dragVector.downY + displaceVector.y
|
||||
@@ -562,7 +606,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
if ((event.ctrlKey === true || event.metaKey === true) && event.shiftKey === false && event.code === 'ArrowUp') {
|
||||
let displaceVector = UI.projects.superalgos.spaces.floatingSpace.oneScreenUp()
|
||||
let displaceVector = UI.projects.foundations.spaces.floatingSpace.oneScreenUp()
|
||||
if (displaceVector !== undefined) {
|
||||
dragVector.downX = dragVector.downX + displaceVector.x
|
||||
dragVector.downY = dragVector.downY + displaceVector.y
|
||||
@@ -573,7 +617,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
if ((event.ctrlKey === true || event.metaKey === true) && event.shiftKey === false && event.code === 'ArrowDown') {
|
||||
let displaceVector = UI.projects.superalgos.spaces.floatingSpace.oneScreenDown()
|
||||
let displaceVector = UI.projects.foundations.spaces.floatingSpace.oneScreenDown()
|
||||
if (displaceVector !== undefined) {
|
||||
dragVector.downX = dragVector.downX + displaceVector.x
|
||||
dragVector.downY = dragVector.downY + displaceVector.y
|
||||
@@ -595,7 +639,7 @@ function newCanvas() {
|
||||
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 90)) {
|
||||
/* From here we prevent the default behaviour. Putting it earlier prevents imput box and text area to receive keystrokes */
|
||||
event.preventDefault()
|
||||
let nodeUsingThisKey = await UI.projects.superalgos.spaces.designSpace.workspace.getNodeByShortcutKey(event.key)
|
||||
let nodeUsingThisKey = await UI.projects.foundations.spaces.designSpace.workspace.getNodeByShortcutKey(event.key)
|
||||
|
||||
if (nodeUsingThisKey !== undefined) {
|
||||
if (nodeOnFocus !== undefined) {
|
||||
@@ -611,7 +655,7 @@ function newCanvas() {
|
||||
nodeOnFocus.payload.uiObject.setValue('Shortcut Key: Ctrl + Alt + ' + event.key)
|
||||
}
|
||||
} else {
|
||||
UI.projects.superalgos.spaces.floatingSpace.positionAtNode(nodeUsingThisKey)
|
||||
UI.projects.foundations.spaces.floatingSpace.positionAtNode(nodeUsingThisKey)
|
||||
}
|
||||
return
|
||||
} else {
|
||||
@@ -635,7 +679,7 @@ function newCanvas() {
|
||||
try {
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
UI.projects.superalgos.spaces.cockpitSpace.toTop()
|
||||
UI.projects.foundations.spaces.cockpitSpace.toTop()
|
||||
} catch (err) {
|
||||
if (ERROR_LOG === true) { logger.write('[ERROR] onDragEnter -> err = ' + err.stack) }
|
||||
}
|
||||
@@ -679,7 +723,7 @@ function newCanvas() {
|
||||
x: event.x,
|
||||
y: event.y
|
||||
}
|
||||
UI.projects.superalgos.spaces.designSpace.workspace.spawn(reader.result, mousePosition)
|
||||
UI.projects.foundations.spaces.designSpace.workspace.spawn(reader.result, mousePosition)
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -716,11 +760,18 @@ function newCanvas() {
|
||||
and we are going to query each space to see if they have the container that is at
|
||||
the mouse position. We will order firt the spaces by the sequence order defined
|
||||
at the project schema specifically for this mouse event.
|
||||
|
||||
The order of the projects for events evaluations has intentionally been inverted,
|
||||
because the latest project is drwan the last, on top of the others, that means that
|
||||
events should belong to the last first.
|
||||
*/
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
|
||||
let projectDefinition = PROJECTS_SCHEMA[i]
|
||||
let projectInstance = UI.projects[projectDefinition.propertyName]
|
||||
if (projectInstance === undefined) { continue }
|
||||
|
||||
if (projectDefinition.UI === undefined) { continue }
|
||||
if (projectDefinition.UI.spaces === undefined) { continue }
|
||||
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
|
||||
let spaceInstance = projectInstance.events.onMouseDownMap.get(j)
|
||||
if (spaceInstance === undefined) { continue }
|
||||
@@ -819,11 +870,18 @@ function newCanvas() {
|
||||
and we are going to query each space to see if they have the container that is at
|
||||
the mouse position. We will order firt the spaces by the sequence order defined
|
||||
at the project schema specifically for this mouse event.
|
||||
|
||||
The order of the projects for events evaluations has intentionally been inverted,
|
||||
because the latest project is drwan the last, on top of the others, that means that
|
||||
events should belong to the last first.
|
||||
*/
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
|
||||
let projectDefinition = PROJECTS_SCHEMA[i]
|
||||
let projectInstance = UI.projects[projectDefinition.propertyName]
|
||||
if (projectInstance === undefined) { continue }
|
||||
|
||||
if (projectDefinition.UI === undefined) { continue }
|
||||
if (projectDefinition.UI.spaces === undefined) { continue }
|
||||
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
|
||||
let spaceInstance = projectInstance.events.onMouseClickMap.get(j)
|
||||
if (spaceInstance === undefined) { continue }
|
||||
@@ -870,14 +928,14 @@ function newCanvas() {
|
||||
point.x = event.pageX
|
||||
point.y = event.pageY - CURRENT_TOP_MARGIN
|
||||
|
||||
if (UI.projects.superalgos.spaces.chartingSpace.viewport !== undefined) {
|
||||
UI.projects.superalgos.spaces.chartingSpace.viewport.mousePosition.x = point.x
|
||||
UI.projects.superalgos.spaces.chartingSpace.viewport.mousePosition.y = point.y
|
||||
if (UI.projects.foundations.spaces.chartingSpace.viewport !== undefined) {
|
||||
UI.projects.foundations.spaces.chartingSpace.viewport.mousePosition.x = point.x
|
||||
UI.projects.foundations.spaces.chartingSpace.viewport.mousePosition.y = point.y
|
||||
}
|
||||
|
||||
if (containerDragStarted === true || floatingObjectDragStarted === true || viewPortBeingDragged === true) {
|
||||
if (floatingObjectDragStarted === true) {
|
||||
let targetContainer = UI.projects.superalgos.spaces.floatingSpace.getContainer(point)
|
||||
let targetContainer = UI.projects.foundations.spaces.floatingSpace.getContainer(point)
|
||||
if (targetContainer !== undefined) {
|
||||
if (targetContainer.id !== containerBeingDragged.id) {
|
||||
containerBeingDragged.eventHandler.raiseEvent('onDragFinished', point)
|
||||
@@ -930,11 +988,18 @@ function newCanvas() {
|
||||
and we are going to query each space to see if they have the container that is at
|
||||
the mouse position. We will order firt the spaces by the sequence order defined
|
||||
at the project schema specifically for this mouse event.
|
||||
|
||||
The order of the projects for events evaluations has intentionally been inverted,
|
||||
because the latest project is drwan the last, on top of the others, that means that
|
||||
events should belong to the last first.
|
||||
*/
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
|
||||
let projectDefinition = PROJECTS_SCHEMA[i]
|
||||
let projectInstance = UI.projects[projectDefinition.propertyName]
|
||||
if (projectInstance === undefined) { continue }
|
||||
|
||||
if (projectDefinition.UI === undefined) { continue }
|
||||
if (projectDefinition.UI.spaces === undefined) { continue }
|
||||
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
|
||||
let spaceInstance = projectInstance.events.onMouseOverMap.get(j)
|
||||
if (spaceInstance === undefined) { continue }
|
||||
@@ -987,11 +1052,18 @@ function newCanvas() {
|
||||
and we are going to query each space to see if they have the container that is at
|
||||
the mouse position. We will order firt the spaces by the sequence order defined
|
||||
at the project schema specifically for this mouse event.
|
||||
|
||||
The order of the projects for events evaluations has intentionally been inverted,
|
||||
because the latest project is drwan the last, on top of the others, that means that
|
||||
events should belong to the last first.
|
||||
*/
|
||||
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
|
||||
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
|
||||
let projectDefinition = PROJECTS_SCHEMA[i]
|
||||
let projectInstance = UI.projects[projectDefinition.propertyName]
|
||||
if (projectInstance === undefined) { continue }
|
||||
|
||||
if (projectDefinition.UI === undefined) { continue }
|
||||
if (projectDefinition.UI.spaces === undefined) { continue }
|
||||
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
|
||||
let spaceInstance = projectInstance.events.onMouseWheelMap.get(j)
|
||||
if (spaceInstance === undefined) { continue }
|
||||
@@ -1061,7 +1133,7 @@ function newCanvas() {
|
||||
y: dragVector.upY - dragVector.downY
|
||||
}
|
||||
|
||||
UI.projects.superalgos.spaces.chartingSpace.viewport.displace(displaceVector)
|
||||
UI.projects.foundations.spaces.chartingSpace.viewport.displace(displaceVector)
|
||||
}
|
||||
if (containerDragStarted) {
|
||||
if (containerBeingDragged !== undefined) {
|
||||
@@ -1072,7 +1144,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
let downNoZoom
|
||||
downNoZoom = UI.projects.superalgos.spaces.chartingSpace.viewport.unTransformThisPoint(downCopy)
|
||||
downNoZoom = UI.projects.foundations.spaces.chartingSpace.viewport.unTransformThisPoint(downCopy)
|
||||
|
||||
let upCopy = {
|
||||
x: dragVector.upX,
|
||||
@@ -1080,7 +1152,7 @@ function newCanvas() {
|
||||
}
|
||||
|
||||
let upNoZoom
|
||||
upNoZoom = UI.projects.superalgos.spaces.chartingSpace.viewport.unTransformThisPoint(upCopy)
|
||||
upNoZoom = UI.projects.foundations.spaces.chartingSpace.viewport.unTransformThisPoint(upCopy)
|
||||
|
||||
displaceVector = {
|
||||
x: upNoZoom.x - downNoZoom.x,
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,5 +1,5 @@
|
||||
|
||||
function newEventsServerClient(networkNode) {
|
||||
function newEventsServerClient(lanNetworkNode) {
|
||||
/* Web Sockets Connection */
|
||||
|
||||
const MODULE_NAME = 'System Event Handler'
|
||||
@@ -192,19 +192,19 @@ function newEventsServerClient(networkNode) {
|
||||
|
||||
if (thisObject.isConnected() !== true) {
|
||||
if (lastTryToReconnectDatetime !== undefined) {
|
||||
if (networkNode !== undefined) {
|
||||
if (networkNode.payload !== undefined) {
|
||||
if (networkNode.payload.uiObject !== undefined) {
|
||||
networkNode.payload.uiObject.setErrorMessage('Failed to Connect to Superalgos Client via WebSockets. Retrying in 1 minute. Check at this node config if the host property has the IP address of the computer running Superalgos Client.')
|
||||
if (lanNetworkNode !== undefined) {
|
||||
if (lanNetworkNode.payload !== undefined) {
|
||||
if (lanNetworkNode.payload.uiObject !== undefined) {
|
||||
lanNetworkNode.payload.uiObject.setErrorMessage('Failed to Connect to Superalgos Platform Client via WebSockets. Retrying in 1 minute. Check at this node config if the host property has the IP address of the computer running Superalgos Platform Client.')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (networkNode !== undefined) {
|
||||
if (networkNode.payload !== undefined) {
|
||||
if (networkNode.payload.uiObject !== undefined) {
|
||||
networkNode.payload.uiObject.setStatus('Connected to Superalgos Client via WebSockets.')
|
||||
if (lanNetworkNode !== undefined) {
|
||||
if (lanNetworkNode.payload !== undefined) {
|
||||
if (lanNetworkNode.payload.uiObject !== undefined) {
|
||||
lanNetworkNode.payload.uiObject.setStatus('Connected to Superalgos Platform Client via WebSockets.')
|
||||
retryCommandsPhysics()
|
||||
}
|
||||
}
|
||||
@@ -220,18 +220,18 @@ function newEventsServerClient(networkNode) {
|
||||
let port
|
||||
/* At this point the node does not have the payload property yet, that is why we have to do this manually */
|
||||
try {
|
||||
let config = JSON.parse(networkNode.config)
|
||||
let config = JSON.parse(lanNetworkNode.config)
|
||||
host = config.host
|
||||
port = config.webSocketsPort
|
||||
|
||||
/* Check if we really have to stablish the connection. */
|
||||
if (config.autoConnect === false) { return }
|
||||
} catch (err) {
|
||||
networkNode.payload.uiObject.setErrorMessage(
|
||||
lanNetworkNode.payload.uiObject.setErrorMessage(
|
||||
'Bad configuration. Invalid JSON Format.',
|
||||
undefined,
|
||||
{
|
||||
project: 'Superalgos',
|
||||
project: 'Foundations',
|
||||
category: 'Topic',
|
||||
type: 'UI Websockets Error - Bad Configuration',
|
||||
anchor: 'Invalid JSON Format'
|
||||
@@ -241,11 +241,11 @@ function newEventsServerClient(networkNode) {
|
||||
}
|
||||
|
||||
if (host === undefined) {
|
||||
networkNode.payload.uiObject.setErrorMessage(
|
||||
lanNetworkNode.payload.uiObject.setErrorMessage(
|
||||
'Bad configuration. Host Property Not Found.',
|
||||
undefined,
|
||||
{
|
||||
project: 'Superalgos',
|
||||
project: 'Foundations',
|
||||
category: 'Topic',
|
||||
type: 'UI Websockets Error - Bad Configuration',
|
||||
anchor: 'Host Property Not Found'
|
||||
@@ -255,11 +255,11 @@ function newEventsServerClient(networkNode) {
|
||||
}
|
||||
|
||||
if (port === undefined) {
|
||||
networkNode.payload.uiObject.setErrorMessage(
|
||||
lanNetworkNode.payload.uiObject.setErrorMessage(
|
||||
'Bad configuration. WebSocketsPort Property Not Found.',
|
||||
undefined,
|
||||
{
|
||||
project: 'Superalgos',
|
||||
project: 'Foundations',
|
||||
category: 'Topic',
|
||||
type: 'UI Websockets Error - Bad Configuration',
|
||||
anchor: 'WebSocketsPort Property Not Found'
|
||||
@@ -53,7 +53,7 @@ function newFrame() {
|
||||
}
|
||||
|
||||
function isInViewPort() {
|
||||
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.superalgos.spaces.chartingSpace.viewport */
|
||||
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
|
||||
|
||||
point1 = {
|
||||
x: 0,
|
||||
@@ -67,10 +67,10 @@ function newFrame() {
|
||||
|
||||
/* Now the transformations. */
|
||||
|
||||
point1 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point3 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
|
||||
if (point1.x < UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.topRight.x && point1.y < UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.bottomRight.y && point3.x > UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.bottomLeft.x && point3.y > UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.topLeft.y) {
|
||||
if (point1.x < UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.x && point1.y < UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y && point3.x > UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomLeft.x && point3.y > UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.y) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@@ -78,7 +78,7 @@ function newFrame() {
|
||||
}
|
||||
|
||||
function isCenterInViewPort() {
|
||||
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.superalgos.spaces.chartingSpace.viewport */
|
||||
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
|
||||
|
||||
point1 = {
|
||||
x: thisObject.width * 40 / 100,
|
||||
@@ -92,10 +92,10 @@ function newFrame() {
|
||||
|
||||
/* Now the transformations. */
|
||||
|
||||
point1 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point3 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
|
||||
if (point1.x < UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.topRight.x && point1.y < UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.bottomRight.y && point3.x > UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.bottomLeft.x && point3.y > UI.projects.superalgos.spaces.chartingSpace.viewport.visibleArea.topLeft.y) {
|
||||
if (point1.x < UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.x && point1.y < UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y && point3.x > UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomLeft.x && point3.y > UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.y) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@@ -204,7 +204,7 @@ function newFrame() {
|
||||
if (outsideViewPort === true) {
|
||||
checkPoint = thisObject.container.frame.unframeThisPoint(checkPoint)
|
||||
} else {
|
||||
checkPoint = UI.projects.superalgos.utilities.coordinateTransformations.unTransformThisPoint(checkPoint, thisObject.container)
|
||||
checkPoint = UI.projects.foundations.utilities.coordinateTransformations.unTransformThisPoint(checkPoint, thisObject.container)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ function newFrame() {
|
||||
fitFunction: fitFunction
|
||||
}
|
||||
|
||||
UI.projects.superalgos.utilities.drawPrint.roundedCornersBackground(params)
|
||||
UI.projects.foundations.utilities.drawPrint.roundedCornersBackground(params)
|
||||
|
||||
titleBarPoint1 = {
|
||||
x: 0,
|
||||
@@ -388,10 +388,10 @@ function newFrame() {
|
||||
}
|
||||
|
||||
/* Now the transformations. */
|
||||
point1 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
point3 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
point1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
point3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
|
||||
if (fitFunction !== undefined) {
|
||||
point1 = fitFunction(point1)
|
||||
@@ -437,8 +437,8 @@ function newFrame() {
|
||||
y: j
|
||||
}
|
||||
|
||||
point1 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
point1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
|
||||
if (fitFunction !== undefined) {
|
||||
point1 = fitFunction(point1)
|
||||
@@ -459,8 +459,8 @@ function newFrame() {
|
||||
y: thisObject.height
|
||||
}
|
||||
|
||||
point3 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
point3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
|
||||
if (fitFunction !== undefined) {
|
||||
point3 = fitFunction(point3)
|
||||
@@ -495,8 +495,8 @@ function newFrame() {
|
||||
y: j
|
||||
}
|
||||
|
||||
point1 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
point1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)
|
||||
point2 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)
|
||||
|
||||
if (fitFunction !== undefined) {
|
||||
point1 = fitFunction(point1)
|
||||
@@ -517,8 +517,8 @@ function newFrame() {
|
||||
y: thisObject.height
|
||||
}
|
||||
|
||||
point3 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.superalgos.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
point3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)
|
||||
point4 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)
|
||||
|
||||
if (fitFunction !== undefined) {
|
||||
point3 = fitFunction(point3)
|
||||
@@ -1,7 +1,6 @@
|
||||
/* Global Constatns */
|
||||
|
||||
let canvas
|
||||
let PROJECTS_ARRAY
|
||||
let PROJECTS_SCHEMA
|
||||
let SCHEMAS_BY_PROJECT = new Map()
|
||||
/* New Root object*/
|
||||
@@ -70,6 +69,7 @@ const MAC_AMOUNT_FACTOR = 5
|
||||
const IS_MAC = navigator.platform.toUpperCase().indexOf('MAC') >= 0
|
||||
const MAC_ZOOM_SENSITIVITY = 5
|
||||
const MAC_SCROLL_SENSITIVITY = 20
|
||||
const MAC_MOUSE_WHEEL_INFINITE_SCROLL_THRESHOLD= 120
|
||||
|
||||
const DEBUG = {}
|
||||
|
||||
@@ -203,9 +203,9 @@ const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000;
|
||||
|
||||
|
||||
|
||||
let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the UI.projects.superalgos.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
|
||||
let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
|
||||
let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts.
|
||||
let INITIAL_TIME_PERIOD = ONE_DAY_IN_MILISECONDS // This value will be overwritten at the UI.projects.superalgos.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
|
||||
let INITIAL_TIME_PERIOD = ONE_DAY_IN_MILISECONDS // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
|
||||
let VERY_LARGE_NUMBER = 100000000000000
|
||||
|
||||
const TOP_MARGIN = 0
|
||||
File renamed without changes.
@@ -0,0 +1,134 @@
|
||||
function getSchemaDocument (node, project) {
|
||||
if (node === null || node === undefined) {
|
||||
console.log('[ERROR] Can not get the schema document of a null or undefined node ')
|
||||
return
|
||||
}
|
||||
if (project === undefined) { project = node.project }
|
||||
|
||||
let APP_SCHEMA = SCHEMAS_BY_PROJECT.get(project)
|
||||
if (APP_SCHEMA !== undefined) {
|
||||
return SCHEMAS_BY_PROJECT.get(project).map.appSchema.get(node.type)
|
||||
} else {
|
||||
console.log('[ERROR] Could not get APP Scchema for project ' + node.project)
|
||||
}
|
||||
}
|
||||
|
||||
function dynamicDecimals (value, minDecimals) {
|
||||
if (minDecimals === undefined) {
|
||||
minDecimals = 0
|
||||
}
|
||||
let decimals = 0
|
||||
if (value < 1) { decimals = 3 } else if (value < 10) { decimals = 2 } else if (value < 100) { decimals = 1 } else if (Math.abs(Math.trunc(value * 10)) < 1) { decimals = 4 } else if (Math.abs(Math.trunc(value * 100)) < 1) { decimals = 5 } else if (Math.abs(Math.trunc(value * 1000)) < 1) { decimals = 6 } else if (Math.abs(Math.trunc(value * 10000)) < 1) { decimals = 7 } else if (Math.abs(Math.trunc(value * 100000)) < 1) { decimals = 8 } else if (Math.abs(Math.trunc(value * 1000000)) < 1) { decimals = 9 } else if (Math.abs(Math.trunc(value * 10000000)) < 1) { decimals = 10 } else if (Math.abs(Math.trunc(value * 100000000000)) < 1) { value = 0; decimals = 0 }
|
||||
|
||||
if (decimals < minDecimals) { decimals = minDecimals }
|
||||
|
||||
let returnValue = Number(value).toFixed(decimals)
|
||||
return returnValue
|
||||
}
|
||||
|
||||
function convertTimeFrameToName (pTimeFrame) {
|
||||
for (let i = 0; i < dailyTimeFramesArray.length; i++) {
|
||||
let period = dailyTimeFramesArray[i]
|
||||
if (period[0] === pTimeFrame) {
|
||||
return period[1]
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < marketTimeFramesArray.length; i++) {
|
||||
let period = marketTimeFramesArray[i]
|
||||
if (period[0] === pTimeFrame) {
|
||||
return period[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function nextPorwerOf10 (number) {
|
||||
for (let i = -10; i <= 10; i++) {
|
||||
if (number < Math.pow(10, i)) {
|
||||
return Math.pow(10, i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function pad (str, max) {
|
||||
str = str.toString()
|
||||
return str.length < max ? pad('0' + str, max) : str
|
||||
}
|
||||
|
||||
function moveToUserPosition (container, currentDate, currentRate, coordinateSystem, ignoreX, ignoreY, mousePosition, fitFunction) {
|
||||
let targetPoint = {
|
||||
x: currentDate.valueOf(),
|
||||
y: currentRate
|
||||
}
|
||||
|
||||
/* Put this point in the coordinate system of the UI.projects.foundations.spaces.chartingSpace.viewport */
|
||||
targetPoint = coordinateSystem.transformThisPoint(targetPoint)
|
||||
targetPoint = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(targetPoint, container)
|
||||
|
||||
let displaceVector
|
||||
|
||||
let targetNoZoom = UI.projects.foundations.spaces.chartingSpace.viewport.unTransformThisPoint(targetPoint)
|
||||
let mouseNoZoom = UI.projects.foundations.spaces.chartingSpace.viewport.unTransformThisPoint(mousePosition)
|
||||
|
||||
displaceVector = {
|
||||
x: mouseNoZoom.x - targetNoZoom.x,
|
||||
y: mouseNoZoom.y - targetNoZoom.y
|
||||
}
|
||||
|
||||
if (ignoreX) { displaceVector.x = 0 }
|
||||
if (ignoreY) { displaceVector.y = 0 }
|
||||
|
||||
container.displace(displaceVector)
|
||||
}
|
||||
|
||||
function removeTime (datetime) {
|
||||
if (datetime === undefined) { return }
|
||||
|
||||
let dateOnly = new Date(Math.trunc(datetime.valueOf() / ONE_DAY_IN_MILISECONDS) * ONE_DAY_IN_MILISECONDS)
|
||||
|
||||
return dateOnly
|
||||
}
|
||||
|
||||
function newUniqueId () {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)
|
||||
return v.toString(16)
|
||||
})
|
||||
}
|
||||
|
||||
function splitTextIntoPhrases (text, wordsPerLine) {
|
||||
try {
|
||||
if (text.split === undefined) {
|
||||
return []
|
||||
}
|
||||
let splittedLabel = text.split(' ')
|
||||
let phrases = []
|
||||
let phrase = ''
|
||||
let wordCount = 0
|
||||
for (let i = 0; i < splittedLabel.length; i++) {
|
||||
phrase = phrase + splittedLabel[i]
|
||||
wordCount++
|
||||
|
||||
if (i < splittedLabel.length - 1 && wordCount < wordsPerLine) {
|
||||
phrase = phrase + ' '
|
||||
}
|
||||
if (wordCount >= wordsPerLine) {
|
||||
phrases.push(phrase)
|
||||
phrase = ''
|
||||
wordCount = 0
|
||||
}
|
||||
}
|
||||
if (wordCount > 0) {
|
||||
phrases.push(phrase)
|
||||
}
|
||||
return phrases
|
||||
} catch (err) {
|
||||
console.log(err.stack)
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
function getTextWidth (text) {
|
||||
var metrics = browserCanvasContext.measureText(text)
|
||||
return metrics.width
|
||||
}
|
||||
@@ -20,12 +20,12 @@ function newVideoRecorder() {
|
||||
const DISTANCE_BETWEEN_ICONS = 35
|
||||
const ICON_SIZES = 50
|
||||
|
||||
let mousePointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-pointer')
|
||||
let draggingIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'hand-drag')
|
||||
let mousePointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-pointer')
|
||||
let draggingIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'hand-drag')
|
||||
|
||||
let leftClickIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-left-click')
|
||||
let rightClickIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-right-click')
|
||||
let wheelClickIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-wheel-click')
|
||||
let leftClickIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-left-click')
|
||||
let rightClickIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-right-click')
|
||||
let wheelClickIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-wheel-click')
|
||||
|
||||
let imagePosition
|
||||
let buttonPressedIcon
|
||||
@@ -45,10 +45,10 @@ function newVideoRecorder() {
|
||||
case 'wheel': {
|
||||
wheelAnimationCounter = 25
|
||||
if (canvas.mouse.event.delta > 0) {
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-wheel-up')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-wheel-up')
|
||||
lastWheelPointerIcon = pointerIcon
|
||||
} else {
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'mouse-wheel-down')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'mouse-wheel-down')
|
||||
lastWheelPointerIcon = pointerIcon
|
||||
}
|
||||
|
||||
@@ -65,27 +65,27 @@ function newVideoRecorder() {
|
||||
switch (key.toLowerCase()) {
|
||||
case 'escape':
|
||||
{
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-m')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-m')
|
||||
break
|
||||
}
|
||||
case 'm':
|
||||
{
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-m')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-m')
|
||||
break
|
||||
}
|
||||
case 'a':
|
||||
{
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-a')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-a')
|
||||
break
|
||||
}
|
||||
case 'r':
|
||||
{
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-r')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-r')
|
||||
break
|
||||
}
|
||||
case 'c':
|
||||
{
|
||||
pointerIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-r')
|
||||
pointerIcon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-r')
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -139,7 +139,7 @@ function newVideoRecorder() {
|
||||
drawMousePointer(buttonPressedIcon, imagePosition, ICON_SIZES)
|
||||
|
||||
if (canvas.mouse.event.shiftKey === true) {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-shift')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-shift')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS * 3,
|
||||
y: canvas.mouse.position.y + firstRow
|
||||
@@ -148,7 +148,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.ctrlKey === true || canvas.mouse.event.metaKey === true) {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-ctrl')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-ctrl')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS * 3,
|
||||
y: canvas.mouse.position.y + secondRow
|
||||
@@ -157,7 +157,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.altKey === true) {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-alt')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-alt')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x + DISTANCE_BETWEEN_ICONS * 3 + ICON_SIZES * 0,
|
||||
y: canvas.mouse.position.y + secondRow
|
||||
@@ -166,7 +166,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.code === 'ArrowUp') {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-up')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-up')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x - 0,
|
||||
y: canvas.mouse.position.y + firstRow
|
||||
@@ -175,7 +175,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.code === 'ArrowDown') {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-down')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-down')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x - 0,
|
||||
y: canvas.mouse.position.y + secondRow
|
||||
@@ -184,7 +184,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.code === 'ArrowLeft') {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-left')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-left')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS * 0 - ICON_SIZES * 1,
|
||||
y: canvas.mouse.position.y + secondRow
|
||||
@@ -193,7 +193,7 @@ function newVideoRecorder() {
|
||||
}
|
||||
|
||||
if (canvas.mouse.event.code === 'ArrowRight') {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName( 'Superalgos', 'key-right')
|
||||
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Foundations', 'key-right')
|
||||
imagePosition = {
|
||||
x: canvas.mouse.position.x + DISTANCE_BETWEEN_ICONS * 0 + ICON_SIZES * 1,
|
||||
y: canvas.mouse.position.y + secondRow
|
||||
@@ -0,0 +1,21 @@
|
||||
function newWebDebugLog() {
|
||||
try {
|
||||
let thisObject = {
|
||||
write: write,
|
||||
fileName: 'undefined'
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function write(pText) {
|
||||
console.log(spacePad(thisObject.fileName, 50) + ' : ' + pText)
|
||||
|
||||
function spacePad(str, max) {
|
||||
str = str.toString()
|
||||
return str.length < max ? spacePad(' ' + str, max) : str
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(spacePad(MODULE_NAME, 50) + ' : ' + '[ERROR] WebDebugLog --> err = ' + err.stack)
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loaded 100 of 4716 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user