Compare commits
3147 Commits
v0.14.0
...
dbkr/add_e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c09da4294 | ||
|
|
b447b0c62d | ||
|
|
cdef07ca2c | ||
|
|
33f22ac483 | ||
|
|
a35d566551 | ||
|
|
d44808e0e6 | ||
|
|
b10fdf3d4b | ||
|
|
87cb49dc3b | ||
|
|
584e07664e | ||
|
|
72af5c1104 | ||
|
|
22704382fe | ||
|
|
a1ff03c83b | ||
|
|
d8944d13aa | ||
|
|
91c91c6511 | ||
|
|
4f676ec56c | ||
|
|
6c8933ba09 | ||
|
|
8cdf617ce3 | ||
|
|
fe8eb97444 | ||
|
|
8901f81b10 | ||
|
|
5254eb6ee3 | ||
|
|
d3a87a7c43 | ||
|
|
29ed18f1dc | ||
|
|
cbdb2ec9a6 | ||
|
|
96512a3257 | ||
|
|
7bff4b316e | ||
|
|
789dd3d978 | ||
|
|
862207c48b | ||
|
|
3528e5bc62 | ||
|
|
cfd84688c5 | ||
|
|
8e5f50323f | ||
|
|
f4e21c3fc7 | ||
|
|
2b0be08a0c | ||
|
|
add2458a45 | ||
|
|
bccfd9f93e | ||
|
|
c313bab431 | ||
|
|
fb33b6082d | ||
|
|
99af02eecd | ||
|
|
baf498e611 | ||
|
|
5926a0420c | ||
|
|
ccfc04d0e3 | ||
|
|
d5d4b95fee | ||
|
|
beda6c3b25 | ||
|
|
8ff3a4453a | ||
|
|
ed6c69c040 | ||
|
|
3e13de3069 | ||
|
|
cc192ab882 | ||
|
|
6ff5c98239 | ||
|
|
212662bc04 | ||
|
|
d888bcb313 | ||
|
|
5dd452bec0 | ||
|
|
0875795036 | ||
|
|
a0707903b2 | ||
|
|
2fcedeb047 | ||
|
|
6c6d6e07d3 | ||
|
|
34bb6df00f | ||
|
|
be76d2ef3c | ||
|
|
84c057e640 | ||
|
|
3eb4026dc0 | ||
|
|
1edfde3932 | ||
|
|
43879c410c | ||
|
|
345f4e4c95 | ||
|
|
2714a84630 | ||
|
|
95599f4d6d | ||
|
|
5ba6421b54 | ||
|
|
3dca5f5af8 | ||
|
|
0844f15aa0 | ||
|
|
0e75b1b0db | ||
|
|
e23870d050 | ||
|
|
33406d1709 | ||
|
|
5568bb15c4 | ||
|
|
ba6e1d924f | ||
|
|
1ad54a4dae | ||
|
|
edb4f9bf05 | ||
|
|
c3b0a24bdd | ||
|
|
fd5aea20ef | ||
|
|
9fb5a6de3d | ||
|
|
ab40d5b732 | ||
|
|
dec5ea1637 | ||
|
|
4110e2dfa3 | ||
|
|
29df8a8a2e | ||
|
|
429f36ebfc | ||
|
|
5844cb9428 | ||
|
|
3c7de2c08f | ||
|
|
ecc73905c1 | ||
|
|
3c40cfe593 | ||
|
|
678f419f01 | ||
|
|
5c77b0371a | ||
|
|
711ba78052 | ||
|
|
329d3ea905 | ||
|
|
ba1c6df418 | ||
|
|
26b2a18b6d | ||
|
|
1c413a4f81 | ||
|
|
f55c5aedc1 | ||
|
|
7b6a303999 | ||
|
|
50e5ba1056 | ||
|
|
95578a1f9f | ||
|
|
c0d5a39780 | ||
|
|
b289213b6e | ||
|
|
cc8f44ea27 | ||
|
|
d43781df49 | ||
|
|
17b8dbf99a | ||
|
|
215ad07493 | ||
|
|
c70cdbc6a9 | ||
|
|
5ca474d356 | ||
|
|
2c62d47e6c | ||
|
|
3e77418fd7 | ||
|
|
51dc4bbbe4 | ||
|
|
08f9018cd4 | ||
|
|
060b767bc6 | ||
|
|
0d50bd12b8 | ||
|
|
15894ed8bd | ||
|
|
58b7bbd3d2 | ||
|
|
95bbe84946 | ||
|
|
afb8403dbb | ||
|
|
e7cb2e4022 | ||
|
|
7600571cf5 | ||
|
|
0032d7b943 | ||
|
|
dda1f8454a | ||
|
|
7e67085503 | ||
|
|
5fcec629fa | ||
|
|
685ca64691 | ||
|
|
fa223b94bc | ||
|
|
527d18ac42 | ||
|
|
30fa3a92f7 | ||
|
|
b7fa8a1f54 | ||
|
|
1030c15a61 | ||
|
|
11dc8e3b9f | ||
|
|
2774b046b3 | ||
|
|
53e7177159 | ||
|
|
6873b48c42 | ||
|
|
a90ed394a0 | ||
|
|
29cc8eb573 | ||
|
|
3e21483b82 | ||
|
|
30a9094dc7 | ||
|
|
f0011a0183 | ||
|
|
6584ff29af | ||
|
|
918a56d01a | ||
|
|
5fdf805df2 | ||
|
|
b05e5be2f7 | ||
|
|
c23b2415e4 | ||
|
|
5d39bd69dc | ||
|
|
ac78570b58 | ||
|
|
882e576fdf | ||
|
|
6b1965388e | ||
|
|
e4a964cd0f | ||
|
|
f8885cb0a6 | ||
|
|
e5a232b0d8 | ||
|
|
d486782dd4 | ||
|
|
5a39eafc37 | ||
|
|
7971f993cd | ||
|
|
7ffa1ba1bd | ||
|
|
ac0c2d89f0 | ||
|
|
cec4330618 | ||
|
|
9632f296e1 | ||
|
|
04e4c7804d | ||
|
|
601816862f | ||
|
|
25dbeca083 | ||
|
|
7d74e789ca | ||
|
|
abcf0b73c0 | ||
|
|
9d5e3d6d9a | ||
|
|
201053963d | ||
|
|
e00d2b9589 | ||
|
|
c0827e04df | ||
|
|
c16ff9dc11 | ||
|
|
b3a87b56fa | ||
|
|
5f8a46868e | ||
|
|
3218deff3a | ||
|
|
1314a8d3f9 | ||
|
|
afabf9d4b1 | ||
|
|
cd62967cae | ||
|
|
22b1231e9a | ||
|
|
4c4f67653e | ||
|
|
3eadf35819 | ||
|
|
3f14b31e47 | ||
|
|
0d456fc0ff | ||
|
|
fd343b069e | ||
|
|
982074c12e | ||
|
|
752b6b63ec | ||
|
|
e68770b4a7 | ||
|
|
75ac6b07cc | ||
|
|
68f9019570 | ||
|
|
f1302f0261 | ||
|
|
19130dc705 | ||
|
|
4e07c64790 | ||
|
|
f4290cd433 | ||
|
|
15922f6656 | ||
|
|
393d701ee9 | ||
|
|
ef5d1f421d | ||
|
|
b3f3126583 | ||
|
|
3a551f2da5 | ||
|
|
a5617c50bb | ||
|
|
fdcd214e32 | ||
|
|
bcc356f266 | ||
|
|
8122c62f24 | ||
|
|
c71338852e | ||
|
|
033a462015 | ||
|
|
3fd726af5e | ||
|
|
6ca2f4c87d | ||
|
|
0c12630b89 | ||
|
|
005269e2ad | ||
|
|
bea0dab623 | ||
|
|
4eb5de90a1 | ||
|
|
d3bc7fb400 | ||
|
|
5333c9ec29 | ||
|
|
09b171c1de | ||
|
|
2cd585cd6c | ||
|
|
0b32f7c87f | ||
|
|
08ef4ff3b1 | ||
|
|
93e147f2d2 | ||
|
|
b5e8e5cf75 | ||
|
|
cd19af4003 | ||
|
|
0f20f1555b | ||
|
|
1a4fe2ac3b | ||
|
|
c3b1b9e964 | ||
|
|
e921745c93 | ||
|
|
5932aab605 | ||
|
|
abfc865c20 | ||
|
|
8ed8840b63 | ||
|
|
ce220fe548 | ||
|
|
98b77368de | ||
|
|
3cbc9997b9 | ||
|
|
a77ed6e844 | ||
|
|
ecd19175cf | ||
|
|
24dbbfa002 | ||
|
|
1fb35c577b | ||
|
|
4354c508c7 | ||
|
|
36f55c1630 | ||
|
|
575a2d6fe3 | ||
|
|
e536b07874 | ||
|
|
64787636b8 | ||
|
|
66c81319ce | ||
|
|
4518d13e07 | ||
|
|
bf8cc95c02 | ||
|
|
225df062ac | ||
|
|
9ba7e6ca66 | ||
|
|
2346829055 | ||
|
|
1dbbdb252c | ||
|
|
6e15684a04 | ||
|
|
2514a33892 | ||
|
|
302105163d | ||
|
|
c128e75f5d | ||
|
|
99e5271cb8 | ||
|
|
15bb819c8a | ||
|
|
c0b4ab9f67 | ||
|
|
4afd29f62c | ||
|
|
6fdeca93b6 | ||
|
|
c67dcae35e | ||
|
|
942ca3b525 | ||
|
|
83653b3a22 | ||
|
|
e1bdcf2d9e | ||
|
|
8c88e9f0f4 | ||
|
|
0572d62c88 | ||
|
|
121728ba2e | ||
|
|
343d4ea641 | ||
|
|
cc939f9645 | ||
|
|
f6ad5bf54c | ||
|
|
2837c41ca4 | ||
|
|
4954c732ee | ||
|
|
6a5268f09b | ||
|
|
7633009ddb | ||
|
|
e267086a17 | ||
|
|
b3780445d3 | ||
|
|
7113fe7e31 | ||
|
|
719865c033 | ||
|
|
2c5664b76e | ||
|
|
43357fe842 | ||
|
|
6222546e20 | ||
|
|
0b032d7434 | ||
|
|
a1ef707065 | ||
|
|
8b6ec2c50b | ||
|
|
f9647ed48d | ||
|
|
c8e284e26f | ||
|
|
48018b33cc | ||
|
|
83af795358 | ||
|
|
ee5d39a001 | ||
|
|
989be64c38 | ||
|
|
80866305d4 | ||
|
|
deddd1b51c | ||
|
|
b647e35c48 | ||
|
|
7932ef6087 | ||
|
|
e58cd1f73a | ||
|
|
9f23dc1d00 | ||
|
|
06bd9d1bf4 | ||
|
|
83088961d0 | ||
|
|
547533e568 | ||
|
|
338a8c204a | ||
|
|
99f940a87e | ||
|
|
cb39edbfd7 | ||
|
|
99f8019aa2 | ||
|
|
1b9112b876 | ||
|
|
e788433c24 | ||
|
|
ea934a1e3d | ||
|
|
244538c0d2 | ||
|
|
6ab1ca67a4 | ||
|
|
b1575524aa | ||
|
|
093b7bbf72 | ||
|
|
20442413bf | ||
|
|
d429756094 | ||
|
|
b5318b4ebc | ||
|
|
4b6164d823 | ||
|
|
97fdb559fb | ||
|
|
37ed89c25f | ||
|
|
7b930da343 | ||
|
|
67cf1e7536 | ||
|
|
8ca9e4ccb1 | ||
|
|
abf475ee80 | ||
|
|
62528253ec | ||
|
|
a377ca7b85 | ||
|
|
c1da3bf537 | ||
|
|
a8911e7f85 | ||
|
|
ab29ec123e | ||
|
|
ca444d36aa | ||
|
|
cb8319ea2d | ||
|
|
af35696db9 | ||
|
|
3af825db91 | ||
|
|
ccd998d709 | ||
|
|
0cfdc7b66a | ||
|
|
7fb6c1e117 | ||
|
|
97586aa5c3 | ||
|
|
5f5d46eb11 | ||
|
|
511d18abec | ||
|
|
24fe98a78c | ||
|
|
51c675c6fe | ||
|
|
01dc43aa09 | ||
|
|
ea0825c226 | ||
|
|
ac3e3ba1e4 | ||
|
|
c16341b3b3 | ||
|
|
4334d1540b | ||
|
|
dbed65985d | ||
|
|
fe7f708e80 | ||
|
|
72aefecab0 | ||
|
|
432098ddd2 | ||
|
|
0bf05e3c7b | ||
|
|
421fcb115f | ||
|
|
b85f1629b3 | ||
|
|
13a7b71e08 | ||
|
|
12968bec26 | ||
|
|
d4f75e4e1b | ||
|
|
4a4df94339 | ||
|
|
d7b278bc65 | ||
|
|
365041c6c3 | ||
|
|
413b26d71b | ||
|
|
45ff2fdcde | ||
|
|
5bd155c294 | ||
|
|
51f4327ce1 | ||
|
|
37cebf38cc | ||
|
|
a2d6f8fec0 | ||
|
|
e895fed180 | ||
|
|
6ed81eadbf | ||
|
|
c756eda805 | ||
|
|
43707a9389 | ||
|
|
d9fbbe1696 | ||
|
|
f746c70dc6 | ||
|
|
a3d09e6d54 | ||
|
|
0a83f9c763 | ||
|
|
f5c5c1b991 | ||
|
|
bfcb46c4fd | ||
|
|
5b35d6e570 | ||
|
|
9269d9b669 | ||
|
|
ec32abbb89 | ||
|
|
c1884a26aa | ||
|
|
1d109bb067 | ||
|
|
35e443975d | ||
|
|
1963270d64 | ||
|
|
3072bbb0d7 | ||
|
|
1697cdc5a1 | ||
|
|
da249cbc40 | ||
|
|
5b94d8bbd7 | ||
|
|
8549755fd5 | ||
|
|
5c51063070 | ||
|
|
758d021f97 | ||
|
|
fea600ba0a | ||
|
|
fd385f8450 | ||
|
|
92d8ee355d | ||
|
|
1f94b25d25 | ||
|
|
8929cd9c08 | ||
|
|
24d85c5cd7 | ||
|
|
4b7cf489c8 | ||
|
|
990a96b56d | ||
|
|
cb23da12cb | ||
|
|
dec2f2a39e | ||
|
|
6315907585 | ||
|
|
6fb9fc4e6f | ||
|
|
df2b966acd | ||
|
|
b09b47543b | ||
|
|
a808d26764 | ||
|
|
e669c681e2 | ||
|
|
b8ca1f920e | ||
|
|
4d983f037e | ||
|
|
c10732736c | ||
|
|
bde5679d11 | ||
|
|
783f3c6955 | ||
|
|
4de93a8cdd | ||
|
|
4087ba0c5c | ||
|
|
cd399f0284 | ||
|
|
b41d318e62 | ||
|
|
97243e9c59 | ||
|
|
3aee541cb9 | ||
|
|
da455c2a14 | ||
|
|
679331323a | ||
|
|
350a52b44e | ||
|
|
0620da4351 | ||
|
|
c4bece1fd5 | ||
|
|
080076e3e4 | ||
|
|
f4ef7ba7e1 | ||
|
|
ffb7126582 | ||
|
|
e22ade38f9 | ||
|
|
ae9c02b456 | ||
|
|
9539c14f2f | ||
|
|
a560d3586a | ||
|
|
ffd155a6aa | ||
|
|
fbf4437159 | ||
|
|
f5ac675379 | ||
|
|
3d266cb237 | ||
|
|
4afe7a73c4 | ||
|
|
f377dfcad4 | ||
|
|
775e1fc4ae | ||
|
|
09e26d0882 | ||
|
|
acfeee3258 | ||
|
|
2b751d2ca6 | ||
|
|
9055d0b8b5 | ||
|
|
e1eb16ce46 | ||
|
|
6b959b4a76 | ||
|
|
7296b704a8 | ||
|
|
f02a74a449 | ||
|
|
3a8a5febe9 | ||
|
|
a0fbae0971 | ||
|
|
3b8a34917f | ||
|
|
5808ea2ba1 | ||
|
|
e348546e59 | ||
|
|
34f3671c09 | ||
|
|
3989f41985 | ||
|
|
bd8b3a9046 | ||
|
|
1aecc3d7e5 | ||
|
|
a366c68c38 | ||
|
|
93059366ab | ||
|
|
df9069090f | ||
|
|
77c5d55d38 | ||
|
|
a9fbf2f968 | ||
|
|
25a3449ad2 | ||
|
|
96c7765f5a | ||
|
|
b01c6e67fd | ||
|
|
c4f3d39d42 | ||
|
|
c84a01310f | ||
|
|
61bf0d5447 | ||
|
|
8002bc66d7 | ||
|
|
c3553a2649 | ||
|
|
6854f2d7e8 | ||
|
|
5913e3830b | ||
|
|
368d26af34 | ||
|
|
ebf4e03019 | ||
|
|
3e94b7d911 | ||
|
|
1fda6eb5ab | ||
|
|
8cef591c57 | ||
|
|
31faa4753c | ||
|
|
fe27939394 | ||
|
|
4155973b8a | ||
|
|
5949c432fa | ||
|
|
eba63ce9ab | ||
|
|
0b772ca50a | ||
|
|
d930d14735 | ||
|
|
8e2eab21ae | ||
|
|
98bd951366 | ||
|
|
7c8363c85e | ||
|
|
b419afad40 | ||
|
|
139bf536e4 | ||
|
|
e110c8ed9b | ||
|
|
20a89d67cb | ||
|
|
ce9a964956 | ||
|
|
296e7011e5 | ||
|
|
798d4dabc0 | ||
|
|
f44694ad44 | ||
|
|
d4a578542f | ||
|
|
3dadc2d1d6 | ||
|
|
149098921f | ||
|
|
34817a0044 | ||
|
|
e18157d5a0 | ||
|
|
87e32baefa | ||
|
|
789c52a9e1 | ||
|
|
32aa897ef8 | ||
|
|
b7384a9a56 | ||
|
|
6ec5dfc5f6 | ||
|
|
b0f71bc990 | ||
|
|
ecdfe24fa8 | ||
|
|
0688641554 | ||
|
|
38644d9d30 | ||
|
|
a751dd63fa | ||
|
|
7da915b1b0 | ||
|
|
c20028782c | ||
|
|
e2de059a78 | ||
|
|
a16faa2610 | ||
|
|
71f2f0e7c9 | ||
|
|
f5bd5a345e | ||
|
|
3ffce87d3a | ||
|
|
207677f1af | ||
|
|
d67d640ef9 | ||
|
|
60e5b5f94e | ||
|
|
959a6e91a0 | ||
|
|
872a7a74fb | ||
|
|
4548831ac5 | ||
|
|
d88f9ed2c0 | ||
|
|
6e68c106f7 | ||
|
|
2507073c20 | ||
|
|
096831c9df | ||
|
|
c26396d693 | ||
|
|
b52b0f525f | ||
|
|
39ee5d77bd | ||
|
|
48c8f16a4c | ||
|
|
adc329c67f | ||
|
|
2a5438d636 | ||
|
|
706834939f | ||
|
|
4525ead1df | ||
|
|
1f42f33102 | ||
|
|
0e3e1f3a9d | ||
|
|
4399af4189 | ||
|
|
2514f11471 | ||
|
|
0546c74b3b | ||
|
|
340b6bf0d2 | ||
|
|
bb6afd7c30 | ||
|
|
09ed0e781a | ||
|
|
94ceb5a46b | ||
|
|
d077165858 | ||
|
|
43b70bf720 | ||
|
|
0c4048484e | ||
|
|
8710f7d196 | ||
|
|
620414187f | ||
|
|
e71dcacd2d | ||
|
|
178c61dbf7 | ||
|
|
c197661be0 | ||
|
|
fb656ce8bd | ||
|
|
749d7e8e4c | ||
|
|
e238fead7c | ||
|
|
0d9be8c255 | ||
|
|
0e37aa9f69 | ||
|
|
22bc98c8bc | ||
|
|
769c8b1f27 | ||
|
|
1043b0eb11 | ||
|
|
6bc79ad54a | ||
|
|
c70bfe1f91 | ||
|
|
a4512ffa6d | ||
|
|
bb5aa94707 | ||
|
|
03f63397ff | ||
|
|
b29a3721d2 | ||
|
|
00244d5428 | ||
|
|
a4d01a5f04 | ||
|
|
4fced076b7 | ||
|
|
9b9d585af0 | ||
|
|
76430a9c77 | ||
|
|
dacbc4dc6d | ||
|
|
7c84e406ac | ||
|
|
096a828e44 | ||
|
|
4916ed0870 | ||
|
|
d7893e1d58 | ||
|
|
22dc0ba772 | ||
|
|
37e17133bc | ||
|
|
cf52ccad67 | ||
|
|
81578fc3cf | ||
|
|
bdb395aa41 | ||
|
|
420537a64d | ||
|
|
af0b57bcda | ||
|
|
9d1dbf4ce9 | ||
|
|
5117efaf98 | ||
|
|
b8766d5fb4 | ||
|
|
421cd41279 | ||
|
|
f98ca56b5e | ||
|
|
e3cbcc8fbd | ||
|
|
37c4da5614 | ||
|
|
af17ca11c7 | ||
|
|
b571ff766c | ||
|
|
9fb807772b | ||
|
|
aa56edddd8 | ||
|
|
65687dfd6f | ||
|
|
67eb261ddb | ||
|
|
5fcb67d646 | ||
|
|
82652de078 | ||
|
|
106ed43f36 | ||
|
|
de71e36843 | ||
|
|
120d36d70b | ||
|
|
d6587b9094 | ||
|
|
5cc0cef06c | ||
|
|
eb66d62f1a | ||
|
|
aba70979ba | ||
|
|
3147624df2 | ||
|
|
dafb2f01b1 | ||
|
|
2c572bbe1e | ||
|
|
44ec8198e5 | ||
|
|
5ac9902384 | ||
|
|
5e44d174e8 | ||
|
|
a5d5e2800c | ||
|
|
b225367e0d | ||
|
|
38cd6a0d0c | ||
|
|
9b5655c1fa | ||
|
|
7168bdd6dc | ||
|
|
e482d69034 | ||
|
|
e1eb354c1c | ||
|
|
585d40f4c1 | ||
|
|
a26bd6ef94 | ||
|
|
aa95dcc0cb | ||
|
|
08c149ed66 | ||
|
|
9dd89dff6a | ||
|
|
49ece1cbf9 | ||
|
|
35204416bf | ||
|
|
56f9149e84 | ||
|
|
7664eb27c4 | ||
|
|
22d0d1029e | ||
|
|
b7ed7a1dd7 | ||
|
|
2645e6f525 | ||
|
|
036348cd60 | ||
|
|
51f2afb7b7 | ||
|
|
2c0968e40e | ||
|
|
3eb5eb1d21 | ||
|
|
4a1b9d8ea4 | ||
|
|
1a84836fd0 | ||
|
|
2e2d90f335 | ||
|
|
b3fb496212 | ||
|
|
a24959319d | ||
|
|
e923f935ea | ||
|
|
0c62db3615 | ||
|
|
d39d89de83 | ||
|
|
98773df76e | ||
|
|
54f7347da5 | ||
|
|
95f749ccd9 | ||
|
|
eb62972aed | ||
|
|
3a5a904afb | ||
|
|
7d68c2c465 | ||
|
|
074a3cfaaf | ||
|
|
2b5e028cbe | ||
|
|
ec20e1ece2 | ||
|
|
b107da09fa | ||
|
|
9534a25270 | ||
|
|
f7e5613f30 | ||
|
|
7d49078f22 | ||
|
|
3abe61e13b | ||
|
|
032efafe2e | ||
|
|
087bcf0ae6 | ||
|
|
cdc1202bbe | ||
|
|
bceca49cdc | ||
|
|
c3e6a30789 | ||
|
|
87913e6c98 | ||
|
|
00fa5aad85 | ||
|
|
2818de4d4a | ||
|
|
e9f8700d6b | ||
|
|
d8b059452c | ||
|
|
98b8ba2650 | ||
|
|
37d924731d | ||
|
|
4affaaf309 | ||
|
|
d3d6e4ae77 | ||
|
|
daf6aaaf30 | ||
|
|
d50b52cdc5 | ||
|
|
cff4ad9e82 | ||
|
|
e3e7a47aea | ||
|
|
c30f901716 | ||
|
|
0ad0cbeb35 | ||
|
|
8ca6c2c433 | ||
|
|
9782599c69 | ||
|
|
768cabe4bb | ||
|
|
5d01384af2 | ||
|
|
15a77e8826 | ||
|
|
dd26d43173 | ||
|
|
59d3bd2746 | ||
|
|
1bbb104600 | ||
|
|
9c258f9da9 | ||
|
|
4c4f885f25 | ||
|
|
fb32d41b3e | ||
|
|
2445f19431 | ||
|
|
7aff020d4d | ||
|
|
192f2b8892 | ||
|
|
3d804665da | ||
|
|
c0558f3527 | ||
|
|
d6a5d701fe | ||
|
|
a34507f6e1 | ||
|
|
8b08ba05c2 | ||
|
|
9ee7febd9b | ||
|
|
47d88d6b79 | ||
|
|
d7e47841e5 | ||
|
|
b6963d0e5c | ||
|
|
1b8ea4b6d7 | ||
|
|
51a97571a0 | ||
|
|
1d53fc41ea | ||
|
|
0798945109 | ||
|
|
8d769dafca | ||
|
|
5d95a3ef7e | ||
|
|
0f24950466 | ||
|
|
902252ad93 | ||
|
|
43c35a760b | ||
|
|
cd3fafb2b0 | ||
|
|
eb5e14661d | ||
|
|
fe15d3b7c1 | ||
|
|
ebd3f0e4e1 | ||
|
|
5673d51cec | ||
|
|
323762ffa7 | ||
|
|
8913eba60d | ||
|
|
a90e56a22b | ||
|
|
d4e46108c4 | ||
|
|
8c103b50af | ||
|
|
c197c2f4fd | ||
|
|
2e2e09ed2b | ||
|
|
3036bab1c6 | ||
|
|
e1e3bba290 | ||
|
|
e556bb242f | ||
|
|
18bdbe13b4 | ||
|
|
6835f6054b | ||
|
|
99e1ff9477 | ||
|
|
932c221548 | ||
|
|
3e324f6544 | ||
|
|
5b575d5627 | ||
|
|
be64e86cc3 | ||
|
|
42743c3ead | ||
|
|
5d8d5d70d0 | ||
|
|
024297c200 | ||
|
|
db030d9733 | ||
|
|
4c699d8001 | ||
|
|
922ed597d6 | ||
|
|
c3a5e2e5d3 | ||
|
|
ad8bd62ae6 | ||
|
|
119802d00f | ||
|
|
674adfb81e | ||
|
|
342d717ff6 | ||
|
|
cdd25ea45f | ||
|
|
4191c51b42 | ||
|
|
a2e256b4c9 | ||
|
|
e3b4f189b4 | ||
|
|
8c6d6b1d09 | ||
|
|
63f8a22b34 | ||
|
|
b965188a5f | ||
|
|
4ca41f4971 | ||
|
|
276d14dd5d | ||
|
|
9a084a6801 | ||
|
|
fb9503199d | ||
|
|
bb931e25d8 | ||
|
|
69d49f9881 | ||
|
|
6ce50435e3 | ||
|
|
0efd7edf0c | ||
|
|
4e37f8aa88 | ||
|
|
fb77bcf762 | ||
|
|
2652060e38 | ||
|
|
3fb6b1ed63 | ||
|
|
5cd54e9f6d | ||
|
|
9ab40af430 | ||
|
|
bcda501864 | ||
|
|
c70d21a92e | ||
|
|
5c915f3d02 | ||
|
|
f0dbc85ca5 | ||
|
|
84439cff86 | ||
|
|
e37da08730 | ||
|
|
3c9c0ec447 | ||
|
|
161a1342b2 | ||
|
|
ae010ef649 | ||
|
|
909fddb732 | ||
|
|
044720b7e5 | ||
|
|
599b263e22 | ||
|
|
625c21a8af | ||
|
|
d515bad46f | ||
|
|
f2da98b136 | ||
|
|
ab758d2377 | ||
|
|
1a3e5a3c70 | ||
|
|
a978a6734f | ||
|
|
3b688aaeb8 | ||
|
|
f73d2bae1f | ||
|
|
6ce5377747 | ||
|
|
619cd57bc6 | ||
|
|
d426847f4f | ||
|
|
2574841bf4 | ||
|
|
fd6b6dc597 | ||
|
|
54a88a94b7 | ||
|
|
057f78fadc | ||
|
|
b4f210d68f | ||
|
|
2471b803e8 | ||
|
|
9e8358dc24 | ||
|
|
12267159f2 | ||
|
|
0e65d2ecfa | ||
|
|
1b1a8594c0 | ||
|
|
2fdaf65244 | ||
|
|
1cb0e39dcc | ||
|
|
a41484cb35 | ||
|
|
455b7ae347 | ||
|
|
d877187d5e | ||
|
|
9bf1c65971 | ||
|
|
a91bab29ff | ||
|
|
929096b3f9 | ||
|
|
5445f97998 | ||
|
|
a6015d46f4 | ||
|
|
110b63b816 | ||
|
|
ec66069e96 | ||
|
|
4482cac9b4 | ||
|
|
1cd9c4ff11 | ||
|
|
203c9c8a7d | ||
|
|
37a83d469c | ||
|
|
e19d86e822 | ||
|
|
f7637a0df7 | ||
|
|
275b0555bd | ||
|
|
5d636baae3 | ||
|
|
a1b14751e5 | ||
|
|
15982ae0b0 | ||
|
|
5f1ef6dfb8 | ||
|
|
14620a5763 | ||
|
|
66b40d8c61 | ||
|
|
1de2fe5e27 | ||
|
|
52ca0908e2 | ||
|
|
f7618e3c73 | ||
|
|
8b3df0d793 | ||
|
|
1f1c8d07c3 | ||
|
|
06dc5aa410 | ||
|
|
83e5ebafd7 | ||
|
|
50fe3109c0 | ||
|
|
d7607df1b1 | ||
|
|
23e9c16ced | ||
|
|
024c019c5b | ||
|
|
514e9b754a | ||
|
|
16e384172c | ||
|
|
9b8819eb08 | ||
|
|
b0255683e9 | ||
|
|
7a285ead7e | ||
|
|
e25fee6f99 | ||
|
|
01f14a7211 | ||
|
|
e993eee97c | ||
|
|
7744dcc508 | ||
|
|
f98ac9dda1 | ||
|
|
af76adf866 | ||
|
|
1c0bb1101b | ||
|
|
9beb4e94d7 | ||
|
|
11e304f42f | ||
|
|
3389f7afc9 | ||
|
|
17e332bb48 | ||
|
|
8e754765e2 | ||
|
|
1b41dc3291 | ||
|
|
262b5a56ca | ||
|
|
15bded694b | ||
|
|
c44a6e296e | ||
|
|
443d3812d1 | ||
|
|
6ead268ef0 | ||
|
|
5fbe74e20d | ||
|
|
4479018289 | ||
|
|
7f451d2635 | ||
|
|
ecb386017f | ||
|
|
4be0ff7095 | ||
|
|
6f06716954 | ||
|
|
f6db2ed8dd | ||
|
|
c143b9b2d7 | ||
|
|
b537016bfb | ||
|
|
e5fcbd1b05 | ||
|
|
b23318be8d | ||
|
|
65c8c8b52a | ||
|
|
0930424406 | ||
|
|
4ae5559a59 | ||
|
|
df3517d7bf | ||
|
|
dd9eda8f97 | ||
|
|
eb42793ad5 | ||
|
|
a30ad77d10 | ||
|
|
26eff8d372 | ||
|
|
685c1ba276 | ||
|
|
04402b325a | ||
|
|
bd57ff793f | ||
|
|
33284302b9 | ||
|
|
89d622b8b2 | ||
|
|
b7f6d7b102 | ||
|
|
cfb3258c36 | ||
|
|
080725295d | ||
|
|
6cf087dc82 | ||
|
|
45d51f56f2 | ||
|
|
7776b19339 | ||
|
|
60467ffd02 | ||
|
|
364e79c673 | ||
|
|
c063cec4d7 | ||
|
|
e2b1a86a29 | ||
|
|
1d49544238 | ||
|
|
70d2adb9e2 | ||
|
|
8ad1bd1501 | ||
|
|
f93b7a1675 | ||
|
|
aaf1afaa13 | ||
|
|
aaa2960b32 | ||
|
|
bf33f3bdce | ||
|
|
577e614fa4 | ||
|
|
c99cd9fc58 | ||
|
|
c6afbed3fe | ||
|
|
0f76af48c1 | ||
|
|
831522d02d | ||
|
|
ea1ed19a92 | ||
|
|
19c1ded81b | ||
|
|
e4bf84701d | ||
|
|
8512e45c5f | ||
|
|
a76f897171 | ||
|
|
53366f62c1 | ||
|
|
d5b69968b4 | ||
|
|
726bf35b76 | ||
|
|
9ada569d59 | ||
|
|
b4829fd3d4 | ||
|
|
942b29c6d7 | ||
|
|
30230645f4 | ||
|
|
431680d8b9 | ||
|
|
480e06a140 | ||
|
|
86b6123305 | ||
|
|
c832fff992 | ||
|
|
d7435cbd9c | ||
|
|
02b2209894 | ||
|
|
7a7f84c49a | ||
|
|
3397165036 | ||
|
|
2771494165 | ||
|
|
b9984ab1f8 | ||
|
|
565f033330 | ||
|
|
0c423c224b | ||
|
|
31ee75f14f | ||
|
|
08ca66c5e7 | ||
|
|
b93b6b448e | ||
|
|
d0c8a6af50 | ||
|
|
dd9305140b | ||
|
|
cde5c9c027 | ||
|
|
99ee0fc72d | ||
|
|
ff452b9d87 | ||
|
|
d56b73e220 | ||
|
|
8f9c336f62 | ||
|
|
1a6af40d0d | ||
|
|
10c5485373 | ||
|
|
0e46e566bc | ||
|
|
f8c2529d44 | ||
|
|
fe7813958a | ||
|
|
f09a123a87 | ||
|
|
c6520f0e65 | ||
|
|
57c3e8f4da | ||
|
|
070d5fc6e8 | ||
|
|
222fea969d | ||
|
|
e5956de744 | ||
|
|
f28f27a87b | ||
|
|
b0783a8995 | ||
|
|
daacd90b35 | ||
|
|
a84de0bae2 | ||
|
|
1869350a9b | ||
|
|
5b8e918d6e | ||
|
|
f0fe968944 | ||
|
|
40f2648fd3 | ||
|
|
b1aff2995d | ||
|
|
5f6636e28b | ||
|
|
b52141d6a8 | ||
|
|
da4b4037a8 | ||
|
|
4c629e82c8 | ||
|
|
e96c44c1f2 | ||
|
|
caeae69eb7 | ||
|
|
84df4785f8 | ||
|
|
7b8ab047ed | ||
|
|
acd7e028d5 | ||
|
|
bf26ec9d1a | ||
|
|
b0d004d716 | ||
|
|
607c37adfd | ||
|
|
83591b4567 | ||
|
|
6b1ba5e150 | ||
|
|
73990acf7a | ||
|
|
43ae607839 | ||
|
|
1e340686e6 | ||
|
|
f8b42929c8 | ||
|
|
1bd473a1b9 | ||
|
|
9790cac065 | ||
|
|
33e72a9c08 | ||
|
|
99edcc0f97 | ||
|
|
7b59379d29 | ||
|
|
9f3cd93bd6 | ||
|
|
ff86c8acc7 | ||
|
|
1cebd3dcd1 | ||
|
|
0a209fc340 | ||
|
|
eac6c46d28 | ||
|
|
d0b53916e3 | ||
|
|
2f2cbade96 | ||
|
|
8b2ca56283 | ||
|
|
234e789d48 | ||
|
|
97abce1ca6 | ||
|
|
fa5475f1c0 | ||
|
|
2a564884e7 | ||
|
|
46a6dbe9b8 | ||
|
|
f07e3c3b25 | ||
|
|
392de5a54f | ||
|
|
9ed4a07b28 | ||
|
|
1b0b3e1a44 | ||
|
|
21781adb9e | ||
|
|
dc3cc37784 | ||
|
|
135d5f4cc7 | ||
|
|
e34c46c893 | ||
|
|
013e059ffc | ||
|
|
5e049efc87 | ||
|
|
7294bec1c8 | ||
|
|
0c9f0e52bd | ||
|
|
0e15bf124a | ||
|
|
a142a5a30c | ||
|
|
a5daa142eb | ||
|
|
a34766bd05 | ||
|
|
312e1bab47 | ||
|
|
3cf4d15192 | ||
|
|
64c23ae18d | ||
|
|
47772f520d | ||
|
|
6fc742f229 | ||
|
|
c197f7996b | ||
|
|
137bedb3f9 | ||
|
|
73b302f432 | ||
|
|
4a25252626 | ||
|
|
b17a403bcd | ||
|
|
0813aff1bd | ||
|
|
076bf6f0e5 | ||
|
|
efbb66ba4a | ||
|
|
fe6006f275 | ||
|
|
6bf03415ac | ||
|
|
8043aebe1a | ||
|
|
d23086a6e8 | ||
|
|
eabd91c29c | ||
|
|
0eff02c69b | ||
|
|
515db517ca | ||
|
|
dd2c210cfb | ||
|
|
7147af8f80 | ||
|
|
b90a94bdd9 | ||
|
|
e9352fca9a | ||
|
|
6cf4fc1026 | ||
|
|
437c59f087 | ||
|
|
449eca6fb4 | ||
|
|
c3c5756c7a | ||
|
|
d7c4ef2fe7 | ||
|
|
2e642310b8 | ||
|
|
71fb2e04a9 | ||
|
|
e84861f770 | ||
|
|
ec9a38c2fe | ||
|
|
c6f62632d8 | ||
|
|
2561e3a64f | ||
|
|
5041e6f3d9 | ||
|
|
67b87e26e8 | ||
|
|
d3778ab1fd | ||
|
|
ed551c375d | ||
|
|
52a3f4e1a8 | ||
|
|
b8af903703 | ||
|
|
6eeeaff399 | ||
|
|
c14bbea0a1 | ||
|
|
43171c05d3 | ||
|
|
8c899ab13f | ||
|
|
4eb0f014b8 | ||
|
|
8f13e8b2bb | ||
|
|
4903089e41 | ||
|
|
2db876d12c | ||
|
|
d373e2891e | ||
|
|
8b0257d24b | ||
|
|
fa3d3aa4dd | ||
|
|
9ca438087e | ||
|
|
037d8c071c | ||
|
|
a6839afc1f | ||
|
|
94196eb11b | ||
|
|
89bb2dba38 | ||
|
|
f61aae7e3f | ||
|
|
ceacf3bf54 | ||
|
|
5e4e382dec | ||
|
|
956c199fcf | ||
|
|
36f9d37487 | ||
|
|
5bc15cf83c | ||
|
|
ab180bc98d | ||
|
|
a13fbab4e4 | ||
|
|
f522305593 | ||
|
|
15c0561588 | ||
|
|
146ccc37a2 | ||
|
|
c22199f92f | ||
|
|
7af68bddea | ||
|
|
7ca40bed32 | ||
|
|
e8913b843d | ||
|
|
385ad5f9ce | ||
|
|
1088a78720 | ||
|
|
e006e92255 | ||
|
|
12bdb5ffe5 | ||
|
|
a92e676e28 | ||
|
|
17027cb515 | ||
|
|
3cd7e1c18c | ||
|
|
6f85fc9e8c | ||
|
|
0401e86216 | ||
|
|
fbd5ffc198 | ||
|
|
d1d626fb6f | ||
|
|
03887f9d1b | ||
|
|
ad55924af5 | ||
|
|
7391846eda | ||
|
|
f3656c2792 | ||
|
|
b56a97ab3d | ||
|
|
3735dc9fa3 | ||
|
|
7a7ea8c7f6 | ||
|
|
9b7e03d557 | ||
|
|
fb64a0a46c | ||
|
|
dd4f5131c7 | ||
|
|
f48ca740fc | ||
|
|
6d553d1ecd | ||
|
|
6452cdca04 | ||
|
|
c3ce52a6c0 | ||
|
|
86eb601c34 | ||
|
|
10e1d9093e | ||
|
|
3cabd195d2 | ||
|
|
7e3eee2591 | ||
|
|
5c747f9db6 | ||
|
|
ffa4616acf | ||
|
|
3ba3c1b881 | ||
|
|
a98c052664 | ||
|
|
37119efec9 | ||
|
|
0c18f944cc | ||
|
|
ec091ce8de | ||
|
|
1b4f4b6b65 | ||
|
|
35d1222cba | ||
|
|
5b8c5c0601 | ||
|
|
ce1bc98ae6 | ||
|
|
f7bb2c02fb | ||
|
|
eab6ffe7db | ||
|
|
cb5ef44d3f | ||
|
|
9820e59559 | ||
|
|
88339fc782 | ||
|
|
d6125d0d0c | ||
|
|
cc840df352 | ||
|
|
ddf733a7cc | ||
|
|
4b0fa940bb | ||
|
|
1498872214 | ||
|
|
2c0559dbea | ||
|
|
7062015e25 | ||
|
|
5ffdc79bc7 | ||
|
|
6ada5e4397 | ||
|
|
19e183c801 | ||
|
|
5117c04883 | ||
|
|
575751323c | ||
|
|
716c5c828b | ||
|
|
7bfda36ae5 | ||
|
|
636f6db51c | ||
|
|
dcbe51c855 | ||
|
|
7e6d07ea88 | ||
|
|
4c92e0aa2c | ||
|
|
8440abcee5 | ||
|
|
5b1c615498 | ||
|
|
a3a8da1746 | ||
|
|
7373e9cdd7 | ||
|
|
24e4162e76 | ||
|
|
c219be1dc2 | ||
|
|
4e619b1693 | ||
|
|
f7f2e6c936 | ||
|
|
14f59801d7 | ||
|
|
279a661176 | ||
|
|
36c07a1c3a | ||
|
|
46b75e8c3c | ||
|
|
fd5bb40560 | ||
|
|
6d32d0b322 | ||
|
|
e275441701 | ||
|
|
748513aa9a | ||
|
|
77731b5674 | ||
|
|
9963c690f2 | ||
|
|
8e81685a9f | ||
|
|
94e721acf2 | ||
|
|
3545b2751d | ||
|
|
83eae467f0 | ||
|
|
605c4ac038 | ||
|
|
5e783124e8 | ||
|
|
36243fb4d3 | ||
|
|
71023ae9df | ||
|
|
d6884d5b0f | ||
|
|
27e6401c97 | ||
|
|
21ea6c6283 | ||
|
|
1dbdd0a366 | ||
|
|
cb60089d44 | ||
|
|
fe99264553 | ||
|
|
38fe2c2a33 | ||
|
|
dd9898e687 | ||
|
|
1ff06c4be4 | ||
|
|
5a7efcd738 | ||
|
|
071223120b | ||
|
|
0259eb6419 | ||
|
|
9d91e6366d | ||
|
|
d1a5376dae | ||
|
|
f283e68073 | ||
|
|
83ed26e5b9 | ||
|
|
0d213fc6db | ||
|
|
a0599e84d9 | ||
|
|
82286d45ed | ||
|
|
2bab328f8d | ||
|
|
a7d1d9880b | ||
|
|
76ce250421 | ||
|
|
0533e559ae | ||
|
|
19e0848698 | ||
|
|
a49e1a70db | ||
|
|
29f186bc18 | ||
|
|
7faba49f66 | ||
|
|
561d0c9a4c | ||
|
|
358d27f2ba | ||
|
|
f89fd9c888 | ||
|
|
3faf1912af | ||
|
|
b18e4f079f | ||
|
|
bad97db302 | ||
|
|
d120c3b93e | ||
|
|
ff70339aad | ||
|
|
c7d8a24f4e | ||
|
|
d903214ddf | ||
|
|
b6d1d0bf5d | ||
|
|
4113d6a2f3 | ||
|
|
56c0d3ec33 | ||
|
|
1a36160c90 | ||
|
|
fce5b4dd78 | ||
|
|
2e5b0fb72d | ||
|
|
57e597ec13 | ||
|
|
259ca06f73 | ||
|
|
c0a148c018 | ||
|
|
9e27cb713f | ||
|
|
644a46bdfd | ||
|
|
b99bdbcd4e | ||
|
|
e0c2131869 | ||
|
|
9981f897a4 | ||
|
|
57672ad384 | ||
|
|
26cbd16b40 | ||
|
|
64a961ec00 | ||
|
|
af57c9e321 | ||
|
|
685d913171 | ||
|
|
b41452162c | ||
|
|
ef473f930a | ||
|
|
b333058b57 | ||
|
|
7df140c164 | ||
|
|
ef1fd9e428 | ||
|
|
98b4681dc5 | ||
|
|
b312b4d502 | ||
|
|
509ed81294 | ||
|
|
1ba2731391 | ||
|
|
e599fafdfd | ||
|
|
caac5466ba | ||
|
|
d83c942fe5 | ||
|
|
c0a0466b6c | ||
|
|
31dc423d1d | ||
|
|
beaf6b0e0d | ||
|
|
4273f2cc55 | ||
|
|
6173841768 | ||
|
|
f7a08e8d27 | ||
|
|
be0b4e9072 | ||
|
|
57e4e4ee0d | ||
|
|
2bb24892df | ||
|
|
55fe24e72c | ||
|
|
1add492a11 | ||
|
|
3de2b7fe43 | ||
|
|
1aa48be01e | ||
|
|
5ead6554b3 | ||
|
|
ae7ccb613e | ||
|
|
8cbac6207d | ||
|
|
6e70c5faf6 | ||
|
|
c555516f29 | ||
|
|
55491d1198 | ||
|
|
a06358779c | ||
|
|
c7d3740cbb | ||
|
|
ee827c917e | ||
|
|
6094b8be9a | ||
|
|
54767b5a65 | ||
|
|
97a2a6a168 | ||
|
|
aca687dc12 | ||
|
|
f2648927f2 | ||
|
|
d76ed50625 | ||
|
|
845590ed68 | ||
|
|
0c125c1386 | ||
|
|
0a884ab20b | ||
|
|
0e6b3eab11 | ||
|
|
db5c17b518 | ||
|
|
1713f49e07 | ||
|
|
04a6b4448f | ||
|
|
6afd7e3b72 | ||
|
|
6db826005c | ||
|
|
3ee8098eb2 | ||
|
|
ce33ae1527 | ||
|
|
27ed1e94e9 | ||
|
|
0c187b4459 | ||
|
|
5315519655 | ||
|
|
1018dc7ced | ||
|
|
6bd089c350 | ||
|
|
ab3f1f829a | ||
|
|
6998aa94fd | ||
|
|
9e3bb09ef1 | ||
|
|
5feb4f9c89 | ||
|
|
0e406c5440 | ||
|
|
42b756952e | ||
|
|
6464bfe850 | ||
|
|
835d7bfb9d | ||
|
|
d40e57ad27 | ||
|
|
e008d7cbeb | ||
|
|
481bc2cb92 | ||
|
|
2eddda1843 | ||
|
|
55c809e839 | ||
|
|
f50a95d723 | ||
|
|
e8fbd77a61 | ||
|
|
43d85521c4 | ||
|
|
e88c5a0da7 | ||
|
|
d9a90eed24 | ||
|
|
c212b525d2 | ||
|
|
b0934c9121 | ||
|
|
f8cfe69b5c | ||
|
|
00130e6ac6 | ||
|
|
3983abe814 | ||
|
|
2298a61d76 | ||
|
|
9bb007f4b5 | ||
|
|
c24732f90a | ||
|
|
df7bd02861 | ||
|
|
8ad667c43e | ||
|
|
8c27cd704e | ||
|
|
9b530d4b0b | ||
|
|
ece11993d7 | ||
|
|
dbd5d891db | ||
|
|
4ece7ed936 | ||
|
|
ddab3709a3 | ||
|
|
8feb51ebce | ||
|
|
09492b15e8 | ||
|
|
c86bb03595 | ||
|
|
5fed64117f | ||
|
|
f07c0488fe | ||
|
|
0d53eb5386 | ||
|
|
1ce1c16a05 | ||
|
|
e1205246fc | ||
|
|
b809343cb6 | ||
|
|
d6e0f33fdb | ||
|
|
eaf3bdbf34 | ||
|
|
488e9d5396 | ||
|
|
ceb1fcb6c1 | ||
|
|
2a28fa9774 | ||
|
|
6588d0e4bb | ||
|
|
5a6e889bd4 | ||
|
|
d69642922e | ||
|
|
8ef132bece | ||
|
|
eafd1e52c4 | ||
|
|
11d7e1e185 | ||
|
|
634141637b | ||
|
|
32e2d97941 | ||
|
|
a40d13af76 | ||
|
|
75aa1e02e5 | ||
|
|
03b5b622d0 | ||
|
|
a75c0eca36 | ||
|
|
cebec03ed6 | ||
|
|
3c62829525 | ||
|
|
ae18186290 | ||
|
|
a3a042aff8 | ||
|
|
cc4e595b9d | ||
|
|
4bb1c39a2e | ||
|
|
0b6c29d274 | ||
|
|
3627a78aed | ||
|
|
89e9ac8039 | ||
|
|
58171e4479 | ||
|
|
b8b10e79fe | ||
|
|
845fbacd11 | ||
|
|
d1fb9c604a | ||
|
|
27afa3af74 | ||
|
|
97fa01f327 | ||
|
|
f97b632c65 | ||
|
|
658c5b42be | ||
|
|
141651d825 | ||
|
|
915a585dfa | ||
|
|
c1352dd6bb | ||
|
|
435c14d822 | ||
|
|
f0884b8e47 | ||
|
|
33c17a6f2e | ||
|
|
8b1fdc6b73 | ||
|
|
f7bab88079 | ||
|
|
b852b54352 | ||
|
|
3b324000f4 | ||
|
|
bd20796509 | ||
|
|
fdd90d1797 | ||
|
|
9b7f44c8a0 | ||
|
|
dac9a318bb | ||
|
|
0b591efe81 | ||
|
|
2b5fcbdcbd | ||
|
|
334001c829 | ||
|
|
97a0161e64 | ||
|
|
357ab6156e | ||
|
|
7eefc9d856 | ||
|
|
3e3cd068dc | ||
|
|
7bf1680ff8 | ||
|
|
c635fe7f36 | ||
|
|
3f70c0d66d | ||
|
|
53f7444a8e | ||
|
|
b3a660959e | ||
|
|
d2bbc57378 | ||
|
|
961369f48d | ||
|
|
dad62137c6 | ||
|
|
0800faf057 | ||
|
|
d12f94888a | ||
|
|
a438efa4be | ||
|
|
f69f852c53 | ||
|
|
72c6707bdb | ||
|
|
01c28019ba | ||
|
|
c65ebd5e83 | ||
|
|
d43ae7ac8e | ||
|
|
ce89428bb9 | ||
|
|
4299cdfeac | ||
|
|
7a998e7ed7 | ||
|
|
8a58ba2374 | ||
|
|
aa67a3ba2a | ||
|
|
26d70b1bd4 | ||
|
|
4d9e626292 | ||
|
|
8824f7edee | ||
|
|
0617c1cd13 | ||
|
|
56674ea708 | ||
|
|
24e59ccedd | ||
|
|
0b5e79ed23 | ||
|
|
f9199f259d | ||
|
|
9ed647d280 | ||
|
|
cb5bc580b0 | ||
|
|
3b908f4a33 | ||
|
|
46dac869d5 | ||
|
|
bafb0dbbfc | ||
|
|
6ccecaf408 | ||
|
|
773dd0805b | ||
|
|
d347ab08e7 | ||
|
|
a5ed7b992f | ||
|
|
906045b215 | ||
|
|
12f087401b | ||
|
|
12074a15a8 | ||
|
|
feb62793d2 | ||
|
|
04419ba24b | ||
|
|
7b89893645 | ||
|
|
6d7c4c4dd4 | ||
|
|
da9f1d1fa3 | ||
|
|
76606256a2 | ||
|
|
aebcc4a631 | ||
|
|
91fb5ae1bd | ||
|
|
0c438cc7a0 | ||
|
|
f82fce2bb7 | ||
|
|
634e556cfa | ||
|
|
f28e5f2ebb | ||
|
|
a16afd7ff9 | ||
|
|
c7b691e2d7 | ||
|
|
3b6acfd67d | ||
|
|
822b495f8a | ||
|
|
bf2a298da7 | ||
|
|
90b26a98d3 | ||
|
|
509839e79e | ||
|
|
9f675dda2a | ||
|
|
06e7a48aaf | ||
|
|
e577f30cb5 | ||
|
|
67e31e0e30 | ||
|
|
8c32957957 | ||
|
|
2a16cf220e | ||
|
|
964c1922cd | ||
|
|
61228d112e | ||
|
|
5fe8443ff4 | ||
|
|
5599b37b59 | ||
|
|
83e4dadcfe | ||
|
|
8ba05ce126 | ||
|
|
11c0e982b2 | ||
|
|
cb988c505d | ||
|
|
762f027e2e | ||
|
|
83da5e6004 | ||
|
|
ec9309edcd | ||
|
|
d1c80de9c8 | ||
|
|
55e2f18d1e | ||
|
|
88e8fbb39a | ||
|
|
e0f9f68b46 | ||
|
|
e71fcc33f9 | ||
|
|
7d07642bef | ||
|
|
096303955e | ||
|
|
1bd846454c | ||
|
|
72f3f1afee | ||
|
|
48759fd66d | ||
|
|
06ce10b351 | ||
|
|
b403828791 | ||
|
|
217065aafc | ||
|
|
5f38d1d3e9 | ||
|
|
f4ee5d0a4b | ||
|
|
8398ec5358 | ||
|
|
7731f93676 | ||
|
|
8123593be5 | ||
|
|
673543df1d | ||
|
|
b1061c5a94 | ||
|
|
8a022a4be0 | ||
|
|
2cf1aabcba | ||
|
|
343279ee5d | ||
|
|
8b215bf6d4 | ||
|
|
f20d38f131 | ||
|
|
fab0d70f21 | ||
|
|
edb6e26bc4 | ||
|
|
8edb74168b | ||
|
|
6259fba6ad | ||
|
|
4f7061aaa8 | ||
|
|
88c8ea0d5a | ||
|
|
be601d4654 | ||
|
|
fde90afe58 | ||
|
|
7dcb9c830f | ||
|
|
7ccddfb755 | ||
|
|
a1432ef0f7 | ||
|
|
5379a26a1a | ||
|
|
6762727826 | ||
|
|
a28144bbc0 | ||
|
|
56b0c333c0 | ||
|
|
a23386bdb4 | ||
|
|
f771f607d6 | ||
|
|
c7b24f7ce9 | ||
|
|
f1a680322b | ||
|
|
ad4f05a0cd | ||
|
|
d47d0e4097 | ||
|
|
f3e82b56e9 | ||
|
|
604e4bbfee | ||
|
|
79b519be72 | ||
|
|
c22e03a222 | ||
|
|
6b07186078 | ||
|
|
b18acd5978 | ||
|
|
bba167c433 | ||
|
|
1199554be7 | ||
|
|
9cc6d1439e | ||
|
|
d3a3115298 | ||
|
|
da5ddb2518 | ||
|
|
9b7dcf5d88 | ||
|
|
e5ffb8de4c | ||
|
|
ff1a5e0539 | ||
|
|
6ccf88f808 | ||
|
|
2c863aa3ec | ||
|
|
5f1d6f333c | ||
|
|
6546108307 | ||
|
|
4a33c0af6e | ||
|
|
a53d7edc7f | ||
|
|
090b2dbd30 | ||
|
|
68d501fabf | ||
|
|
cb92e1d4c9 | ||
|
|
7424c776e5 | ||
|
|
6e502478e3 | ||
|
|
72052b913f | ||
|
|
1ce8f3844b | ||
|
|
751316f388 | ||
|
|
1533d50157 | ||
|
|
e1282081bf | ||
|
|
9f4dc1936b | ||
|
|
ba5cae554c | ||
|
|
bdbc65209c | ||
|
|
87bf899396 | ||
|
|
089ef6f7cd | ||
|
|
ea665da391 | ||
|
|
c9bd1b8510 | ||
|
|
2e1682fbf6 | ||
|
|
9de26ed062 | ||
|
|
8956661eb7 | ||
|
|
325a083e89 | ||
|
|
5918f757cd | ||
|
|
75e426978c | ||
|
|
2ea640cee3 | ||
|
|
d52ccc0500 | ||
|
|
63e76e109f | ||
|
|
c8009487ab | ||
|
|
271be70806 | ||
|
|
56a65d95e3 | ||
|
|
0e9e7612a4 | ||
|
|
b93388f504 | ||
|
|
cdda490fc7 | ||
|
|
9d14f92c01 | ||
|
|
3a966add42 | ||
|
|
8fc125c5b5 | ||
|
|
2e241fda2c | ||
|
|
846257957e | ||
|
|
975f177a23 | ||
|
|
575f013bc9 | ||
|
|
320f3198ea | ||
|
|
e49583f8e0 | ||
|
|
73d801cb1d | ||
|
|
67664365bd | ||
|
|
8530adc782 | ||
|
|
2c45299b6a | ||
|
|
97f031c623 | ||
|
|
2111db73a7 | ||
|
|
01a78feb41 | ||
|
|
a70f6de2e4 | ||
|
|
dbd198ec07 | ||
|
|
974797648f | ||
|
|
c84ef8bdb5 | ||
|
|
0fb17c91d8 | ||
|
|
fceb05e646 | ||
|
|
c0e81e7808 | ||
|
|
470f6a8cbc | ||
|
|
6f1ce750bf | ||
|
|
672cf1a46e | ||
|
|
5f7ee3f4ee | ||
|
|
80262314f3 | ||
|
|
48b6f8c954 | ||
|
|
b7a19c6d16 | ||
|
|
cece9a5028 | ||
|
|
f3bfb08280 | ||
|
|
292427c275 | ||
|
|
db77d91500 | ||
|
|
290a99ba85 | ||
|
|
a86f1e8a90 | ||
|
|
589aa19246 | ||
|
|
f10e7ac224 | ||
|
|
9e5712594c | ||
|
|
c90cc096a1 | ||
|
|
f1a6651f04 | ||
|
|
a36013f2e0 | ||
|
|
36cebd565a | ||
|
|
fefa2ee036 | ||
|
|
446a4b16ee | ||
|
|
9af5aea687 | ||
|
|
a413621efc | ||
|
|
b751383702 | ||
|
|
974da9947c | ||
|
|
3b557c273f | ||
|
|
8458aa7978 | ||
|
|
d5cdfe62d5 | ||
|
|
dfb7c163a0 | ||
|
|
504133fa1b | ||
|
|
7a8f2cf8cd | ||
|
|
9554a39a77 | ||
|
|
bea7eff017 | ||
|
|
3f6aef16eb | ||
|
|
662d21d1aa | ||
|
|
10b2156b12 | ||
|
|
96870367cf | ||
|
|
f414030e87 | ||
|
|
4d6534bfe7 | ||
|
|
a00bceaff7 | ||
|
|
5ef2f185ad | ||
|
|
f5e5ad9670 | ||
|
|
1d316044a7 | ||
|
|
d3dc6f42d1 | ||
|
|
9ca7d1bf56 | ||
|
|
f40226459b | ||
|
|
490595cb35 | ||
|
|
c68a621a71 | ||
|
|
8ec1c1c29a | ||
|
|
42be1d633c | ||
|
|
608efaaae3 | ||
|
|
428960aff2 | ||
|
|
aaceaf097c | ||
|
|
1c42ee1a30 | ||
|
|
352e5918b6 | ||
|
|
858229aaf8 | ||
|
|
7c3d3319c1 | ||
|
|
30307a8ae2 | ||
|
|
a7d06eee2d | ||
|
|
10affe0d9c | ||
|
|
6549ce57e6 | ||
|
|
dd636c1654 | ||
|
|
4c43f7d102 | ||
|
|
6ea8c95c8c | ||
|
|
5cf6cef49d | ||
|
|
786e9bafc8 | ||
|
|
51f92b1eb4 | ||
|
|
261bbea934 | ||
|
|
a4b5c233b7 | ||
|
|
29eeb1eaf3 | ||
|
|
cafae31827 | ||
|
|
a38e5bde3a | ||
|
|
1459bfe7be | ||
|
|
81ec75f81d | ||
|
|
f1531d2b12 | ||
|
|
86515e6814 | ||
|
|
ada47d476c | ||
|
|
7446799e4b | ||
|
|
947e5ab582 | ||
|
|
6b93053a80 | ||
|
|
7c03bd128b | ||
|
|
b62c1277e5 | ||
|
|
688d73b143 | ||
|
|
f4192e4f9d | ||
|
|
c5461b4509 | ||
|
|
98f2d865b9 | ||
|
|
bba3fc01c9 | ||
|
|
ed065fa43d | ||
|
|
52c3ff02ae | ||
|
|
48a634bff4 | ||
|
|
bf7d059472 | ||
|
|
3e5bd82434 | ||
|
|
fcf8e246cf | ||
|
|
2af3d20a71 | ||
|
|
fde9a7a7ba | ||
|
|
d6fb0bc24f | ||
|
|
f4b1e3307d | ||
|
|
306479a77f | ||
|
|
bc264ceaaf | ||
|
|
53d8341886 | ||
|
|
95d36c1f29 | ||
|
|
ba14b27e9a | ||
|
|
d5dc7334a1 | ||
|
|
982416b3f7 | ||
|
|
a11ae18577 | ||
|
|
4e63e3b0de | ||
|
|
7ea1193015 | ||
|
|
5b69e7268e | ||
|
|
1e61918d1c | ||
|
|
ee67cf7d49 | ||
|
|
58f20b4fe5 | ||
|
|
9525989560 | ||
|
|
c600f328a1 | ||
|
|
28ffca1f84 | ||
|
|
e129db4978 | ||
|
|
734d8a8151 | ||
|
|
afdaca0515 | ||
|
|
52b2dbec85 | ||
|
|
aa10d7aeed | ||
|
|
7f7b3e747c | ||
|
|
59fa374491 | ||
|
|
26d8056755 | ||
|
|
b772bc75a9 | ||
|
|
001b7fb799 | ||
|
|
260f819e38 | ||
|
|
6306bc0c90 | ||
|
|
913bc6da93 | ||
|
|
6ac035f0b1 | ||
|
|
fa1b2fe70f | ||
|
|
fa9d2a81a3 | ||
|
|
4cbe6c1000 | ||
|
|
c203d3356b | ||
|
|
d617d8ebb3 | ||
|
|
43d2c3bbc8 | ||
|
|
3e17e9f00d | ||
|
|
b54a53d1ac | ||
|
|
bdb0f5e81c | ||
|
|
29398a0ab5 | ||
|
|
7a65dc96cd | ||
|
|
1ac5df3cd0 | ||
|
|
39d1293350 | ||
|
|
6f8c6bf13e | ||
|
|
51f56719c0 | ||
|
|
45e8c26864 | ||
|
|
3123b429f7 | ||
|
|
05a2cb1020 | ||
|
|
5aa88abacc | ||
|
|
e749420196 | ||
|
|
8ac5957186 | ||
|
|
d0def4a80f | ||
|
|
5a6be9a665 | ||
|
|
734221cc3f | ||
|
|
f5e7dd5164 | ||
|
|
22cc33eb15 | ||
|
|
559416dcae | ||
|
|
68a7550080 | ||
|
|
7f5589c01b | ||
|
|
da9cde6d18 | ||
|
|
5aa8326dfc | ||
|
|
e4ed0994ce | ||
|
|
875d1b209a | ||
|
|
8ed44e6b64 | ||
|
|
886828caa8 | ||
|
|
814b5297ad | ||
|
|
2ab8db3c0c | ||
|
|
94979f7ff5 | ||
|
|
5c46bd37e8 | ||
|
|
c81b9bab79 | ||
|
|
818bab9fa4 | ||
|
|
ee0b7e9c82 | ||
|
|
03b2766ca8 | ||
|
|
fc5c93ab5f | ||
|
|
eee2468a01 | ||
|
|
a5092dc763 | ||
|
|
bf97fd67b4 | ||
|
|
45caa8baab | ||
|
|
ab6ba0e0d8 | ||
|
|
e7bf643d8b | ||
|
|
c8caf6797d | ||
|
|
51941eae49 | ||
|
|
5445632026 | ||
|
|
f08491cee8 | ||
|
|
9cd4ac1df4 | ||
|
|
c612633402 | ||
|
|
0c36849c0f | ||
|
|
1a1f2254e5 | ||
|
|
908a72e00e | ||
|
|
2fe6b5074d | ||
|
|
a7756fc876 | ||
|
|
8cb7eeecd2 | ||
|
|
d4de7f5df3 | ||
|
|
989b75502c | ||
|
|
bb675fde0c | ||
|
|
6df5c35b4e | ||
|
|
9957149115 | ||
|
|
f98870db1f | ||
|
|
7c5e39e170 | ||
|
|
ebe2ab504b | ||
|
|
e4f997113d | ||
|
|
cb155769d5 | ||
|
|
49efece6c6 | ||
|
|
846797be76 | ||
|
|
d6d4d95b20 | ||
|
|
cc8eaea5a7 | ||
|
|
269a995a01 | ||
|
|
77dff119db | ||
|
|
0718d438b8 | ||
|
|
3a2541d3bf | ||
|
|
00d33599f0 | ||
|
|
f49732b036 | ||
|
|
73144c3493 | ||
|
|
c5e7e82b46 | ||
|
|
af6ad9355d | ||
|
|
6c4c908678 | ||
|
|
ae62a46a97 | ||
|
|
bf84c64ea9 | ||
|
|
5ac8a42681 | ||
|
|
03b1914112 | ||
|
|
ff21bde839 | ||
|
|
c62da0eda6 | ||
|
|
932d3a054c | ||
|
|
a67fd48720 | ||
|
|
afc2b48073 | ||
|
|
093d30121d | ||
|
|
1b8583fa51 | ||
|
|
ea37e777cf | ||
|
|
cc5911b4aa | ||
|
|
28d50100d8 | ||
|
|
8ef464597f | ||
|
|
2c64a4f3a1 | ||
|
|
8002d98f50 | ||
|
|
9519ad46a1 | ||
|
|
597b3e16e0 | ||
|
|
addca871ad | ||
|
|
2c0504d596 | ||
|
|
434e8cc937 | ||
|
|
6c950593b7 | ||
|
|
147f77f1dc | ||
|
|
86bbe156db | ||
|
|
bb5dedeeb9 | ||
|
|
261974e9eb | ||
|
|
cbaa7a81bf | ||
|
|
f400cea437 | ||
|
|
dcbe75ec2c | ||
|
|
fec98fd4a9 | ||
|
|
29cb8c42b0 | ||
|
|
d187a437fe | ||
|
|
a263ca8cb3 | ||
|
|
eeae5dbcad | ||
|
|
1bb70930fa | ||
|
|
8e76cf2c13 | ||
|
|
9bf5828079 | ||
|
|
b3bee52ad1 | ||
|
|
2c9b51f29d | ||
|
|
96be8ad072 | ||
|
|
38b661e2cb | ||
|
|
657397b177 | ||
|
|
0796f32c17 | ||
|
|
c70a2925a8 | ||
|
|
17788b2027 | ||
|
|
527dc1982e | ||
|
|
449065b466 | ||
|
|
8a48d9e86b | ||
|
|
a41a14b975 | ||
|
|
f76b30af15 | ||
|
|
44258ffa4b | ||
|
|
659c29cf77 | ||
|
|
b6da314692 | ||
|
|
26955d2b79 | ||
|
|
0a79496f0c | ||
|
|
1d23f8c2f4 | ||
|
|
8d27ed986c | ||
|
|
9b8607fc64 | ||
|
|
a5993419c4 | ||
|
|
ab136c42a7 | ||
|
|
ec08cd99aa | ||
|
|
2aeaa081fe | ||
|
|
b72ae197e5 | ||
|
|
0d2668f2b1 | ||
|
|
50b4906ea8 | ||
|
|
f36a24fef0 | ||
|
|
b1c885a266 | ||
|
|
958260d559 | ||
|
|
8b2d33ac0a | ||
|
|
95e247ae7c | ||
|
|
c55223e750 | ||
|
|
164a0e0160 | ||
|
|
3265f84266 | ||
|
|
2bac72fa36 | ||
|
|
51f6d02cf1 | ||
|
|
9cb452ad20 | ||
|
|
bc70577701 | ||
|
|
076c7f54a8 | ||
|
|
0837affa24 | ||
|
|
c82d4f3e44 | ||
|
|
a898aad667 | ||
|
|
f0a997629d | ||
|
|
8ecdb484c3 | ||
|
|
128abb46d2 | ||
|
|
bfa2101da0 | ||
|
|
e2cd44d69f | ||
|
|
7a9cea4baa | ||
|
|
15ff53dcb6 | ||
|
|
866f8f54ec | ||
|
|
eb1d1517ca | ||
|
|
fa10022496 | ||
|
|
01794ae65f | ||
|
|
5a051824c0 | ||
|
|
d1a5b79bc3 | ||
|
|
c9e70fb0c6 | ||
|
|
f392a00138 | ||
|
|
d747896354 | ||
|
|
a8e4949616 | ||
|
|
e8ec6cc1b1 | ||
|
|
fef69b54fb | ||
|
|
f4a0ff3642 | ||
|
|
5112b33af2 | ||
|
|
2e24b0c53b | ||
|
|
f321aba4ac | ||
|
|
7ac117f964 | ||
|
|
9d133eea75 | ||
|
|
5566fd4f32 | ||
|
|
d098857d5a | ||
|
|
24296ca44e | ||
|
|
8e5147976a | ||
|
|
8b097bcd8c | ||
|
|
7fb4b32e8f | ||
|
|
f777c2c9bc | ||
|
|
e413d69d0b | ||
|
|
c8692473a4 | ||
|
|
a84a599f16 | ||
|
|
0dd1a7b309 | ||
|
|
4792eb4aa4 | ||
|
|
5fcf884303 | ||
|
|
930ac3ae18 | ||
|
|
38a24bf4ce | ||
|
|
52ad757cf4 | ||
|
|
82d7457168 | ||
|
|
f5c28a19e1 | ||
|
|
9735c332ff | ||
|
|
2de1f375fa | ||
|
|
42c2692d28 | ||
|
|
dceb2dd671 | ||
|
|
9001416343 | ||
|
|
5254cef980 | ||
|
|
59ebb15fe9 | ||
|
|
e6addecd8f | ||
|
|
2029aa31d3 | ||
|
|
8b3f473b60 | ||
|
|
723d28e549 | ||
|
|
fae63d04e0 | ||
|
|
abb6bee44d | ||
|
|
faa9932c77 | ||
|
|
95611d2c12 | ||
|
|
25c767c79e | ||
|
|
771909eddb | ||
|
|
631fcb0ad2 | ||
|
|
df7b617881 | ||
|
|
bccdd60889 | ||
|
|
e47728e0e4 | ||
|
|
61a79a36f8 | ||
|
|
49165a09c3 | ||
|
|
ef6313fbb4 | ||
|
|
1fb8b23d4c | ||
|
|
f6d4c6a5a3 | ||
|
|
0b4c52c032 | ||
|
|
b6cdaa8597 | ||
|
|
1d51507134 | ||
|
|
789a0da176 | ||
|
|
df164d7489 | ||
|
|
6ac69c109c | ||
|
|
b40ed7cb11 | ||
|
|
ee85c04796 | ||
|
|
660a160c8e | ||
|
|
ef090846e2 | ||
|
|
75a7e7ce82 | ||
|
|
bf721d031a | ||
|
|
98ed6a6a29 | ||
|
|
958e8662d9 | ||
|
|
9280d1ff49 | ||
|
|
a3585c1feb | ||
|
|
aae5ca0763 | ||
|
|
d6942353f1 | ||
|
|
2d8dae4723 | ||
|
|
ff944092ac | ||
|
|
fa44eccf6b | ||
|
|
1f9e518535 | ||
|
|
645f4e9a80 | ||
|
|
a05e5d1e86 | ||
|
|
fcaf0a5503 | ||
|
|
1abaf50633 | ||
|
|
00cd9b2ecc | ||
|
|
1312ba537a | ||
|
|
13aca0716a | ||
|
|
a5b8d6381f | ||
|
|
acacc61f1c | ||
|
|
837abe3bb8 | ||
|
|
eb40efefd1 | ||
|
|
e7625d48f6 | ||
|
|
b3aeb53763 | ||
|
|
12a56e37ba | ||
|
|
1b6da01734 | ||
|
|
34d875ca57 | ||
|
|
7b684aee0c | ||
|
|
4078443265 | ||
|
|
acb8afaeb7 | ||
|
|
fbce9c0ecf | ||
|
|
2bb134e7f5 | ||
|
|
547ed4c672 | ||
|
|
8e9d73fb5b | ||
|
|
052adc10b5 | ||
|
|
b2d417d7ef | ||
|
|
8543c7b9ff | ||
|
|
b6930415ce | ||
|
|
ebf6deeed2 | ||
|
|
ea86359c41 | ||
|
|
72014c59be | ||
|
|
2b709c6973 | ||
|
|
3ee0789ef7 | ||
|
|
b7d2159d60 | ||
|
|
95c979de98 | ||
|
|
164de5faa5 | ||
|
|
5474a5e0c7 | ||
|
|
9235b5a861 | ||
|
|
3a77b8ee64 | ||
|
|
116f1d7d92 | ||
|
|
3c123a064b | ||
|
|
d4f29805c3 | ||
|
|
0d6d755788 | ||
|
|
29ff95cccc | ||
|
|
20c437277c | ||
|
|
ea959d5994 | ||
|
|
813fdf4aad | ||
|
|
ab1ceff242 | ||
|
|
2e3d0e50ec | ||
|
|
4a5a73597c | ||
|
|
bf1ab7f420 | ||
|
|
53e25ff247 | ||
|
|
48015aa36d | ||
|
|
01becf00f5 | ||
|
|
baa034230f | ||
|
|
6206b1d073 | ||
|
|
4f58deac1f | ||
|
|
97a60834a1 | ||
|
|
0e2938d7b3 | ||
|
|
b0bbe48220 | ||
|
|
8b25d4f710 | ||
|
|
34eb6322c0 | ||
|
|
45d1ec8825 | ||
|
|
e37a8dc8a1 | ||
|
|
f020995ac4 | ||
|
|
0e0c1cfad3 | ||
|
|
79d56bdb0e | ||
|
|
3b70faee24 | ||
|
|
0d5e80cc51 | ||
|
|
f899c75d0c | ||
|
|
5266d1bc11 | ||
|
|
3acc6ee5c9 | ||
|
|
2c0b47a1e9 | ||
|
|
ea0ce23ac7 | ||
|
|
d644a73595 | ||
|
|
c3c9b63326 | ||
|
|
b10ec4db37 | ||
|
|
5d555e044d | ||
|
|
f9be0bfb2e | ||
|
|
0a0aa1c591 | ||
|
|
af2921d0c4 | ||
|
|
4beeba6cf6 | ||
|
|
0c742e5424 | ||
|
|
a5a4c167e8 | ||
|
|
9e11c70416 | ||
|
|
ffacf30722 | ||
|
|
5a3b9ae454 | ||
|
|
717495c4e0 | ||
|
|
714570443d | ||
|
|
c691b248a2 | ||
|
|
a4f541adad | ||
|
|
588030141b | ||
|
|
09b17f77c2 | ||
|
|
62d4bb2144 | ||
|
|
2dc26b4c5d | ||
|
|
ad04e8bee8 | ||
|
|
b87f1f7713 | ||
|
|
6a9c053536 | ||
|
|
e56206241b | ||
|
|
d4e1f1af7a | ||
|
|
c2d14392b2 | ||
|
|
223d8a87ca | ||
|
|
070cc77e0f | ||
|
|
878190ba27 | ||
|
|
3391689d29 | ||
|
|
5d2d8ccc71 | ||
|
|
257611f1b4 | ||
|
|
2e60037d9f | ||
|
|
f7e88855fe | ||
|
|
c727e774c4 | ||
|
|
1b501f6582 | ||
|
|
88ed193725 | ||
|
|
77b317b3cf | ||
|
|
c953791cd0 | ||
|
|
8b598e5565 | ||
|
|
f9551ddff5 | ||
|
|
20dc7068af | ||
|
|
8766fcd089 | ||
|
|
df1ff65796 | ||
|
|
1a6efb3a1c | ||
|
|
674b8c3561 | ||
|
|
3b123ce5c1 | ||
|
|
27f1c5476b | ||
|
|
55da52debd | ||
|
|
47fbe1f600 | ||
|
|
bf12815473 | ||
|
|
b3f2857c20 | ||
|
|
fc12d62d4b | ||
|
|
7c94437177 | ||
|
|
ec2af993da | ||
|
|
ad95ca4e86 | ||
|
|
4872992ba2 | ||
|
|
2b069fce75 | ||
|
|
0f4757c289 | ||
|
|
755ad22489 | ||
|
|
1c1ebfa784 | ||
|
|
d982163911 | ||
|
|
21f11f02a4 | ||
|
|
39e16a18e2 | ||
|
|
32c958e2f2 | ||
|
|
f6dc8a946e | ||
|
|
af4cd46721 | ||
|
|
b3147af553 | ||
|
|
a11dcf0ee7 | ||
|
|
bb4bd0cd2d | ||
|
|
dc9751d5a5 | ||
|
|
db30c24b9f | ||
|
|
bbbb4c7861 | ||
|
|
4f1a18b620 | ||
|
|
a6edf66109 | ||
|
|
d0080b4ba8 | ||
|
|
d395fdcc6a | ||
|
|
0cb35ad216 | ||
|
|
7b9de1dbf2 | ||
|
|
745f43a959 | ||
|
|
8a5b96313a | ||
|
|
01f9e48b79 | ||
|
|
2f51f6efd6 | ||
|
|
9a90336238 | ||
|
|
a64b1c4b51 | ||
|
|
8e2529f068 | ||
|
|
3cec252729 | ||
|
|
9d0a6ef96d | ||
|
|
a87cc41914 | ||
|
|
76f21abcdc | ||
|
|
994d4aa63f | ||
|
|
678904dcfb | ||
|
|
18d898cc1f | ||
|
|
86ced4cdad | ||
|
|
aea2b1ebc9 | ||
|
|
52d1f3baa6 | ||
|
|
585d28692d | ||
|
|
6aff7460fe | ||
|
|
1ec9763566 | ||
|
|
07b6cf9309 | ||
|
|
39e80fb404 | ||
|
|
029d85c39b | ||
|
|
9d4f3a96ee | ||
|
|
0f6e614223 | ||
|
|
50baa09f5e | ||
|
|
4c877f118d | ||
|
|
a50db80510 | ||
|
|
dd01a398b6 | ||
|
|
5849621db3 | ||
|
|
369ae5f333 | ||
|
|
54d73b320a | ||
|
|
04876690f7 | ||
|
|
0571de8a21 | ||
|
|
001a4908d2 | ||
|
|
e79bc5dc1b | ||
|
|
a0f800e0be | ||
|
|
8dca2502cd | ||
|
|
41ac8d4e01 | ||
|
|
a51c0744e6 | ||
|
|
a929331160 | ||
|
|
e83c141599 | ||
|
|
6161495058 | ||
|
|
790aba72db | ||
|
|
157cae29ff | ||
|
|
3b26f53bb6 | ||
|
|
fdb7a781e0 | ||
|
|
e55ceef905 | ||
|
|
dee0258f44 | ||
|
|
ec83f792ad | ||
|
|
dee7a13409 | ||
|
|
758723256e | ||
|
|
a0494c4e05 | ||
|
|
1eca8e2ceb | ||
|
|
ae6d4501c0 | ||
|
|
5c55fb83d6 | ||
|
|
b00fb0e96a | ||
|
|
dd51cccd7c | ||
|
|
2892a31dea | ||
|
|
489282e047 | ||
|
|
5030410dd6 | ||
|
|
a03a738317 | ||
|
|
c421c0b1bf | ||
|
|
bfdffc653e | ||
|
|
1e76ef7a24 | ||
|
|
8630d0319d | ||
|
|
a74ac336e5 | ||
|
|
31260be907 | ||
|
|
4a0dc06038 | ||
|
|
10f178e429 | ||
|
|
6b359df6c6 | ||
|
|
d532fe3482 | ||
|
|
87c193df1a | ||
|
|
acfe095710 | ||
|
|
8bac9efd4c | ||
|
|
f22c02ecc6 | ||
|
|
2411d5286b | ||
|
|
bf0b2ea101 | ||
|
|
e1e364f7c7 | ||
|
|
42a3668efa | ||
|
|
c899469168 | ||
|
|
d2fd997d77 | ||
|
|
3eb550a15c | ||
|
|
3fad360f5f | ||
|
|
c06088dcab | ||
|
|
69758f32dc | ||
|
|
a1c0a05804 | ||
|
|
55652e5b04 | ||
|
|
7e81671c39 | ||
|
|
a476da0230 | ||
|
|
9f4ce2dcf2 | ||
|
|
7640f2768d | ||
|
|
e96d773f04 | ||
|
|
cd96cf9cd7 | ||
|
|
2ed598b09d | ||
|
|
d3df768f16 | ||
|
|
814255bfd0 | ||
|
|
2cc6f36b68 | ||
|
|
a6409ee82d | ||
|
|
c58b848cef | ||
|
|
4966148432 | ||
|
|
90140f6361 | ||
|
|
1391706573 | ||
|
|
cec8a77d52 | ||
|
|
0fa6aab5f5 | ||
|
|
b96fa43376 | ||
|
|
9da9310f4b | ||
|
|
b0e4a9b08b | ||
|
|
99150b9b49 | ||
|
|
03de7f9901 | ||
|
|
68fd1f0fad | ||
|
|
1460bfd1fc | ||
|
|
d0c503d6c8 | ||
|
|
8ab82b7ed7 | ||
|
|
2d360eab74 | ||
|
|
8add007cf3 | ||
|
|
3c0e8757c9 | ||
|
|
c773fcb946 | ||
|
|
2aaed5d4c3 | ||
|
|
0022834af4 | ||
|
|
9aad7042a2 | ||
|
|
9aa8b32df8 | ||
|
|
4f32be9766 | ||
|
|
25ef0913bb | ||
|
|
a5ed5be3cf | ||
|
|
697c7f9fe9 | ||
|
|
f7c2603d7c | ||
|
|
a28691f14d | ||
|
|
ca9823b35e | ||
|
|
91c037e578 | ||
|
|
5fe0af2500 | ||
|
|
6d7492d92a | ||
|
|
cf150fc575 | ||
|
|
a2c84e7702 | ||
|
|
7a9a5e8dc3 | ||
|
|
e9c6c2ed3f | ||
|
|
9da35a7980 | ||
|
|
f01f56626a | ||
|
|
09485f4b9d | ||
|
|
5a30b02be4 | ||
|
|
21eb8b9100 | ||
|
|
a0c205e4c9 | ||
|
|
40d7df793d | ||
|
|
71610ce24d | ||
|
|
41adcdc898 | ||
|
|
e98346e7cd | ||
|
|
0802aaae91 | ||
|
|
cf0b2816c1 | ||
|
|
7418815637 | ||
|
|
d71e84b790 | ||
|
|
aa388f1173 | ||
|
|
7a3df1c7d6 | ||
|
|
59bedae15e | ||
|
|
a127077bde | ||
|
|
49be03e845 | ||
|
|
e3d807b053 | ||
|
|
e5c0af478d | ||
|
|
82cd88cf25 | ||
|
|
e94e712d49 | ||
|
|
021d6c5908 | ||
|
|
b09f0618a9 | ||
|
|
ea17711616 | ||
|
|
e0b4875615 | ||
|
|
bbfd1448c5 | ||
|
|
d482d3c907 | ||
|
|
3236f72031 | ||
|
|
67ba81e80a | ||
|
|
8c895cd435 | ||
|
|
99b5695fec | ||
|
|
05f9cf453d | ||
|
|
3d7a74cc2b | ||
|
|
f7f9d8bfc3 | ||
|
|
ff95952969 | ||
|
|
373c587ef8 | ||
|
|
ca024673b9 | ||
|
|
ef7d8a6d94 | ||
|
|
0cc8027fd9 | ||
|
|
9e085511fd | ||
|
|
344184f239 | ||
|
|
ad41229bb6 | ||
|
|
bb5e78f723 | ||
|
|
2f473912ac | ||
|
|
62a49af23f | ||
|
|
751a1dc543 | ||
|
|
8b97e2ceab | ||
|
|
d01d67c2b0 | ||
|
|
4274c7287a | ||
|
|
2830b6caf4 | ||
|
|
baf3df5736 | ||
|
|
7527bdd2c7 | ||
|
|
7965011be9 | ||
|
|
6c6819f27c | ||
|
|
f7bdc9339c | ||
|
|
7b43ec757c | ||
|
|
8cd37d28da | ||
|
|
b6d70f4434 | ||
|
|
fc4e1485ad | ||
|
|
76833d478b | ||
|
|
b35903bb19 | ||
|
|
ff45dc6430 | ||
|
|
b1c48ed346 | ||
|
|
5a549519a6 | ||
|
|
0e580635eb | ||
|
|
60d3076038 | ||
|
|
0c428efea0 | ||
|
|
19f1489c92 | ||
|
|
b406da8755 | ||
|
|
e9fa1dd3a9 | ||
|
|
87c006da2c | ||
|
|
15a8560f9a | ||
|
|
0daf7c9af7 | ||
|
|
17983c47d8 | ||
|
|
6e0145eeea | ||
|
|
df155293b1 | ||
|
|
6ca0b3ad03 | ||
|
|
9111370349 | ||
|
|
868ec82997 | ||
|
|
c2038a5ccc | ||
|
|
cb628d0799 | ||
|
|
7c4f67b1a1 | ||
|
|
a82f9d5266 | ||
|
|
b6493a2f82 | ||
|
|
74c81d6921 | ||
|
|
02eb8a284c | ||
|
|
bf2d792d94 | ||
|
|
10294ab240 | ||
|
|
88ff92a658 | ||
|
|
8d9987a6b5 | ||
|
|
6ba471421f | ||
|
|
5310b4c14b | ||
|
|
e47fae034a | ||
|
|
d0a35f378b | ||
|
|
2648fe066e | ||
|
|
69567f9806 | ||
|
|
0007e669fb | ||
|
|
7247e97ff0 | ||
|
|
045b0b9889 | ||
|
|
844dbcf740 | ||
|
|
10671aa06e | ||
|
|
373f850002 | ||
|
|
ac34ca11df | ||
|
|
710e295b44 | ||
|
|
22a1a7343b | ||
|
|
c3b05cb34e | ||
|
|
b5c27ca074 | ||
|
|
704a599811 | ||
|
|
1dfaf70562 | ||
|
|
dc92b126c7 | ||
|
|
c6f70cb72c | ||
|
|
f701e2601a | ||
|
|
8cb8890ab3 | ||
|
|
a7a5679bfa | ||
|
|
03587abff1 | ||
|
|
496a5baffd | ||
|
|
8996b6b429 | ||
|
|
d483fb0605 | ||
|
|
c2ec5f39ab | ||
|
|
58f927538f | ||
|
|
d9434c7af5 | ||
|
|
6f54ff9e7f | ||
|
|
9eaba3d3f5 | ||
|
|
4805858ecb | ||
|
|
092ae7ef2f | ||
|
|
bbb128b672 | ||
|
|
15b8d410c0 | ||
|
|
8298e73205 | ||
|
|
819e6d9219 | ||
|
|
d2c87a0331 | ||
|
|
286c5e8895 | ||
|
|
7df77d7e5d | ||
|
|
c7c271fb01 | ||
|
|
6804a00af0 | ||
|
|
81c75eb14b | ||
|
|
e604dfe9e8 | ||
|
|
135a5d38ff | ||
|
|
07ed2e8d0a | ||
|
|
2a594414e7 | ||
|
|
d3496c0cb9 | ||
|
|
c15151a0af | ||
|
|
6d1640194e | ||
|
|
06740e5480 | ||
|
|
c338e491fe | ||
|
|
a570ee53a8 | ||
|
|
417a31f1fe | ||
|
|
a4a6f070e4 | ||
|
|
d287abcd68 | ||
|
|
79fd38a899 | ||
|
|
0aa0773ef7 | ||
|
|
154e8bdb50 | ||
|
|
8f37c22917 | ||
|
|
0aeef3187a | ||
|
|
8903eebe17 | ||
|
|
cc4d0af713 | ||
|
|
4a217d9e9f | ||
|
|
122caf7a95 | ||
|
|
a1e5c72eb9 | ||
|
|
7dd163ac85 | ||
|
|
01432d3848 | ||
|
|
d3cae13552 | ||
|
|
061838bdab | ||
|
|
24846a1d64 | ||
|
|
0b31d32793 | ||
|
|
71403980cc | ||
|
|
f8ab754af4 | ||
|
|
fd3ed9e119 | ||
|
|
b53c86c5f4 | ||
|
|
cbe6d31ee3 | ||
|
|
5810221181 | ||
|
|
e9f4594eb9 | ||
|
|
2f991d190f | ||
|
|
ae90b9877a | ||
|
|
786c2a1fd7 | ||
|
|
eef4f7c4cf | ||
|
|
36cc5de0e7 | ||
|
|
ade0f34c6f | ||
|
|
854798f470 | ||
|
|
ca305399c3 | ||
|
|
00a8d44ce1 | ||
|
|
79c7f331c9 | ||
|
|
409c48efcb | ||
|
|
29f3ff155a | ||
|
|
6c1deb41be | ||
|
|
4574415e97 | ||
|
|
f05646c5a1 | ||
|
|
a6f8f707f3 | ||
|
|
e19dbe4f3b | ||
|
|
d393cd67f7 | ||
|
|
c80f5ddcd1 | ||
|
|
a02009d31f | ||
|
|
a4ed1afeb5 | ||
|
|
1fea7c022e | ||
|
|
e7f5aee9fb | ||
|
|
d3805f7545 | ||
|
|
70891f41a5 | ||
|
|
cebba5bfa3 | ||
|
|
0f5c62d3cc | ||
|
|
f9fa338960 | ||
|
|
18daa186b0 | ||
|
|
ad7ac26ff3 | ||
|
|
10efaaa078 | ||
|
|
bb353b940e | ||
|
|
9732d10f24 | ||
|
|
9b80aa76ce | ||
|
|
bc935012da | ||
|
|
e4025f1aff | ||
|
|
03dcc97ce9 | ||
|
|
e2b55315a6 | ||
|
|
1f8b0f2135 | ||
|
|
a9a45dc32b | ||
|
|
f7138c0516 | ||
|
|
d080a204a3 | ||
|
|
fd31d58128 | ||
|
|
a478f02c5b | ||
|
|
ffc0d3cda0 | ||
|
|
c68770c0aa | ||
|
|
ab1f68df93 | ||
|
|
b7622d8551 | ||
|
|
c470e2dcfb | ||
|
|
fe11ae73db | ||
|
|
70fe4f67ee | ||
|
|
6abd1de8b8 | ||
|
|
16b150039a | ||
|
|
ca1dec8e13 | ||
|
|
f81d3bc903 | ||
|
|
88132067ad | ||
|
|
f5eff7d349 | ||
|
|
5f35b9903d | ||
|
|
221f75542a | ||
|
|
d0fcf3c952 | ||
|
|
62f664c592 | ||
|
|
deaeb1a715 | ||
|
|
c1dfbd6993 | ||
|
|
2854c0969b | ||
|
|
1de5e61888 | ||
|
|
47493fa7d9 | ||
|
|
ecfafc613f | ||
|
|
a7ea51fc3e | ||
|
|
35147c6514 | ||
|
|
2518976326 | ||
|
|
40cb46de46 | ||
|
|
bb907d49c9 | ||
|
|
231ca253f2 | ||
|
|
9d33255850 | ||
|
|
c5d6fc387c | ||
|
|
4a03e6d307 | ||
|
|
dbd4d5e779 | ||
|
|
2a80d33a89 | ||
|
|
2202ff1ccd | ||
|
|
a138a9c6ec | ||
|
|
3d8d66547f | ||
|
|
17e84bf815 | ||
|
|
41540842eb | ||
|
|
65cc3000ee | ||
|
|
1fc8592ef6 | ||
|
|
4afb5caa4e | ||
|
|
ee137ce44c | ||
|
|
9830ab3aad | ||
|
|
005e4aa1bd | ||
|
|
de7d3ba701 | ||
|
|
05884ba279 | ||
|
|
a0e067510c | ||
|
|
2784d1b31c | ||
|
|
8e9d7d97f6 | ||
|
|
f483fd3916 | ||
|
|
4e65b5f73b | ||
|
|
0d7093fe76 | ||
|
|
47ade14e07 | ||
|
|
5ad9d2094a | ||
|
|
848bd8f553 | ||
|
|
74f2266d89 | ||
|
|
03323bc294 | ||
|
|
df1eb9f5cb | ||
|
|
aaa9c82758 | ||
|
|
ba51c0721e | ||
|
|
845b40d815 | ||
|
|
69adab2c9f | ||
|
|
80f0964342 | ||
|
|
56372b6a5f | ||
|
|
af4d3da7a8 | ||
|
|
eed9c56c51 | ||
|
|
ae1971f5d2 | ||
|
|
5c184e501d | ||
|
|
3488f04dd4 | ||
|
|
92db2b85f3 | ||
|
|
060a7807f0 | ||
|
|
52954982a3 | ||
|
|
dec60a9c85 | ||
|
|
39b5e4b1e3 | ||
|
|
d836ad8dbc | ||
|
|
d035efb14e | ||
|
|
401c85ad5b | ||
|
|
54c46df0dc | ||
|
|
a5fb33de02 | ||
|
|
4c2dace4ca | ||
|
|
b09aa2cff3 | ||
|
|
e277d02f83 | ||
|
|
f31ccaacef | ||
|
|
d4576dcf9f | ||
|
|
4e6f48df03 | ||
|
|
218da8a18a | ||
|
|
e28180f3d5 | ||
|
|
bccccb2758 | ||
|
|
46587450cb | ||
|
|
f17712fab3 | ||
|
|
c5ee92f4c3 | ||
|
|
24f292f360 | ||
|
|
4f5b61b798 | ||
|
|
a9e98e6711 | ||
|
|
3286acd306 | ||
|
|
085dcfe7bc | ||
|
|
b6d5f350e4 | ||
|
|
4d3df8b86b | ||
|
|
a356264801 | ||
|
|
d32dbb6d10 | ||
|
|
70319e4939 | ||
|
|
92b2980b41 | ||
|
|
eabcc9261d | ||
|
|
ad5be455bb | ||
|
|
20ce990763 | ||
|
|
30f0a7932b | ||
|
|
33d248d1e4 | ||
|
|
f69869ac1e | ||
|
|
d256194255 | ||
|
|
4de63e612d | ||
|
|
7f50acd886 | ||
|
|
18f8ea8519 | ||
|
|
0a4e3379f9 | ||
|
|
e355753900 | ||
|
|
712d020dfa | ||
|
|
5fc53f19f4 | ||
|
|
957fde964b | ||
|
|
b9688acdf5 | ||
|
|
2a8c7b260a | ||
|
|
a2c7ef5424 | ||
|
|
a1a417329c | ||
|
|
1f81ed306d | ||
|
|
2d78bc95ec | ||
|
|
4f720e9c3b | ||
|
|
0374c91ee7 | ||
|
|
894ad32e83 | ||
|
|
f3ee639dcc | ||
|
|
74a2b5a958 | ||
|
|
aac40c8c58 | ||
|
|
4e4906605b | ||
|
|
894e31fe73 | ||
|
|
67a762aeaf | ||
|
|
28f1140588 | ||
|
|
ac81080185 | ||
|
|
bc8323f96b | ||
|
|
a38661c0f0 | ||
|
|
57cdd26d4d | ||
|
|
582b67c42e | ||
|
|
44791a65b8 | ||
|
|
f3214b7891 | ||
|
|
81dfe506ac | ||
|
|
2356524d1c | ||
|
|
a371bede4d | ||
|
|
1f34d2d644 | ||
|
|
2166213400 | ||
|
|
c4f6158f46 | ||
|
|
7e33ea351d | ||
|
|
9e916cdd5c | ||
|
|
b7843a5d46 | ||
|
|
41e03333a7 | ||
|
|
c57c653535 | ||
|
|
8793ad9f4f | ||
|
|
07b56426ad | ||
|
|
43f9f2a0f2 | ||
|
|
d01824f711 | ||
|
|
841c8fd41d | ||
|
|
4041f3db5c | ||
|
|
91304e70a1 | ||
|
|
27c23058dc | ||
|
|
c511902356 | ||
|
|
8d7cec2a94 | ||
|
|
2b037ee146 | ||
|
|
23569705b4 | ||
|
|
c6da122e41 | ||
|
|
67e9606d55 | ||
|
|
1b8f1f5610 | ||
|
|
4c6bb8846b | ||
|
|
11a1915e61 | ||
|
|
e58ac74aa2 | ||
|
|
2b18aa7d79 | ||
|
|
0f9c8235e1 | ||
|
|
8b0ae88987 | ||
|
|
d8aaae6d42 | ||
|
|
ce4c71ccfb | ||
|
|
5ef141913b | ||
|
|
d27db5a1c7 | ||
|
|
c2bd6e6da1 | ||
|
|
d6406b48fd | ||
|
|
d5b42d99f2 | ||
|
|
42bac1620e | ||
|
|
09130582ad | ||
|
|
73239f5535 | ||
|
|
22abe5a815 | ||
|
|
736450e184 | ||
|
|
d10fda36af | ||
|
|
8639b2858b | ||
|
|
f47a9f93a5 | ||
|
|
52bbd8c764 | ||
|
|
8ef2eec504 | ||
|
|
1c5f16c332 | ||
|
|
588369d297 | ||
|
|
e23195fd86 | ||
|
|
1b0cafd956 | ||
|
|
81a624146b | ||
|
|
9c8ef4240c | ||
|
|
b59edf2690 | ||
|
|
daa3e1351b | ||
|
|
d00ca02c25 | ||
|
|
207106ea46 | ||
|
|
c150d97eaf | ||
|
|
6231cf3496 | ||
|
|
57999b460b | ||
|
|
e2bad5bdc8 | ||
|
|
5170635a1f | ||
|
|
1db5c64f3e | ||
|
|
9e4aa50567 | ||
|
|
2b91595aa9 | ||
|
|
2209059e84 | ||
|
|
b335da75db | ||
|
|
7cfda97b82 | ||
|
|
01f4e9b2a5 | ||
|
|
2bef30635c | ||
|
|
447c133d82 | ||
|
|
fbe6595b19 | ||
|
|
86b738dd79 | ||
|
|
b30fd9d3bf | ||
|
|
e54865b7ec | ||
|
|
2041b77b39 | ||
|
|
f7f21a006e | ||
|
|
51459ba2e2 | ||
|
|
a76908e2fd | ||
|
|
f79da66c36 | ||
|
|
8a64b47644 | ||
|
|
9a0690fb95 | ||
|
|
cdcdab82eb | ||
|
|
32ea24f8ce | ||
|
|
656d0e0ff4 | ||
|
|
49523ba8d1 | ||
|
|
a3b1b1ec60 | ||
|
|
dd8ed7cc77 | ||
|
|
0b09432b7e | ||
|
|
2ba60a7893 | ||
|
|
2a0cc21dfe | ||
|
|
472e55cea5 | ||
|
|
b579285f23 | ||
|
|
c46963807e | ||
|
|
1a73284b0c | ||
|
|
37e848eee9 | ||
|
|
8a167d2743 | ||
|
|
0ab6d81abb | ||
|
|
1d00254d6c | ||
|
|
2e1392ccf8 | ||
|
|
970c3dc6de | ||
|
|
fce68e491a | ||
|
|
2a4b322ec1 | ||
|
|
95018efa52 | ||
|
|
f31f16cd0d | ||
|
|
5df085848b | ||
|
|
8c82ce0c21 | ||
|
|
1d50eb0d7f | ||
|
|
789ec0baef | ||
|
|
30d7ee892e | ||
|
|
3a3f3f664a | ||
|
|
488eadc63e | ||
|
|
6de1f3e593 | ||
|
|
dcaea6d78f | ||
|
|
65e690bad7 | ||
|
|
9ea31042db | ||
|
|
675d617dbc | ||
|
|
a79e9b4fd6 | ||
|
|
f39e3f385c | ||
|
|
ad9f786646 | ||
|
|
8f6226d410 | ||
|
|
8a18488b1e | ||
|
|
53b179b22b | ||
|
|
dcde74bc09 | ||
|
|
86a6f1e932 | ||
|
|
10ed13acc0 | ||
|
|
ccf52d3bff | ||
|
|
b05a8b6dd3 | ||
|
|
1b32e9a475 | ||
|
|
d3f94a4847 | ||
|
|
764797e211 | ||
|
|
31c4cf968b | ||
|
|
6e0aeeea83 | ||
|
|
88745a9f36 | ||
|
|
3bcd8529fa | ||
|
|
8bd832b449 | ||
|
|
5d2bf37ac9 | ||
|
|
f248da3e08 | ||
|
|
8e5b67d7c9 | ||
|
|
f5a257ca79 | ||
|
|
ed90c491e2 | ||
|
|
ea00df0466 | ||
|
|
96b624e941 | ||
|
|
25c0656106 | ||
|
|
b361241c29 | ||
|
|
5b32ecb719 | ||
|
|
d8c126f320 | ||
|
|
6cd979d8d3 | ||
|
|
c6c2a77c3a | ||
|
|
0458aec320 | ||
|
|
b2ae1926a6 | ||
|
|
1ee4a7ec63 | ||
|
|
7e03b25030 | ||
|
|
c68623ddb0 | ||
|
|
847df2f75b | ||
|
|
73be5005c2 | ||
|
|
c36b42af71 | ||
|
|
db3ffd29da | ||
|
|
d7ebd88804 | ||
|
|
75e9489db5 | ||
|
|
a94f5dd692 | ||
|
|
0de36d331f | ||
|
|
de713c564f | ||
|
|
7e3cb3ba31 | ||
|
|
6ada5e5b26 | ||
|
|
aee6b28469 | ||
|
|
c08f31aa76 | ||
|
|
768e206c4a | ||
|
|
84fbee085d | ||
|
|
3126bf6561 | ||
|
|
e193b65bc7 | ||
|
|
fb43e49954 | ||
|
|
41575382ce | ||
|
|
62653d39b3 | ||
|
|
79cf34b72e | ||
|
|
5b3a462247 | ||
|
|
ee6fc5859c | ||
|
|
f13bf59a82 | ||
|
|
f9868b6100 | ||
|
|
f9e7af6e90 | ||
|
|
9030435ba4 | ||
|
|
47cfe7a877 | ||
|
|
a182174fba | ||
|
|
ef91fce621 | ||
|
|
7d47aebfc5 | ||
|
|
b805dbf4b9 | ||
|
|
3847388ed0 | ||
|
|
d6ff9a0297 | ||
|
|
9fa5f16ca0 | ||
|
|
5d7fb0e388 | ||
|
|
9dd37ac9e2 | ||
|
|
32c66e9d1a | ||
|
|
ef341d4333 | ||
|
|
79bc81317d | ||
|
|
33a2e068f6 | ||
|
|
9a3e98ac8f | ||
|
|
e03248929d | ||
|
|
1ed2935eb6 | ||
|
|
50e35de609 | ||
|
|
17180d31d7 | ||
|
|
65f101e7bb | ||
|
|
58de839621 | ||
|
|
787252ef81 | ||
|
|
b80180df22 | ||
|
|
e0bb6183a6 | ||
|
|
20dd2c0b58 | ||
|
|
8a4a6b2023 | ||
|
|
ca2533cafa | ||
|
|
fb7a8b7696 | ||
|
|
3c6d87b52b | ||
|
|
a4b58f4d83 | ||
|
|
ddbac1ad9f | ||
|
|
07772ef5a2 | ||
|
|
57c79c7133 | ||
|
|
05e0e842d6 | ||
|
|
93ea9d7c36 | ||
|
|
b6fa68370b | ||
|
|
bd3eedbda9 | ||
|
|
581c95d093 | ||
|
|
cd9821f87e | ||
|
|
10881587e9 | ||
|
|
5f6b60370d | ||
|
|
1bfe4513ac | ||
|
|
b97ae0246d | ||
|
|
8bc0188c53 | ||
|
|
66ca9a355b | ||
|
|
ec62b5f03c | ||
|
|
3467ca5230 | ||
|
|
d5b21021fb | ||
|
|
4656d25590 | ||
|
|
b1f0f33204 | ||
|
|
d353c13bf1 | ||
|
|
8872a6a24a | ||
|
|
8b0de948d0 | ||
|
|
2e7da36af0 | ||
|
|
38c295427a | ||
|
|
2025cc7747 | ||
|
|
e5fd579935 | ||
|
|
3bd97650dc | ||
|
|
1e8bb5e852 | ||
|
|
6722eedf7a | ||
|
|
53dfdbda08 | ||
|
|
e857ab762c | ||
|
|
14f5d2a489 | ||
|
|
07456ee174 | ||
|
|
b128431128 | ||
|
|
d606ad99b7 | ||
|
|
3598df0d28 | ||
|
|
b90017ff15 | ||
|
|
6bfc90bbe1 | ||
|
|
4e6c2fdd1c | ||
|
|
25439702bb | ||
|
|
145fb69bdd | ||
|
|
f759bfb1f6 | ||
|
|
fb87d97d25 | ||
|
|
0a4614247f | ||
|
|
790eeb1a09 | ||
|
|
6640e709f8 | ||
|
|
c4ecf40d1c | ||
|
|
02ab1fded2 | ||
|
|
b2eebeee18 | ||
|
|
f2bd4a4b5c | ||
|
|
ecfefd6b21 | ||
|
|
50e430d8dc | ||
|
|
96cc5154cd | ||
|
|
e9f0f84152 | ||
|
|
7eb14ad12c | ||
|
|
e5641fe71c | ||
|
|
0b3c0f4a77 | ||
|
|
3987621b12 | ||
|
|
be5aa59e39 | ||
|
|
ecc86def9e | ||
|
|
358b676d04 | ||
|
|
fece64039d | ||
|
|
b93f98252b | ||
|
|
9063a96629 | ||
|
|
9b2fa966f1 | ||
|
|
d2e28122b3 | ||
|
|
ebb08a57c8 | ||
|
|
030fc041be | ||
|
|
6e922166e7 | ||
|
|
f94abb5611 | ||
|
|
8f4953c182 | ||
|
|
0771549ef3 | ||
|
|
445a5b4f38 | ||
|
|
c2fccb7e14 | ||
|
|
d3cf60fafb | ||
|
|
6c5c3c3454 | ||
|
|
82a27d7fa3 | ||
|
|
2ea7ad6d7b | ||
|
|
3a30feaa52 | ||
|
|
98c9dd23d5 | ||
|
|
fb0bbf31c4 | ||
|
|
e87c44c38b | ||
|
|
371ea7c078 | ||
|
|
0e00677851 | ||
|
|
7f50fb3023 | ||
|
|
9dc61307fa | ||
|
|
83d9ca080a | ||
|
|
a8a5d9e053 | ||
|
|
d6a226e6bd | ||
|
|
5bab9a7e34 | ||
|
|
81c2bf6814 | ||
|
|
e69f7602ea | ||
|
|
d2e4d3bc1c | ||
|
|
0e2ee5f127 | ||
|
|
dd7ae83226 | ||
|
|
48a16464d5 | ||
|
|
76d4a4f3fe | ||
|
|
8afdbab9d5 | ||
|
|
9235c0dcfa | ||
|
|
ff8f617fc6 | ||
|
|
95b09cde60 | ||
|
|
c26cde2f6f | ||
|
|
181efcfbae | ||
|
|
d291a7cccd | ||
|
|
5c722f31ff | ||
|
|
c56b54eddd | ||
|
|
4d02d28aef | ||
|
|
cb061d80fa | ||
|
|
9b055171ab | ||
|
|
3df214c56e | ||
|
|
d69084f31e | ||
|
|
02a185f2fe | ||
|
|
53f44c5459 | ||
|
|
137665685d | ||
|
|
3d1c2fa5f1 | ||
|
|
6dad8e695e | ||
|
|
1eb82d97ae | ||
|
|
a17a9521b4 | ||
|
|
2dc1c5c618 | ||
|
|
d5a07a446d | ||
|
|
7232c01a80 | ||
|
|
b8f7025f2a | ||
|
|
73e4fcafdc | ||
|
|
45661dd960 | ||
|
|
18ba570c74 | ||
|
|
5923417654 | ||
|
|
8b99a72f2c | ||
|
|
981bd94615 | ||
|
|
083dd4eeec | ||
|
|
8d4d16bde1 | ||
|
|
8e218f12b4 | ||
|
|
3dcf194960 | ||
|
|
ee9f781adc | ||
|
|
e5eb617447 | ||
|
|
864057e8ee | ||
|
|
cb51ad929e | ||
|
|
83c20f5d5d | ||
|
|
ff93ace4cc | ||
|
|
ae3158ff00 | ||
|
|
3bec9c5eb4 | ||
|
|
964a3bc35b | ||
|
|
ed51a8794d | ||
|
|
b8556671c5 | ||
|
|
6b2c8539a3 | ||
|
|
e165c42377 | ||
|
|
845bb3fa09 | ||
|
|
0abaff5aed | ||
|
|
e4837af72e | ||
|
|
82f51fb476 | ||
|
|
f012dd5f31 | ||
|
|
c94d5c1a9a | ||
|
|
9eb449484e | ||
|
|
5aed7a375d | ||
|
|
aa82513c7e | ||
|
|
4107c64ac2 | ||
|
|
a8e578f5b8 | ||
|
|
6d74d5f8b7 | ||
|
|
ff214c48f5 | ||
|
|
a012522e88 | ||
|
|
9036f14e84 | ||
|
|
e450f31588 | ||
|
|
7c15c6847b | ||
|
|
9cb26c8748 | ||
|
|
1396a26b6d | ||
|
|
8d88e3be11 | ||
|
|
c98e977533 | ||
|
|
189e7e628b | ||
|
|
1d43870433 | ||
|
|
33920d72f6 | ||
|
|
4b8985f850 | ||
|
|
0be1d8e854 | ||
|
|
db3db2c49e | ||
|
|
fb2f063f58 | ||
|
|
1853e55431 | ||
|
|
d90cd33541 | ||
|
|
45b62e9866 | ||
|
|
6b509a1222 | ||
|
|
316a1b835f | ||
|
|
ddc20e2a60 | ||
|
|
104a4150ae | ||
|
|
e046a72750 | ||
|
|
df3fb83da3 | ||
|
|
7ee534388b | ||
|
|
c84d279d69 | ||
|
|
21ee1828b3 | ||
|
|
96ef7b4075 | ||
|
|
f14e725d13 | ||
|
|
f1ff09f303 | ||
|
|
c8b26a1002 | ||
|
|
5c341154b7 | ||
|
|
8684fae473 | ||
|
|
7c1eafd050 | ||
|
|
0243ec0096 | ||
|
|
ce36dec767 | ||
|
|
b8d4866824 | ||
|
|
69bb020e5c | ||
|
|
c988f4d093 | ||
|
|
62d48014c9 | ||
|
|
d3cc6f594b | ||
|
|
32dab7a1ba | ||
|
|
a46b718b4a | ||
|
|
d6931252c1 | ||
|
|
aefb782892 | ||
|
|
3d20a64502 | ||
|
|
be34c84704 | ||
|
|
534155fcd5 | ||
|
|
f569fddf15 | ||
|
|
41d6995da4 | ||
|
|
8757c8cae0 | ||
|
|
e899fece3c | ||
|
|
659e71e150 | ||
|
|
a70f3fe622 | ||
|
|
c8a3471135 | ||
|
|
740b221769 | ||
|
|
e455453bcd | ||
|
|
7a2866feb9 | ||
|
|
c631858ab3 | ||
|
|
8dd616462a | ||
|
|
03ee99281f | ||
|
|
fa1e383db1 | ||
|
|
976c818406 | ||
|
|
3ecbfae371 | ||
|
|
5845a1ec7a | ||
|
|
edcf516cef | ||
|
|
8644a5ead9 | ||
|
|
4382e8aaee | ||
|
|
3487960559 | ||
|
|
b7aa0db66d | ||
|
|
7262291dda | ||
|
|
bc835950b3 | ||
|
|
b751c74374 | ||
|
|
ed0cc7a23a | ||
|
|
df5ffb5a6d | ||
|
|
7a75592898 | ||
|
|
4d6dc14156 | ||
|
|
2c54cf9e39 | ||
|
|
1e9e9538b9 | ||
|
|
e739d1b850 | ||
|
|
4081555048 | ||
|
|
992bd15f4a | ||
|
|
c173a67bae | ||
|
|
7f78c75246 | ||
|
|
853661f3bb | ||
|
|
e4a7dc6998 | ||
|
|
7f82cecf6c | ||
|
|
0625669352 | ||
|
|
e77e67db70 | ||
|
|
9c7feb3150 | ||
|
|
d95db207bf | ||
|
|
0296919dfb | ||
|
|
0cbc85f81f | ||
|
|
2c84cb6702 | ||
|
|
b2b0536e08 | ||
|
|
03ff2cebdd | ||
|
|
74f85756a5 | ||
|
|
a204629a9d | ||
|
|
050f04bed7 | ||
|
|
e72422976d | ||
|
|
723d269915 | ||
|
|
0930d7dbea | ||
|
|
1abe5771fd | ||
|
|
6c6178b7d9 | ||
|
|
2d763238d3 | ||
|
|
d34fda26d3 | ||
|
|
78e80cd2b2 | ||
|
|
76728abc86 | ||
|
|
4e1422da6b | ||
|
|
c2ad79f05a | ||
|
|
4a060c6d8b | ||
|
|
265c14d697 | ||
|
|
e36b63f38c | ||
|
|
13cc13924e | ||
|
|
7673d2aa51 | ||
|
|
3667507ee8 | ||
|
|
95f0aaac68 | ||
|
|
ad67096b9a | ||
|
|
69c133e868 | ||
|
|
c34e78cfc4 | ||
|
|
34b3d069f8 | ||
|
|
e3a3dec8a2 | ||
|
|
700515cce3 | ||
|
|
e36d972d94 | ||
|
|
f3a47a2ae5 | ||
|
|
b071c14066 | ||
|
|
90d51cf328 | ||
|
|
5fae676f7c | ||
|
|
4ffbe03f58 | ||
|
|
5ea6a602ca | ||
|
|
41fc17a62a | ||
|
|
6437b490a6 | ||
|
|
0a92bccc4e | ||
|
|
aa47b56a54 | ||
|
|
0d25d33fe5 | ||
|
|
da0d9b5989 | ||
|
|
6c3b226e58 | ||
|
|
8273fba131 | ||
|
|
c99ca372d6 | ||
|
|
324774ec2f | ||
|
|
da25f49cd7 | ||
|
|
967623c784 | ||
|
|
17502349d5 | ||
|
|
4fc0c3603c | ||
|
|
0d483ab5f3 | ||
|
|
2c56baae02 | ||
|
|
177896b4be | ||
|
|
2b526f3ea1 | ||
|
|
154f55fafd | ||
|
|
3c0d0c13a9 | ||
|
|
3d48880240 | ||
|
|
85fca9dee8 | ||
|
|
8d8580a213 | ||
|
|
d2f4bb2dd3 | ||
|
|
351f9b32ea | ||
|
|
38efebb8d3 | ||
|
|
fe3f0be920 | ||
|
|
6785d75ad2 | ||
|
|
78ae1ada3c | ||
|
|
d77ab891a0 | ||
|
|
9fc7435ea2 | ||
|
|
3c3fd7cf2a | ||
|
|
cfed0cbd0d | ||
|
|
c198dd381f | ||
|
|
b9eab9fe29 | ||
|
|
93da078669 | ||
|
|
095130a569 | ||
|
|
738b59fd42 | ||
|
|
c340032bd1 | ||
|
|
de597d4f5d | ||
|
|
854b537695 | ||
|
|
f4816b99ff | ||
|
|
56ae96fc75 | ||
|
|
f8643e9a96 | ||
|
|
a7f0b11002 | ||
|
|
7924a149b4 | ||
|
|
a24c3ada53 | ||
|
|
50271b7123 | ||
|
|
409bb5ff4d | ||
|
|
fa1059e202 | ||
|
|
f8e00e43e3 | ||
|
|
504a575feb | ||
|
|
bd76251fb5 | ||
|
|
65185a5fd0 | ||
|
|
fb358d8fd6 | ||
|
|
5c51797420 | ||
|
|
332a5b49a5 | ||
|
|
1deadf5aad |
4
.babelrc
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"presets": ["react", "es2015", "es2016"],
|
||||
"plugins": ["transform-class-properties", "transform-object-rest-spread", "transform-async-to-bluebird", "transform-runtime", "add-module-exports"]
|
||||
}
|
||||
9
.dockerignore
Normal file
@@ -0,0 +1,9 @@
|
||||
# Exclude a bunch of stuff which can make the build context a larger than it needs to be
|
||||
test/
|
||||
webapp/
|
||||
lib/
|
||||
node_modules/
|
||||
karma-reports/
|
||||
.idea/
|
||||
.tmp/
|
||||
config.json*
|
||||
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
patreon: matrixdotorg
|
||||
liberapay: matrixdotorg
|
||||
2
.github/ISSUE_TEMPLATE.md
vendored
@@ -43,4 +43,4 @@ For the web app:
|
||||
For the desktop app:
|
||||
|
||||
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
|
||||
- **Version**: 0.x.y <!-- check the user settings panel if unsure -->
|
||||
- **Version**: 1.x.y <!-- check the user settings panel if unsure -->
|
||||
|
||||
56
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Please report security issues by email to security@matrix.org -->
|
||||
|
||||
<!-- This is a bug report template. By following the instructions below and
|
||||
filling out the sections with your information, you will help the us to get all
|
||||
the necessary data to fix your issue.
|
||||
|
||||
You can also preview your report before submitting it. You may remove sections
|
||||
that aren't relevant to your particular case.
|
||||
|
||||
Text between <!-- and --> marks will be invisible in the report.
|
||||
-->
|
||||
|
||||
### Description
|
||||
|
||||
Describe here the problem that you are experiencing, or the feature you are requesting.
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
- For bugs, list the steps
|
||||
- that reproduce the bug
|
||||
- using hyphens as bullet points
|
||||
|
||||
Describe how what happens differs from what you expected.
|
||||
|
||||
<!-- Please send us logs for your bug report. They're very important for bugs
|
||||
which are hard to reproduce. To do this, create this issue then go to your
|
||||
account settings and click 'Submit Debug Logs' from the Help & About tab -->
|
||||
Logs being sent: yes/no
|
||||
|
||||
<!-- Include screenshots if possible: you can drag and drop images below. -->
|
||||
|
||||
### Version information
|
||||
|
||||
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
|
||||
|
||||
- **Platform**: web (in-browser) or desktop?
|
||||
|
||||
For the web app:
|
||||
|
||||
- **Browser**: Chrome, Safari, Firefox? which version?
|
||||
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
|
||||
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web?
|
||||
|
||||
For the desktop app:
|
||||
|
||||
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
|
||||
- **Version**: 1.x.y <!-- check the user settings panel if unsure -->
|
||||
20
.github/ISSUE_TEMPLATE/suggestion-or-feature-request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Suggestion or Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: suggestion
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your suggestion related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
58
.github/ISSUE_TEMPLATE/user-interface-or-usability-bug-report.md
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
name: User Interface or Usability Bug report
|
||||
about: Please include screenshots in UI/UX bug reports
|
||||
title: ''
|
||||
labels: bug, ui/ux
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- A picture's worth a thousand words: PLEASE INCLUDE A SCREENSHOT :P -->
|
||||
|
||||
<!-- Please report security issues by email to security@matrix.org -->
|
||||
|
||||
<!-- This is a bug report template. By following the instructions below and
|
||||
filling out the sections with your information, you will help the us to get all
|
||||
the necessary data to fix your issue.
|
||||
|
||||
You can also preview your report before submitting it. You may remove sections
|
||||
that aren't relevant to your particular case.
|
||||
|
||||
Text between <!-- and --> marks will be invisible in the report.
|
||||
-->
|
||||
|
||||
### Description
|
||||
|
||||
Describe here the problem that you are experiencing, or the feature you are requesting.
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
- For bugs, list the steps
|
||||
- that reproduce the bug
|
||||
- using hyphens as bullet points
|
||||
|
||||
Describe how what happens differs from what you expected.
|
||||
|
||||
<!-- Please send us logs for your bug report. They're very important for bugs
|
||||
which are hard to reproduce. To do this, create this issue then go to your
|
||||
account settings and click 'Submit Debug Logs' from the Help & About tab -->
|
||||
Logs being sent: yes/no
|
||||
|
||||
<!-- Include screenshots if possible: you can drag and drop images below. -->
|
||||
|
||||
### Version information
|
||||
|
||||
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
|
||||
|
||||
- **Platform**: web (in-browser) or desktop?
|
||||
|
||||
For the web app:
|
||||
|
||||
- **Browser**: Chrome, Safari, Firefox? which version?
|
||||
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
|
||||
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web?
|
||||
|
||||
For the desktop app:
|
||||
|
||||
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
|
||||
- **Version**: 1.x.y <!-- check the user settings panel if unsure -->
|
||||
10
.gitignore
vendored
@@ -1,19 +1,21 @@
|
||||
/build
|
||||
/cert.pem
|
||||
/dist
|
||||
/karma-reports
|
||||
/key.pem
|
||||
/lib
|
||||
/node_modules
|
||||
/electron_app/node_modules
|
||||
/electron_app/dist
|
||||
/packages/
|
||||
/webapp
|
||||
/.npmrc
|
||||
/*.log
|
||||
package-lock.json
|
||||
.DS_Store
|
||||
npm-debug.log
|
||||
electron/dist
|
||||
electron/pub
|
||||
**/.idea
|
||||
/config.json
|
||||
/config.json.*
|
||||
/config.local*.json
|
||||
/src/component-index.js
|
||||
/.tmp
|
||||
/webpack-stats.json
|
||||
|
||||
@@ -5,12 +5,33 @@
|
||||
"setClasses"
|
||||
],
|
||||
"feature-detects": [
|
||||
"test/css/animations",
|
||||
"test/css/displaytable",
|
||||
"test/css/filters",
|
||||
"test/css/flexbox",
|
||||
"test/es5/specification",
|
||||
"test/css/objectfit",
|
||||
"test/storage/localstorage",
|
||||
"test/workers/webworkers",
|
||||
"test/indexeddb"
|
||||
|
||||
"test/es5/date",
|
||||
"test/es5/function",
|
||||
"test/es5/object",
|
||||
"test/es5/undefined",
|
||||
|
||||
"test/es6/array",
|
||||
"test/es6/collections",
|
||||
"test/es6/promises",
|
||||
"test/es6/string",
|
||||
|
||||
"test/svg",
|
||||
"test/svg/asimg",
|
||||
"test/svg/filters",
|
||||
|
||||
"test/url/parser",
|
||||
"test/url/urlsearchparams",
|
||||
|
||||
"test/cors",
|
||||
"test/iframe/sandbox",
|
||||
"test/json",
|
||||
"test/network/fetch",
|
||||
"test/storage/localstorage"
|
||||
]
|
||||
}
|
||||
|
||||
26
.stylelintrc.js
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copied from react-sdk
|
||||
// TODO: Only keep one copy of this for synchronization purposes
|
||||
module.exports = {
|
||||
"extends": "stylelint-config-standard",
|
||||
"plugins": [
|
||||
"stylelint-scss",
|
||||
],
|
||||
"rules": {
|
||||
"indentation": 4,
|
||||
"comment-empty-line-before": null,
|
||||
"declaration-empty-line-before": null,
|
||||
"length-zero-no-unit": null,
|
||||
"rule-empty-line-before": null,
|
||||
"color-hex-length": null,
|
||||
"max-empty-lines": null,
|
||||
"number-no-trailing-zeros": null,
|
||||
"number-leading-zero": null,
|
||||
"selector-list-comma-newline-after": null,
|
||||
"at-rule-no-unknown": null,
|
||||
"no-descending-specificity": null,
|
||||
"scss/at-rule-no-unknown": [true, {
|
||||
// https://github.com/vector-im/riot-web/issues/10544
|
||||
"ignoreAtRules": ["define-mixin"],
|
||||
}],
|
||||
}
|
||||
};
|
||||
35
.travis.yml
@@ -1,35 +0,0 @@
|
||||
# we need trusty for the chrome addon
|
||||
dist: trusty
|
||||
|
||||
# we don't need sudo, so can run in a container, which makes startup much
|
||||
# quicker.
|
||||
#
|
||||
# unfortunately we do temporarily require sudo as a workaround for
|
||||
# https://github.com/travis-ci/travis-ci/issues/8836
|
||||
sudo: required
|
||||
|
||||
language: node_js
|
||||
node_js:
|
||||
# make sure we work with a range of node versions.
|
||||
# As of the time of writing:
|
||||
# - 4.x is still in LTS (until April 2018), but some of our deps (notably
|
||||
# extract-zip) don't work with it
|
||||
# - 5.x has been EOLed for nearly a year.
|
||||
# - 6.x is the active 'LTS' version
|
||||
# - 7.x is no longer supported
|
||||
# - 8.x is the current 'current' version (until October 2017)
|
||||
#
|
||||
# see: https://github.com/nodejs/LTS/
|
||||
#
|
||||
# anything before 6.3 ships with npm 3.9 or earlier, which had problems
|
||||
# with symlinks in node_modules (see
|
||||
# https://github.com/npm/npm/releases/tag/v3.10.0 'FIXES AND REFACTORING').
|
||||
- 6.3
|
||||
- 6
|
||||
- 7
|
||||
addons:
|
||||
chrome: stable
|
||||
install:
|
||||
# clone the deps with depth 1: we know we will only ever need that one
|
||||
# commit.
|
||||
- scripts/fetch-develop.deps.sh --depth 1 && npm install
|
||||
1864
CHANGELOG.md
@@ -1,4 +1,4 @@
|
||||
Contributing code to Riot
|
||||
=========================
|
||||
|
||||
Riot follows the same pattern as https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst.
|
||||
Riot follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst.
|
||||
|
||||
37
Dockerfile
Normal file
@@ -0,0 +1,37 @@
|
||||
# Builder
|
||||
FROM node:10 as builder
|
||||
|
||||
# Support custom branches of the react-sdk and js-sdk. This also helps us build
|
||||
# images of riot-web develop.
|
||||
ARG USE_CUSTOM_SDKS=false
|
||||
ARG REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git"
|
||||
ARG REACT_SDK_BRANCH="master"
|
||||
ARG JS_SDK_REPO="https://github.com/matrix-org/matrix-js-sdk.git"
|
||||
ARG JS_SDK_BRANCH="master"
|
||||
|
||||
RUN apt-get update && apt-get install -y git dos2unix
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
COPY . /src
|
||||
RUN dos2unix /src/scripts/docker-link-repos.sh && bash /src/scripts/docker-link-repos.sh
|
||||
RUN yarn --network-timeout=100000 install
|
||||
RUN yarn build
|
||||
|
||||
# Copy the config now so that we don't create another layer in the app image
|
||||
RUN cp /src/config.sample.json /src/webapp/config.json
|
||||
|
||||
# Ensure we populate the version file
|
||||
RUN dos2unix /src/scripts/docker-write-version.sh && bash /src/scripts/docker-write-version.sh
|
||||
|
||||
|
||||
# App
|
||||
FROM nginx:alpine
|
||||
|
||||
COPY --from=builder /src/webapp /app
|
||||
|
||||
# Insert wasm type into Nginx mime.types file so they load correctly.
|
||||
RUN sed -i '3i\ \ \ \ application/wasm wasm\;' /etc/nginx/mime.types
|
||||
|
||||
RUN rm -rf /usr/share/nginx/html \
|
||||
&& ln -s /app /usr/share/nginx/html
|
||||
435
README.md
@@ -1,40 +1,62 @@
|
||||
Riot
|
||||
====
|
||||
|
||||
Riot (formerly known as Vector) is a Matrix web client built using the Matrix
|
||||
React SDK (https://github.com/matrix-org/matrix-react-sdk).
|
||||
Riot (formerly known as Vector) is a Matrix web client built using the [Matrix
|
||||
React SDK](https://github.com/matrix-org/matrix-react-sdk).
|
||||
|
||||
Supported Environments
|
||||
======================
|
||||
|
||||
Riot has several tiers of support for different environments:
|
||||
|
||||
* Supported
|
||||
* Definition: Issues **actively triaged**, regressions **block** the release
|
||||
* Last 2 major versions of Chrome, Firefox, and Safari on desktop OSes
|
||||
* Latest release of official Riot Desktop app on desktop OSes
|
||||
* Desktop OSes means macOS, Windows, and Linux versions for desktop devices
|
||||
that are actively supported by the OS vendor and receive security updates
|
||||
* Experimental
|
||||
* Definition: Issues **accepted**, regressions **do not block** the release
|
||||
* Riot as an installed PWA via current stable version of Chrome, Firefox, and Safari
|
||||
* Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS
|
||||
* Not supported
|
||||
* Definition: Issues only affecting unsupported environments are **closed**
|
||||
* Everything else
|
||||
|
||||
For accessing Riot on an Android or iOS device, we currently recommend the
|
||||
native apps [riot-android](https://github.com/vector-im/riot-android)
|
||||
and [riot-ios](https://github.com/vector-im/riot-ios).
|
||||
|
||||
Getting Started
|
||||
===============
|
||||
|
||||
The easiest way to test Riot is to just use the hosted copy at
|
||||
https://riot.im/app. The develop branch is continuously deployed by Jenkins at
|
||||
https://riot.im/develop for those who like living dangerously.
|
||||
The easiest way to test Riot is to just use the hosted copy at https://riot.im/app.
|
||||
The `develop` branch is continuously deployed by Jenkins at https://riot.im/develop
|
||||
for those who like living dangerously.
|
||||
|
||||
To host your own copy of Riot, the quickest bet is to use a pre-built
|
||||
released version of Riot:
|
||||
|
||||
1. Download the latest version from https://github.com/vector-im/riot-web/releases
|
||||
1. Untar the tarball on your web server
|
||||
1. Move (or symlink) the riot-x.x.x directory to an appropriate name
|
||||
1. Move (or symlink) the `riot-x.x.x` directory to an appropriate name
|
||||
1. Configure the correct caching headers in your webserver (see below)
|
||||
1. If desired, copy `config.sample.json` to `config.json` and edit it
|
||||
as desired. See below for details.
|
||||
as desired. See the [configuration docs](docs/config.md) for details.
|
||||
1. Enter the URL into your browser and log into Riot!
|
||||
|
||||
Releases are signed by PGP, and can be checked against the public key
|
||||
at https://riot.im/packages/keys/riot.asc
|
||||
Releases are signed using gpg and the OpenPGP standard, and can be checked against the public key located
|
||||
at https://packages.riot.im/riot-release-key.asc.
|
||||
|
||||
Note that Chrome does not allow microphone or webcam access for sites served
|
||||
over http (except localhost), so for working VoIP you will need to serve Riot
|
||||
over https.
|
||||
Note that for the security of your chats will need to serve Riot
|
||||
over HTTPS. Major browsers also do not allow you to use VoIP/video
|
||||
chats over HTTP, as WebRTC is only usable over HTTPS.
|
||||
There are some exceptions like when using localhost, which is
|
||||
considered a [secure context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts)
|
||||
and thus allowed.
|
||||
|
||||
### Installation Steps for Debian Stretch
|
||||
1. Add the repository to your sources.list using either of the following two options:
|
||||
- Directly to sources.list: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee -a /etc/apt/sources.list`
|
||||
- As a separate entry in sources.list.d: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/riot.list`
|
||||
2. Add the gpg signing key for the riot repository: `curl -s https://riot.im/packages/debian/repo-key.asc | sudo apt-key add -`
|
||||
3. Update your package lists: `sudo apt-get update`
|
||||
4. Install Riot: `sudo apt-get install riot-web`
|
||||
To install Riot as a desktop application, see [Running as a desktop
|
||||
app](#running-as-a-desktop-app) below.
|
||||
|
||||
Important Security Note
|
||||
=======================
|
||||
@@ -52,197 +74,138 @@ https://github.com/vector-im/riot-web/issues/1977 for more details.
|
||||
Building From Source
|
||||
====================
|
||||
|
||||
Riot is a modular webapp built with modern ES6 and requires a npm build system
|
||||
to build.
|
||||
Riot is a modular webapp built with modern ES6 and uses a Node.js build system.
|
||||
Ensure you have the latest LTS version of Node.js installed.
|
||||
|
||||
1. Install or update `node.js` so that your `node` is at least v6.3.0 (and `npm`
|
||||
is at least v3.10.x).
|
||||
Using `yarn` instead of `npm` is recommended. Please see the Yarn [install
|
||||
guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it already.
|
||||
|
||||
1. Install or update `node.js` so that your `node` is at least v10.x.
|
||||
1. Install `yarn` if not present already.
|
||||
1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`.
|
||||
1. Switch to the riot-web directory: `cd riot-web`.
|
||||
1. If you're using the `develop` branch, install the develop versions of the
|
||||
dependencies, as the released ones will be too old:
|
||||
```
|
||||
scripts/fetch-develop.deps.sh
|
||||
```
|
||||
Whenever you git pull on riot-web you will also probably need to force an update
|
||||
to these dependencies - the simplest way is to re-run the script, but you can also
|
||||
manually update and rebuild them:
|
||||
```
|
||||
cd matrix-js-sdk
|
||||
git pull
|
||||
npm install # re-run to pull in any new dependencies
|
||||
# Depending on your version of npm, npm run build may happen as part of
|
||||
# the npm install above (https://docs.npmjs.com/misc/scripts#prepublish-and-prepare)
|
||||
# If in doubt, run it anyway:
|
||||
npm run build
|
||||
cd ../matrix-react-sdk
|
||||
git pull
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
However, we recommend setting up a proper development environment (see "Setting
|
||||
up a dev environment" below) if you want to run your own copy of the
|
||||
`develop` branch, as it makes it much easier to keep these dependencies
|
||||
up-to-date. Or just use https://riot.im/develop - the continuous integration
|
||||
release of the develop branch.
|
||||
(Note that we don't reference the develop versions in git directly due to
|
||||
https://github.com/npm/npm/issues/3055.)
|
||||
1. Install the prerequisites: `npm install`.
|
||||
1. Install the prerequisites: `yarn install`.
|
||||
* If you're using the `develop` branch, then it is recommended to set up a
|
||||
proper development environment (see [Setting up a dev
|
||||
environment](#setting-up-a-dev-environment) below). Alternatively, you
|
||||
can use https://riot.im/develop - the continuous integration release of
|
||||
the develop branch.
|
||||
1. Configure the app by copying `config.sample.json` to `config.json` and
|
||||
modifying it (see below for details).
|
||||
1. `npm run dist` to build a tarball to deploy. Untaring this file will give
|
||||
modifying it. See the [configuration docs](docs/config.md) for details.
|
||||
1. `yarn dist` to build a tarball to deploy. Untaring this file will give
|
||||
a version-specific directory containing all the files that need to go on your
|
||||
web server.
|
||||
|
||||
Note that `npm run dist` is not supported on Windows, so Windows users can run `npm
|
||||
run build`, which will build all the necessary files into the `webapp`
|
||||
directory. The version of Riot will not appear in Settings without
|
||||
using the dist script. You can then mount the `webapp` directory on your
|
||||
webserver to actually serve up the app, which is entirely static content.
|
||||
|
||||
config.json
|
||||
===========
|
||||
|
||||
You can configure the app by copying `config.sample.json` to
|
||||
`config.json` and customising it:
|
||||
|
||||
For a good example, see https://riot.im/develop/config.json
|
||||
|
||||
1. `default_hs_url` is the default homeserver url.
|
||||
1. `default_is_url` is the default identity server url (this is the server used
|
||||
for verifying third party identifiers like email addresses). If this is blank,
|
||||
registering with an email address, adding an email address to your account,
|
||||
or inviting users via email address will not work. Matrix identity servers are
|
||||
very simple web services which map third party identifiers (currently only email
|
||||
addresses) to matrix IDs: see http://matrix.org/docs/spec/identity_service/unstable.html
|
||||
for more details. Currently the only public matrix identity servers are https://matrix.org
|
||||
and https://vector.im. In future identity servers will be decentralised.
|
||||
1. `features`: Lookup of optional features that may be `enable`d, `disable`d, or exposed to the user
|
||||
in the `labs` section of settings. The available optional experimental features vary from
|
||||
release to release.
|
||||
1. `brand`: String to pass to your homeserver when configuring email notifications, to let the
|
||||
homeserver know what email template to use when talking to you.
|
||||
1. `integrations_ui_url`: URL to the web interface for the integrations server. The integrations
|
||||
server is not Riot and normally not your Home Server either. The integration server settings
|
||||
may be left blank to disable integrations.
|
||||
1. `integrations_rest_url`: URL to the REST interface for the integrations server.
|
||||
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
|
||||
1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a
|
||||
https://github.com/matrix-org/rageshake server)
|
||||
1. `roomDirectory`: config for the public room directory. This section is optional.
|
||||
1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop
|
||||
down list. Optional.
|
||||
1. `default_theme`: name of theme to use by default (e.g. 'light')
|
||||
1. `update_base_url` (electron app only): HTTPS URL to a web server to download
|
||||
updates from. This should be the path to the directory containing `macos`
|
||||
and `win32` (for update packages, not installer packages).
|
||||
1. `cross_origin_renderer_url`: URL to a static HTML page hosting code to help display
|
||||
encrypted file attachments. This MUST be hosted on a completely separate domain to
|
||||
anything else since it is used to isolate the privileges of file attachments to this
|
||||
domain. Default: `https://usercontent.riot.im/v1.html`. This needs to contain v1.html from
|
||||
https://github.com/matrix-org/usercontent/blob/master/v1.html
|
||||
1. `piwik`: an object containing the following properties:
|
||||
1. `url`: The URL of the Piwik instance to use for collecting Analytics
|
||||
1. `whitelistedHSUrls`: a list of HS URLs to not redact from the Analytics
|
||||
1. `whitelistedISUrls`: a list of IS URLs to not redact from the Analytics
|
||||
1. `siteId`: The Piwik Site ID to use when sending Analytics to the Piwik server configured above
|
||||
1. `teamServerConfig`, `teamTokenMap`, `referralBaseUrl`: an obsolete precursor to communities
|
||||
with referral tracking; please ignore it.
|
||||
1. `welcomeUserId`: the user ID of a bot to invite whenever users register that can give them a tour
|
||||
|
||||
|
||||
Note that `index.html` also has an og:image meta tag that is set to an image
|
||||
hosted on riot.im. This is the image used if links to your copy of Riot
|
||||
appear in some websites like Facebook, and indeed Riot itself. This has to be
|
||||
static in the HTML and an absolute URL (and HTTP rather than HTTPS), so it's
|
||||
not possible for this to be an option in config.json. If you'd like to change
|
||||
it, you can build Riot as above, but run
|
||||
`RIOT_OG_IMAGE_URL="http://example.com/logo.png" npm run build`.
|
||||
Alternatively, you can edit the `og:image` meta tag in `index.html` directly
|
||||
each time you download a new version of Riot.
|
||||
Note that `yarn dist` is not supported on Windows, so Windows users can run `yarn build`,
|
||||
which will build all the necessary files into the `webapp` directory. The version of Riot
|
||||
will not appear in Settings without using the dist script. You can then mount the
|
||||
`webapp` directory on your webserver to actually serve up the app, which is entirely static content.
|
||||
|
||||
Running as a Desktop app
|
||||
========================
|
||||
|
||||
Riot can also be run as a desktop app, wrapped in electron. You can download a
|
||||
pre-built version from https://riot.im/desktop.html or, if you prefer,
|
||||
build it yourself. Requires Electron >=1.6.0
|
||||
Riot can also be run as a desktop app, wrapped in Electron. You can download a
|
||||
pre-built version from https://riot.im/download/desktop/ or, if you prefer,
|
||||
build it yourself.
|
||||
|
||||
To run as a desktop app:
|
||||
To build it yourself, follow the instructions at https://github.com/vector-im/riot-desktop.
|
||||
|
||||
1. Follow the instructions in 'Building From Source' above, but run
|
||||
`npm run build` instead of `npm run dist` (since we don't need the tarball).
|
||||
2. Install electron and run it:
|
||||
|
||||
```
|
||||
npm install electron
|
||||
npm run electron
|
||||
```
|
||||
|
||||
To build packages, use electron-builder. This is configured to output:
|
||||
* dmg + zip for macOS
|
||||
* exe + nupkg for Windows
|
||||
* deb for Linux
|
||||
But this can be customised by editing the `build` section of package.json
|
||||
as per https://github.com/electron-userland/electron-builder/wiki/Options
|
||||
|
||||
See https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build
|
||||
for dependencies required for building packages for various platforms.
|
||||
|
||||
The only platform that can build packages for all three platforms is macOS:
|
||||
```
|
||||
brew install wine --without-x11
|
||||
brew install mono
|
||||
brew install gnu-tar
|
||||
npm install
|
||||
npm run build:electron
|
||||
```
|
||||
|
||||
For other packages, use electron-builder manually. For example, to build a package
|
||||
for 64 bit Linux:
|
||||
|
||||
1. Follow the instructions in 'Building From Source' above
|
||||
2. `node_modules/.bin/build -l --x64`
|
||||
|
||||
All electron packages go into `electron/dist/`
|
||||
|
||||
Many thanks to @aviraldg for the initial work on the electron integration.
|
||||
Many thanks to @aviraldg for the initial work on the Electron integration.
|
||||
|
||||
Other options for running as a desktop app:
|
||||
* https://github.com/krisak/vector-electron-desktop
|
||||
* @asdf:matrix.org points out that you can use nativefier and it just works(tm)
|
||||
|
||||
```
|
||||
sudo npm install nativefier -g
|
||||
```bash
|
||||
yarn global add nativefier
|
||||
nativefier https://riot.im/app/
|
||||
```
|
||||
|
||||
The [configuration docs](docs/config.md#desktop-app-configuration) show how to
|
||||
override the desktop app's default settings if desired.
|
||||
|
||||
Running from Docker
|
||||
===================
|
||||
|
||||
The Docker image can be used to serve riot-web as a web server. The easiest way to use
|
||||
it is to use the prebuilt image:
|
||||
```bash
|
||||
docker run -p 80:80 vectorim/riot-web
|
||||
```
|
||||
|
||||
To supply your own custom `config.json`, map a volume to `/app/config.json`. For example,
|
||||
if your custom config was located at `/etc/riot-web/config.json` then your Docker command
|
||||
would be:
|
||||
```bash
|
||||
docker run -p 80:80 -v /etc/riot-web/config.json:/app/config.json vectorim/riot-web
|
||||
```
|
||||
|
||||
To build the image yourself:
|
||||
```bash
|
||||
git clone https://github.com/vector-im/riot-web.git riot-web
|
||||
cd riot-web
|
||||
git checkout master
|
||||
docker build -t vectorim/riot-web .
|
||||
```
|
||||
|
||||
If you're building a custom branch, or want to use the develop branch, check out the appropriate
|
||||
riot-web branch and then run:
|
||||
```bash
|
||||
docker build -t vectorim/riot-web:develop \
|
||||
--build-arg USE_CUSTOM_SDKS=true \
|
||||
--build-arg REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git" \
|
||||
--build-arg REACT_SDK_BRANCH="develop" \
|
||||
--build-arg JS_SDK_REPO="https://github.com/matrix-org/matrix-js-sdk.git" \
|
||||
--build-arg JS_SDK_BRANCH="develop" \
|
||||
.
|
||||
```
|
||||
|
||||
config.json
|
||||
===========
|
||||
|
||||
Riot supports a variety of settings to configure default servers, behaviour, themes, etc.
|
||||
See the [configuration docs](docs/config.md) for more details.
|
||||
|
||||
Labs Features
|
||||
=============
|
||||
|
||||
Some features of Riot may be enabled by flags in the `Labs` section of the settings.
|
||||
Some of these features are described in [labs.md](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md).
|
||||
|
||||
Caching requirements
|
||||
====================
|
||||
|
||||
Riot requires the following URLs not to be cached, when/if you are serving Riot from your own webserver:
|
||||
```
|
||||
/config.*.json
|
||||
/i18n
|
||||
/home
|
||||
/sites
|
||||
/index.html
|
||||
```
|
||||
|
||||
Development
|
||||
===========
|
||||
|
||||
Before attempting to develop on Riot you **must** read the developer guide
|
||||
for `matrix-react-sdk` at https://github.com/matrix-org/matrix-react-sdk, which
|
||||
Before attempting to develop on Riot you **must** read the [developer guide
|
||||
for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which
|
||||
also defines the design, architecture and style for Riot too.
|
||||
|
||||
Before starting work on a feature, it's best to ensure your plan aligns well
|
||||
with our vision for Riot. Please chat with the team in
|
||||
[#riot-dev:matrix.org](https://matrix.to/#/#riot-dev:matrix.org) before you
|
||||
start so we can ensure it's something we'd be willing to merge.
|
||||
|
||||
You should also familiarise yourself with the ["Here be Dragons" guide
|
||||
](https://docs.google.com/document/d/12jYzvkidrp1h7liEuLIe6BMdU0NUjndUYI971O06ooM)
|
||||
to the tame & not-so-tame dragons (gotchas) which exist in the codebase.
|
||||
|
||||
The idea of Riot is to be a relatively lightweight "skin" of customisations on
|
||||
top of the underlying `matrix-react-sdk`. `matrix-react-sdk` provides both the
|
||||
higher and lower level React components useful for building Matrix communication
|
||||
apps using React.
|
||||
|
||||
After creating a new component you must run `npm run reskindex` to regenerate
|
||||
the `component-index.js` for the app (used in future for skinning)
|
||||
|
||||
**However, as of July 2016 this layering abstraction is broken due to rapid
|
||||
development on Riot forcing `matrix-react-sdk` to move fast at the expense of
|
||||
maintaining a clear abstraction between the two.** Hacking on Riot inevitably
|
||||
means hacking equally on `matrix-react-sdk`, and there are bits of
|
||||
`matrix-react-sdk` behaviour incorrectly residing in the `riot-web` project
|
||||
(e.g. matrix-react-sdk specific CSS), and a bunch of Riot specific behaviour
|
||||
in the `matrix-react-sdk` (grep for `vector` / `riot`). This separation problem will be
|
||||
solved asap once development on Riot (and thus matrix-react-sdk) has
|
||||
stabilised. Until then, the two projects should basically be considered as a
|
||||
single unit. In particular, `matrix-react-sdk` issues are currently filed
|
||||
against `riot-web` in github.
|
||||
After creating a new component you must run `yarn reskindex` to regenerate
|
||||
the `component-index.js` for the app (used in future for skinning).
|
||||
|
||||
Please note that Riot is intended to run correctly without access to the public
|
||||
internet. So please don't depend on resources (JS libs, CSS, images, fonts)
|
||||
@@ -259,55 +222,85 @@ having to manually rebuild each time.
|
||||
|
||||
First clone and build `matrix-js-sdk`:
|
||||
|
||||
1. `git clone git@github.com:matrix-org/matrix-js-sdk.git`
|
||||
1. `pushd matrix-js-sdk`
|
||||
1. `git checkout develop`
|
||||
1. `npm install`
|
||||
1. `npm install source-map-loader` # because webpack is made of fail (https://github.com/webpack/webpack/issues/1472)
|
||||
1. `popd`
|
||||
``` bash
|
||||
git clone https://github.com/matrix-org/matrix-js-sdk.git
|
||||
pushd matrix-js-sdk
|
||||
git checkout develop
|
||||
yarn link
|
||||
yarn install
|
||||
popd
|
||||
```
|
||||
|
||||
Then similarly with `matrix-react-sdk`:
|
||||
|
||||
1. `git clone git@github.com:matrix-org/matrix-react-sdk.git`
|
||||
1. `pushd matrix-react-sdk`
|
||||
1. `git checkout develop`
|
||||
1. `npm install`
|
||||
1. `rm -r node_modules/matrix-js-sdk; ln -s ../../matrix-js-sdk node_modules/`
|
||||
1. `popd`
|
||||
```bash
|
||||
git clone https://github.com/matrix-org/matrix-react-sdk.git
|
||||
pushd matrix-react-sdk
|
||||
git checkout develop
|
||||
yarn link
|
||||
yarn link matrix-js-sdk
|
||||
yarn install
|
||||
popd
|
||||
```
|
||||
|
||||
Finally, build and start Riot itself:
|
||||
|
||||
1. `git clone git@github.com:vector-im/riot-web.git`
|
||||
1. `cd riot-web`
|
||||
1. `git checkout develop`
|
||||
1. `npm install`
|
||||
1. `rm -r node_modules/matrix-js-sdk; ln -s ../../matrix-js-sdk node_modules/`
|
||||
1. `rm -r node_modules/matrix-react-sdk; ln -s ../../matrix-react-sdk node_modules/`
|
||||
1. `npm start`
|
||||
1. Wait a few seconds for the initial build to finish; you should see something like:
|
||||
```
|
||||
Hash: b0af76309dd56d7275c8
|
||||
Version: webpack 1.12.14
|
||||
Time: 14533ms
|
||||
Asset Size Chunks Chunk Names
|
||||
bundle.js 4.2 MB 0 [emitted] main
|
||||
bundle.css 91.5 kB 0 [emitted] main
|
||||
bundle.js.map 5.29 MB 0 [emitted] main
|
||||
bundle.css.map 116 kB 0 [emitted] main
|
||||
+ 1013 hidden modules
|
||||
```
|
||||
```bash
|
||||
git clone https://github.com/vector-im/riot-web.git
|
||||
cd riot-web
|
||||
git checkout develop
|
||||
yarn link matrix-js-sdk
|
||||
yarn link matrix-react-sdk
|
||||
yarn install
|
||||
yarn start
|
||||
```
|
||||
|
||||
|
||||
Wait a few seconds for the initial build to finish; you should see something like:
|
||||
```
|
||||
Hash: b0af76309dd56d7275c8
|
||||
Version: webpack 1.12.14
|
||||
Time: 14533ms
|
||||
Asset Size Chunks Chunk Names
|
||||
bundle.js 4.2 MB 0 [emitted] main
|
||||
bundle.css 91.5 kB 0 [emitted] main
|
||||
bundle.js.map 5.29 MB 0 [emitted] main
|
||||
bundle.css.map 116 kB 0 [emitted] main
|
||||
+ 1013 hidden modules
|
||||
```
|
||||
Remember, the command will not terminate since it runs the web server
|
||||
and rebuilds source files when they change. This development server also
|
||||
disables caching, so do NOT use it in production.
|
||||
1. Open http://127.0.0.1:8080/ in your browser to see your newly built Riot.
|
||||
|
||||
When you make changes to `matrix-react-sdk` or `matrix-js-sdk`, you will need
|
||||
to run `npm run build` in the relevant directory. You can do this automatically
|
||||
by instead running `npm start` in the directory, to start a development builder
|
||||
which will watch for changes to the files and rebuild automatically.
|
||||
Configure the app by copying `config.sample.json` to `config.json` and
|
||||
modifying it. See the [configuration docs](docs/config.md) for details.
|
||||
|
||||
Open http://127.0.0.1:8080/ in your browser to see your newly built Riot.
|
||||
|
||||
**Note**: The build script uses inotify by default on Linux to monitor directories
|
||||
for changes. If the inotify watch limit is too low your build will silently fail.
|
||||
To avoid this issue, we recommend a limit of at least 128M.
|
||||
|
||||
To set a new inotify watch limit, execute:
|
||||
|
||||
```
|
||||
$ sudo sysctl fs.inotify.max_user_watches=131072
|
||||
$ sudo sysctl -p
|
||||
```
|
||||
|
||||
If you wish, you can make this new limit permanent, by executing:
|
||||
|
||||
```
|
||||
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
|
||||
$ sudo sysctl -p
|
||||
```
|
||||
___
|
||||
|
||||
When you make changes to `matrix-react-sdk` or `matrix-js-sdk` they should be
|
||||
automatically picked up by webpack and built.
|
||||
|
||||
If you add or remove any components from the Riot skin, you will need to rebuild
|
||||
the skin's index by running, `npm run reskindex`.
|
||||
the skin's index by running, `yarn reskindex`.
|
||||
|
||||
If any of these steps error with, `file table overflow`, you are probably on a mac
|
||||
which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again.
|
||||
@@ -323,15 +316,19 @@ are designed to run in a browser instance under the control of
|
||||
* Make sure you have Chrome installed (a recent version, like 59)
|
||||
* Make sure you have `matrix-js-sdk` and `matrix-react-sdk` installed and
|
||||
built, as above
|
||||
* `npm run test`
|
||||
* `yarn test`
|
||||
|
||||
The above will run the tests under Chrome in a `headless` mode.
|
||||
|
||||
You can also tell karma to run the tests in a loop (every time the source
|
||||
changes), in an instance of Chrome on your desktop, with `npm run
|
||||
changes), in an instance of Chrome on your desktop, with `yarn
|
||||
test-multi`. This also gives you the option of running the tests in 'debug'
|
||||
mode, which is useful for stepping through the tests in the developer tools.
|
||||
|
||||
### End-to-End tests
|
||||
|
||||
See [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests) how to run the end-to-end tests.
|
||||
|
||||
Translations
|
||||
============
|
||||
|
||||
|
||||
1
__mocks__/cssMock.js
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = "css-file-stub";
|
||||
23
babel.config.js
Normal file
@@ -0,0 +1,23 @@
|
||||
module.exports = {
|
||||
"sourceMaps": true,
|
||||
"presets": [
|
||||
["@babel/preset-env", {
|
||||
"targets": [
|
||||
"last 2 Chrome versions", "last 2 Firefox versions", "last 2 Safari versions"
|
||||
],
|
||||
}],
|
||||
"@babel/preset-typescript",
|
||||
"@babel/preset-flow",
|
||||
"@babel/preset-react"
|
||||
],
|
||||
"plugins": [
|
||||
["@babel/plugin-proposal-decorators", {legacy: true}],
|
||||
"@babel/plugin-proposal-export-default-from",
|
||||
"@babel/plugin-proposal-numeric-separator",
|
||||
"@babel/plugin-proposal-class-properties",
|
||||
"@babel/plugin-proposal-object-rest-spread",
|
||||
"@babel/plugin-transform-flow-comments",
|
||||
"@babel/plugin-syntax-dynamic-import",
|
||||
"@babel/plugin-transform-runtime"
|
||||
]
|
||||
};
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"default_hs_url": "https://matrix.org",
|
||||
"default_is_url": "https://vector.im",
|
||||
"default_server_config": {
|
||||
"m.homeserver": {
|
||||
"base_url": "https://matrix-client.matrix.org",
|
||||
"server_name": "matrix.org"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
}
|
||||
},
|
||||
"disable_custom_urls": false,
|
||||
"disable_guests": false,
|
||||
"disable_login_language_selector": false,
|
||||
@@ -8,13 +15,23 @@
|
||||
"brand": "Riot",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar.vector.im/api",
|
||||
"https://scalar-staging.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar-staging.vector.im/api",
|
||||
"https://scalar-staging.riot.im/scalar/api"
|
||||
],
|
||||
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
|
||||
"defaultCountryCode": "GB",
|
||||
"showLabsSettings": false,
|
||||
"features": {
|
||||
"feature_groups": "labs",
|
||||
"feature_pinning": "labs"
|
||||
"feature_pinning": "labs",
|
||||
"feature_custom_status": "labs",
|
||||
"feature_custom_tags": "labs",
|
||||
"feature_state_counters": "labs"
|
||||
},
|
||||
"default_federate": true,
|
||||
"welcomePageUrl": "home.html",
|
||||
"default_theme": "light",
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
@@ -27,5 +44,15 @@
|
||||
"whitelistedHSUrls": ["https://matrix.org"],
|
||||
"whitelistedISUrls": ["https://vector.im", "https://matrix.org"],
|
||||
"siteId": 1
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
"https://matrix.org": false,
|
||||
"https://matrix-client.matrix.org": false
|
||||
},
|
||||
"settingDefaults": {
|
||||
"breadcrumbs": true
|
||||
},
|
||||
"jitsi": {
|
||||
"preferredDomain": "jitsi.riot.im"
|
||||
}
|
||||
}
|
||||
|
||||
17
contribute.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "Riot",
|
||||
"description": "A glossy Matrix collaboration client for the web.",
|
||||
"repository": {
|
||||
"url": "https://github.com/vector-im/riot-web",
|
||||
"license": "Apache License 2.0"
|
||||
},
|
||||
"bugs": {
|
||||
"list": "https://github.com/vector-im/riot-web/issues",
|
||||
"report": "https://github.com/vector-im/riot-web/issues/new/choose"
|
||||
},
|
||||
"keywords": [
|
||||
"chat",
|
||||
"riot",
|
||||
"matrix"
|
||||
]
|
||||
}
|
||||
146
docs/config.md
Normal file
@@ -0,0 +1,146 @@
|
||||
Configuration
|
||||
=============
|
||||
|
||||
You can configure the app by copying `config.sample.json` to
|
||||
`config.json` and customising it:
|
||||
|
||||
For a good example, see https://riot.im/develop/config.json.
|
||||
|
||||
1. `default_server_config` sets the default homeserver and identity server URL for
|
||||
Riot to use. The object is the same as returned by [https://<server_name>/.well-known/matrix/client](https://matrix.org/docs/spec/client_server/latest.html#get-well-known-matrix-client),
|
||||
with added support for a `server_name` under the `m.homeserver` section to display
|
||||
a custom homeserver name. Alternatively, the config can contain a `default_server_name`
|
||||
instead which is where Riot will go to get that same object, although this option is
|
||||
deprecated - see the `.well-known` link above for more information on using this option.
|
||||
Note that the `default_server_name` is used to get a complete server configuration
|
||||
whereas the `server_name` in the `default_server_config` is for display purposes only.
|
||||
* *Note*: The URLs can also be individually specified as `default_hs_url` and
|
||||
`default_is_url`, however these are deprecated. They are maintained for backwards
|
||||
compatibility with older configurations. `default_is_url` is respected only
|
||||
if `default_hs_url` is used.
|
||||
* Riot will fail to load if a mix of `default_server_config`, `default_server_name`, or
|
||||
`default_hs_url` is specified. When multiple sources are specified, it is unclear
|
||||
which should take priority and therefore the application cannot continue.
|
||||
* As of Riot 1.4.0, identity servers are optional. See [Identity servers](#identity-servers) below.
|
||||
1. `features`: Lookup of optional features that may be `enable`d, `disable`d, or
|
||||
exposed to the user in the `labs` section of settings. The available
|
||||
optional experimental features vary from release to release and are [documented](labs.md). The feature flag process is
|
||||
[documented](feature-flags.md) as well.
|
||||
1. `showLabsSettings`: Shows the "labs" tab of user settings even when no `features` are enabled
|
||||
or present. Useful for getting at settings which may be otherwise hidden.
|
||||
1. `brand`: String to pass to your homeserver when configuring email notifications, to let the
|
||||
homeserver know what email template to use when talking to you.
|
||||
1. `branding`: Configures various branding and logo details, such as:
|
||||
1. `welcomeBackgroundUrl`: An image to use as a wallpaper outside the app
|
||||
during authentication flows. If an array is passed, an image is chosen randomly for each visit.
|
||||
1. `authHeaderLogoUrl`: An logo image that is shown in the header during
|
||||
authentication flows
|
||||
1. `authFooterLinks`: a list of links to show in the authentication page footer:
|
||||
`[{"text": "Link text", "url": "https://link.target"}, {"text": "Other link", ...}]`
|
||||
1. `reportEvent`: Configures the dialog for reporting content to the homeserver
|
||||
admin.
|
||||
1. `adminMessageMD`: An extra message to show on the reporting dialog to
|
||||
mention homeserver-specific policies. Accepts Markdown.
|
||||
1. `integrations_ui_url`: URL to the web interface for the integrations server. The integrations
|
||||
server is not Riot and normally not your homeserver either. The integration server settings
|
||||
may be left blank to disable integrations.
|
||||
1. `integrations_rest_url`: URL to the REST interface for the integrations server.
|
||||
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
|
||||
1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a
|
||||
https://github.com/matrix-org/rageshake server). Bug reports are sent when a user clicks
|
||||
"Send Logs" within the application. Bug reports can be disabled by leaving the
|
||||
`bug_report_endpoint_url` out of your config file.
|
||||
1. `roomDirectory`: config for the public room directory. This section is optional.
|
||||
1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop
|
||||
down list. Optional.
|
||||
1. `default_theme`: name of theme to use by default (e.g. 'light')
|
||||
1. `update_base_url` (electron app only): HTTPS URL to a web server to download
|
||||
updates from. This should be the path to the directory containing `macos`
|
||||
and `win32` (for update packages, not installer packages).
|
||||
1. `piwik`: Analytics can be disabled by setting `piwik: false` or by leaving the piwik config
|
||||
option out of your config file. If you want to enable analytics, set `piwik` to be an object
|
||||
containing the following properties:
|
||||
1. `url`: The URL of the Piwik instance to use for collecting analytics
|
||||
1. `whitelistedHSUrls`: a list of HS URLs to not redact from the analytics
|
||||
1. `whitelistedISUrls`: a list of IS URLs to not redact from the analytics
|
||||
1. `siteId`: The Piwik Site ID to use when sending analytics to the Piwik server configured above
|
||||
1. `welcomeUserId`: the user ID of a bot to invite whenever users register that can give them a tour
|
||||
1. `embeddedPages`: Configures the pages displayed in portions of Riot that
|
||||
embed static files, such as:
|
||||
1. `welcomeUrl`: Initial content shown on the outside of the app when not
|
||||
logged in. Defaults to `welcome.html` supplied with Riot.
|
||||
1. `homeUrl`: Content shown on the inside of the app when a specific room is
|
||||
not selected. By default, no home page is configured. If one is set, a
|
||||
button to access it will be shown in the top left menu.
|
||||
1. `defaultCountryCode`: The ISO 3166 alpha2 country code to use when showing
|
||||
country selectors, like the phone number input on the registration page.
|
||||
Defaults to `GB` if the given code is unknown or not provided.
|
||||
1. `settingDefaults`: Defaults for settings that support the `config` level,
|
||||
as an object mapping setting name to value (note that the "theme" setting
|
||||
is special cased to the `default_theme` in the config file).
|
||||
1. `disable_custom_urls`: disallow the user to change the
|
||||
default homeserver when signing up or logging in.
|
||||
1. `permalinkPrefix`: Used to change the URL that Riot generates permalinks with.
|
||||
By default, this is "https://matrix.to" to generate matrix.to (spec) permalinks.
|
||||
Set this to your Riot instance URL if you run an unfederated server (eg:
|
||||
"https://riot.example.org").
|
||||
1. `jitsi`: Used to change the default conference options. Learn more about the
|
||||
Jitsi options at [jitsi.md](./jitsi.md).
|
||||
1. `preferredDomain`: The domain name of the preferred Jitsi instance. Defaults
|
||||
to `jitsi.riot.im`. This is used whenever a user clicks on the voice/video
|
||||
call buttons - integration managers may use a different domain.
|
||||
1. `enable_presence_by_hs_url`: The property key should be the URL of the homeserver
|
||||
and its value defines whether to enable/disable the presence status display
|
||||
from that homeserver. If no options are configurd, presence is shown for all
|
||||
homeservers.
|
||||
1. `disable_guests`: Disables guest access tokens and auto-guest registrations.
|
||||
Defaults to false (guests are allowed).
|
||||
1. `disable_login_language_selector`: Disables the login language selector. Defaults
|
||||
to false (language selector is shown).
|
||||
1. `disable_3pid_login`: Disables 3rd party identity options on login and registration form
|
||||
Defaults to false (3rd party identity options are shown).
|
||||
1. `default_federate`: Default option for room federation when creating a room
|
||||
Defaults to true (room federation enabled).
|
||||
|
||||
Note that `index.html` also has an og:image meta tag that is set to an image
|
||||
hosted on riot.im. This is the image used if links to your copy of Riot
|
||||
appear in some websites like Facebook, and indeed Riot itself. This has to be
|
||||
static in the HTML and an absolute URL (and HTTP rather than HTTPS), so it's
|
||||
not possible for this to be an option in config.json. If you'd like to change
|
||||
it, you can build Riot, but run
|
||||
`RIOT_OG_IMAGE_URL="http://example.com/logo.png" yarn build`.
|
||||
Alternatively, you can edit the `og:image` meta tag in `index.html` directly
|
||||
each time you download a new version of Riot.
|
||||
|
||||
Identity servers
|
||||
================
|
||||
|
||||
The identity server is used for inviting other users to a room via third party
|
||||
identifiers like emails and phone numbers. It is not used to store your password
|
||||
or account information.
|
||||
|
||||
As of Riot 1.4.0, all identity server functions are optional and you are
|
||||
prompted to agree to terms before data is sent to the identity server.
|
||||
|
||||
Riot will check multiple sources when looking for an identity server to use in
|
||||
the following order of preference:
|
||||
|
||||
1. The identity server set in the user's account data
|
||||
* For a new user, no value is present in their account data. It is only set
|
||||
if the user visits Settings and manually changes their identity server.
|
||||
2. The identity server provided by the `.well-known` lookup that occurred at
|
||||
login
|
||||
3. The identity server provided by the Riot config file
|
||||
|
||||
If none of these sources have an identity server set, then Riot will prompt the
|
||||
user to set an identity server first when attempting to use features that
|
||||
require one.
|
||||
|
||||
Currently, the only two public identity servers are https://vector.im and
|
||||
https://matrix.org, however in the future identity servers will be
|
||||
decentralised.
|
||||
|
||||
Desktop app configuration
|
||||
=========================
|
||||
|
||||
See https://github.com/vector-im/riot-desktop#user-specified-configjson
|
||||
135
docs/feature-flags.md
Normal file
@@ -0,0 +1,135 @@
|
||||
# Feature flags
|
||||
|
||||
When developing new features for Riot, we use feature flags to give us more
|
||||
flexibility and control over when and where those features are enabled.
|
||||
|
||||
For example, flags make the following things possible:
|
||||
|
||||
* Extended testing of a feature via labs on develop
|
||||
* Enabling features when ready instead of the first moment the code is released
|
||||
* Testing a feature with a specific set of users (by enabling only on a specific
|
||||
Riot instance)
|
||||
|
||||
The size of the feature controlled by a feature flag may vary widely: it could
|
||||
be a large project like reactions or a smaller change to an existing algorithm.
|
||||
A large project might use several feature flags if it's useful to control the
|
||||
deployment of different portions independently.
|
||||
|
||||
Everyone involved in a feature (engineering, design, product, reviewers) should
|
||||
think about its deployment plan up front as best as possible so we can have the
|
||||
right feature flags in place from the start.
|
||||
|
||||
## Interaction with spec process
|
||||
|
||||
Historically, we have often used feature flags to guard client features that
|
||||
depend on unstable spec features. Unfortunately, there was never clear agreement
|
||||
about how long such a flag should live for, when it should be removed, etc.
|
||||
|
||||
Under the [new spec
|
||||
process](https://github.com/matrix-org/matrix-doc/pull/2324), server-side
|
||||
unstable features can be used by clients and enabled by default as long as
|
||||
clients commit to doing the associated clean up work once a feature stabilises.
|
||||
|
||||
## Starting work on a feature
|
||||
|
||||
When starting work on a feature, we should create a matching feature flag:
|
||||
|
||||
1. Add a new
|
||||
[setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js)
|
||||
of the form:
|
||||
```js
|
||||
"feature_cats": {
|
||||
isFeature: true,
|
||||
displayName: _td("Adds cats everywhere"),
|
||||
supportedLevels: LEVELS_FEATURE,
|
||||
default: false,
|
||||
},
|
||||
```
|
||||
2. Check whether the feature is enabled as appropriate:
|
||||
```js
|
||||
SettingsStore.isFeatureEnabled("feature_cats")
|
||||
```
|
||||
3. Add the feature to the set of labs on
|
||||
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json)
|
||||
and [nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json):
|
||||
```json
|
||||
"features": {
|
||||
"feature_cats": "labs"
|
||||
},
|
||||
```
|
||||
4. Document the feature in the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md)
|
||||
|
||||
With these steps completed, the feature is disabled by default, but can be
|
||||
enabled on develop and nightly by interested users for testing.
|
||||
|
||||
Different features may have different deployment plans for when to enable where.
|
||||
The following lists a few common options.
|
||||
|
||||
## Enabling by default on develop and nightly
|
||||
|
||||
Set the feature to `enable` in the
|
||||
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json)
|
||||
and
|
||||
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json)
|
||||
configs:
|
||||
|
||||
```json
|
||||
"features": {
|
||||
"feature_cats": "enable"
|
||||
},
|
||||
```
|
||||
|
||||
## Enabling by default on staging, app, and release
|
||||
|
||||
Set the feature to `enable` in the
|
||||
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json)
|
||||
and
|
||||
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json)
|
||||
configs.
|
||||
|
||||
**Warning:** While this does mean the feature is enabled by default for
|
||||
https://riot.im and official Riot Desktop builds, it will not be enabled by
|
||||
default for self-hosted installs, custom desktop builds, etc. To cover those
|
||||
cases as well, the best options at the moment are converting to a regular
|
||||
setting defaulted on or to remove the flag. Simply enabling the existing flag by
|
||||
default in `Settings.js`
|
||||
[does not work currently](https://github.com/vector-im/riot-web/issues/10360).
|
||||
|
||||
## Feature deployed successfully
|
||||
|
||||
Once we're confident that a feature is working well, we should remove the flag:
|
||||
|
||||
1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js)
|
||||
2. Remove all `isFeatureEnabled` lines that test for the feature's setting
|
||||
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md)
|
||||
4. Remove feature state from
|
||||
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json),
|
||||
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json),
|
||||
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json),
|
||||
and
|
||||
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json)
|
||||
configs
|
||||
5. Celebrate! 🥳
|
||||
|
||||
## Convert to a regular setting (optional)
|
||||
|
||||
Sometimes we decide a feature should always be user-controllable as a setting
|
||||
even after it has been fully deployed. In that case, we would craft a new,
|
||||
regular setting:
|
||||
|
||||
1. Remove the feature flag from
|
||||
[settings](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js)
|
||||
and add a regular setting with the appropriate levels for your feature
|
||||
2. Replace the `isFeatureEnabled` lines with `getValue` or similar calls
|
||||
according to the [settings
|
||||
docs](https://github.com/matrix-org/matrix-react-sdk/blob/develop/docs/settings.md)
|
||||
(checking carefully, as we may want a different mix of code paths when the
|
||||
feature is always present but gated by a setting)
|
||||
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md)
|
||||
4. Remove feature state from
|
||||
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json),
|
||||
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json),
|
||||
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json),
|
||||
and
|
||||
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json)
|
||||
configs
|
||||
100
docs/jitsi-dev.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# Jitsi wrapper developer docs
|
||||
|
||||
*If you're looking for information on how to set up Jitsi in your Riot, see
|
||||
[jitsi.md](./jitsi.md) instead.*
|
||||
|
||||
These docs are for developers wondering how the different conference buttons work
|
||||
within Riot. If you're not a developer, you're probably looking for [jitsi.md](./jitsi.md).
|
||||
|
||||
## Brief introduction to widgets
|
||||
|
||||
Widgets are embedded web applications in a room, controlled through state events, and
|
||||
have a `url` property. They are largely specified by [MSC1236](https://github.com/matrix-org/matrix-doc/issues/1236)
|
||||
and have extensions proposed under [MSC1286](https://github.com/matrix-org/matrix-doc/issues/1286).
|
||||
|
||||
The `url` is typically something we shove into an iframe with sandboxing (see `AppTile`
|
||||
in the react-sdk), though for some widgets special integration can be done. v2 widgets
|
||||
have a `data` object which helps achieve that special integration, though v1 widgets
|
||||
are best iframed and left alone.
|
||||
|
||||
Widgets have a `postMessage` API they can use to interact with Riot, which also allows
|
||||
Riot to interact with them. Typically this is most used by the sticker picker (an
|
||||
account-level widget), though widgets like the Jitsi widget will request permissions to
|
||||
get 'stuck' into the room list during a conference.
|
||||
|
||||
Widgets can be added with the `/addwidget <url>` command.
|
||||
|
||||
## Brief introduction to integration managers
|
||||
|
||||
Integration managers (like Scalar and Dimension) are accessible via the 4 squares in
|
||||
the top right of the room and provide a simple UI over top of bridges, bots, and other
|
||||
stuff to plug into a room. They are a separate service to Riot and are thus iframed
|
||||
in a dialog as well. They also have a `postMessage` API they can use to interact with
|
||||
the client to create things like widgets, give permissions to bridges, and generally
|
||||
set everything up for the integration the user is working with.
|
||||
|
||||
Integration managers do not currently have a spec associated with them, though efforts
|
||||
are underway in [MSC1286](https://github.com/matrix-org/matrix-doc/issues/1286).
|
||||
|
||||
## Widgets configured by integration managers
|
||||
|
||||
Integration managers will often "wrap" a widget by using a widget `url` which points
|
||||
to the integration manager instead of to where the user requested the widget be. For
|
||||
example, a custom widget added in an integration manager for https://matrix.org will
|
||||
end up creating a widget with a URL like `https://integrations.example.org?widgetUrl=https%3A%2F%2Fmatrix.org`.
|
||||
|
||||
The integration manager's wrapper will typically have another iframe to isolate the
|
||||
widget from the client by yet another layer. The wrapper often provides other functionality
|
||||
which might not be available on the embedded site, such as a fullscreen button or the
|
||||
communication layer with the client (all widgets *should* be talking to the client
|
||||
over `postMessage`, even if they aren't going to be using the widget APIs).
|
||||
|
||||
Widgets added with the `/addwidget` command will *not* be wrapped as they are not going
|
||||
through an integration manager. The widgets themselves *should* also work outside of
|
||||
Riot. Widgets currently have a "pop out" button which opens them in a new tab and
|
||||
therefore have no connection back to Riot.
|
||||
|
||||
## Jitsi widgets from integration managers
|
||||
|
||||
Integration managers will create an entire widget event and send it over `postMessage`
|
||||
for the client to add to the room. This means that the integration manager gets to
|
||||
decide the conference domain, conference name, and other aspects of the widget. As
|
||||
a result, users can end up with a Jitsi widget that does not use the same conference
|
||||
server they specified in their config.json - this is expected.
|
||||
|
||||
Some integration managers allow the user to change the conference name while others
|
||||
will generate one for the user.
|
||||
|
||||
## Jitsi widgets generated by Riot itself
|
||||
|
||||
When the user clicks on the call buttons by the composer, the integration manager is
|
||||
not involved in the slightest. Instead, Riot itself generates a widget event, this time
|
||||
using the config.json parameters, and publishes that to the room. If there's only two
|
||||
people in the room, a plain WebRTC call is made instead of using a widget at all - these
|
||||
are defined in the Matrix specification.
|
||||
|
||||
The Jitsi widget created by Riot uses a local `jitsi.html` wrapper (or one hosted by
|
||||
`https://riot.im/app` for desktop users or those on non-https domains) as the widget
|
||||
`url`. The wrapper has some basic functionality for talking to Riot to ensure the
|
||||
required `postMessage` calls are fulfilled.
|
||||
|
||||
**Note**: Per [jitsi.md](./jitsi.md) the `preferredDomain` can also come from the server's
|
||||
client .well-known data.
|
||||
|
||||
## The Jitsi wrapper in Riot
|
||||
|
||||
Whenever Riot sees a Jitsi widget, it ditches the `url` and instead replaces it with
|
||||
its local wrapper, much like what it would do when creating a widget. However, instead
|
||||
of using one from riot.im/app, it will use one local to the client instead.
|
||||
|
||||
The wrapper is used to provide a consistent experience to users, as well as being faster
|
||||
and less risky to load. The local wrapper URL is populated with the conference information
|
||||
from the original widget (which could be a v1 or v2 widget) so the user joins the right
|
||||
call.
|
||||
|
||||
Critically, when the widget URL is reconstructed it does *not* take into account the
|
||||
config.json's `preferredDomain` for Jitsi. If it did this, users would end up on different
|
||||
conference servers and therefore different calls entirely.
|
||||
|
||||
**Note**: Per [jitsi.md](./jitsi.md) the `preferredDomain` can also come from the server's
|
||||
client .well-known data.
|
||||
58
docs/jitsi.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Jitsi in Riot
|
||||
|
||||
Riot uses [Jitsi](https://jitsi.org/) for conference calls, which provides options for
|
||||
self-hosting your own server and supports most major platforms.
|
||||
|
||||
1:1 calls, or calls between you and one other person, do not use Jitsi. Instead, those
|
||||
calls work directly between clients or via TURN servers configured on the respective
|
||||
homeservers.
|
||||
|
||||
There's a number of ways to start a Jitsi call: the easiest way is to click on the
|
||||
voice or video buttons near the message composer in a room with more than 2 people. This
|
||||
will add a Jitsi widget which allows anyone in the room to join.
|
||||
|
||||
Integration managers (available through the 4 squares in the top right of the room) may
|
||||
provide their own approaches for adding Jitsi widgets.
|
||||
|
||||
## Configuring Riot to use your self-hosted Jitsi server
|
||||
|
||||
Riot will use the Jitsi server that is embedded in the widget, even if it is not the
|
||||
one you configured. This is because conference calls must be held on a single Jitsi
|
||||
server and cannot be split over multiple servers.
|
||||
|
||||
However, you can configure Riot to *start* a conference with your Jitsi server by adding
|
||||
to your [config](./config.md) the following:
|
||||
```json
|
||||
{
|
||||
"jitsi": {
|
||||
"preferredDomain": "your.jitsi.example.org"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The default is `jitsi.riot.im` (a free service offered by Riot), and the demo site for
|
||||
Jitsi uses `meet.jit.si` (also free).
|
||||
|
||||
Once you've applied the config change, refresh Riot and press the call button. This
|
||||
should start a new conference on your Jitsi server.
|
||||
|
||||
**Note**: The widget URL will point to a `jitsi.html` page hosted by Riot. The Jitsi
|
||||
domain will appear later in the URL as a configuration parameter.
|
||||
|
||||
**Hint**: If you want everyone on your homeserver to use the same Jitsi server by
|
||||
default, and you are using riot-web 1.6 or newer, set the following on your homeserver's
|
||||
`/.well-known/matrix/client` config:
|
||||
```json
|
||||
{
|
||||
"im.vector.riot.jitsi": {
|
||||
"preferredDomain": "your.jitsi.example.org"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Mobile app support
|
||||
|
||||
Currently the Riot mobile apps do not support custom Jitsi servers and will instead
|
||||
use the default `jitsi.riot.im` server. When users on the mobile apps join the call,
|
||||
they will be joining a different conference which has the same name, but not the same
|
||||
participants. This is a known bug and which needs to be fixed.
|
||||
108
docs/labs.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Labs features
|
||||
|
||||
If Labs is enabled in the [Riot config](config.md), you can enable some of these features by going
|
||||
to `Settings->Labs`. This list is non-exhaustive and subject to change, chat in
|
||||
[#riot-web:matrix.org](https://matrix.to/#/#riot-web:matrix.org) for more information.
|
||||
|
||||
**Be warned! Labs features are not finalised, they may be fragile, they may change, they may be
|
||||
dropped. Ask in the room if you are unclear about any details here.**
|
||||
|
||||
## Message pinning (`feature_pinning`)
|
||||
|
||||
Allows you to pin messages in the room. To pin a message, use the 3 dots to the right of the message
|
||||
and select "Pin".
|
||||
|
||||
## Custom status (`feature_custom_status`)
|
||||
|
||||
An experimental approach for supporting custom status messages across DMs. To set a status, click on
|
||||
your avatar next to the message composer.
|
||||
|
||||
## Custom tags (`feature_custom_tags`)
|
||||
|
||||
An experimental approach for dealing with custom tags. Custom tags will appear in the bottom portion
|
||||
of the community filter panel.
|
||||
|
||||
Setting custom tags is not supported by Riot.
|
||||
|
||||
## Render simple counters in room header (`feature_state_counters`)
|
||||
|
||||
Allows rendering of labelled counters above the message list.
|
||||
|
||||
Once enabled, send a custom state event to a room to set values:
|
||||
|
||||
1. In a room, type `/devtools` to bring up the devtools interface
|
||||
2. Click "Send Custom Event"
|
||||
3. Toggle from "Event" to "State Event"
|
||||
4. Set the event type to: `re.jki.counter` and give it a unique key
|
||||
5. Specify the content in the following format:
|
||||
|
||||
```
|
||||
{
|
||||
"link": "",
|
||||
"severity": "normal",
|
||||
"title": "my counter",
|
||||
"value": 0
|
||||
}
|
||||
```
|
||||
|
||||
That's it. Now should see your new counter under the header.
|
||||
|
||||
## Multiple integration managers (`feature_many_integration_managers`)
|
||||
|
||||
Exposes a way to access all the integration managers known to Riot. This is an implementation of [MSC1957](https://github.com/matrix-org/matrix-doc/pull/1957).
|
||||
|
||||
## New ways to ignore people (`feature_mjolnir`)
|
||||
|
||||
When enabled, a new settings tab appears for users to be able to manage their ban lists.
|
||||
This is a different kind of ignoring where the ignored user's messages still get rendered,
|
||||
but are hidden by default.
|
||||
|
||||
Ban lists are rooms within Matrix, proposed as [MSC2313](https://github.com/matrix-org/matrix-doc/pull/2313).
|
||||
[Mjolnir](https://github.com/matrix-org/mjolnir) is a set of moderation tools which support
|
||||
ban lists.
|
||||
|
||||
## Verifications in DMs (`feature_dm_verification`)
|
||||
|
||||
An implementation of [MSC2241](https://github.com/matrix-org/matrix-doc/pull/2241). When enabled, verification might not work with devices which don't support MSC2241.
|
||||
|
||||
This also includes a new implementation of the user & member info panel, designed to share more code between showing community members & room members. Built on top of this new panel is also a new UX for verification from the member panel.
|
||||
|
||||
## Cross-signing
|
||||
|
||||
Cross-signing ([MSC1756](https://github.com/matrix-org/matrix-doc/pull/1756))
|
||||
improves the device verification experience by allowing you to verify a user
|
||||
instead of verifying each of their devices.
|
||||
|
||||
The feature is enabled by default and does not follow a traditional labs flag
|
||||
at the moment. If something goes wrong, add this to your config to disable it:
|
||||
```json
|
||||
{
|
||||
"settingDefaults": {
|
||||
"feature_cross_signing": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The setting will be removed in a future release, enabling it non-optionally for
|
||||
all users.
|
||||
|
||||
## Bridge info tab (`feature_bridge_state`)
|
||||
|
||||
Adds a "Bridge Info" tab to the Room Settings dialog, if a compatible bridge is
|
||||
present in the room. The Bridge info tab pulls information from the `m.bridge` state event ([MSC2346](https://github.com/matrix-org/matrix-doc/pull/2346)). Since the feature is based upon a MSC, most
|
||||
bridges are not expected to be compatible, and users should not rely on this
|
||||
tab as the single source of truth just yet.
|
||||
|
||||
## Presence indicator in room list (`feature_presence_in_room_list`)
|
||||
|
||||
This adds a presence indicator in the room list next to DM rooms where the other
|
||||
person is online.
|
||||
|
||||
## Custom themes (`feature_custom_themes`)
|
||||
|
||||
Custom themes are possible through Riot's [theme support](./theming.md), though
|
||||
normally these themes need to be defined in the config for Riot. This labs flag
|
||||
adds an ability for end users to add themes themselves by using a URL to the JSON
|
||||
theme definition.
|
||||
|
||||
For some sample themes, check out [aaronraimist/riot-web-themes](https://github.com/aaronraimist/riot-web-themes).
|
||||
53
docs/memory-profiles-and-leaks.md
Normal file
@@ -0,0 +1,53 @@
|
||||
## Memory leaks
|
||||
|
||||
Riot usually emits slow behaviour just before it is about to crash. Getting a
|
||||
memory snapshot (below) just before that happens is ideal in figuring out what
|
||||
is going wrong.
|
||||
|
||||
Common symptoms are clicking on a room and it feels like the tab froze and scrolling
|
||||
becoming jumpy/staggered.
|
||||
|
||||
If you receive a white screen (electron) or the chrome crash page, it is likely
|
||||
run out of memory and it is too late for a memory profile. Please do report when
|
||||
this happens though so we can try and narrow down what might have gone wrong.
|
||||
|
||||
## Memory profiles/snapshots
|
||||
|
||||
When investigating memory leaks/problems it's usually important to compare snapshots
|
||||
from different points in the Riot session lifecycle. Most importantly, a snapshot
|
||||
to establish the baseline or "normal" memory usage is useful. Taking a snapshot
|
||||
roughly 30-60 minutes after starting Riot is a good time to establish "normal"
|
||||
memory usage for the app - anything after that is at risk of hiding the memory leak
|
||||
and anything newer is still in the warmup stages of the app.
|
||||
|
||||
**Memory profiles can contain sensitive information.** If you are submitting a memory
|
||||
profile to us for debugging purposes, please pick the appropriate Riot developer and
|
||||
send them over an encrypted private message. *Do not share your memory profile in
|
||||
public channels or with people you do not trust.*
|
||||
|
||||
### Taking a memory profile (Firefox)
|
||||
|
||||
1. Press CTRL+SHIFT+I (I as in eye).
|
||||
2. Click the Memory tab.
|
||||
3. Press the camera icon in the top left of the pane.
|
||||
4. Wait a bit (coffee is a good option).
|
||||
5. When the save button appears on the left side of the panel, click it to save the
|
||||
profile locally.
|
||||
6. Compress the file (gzip or regular zip) to make the file smaller.
|
||||
7. Send the compressed file to whoever asked for it (if you trust them).
|
||||
|
||||
While the profile is in progress, the tab might be frozen or unresponsive.
|
||||
|
||||
### Taking a memory profile (Chrome/Desktop)
|
||||
|
||||
1. Press CTRL+SHIFT+I (I as in eye).
|
||||
2. Click the Memory tab.
|
||||
3. Select "Heap Snapshot" and the riot.im VM instance (not the indexeddb one).
|
||||
4. Click "Take Snapshot".
|
||||
5. Wait a bit (coffee is a good option).
|
||||
6. When the save button appears on the left side of the panel, click it to save the
|
||||
profile locally.
|
||||
7. Compress the file (gzip or regular zip) to make the file smaller.
|
||||
8. Send the compressed file to whoever asked for it (if you trust them).
|
||||
|
||||
While the profile is in progress, the tab might be frozen or unresponsive.
|
||||
60
docs/native-node-modules.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# Native Node Modules
|
||||
|
||||
For some features, the desktop version of Riot can make use of native Node
|
||||
modules. These allow Riot to integrate with the desktop in ways that a browser
|
||||
cannot.
|
||||
|
||||
While native modules enable powerful new features, they must be complied for
|
||||
each operating system. For official Riot releases, we will always build these
|
||||
modules from source to ensure we can trust the compiled output. In the future,
|
||||
we may offer a pre-compiled path for those who want to use these features in a
|
||||
custom build of Riot without installing the various build tools required.
|
||||
|
||||
Do note that compiling a module for a particular operating system
|
||||
(Linux/macOS/Windows) will need to be done on that operating system.
|
||||
Cross-compiling from a host OS for a different target OS may be possible, but
|
||||
we don't support this flow with Riot dependencies at this time.
|
||||
|
||||
At the moment, we need to make some changes to the Riot release process before
|
||||
we can support native Node modules at release time, so these features are
|
||||
currently disabled by default until that is resolved. The following sections
|
||||
explain the manual steps you can use with a custom build of Riot to enable
|
||||
these features if you'd like to try them out.
|
||||
|
||||
## Adding Seshat for search in E2E encrypted rooms
|
||||
|
||||
Seshat is a native Node module that adds support for local event indexing and
|
||||
full text search in E2E encrypted rooms.
|
||||
|
||||
Since Seshat is written in Rust, the Rust compiler and related tools need to be
|
||||
installed before installing Seshat itself. To install Rust please consult the
|
||||
official Rust [documentation](https://www.rust-lang.org/tools/install).
|
||||
|
||||
Seshat also depends on the SQLCipher library to store its data in encrypted form
|
||||
on disk. You'll need to install it via your OS package manager.
|
||||
|
||||
After installing the Rust compiler and SQLCipher, Seshat support can be added
|
||||
using yarn inside the `electron_app/` directory:
|
||||
|
||||
yarn add matrix-seshat
|
||||
|
||||
You will have to rebuild the native libraries against electron's version of
|
||||
of node rather than your system node, using the `electron-build-env` tool.
|
||||
This is also needed to when pulling in changes to Seshat using `yarn link`.
|
||||
Again from the `electron_app/` directory:
|
||||
|
||||
yarn add electron-build-env
|
||||
|
||||
Recompiling Seshat itself can be done like so:
|
||||
|
||||
yarn run electron-build-env -- --electron 6.1.1 -- neon build matrix-seshat --release
|
||||
|
||||
Please make sure to include all the `--` as well as the `--release` command line
|
||||
switch at the end. Modify your electron version accordingly depending on the
|
||||
version that is installed on your system.
|
||||
|
||||
After this is done the Electron version of Riot can be run from the main folder
|
||||
as usual using:
|
||||
|
||||
yarn electron
|
||||
|
||||
82
docs/review.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# Review Guidelines
|
||||
|
||||
The following summarises review guidelines that we follow for pull requests in
|
||||
Riot Web and other supporting repos. These are just guidelines (not strict
|
||||
rules) and may be updated over time.
|
||||
|
||||
## Code Review
|
||||
|
||||
When reviewing code, here are some things we look for and also things we avoid:
|
||||
|
||||
### We review for
|
||||
|
||||
* Correctness
|
||||
* Performance
|
||||
* Accessibility
|
||||
* Security
|
||||
* Comments and documentation where needed
|
||||
* Sharing knowledge of different areas among the team
|
||||
* Ensuring it's something we're comfortable maintaining for the long term
|
||||
* Progress indicators and local echo where appropriate with network activity
|
||||
|
||||
### We should avoid
|
||||
|
||||
* Style nits that are already handled by the linter
|
||||
* Dramatically increasing scope
|
||||
|
||||
### Good practices
|
||||
|
||||
* Use empathetic language
|
||||
* See also [Mindful Communication in Code
|
||||
Reviews](https://kickstarter.engineering/a-guide-to-mindful-communication-in-code-reviews-48aab5282e5e)
|
||||
and [How to Do Code Reviews Like a Human](https://mtlynch.io/human-code-reviews-1/)
|
||||
* Authors should prefer smaller commits for easier reviewing and bisection
|
||||
* Reviewers should be explicit about required versus optional changes
|
||||
* Reviews are conversations and the PR author should feel comfortable
|
||||
discussing and pushing back on changes before making them
|
||||
* Core team should lead by example through their tone and language
|
||||
* Take the time to thank and point out good code changes
|
||||
* Using softer language like "please" and "what do you think?" goes a long way
|
||||
towards making others feel like colleagues working towards a common goal
|
||||
|
||||
### Workflow
|
||||
|
||||
* Authors should request review from the riot-web team by default (if someone on
|
||||
the team is clearly the expert in an area, a direct review request to them may
|
||||
be more appropriate)
|
||||
* Reviewers should remove the team review request and request review from
|
||||
themselves when starting a review to avoid double review
|
||||
* If there are multiple related PRs authors should reference each of the PRs in
|
||||
the others before requesting review. Reviewers might start reviewing from
|
||||
different places and could miss other required PRs.
|
||||
* Avoid force pushing to a PR after the first round of review
|
||||
* Use the GitHub default of merge commits when landing (avoid alternate options
|
||||
like squash or rebase)
|
||||
* PR author merges after review (assuming they have write access)
|
||||
* Assign issues only when in progress to indicate to others what can be picked
|
||||
up
|
||||
|
||||
## Design and Product Review
|
||||
|
||||
We want to ensure that all changes to Riot fit with our design and product
|
||||
vision. We often request review from those teams so they can provide their
|
||||
perspective.
|
||||
|
||||
In more detail, our usual process for changes that affect the UI or alter user
|
||||
functionality is:
|
||||
|
||||
* For changes that will go live when merged, always flag Design and Product
|
||||
teams as appropriate
|
||||
* For changes guarded by a feature flag, Design and Product review is not
|
||||
required (though may still be useful) since we can continue tweaking
|
||||
|
||||
As it can be difficult to review design work from looking at just the changed
|
||||
files in a PR, authors should be prepared for Design and / or Product teams to
|
||||
request a link to an ad-hoc build of Riot (hosted anywhere) that can be used for
|
||||
the review. In the future, we [hope to automate
|
||||
this](https://github.com/vector-im/riot-web/issues/12624) for every PR.
|
||||
|
||||
Before starting work on a feature, it's best to ensure your plan aligns well
|
||||
with our vision for Riot. Please chat with the team in
|
||||
[#riot-dev:matrix.org](https://matrix.to/#/#riot-dev:matrix.org) before you
|
||||
start so we can ensure it's something we'd be willing to merge.
|
||||
@@ -11,11 +11,11 @@ As of Jan 2017, skins are not fully supported; riot is the only available skin.
|
||||
To define a theme for Riot:
|
||||
|
||||
1. Pick a name, e.g. `teal`. at time of writing we have `light` and `dark`.
|
||||
2. Fork `src/skins/vector/css/themes/dark.scss` to be teal.scss
|
||||
3. Fork `src/skins/vector/css/themes/_base.scss` to be _teal.scss
|
||||
4. Override variables in _teal.scss as desired. You may wish to delete ones
|
||||
which don't differ from _base.scss, to make it clear which are being
|
||||
overridden. If every single colour is being changed (as per _dark.scss)
|
||||
2. Fork `src/skins/vector/css/themes/dark.scss` to be `teal.scss`
|
||||
3. Fork `src/skins/vector/css/themes/_base.scss` to be `_teal.scss`
|
||||
4. Override variables in `_teal.scss` as desired. You may wish to delete ones
|
||||
which don't differ from `_base.scss`, to make it clear which are being
|
||||
overridden. If every single colour is being changed (as per `_dark.scss`)
|
||||
then you might as well keep them all.
|
||||
5. Add the theme to the list of entrypoints in webpack.config.js
|
||||
6. Add the theme to the list of themes in matrix-react-sdk's UserSettings.js
|
||||
@@ -23,3 +23,64 @@ To define a theme for Riot:
|
||||
|
||||
In future, the assets for a theme will probably be gathered together into a
|
||||
single directory tree.
|
||||
|
||||
Custom Themes
|
||||
=============
|
||||
|
||||
Themes derived from the built in themes may also be defined in settings.
|
||||
|
||||
To avoid name collisions, the internal name of a theme is
|
||||
`custom-${theme.name}`. So if you want to set the custom theme below as the
|
||||
default theme, you would use `default_theme: "custom-Electric Blue"`.
|
||||
|
||||
eg. in config.json:
|
||||
|
||||
```
|
||||
"settingDefaults": {
|
||||
"custom_themes": [
|
||||
{
|
||||
"name": "Electric Blue",
|
||||
"is_dark": false,
|
||||
"colors": {
|
||||
"accent-color": "#3596fc",
|
||||
"primary-color": "#368bd6",
|
||||
"warning-color": "#ff4b55",
|
||||
"sidebar-color": "#27303a",
|
||||
"roomlist-background-color": "#f3f8fd",
|
||||
"roomlist-text-color": "#2e2f32",
|
||||
"roomlist-text-secondary-color": "#61708b",
|
||||
"roomlist-highlights-color": "#ffffff",
|
||||
"roomlist-separator-color": "#e3e8f0",
|
||||
"timeline-background-color": "#ffffff",
|
||||
"timeline-text-color": "#2e2f32",
|
||||
"timeline-text-secondary-color": "#61708b",
|
||||
"timeline-highlights-color": "#f3f8fd",
|
||||
"username-colors": ["#ff0000", ...]
|
||||
"avatar-background-colors": ["#cc0000", ...]
|
||||
}
|
||||
}, {
|
||||
"name": "Deep Purple",
|
||||
"is_dark": true,
|
||||
"colors": {
|
||||
"accent-color": "#6503b3",
|
||||
"primary-color": "#368bd6",
|
||||
"warning-color": "#b30356",
|
||||
"sidebar-color": "#15171B",
|
||||
"roomlist-background-color": "#22262E",
|
||||
"roomlist-text-color": "#A1B2D1",
|
||||
"roomlist-text-secondary-color": "#EDF3FF",
|
||||
"roomlist-highlights-color": "#343A46",
|
||||
"roomlist-separator-color": "#a1b2d1",
|
||||
"timeline-background-color": "#181b21",
|
||||
"timeline-text-color": "#EDF3FF",
|
||||
"timeline-text-secondary-color": "#A1B2D1",
|
||||
"timeline-highlights-color": "#22262E"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`username-colors` is expected to contain 8 colors. `avatar-background-colors` is expected to contain 3 colors. Both values are optional and have fallbacks from the built-in theme.
|
||||
|
||||
These are exposed as `--username-colors_0`, ... and `--avatar-background-colors_0`, ... respectively in CSS.
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
## Requirements
|
||||
|
||||
- A working [Development Setup](../../#setting-up-a-dev-environment)
|
||||
- Including up-to-date versions of matrix-react-sdk and matrix-js-sdk
|
||||
- Latest LTS version of Node.js installed
|
||||
- Be able to understand English
|
||||
- Be able to understand the language you want to translate riot-web into
|
||||
|
||||
@@ -30,9 +32,15 @@ function getColorName(hex) {
|
||||
|
||||
1. Check if the import ``import { _t } from 'matrix-react-sdk/lib/languageHandler';`` is present. If not add it to the other import statements. Also import `_td` if needed.
|
||||
1. Add ``_t()`` to your string. (Don't forget curly braces when you assign an expression to JSX attributes in the render method). If the string is introduced at a point before the translation system has not yet been initialized, use `_td()` instead, and call `_t()` at the appropriate time.
|
||||
1. Run `npm run i18n` to update ``src/i18n/strings/en_EN.json`` (if it fails because it can't find the script, your dev environment predates the script, so reinstall/link react-sdk with `npm link ../matrix-react-sdk`). If it segfaults, you may be on Node 6, so try a newer version of node.
|
||||
1. Run `yarn i18n` to update ``src/i18n/strings/en_EN.json``
|
||||
1. If you added a string with a plural, you can add other English plural variants to ``src/i18n/strings/en_EN.json`` (remeber to edit the one in the same project as the source file containing your new translation).
|
||||
|
||||
## Editing existing strings
|
||||
|
||||
1. Edit every occurrence of the string inside `_t()` and `_td()` in the JSX files.
|
||||
1. Run `yarn i18n` to update `src/i18n/strings/en_EN.json`. (Be sure to run this in the same project as the JSX files you just edited.)
|
||||
1. Run `yarn prunei18n` to remove the old string from `src/i18n/strings/*.json`.
|
||||
|
||||
## Adding variables inside a string.
|
||||
|
||||
1. Extend your ``_t()`` call. Instead of ``_t(STRING)`` use ``_t(STRING, {})``
|
||||
|
||||
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 673 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"name": "riot-web",
|
||||
"productName": "Riot",
|
||||
"main": "src/electron-main.js",
|
||||
"version": "0.14.0",
|
||||
"description": "A feature-rich client for Matrix.org",
|
||||
"author": "Vector Creations Ltd.",
|
||||
"dependencies": {
|
||||
"auto-launch": "^5.0.1",
|
||||
"electron-window-state": "^4.1.0",
|
||||
"minimist": "^1.2.0",
|
||||
"png-to-ico": "^1.0.2"
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIF0jCCBLqgAwIBAgIRAISYBqZi3VvCUeSfHXF+cbwwDQYJKoZIhvcNAQELBQAw
|
||||
gZExCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
||||
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTcwNQYD
|
||||
VQQDEy5DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gQ29kZSBTaWduaW5n
|
||||
IENBMB4XDTE3MDgyMzAwMDAwMFoXDTIwMDgyMjIzNTk1OVowgdgxETAPBgNVBAUT
|
||||
CDEwODczNjYxMRMwEQYLKwYBBAGCNzwCAQMTAkdCMR0wGwYDVQQPExRQcml2YXRl
|
||||
IE9yZ2FuaXphdGlvbjELMAkGA1UEBhMCR0IxETAPBgNVBBEMCFdDMVIgNEFHMQ8w
|
||||
DQYDVQQIDAZMb25kb24xDzANBgNVBAcMBkxvbmRvbjEbMBkGA1UECQwSMjYgUmVk
|
||||
IExpb24gU3F1YXJlMRcwFQYDVQQKDA5OZXcgVmVjdG9yIEx0ZDEXMBUGA1UEAwwO
|
||||
TmV3IFZlY3RvciBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7
|
||||
X0HP3oM/SVr6PboD03ndtYTONZDcJ/GJ3EyYi6UNrcbKjuDHwPktx9hjAhNjcVkG
|
||||
lmuTEPluPj9DbvjaTrers0cQsAS1vJ0RHjLfA93Flg1ys9Q6OThUMw77FtFPtiJU
|
||||
z5cSYzfFAhn/4dv7BcgGptn+Mv/8CaTu+RUZJUgoSlRWcT1TREmxkzWotbblqsHO
|
||||
zjDmUg20tL5/qpt6BSWsNespf5udKQFXMtqkczBcLvBLmql0vurVcQy8BibB+Q89
|
||||
QKwRzwLgaIa7O8WEssFcW8uJe9s0SNtUy8ehbuoSxpA/DbHFwsiDbNA78vp7HrqM
|
||||
qY6t6OIgLtDYBFCfe/btAgMBAAGjggHaMIIB1jAfBgNVHSMEGDAWgBTfj/MgDOnK
|
||||
pgTYW1g3Kj2rRtyDSTAdBgNVHQ4EFgQUH+mDOdRkF3bYDxCWEaGB4lxiCxcwDgYD
|
||||
VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMw
|
||||
EQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQYBMCsw
|
||||
KQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMFUGA1Ud
|
||||
HwROMEwwSqBIoEaGRGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JTQUV4
|
||||
dGVuZGVkVmFsaWRhdGlvbkNvZGVTaWduaW5nQ0EuY3JsMIGGBggrBgEFBQcBAQR6
|
||||
MHgwUAYIKwYBBQUHMAKGRGh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JT
|
||||
QUV4dGVuZGVkVmFsaWRhdGlvbkNvZGVTaWduaW5nQ0EuY3J0MCQGCCsGAQUFBzAB
|
||||
hhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wJgYDVR0RBB8wHaAbBggrBgEFBQcI
|
||||
A6APMA0MC0dCLTEwODczNjYxMA0GCSqGSIb3DQEBCwUAA4IBAQBJ2aH4aixh0aiz
|
||||
4WKlK+LMVLHpQ2POE3FZYNpAW7o1q2YDGEADXdGrygPE9NCGNBXKo0CAemCYNWfX
|
||||
Ov/jdoiMfeqW3vrZ66oEy8OqbvJSwK1xmomWuYw3wYPWcPVG+YbWYD2CGdQu8jTz
|
||||
fzAJCpvAuY3Wji3fQjiecAC7JCSB4fBHa0ALJOmiSqKQUUpkXs5kW7O0lPBnHzNF
|
||||
2tQGltXMSIrq1QfFtcreMyKlwDOxPIh360dv5aHhaeSRDRKxq7uq5ikQF2gjKx4k
|
||||
ieg2HRbAW6fVPpFr4zRS5umpeZV3i06i11VQQPS/mA/OBEXyaqzx4mr6B7U6ptrp
|
||||
jMqiUv2w
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,4 +0,0 @@
|
||||
This directory contains the config file for the official riot.im distribution
|
||||
of Riot Desktop. You probably do not want to build with this config unless
|
||||
you're building the official riot.im distribution, or you'll find your builds
|
||||
will replace themselves with the riot.im build.
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"update_base_url": "https://riot.im/download/desktop/update/",
|
||||
"default_hs_url": "https://matrix.org",
|
||||
"default_is_url": "https://vector.im",
|
||||
"brand": "Riot",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar-staging.riot.im/scalar/api",
|
||||
"https://scalar.vector.im/api"
|
||||
],
|
||||
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
|
||||
"welcomeUserId": "@riot-bot:matrix.org",
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
"matrix.org"
|
||||
]
|
||||
},
|
||||
"piwik": {
|
||||
"url": "https://piwik.riot.im/",
|
||||
"siteId": 1
|
||||
}
|
||||
}
|
||||
@@ -1,265 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Aviral Dasgupta
|
||||
Copyright 2016 OpenMarket Ltd
|
||||
Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Squirrel on windows starts the app with various flags
|
||||
// as hooks to tell us when we've been installed/uninstalled
|
||||
// etc.
|
||||
const checkSquirrelHooks = require('./squirrelhooks');
|
||||
if (checkSquirrelHooks()) return;
|
||||
|
||||
const argv = require('minimist')(process.argv);
|
||||
const electron = require('electron');
|
||||
const AutoLaunch = require('auto-launch');
|
||||
|
||||
const tray = require('./tray');
|
||||
const vectorMenu = require('./vectormenu');
|
||||
const webContentsHandler = require('./webcontents-handler');
|
||||
const updater = require('./updater');
|
||||
|
||||
const windowStateKeeper = require('electron-window-state');
|
||||
|
||||
if (argv.profile) {
|
||||
electron.app.setPath('userData', `${electron.app.getPath('userData')}-${argv.profile}`);
|
||||
}
|
||||
|
||||
let vectorConfig = {};
|
||||
try {
|
||||
vectorConfig = require('../../webapp/config.json');
|
||||
} catch (e) {
|
||||
// it would be nice to check the error code here and bail if the config
|
||||
// is unparseable, but we get MODULE_NOT_FOUND in the case of a missing
|
||||
// file or invalid json, so node is just very unhelpful.
|
||||
// Continue with the defaults (ie. an empty config)
|
||||
}
|
||||
|
||||
let mainWindow = null;
|
||||
global.appQuitting = false;
|
||||
|
||||
|
||||
// handle uncaught errors otherwise it displays
|
||||
// stack traces in popup dialogs, which is terrible (which
|
||||
// it will do any time the auto update poke fails, and there's
|
||||
// no other way to catch this error).
|
||||
// Assuming we generally run from the console when developing,
|
||||
// this is far preferable.
|
||||
process.on('uncaughtException', function(error) {
|
||||
console.log('Unhandled exception', error);
|
||||
});
|
||||
|
||||
let focusHandlerAttached = false;
|
||||
electron.ipcMain.on('setBadgeCount', function(ev, count) {
|
||||
electron.app.setBadgeCount(count);
|
||||
if (count === 0) {
|
||||
mainWindow.flashFrame(false);
|
||||
}
|
||||
});
|
||||
|
||||
electron.ipcMain.on('loudNotification', function() {
|
||||
if (process.platform === 'win32' && mainWindow && !mainWindow.isFocused() && !focusHandlerAttached) {
|
||||
mainWindow.flashFrame(true);
|
||||
mainWindow.once('focus', () => {
|
||||
mainWindow.flashFrame(false);
|
||||
focusHandlerAttached = false;
|
||||
});
|
||||
focusHandlerAttached = true;
|
||||
}
|
||||
});
|
||||
|
||||
let powerSaveBlockerId;
|
||||
electron.ipcMain.on('app_onAction', function(ev, payload) {
|
||||
switch (payload.action) {
|
||||
case 'call_state':
|
||||
if (powerSaveBlockerId && electron.powerSaveBlocker.isStarted(powerSaveBlockerId)) {
|
||||
if (payload.state === 'ended') {
|
||||
electron.powerSaveBlocker.stop(powerSaveBlockerId);
|
||||
}
|
||||
} else {
|
||||
if (payload.state === 'connected') {
|
||||
powerSaveBlockerId = electron.powerSaveBlocker.start('prevent-display-sleep');
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
electron.app.commandLine.appendSwitch('--enable-usermedia-screen-capturing');
|
||||
|
||||
const shouldQuit = electron.app.makeSingleInstance((commandLine, workingDirectory) => {
|
||||
// Someone tried to run a second instance, we should focus our window.
|
||||
if (mainWindow) {
|
||||
if (!mainWindow.isVisible()) mainWindow.show();
|
||||
if (mainWindow.isMinimized()) mainWindow.restore();
|
||||
mainWindow.focus();
|
||||
}
|
||||
});
|
||||
|
||||
if (shouldQuit) {
|
||||
console.log('Other instance detected: exiting');
|
||||
electron.app.exit();
|
||||
}
|
||||
|
||||
|
||||
const launcher = new AutoLaunch({
|
||||
name: vectorConfig.brand || 'Riot',
|
||||
isHidden: true,
|
||||
mac: {
|
||||
useLaunchAgent: true,
|
||||
},
|
||||
});
|
||||
|
||||
const settings = {
|
||||
'auto-launch': {
|
||||
get: launcher.isEnabled,
|
||||
set: function(bool) {
|
||||
if (bool) {
|
||||
return launcher.enable();
|
||||
} else {
|
||||
return launcher.disable();
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
electron.ipcMain.on('settings_get', async function(ev) {
|
||||
const data = {};
|
||||
|
||||
try {
|
||||
await Promise.all(Object.keys(settings).map(async function (setting) {
|
||||
data[setting] = await settings[setting].get();
|
||||
}));
|
||||
|
||||
ev.sender.send('settings', data);
|
||||
} catch(e) { console.error(e); }
|
||||
});
|
||||
|
||||
electron.ipcMain.on('settings_set', function(ev, key, value) {
|
||||
console.log(key, value);
|
||||
if (settings[key] && settings[key].set) {
|
||||
settings[key].set(value);
|
||||
}
|
||||
});
|
||||
|
||||
electron.app.on('ready', () => {
|
||||
|
||||
if (argv.devtools) {
|
||||
try {
|
||||
const { default: installExtension, REACT_DEVELOPER_TOOLS, REACT_PERF } = require('electron-devtools-installer');
|
||||
installExtension(REACT_DEVELOPER_TOOLS)
|
||||
.then((name) => console.log(`Added Extension: ${name}`))
|
||||
.catch((err) => console.log('An error occurred: ', err));
|
||||
installExtension(REACT_PERF)
|
||||
.then((name) => console.log(`Added Extension: ${name}`))
|
||||
.catch((err) => console.log('An error occurred: ', err));
|
||||
} catch(e) {console.log(e);}
|
||||
}
|
||||
|
||||
|
||||
if (vectorConfig.update_base_url) {
|
||||
console.log(`Starting auto update with base URL: ${vectorConfig.update_base_url}`);
|
||||
updater.start(vectorConfig.update_base_url);
|
||||
} else {
|
||||
console.log('No update_base_url is defined: auto update is disabled');
|
||||
}
|
||||
|
||||
const iconPath = `${__dirname}/../img/riot.${process.platform === 'win32' ? 'ico' : 'png'}`;
|
||||
|
||||
// Load the previous window state with fallback to defaults
|
||||
const mainWindowState = windowStateKeeper({
|
||||
defaultWidth: 1024,
|
||||
defaultHeight: 768,
|
||||
});
|
||||
|
||||
mainWindow = global.mainWindow = new electron.BrowserWindow({
|
||||
icon: iconPath,
|
||||
show: false,
|
||||
autoHideMenuBar: true,
|
||||
|
||||
x: mainWindowState.x,
|
||||
y: mainWindowState.y,
|
||||
width: mainWindowState.width,
|
||||
height: mainWindowState.height,
|
||||
});
|
||||
mainWindow.loadURL(`file://${__dirname}/../../webapp/index.html`);
|
||||
electron.Menu.setApplicationMenu(vectorMenu);
|
||||
|
||||
// explicitly hide because setApplicationMenu on Linux otherwise shows...
|
||||
// https://github.com/electron/electron/issues/9621
|
||||
mainWindow.hide();
|
||||
|
||||
// Create trayIcon icon
|
||||
tray.create({
|
||||
icon_path: iconPath,
|
||||
brand: vectorConfig.brand || 'Riot',
|
||||
});
|
||||
|
||||
if (!argv.hidden) {
|
||||
mainWindow.once('ready-to-show', () => {
|
||||
mainWindow.show();
|
||||
});
|
||||
}
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = global.mainWindow = null;
|
||||
});
|
||||
mainWindow.on('close', (e) => {
|
||||
if (!global.appQuitting && (tray.hasTray() || process.platform === 'darwin')) {
|
||||
// On Mac, closing the window just hides it
|
||||
// (this is generally how single-window Mac apps
|
||||
// behave, eg. Mail.app)
|
||||
e.preventDefault();
|
||||
mainWindow.hide();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
// Handle forward/backward mouse buttons in Windows
|
||||
mainWindow.on('app-command', (e, cmd) => {
|
||||
if (cmd === 'browser-backward' && mainWindow.webContents.canGoBack()) {
|
||||
mainWindow.webContents.goBack();
|
||||
} else if (cmd === 'browser-forward' && mainWindow.webContents.canGoForward()) {
|
||||
mainWindow.webContents.goForward();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
webContentsHandler(mainWindow.webContents);
|
||||
mainWindowState.manage(mainWindow);
|
||||
});
|
||||
|
||||
electron.app.on('window-all-closed', () => {
|
||||
electron.app.quit();
|
||||
});
|
||||
|
||||
electron.app.on('activate', () => {
|
||||
mainWindow.show();
|
||||
});
|
||||
|
||||
electron.app.on('before-quit', () => {
|
||||
global.appQuitting = true;
|
||||
if (mainWindow) {
|
||||
mainWindow.webContents.send('before-quit');
|
||||
}
|
||||
});
|
||||
|
||||
// Set the App User Model ID to match what the squirrel
|
||||
// installer uses for the shortcut icon.
|
||||
// This makes notifications work on windows 8.1 (and is
|
||||
// a noop on other platforms).
|
||||
electron.app.setAppUserModelId('com.squirrel.riot-web.Riot');
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
Copyright 2017 OpenMarket Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
const path = require('path');
|
||||
const spawn = require('child_process').spawn;
|
||||
const {app} = require('electron');
|
||||
|
||||
function runUpdateExe(args, done) {
|
||||
// Invokes Squirrel's Update.exe which will do things for us like create shortcuts
|
||||
// Note that there's an Update.exe in the app-x.x.x directory and one in the parent
|
||||
// directory: we need to run the one in the parent directory, because it discovers
|
||||
// information about the app by inspecting the directory it's run from.
|
||||
const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe');
|
||||
console.log(`Spawning '${updateExe}' with args '${args}'`);
|
||||
spawn(updateExe, args, {
|
||||
detached: true,
|
||||
}).on('close', done);
|
||||
}
|
||||
|
||||
function checkSquirrelHooks() {
|
||||
if (process.platform !== 'win32') return false;
|
||||
|
||||
const cmd = process.argv[1];
|
||||
const target = path.basename(process.execPath);
|
||||
if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') {
|
||||
runUpdateExe(['--createShortcut=' + target + ''], app.quit);
|
||||
return true;
|
||||
} else if (cmd === '--squirrel-uninstall') {
|
||||
runUpdateExe(['--removeShortcut=' + target + ''], app.quit);
|
||||
return true;
|
||||
} else if (cmd === '--squirrel-obsolete') {
|
||||
app.quit();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = checkSquirrelHooks;
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
Copyright 2017 Karl Glatz <karl@glatz.biz>
|
||||
Copyright 2017 OpenMarket Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
const {app, Tray, Menu, nativeImage} = require('electron');
|
||||
const pngToIco = require('png-to-ico');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
let trayIcon = null;
|
||||
|
||||
exports.hasTray = function hasTray() {
|
||||
return (trayIcon !== null);
|
||||
};
|
||||
|
||||
exports.create = function(config) {
|
||||
// no trays on darwin
|
||||
if (process.platform === 'darwin' || trayIcon) return;
|
||||
|
||||
const toggleWin = function() {
|
||||
if (global.mainWindow.isVisible() && !global.mainWindow.isMinimized()) {
|
||||
global.mainWindow.hide();
|
||||
} else {
|
||||
if (global.mainWindow.isMinimized()) global.mainWindow.restore();
|
||||
if (!global.mainWindow.isVisible()) global.mainWindow.show();
|
||||
global.mainWindow.focus();
|
||||
}
|
||||
};
|
||||
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: `Show/Hide ${config.brand}`,
|
||||
click: toggleWin,
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Quit',
|
||||
click: function() {
|
||||
app.quit();
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
const defaultIcon = nativeImage.createFromPath(config.icon_path);
|
||||
|
||||
trayIcon = new Tray(defaultIcon);
|
||||
trayIcon.setToolTip(config.brand);
|
||||
trayIcon.setContextMenu(contextMenu);
|
||||
trayIcon.on('click', toggleWin);
|
||||
|
||||
let lastFavicon = null;
|
||||
global.mainWindow.webContents.on('page-favicon-updated', async function(ev, favicons) {
|
||||
if (!favicons || favicons.length <= 0 || !favicons[0].startsWith('data:')) {
|
||||
if (lastFavicon !== null) {
|
||||
win.setIcon(defaultIcon);
|
||||
trayIcon.setImage(defaultIcon);
|
||||
lastFavicon = null;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// No need to change, shortcut
|
||||
if (favicons[0] === lastFavicon) return;
|
||||
lastFavicon = favicons[0];
|
||||
|
||||
let newFavicon = nativeImage.createFromDataURL(favicons[0]);
|
||||
|
||||
// Windows likes ico's too much.
|
||||
if (process.platform === 'win32') {
|
||||
try {
|
||||
const icoPath = path.join(app.getPath('temp'), 'win32_riot_icon.ico');
|
||||
fs.writeFileSync(icoPath, await pngToIco(newFavicon.toPNG()));
|
||||
newFavicon = nativeImage.createFromPath(icoPath);
|
||||
} catch (e) {
|
||||
console.error("Failed to make win32 ico", e);
|
||||
}
|
||||
}
|
||||
|
||||
trayIcon.setImage(newFavicon);
|
||||
global.mainWindow.setIcon(newFavicon);
|
||||
});
|
||||
|
||||
global.mainWindow.webContents.on('page-title-updated', function(ev, title) {
|
||||
trayIcon.setToolTip(title);
|
||||
});
|
||||
};
|
||||
@@ -1,84 +0,0 @@
|
||||
const { app, autoUpdater, ipcMain } = require('electron');
|
||||
|
||||
const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
|
||||
const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
|
||||
|
||||
function installUpdate() {
|
||||
// for some reason, quitAndInstall does not fire the
|
||||
// before-quit event, so we need to set the flag here.
|
||||
global.appQuitting = true;
|
||||
autoUpdater.quitAndInstall();
|
||||
}
|
||||
|
||||
function pollForUpdates() {
|
||||
try {
|
||||
autoUpdater.checkForUpdates();
|
||||
} catch (e) {
|
||||
console.log('Couldn\'t check for update', e);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {};
|
||||
module.exports.start = function startAutoUpdate(updateBaseUrl) {
|
||||
if (updateBaseUrl.slice(-1) !== '/') {
|
||||
updateBaseUrl = updateBaseUrl + '/';
|
||||
}
|
||||
try {
|
||||
let url;
|
||||
// For reasons best known to Squirrel, the way it checks for updates
|
||||
// is completely different between macOS and windows. On macOS, it
|
||||
// hits a URL that either gives it a 200 with some json or
|
||||
// 204 No Content. On windows it takes a base path and looks for
|
||||
// files under that path.
|
||||
if (process.platform === 'darwin') {
|
||||
// include the current version in the URL we hit. Electron doesn't add
|
||||
// it anywhere (apart from the User-Agent) so it's up to us. We could
|
||||
// (and previously did) just use the User-Agent, but this doesn't
|
||||
// rely on NSURLConnection setting the User-Agent to what we expect,
|
||||
// and also acts as a convenient cache-buster to ensure that when the
|
||||
// app updates it always gets a fresh value to avoid update-looping.
|
||||
url = `${updateBaseUrl}macos/?localVersion=${encodeURIComponent(app.getVersion())}`;
|
||||
|
||||
} else if (process.platform === 'win32') {
|
||||
url = `${updateBaseUrl}win32/${process.arch}/`;
|
||||
} else {
|
||||
// Squirrel / electron only supports auto-update on these two platforms.
|
||||
// I'm not even going to try to guess which feed style they'd use if they
|
||||
// implemented it on Linux, or if it would be different again.
|
||||
console.log('Auto update not supported on this platform');
|
||||
}
|
||||
|
||||
if (url) {
|
||||
autoUpdater.setFeedURL(url);
|
||||
// We check for updates ourselves rather than using 'updater' because we need to
|
||||
// do it in the main process (and we don't really need to check every 10 minutes:
|
||||
// every hour should be just fine for a desktop app)
|
||||
// However, we still let the main window listen for the update events.
|
||||
// We also wait a short time before checking for updates the first time because
|
||||
// of squirrel on windows and it taking a small amount of time to release a
|
||||
// lock file.
|
||||
setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
|
||||
setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
|
||||
}
|
||||
} catch (err) {
|
||||
// will fail if running in debug mode
|
||||
console.log('Couldn\'t enable update checking', err);
|
||||
}
|
||||
}
|
||||
|
||||
ipcMain.on('install_update', installUpdate);
|
||||
ipcMain.on('check_updates', pollForUpdates);
|
||||
|
||||
function ipcChannelSendUpdateStatus(status) {
|
||||
if (global.mainWindow) {
|
||||
global.mainWindow.webContents.send('check_updates', status);
|
||||
}
|
||||
}
|
||||
|
||||
autoUpdater.on('update-available', function() {
|
||||
ipcChannelSendUpdateStatus(true);
|
||||
}).on('update-not-available', function() {
|
||||
ipcChannelSendUpdateStatus(false);
|
||||
}).on('error', function(error) {
|
||||
ipcChannelSendUpdateStatus(error.message);
|
||||
});
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 OpenMarket Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
const {app, shell, Menu} = require('electron');
|
||||
|
||||
// Menu template from http://electron.atom.io/docs/api/menu/, edited
|
||||
const template = [
|
||||
{
|
||||
label: '&Edit',
|
||||
submenu: [
|
||||
{ role: 'undo' },
|
||||
{ role: 'redo' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'cut' },
|
||||
{ role: 'copy' },
|
||||
{ role: 'paste' },
|
||||
{ role: 'pasteandmatchstyle' },
|
||||
{ role: 'delete' },
|
||||
{ role: 'selectall' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '&View',
|
||||
submenu: [
|
||||
{ type: 'separator' },
|
||||
{ role: 'resetzoom' },
|
||||
{ role: 'zoomin' },
|
||||
{ role: 'zoomout' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'togglefullscreen' },
|
||||
{ role: 'toggledevtools' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '&Window',
|
||||
role: 'window',
|
||||
submenu: [
|
||||
{ role: 'minimize' },
|
||||
{ role: 'close' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '&Help',
|
||||
role: 'help',
|
||||
submenu: [
|
||||
{
|
||||
label: 'riot.im',
|
||||
click() { shell.openExternal('https://riot.im/'); },
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
// macOS has specific menu conventions...
|
||||
if (process.platform === 'darwin') {
|
||||
// first macOS menu is the name of the app
|
||||
const name = app.getName();
|
||||
template.unshift({
|
||||
label: name,
|
||||
submenu: [
|
||||
{ role: 'about' },
|
||||
{ type: 'separator' },
|
||||
{
|
||||
role: 'services',
|
||||
submenu: [],
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{ role: 'hide' },
|
||||
{ role: 'hideothers' },
|
||||
{ role: 'unhide' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'quit' },
|
||||
],
|
||||
});
|
||||
// Edit menu.
|
||||
// This has a 'speech' section on macOS
|
||||
template[1].submenu.push(
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Speech',
|
||||
submenu: [
|
||||
{ role: 'startspeaking' },
|
||||
{ role: 'stopspeaking' },
|
||||
],
|
||||
});
|
||||
|
||||
// Window menu.
|
||||
// This also has specific functionality on macOS
|
||||
template[3].submenu = [
|
||||
{
|
||||
label: 'Close',
|
||||
accelerator: 'CmdOrCtrl+W',
|
||||
role: 'close',
|
||||
},
|
||||
{
|
||||
label: 'Minimize',
|
||||
accelerator: 'CmdOrCtrl+M',
|
||||
role: 'minimize',
|
||||
},
|
||||
{
|
||||
label: 'Zoom',
|
||||
role: 'zoom',
|
||||
},
|
||||
{
|
||||
type: 'separator',
|
||||
},
|
||||
{
|
||||
label: 'Bring All to Front',
|
||||
role: 'front',
|
||||
},
|
||||
];
|
||||
} else {
|
||||
template.unshift({
|
||||
label: '&File',
|
||||
submenu: [
|
||||
// For some reason, 'about' does not seem to work on windows.
|
||||
/*{
|
||||
role: 'about'
|
||||
},*/
|
||||
{ role: 'quit' },
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = Menu.buildFromTemplate(template);
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
const {clipboard, nativeImage, Menu, MenuItem, shell} = require('electron');
|
||||
const url = require('url');
|
||||
|
||||
const PERMITTED_URL_SCHEMES = [
|
||||
'http:',
|
||||
'https:',
|
||||
'mailto:',
|
||||
];
|
||||
|
||||
function safeOpenURL(target) {
|
||||
// openExternal passes the target to open/start/xdg-open,
|
||||
// so put fairly stringent limits on what can be opened
|
||||
// (for instance, open /bin/sh does indeed open a terminal
|
||||
// with a shell, albeit with no arguments)
|
||||
const parsedUrl = url.parse(target);
|
||||
if (PERMITTED_URL_SCHEMES.indexOf(parsedUrl.protocol) > -1) {
|
||||
// explicitly use the URL re-assembled by the url library,
|
||||
// so we know the url parser has understood all the parts
|
||||
// of the input string
|
||||
const newTarget = url.format(parsedUrl);
|
||||
shell.openExternal(newTarget);
|
||||
}
|
||||
}
|
||||
|
||||
function onWindowOrNavigate(ev, target) {
|
||||
// always prevent the default: if something goes wrong,
|
||||
// we don't want to end up opening it in the electron
|
||||
// app, as we could end up opening any sort of random
|
||||
// url in a window that has node scripting access.
|
||||
ev.preventDefault();
|
||||
safeOpenURL(target);
|
||||
}
|
||||
|
||||
function onLinkContextMenu(ev, params) {
|
||||
const url = params.linkURL || params.srcURL;
|
||||
|
||||
const popupMenu = new Menu();
|
||||
popupMenu.append(new MenuItem({
|
||||
label: url,
|
||||
click() {
|
||||
safeOpenURL(url);
|
||||
},
|
||||
}));
|
||||
|
||||
if (params.mediaType && params.mediaType === 'image' && !url.startsWith('file://')) {
|
||||
popupMenu.append(new MenuItem({
|
||||
label: 'Copy Image',
|
||||
click() {
|
||||
if (url.startsWith('data:')) {
|
||||
clipboard.writeImage(nativeImage.createFromDataURL(url));
|
||||
} else {
|
||||
ev.sender.copyImageAt(params.x, params.y);
|
||||
}
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
popupMenu.append(new MenuItem({
|
||||
label: 'Copy Link Address',
|
||||
click() {
|
||||
clipboard.writeText(url);
|
||||
},
|
||||
}));
|
||||
popupMenu.popup();
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
function _CutCopyPasteSelectContextMenus(params) {
|
||||
return [{
|
||||
role: 'cut',
|
||||
enabled: params.editFlags.canCut,
|
||||
}, {
|
||||
role: 'copy',
|
||||
enabled: params.editFlags.canCopy,
|
||||
}, {
|
||||
role: 'paste',
|
||||
enabled: params.editFlags.canPaste,
|
||||
}, {
|
||||
role: 'pasteandmatchstyle',
|
||||
enabled: params.editFlags.canPaste,
|
||||
}, {
|
||||
role: 'selectall',
|
||||
enabled: params.editFlags.canSelectAll,
|
||||
}];
|
||||
}
|
||||
|
||||
function onSelectedContextMenu(ev, params) {
|
||||
const items = _CutCopyPasteSelectContextMenus(params);
|
||||
const popupMenu = Menu.buildFromTemplate(items);
|
||||
|
||||
popupMenu.popup();
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
function onEditableContextMenu(ev, params) {
|
||||
const items = [
|
||||
{ role: 'undo' },
|
||||
{ role: 'redo', enabled: params.editFlags.canRedo },
|
||||
{ type: 'separator' },
|
||||
].concat(_CutCopyPasteSelectContextMenus(params));
|
||||
|
||||
const popupMenu = Menu.buildFromTemplate(items);
|
||||
|
||||
popupMenu.popup();
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
|
||||
module.exports = (webContents) => {
|
||||
webContents.on('new-window', onWindowOrNavigate);
|
||||
webContents.on('will-navigate', onWindowOrNavigate);
|
||||
|
||||
webContents.on('context-menu', function(ev, params) {
|
||||
if (params.linkURL || params.srcURL) {
|
||||
onLinkContextMenu(ev, params);
|
||||
} else if (params.selectionText) {
|
||||
onSelectedContextMenu(ev, params);
|
||||
} else if (params.isEditable) {
|
||||
onEditableContextMenu(ev, params);
|
||||
}
|
||||
});
|
||||
};
|
||||
171
karma.conf.js
@@ -1,171 +0,0 @@
|
||||
// karma.conf.js - the config file for karma, which runs our tests.
|
||||
|
||||
var path = require('path');
|
||||
var webpack = require('webpack');
|
||||
var webpack_config = require('./webpack.config');
|
||||
|
||||
/*
|
||||
* We use webpack to build our tests. It's a pain to have to wait for webpack
|
||||
* to build everything; however it's the easiest way to load our dependencies
|
||||
* from node_modules.
|
||||
*
|
||||
* If you run karma in multi-run mode (with `npm run test-multi`), it will watch
|
||||
* the tests for changes, and webpack will rebuild using a cache. This is much quicker
|
||||
* than a clean rebuild.
|
||||
*/
|
||||
|
||||
// the name of the test file. By default, a special file which runs all tests.
|
||||
var testFile = process.env.KARMA_TEST_FILE || 'test/all-tests.js';
|
||||
|
||||
process.env.PHANTOMJS_BIN = 'node_modules/.bin/phantomjs';
|
||||
process.env.Q_DEBUG = 1;
|
||||
|
||||
/* the webpack config is based on the real one, to (a) try to simulate the
|
||||
* deployed environment as closely as possible, and (b) to avoid a shedload of
|
||||
* cut-and-paste.
|
||||
*/
|
||||
|
||||
// find out if we're shipping olm, and where it is, if so.
|
||||
const olm_entry = webpack_config.entry['olm'];
|
||||
|
||||
// remove the default entries - karma provides its own (via the 'files' and
|
||||
// 'preprocessors' config below)
|
||||
delete webpack_config['entry'];
|
||||
|
||||
// add ./test as a search path for js
|
||||
webpack_config.module.loaders.unshift({
|
||||
test: /\.js$/, loader: "babel",
|
||||
include: [path.resolve('./src'), path.resolve('./test')],
|
||||
});
|
||||
|
||||
// disable parsing for sinon, because it
|
||||
// tries to do voodoo with 'require' which upsets
|
||||
// webpack (https://github.com/webpack/webpack/issues/304)
|
||||
webpack_config.module.noParse.push(/sinon\/pkg\/sinon\.js$/);
|
||||
|
||||
// ?
|
||||
webpack_config.resolve.alias['sinon'] = 'sinon/pkg/sinon.js';
|
||||
|
||||
webpack_config.resolve.root = [
|
||||
path.resolve('./test'),
|
||||
];
|
||||
|
||||
webpack_config.devtool = 'inline-source-map';
|
||||
|
||||
module.exports = function (config) {
|
||||
const myconfig = {
|
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['mocha'],
|
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [
|
||||
'node_modules/babel-polyfill/browser.js',
|
||||
testFile,
|
||||
|
||||
// make the images available via our httpd. They will be avaliable
|
||||
// below http://localhost:[PORT]/base/. See also `proxies` which
|
||||
// defines alternative URLs for them.
|
||||
//
|
||||
// This isn't required by any of the tests, but it stops karma
|
||||
// logging warnings when it serves a 404 for them.
|
||||
{
|
||||
pattern: 'src/skins/vector/img/*',
|
||||
watched: false, included: false, served: true, nocache: false,
|
||||
},
|
||||
],
|
||||
|
||||
proxies: {
|
||||
// redirect img links to the karma server. See above.
|
||||
"/img/": "/base/src/skins/vector/img/",
|
||||
},
|
||||
|
||||
// preprocess matching files before serving them to the browser
|
||||
// available preprocessors:
|
||||
// https://npmjs.org/browse/keyword/karma-preprocessor
|
||||
preprocessors: {
|
||||
'{src,test}/**/*.js': ['webpack', 'sourcemap'],
|
||||
},
|
||||
|
||||
// test results reporter to use
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['logcapture', 'spec', 'junit', 'summary'],
|
||||
|
||||
specReporter: {
|
||||
suppressErrorSummary: false, // do print error summary
|
||||
suppressFailed: false, // do print information about failed tests
|
||||
suppressPassed: false, // do print information about passed tests
|
||||
showSpecTiming: true, // print the time elapsed for each spec
|
||||
},
|
||||
|
||||
client: {
|
||||
captureLogs: true,
|
||||
},
|
||||
|
||||
// web server port
|
||||
port: 9876,
|
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true,
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR ||
|
||||
// config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO,
|
||||
|
||||
// enable / disable watching file and executing tests whenever any file
|
||||
// changes
|
||||
autoWatch: true,
|
||||
|
||||
// start these browsers
|
||||
// available browser launchers:
|
||||
// https://npmjs.org/browse/keyword/karma-launcher
|
||||
browsers: [
|
||||
'Chrome',
|
||||
//'PhantomJS',
|
||||
//'ChromeHeadless'
|
||||
],
|
||||
|
||||
customLaunchers: {
|
||||
'ChromeHeadless': {
|
||||
base: 'Chrome',
|
||||
flags: [
|
||||
// '--no-sandbox',
|
||||
// See https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
|
||||
'--headless',
|
||||
'--disable-gpu',
|
||||
// Without a remote debugging port, Google Chrome exits immediately.
|
||||
'--remote-debugging-port=9222',
|
||||
],
|
||||
}
|
||||
},
|
||||
|
||||
// Continuous Integration mode
|
||||
// if true, Karma captures browsers, runs the tests and exits
|
||||
// singleRun: false,
|
||||
|
||||
// Concurrency level
|
||||
// how many browser should be started simultaneous
|
||||
concurrency: Infinity,
|
||||
|
||||
junitReporter: {
|
||||
outputDir: 'karma-reports',
|
||||
},
|
||||
|
||||
webpack: webpack_config,
|
||||
|
||||
webpackMiddleware: {
|
||||
stats: {
|
||||
// don't fill the console up with a mahoosive list of modules
|
||||
chunks: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// include the olm loader if we have it.
|
||||
if (olm_entry) {
|
||||
myconfig.files.unshift(olm_entry);
|
||||
}
|
||||
|
||||
config.set(myconfig);
|
||||
};
|
||||
9512
package-lock.json
generated
273
package.json
@@ -1,8 +1,7 @@
|
||||
{
|
||||
"name": "riot-web",
|
||||
"productName": "Riot",
|
||||
"main": "electron_app/src/electron-main.js",
|
||||
"version": "0.14.0",
|
||||
"version": "1.6.0",
|
||||
"description": "A feature-rich client for Matrix.org",
|
||||
"author": "New Vector Ltd.",
|
||||
"repository": {
|
||||
@@ -11,176 +10,162 @@
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"files": [
|
||||
"AUTHORS.rst",
|
||||
"CONTRIBUTING.rst",
|
||||
"deploy",
|
||||
"docs",
|
||||
"karma.conf.js",
|
||||
"lib",
|
||||
"release.sh",
|
||||
"scripts",
|
||||
"res",
|
||||
"src",
|
||||
"test",
|
||||
"webpack.config.js"
|
||||
"webpack.config.js",
|
||||
"scripts",
|
||||
"docs",
|
||||
"release.sh",
|
||||
"deploy",
|
||||
"CHANGELOG.md",
|
||||
"CONTRIBUTING.rst",
|
||||
"LICENSE",
|
||||
"README.md",
|
||||
"AUTHORS.rst",
|
||||
"package.json",
|
||||
"contribute.json"
|
||||
],
|
||||
"style": "bundle.css",
|
||||
"matrix-react-parent": "matrix-react-sdk",
|
||||
"scripts": {
|
||||
"reskindex": "reskindex -h src/header",
|
||||
"reskindex:watch": "reskindex -h src/header -w",
|
||||
"i18n": "matrix-gen-i18n",
|
||||
"prunei18n": "matrix-prune-i18n",
|
||||
"diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && yarn i18n && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json",
|
||||
"reskindex": "reskindex -h src/header",
|
||||
"reskindex:watch": "reskindex -h src/header -w",
|
||||
"reskindex:watch-react": "node scripts/yarn-sub.js matrix-react-sdk reskindex:watch",
|
||||
"clean": "rimraf lib webapp",
|
||||
"build": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle",
|
||||
"build-stats": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle-stats",
|
||||
"build:jitsi": "node scripts/build-jitsi.js",
|
||||
"build:res": "node scripts/copy-res.js",
|
||||
"build:genfiles": "yarn reskindex && yarn build:res && yarn build:jitsi",
|
||||
"build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
|
||||
"build:compile": "npm run reskindex && babel --source-maps -d lib src",
|
||||
"build:bundle": "cross-env NODE_ENV=production webpack -p --progress --bail",
|
||||
"build:bundle:dev": "webpack --optimize-occurence-order --progress --bail",
|
||||
"build:electron": "npm run clean && npm run build && npm run install:electron && build -wml --ia32 --x64",
|
||||
"build": "npm run reskindex && npm run build:res && npm run build:bundle",
|
||||
"build:dev": "npm run reskindex && npm run build:res && npm run build:bundle:dev",
|
||||
"build:compile": "babel -d lib --verbose --extensions \".ts,.js,.tsx\" src",
|
||||
"build:bundle": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production",
|
||||
"build:bundle-stats": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production --json > webpack-stats.json",
|
||||
"build:types": "tsc --emitDeclarationOnly --jsx react",
|
||||
"dist": "scripts/package.sh",
|
||||
"install:electron": "install-app-deps",
|
||||
"electron": "npm run install:electron && electron .",
|
||||
"start:res": "node scripts/copy-res.js -w",
|
||||
"start:js": "webpack-dev-server --output-filename=bundles/_dev_/[name].js --output-chunk-file=bundles/_dev_/[name].js -w --progress",
|
||||
"start:js:prod": "cross-env NODE_ENV=production webpack-dev-server -w --progress",
|
||||
"start": "parallelshell \"npm run reskindex:watch\" \"npm run start:res\" \"npm run start:js\"",
|
||||
"start:prod": "parallelshell \"npm run reskindex:watch\" \"npm run start:res\" \"npm run start:js:prod\"",
|
||||
"lint": "eslint src/",
|
||||
"lintall": "eslint src/ test/",
|
||||
"clean": "rimraf lib webapp electron_app/dist",
|
||||
"prepublish": "npm run clean && npm run build:compile",
|
||||
"test": "karma start --single-run=true --autoWatch=false --browsers ChromeHeadless",
|
||||
"test-multi": "karma start"
|
||||
"start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,riot-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"",
|
||||
"start:res": "yarn build:jitsi && node scripts/copy-res.js -w",
|
||||
"start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development",
|
||||
"lint": "yarn lint:types && yarn lint:ts && yarn lint:js && yarn lint:style",
|
||||
"lint:js": "eslint src",
|
||||
"lint:ts": "echo 'We don't actually have a typescript linter at this layer because tslint is being removed from our stack. Presumably your TS is fine.'",
|
||||
"lint:types": "tsc --noEmit --jsx react",
|
||||
"lint:style": "stylelint 'res/css/**/*.scss'",
|
||||
"test": "jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"babel-polyfill": "^6.5.0",
|
||||
"babel-runtime": "^6.11.6",
|
||||
"bluebird": "^3.5.0",
|
||||
"browser-request": "^0.3.3",
|
||||
"classnames": "^2.1.2",
|
||||
"draft-js": "^0.11.0-alpha",
|
||||
"extract-text-webpack-plugin": "^0.9.1",
|
||||
"favico.js": "^0.3.10",
|
||||
"filesize": "3.5.6",
|
||||
"flux": "2.1.1",
|
||||
"gemini-scrollbar": "matrix-org/gemini-scrollbar#b302279",
|
||||
"gfm.css": "^1.1.1",
|
||||
"highlight.js": "^9.0.0",
|
||||
"linkifyjs": "^2.1.3",
|
||||
"matrix-js-sdk": "0.10.0",
|
||||
"matrix-react-sdk": "0.12.1",
|
||||
"modernizr": "^3.1.0",
|
||||
"pako": "^1.0.5",
|
||||
"prop-types": "^15.5.10",
|
||||
"react": "^15.6.0",
|
||||
"react-beautiful-dnd": "^4.0.1",
|
||||
"react-dom": "^15.6.0",
|
||||
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
|
||||
"sanitize-html": "^1.11.1",
|
||||
"text-encoding-utf-8": "^1.0.1",
|
||||
"ua-parser-js": "^0.7.10",
|
||||
"url": "^0.11.0",
|
||||
"velocity-vector": "vector-im/velocity#059e3b2"
|
||||
"gfm.css": "^1.1.2",
|
||||
"highlight.js": "^9.13.1",
|
||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
||||
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop",
|
||||
"olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz",
|
||||
"postcss-easings": "^2.0.0",
|
||||
"prop-types": "^15.7.2",
|
||||
"react": "^16.9.0",
|
||||
"react-dom": "^16.9.0",
|
||||
"sanitize-html": "^1.19.1",
|
||||
"ua-parser-js": "^0.7.19",
|
||||
"url": "^0.11.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^6.6.0",
|
||||
"babel-cli": "^6.5.2",
|
||||
"babel-core": "^6.14.0",
|
||||
"babel-eslint": "^6.1.0",
|
||||
"babel-loader": "^6.2.5",
|
||||
"babel-plugin-add-module-exports": "^0.2.1",
|
||||
"babel-plugin-transform-async-to-bluebird": "^1.1.1",
|
||||
"babel-plugin-transform-class-properties": "^6.16.0",
|
||||
"babel-plugin-transform-object-rest-spread": "^6.16.0",
|
||||
"babel-plugin-transform-runtime": "^6.15.0",
|
||||
"babel-preset-es2015": "^6.16.0",
|
||||
"babel-preset-es2016": "^6.16.0",
|
||||
"babel-preset-es2017": "^6.16.0",
|
||||
"babel-preset-react": "^6.16.0",
|
||||
"babel-preset-stage-2": "^6.17.0",
|
||||
"chokidar": "^1.6.1",
|
||||
"@babel/cli": "^7.7.5",
|
||||
"@babel/core": "^7.7.5",
|
||||
"@babel/plugin-proposal-class-properties": "^7.7.4",
|
||||
"@babel/plugin-proposal-decorators": "^7.7.4",
|
||||
"@babel/plugin-proposal-export-default-from": "^7.7.4",
|
||||
"@babel/plugin-proposal-numeric-separator": "^7.7.4",
|
||||
"@babel/plugin-proposal-object-rest-spread": "^7.7.4",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.7.4",
|
||||
"@babel/plugin-transform-flow-comments": "^7.7.4",
|
||||
"@babel/plugin-transform-runtime": "^7.7.6",
|
||||
"@babel/preset-env": "^7.7.6",
|
||||
"@babel/preset-flow": "^7.7.4",
|
||||
"@babel/preset-react": "^7.7.4",
|
||||
"@babel/preset-typescript": "^7.7.4",
|
||||
"@babel/register": "^7.7.4",
|
||||
"@babel/runtime": "^7.7.6",
|
||||
"@types/modernizr": "^3.5.3",
|
||||
"@types/react": "16.9",
|
||||
"@types/react-dom": "^16.9.4",
|
||||
"autoprefixer": "^9.7.3",
|
||||
"babel-eslint": "^10.0.3",
|
||||
"babel-jest": "^24.9.0",
|
||||
"babel-loader": "^8.0.6",
|
||||
"canvas": "^2.6.1",
|
||||
"chokidar": "^3.3.1",
|
||||
"concurrently": "^4.0.1",
|
||||
"cpx": "^1.3.2",
|
||||
"cross-env": "^4.0.0",
|
||||
"css-raw-loader": "^0.1.1",
|
||||
"electron-builder": "^11.2.4",
|
||||
"electron-builder-squirrel-windows": "^11.2.1",
|
||||
"electron-devtools-installer": "^2.2.0",
|
||||
"emojione": "^2.2.7",
|
||||
"eslint": "^3.14.0",
|
||||
"cross-env": "^6.0.3",
|
||||
"css-loader": "^3.3.2",
|
||||
"eslint": "^5.8.0",
|
||||
"eslint-config-google": "^0.7.1",
|
||||
"eslint-plugin-babel": "^4.1.1",
|
||||
"eslint-plugin-flowtype": "^2.30.0",
|
||||
"eslint-plugin-react": "^7.4.0",
|
||||
"expect": "^1.16.0",
|
||||
"eslint-plugin-babel": "^4.1.2",
|
||||
"eslint-plugin-flowtype": "^2.50.3",
|
||||
"eslint-plugin-jest": "^23.0.4",
|
||||
"eslint-plugin-react": "^7.11.1",
|
||||
"eslint-plugin-react-hooks": "^2.2.0",
|
||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||
"fake-indexeddb": "^3.0.0",
|
||||
"file-loader": "^5.0.2",
|
||||
"fs-extra": "^0.30.0",
|
||||
"html-webpack-plugin": "^2.24.0",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"jest": "^24.9.0",
|
||||
"jest-environment-jsdom-fourteen": "^1.0.1",
|
||||
"json-loader": "^0.5.3",
|
||||
"karma": "^1.7.0",
|
||||
"karma-chrome-launcher": "^0.2.3",
|
||||
"karma-cli": "^0.1.2",
|
||||
"karma-junit-reporter": "^0.4.1",
|
||||
"karma-logcapture-reporter": "0.0.1",
|
||||
"karma-mocha": "^0.2.2",
|
||||
"karma-sourcemap-loader": "^0.3.7",
|
||||
"karma-spec-reporter": "0.0.31",
|
||||
"karma-summary-reporter": "^1.3.3",
|
||||
"karma-webpack": "^1.7.0",
|
||||
"matrix-mock-request": "^1.2.0",
|
||||
"matrix-react-test-utils": "^0.2.0",
|
||||
"loader-utils": "^1.2.3",
|
||||
"matrix-mock-request": "^1.2.3",
|
||||
"matrix-react-test-utils": "^0.2.2",
|
||||
"mini-css-extract-plugin": "^0.8.0",
|
||||
"minimist": "^1.2.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mocha": "^2.4.5",
|
||||
"parallelshell": "^3.0.2",
|
||||
"modernizr": "^3.6.0",
|
||||
"node-fetch": "^2.6.0",
|
||||
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
||||
"postcss-extend": "^1.0.5",
|
||||
"postcss-import": "^9.0.0",
|
||||
"postcss-loader": "^1.2.2",
|
||||
"postcss-mixins": "^5.4.1",
|
||||
"postcss-nested": "^1.0.0",
|
||||
"postcss-scss": "^0.4.0",
|
||||
"postcss-simple-vars": "^3.0.0",
|
||||
"postcss-hexrgba": "^2.0.0",
|
||||
"postcss-import": "^12.0.1",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"postcss-mixins": "^6.2.3",
|
||||
"postcss-nested": "^4.2.1",
|
||||
"postcss-preset-env": "^6.7.0",
|
||||
"postcss-scss": "^2.0.0",
|
||||
"postcss-simple-vars": "^5.0.2",
|
||||
"postcss-strip-inline-comments": "^0.1.5",
|
||||
"react-addons-perf": "^15.4.0",
|
||||
"react-addons-test-utils": "^15.6.0",
|
||||
"rimraf": "^2.4.3",
|
||||
"source-map-loader": "^0.1.5",
|
||||
"webpack": "^1.12.14",
|
||||
"webpack-dev-server": "^1.16.2"
|
||||
"shell-escape": "^0.2.0",
|
||||
"stylelint": "^12.0.1",
|
||||
"terser-webpack-plugin": "^2.3.0",
|
||||
"typescript": "^3.7.3",
|
||||
"webpack": "^4.41.2",
|
||||
"webpack-cli": "^3.3.10",
|
||||
"webpack-dev-server": "^3.9.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"olm": "https://matrix.org/packages/npm/olm/olm-2.2.1.tgz"
|
||||
},
|
||||
"build": {
|
||||
"appId": "im.riot.app",
|
||||
"category": "Network",
|
||||
"electronVersion": "1.8.3",
|
||||
"//asar=false": "https://github.com/electron-userland/electron-builder/issues/675",
|
||||
"asar": false,
|
||||
"dereference": true,
|
||||
"//files": "We bundle everything, so we only need to include webapp/",
|
||||
"files": [
|
||||
"node_modules/**",
|
||||
"src/**",
|
||||
"img/**"
|
||||
"jest": {
|
||||
"testEnvironment": "jest-environment-jsdom-fourteen",
|
||||
"testMatch": [
|
||||
"<rootDir>/test/**/*-test.js"
|
||||
],
|
||||
"extraResources": [
|
||||
"webapp/**/*"
|
||||
"setupFilesAfterEnv": [
|
||||
"<rootDir>/node_modules/matrix-react-sdk/test/setupTests.js"
|
||||
],
|
||||
"linux": {
|
||||
"target": "deb",
|
||||
"category": "Network;InstantMessaging;Chat",
|
||||
"maintainer": "support@riot.im",
|
||||
"desktop": {
|
||||
"StartupWMClass": "riot"
|
||||
}
|
||||
"moduleNameMapper": {
|
||||
"\\.(css|scss)$": "<rootDir>/__mocks__/cssMock.js",
|
||||
"\\.(gif|png|svg|ttf|woff2)$": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/imageMock.js",
|
||||
"\\$webapp/i18n/languages.json": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/languages.json",
|
||||
"^browser-request$": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/browser-request.js",
|
||||
"^react$": "<rootDir>/node_modules/react",
|
||||
"^react-dom$": "<rootDir>/node_modules/react-dom",
|
||||
"^matrix-js-sdk$": "<rootDir>/node_modules/matrix-js-sdk/src",
|
||||
"^matrix-react-sdk$": "<rootDir>/node_modules/matrix-react-sdk/src"
|
||||
},
|
||||
"win": {
|
||||
"target": "squirrel"
|
||||
},
|
||||
"directories": {
|
||||
"buildResources": "electron_app/build",
|
||||
"output": "electron_app/dist",
|
||||
"app": "electron_app"
|
||||
}
|
||||
"transformIgnorePatterns": [
|
||||
"/node_modules/(?!matrix-js-sdk).+$",
|
||||
"/node_modules/(?!matrix-react-sdk).+$"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require("postcss-import")(),
|
||||
require("autoprefixer")(),
|
||||
require("postcss-simple-vars")(),
|
||||
require("postcss-extend")(),
|
||||
require("postcss-nested")(),
|
||||
require("postcss-mixins")(),
|
||||
require("postcss-strip-inline-comments")(),
|
||||
],
|
||||
"parser": "postcss-scss",
|
||||
"local-plugins": true,
|
||||
};
|
||||
59
release.sh
@@ -1,41 +1,78 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script to perform a release of vector-web.
|
||||
# Script to perform a release of riot-web.
|
||||
#
|
||||
# Requires github-changelog-generator; to install, do
|
||||
# pip install git+https://github.com/matrix-org/github-changelog-generator.git
|
||||
|
||||
set -e
|
||||
|
||||
orig_args=$@
|
||||
|
||||
# chomp any args starting with '-' as these need to go
|
||||
# through to the release script and otherwise we'll get
|
||||
# confused about what the version arg is.
|
||||
while [[ "$1" == -* ]]; do
|
||||
shift
|
||||
done
|
||||
|
||||
cd `dirname $0`
|
||||
|
||||
for i in matrix-js-sdk matrix-react-sdk
|
||||
do
|
||||
echo "Checking version of $i..."
|
||||
depver=`cat package.json | jq -r .dependencies[\"$i\"]`
|
||||
latestver=`npm show $i version`
|
||||
latestver=`yarn info -s $i dist-tags.next`
|
||||
if [ "$depver" != "$latestver" ]
|
||||
then
|
||||
echo "The latest version of $i is $latestver but package.json depends on $depver"
|
||||
echo -n "Type 'Yes' to continue anyway: "
|
||||
echo "The latest version of $i is $latestver but package.json depends on $depver."
|
||||
echo -n "Type 'u' to auto-upgrade, 'c' to continue anyway, or 'a' to abort:"
|
||||
read resp
|
||||
if [ "$resp" != "Yes" ]
|
||||
if [ "$resp" != "u" ] && [ "$resp" != "c" ]
|
||||
then
|
||||
echo "OK, never mind."
|
||||
echo "Aborting."
|
||||
exit 1
|
||||
fi
|
||||
if [ "$resp" == "u" ]
|
||||
then
|
||||
echo "Upgrading $i to $latestver..."
|
||||
yarn add -E $i@$latestver
|
||||
git add -u
|
||||
# The `-e` flag opens the editor and gives you a chance to check
|
||||
# the upgrade for correctness.
|
||||
git commit -m "Upgrade $i to $latestver" -e
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# bump Electron's package.json first
|
||||
release="${1#v}"
|
||||
tag="v${release}"
|
||||
echo "electron npm version"
|
||||
prerelease=0
|
||||
# We check if this build is a prerelease by looking to
|
||||
# see if the version has a hyphen in it. Crude,
|
||||
# but semver doesn't support postreleases so anything
|
||||
# with a hyphen is a prerelease.
|
||||
echo $release | grep -q '-' && prerelease=1
|
||||
|
||||
# bump Electron's package.json first
|
||||
echo "electron yarn version"
|
||||
cd electron_app
|
||||
npm version --no-git-tag-version "$release"
|
||||
yarn version --no-git-tag-version --new-version "$release"
|
||||
git commit package.json -m "$tag"
|
||||
|
||||
|
||||
cd ..
|
||||
|
||||
exec ./node_modules/matrix-js-sdk/release.sh -z "$@"
|
||||
./node_modules/matrix-js-sdk/release.sh -u vector-im -z "$orig_args"
|
||||
|
||||
if [ $prerelease -eq 0 ]
|
||||
then
|
||||
# For a release, reset SDK deps back to the `develop` branch.
|
||||
for i in matrix-js-sdk matrix-react-sdk
|
||||
do
|
||||
echo "Resetting $i to develop branch..."
|
||||
yarn add github:matrix-org/$i#develop
|
||||
git add -u
|
||||
git commit -m "Reset $i back to develop branch"
|
||||
done
|
||||
git push origin develop
|
||||
fi
|
||||
|
||||
@@ -1 +1 @@
|
||||
signing_id: packages@riot.im
|
||||
signing_id: releases@riot.im
|
||||
|
||||
101
res/css/structures/ErrorView.scss
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// import font-size variables manually, ideally this scss would get loaded by the theme which has all variables in context
|
||||
@import "../../../node_modules/matrix-react-sdk/res/css/_font-sizes.scss";
|
||||
|
||||
.mx_ErrorView {
|
||||
background: #c5e0f7;
|
||||
background: -moz-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: -webkit-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: linear-gradient(to bottom, #c5e0f7 0%, #ffffff 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c5e0f7', endColorstr='#ffffff',GradientType=0 );
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
width: 100%;
|
||||
min-height: 100%;
|
||||
height: auto;
|
||||
color: #000;
|
||||
|
||||
.mx_ErrorView_container {
|
||||
max-width: 680px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.mx_Button {
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
font-size: $font-18px;
|
||||
margin-left: 4px;
|
||||
margin-right: 4px;
|
||||
min-width: 80px;
|
||||
background-color: #03B381;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
padding: 12px 22px;
|
||||
word-break: break-word;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.mx_Center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mx_HomePage_header {
|
||||
color: #2E2F32;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
font-size: $font-16px;
|
||||
h1 {
|
||||
font-size: $font-32px;
|
||||
}
|
||||
h2 {
|
||||
font-size: $font-24px;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.mx_HomePage_col {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.mx_HomePage_row {
|
||||
flex: 1 1 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.mx_HomePage_logo {
|
||||
margin: auto 20px auto 0;
|
||||
}
|
||||
|
||||
h1, h2 {
|
||||
font-weight: 600;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.mx_Spacer {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.mx_FooterLink {
|
||||
color: #368BD6;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
107
res/decoder-ring/datatypes.js
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Quick-n-dirty algebraic datatypes.
|
||||
*
|
||||
* These let us handle the possibility of failure without having to constantly write code to check for it.
|
||||
* We can apply all of the transformations we need as if the data is present using `map`.
|
||||
* If there's a None, or a FetchError, or a Pending, those are left untouched.
|
||||
*
|
||||
* I've used perhaps an odd bit of terminology from scalaz in `fold`. This is basically a `switch` statement:
|
||||
* You pass it a set of functions to handle the various different states of the datatype, and if it finds the
|
||||
* function it'll call it on its value.
|
||||
*
|
||||
* It's handy to have this in functional style when dealing with React as we can dispatch different ways of rendering
|
||||
* really simply:
|
||||
* ```
|
||||
* bundleFetchStatus.fold({
|
||||
* some: (fetchStatus) => <ProgressBar fetchsStatus={fetchStatus} />,
|
||||
* }),
|
||||
* ```
|
||||
*/
|
||||
|
||||
|
||||
class Optional {
|
||||
static from(value) {
|
||||
return value && Some.of(value) || None;
|
||||
}
|
||||
map(f) {
|
||||
return this;
|
||||
}
|
||||
flatMap(f) {
|
||||
return this;
|
||||
}
|
||||
fold({ none }) {
|
||||
return none && none();
|
||||
}
|
||||
}
|
||||
class Some extends Optional {
|
||||
constructor(value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
map(f) {
|
||||
return Some.of(f(this.value));
|
||||
}
|
||||
flatMap(f) {
|
||||
return f(this.value);
|
||||
}
|
||||
fold({ some }) {
|
||||
return some && some(this.value);
|
||||
}
|
||||
static of(value) {
|
||||
return new Some(value);
|
||||
}
|
||||
}
|
||||
const None = new Optional();
|
||||
|
||||
class FetchStatus {
|
||||
constructor(opt = {}) {
|
||||
this.opt = { at: Date.now(), ...opt };
|
||||
}
|
||||
map(f) {
|
||||
return this;
|
||||
}
|
||||
flatMap(f) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
class Success extends FetchStatus {
|
||||
static of(value) {
|
||||
return new Success(value);
|
||||
}
|
||||
constructor(value, opt) {
|
||||
super(opt);
|
||||
this.value = value;
|
||||
}
|
||||
map(f) {
|
||||
return new Success(f(this.value), this.opt);
|
||||
}
|
||||
flatMap(f) {
|
||||
return f(this.value, this.opt);
|
||||
}
|
||||
fold({ success }) {
|
||||
return success instanceof Function ? success(this.value, this.opt) : undefined;
|
||||
}
|
||||
}
|
||||
class Pending extends FetchStatus {
|
||||
static of(opt) {
|
||||
return new Pending(opt);
|
||||
}
|
||||
constructor(opt) {
|
||||
super(opt);
|
||||
}
|
||||
fold({ pending }) {
|
||||
return pending instanceof Function ? pending(this.opt) : undefined;
|
||||
}
|
||||
}
|
||||
class FetchError extends FetchStatus {
|
||||
static of(reason, opt) {
|
||||
return new FetchError(reason, opt);
|
||||
}
|
||||
constructor(reason, opt) {
|
||||
super(opt);
|
||||
this.reason = reason;
|
||||
}
|
||||
fold({ error }) {
|
||||
return error instanceof Function ? error(this.reason, this.opt) : undefined;
|
||||
}
|
||||
}
|
||||
319
res/decoder-ring/decoder.js
Normal file
@@ -0,0 +1,319 @@
|
||||
class StartupError extends Error {}
|
||||
|
||||
/*
|
||||
* We need to know the bundle path before we can fetch the sourcemap files. In a production environment, we can guess
|
||||
* it using this.
|
||||
*/
|
||||
async function getBundleName() {
|
||||
const res = await fetch("../index.html");
|
||||
if (!res.ok) {
|
||||
throw new StartupError(`Couldn't fetch index.html to prefill bundle; ${res.status} ${res.statusText}`);
|
||||
}
|
||||
const index = await res.text();
|
||||
return index.split("\n").map((line) =>
|
||||
line.match(/<script src="bundles\/([^/]+)\/bundle.js"/),
|
||||
)
|
||||
.filter((result) => result)
|
||||
.map((result) => result[1])[0];
|
||||
}
|
||||
|
||||
function validateBundle(value) {
|
||||
return value.match(/^[0-9a-f]{20}$/) ? Some.of(value) : None;
|
||||
}
|
||||
|
||||
/* A custom fetcher that abandons immediately upon getting a response.
|
||||
* The purpose of this is just to validate that the user entered a real bundle, and provide feedback.
|
||||
*/
|
||||
const bundleCache = new Map();
|
||||
function bundleSubject(bundle) {
|
||||
if (!bundle.match(/^[0-9a-f]{20}$/)) throw new Error("Bad input");
|
||||
if (bundleCache.has(bundle)) {
|
||||
return bundleCache.get(bundle);
|
||||
}
|
||||
const fetcher = new rxjs.BehaviorSubject(Pending.of());
|
||||
bundleCache.set(bundle, fetcher);
|
||||
|
||||
fetch(`/bundles/${bundle}/bundle.js.map`).then((res) => {
|
||||
res.body.cancel(); /* Bail on the download immediately - it could be big! */
|
||||
const status = res.ok;
|
||||
if (status) {
|
||||
fetcher.next(Success.of());
|
||||
} else {
|
||||
fetcher.next(FetchError.of(`Failed to fetch: ${res.status} ${res.statusText}`));
|
||||
}
|
||||
});
|
||||
|
||||
return fetcher;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a ReadableStream of bytes into an Observable of a string
|
||||
* The observable will emit a stream of Pending objects and will concatenate
|
||||
* the number of bytes received with whatever pendingContext has been supplied.
|
||||
* Finally, it will emit a Success containing the result.
|
||||
* You'd use this on a Response.body.
|
||||
*/
|
||||
function observeReadableStream(readableStream, pendingContext = {}) {
|
||||
let bytesReceived = 0;
|
||||
let buffer = "";
|
||||
const pendingSubject = new rxjs.BehaviorSubject(Pending.of({ ...pendingContext, bytesReceived }));
|
||||
const throttledPending = pendingSubject.pipe(rxjs.operators.throttleTime(100));
|
||||
const resultObservable = new rxjs.Subject();
|
||||
const reader = readableStream.getReader();
|
||||
const utf8Decoder = new TextDecoder("utf-8");
|
||||
function readNextChunk() {
|
||||
reader.read().then(({ done, value }) => {
|
||||
if (done) {
|
||||
pendingSubject.complete();
|
||||
resultObservable.next(Success.of(buffer));
|
||||
return;
|
||||
}
|
||||
bytesReceived += value.length;
|
||||
pendingSubject.next(Pending.of({...pendingContext, bytesReceived }));
|
||||
/* string concatenation is apparently the most performant way to do this */
|
||||
buffer += utf8Decoder.decode(value);
|
||||
readNextChunk();
|
||||
});
|
||||
}
|
||||
readNextChunk();
|
||||
return rxjs.concat(throttledPending, resultObservable);
|
||||
}
|
||||
|
||||
/*
|
||||
* A wrapper which converts the browser's `fetch()` mechanism into an Observable. The Observable then provides us with
|
||||
* a stream of datatype values: first, a sequence of Pending objects that keep us up to date with the download progress,
|
||||
* finally followed by either a Success or Failure object. React then just has to render each of these appropriately.
|
||||
*/
|
||||
const fetchCache = new Map();
|
||||
function fetchAsSubject(endpoint) {
|
||||
if (fetchCache.has(endpoint)) {
|
||||
// TODO: expiry/retry logic here?
|
||||
return fetchCache.get(endpoint);
|
||||
}
|
||||
const fetcher = new rxjs.BehaviorSubject(Pending.of());
|
||||
fetchCache.set(endpoint, fetcher);
|
||||
|
||||
fetch(endpoint).then((res) => {
|
||||
if (!res.ok) {
|
||||
fetcher.next(FetchError.of(`Failed to fetch endpoint ${endpoint}: ${res.status} ${res.statusText}`));
|
||||
return;
|
||||
}
|
||||
|
||||
const contentLength = res.headers.get("content-length");
|
||||
const context = contentLength ? { length: parseInt(contentLength) } : {};
|
||||
|
||||
const streamer = observeReadableStream(res.body, context, endpoint);
|
||||
streamer.subscribe((value) => {
|
||||
fetcher.next(value);
|
||||
});
|
||||
});
|
||||
return fetcher;
|
||||
}
|
||||
|
||||
/* ===================== */
|
||||
/* ==== React stuff ==== */
|
||||
/* ===================== */
|
||||
/* Rather than importing an entire build infrastructure, for now we just use React without JSX */
|
||||
const e = React.createElement;
|
||||
|
||||
/*
|
||||
* Provides user feedback given a FetchStatus object.
|
||||
*/
|
||||
function ProgressBar({ fetchStatus }) {
|
||||
return e('span', { className: "progress "},
|
||||
fetchStatus.fold({
|
||||
pending: ({ bytesReceived, length }) => {
|
||||
if (!bytesReceived) {
|
||||
return e('span', { className: "spinner" }, "\u29b5");
|
||||
}
|
||||
const kB = Math.floor(10 * bytesReceived / 1024) / 10;
|
||||
if (!length) {
|
||||
return e('span', null, `Fetching (${kB}kB)`);
|
||||
}
|
||||
const percent = Math.floor(100 * bytesReceived / length);
|
||||
return e('span', null, `Fetching (${kB}kB) ${percent}%`);
|
||||
},
|
||||
success: () => e('span', null, "\u2713"),
|
||||
error: (reason) => {
|
||||
return e('span', { className: 'error'}, `\u2717 ${reason}`);
|
||||
},
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
/*
|
||||
* The main component.
|
||||
*/
|
||||
function BundlePicker() {
|
||||
const [bundle, setBundle] = React.useState("");
|
||||
const [file, setFile] = React.useState("");
|
||||
const [line, setLine] = React.useState("1");
|
||||
const [column, setColumn] = React.useState("");
|
||||
const [result, setResult] = React.useState(None);
|
||||
const [bundleFetchStatus, setBundleFetchStatus] = React.useState(None);
|
||||
const [fileFetchStatus, setFileFetchStatus] = React.useState(None);
|
||||
|
||||
/* At startup, try to fill in the bundle name for the user */
|
||||
React.useEffect(() => {
|
||||
getBundleName().then((name) => {
|
||||
if (bundle === "" && validateBundle(name) !== None) {
|
||||
setBundle(name);
|
||||
}
|
||||
}, console.log.bind(console));
|
||||
}, []);
|
||||
|
||||
|
||||
/* ------------------------- */
|
||||
/* Follow user state changes */
|
||||
/* ------------------------- */
|
||||
const onBundleChange = React.useCallback((event) => {
|
||||
const value = event.target.value;
|
||||
setBundle(value);
|
||||
}, []);
|
||||
|
||||
const onFileChange = React.useCallback((event) => {
|
||||
const value = event.target.value;
|
||||
setFile(value);
|
||||
}, []);
|
||||
|
||||
const onLineChange = React.useCallback((event) => {
|
||||
const value = event.target.value;
|
||||
setLine(value);
|
||||
}, []);
|
||||
|
||||
const onColumnChange = React.useCallback((event) => {
|
||||
const value = event.target.value;
|
||||
setColumn(value);
|
||||
}, []);
|
||||
|
||||
|
||||
/* ------------------------------------------------ */
|
||||
/* Plumb data-fetching observables through to React */
|
||||
/* ------------------------------------------------ */
|
||||
|
||||
/* Whenever a valid bundle name is input, go see if it's a real bundle on the server */
|
||||
React.useEffect(() =>
|
||||
validateBundle(bundle).fold({
|
||||
some: (value) => {
|
||||
const subscription = bundleSubject(value)
|
||||
.pipe(rxjs.operators.map(Some.of))
|
||||
.subscribe(setBundleFetchStatus);
|
||||
return () => subscription.unsubscribe();
|
||||
},
|
||||
none: () => setBundleFetchStatus(None),
|
||||
}),
|
||||
[bundle]);
|
||||
|
||||
/* Whenever a valid javascript file is input, see if it corresponds to a sourcemap file and initiate a fetch
|
||||
* if so. */
|
||||
React.useEffect(() => {
|
||||
if (!file.match(/.\.js$/) || validateBundle(bundle) === None) {
|
||||
setFileFetchStatus(None);
|
||||
return;
|
||||
}
|
||||
const observable = fetchAsSubject(`/bundles/${bundle}/${file}.map`)
|
||||
.pipe(
|
||||
rxjs.operators.map((fetchStatus) => fetchStatus.flatMap(value => {
|
||||
try {
|
||||
return Success.of(JSON.parse(value));
|
||||
} catch (e) {
|
||||
return FetchError.of(e);
|
||||
}
|
||||
})),
|
||||
rxjs.operators.map(Some.of),
|
||||
);
|
||||
const subscription = observable.subscribe(setFileFetchStatus);
|
||||
return () => subscription.unsubscribe();
|
||||
}, [bundle, file]);
|
||||
|
||||
/*
|
||||
* Whenever we have a valid fetched sourcemap, and a valid line, attempt to find the original position from the
|
||||
* sourcemap.
|
||||
*/
|
||||
React.useEffect(() => {
|
||||
// `fold` dispatches on the datatype, like a switch statement
|
||||
fileFetchStatus.fold({
|
||||
some: (fetchStatus) =>
|
||||
// `fold` just returns null for all of the cases that aren't `Success` objects here
|
||||
fetchStatus.fold({
|
||||
success: (value) => {
|
||||
if (!line) return setResult(None);
|
||||
const pLine = parseInt(line);
|
||||
const pCol = parseInt(column);
|
||||
sourceMap.SourceMapConsumer.with(value, undefined, (consumer) =>
|
||||
consumer.originalPositionFor({ line: pLine, column: pCol }),
|
||||
).then((result) => setResult(Some.of(JSON.stringify(result))));
|
||||
},
|
||||
}),
|
||||
none: () => setResult(None),
|
||||
});
|
||||
}, [fileFetchStatus, line, column]);
|
||||
|
||||
|
||||
/* ------ */
|
||||
/* Render */
|
||||
/* ------ */
|
||||
return e('div', {},
|
||||
e('div', { className: 'inputs' },
|
||||
e('div', { className: 'bundle' },
|
||||
e('label', { htmlFor: 'bundle'}, 'Bundle'),
|
||||
e('input', {
|
||||
name: 'bundle',
|
||||
required: true,
|
||||
pattern: "[0-9a-f]{20}",
|
||||
onChange: onBundleChange,
|
||||
value: bundle,
|
||||
}),
|
||||
bundleFetchStatus.fold({
|
||||
some: (fetchStatus) => e(ProgressBar, { fetchStatus }),
|
||||
none: () => null,
|
||||
}),
|
||||
),
|
||||
e('div', { className: 'file' },
|
||||
e('label', { htmlFor: 'file' }, 'File'),
|
||||
e('input', {
|
||||
name: 'file',
|
||||
required: true,
|
||||
pattern: ".+\\.js",
|
||||
onChange: onFileChange,
|
||||
value: file,
|
||||
}),
|
||||
fileFetchStatus.fold({
|
||||
some: (fetchStatus) => e(ProgressBar, { fetchStatus }),
|
||||
none: () => null,
|
||||
}),
|
||||
),
|
||||
e('div', { className: 'line' },
|
||||
e('label', { htmlFor: 'line' }, 'Line'),
|
||||
e('input', {
|
||||
name: 'line',
|
||||
required: true,
|
||||
pattern: "[0-9]+",
|
||||
onChange: onLineChange,
|
||||
value: line,
|
||||
}),
|
||||
),
|
||||
e('div', { className: 'column' },
|
||||
e('label', { htmlFor: 'column' }, 'Column'),
|
||||
e('input', {
|
||||
name: 'column',
|
||||
required: true,
|
||||
pattern: "[0-9]+",
|
||||
onChange: onColumnChange,
|
||||
value: column,
|
||||
}),
|
||||
),
|
||||
),
|
||||
e('div', null,
|
||||
result.fold({
|
||||
none: () => "Select a bundle, file and line",
|
||||
some: (value) => e('pre', null, value),
|
||||
}),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/* Global stuff */
|
||||
window.Decoder = {
|
||||
BundlePicker,
|
||||
};
|
||||
79
res/decoder-ring/index.html
Normal file
@@ -0,0 +1,79 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Rageshake decoder ring</title>
|
||||
<script crossorigin src="https://unpkg.com/source-map@0.7.3/dist/source-map.js"></script>
|
||||
<script>
|
||||
sourceMap.SourceMapConsumer.initialize({
|
||||
"lib/mappings.wasm": "https://unpkg.com/source-map@0.7.3/lib/mappings.wasm"
|
||||
});
|
||||
</script>
|
||||
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
|
||||
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
|
||||
<!--<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
|
||||
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>-->
|
||||
<script crossorigin src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>
|
||||
<script src="datatypes.js"></script>
|
||||
<script src="decoder.js"></script>
|
||||
|
||||
<style>
|
||||
@keyframes spin {
|
||||
from {transform:rotate(0deg);}
|
||||
to {transform:rotate(359deg);}
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif
|
||||
}
|
||||
|
||||
.spinner {
|
||||
animation: spin 4s infinite linear;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
.progress {
|
||||
padding-left: 0.5em;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
|
||||
.bundle input {
|
||||
width: 24ex;
|
||||
}
|
||||
|
||||
.valid::after {
|
||||
content: "✓"
|
||||
}
|
||||
|
||||
label {
|
||||
width: 3em;
|
||||
margin-right: 1em;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
input:valid {
|
||||
border: 1px solid green;
|
||||
}
|
||||
|
||||
.inputs > div {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header><h2>Decoder ring</h2></header>
|
||||
<content id="main">Waiting for javascript to run...</content>
|
||||
<script type="text/javascript">
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
try {
|
||||
ReactDOM.render(React.createElement(Decoder.BundlePicker), document.getElementById("main"))
|
||||
} catch (e) {
|
||||
const n = document.createElement("div");
|
||||
n.innerText = `Error starting: ${e.message}`;
|
||||
document.getElementById("main").appendChild(n);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
res/flags/AD.png
|
Before Width: | Height: | Size: 2.5 KiB |
BIN
res/flags/AE.png
|
Before Width: | Height: | Size: 1015 B |
BIN
res/flags/AF.png
|
Before Width: | Height: | Size: 2.5 KiB |
BIN
res/flags/AG.png
|
Before Width: | Height: | Size: 4.1 KiB |
BIN
res/flags/AI.png
|
Before Width: | Height: | Size: 4.7 KiB |
BIN
res/flags/AL.png
|
Before Width: | Height: | Size: 3.0 KiB |
BIN
res/flags/AM.png
|
Before Width: | Height: | Size: 654 B |
BIN
res/flags/AO.png
|
Before Width: | Height: | Size: 2.4 KiB |
BIN
res/flags/AQ.png
|
Before Width: | Height: | Size: 3.8 KiB |
BIN
res/flags/AR.png
|
Before Width: | Height: | Size: 1.6 KiB |
BIN
res/flags/AS.png
|
Before Width: | Height: | Size: 3.9 KiB |
BIN
res/flags/AT.png
|
Before Width: | Height: | Size: 655 B |
BIN
res/flags/AU.png
|
Before Width: | Height: | Size: 5.1 KiB |
BIN
res/flags/AW.png
|
Before Width: | Height: | Size: 1.6 KiB |
BIN
res/flags/AX.png
|
Before Width: | Height: | Size: 1.8 KiB |
BIN
res/flags/AZ.png
|
Before Width: | Height: | Size: 1.7 KiB |
BIN
res/flags/BA.png
|
Before Width: | Height: | Size: 3.0 KiB |
BIN
res/flags/BB.png
|
Before Width: | Height: | Size: 2.0 KiB |
BIN
res/flags/BD.png
|
Before Width: | Height: | Size: 2.8 KiB |
BIN
res/flags/BE.png
|
Before Width: | Height: | Size: 558 B |
BIN
res/flags/BF.png
|
Before Width: | Height: | Size: 1.6 KiB |
BIN
res/flags/BG.png
|
Before Width: | Height: | Size: 659 B |
BIN
res/flags/BH.png
|
Before Width: | Height: | Size: 1.3 KiB |
BIN
res/flags/BI.png
|
Before Width: | Height: | Size: 5.5 KiB |
BIN
res/flags/BJ.png
|
Before Width: | Height: | Size: 811 B |
BIN
res/flags/BL.png
|
Before Width: | Height: | Size: 566 B |
BIN
res/flags/BM.png
|
Before Width: | Height: | Size: 5.2 KiB |
BIN
res/flags/BN.png
|
Before Width: | Height: | Size: 5.2 KiB |
BIN
res/flags/BO.png
|
Before Width: | Height: | Size: 668 B |
BIN
res/flags/BQ.png
|
Before Width: | Height: | Size: 672 B |
BIN
res/flags/BR.png
|
Before Width: | Height: | Size: 4.7 KiB |
BIN
res/flags/BS.png
|
Before Width: | Height: | Size: 2.2 KiB |
BIN
res/flags/BT.png
|
Before Width: | Height: | Size: 4.8 KiB |
BIN
res/flags/BV.png
|
Before Width: | Height: | Size: 1.7 KiB |
BIN
res/flags/BW.png
|
Before Width: | Height: | Size: 669 B |
BIN
res/flags/BY.png
|
Before Width: | Height: | Size: 2.0 KiB |
BIN
res/flags/BZ.png
|
Before Width: | Height: | Size: 5.2 KiB |
BIN
res/flags/CA.png
|
Before Width: | Height: | Size: 2.2 KiB |