Compare commits
1679 Commits
VAOnScreen
...
test
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d98a5065ef | ||
|
|
54d8fb5d1b | ||
|
|
feef273c8c | ||
|
|
e48cd6acde | ||
|
|
8791516498 | ||
|
|
19136d475d | ||
|
|
3983aabcb2 | ||
|
|
4d6b8283ff | ||
|
|
5f5e3f4bed | ||
|
|
85591431eb | ||
|
|
4d9bae412c | ||
|
|
9fa8ee2251 | ||
|
|
5d0ef29272 | ||
|
|
36bcacd8a2 | ||
|
|
d6fc6be6d0 | ||
|
|
5869b282c4 | ||
|
|
e2f230e240 | ||
|
|
b8bb16b0ba | ||
|
|
42b2767c70 | ||
|
|
7e047125a7 | ||
|
|
058a84025c | ||
|
|
d76b8b4e14 | ||
|
|
58a8136479 | ||
|
|
c7f18dd7ae | ||
|
|
235969ccda | ||
|
|
fe06c09336 | ||
|
|
01d3824514 | ||
|
|
39e91dae7b | ||
|
|
8d7d59bb4e | ||
|
|
ed33d19648 | ||
|
|
6600d8dee8 | ||
|
|
7fed3d0625 | ||
|
|
9efce15f51 | ||
|
|
4acca5591c | ||
|
|
da7f91bab3 | ||
|
|
bb3caa04c4 | ||
|
|
e18f27675d | ||
|
|
1380dcb43a | ||
|
|
a8be6db8aa | ||
|
|
cee45ffef5 | ||
|
|
e24310bdb7 | ||
|
|
39e8527c59 | ||
|
|
76bd0bb5dd | ||
|
|
4b9e7dda5f | ||
|
|
73b44d574b | ||
|
|
f778641be6 | ||
|
|
75723d666e | ||
|
|
272b044157 | ||
|
|
10bc17963a | ||
|
|
35c24b0380 | ||
|
|
3e09686cf6 | ||
|
|
aca01b859f | ||
|
|
344651dfc1 | ||
|
|
4a2eb72f0a | ||
|
|
eb1763a6c1 | ||
|
|
e276c71461 | ||
|
|
2bf4eba44d | ||
|
|
9e2d7ecf08 | ||
|
|
058b61908f | ||
|
|
5a6bfcc900 | ||
|
|
ec0d5ddf5a | ||
|
|
7204957749 | ||
|
|
8c4345924f | ||
|
|
ed609a4690 | ||
|
|
b29b26ef0e | ||
|
|
d6f01bef98 | ||
|
|
bfb17795a6 | ||
|
|
dc5c6ac557 | ||
|
|
6416b0f749 | ||
|
|
a094036d07 | ||
|
|
8c69e6add1 | ||
|
|
78decc697e | ||
|
|
5c846ec400 | ||
|
|
b13b145d16 | ||
|
|
c2542e7dab | ||
|
|
422a03a2e8 | ||
|
|
e09513d50e | ||
|
|
e159e81c2d | ||
|
|
a113d09775 | ||
|
|
25aa048c4a | ||
|
|
207bf31058 | ||
|
|
f9daeceeca | ||
|
|
b47a5fd5f6 | ||
|
|
88c35f81f7 | ||
|
|
cc583080ea | ||
|
|
e535cdaeba | ||
|
|
f17a8a6481 | ||
|
|
d5fb937dd6 | ||
|
|
23246fbda2 | ||
|
|
735344cea4 | ||
|
|
8488472ebc | ||
|
|
299ec89216 | ||
|
|
a9aaa508f5 | ||
|
|
52261e8d2a | ||
|
|
4ac3999f67 | ||
|
|
9c059eb4b6 | ||
|
|
ba5d5ac5d5 | ||
|
|
6d48cee1fa | ||
|
|
d157ed3c0f | ||
|
|
0495d48669 | ||
|
|
7ba5c9de92 | ||
|
|
b64282a7ca | ||
|
|
bd67288887 | ||
|
|
68f51d4553 | ||
|
|
5dbbde0856 | ||
|
|
a9f01a5a8e | ||
|
|
28a383a476 | ||
|
|
56b6bcd1a1 | ||
|
|
14b3cdf744 | ||
|
|
38f77d862d | ||
|
|
f3c2c82d8d | ||
|
|
87f6bf14d8 | ||
|
|
72ed91ddcc | ||
|
|
a4c3c38912 | ||
|
|
e86b44f5a0 | ||
|
|
101b1e9aab | ||
|
|
ecd4b08119 | ||
|
|
f958eb07bf | ||
|
|
611866508c | ||
|
|
076c49c054 | ||
|
|
9c8b1b1913 | ||
|
|
cfad65878e | ||
|
|
379ae672c4 | ||
|
|
b568f5c101 | ||
|
|
7c36bb8728 | ||
|
|
df0fa82482 | ||
|
|
70fd424488 | ||
|
|
8470ad5915 | ||
|
|
a8a9553d20 | ||
|
|
8d8fb96f0d | ||
|
|
25280f2cd1 | ||
|
|
3ab5992210 | ||
|
|
de8dd9e9f1 | ||
|
|
3e15724c3e | ||
|
|
dfe7856d03 | ||
|
|
b70417e9ed | ||
|
|
f5d6fa03e5 | ||
|
|
e35378ced8 | ||
|
|
414727fdc1 | ||
|
|
e2c14dace9 | ||
|
|
568f9769ee | ||
|
|
6901973e5c | ||
|
|
a588837605 | ||
|
|
6e6ac36178 | ||
|
|
cfc6d3c230 | ||
|
|
b6aa1fdf6d | ||
|
|
d9f6b7e825 | ||
|
|
68bffa8944 | ||
|
|
f8e890e9a9 | ||
|
|
64eb0d4e15 | ||
|
|
d7a862e061 | ||
|
|
6a2c386b5d | ||
|
|
62e6dd44b9 | ||
|
|
05b31a4862 | ||
|
|
55305f31b7 | ||
|
|
1f86a063ef | ||
|
|
217885587e | ||
|
|
28f8933f72 | ||
|
|
5360ec3d24 | ||
|
|
6339a3aeda | ||
|
|
974d0e28a1 | ||
|
|
e9dab58a57 | ||
|
|
3aa72ea258 | ||
|
|
0b161cf53e | ||
|
|
590723b297 | ||
|
|
fd390238d9 | ||
|
|
6388669d66 | ||
|
|
b475e4dd79 | ||
|
|
f5373fc7b1 | ||
|
|
265e58d80d | ||
|
|
d2fac65a6d | ||
|
|
b0df7fc4cf | ||
|
|
e21a829cb6 | ||
|
|
bef1cff348 | ||
|
|
f9555c7a1e | ||
|
|
03389a04ba | ||
|
|
008a6f05a5 | ||
|
|
6aa8816dd1 | ||
|
|
70427e8a45 | ||
|
|
51ea0ec007 | ||
|
|
1381f5787a | ||
|
|
722db2d2ec | ||
|
|
72458f4631 | ||
|
|
bde6b3e102 | ||
|
|
936ca5abaa | ||
|
|
1f03bf5570 | ||
|
|
e7e2390bcd | ||
|
|
3ac6164c82 | ||
|
|
3bb6778e67 | ||
|
|
fa797c00c2 | ||
|
|
f0ae1a9205 | ||
|
|
af7da9c07f | ||
|
|
4106253b58 | ||
|
|
c787dce10c | ||
|
|
b265910b2a | ||
|
|
5e3f4c0f59 | ||
|
|
2fe07ebfad | ||
|
|
7be766d2c7 | ||
|
|
15651fc803 | ||
|
|
5b3b81551e | ||
|
|
330841f8ee | ||
|
|
0708c6ce43 | ||
|
|
2c1945584d | ||
|
|
183178f943 | ||
|
|
b1b95159fa | ||
|
|
b0828592c5 | ||
|
|
21446b3bf3 | ||
|
|
935fbfba78 | ||
|
|
fa195a79f5 | ||
|
|
f6a367c567 | ||
|
|
bf6d8f47e7 | ||
|
|
02761610d1 | ||
|
|
bf3107d3b7 | ||
|
|
66e596bb57 | ||
|
|
cdfdb6c001 | ||
|
|
c583229cc8 | ||
|
|
417009fd6e | ||
|
|
d3ffbca858 | ||
|
|
db4fc19c1a | ||
|
|
eefae0635a | ||
|
|
1d7c12ec60 | ||
|
|
4d7f94e292 | ||
|
|
e13810b16a | ||
|
|
d4be779cf1 | ||
|
|
3912262f4b | ||
|
|
ed753b71c1 | ||
|
|
5b78e8b075 | ||
|
|
71dd1de503 | ||
|
|
2a95f7750a | ||
|
|
6d3dcb503a | ||
|
|
57c6bbd96c | ||
|
|
3f18ad9c59 | ||
|
|
c09cdcc788 | ||
|
|
473ff8d774 | ||
|
|
4ec3f42a8b | ||
|
|
36a4d7415c | ||
|
|
df81964b86 | ||
|
|
7130b6ba65 | ||
|
|
bfa79fb06e | ||
|
|
52e2459d47 | ||
|
|
5081f70570 | ||
|
|
f4e6b7baf8 | ||
|
|
e55388e4b7 | ||
|
|
f14c376791 | ||
|
|
071fd8c7be | ||
|
|
2bb2bd74db | ||
|
|
9d9fdebf3a | ||
|
|
0d9675fb35 | ||
|
|
7b5b272c17 | ||
|
|
a7427c3462 | ||
|
|
2b8ebcf182 | ||
|
|
eb72b600b4 | ||
|
|
606b851661 | ||
|
|
15f94c7752 | ||
|
|
04dbd4adcd | ||
|
|
853fe54e3b | ||
|
|
e2490f2296 | ||
|
|
cbddcf0968 | ||
|
|
8b1e5df851 | ||
|
|
29d8e5e7b3 | ||
|
|
e86328b0c2 | ||
|
|
b8d37d4e38 | ||
|
|
fd93f3fd54 | ||
|
|
9035de79ce | ||
|
|
2304de45b1 | ||
|
|
f1007d325f | ||
|
|
44679dbef0 | ||
|
|
682c97b3e7 | ||
|
|
b65c3eeeaa | ||
|
|
883c019293 | ||
|
|
50c2e3a6ce | ||
|
|
b7082e2318 | ||
|
|
f30b1cbd09 | ||
|
|
8936479c78 | ||
|
|
f02b30c6b5 | ||
|
|
fd34f6bcf7 | ||
|
|
e9eb113c33 | ||
|
|
1caee4e19e | ||
|
|
e18188d2a8 | ||
|
|
682cf056b6 | ||
|
|
5d11889fb2 | ||
|
|
566780b5e2 | ||
|
|
2d025b9fde | ||
|
|
64e97b6593 | ||
|
|
a05daedc54 | ||
|
|
e5756abb4d | ||
|
|
bfd30ace70 | ||
|
|
5858bff825 | ||
|
|
99c1a127b4 | ||
|
|
70af2e2d07 | ||
|
|
7db145af7c | ||
|
|
dfe13dd6bd | ||
|
|
33596e4b61 | ||
|
|
ca9c1b025a | ||
|
|
ca5102cd77 | ||
|
|
cfe160f34d | ||
|
|
d0a7033bf4 | ||
|
|
415291b083 | ||
|
|
4208c3ecc5 | ||
|
|
76dbe27c5d | ||
|
|
cfbf1dd69b | ||
|
|
313b6e328e | ||
|
|
22532f3783 | ||
|
|
3ced32b235 | ||
|
|
300b1d5ea3 | ||
|
|
40df8c7104 | ||
|
|
83727ac71d | ||
|
|
f31d710b20 | ||
|
|
6da7c0e501 | ||
|
|
f7b6a50482 | ||
|
|
48f72a2f0f | ||
|
|
43d2c114f4 | ||
|
|
aa84dd967e | ||
|
|
c413f76fe2 | ||
|
|
7762310bf3 | ||
|
|
7dd3a6c60d | ||
|
|
80a6992f5b | ||
|
|
4b651b733b | ||
|
|
c269306d9d | ||
|
|
cf0f0bdee0 | ||
|
|
d4e2d50e00 | ||
|
|
e303c44822 | ||
|
|
3eb30d2248 | ||
|
|
9b6b30ae30 | ||
|
|
9d9e6f7786 | ||
|
|
98f32ca279 | ||
|
|
ab7e5bc6d6 | ||
|
|
636c5463b2 | ||
|
|
85c0216e9d | ||
|
|
5e2861546f | ||
|
|
c1fc08ecba | ||
|
|
458a6ab254 | ||
|
|
1259f642e1 | ||
|
|
3cb71b8e2c | ||
|
|
eb8bae6d69 | ||
|
|
4f382c150d | ||
|
|
53ea51885a | ||
|
|
f5ae2cd0d4 | ||
|
|
8860750487 | ||
|
|
a58c8d466e | ||
|
|
8daee69576 | ||
|
|
7665141a5a | ||
|
|
7327d39c57 | ||
|
|
9177ca18f0 | ||
|
|
0956744878 | ||
|
|
b0235056a7 | ||
|
|
d354189d3c | ||
|
|
07760aa26a | ||
|
|
13322836aa | ||
|
|
d8acd0476a | ||
|
|
a2e0d50b1f | ||
|
|
176f1c08ad | ||
|
|
1970a105a9 | ||
|
|
71438a39eb | ||
|
|
ba7792a4b9 | ||
|
|
145bf46ee1 | ||
|
|
ecdce5b279 | ||
|
|
c0d4ede483 | ||
|
|
3fa207ea9c | ||
|
|
2a302a4b59 | ||
|
|
42e0907bb9 | ||
|
|
a20aa88096 | ||
|
|
aef820f448 | ||
|
|
f487b25aa1 | ||
|
|
babd929f6a | ||
|
|
1d27e2bd67 | ||
|
|
2abb143cfe | ||
|
|
5289273fc2 | ||
|
|
32d8e2383e | ||
|
|
f9538e770a | ||
|
|
05b2711f7f | ||
|
|
703f06c7a7 | ||
|
|
6d8dcb1b0e | ||
|
|
1e883866ed | ||
|
|
17f2983c3a | ||
|
|
607dfed53f | ||
|
|
0f20fc1184 | ||
|
|
a8202ff10d | ||
|
|
e06c8273e8 | ||
|
|
63fda2ce72 | ||
|
|
7d3b0396c7 | ||
|
|
21c47a5310 | ||
|
|
2086ac3d9c | ||
|
|
c3ffc0446a | ||
|
|
33411d8473 | ||
|
|
528d4a33eb | ||
|
|
1332b8e798 | ||
|
|
f1bb2fc55c | ||
|
|
ef7e0a1df9 | ||
|
|
e8083462e2 | ||
|
|
86f8a9fba7 | ||
|
|
b7f9649036 | ||
|
|
3acf581775 | ||
|
|
18227c7beb | ||
|
|
0811e2dd16 | ||
|
|
f305d2f6eb | ||
|
|
c2ea0bcd37 | ||
|
|
6b0b88e9ac | ||
|
|
221e94a8d7 | ||
|
|
371b8422ce | ||
|
|
4b43aa3e8f | ||
|
|
d72a93fbff | ||
|
|
ba51f36a8e | ||
|
|
1fa3faff52 | ||
|
|
820da9a235 | ||
|
|
91485aa009 | ||
|
|
c8c6238583 | ||
|
|
624fd3c045 | ||
|
|
7b0fdbf5f8 | ||
|
|
1f4e2eb4ce | ||
|
|
0b89320007 | ||
|
|
074ee8b463 | ||
|
|
55ff99a4ca | ||
|
|
009e1a8cad | ||
|
|
6c108f0455 | ||
|
|
09cd167a70 | ||
|
|
4239bc7917 | ||
|
|
77665af171 | ||
|
|
2a51b96b24 | ||
|
|
559dfe38e6 | ||
|
|
2dadfebccf | ||
|
|
0bc4fd6670 | ||
|
|
516e854616 | ||
|
|
912970923f | ||
|
|
4e5ee5174f | ||
|
|
51e9a5c97c | ||
|
|
09c4f5b06e | ||
|
|
aff26d7e16 | ||
|
|
49920caecc | ||
|
|
5f9c010d09 | ||
|
|
edce3ca5a3 | ||
|
|
d0c4b32a2c | ||
|
|
3acd5c5170 | ||
|
|
79e8c9e19a | ||
|
|
cc2a92a2a5 | ||
|
|
f0e1126dbb | ||
|
|
8804346424 | ||
|
|
a194e8a17e | ||
|
|
f0dbb2a1af | ||
|
|
6fb22d2ee0 | ||
|
|
78523171e9 | ||
|
|
cfdfef039e | ||
|
|
fecbf8948b | ||
|
|
40d33532c8 | ||
|
|
69d40eb52b | ||
|
|
4c79e8cb67 | ||
|
|
3fa4ede71f | ||
|
|
15b818acdb | ||
|
|
fa4c4d16d0 | ||
|
|
5997037328 | ||
|
|
29c63a585d | ||
|
|
71f5093a49 | ||
|
|
be94bd482c | ||
|
|
14e1d89024 | ||
|
|
c8b41458e1 | ||
|
|
e2e576e4fe | ||
|
|
2f35b8c403 | ||
|
|
5ea258705c | ||
|
|
f4dbe590df | ||
|
|
f4bbc979f9 | ||
|
|
8175b97073 | ||
|
|
085cf9783b | ||
|
|
f80b04ee77 | ||
|
|
e1a83aed77 | ||
|
|
9acf9e1e50 | ||
|
|
75ade8ebaa | ||
|
|
0117f94c07 | ||
|
|
00772317e7 | ||
|
|
efc1e8329a | ||
|
|
fc9fca0ee6 | ||
|
|
5d66eb10ca | ||
|
|
84a3a2dd39 | ||
|
|
a9c2b5c173 | ||
|
|
1678ac64b8 | ||
|
|
83b618b59d | ||
|
|
302ae192ac | ||
|
|
3af32c0153 | ||
|
|
9f64f8a3c2 | ||
|
|
048c1fc4d4 | ||
|
|
6f00b66013 | ||
|
|
d42209c3a0 | ||
|
|
7ce6e1d7a0 | ||
|
|
666b94bfad | ||
|
|
a597947e80 | ||
|
|
51a8cc576b | ||
|
|
9901688668 | ||
|
|
c39efcdbf0 | ||
|
|
01cd027e09 | ||
|
|
e3f7214af2 | ||
|
|
f77a013767 | ||
|
|
8b3e6b80c4 | ||
|
|
9706a839d6 | ||
|
|
d38bd8a6ad | ||
|
|
9e7f1da680 | ||
|
|
499cbfb47d | ||
|
|
7c7e76ca82 | ||
|
|
a57c97f59d | ||
|
|
91872ee3d3 | ||
|
|
5cf9892da0 | ||
|
|
2db7508859 | ||
|
|
06eb1dff34 | ||
|
|
bba1fc0b47 | ||
|
|
113f40ebb1 | ||
|
|
147b1ff44f | ||
|
|
dee9afcda4 | ||
|
|
bf5cc87510 | ||
|
|
fb6b88c499 | ||
|
|
b1d5cde032 | ||
|
|
cb7b1f0c41 | ||
|
|
6c0ab35f91 | ||
|
|
219ffc7fbb | ||
|
|
973fd76d1a | ||
|
|
915898c26f | ||
|
|
8277eb100c | ||
|
|
aea651c7f7 | ||
|
|
959fcd7f3b | ||
|
|
8d73143932 | ||
|
|
e01de6f03e | ||
|
|
27027c0f0e | ||
|
|
90522e1f81 | ||
|
|
7ef726c7c2 | ||
|
|
ba459c2ef4 | ||
|
|
89256c8ab1 | ||
|
|
34af0d655f | ||
|
|
1c282c0d9a | ||
|
|
34a1f1015b | ||
|
|
661a75ee9c | ||
|
|
afd9ef16df | ||
|
|
48d94b08ad | ||
|
|
310794a049 | ||
|
|
cd7fce3b1b | ||
|
|
d47651b5a1 | ||
|
|
8e9dfc5153 | ||
|
|
de94e1ba6d | ||
|
|
5b6c0c7d97 | ||
|
|
d9dfa18e28 | ||
|
|
c66d7dd260 | ||
|
|
215640f57a | ||
|
|
539e7a6b36 | ||
|
|
5a1c02e6f5 | ||
|
|
45da8032de | ||
|
|
8703b3b633 | ||
|
|
69298f2c71 | ||
|
|
ab5f9d71d3 | ||
|
|
1cbb01c8e7 | ||
|
|
2d3db305db | ||
|
|
50b53e8bba | ||
|
|
65ccda0ac0 | ||
|
|
c25928cd18 | ||
|
|
6a0ffe25f2 | ||
|
|
850b0bfff8 | ||
|
|
a4f1e10f0e | ||
|
|
6bcad2fecc | ||
|
|
93f22bfe5d | ||
|
|
3f2d62e125 | ||
|
|
f85a61dcff | ||
|
|
5388b4eb91 | ||
|
|
02f70e84fc | ||
|
|
e0faf0bced | ||
|
|
3a66e21ebd | ||
|
|
4ecbeab1da | ||
|
|
9c34ac833c | ||
|
|
fc3f4b0e3e | ||
|
|
64978b7e65 | ||
|
|
4378f25642 | ||
|
|
9ad163a469 | ||
|
|
2a47b8f482 | ||
|
|
5084346b28 | ||
|
|
2391629b36 | ||
|
|
8964c9f533 | ||
|
|
2000e8b80e | ||
|
|
00015b30cd | ||
|
|
b4af4ad667 | ||
|
|
6b255232c6 | ||
|
|
54b9ff8ce5 | ||
|
|
b7f4f9e8a4 | ||
|
|
f4647ebd53 | ||
|
|
ed4f5fdf37 | ||
|
|
5f5cdc5728 | ||
|
|
0b93b2d230 | ||
|
|
7f213930b1 | ||
|
|
76240ce840 | ||
|
|
011f4b37ba | ||
|
|
691df89535 | ||
|
|
bbb0fcaa8f | ||
|
|
e741af6901 | ||
|
|
68dd22e509 | ||
|
|
2a1e3568af | ||
|
|
cf68652880 | ||
|
|
b1d2a40534 | ||
|
|
c588f69b0c | ||
|
|
8b489a94cc | ||
|
|
9b50053007 | ||
|
|
4979a1d112 | ||
|
|
08a26cbc2d | ||
|
|
51f6909aaf | ||
|
|
deb73f0e3c | ||
|
|
c93a78066c | ||
|
|
e69362536e | ||
|
|
a1e5945d73 | ||
|
|
c3c7fd313f | ||
|
|
c4de916057 | ||
|
|
096f325292 | ||
|
|
0333f9315a | ||
|
|
a5894a3285 | ||
|
|
d0e0f4aa27 | ||
|
|
f174cf8428 | ||
|
|
fc35f35f5f | ||
|
|
ad53e45c15 | ||
|
|
7b3166ad3a | ||
|
|
0e07d9784e | ||
|
|
a1b6681eeb | ||
|
|
ba96a54d2e | ||
|
|
aa429d0a0d | ||
|
|
a10c46d8cb | ||
|
|
4a59c69f68 | ||
|
|
d1ab64780b | ||
|
|
534b26080d | ||
|
|
1c0a391c16 | ||
|
|
142a1e2988 | ||
|
|
6214d2dd02 | ||
|
|
8b3c4b3b76 | ||
|
|
e867a74478 | ||
|
|
9b61b66890 | ||
|
|
25da5c9bb0 | ||
|
|
9b33755cdd | ||
|
|
d7f57a4d04 | ||
|
|
daf3307e2a | ||
|
|
3becee4b4f | ||
|
|
512dd0ecdf | ||
|
|
b466794e16 | ||
|
|
eed6d9b3bd | ||
|
|
6576609166 | ||
|
|
15b5ff8ac4 | ||
|
|
14ac72f8d2 | ||
|
|
76b7ccf5ec | ||
|
|
38079d6df4 | ||
|
|
5d6962b283 | ||
|
|
a860b133c9 | ||
|
|
4bf250734a | ||
|
|
af26efe23a | ||
|
|
5f35cf6f96 | ||
|
|
aea0732c42 | ||
|
|
49b090ea52 | ||
|
|
7c987f6581 | ||
|
|
1b96822f0b | ||
|
|
476ce29c57 | ||
|
|
d0c693a0fe | ||
|
|
096000d001 | ||
|
|
12a85136b3 | ||
|
|
567ad2cc12 | ||
|
|
0d4736f1f0 | ||
|
|
59e08e66fb | ||
|
|
3606fbd856 | ||
|
|
e3b1490493 | ||
|
|
5d2a3b4c30 | ||
|
|
41f8f9903e | ||
|
|
83690789ac | ||
|
|
bdc4f7bf0a | ||
|
|
6178dcd229 | ||
|
|
e9c4e3d0c3 | ||
|
|
1852c1071b | ||
|
|
bc1e84b4d2 | ||
|
|
d591a8700e | ||
|
|
8886a37630 | ||
|
|
924d3e8513 | ||
|
|
57a43f64d7 | ||
|
|
1a9c57546f | ||
|
|
f223373f4f | ||
|
|
2fac04a148 | ||
|
|
f328a8262f | ||
|
|
253b3d664f | ||
|
|
1c29b57d08 | ||
|
|
ad7abeba05 | ||
|
|
cc2b9bdbf1 | ||
|
|
dee753ddba | ||
|
|
af50e6ffad | ||
|
|
e825377ff1 | ||
|
|
1484f54fe2 | ||
|
|
80b88df992 | ||
|
|
35db825e6a | ||
|
|
f4aeff329a | ||
|
|
d7acd67326 | ||
|
|
ee7b1e4471 | ||
|
|
778d0435f3 | ||
|
|
74a6844981 | ||
|
|
8f9f79a02d | ||
|
|
4a81a08157 | ||
|
|
1bfa3276d6 | ||
|
|
afa97cbae9 | ||
|
|
85ba433452 | ||
|
|
f8f53d0ac9 | ||
|
|
e4888849b1 | ||
|
|
cdb8b500bc | ||
|
|
106c420447 | ||
|
|
83c6aa8550 | ||
|
|
f262710f59 | ||
|
|
04d69a4e95 | ||
|
|
e96ac71d1d | ||
|
|
399b43149b | ||
|
|
693b9968e9 | ||
|
|
4edd73de52 | ||
|
|
e7a554cac0 | ||
|
|
a973586a2b | ||
|
|
c682dc4409 | ||
|
|
f404f5a1fe | ||
|
|
3678cd7b37 | ||
|
|
14196bf66c | ||
|
|
3f5f1cebe7 | ||
|
|
8fc6a88f58 | ||
|
|
591c5ec9e6 | ||
|
|
57c05b8672 | ||
|
|
e6fdf39e00 | ||
|
|
fabef77366 | ||
|
|
b14d80d101 | ||
|
|
a04a71df23 | ||
|
|
eb4d67d04e | ||
|
|
0e5a74725e | ||
|
|
fdbe165343 | ||
|
|
a40a809e12 | ||
|
|
69e169362b | ||
|
|
6cf8910839 | ||
|
|
fb706c5999 | ||
|
|
b5d6ba731e | ||
|
|
224697fd06 | ||
|
|
065e9a5e14 | ||
|
|
999cfbc7cb | ||
|
|
5f075814dd | ||
|
|
dfcd3e359c | ||
|
|
67aaee6f09 | ||
|
|
c05d02b002 | ||
|
|
412d2dc7ef | ||
|
|
d3ca67399c | ||
|
|
21e87339b9 | ||
|
|
fa18a0f94e | ||
|
|
d050fcecec | ||
|
|
aa6effcc90 | ||
|
|
785e0f78ff | ||
|
|
c4942affe8 | ||
|
|
8ee620935e | ||
|
|
5ffcb4b3ff | ||
|
|
2a5416673b | ||
|
|
21446bf4e8 | ||
|
|
45ee28c332 | ||
|
|
c0df0d73af | ||
|
|
1ce0164e70 | ||
|
|
9d4359ea89 | ||
|
|
2eb44a9bb3 | ||
|
|
6242fc9ef8 | ||
|
|
270fcc329f | ||
|
|
0e50cbe118 | ||
|
|
47767e4316 | ||
|
|
37339da412 | ||
|
|
91704f6037 | ||
|
|
c9e372ce53 | ||
|
|
226e9a6d77 | ||
|
|
b2121ec76e | ||
|
|
77eaa41cc3 | ||
|
|
2e1ec82d77 | ||
|
|
8669b6d7ff | ||
|
|
192e71ac60 | ||
|
|
095655e9e8 | ||
|
|
fb14dbd6bc | ||
|
|
7c56d036fd | ||
|
|
fa272cf0f3 | ||
|
|
6a51b0b02f | ||
|
|
d6e137d50f | ||
|
|
6e49ba328e | ||
|
|
d31a958df7 | ||
|
|
993d58c170 | ||
|
|
d1e3b51635 | ||
|
|
1df144e5b2 | ||
|
|
3e160b3af1 | ||
|
|
26ea187a09 | ||
|
|
45e8ebb29d | ||
|
|
85fe01bc60 | ||
|
|
cba9d7a0e0 | ||
|
|
d672c957f9 | ||
|
|
685cb114f8 | ||
|
|
86532ec251 | ||
|
|
b283013116 | ||
|
|
927f0157be | ||
|
|
eac6f0c035 | ||
|
|
727ea1c924 | ||
|
|
d538f754c4 | ||
|
|
4d801eef4c | ||
|
|
dd60f42d7b | ||
|
|
8049af9f17 | ||
|
|
39476ac5d5 | ||
|
|
dc0dfff31f | ||
|
|
d228908430 | ||
|
|
d73b0af435 | ||
|
|
2f04be6da9 | ||
|
|
a38fea3955 | ||
|
|
850a51569f | ||
|
|
22ada149f4 | ||
|
|
051f758566 | ||
|
|
5bee70f95a | ||
|
|
bfcc44dbe2 | ||
|
|
cde5661e30 | ||
|
|
902743f0d9 | ||
|
|
52e07ea0bf | ||
|
|
daec65e051 | ||
|
|
7986adc9c6 | ||
|
|
0686f2930b | ||
|
|
faa8f2c673 | ||
|
|
69566f1c74 | ||
|
|
198912c792 | ||
|
|
df00cb88e2 | ||
|
|
b2f86696cc | ||
|
|
2b0fda66f1 | ||
|
|
47533d5794 | ||
|
|
78248ba0a4 | ||
|
|
b3b59591be | ||
|
|
c3da028ed7 | ||
|
|
feb3145169 | ||
|
|
003882a16a | ||
|
|
137cef3114 | ||
|
|
0777fc39eb | ||
|
|
9359ee0432 | ||
|
|
c8ba17fab3 | ||
|
|
faf9ef8b0b | ||
|
|
404f5845a4 | ||
|
|
8486421f12 | ||
|
|
3abaa89107 | ||
|
|
1af751042c | ||
|
|
0daa65bd94 | ||
|
|
c4350ec75a | ||
|
|
9951179b2a | ||
|
|
7f6430f20f | ||
|
|
5f8d30a5a3 | ||
|
|
f18b5ca03c | ||
|
|
74f05d404c | ||
|
|
8935479fad | ||
|
|
23cadae581 | ||
|
|
b6db5cde51 | ||
|
|
a9ab3daa6f | ||
|
|
0d0f6c8851 | ||
|
|
8ac9005e8b | ||
|
|
ae970e376e | ||
|
|
c6ab7adba3 | ||
|
|
dbd70febdb | ||
|
|
2acd91f270 | ||
|
|
0381a6f473 | ||
|
|
e86c4d94b8 | ||
|
|
8d1f95ec89 | ||
|
|
89ce919802 | ||
|
|
ed5b71f8bf | ||
|
|
0927883055 | ||
|
|
2ac1e3f436 | ||
|
|
66297101ff | ||
|
|
6e2f29c673 | ||
|
|
a4fe9b4f80 | ||
|
|
fe3b2809d9 | ||
|
|
e61481c1b0 | ||
|
|
8b3371cf26 | ||
|
|
e48753f9bd | ||
|
|
8b3578aa74 | ||
|
|
094b40e604 | ||
|
|
843c417f19 | ||
|
|
f4ba7c8111 | ||
|
|
01d3312989 | ||
|
|
60a0f3af70 | ||
|
|
de8e68e21b | ||
|
|
158752b16d | ||
|
|
b1feb53b79 | ||
|
|
28ece60c76 | ||
|
|
30f699297c | ||
|
|
91fd0ec516 | ||
|
|
c6c7d5bc14 | ||
|
|
06f05104ab | ||
|
|
23c95dab63 | ||
|
|
c52a700c88 | ||
|
|
e3844c8684 | ||
|
|
e0efad1cc5 | ||
|
|
41ac87f5e1 | ||
|
|
5e88f1d572 | ||
|
|
1f0b5b320b | ||
|
|
7cc1213644 | ||
|
|
cfa9115af8 | ||
|
|
c7b1bc7958 | ||
|
|
18ad4aa855 | ||
|
|
e9f7a2bb2f | ||
|
|
2cfb0ad42a | ||
|
|
ffcef0c03f | ||
|
|
e4f665af62 | ||
|
|
3f0d1f6906 | ||
|
|
2d103bfd80 | ||
|
|
fa7c1fd1c7 | ||
|
|
e962abdc7d | ||
|
|
c82540e49e | ||
|
|
a921e8286a | ||
|
|
cd7297b6f2 | ||
|
|
4a9e761b03 | ||
|
|
4daaedaaca | ||
|
|
52763a221c | ||
|
|
b2d81edc08 | ||
|
|
68896f9cf6 | ||
|
|
751123ad52 | ||
|
|
e734391a54 | ||
|
|
b3e0683e66 | ||
|
|
81dae556a4 | ||
|
|
efde2a9422 | ||
|
|
adabd1acec | ||
|
|
753072c074 | ||
|
|
03d9b8a0a0 | ||
|
|
829c176b50 | ||
|
|
64fa120ccd | ||
|
|
bc55b21025 | ||
|
|
01469e7d3f | ||
|
|
f4de276be5 | ||
|
|
f72eac2959 | ||
|
|
8c505c1430 | ||
|
|
4678d41cc5 | ||
|
|
93c51998b9 | ||
|
|
7add66ab78 | ||
|
|
5fc1dd8f80 | ||
|
|
9d5867839b | ||
|
|
22cbe52935 | ||
|
|
0fbec678c4 | ||
|
|
b9d0659109 | ||
|
|
b86b65f447 | ||
|
|
3aca6921e1 | ||
|
|
049fd312b8 | ||
|
|
46cb2c7b48 | ||
|
|
942b1ddda5 | ||
|
|
dac347b720 | ||
|
|
96799edc16 | ||
|
|
2592d4e917 | ||
|
|
02b15d85c0 | ||
|
|
337402bb85 | ||
|
|
9b2cac3343 | ||
|
|
eb8f5baf37 | ||
|
|
2d4ef435c0 | ||
|
|
56714f4006 | ||
|
|
86bbb85b13 | ||
|
|
6accdb29b2 | ||
|
|
c8feaf54c0 | ||
|
|
2caf9ead57 | ||
|
|
b006327c4e | ||
|
|
876381b372 | ||
|
|
70d7816c35 | ||
|
|
6b4d3b2953 | ||
|
|
cd5e4e0f1e | ||
|
|
739abc58eb | ||
|
|
e41448cfc0 | ||
|
|
f0b287ddbf | ||
|
|
a89b523d15 | ||
|
|
1a42f98256 | ||
|
|
7147cfb853 | ||
|
|
ac795e97e7 | ||
|
|
7286226ef5 | ||
|
|
51fb7ad9b6 | ||
|
|
6f3ddedd96 | ||
|
|
0ddeb53833 | ||
|
|
1ed5194a2c | ||
|
|
877a83ea0e | ||
|
|
2cbba122e9 | ||
|
|
e4c7855c13 | ||
|
|
4e4264ad54 | ||
|
|
adb0d2a454 | ||
|
|
bd60df1ef4 | ||
|
|
46ef96becd | ||
|
|
5d73f5f7c7 | ||
|
|
de8c859826 | ||
|
|
5a551c0f33 | ||
|
|
b191c35029 | ||
|
|
cf2cddbd85 | ||
|
|
473983b7be | ||
|
|
9f0fd569b7 | ||
|
|
1e9bc49654 | ||
|
|
6e4c35a3fa | ||
|
|
640ca2e916 | ||
|
|
49fdb4ec05 | ||
|
|
99214d5221 | ||
|
|
9cbee08785 | ||
|
|
5b3bc5027f | ||
|
|
41ae40542a | ||
|
|
2fa7b9de67 | ||
|
|
e45a7bafbb | ||
|
|
76241a5ff4 | ||
|
|
89d31f606b | ||
|
|
983e673bd7 | ||
|
|
373f75359a | ||
|
|
f694f7aa3f | ||
|
|
01b701c392 | ||
|
|
5090eb35c3 | ||
|
|
c797fe4dda | ||
|
|
d084ed506d | ||
|
|
19914f9519 | ||
|
|
be570e6b84 | ||
|
|
f8402a0136 | ||
|
|
f7bdd6f9ea | ||
|
|
9a40a5113f | ||
|
|
d492045429 | ||
|
|
137164fef1 | ||
|
|
fcc12f5a3c | ||
|
|
f16fb41db0 | ||
|
|
9640b6a99f | ||
|
|
9426e17af0 | ||
|
|
aec73ba80d | ||
|
|
6e60973767 | ||
|
|
680a59a684 | ||
|
|
87780216dc | ||
|
|
9b5b22e726 | ||
|
|
7b7f25dde0 | ||
|
|
e45bbdef37 | ||
|
|
bdc2c2a11d | ||
|
|
ed525c209c | ||
|
|
72777c60ff | ||
|
|
2a86b78de1 | ||
|
|
3a6b402591 | ||
|
|
49e5df381d | ||
|
|
77e35d889f | ||
|
|
89bf9c5f4b | ||
|
|
bd93e798cc | ||
|
|
e0e954b6a8 | ||
|
|
902968a07a | ||
|
|
61c837beb0 | ||
|
|
bf58a423e8 | ||
|
|
45885638a7 | ||
|
|
562003c3e8 | ||
|
|
067e470771 | ||
|
|
31e816f50a | ||
|
|
8202c697e6 | ||
|
|
48099fed20 | ||
|
|
23b8a91299 | ||
|
|
ea9bba2586 | ||
|
|
844ff3aa16 | ||
|
|
97e7da6e46 | ||
|
|
9e7987758b | ||
|
|
6a61695106 | ||
|
|
a68c52b625 | ||
|
|
428c98818a | ||
|
|
b194ac4b43 | ||
|
|
3b2799b7b5 | ||
|
|
179fcd2319 | ||
|
|
b344df7394 | ||
|
|
d5578feb46 | ||
|
|
b6207b4a96 | ||
|
|
727850e252 | ||
|
|
9630c9ddaf | ||
|
|
7c1963ffcc | ||
|
|
7f1942971d | ||
|
|
824ab09c5a | ||
|
|
dd2ff20389 | ||
|
|
8d383e87b5 | ||
|
|
48cee8d3dc | ||
|
|
3f7d5c1037 | ||
|
|
a67478d752 | ||
|
|
307950428d | ||
|
|
33c1fdb3e2 | ||
|
|
1af09d6f72 | ||
|
|
b4aefee42e | ||
|
|
6b6f9462e5 | ||
|
|
d9717c3f5a | ||
|
|
16d3df09cf | ||
|
|
82b3b3efae | ||
|
|
57535ee5ec | ||
|
|
b6695d0119 | ||
|
|
76f6217337 | ||
|
|
051d0f65e0 | ||
|
|
d9b79d5625 | ||
|
|
d5dddedfbb | ||
|
|
df9ddd76e7 | ||
|
|
1added0bc6 | ||
|
|
bd7b824f9a | ||
|
|
ee895377b3 | ||
|
|
2710958b59 | ||
|
|
bbe54fca0f | ||
|
|
71a0508145 | ||
|
|
60ed796c5c | ||
|
|
150e25d67f | ||
|
|
f75986c4ab | ||
|
|
adcd0f8c2b | ||
|
|
902fc62c18 | ||
|
|
e9587dca05 | ||
|
|
c73a304d7b | ||
|
|
87be5a501c | ||
|
|
7e693617d5 | ||
|
|
e3d5248e20 | ||
|
|
0725b8c941 | ||
|
|
9664700317 | ||
|
|
f89c5e1271 | ||
|
|
06f9b3dc49 | ||
|
|
74d915d277 | ||
|
|
ff06ba8031 | ||
|
|
7f7f4b707f | ||
|
|
0d05b582e8 | ||
|
|
522dac1d0c | ||
|
|
9b384c4d4d | ||
|
|
cafb5caf8c | ||
|
|
2c6dc7a045 | ||
|
|
019d1996a5 | ||
|
|
5bf4a73de4 | ||
|
|
36767df266 | ||
|
|
dc4b7c71ee | ||
|
|
dbefd37065 | ||
|
|
8f7c8a3b18 | ||
|
|
aa3800db8c | ||
|
|
a9004f4d55 | ||
|
|
0ff18c2295 | ||
|
|
9443b7cf49 | ||
|
|
37b2269d83 | ||
|
|
b619834975 | ||
|
|
363da3eaa6 | ||
|
|
4e2a8cfaa5 | ||
|
|
1308122f81 | ||
|
|
0ff24cb8d5 | ||
|
|
3835c07581 | ||
|
|
25fbe86971 | ||
|
|
a2c9bf7781 | ||
|
|
679e099538 | ||
|
|
eb4e780693 | ||
|
|
338df6200d | ||
|
|
c682de182b | ||
|
|
1f9bed5f01 | ||
|
|
3616844174 | ||
|
|
356f2b13f7 | ||
|
|
ae592aa981 | ||
|
|
827e9001cd | ||
|
|
2f01da84fa | ||
|
|
a0a53857d0 | ||
|
|
fadf14edb2 | ||
|
|
b768b39272 | ||
|
|
d57f047749 | ||
|
|
607a6bbe8d | ||
|
|
b0ac3208d9 | ||
|
|
f983aa38b8 | ||
|
|
db09ff14d9 | ||
|
|
a68c34406c | ||
|
|
43365bb961 | ||
|
|
b17044851e | ||
|
|
567bd4019d | ||
|
|
f8e902fb0a | ||
|
|
1a88576fd8 | ||
|
|
0c165326d1 | ||
|
|
23a502b178 | ||
|
|
8b02df6b28 | ||
|
|
cde95162d2 | ||
|
|
f2f67cc6b2 | ||
|
|
9cfbaf41a6 | ||
|
|
554a794827 | ||
|
|
be7f696fe3 | ||
|
|
4584ddfb1f | ||
|
|
3b4885d3aa | ||
|
|
48d09420ef | ||
|
|
cb100ab6df | ||
|
|
0c8ade7443 | ||
|
|
3397e04570 | ||
|
|
f551af56f3 | ||
|
|
3865781da3 | ||
|
|
6ff2a58817 | ||
|
|
283439d620 | ||
|
|
7f429b2e60 | ||
|
|
0f85dd6727 | ||
|
|
315f646d0e | ||
|
|
02427027d7 | ||
|
|
7cf6c1d7e9 | ||
|
|
74792a7b73 | ||
|
|
9bcccf8ebb | ||
|
|
b2585e164b | ||
|
|
bb6c75246e | ||
|
|
68a16f3413 | ||
|
|
f5a03511ac | ||
|
|
1b1c7bfdb6 | ||
|
|
8094d136b4 | ||
|
|
c5de6ab8f6 | ||
|
|
0bc7242eac | ||
|
|
e66910d7cc | ||
|
|
7c81635ddc | ||
|
|
f539ac7ff6 | ||
|
|
98eda4e674 | ||
|
|
efb4d2011e | ||
|
|
b4d3fd1242 | ||
|
|
1344efa890 | ||
|
|
7d639ea2b3 | ||
|
|
00a5deb161 | ||
|
|
09fd643b58 | ||
|
|
131b7d266d | ||
|
|
5cb68b845a | ||
|
|
9250c8a22c | ||
|
|
22e638117b | ||
|
|
eeec848077 | ||
|
|
f0f9ae0e24 | ||
|
|
cdaf601c6c | ||
|
|
b2003fddf0 | ||
|
|
f489068fdb | ||
|
|
f7935ef51b | ||
|
|
341b502d3f | ||
|
|
0279d0121c | ||
|
|
3c32bf2f2c | ||
|
|
e4712bef77 | ||
|
|
0651a2cd20 | ||
|
|
3d9075812f | ||
|
|
0cd236b234 | ||
|
|
d3834096d8 | ||
|
|
f012fe0921 | ||
|
|
bd4e31044b | ||
|
|
51e0410ae2 | ||
|
|
ecfd88f1ad | ||
|
|
eb17deaf78 | ||
|
|
2b563722b0 | ||
|
|
d2afa0eade | ||
|
|
79f115f66c | ||
|
|
9fea70a00a | ||
|
|
bc1b2cef90 | ||
|
|
595c87400e | ||
|
|
326b688a73 | ||
|
|
e86f76b52c | ||
|
|
b1986b692a | ||
|
|
6dcfefc751 | ||
|
|
7fd868ad28 | ||
|
|
1f2c317982 | ||
|
|
1561d0a2c1 | ||
|
|
82ce142cee | ||
|
|
324c8f3dbe | ||
|
|
c73f32d5fc | ||
|
|
fafe43b982 | ||
|
|
e861259fb4 | ||
|
|
54cbeb856b | ||
|
|
fe6cebcaa4 | ||
|
|
c5be86bcb1 | ||
|
|
8527ee1dd2 | ||
|
|
625ed56b50 | ||
|
|
c7c95a5960 | ||
|
|
e595b5d4c4 | ||
|
|
8dcd034e5d | ||
|
|
8d9ee48855 | ||
|
|
373c3933d5 | ||
|
|
b8d0c10c76 | ||
|
|
1ae40d7f0c | ||
|
|
88fdd8e444 | ||
|
|
c694a5b6d4 | ||
|
|
bc395b249e | ||
|
|
f3bbd56513 | ||
|
|
4e49f21b91 | ||
|
|
07e1923170 | ||
|
|
a2af6c9249 | ||
|
|
fe29104cd2 | ||
|
|
953c7e0520 | ||
|
|
cc9bf82478 | ||
|
|
b866439729 | ||
|
|
ce055ee515 | ||
|
|
1c10a1fa5b | ||
|
|
48d551268c | ||
|
|
f5cc39461c | ||
|
|
f42d70b36a | ||
|
|
06c39ec060 | ||
|
|
d8c6d11f89 | ||
|
|
286fa429a5 | ||
|
|
2b06066bfe | ||
|
|
144b815ab4 | ||
|
|
46feff7449 | ||
|
|
adc67c819a | ||
|
|
765f946158 | ||
|
|
0085a93f25 | ||
|
|
6dc4e56e07 | ||
|
|
23af5d29a3 | ||
|
|
6e281f311b | ||
|
|
acb52828de | ||
|
|
c957bfa6f0 | ||
|
|
372d2c6a01 | ||
|
|
13b627be22 | ||
|
|
17f7530bb8 | ||
|
|
3609fcf604 | ||
|
|
c49410d224 | ||
|
|
bc96c76d04 | ||
|
|
95b5232c8b | ||
|
|
bd6213b67e | ||
|
|
692410768f | ||
|
|
b78e7e2a13 | ||
|
|
82386ec878 | ||
|
|
949407921d | ||
|
|
8971fb26b0 | ||
|
|
0413239f46 | ||
|
|
d0f92b9448 | ||
|
|
c67e56ec19 | ||
|
|
628d1adfe6 | ||
|
|
36500e259a | ||
|
|
65e93383c7 | ||
|
|
649cb3693c | ||
|
|
4a20303ab1 | ||
|
|
564a740b51 | ||
|
|
92585da56f | ||
|
|
ce89c03a2f | ||
|
|
e80993c730 | ||
|
|
b694eba86e | ||
|
|
994f8da3fb | ||
|
|
ab3f5b5352 | ||
|
|
d5163fcb7c | ||
|
|
8702d100ee | ||
|
|
9b5791fb09 | ||
|
|
3062834360 | ||
|
|
ce95401ad0 | ||
|
|
514d3550a6 | ||
|
|
61f63d66ac | ||
|
|
a6ebe02a01 | ||
|
|
cd31c4c8c4 | ||
|
|
c0c92f1902 | ||
|
|
1ee5f85ec6 | ||
|
|
6775f54263 | ||
|
|
873f5117ae | ||
|
|
6bbd1e4c1b | ||
|
|
9a7c1f58da | ||
|
|
7595f09e54 | ||
|
|
8c63274a22 | ||
|
|
0cf8527e82 | ||
|
|
3179e8d3a2 | ||
|
|
cefb9a41ff | ||
|
|
71412b4cae | ||
|
|
74768cdf2a | ||
|
|
4141e21069 | ||
|
|
00db0fca06 | ||
|
|
207caa103a | ||
|
|
ec95fc1989 | ||
|
|
7cf55353ae | ||
|
|
f98b9120bb | ||
|
|
d38853efab | ||
|
|
c79b9790cc | ||
|
|
25117c5270 | ||
|
|
364718902b | ||
|
|
bfaf3f75ac | ||
|
|
9ecd42d5aa | ||
|
|
a5c6529350 | ||
|
|
a4bb94dba7 | ||
|
|
dbdaa0c52e | ||
|
|
7ddbbd1d29 | ||
|
|
313b378d82 | ||
|
|
82dc85e3ee | ||
|
|
bfff51a966 | ||
|
|
13ca2e3ae8 | ||
|
|
d6b4e7f118 | ||
|
|
25124b213b | ||
|
|
cbea351298 | ||
|
|
ae6dd8137a | ||
|
|
d9e45b6d0f | ||
|
|
79e69f1d8f | ||
|
|
2bfebae15b | ||
|
|
960898e13e | ||
|
|
b8f632794a | ||
|
|
a24283ddc4 | ||
|
|
d29a0cdc47 | ||
|
|
322844ad53 | ||
|
|
48a7755c22 | ||
|
|
2f7b874f92 | ||
|
|
dafb98be65 | ||
|
|
b1d823c304 | ||
|
|
52adb2ac68 | ||
|
|
0e1f059c7e | ||
|
|
be50599567 | ||
|
|
ff65e89979 | ||
|
|
6f2d8f86ba | ||
|
|
317fda6a8a | ||
|
|
e4fe56b594 | ||
|
|
b1dd2e0205 | ||
|
|
20eb27952b | ||
|
|
0d949b63dd | ||
|
|
63aa2aa372 | ||
|
|
c8a718849d | ||
|
|
27f800f508 | ||
|
|
237e4790bf | ||
|
|
a45997f50f | ||
|
|
fe9d9759ca | ||
|
|
68fbb9ec6a | ||
|
|
eeab7bd554 | ||
|
|
79d0433060 | ||
|
|
195f3efce3 | ||
|
|
89eb72655d | ||
|
|
6f6e813999 | ||
|
|
5922079fca | ||
|
|
6dfe81769b | ||
|
|
81957ab205 | ||
|
|
864dbc4320 | ||
|
|
8d20866ec5 | ||
|
|
3ac4280868 | ||
|
|
c483d1d73d | ||
|
|
19cbb10430 | ||
|
|
ffcc992b0a | ||
|
|
775a9cae23 | ||
|
|
f8c92474b8 | ||
|
|
b42bf10c42 | ||
|
|
cea26d570d | ||
|
|
90b2c86411 | ||
|
|
05e0d7cc5a | ||
|
|
d663da7ee9 | ||
|
|
699d4d3df5 | ||
|
|
4c36e1e10f | ||
|
|
805adc19ba | ||
|
|
4e263c8c44 | ||
|
|
cf3fee9678 | ||
|
|
22830954b0 | ||
|
|
0038ae85b3 | ||
|
|
b30d25c454 | ||
|
|
8f30186397 | ||
|
|
070b0f7ced | ||
|
|
22285f1cd9 | ||
|
|
ac2c4e779c | ||
|
|
bc31e0d4ed | ||
|
|
8f31c978d4 | ||
|
|
ed589ad1ed | ||
|
|
a5bd50d8c9 | ||
|
|
5d7c3d0c47 | ||
|
|
b3ef02ad94 | ||
|
|
4623aaa23b | ||
|
|
2a0a36ee3d | ||
|
|
a0ade46e76 | ||
|
|
bdc5811b8a | ||
|
|
c0bb656fd7 | ||
|
|
fbf296094b | ||
|
|
42752864ea | ||
|
|
dbc38e6da3 | ||
|
|
007aeeab00 | ||
|
|
312740ac46 | ||
|
|
84734650c6 | ||
|
|
03a8070483 | ||
|
|
9ff91b0a5b | ||
|
|
db865196f1 | ||
|
|
0b631dcc63 | ||
|
|
e55bed16b4 | ||
|
|
200db63f44 | ||
|
|
d2c705a34a | ||
|
|
d766c23e2b | ||
|
|
eef17e655c | ||
|
|
13f0cc5e94 | ||
|
|
0fefb7b3e1 | ||
|
|
fb957ceeb2 | ||
|
|
42b542c343 | ||
|
|
de80ef3b4a | ||
|
|
fb540d60ba | ||
|
|
2724432e30 | ||
|
|
01888062e9 | ||
|
|
8f8d107acb | ||
|
|
93c18b1fc8 | ||
|
|
3f6a6f4b5d | ||
|
|
98553c3f4c | ||
|
|
65a12a72a5 | ||
|
|
ffb422c386 | ||
|
|
14c9d274f3 | ||
|
|
1fcd81ce2b | ||
|
|
27e45d0973 | ||
|
|
92e16e3941 | ||
|
|
804ff5fb0b | ||
|
|
80324d276a | ||
|
|
74b38e02ac | ||
|
|
7f495d0eb1 | ||
|
|
1fe556648d | ||
|
|
2bb2a909c3 | ||
|
|
8ce2d1e2e7 | ||
|
|
2745333ced | ||
|
|
2632d58065 | ||
|
|
3983a012b0 | ||
|
|
fcdd9da3bd | ||
|
|
d9ef029495 | ||
|
|
ba045edc25 | ||
|
|
a5acd4df36 | ||
|
|
bb078919f4 | ||
|
|
ac4f6e0425 | ||
|
|
ee2800bd0f | ||
|
|
66721ca709 | ||
|
|
bffc3c194d | ||
|
|
aa476b0e0d | ||
|
|
b2f5f5b159 | ||
|
|
b5b79600e9 | ||
|
|
ac8839a1d4 | ||
|
|
ffcb4cd1ac | ||
|
|
20f980a1e6 | ||
|
|
cdf9d486a0 | ||
|
|
32965ec6d7 | ||
|
|
175d7b2675 | ||
|
|
a46322530f | ||
|
|
9c55ae584c | ||
|
|
281f40f8d8 | ||
|
|
9c74e3ef06 | ||
|
|
eac083e35b | ||
|
|
7da4c03366 | ||
|
|
a858ea4db4 | ||
|
|
2fd8514efd | ||
|
|
acb65a74c2 | ||
|
|
b288a46385 | ||
|
|
91275e1ded | ||
|
|
be335160a8 | ||
|
|
9167ff0d04 | ||
|
|
18d6acc13b | ||
|
|
498bf21c3f | ||
|
|
f965b61e12 | ||
|
|
b5572b3c74 | ||
|
|
97f4b1f497 | ||
|
|
f3a52ae3d0 | ||
|
|
a5b1b26b41 | ||
|
|
e036998eb7 | ||
|
|
292bf7ab52 | ||
|
|
332f9cfd2d | ||
|
|
16e0cd9e54 | ||
|
|
6656d62afc | ||
|
|
ce7df212fe | ||
|
|
7805646d7d | ||
|
|
81f1244c3b | ||
|
|
0dc1151234 | ||
|
|
cff6fd7d3b | ||
|
|
0774243363 | ||
|
|
0fe8a821c7 | ||
|
|
e7047b630d | ||
|
|
b33ee796e1 | ||
|
|
0ef8ae060f | ||
|
|
28eb1018c9 | ||
|
|
7189b79372 | ||
|
|
fc76387d94 | ||
|
|
234269ac38 | ||
|
|
98dc75f7dd | ||
|
|
934ae1816c | ||
|
|
3d928cf65e | ||
|
|
d7204e0ff2 | ||
|
|
db79dfb5eb | ||
|
|
23f6f49fdb | ||
|
|
ad3593937f | ||
|
|
e9b22f50ac | ||
|
|
481207d85d | ||
|
|
3f2875475b | ||
|
|
7c6a922a2a | ||
|
|
6be827b9a9 | ||
|
|
11f94cf45d | ||
|
|
aaaedbddaa | ||
|
|
1dbd4364fc | ||
|
|
422dabb804 | ||
|
|
f3db2753ab | ||
|
|
011077f281 | ||
|
|
a058150bf4 | ||
|
|
93f2d53ee6 | ||
|
|
303b6de427 | ||
|
|
dbb1e10e5e | ||
|
|
4d0f681e59 | ||
|
|
870ea2aa2f | ||
|
|
e2706222d4 | ||
|
|
0579ffc854 | ||
|
|
95a59c619c | ||
|
|
e61b5fe4d5 | ||
|
|
844d95c19a | ||
|
|
0085684b58 | ||
|
|
5c30dbe050 | ||
|
|
fadb7e9ebe | ||
|
|
17bff91595 | ||
|
|
86feeba151 | ||
|
|
368611188c | ||
|
|
caa2af608a | ||
|
|
3025cf4a28 | ||
|
|
29f4cdf228 | ||
|
|
51439bf44e | ||
|
|
c532745951 | ||
|
|
1eed83ec6b | ||
|
|
9dad6932b2 | ||
|
|
c9f82c0acc | ||
|
|
aeaf5f24d4 | ||
|
|
a4e40309aa | ||
|
|
9afa9ef425 | ||
|
|
0cf67c076f | ||
|
|
1d82b07f78 | ||
|
|
11abba31ea | ||
|
|
4d8ce566eb | ||
|
|
f430870767 | ||
|
|
fe361b18a4 | ||
|
|
ac3eabd462 | ||
|
|
9d0e64a548 | ||
|
|
cfe4693f18 | ||
|
|
466de863c8 | ||
|
|
72738ff422 | ||
|
|
639faabe2b | ||
|
|
ca58bbcf39 | ||
|
|
c029077aef | ||
|
|
d4cb68e449 | ||
|
|
0e1f02f256 | ||
|
|
d7ec41c1f6 | ||
|
|
48be8f7ae0 | ||
|
|
76761fd18d | ||
|
|
f32d6cde6f | ||
|
|
1b8388a0b4 | ||
|
|
1aa5863084 | ||
|
|
d9e3063f9b | ||
|
|
1914e9d36d | ||
|
|
f7f1edb9ac | ||
|
|
410fd11c07 | ||
|
|
22693d1204 | ||
|
|
edfa8eaf1a | ||
|
|
6668892811 | ||
|
|
42cda40808 | ||
|
|
c163eb0a86 | ||
|
|
6aeecdf893 | ||
|
|
2665169ed8 | ||
|
|
c17f61ae2d | ||
|
|
c665f489a5 | ||
|
|
1587e41bbc | ||
|
|
2015e94112 | ||
|
|
4cb80d2e3e | ||
|
|
2d97c11731 | ||
|
|
d99c294db7 | ||
|
|
0a4a495b06 | ||
|
|
d716bb597f | ||
|
|
07ba49fb7e | ||
|
|
5aa093f827 | ||
|
|
df4f21f5a6 | ||
|
|
f8ae68bb25 | ||
|
|
3bdcf77cb0 | ||
|
|
a955d25727 | ||
|
|
7dc4c2ceae | ||
|
|
01d7de9ae1 | ||
|
|
7779ff3e10 | ||
|
|
cc00e2d8ef | ||
|
|
fd551f1ab9 | ||
|
|
099e24292a | ||
|
|
0ae9046c19 | ||
|
|
28c9df7e18 | ||
|
|
e95e598665 | ||
|
|
a242774e8b | ||
|
|
9fe5e0b8f6 | ||
|
|
c6b31acd9c | ||
|
|
ec309bfd7c | ||
|
|
a84d9f2c97 | ||
|
|
b0201c250f | ||
|
|
754f6ab47a | ||
|
|
6e9857c582 | ||
|
|
fcd187e875 | ||
|
|
726c88da87 | ||
|
|
53fa0c12ca | ||
|
|
592ee531ba | ||
|
|
a36619fa07 | ||
|
|
2b7387c5f7 | ||
|
|
655e7e992c | ||
|
|
9dd1a55940 | ||
|
|
5d4a2cee96 | ||
|
|
d9f9f1df34 | ||
|
|
36ceef2729 | ||
|
|
c42046eb00 | ||
|
|
da9ffec877 | ||
|
|
e113aa5c61 | ||
|
|
e290f9e231 | ||
|
|
4468871552 | ||
|
|
766e0b125a | ||
|
|
d1c7ce8e6f | ||
|
|
b5ed22589f | ||
|
|
069bc53ce5 | ||
|
|
fc9fb73872 | ||
|
|
2769580d2f | ||
|
|
d6d141a229 | ||
|
|
12d7f11c1b | ||
|
|
19d83c286e | ||
|
|
5b6fbf686b | ||
|
|
7bc549dfc4 | ||
|
|
4bfc4c4baf | ||
|
|
3997f288fa | ||
|
|
a1a0a8e2d9 | ||
|
|
0b735bcf4e | ||
|
|
cc5032e0e1 | ||
|
|
8af5ed39b1 | ||
|
|
25171210a5 | ||
|
|
28a3f9b57c | ||
|
|
63ae424665 | ||
|
|
eb41d87f1c | ||
|
|
b45206290f | ||
|
|
0815957448 | ||
|
|
9bc5a11a89 | ||
|
|
c3d9913cc7 | ||
|
|
918b470639 | ||
|
|
df8fa9cce1 | ||
|
|
39f4435386 | ||
|
|
80d62ffdc2 | ||
|
|
8c188a54fa | ||
|
|
e994383317 | ||
|
|
02e108140a | ||
|
|
538fc7eb01 | ||
|
|
976afd1cd4 | ||
|
|
f679f215cc | ||
|
|
9964fded85 | ||
|
|
4f479b9c6c | ||
|
|
00e283a01c | ||
|
|
26058e3205 | ||
|
|
db7cc9af33 | ||
|
|
f2be7a36bd | ||
|
|
022fe20524 | ||
|
|
0341ea4526 |
3
.crontab
@@ -1,3 +0,0 @@
|
||||
# Jeden Monat müssen wir die neuen Klimafaktoren vom DWD abholen, der Cronjob läuft immer am 28. für die höchste Wahrscheinlichkeit
|
||||
# dass die Daten schon da sind, falls der DWD mal später dran ist...
|
||||
0 12 28 * * bun ./src/cronjobs/update-dwd-klimafaktoren.ts
|
||||
16
.env
Normal file
@@ -0,0 +1,16 @@
|
||||
# Environment variables declared in this file are automatically made available to Prisma.
|
||||
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
|
||||
|
||||
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
|
||||
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
||||
|
||||
POSTGRES_DB=main
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=main
|
||||
POSTGRES_PASSWORD=hHMP8cd^N3SnzGRR
|
||||
|
||||
DB_CONTAINER_NAME=database
|
||||
|
||||
POSTGRES_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
||||
POSTGRES_DATABASE_URL_EXTERNAL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_CONTAINER_NAME}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
||||
64
.github/workflows/auto-merge-staging-into-main.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
name: Auto Merge Staging into Main
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 2 * * *' # 2:00 UTC = 4:00 Europäische Zeit
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set Git user
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
- name: Fetch all branches
|
||||
run: |
|
||||
git fetch origin main
|
||||
git fetch origin staging
|
||||
|
||||
- name: Check if main has commits not in staging
|
||||
id: check
|
||||
run: |
|
||||
git fetch origin
|
||||
if [ $(git rev-list --count origin/staging..origin/main) -gt 0 ]; then
|
||||
echo "❌ Staging is behind main and requires manual merging."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Create PR from staging to main
|
||||
id: create_pr
|
||||
run: |
|
||||
PR_URL=$(gh pr create --base main --head staging --title "Auto-merge staging into main" --body "This PR was created automatically by GitHub Actions. It merges the latest \`staging\` into \`main\`.")
|
||||
echo "PR_URL=$PR_URL" >> $GITHUB_OUTPUT
|
||||
PR_NUMBER=$(echo $PR_URL | awk -F'/' '{print $NF}')
|
||||
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Enable auto-merge on PR
|
||||
if: steps.create_pr.outputs.PR_NUMBER != ''
|
||||
run: |
|
||||
gh pr merge ${{ steps.create_pr.outputs.PR_NUMBER }} --merge --auto
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
notify_failure:
|
||||
needs: merge
|
||||
if: failure()
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Send Discord notification on failure
|
||||
run: |
|
||||
curl -H "Content-Type: application/json" \
|
||||
-X POST \
|
||||
-d "{\"content\": \"🚨 Auto-Merge fehlgeschlagen! Bitte manuell prüfen: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\"}" \
|
||||
${{ secrets.DISCORD_WEBHOOK_URL }}
|
||||
20
.github/workflows/build-and-test.yml
vendored
@@ -1,20 +0,0 @@
|
||||
name: Build and Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ dev ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Build the application
|
||||
uses: actions/checkout@v3
|
||||
- uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: "latest"
|
||||
- run: bun install
|
||||
- run: bun run build
|
||||
- run: bun run test:unit
|
||||
- run: bun run test:e2e
|
||||
44
.github/workflows/dev-pipeline.yml
vendored
@@ -1,27 +1,31 @@
|
||||
name: Dev Pipeline
|
||||
name: Development Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ dev ]
|
||||
branches: [dev]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Deploy dev changes.
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: "212.227.155.91"
|
||||
username: "root"
|
||||
password: "!2Zc727cI1"
|
||||
port: 22
|
||||
script: |
|
||||
cd ~/apps/online-energieausweis
|
||||
git reset --hard HEAD
|
||||
git clean -f -d
|
||||
git pull origin main
|
||||
git status
|
||||
npm install -g bun
|
||||
bun install
|
||||
bash build.sh
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install Bun
|
||||
run: |
|
||||
curl -fsSL https://bun.sh/install | bash
|
||||
|
||||
- uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: ${{ secrets.DEV_HOST }}
|
||||
username: ${{ secrets.DEV_USERNAME }}
|
||||
password: ${{ secrets.DEV_PASSWORD }}
|
||||
port: 22
|
||||
script: |
|
||||
export PATH=$HOME/.bun/bin:$PATH
|
||||
export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH
|
||||
echo $PATH
|
||||
cd ~/online-energieausweis
|
||||
git reset --hard origin/dev
|
||||
git clean -f -d
|
||||
git pull origin dev
|
||||
git status
|
||||
make prod
|
||||
31
.github/workflows/prevent-wrong-pr.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
name: PR Rules Enforcement
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- staging
|
||||
|
||||
jobs:
|
||||
check-pr:
|
||||
runs-on: ubuntu-latest
|
||||
name: Validate Pull Request Sources
|
||||
steps:
|
||||
- name: Prevent dev merges
|
||||
run: |
|
||||
echo "${{ github.head_ref }}";
|
||||
echo "${{ github.base_ref }}";
|
||||
if [[ "${{ github.head_ref }}" == "dev" ]]; then
|
||||
echo "ERROR: Merging 'dev' into '${{ github.base_ref }}' is forbidden!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Allow only staging into main
|
||||
if: github.base_ref == 'main'
|
||||
run: |
|
||||
echo "${{ github.head_ref }}";
|
||||
echo "${{ github.base_ref }}";
|
||||
if [[ "${{ github.head_ref }}" != "staging" ]]; then
|
||||
echo "ERROR: Only 'staging' branch is allowed to merge into 'main'. Current: '${{ github.head_ref }}'"
|
||||
exit 1
|
||||
fi
|
||||
46
.github/workflows/prod-pipeline.yml
vendored
@@ -1,27 +1,31 @@
|
||||
name: Production Deployment
|
||||
name: Production Pipeline
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [ created ]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Deploy to production.
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: "212.227.155.91"
|
||||
username: "root"
|
||||
password: "!2Zc727cI1"
|
||||
port: 22
|
||||
script: |
|
||||
cd ~/apps/online-energieausweis
|
||||
git reset --hard HEAD
|
||||
git clean -f -d
|
||||
git pull origin main
|
||||
git status
|
||||
npm install -g bun
|
||||
bun install
|
||||
bash build.sh
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install Bun
|
||||
run: |
|
||||
curl -fsSL https://bun.sh/install | bash
|
||||
|
||||
- uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: ${{ secrets.PROD_HOST }}
|
||||
username: ${{ secrets.PROD_USERNAME }}
|
||||
password: ${{ secrets.PROD_PASSWORD }}
|
||||
port: 22
|
||||
script: |
|
||||
export PATH=$HOME/.bun/bin:$PATH
|
||||
export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH
|
||||
echo $PATH
|
||||
cd ~/online-energieausweis
|
||||
git reset --hard origin/main
|
||||
git clean -f -d
|
||||
git pull origin main
|
||||
git status
|
||||
make prod
|
||||
66
.gitignore
vendored
@@ -1,25 +1,41 @@
|
||||
# build output
|
||||
dist/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# lockfile
|
||||
pnpm-lock.yaml
|
||||
bun.lockb
|
||||
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
# build output
|
||||
dist/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# log files
|
||||
logs/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# lockfile
|
||||
pnpm-lock.yaml
|
||||
bun.lockb
|
||||
|
||||
src/astro-typesafe-api-caller.ts
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
|
||||
*.Identifier
|
||||
|
||||
src/lib/Berechnungen/BedarfsausweisWohnen/18599-Tabellenverfahren-Wohngebaeude-komplett-ocr.pdf
|
||||
src/astro-typesafe-api-caller.ts
|
||||
|
||||
dbml/schema.dbml
|
||||
|
||||
prisma/migrations/20250315143314_/migration.sql
|
||||
|
||||
# src/astro-typesafe-api-caller.ts
|
||||
|
||||
src/testing/ausweise.csv
|
||||
src/testing/users.csv
|
||||
src/testing/rechnungen.csv
|
||||
|
||||
16
.vscode/settings.json
vendored
@@ -1,5 +1,17 @@
|
||||
|
||||
|
||||
{
|
||||
"i18n-ally.localesPaths": [
|
||||
"public/locales"
|
||||
]
|
||||
}
|
||||
],
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"css.lint.unknownAtRules": "ignore",
|
||||
"scss.lint.unknownAtRules": "ignore",
|
||||
"less.lint.unknownAtRules": "ignore"
|
||||
|
||||
"workbench.colorCustomizations": {
|
||||
"minimap.background": "#00000000",
|
||||
"scrollbar.shadow": "#00000000"
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
20
Dockerfile
@@ -1,10 +1,16 @@
|
||||
FROM oven/bun:1.0.23
|
||||
FROM postgres:latest
|
||||
ENV POSTGRES_USER ${POSTGRES_USER}
|
||||
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
|
||||
ENV POSTGRES_DB ${POSTGRES_DB}
|
||||
|
||||
EXPOSE 3000
|
||||
COPY ./prisma/migrations/ /docker-entrypoint-initdb.d/
|
||||
|
||||
WORKDIR /online-energieausweis
|
||||
COPY ./package.json ./
|
||||
COPY . .
|
||||
RUN bun install --prod
|
||||
EXPOSE 5432
|
||||
|
||||
CMD ["bun", "run", "build:production"]
|
||||
# Use a loop to copy migration.sql from each folder to the corresponding directory in the build context
|
||||
RUN for folder in /docker-entrypoint-initdb.d/*; do \
|
||||
if [ -d "$folder" ]; then \
|
||||
cp "$folder/migration.sql" "$folder.sql"; \
|
||||
rm -rf "$folder"; \
|
||||
fi \
|
||||
done
|
||||
BIN
GEG_2024_Gesetzestext.pdf
Normal file
75
Makefile
Normal file
@@ -0,0 +1,75 @@
|
||||
.PHONY: dev online-energieausweis all prod backup run-database build-database install-dependencies wait-for-database prod database prisma-studio backup-database-cronjob update-dwd-klimafaktoren-cron
|
||||
|
||||
DB_CONTAINER_NAME := database
|
||||
DB_NAME := main
|
||||
DB_USER := main
|
||||
DB_PASSWORD := hHMP8cd^N3SnzGRR
|
||||
DB_PORT := 5432
|
||||
DB_VOLUME := postgres_data
|
||||
PERSISTENT_DIR := $(HOME)/persistent/$(APP_NAME)
|
||||
BACKUP_FILENAME := $(HOME)/backups/$(shell date +"%Y-%m-%d_%H-%M-%S").sql.gz
|
||||
|
||||
online-energieausweis:
|
||||
NODE_ENV="development" bun run dev --host
|
||||
|
||||
dev: database online-energieausweis
|
||||
|
||||
database:
|
||||
docker compose up
|
||||
|
||||
prisma-studio:
|
||||
- pm2 delete prisma-studio
|
||||
pm2 start --name "prisma-studio" bunx -- prisma studio
|
||||
|
||||
backup:
|
||||
mkdir -p $(PERSISTENT_DIR)
|
||||
- docker exec -t $(DB_CONTAINER_NAME) pg_dump --data-only -U $(DB_USER) $(DB_NAME) | gzip > $(BACKUP_FILENAME)
|
||||
|
||||
run-database: stop-database
|
||||
docker volume rm -f $(DB_VOLUME)
|
||||
docker volume create $(DB_VOLUME)
|
||||
docker build -t $(DB_CONTAINER_NAME) .
|
||||
docker run -d --name $(DB_CONTAINER_NAME) \
|
||||
--restart=always \
|
||||
-e POSTGRES_USER=$(DB_USER) \
|
||||
-e POSTGRES_PASSWORD=$(DB_PASSWORD) \
|
||||
-p $(DB_PORT):5432 \
|
||||
-v $(DB_VOLUME):/var/lib/postgresql/data \
|
||||
-v $(PERSISTENT_DIR):/persistent \
|
||||
$(DB_CONTAINER_NAME)
|
||||
|
||||
stop-database:
|
||||
- docker stop $(DB_CONTAINER_NAME)
|
||||
- docker rm $(DB_CONTAINER_NAME)
|
||||
|
||||
wait-for-database:
|
||||
@while ! docker exec $(DB_CONTAINER_NAME) pg_isready -U $(DB_USER) -h localhost -p $(DB_PORT) > /dev/null 2>&1; do \
|
||||
sleep 1; \
|
||||
done
|
||||
|
||||
restore-backup:
|
||||
gunzip -c $(BACKUP_FILENAME) | docker exec -i $(DB_CONTAINER_NAME) psql -U $(DB_USER) -d postgres
|
||||
|
||||
install-dependencies:
|
||||
bun install
|
||||
bunx prisma generate
|
||||
|
||||
all:
|
||||
mkdir -p ~/logs
|
||||
bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log
|
||||
|
||||
update-dwd-klimafaktoren-cron:
|
||||
pm2 start bun --name "update-dwd-klimafaktoren-cron" --cron "0 12 28 * *" -- src/cronjobs/update-dwd-klimafaktoren.ts
|
||||
|
||||
prod: install-dependencies prisma-studio backup-database-cronjob update-dwd-klimafaktoren-cron
|
||||
bun run build
|
||||
mkdir -p ~/logs
|
||||
mkdir -p ~/persistent/online-energieausweis
|
||||
|
||||
- pm2 delete online-energieausweis
|
||||
NODE_ENV="production" pm2 start --name "online-energieausweis" --update-env --log ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log --time bun -- run ./server.ts
|
||||
pm2 save
|
||||
|
||||
backup-database-cronjob:
|
||||
- pm2 delete daily-db-backup
|
||||
pm2 start bash --name "daily-db-backup" --no-autorestart --cron "0 0 * * *" -- backup-database.bash
|
||||
@@ -1,29 +1,44 @@
|
||||
import { defineConfig } from "astro/config";
|
||||
import svelte from "@astrojs/svelte";
|
||||
// import astroI18next from "astro-i18next";
|
||||
|
||||
import tailwind from "@astrojs/tailwind";
|
||||
|
||||
// https://astro.build/config
|
||||
import node from "@astrojs/node";
|
||||
|
||||
// https://astro.build/config
|
||||
import mdx from "@astrojs/mdx";
|
||||
import astroTypesafeAPI from "astro-typesafe-api"
|
||||
|
||||
// https://astro.build/config
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
integrations: [/*astroI18next(),*/svelte(), tailwind(), mdx()],
|
||||
integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()],
|
||||
outDir: "./dist",
|
||||
output: "server",
|
||||
adapter: node({
|
||||
mode: "middleware",
|
||||
}),
|
||||
vite: {
|
||||
server: {
|
||||
allowedHosts: ["ibcornelsen.de", "online-energieausweis.org"]
|
||||
},
|
||||
optimizeDeps: {
|
||||
exclude: ["@ibcornelsen/api", "@ibcornelsen/database"]
|
||||
exclude: ["bun"]
|
||||
},
|
||||
build: {
|
||||
rollupOptions: {
|
||||
external: ["bun", "stream", "node:stream", "http", "node:http", "https", "http2", "path", "os", "crypto", "fs", "url", "util", "child_process"]
|
||||
}
|
||||
},
|
||||
ssr: {
|
||||
external: ["@prisma/client", "bun", "stream"],
|
||||
resolve: {
|
||||
alias: {
|
||||
".prisma/client/index-browser": "./node_modules/.prisma/client/index-browser.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
adapter: node({
|
||||
mode: "middleware"
|
||||
}),
|
||||
server: {
|
||||
port: 3000
|
||||
}
|
||||
server: {
|
||||
port: 3000
|
||||
},
|
||||
devToolbar: {
|
||||
enabled: false
|
||||
}
|
||||
});
|
||||
28
backup-database.bash
Normal file
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
FILE_NAME=data-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br
|
||||
FILE_NAME_COMPLETE=full-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br
|
||||
|
||||
# Das wird benötigt für AWS Ionos Kompatibilität.
|
||||
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
|
||||
export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
|
||||
|
||||
# Wir exportieren die Datenbank und komprimieren sie.
|
||||
# IMPORTANT: Dieser Befehl benötigt das `ionos` Profil, sonst wird er nicht funktionieren.
|
||||
# Das Profil kann mit `aws configure --profile ionos` erstellt werden.
|
||||
# Den Key dafür findet man auf https://dcd.ionos.com/latest/?lang=en#/key-management
|
||||
docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME
|
||||
|
||||
aws s3 cp $FILE_NAME s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD
|
||||
|
||||
echo "Uploaded $FILE_NAME"
|
||||
|
||||
docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE
|
||||
|
||||
aws s3 cp $FILE_NAME_COMPLETE s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD
|
||||
|
||||
echo "Uploaded $FILE_NAME_COMPLETE"
|
||||
|
||||
# Wir entfernen das Backup
|
||||
rm $FILE_NAME
|
||||
rm $FILE_NAME_COMPLETE
|
||||
2667818
backup/klimafaktoren.json
Normal file
71474
backup/postleitzahlen.json
Normal file
89
build.sh
@@ -9,50 +9,63 @@ DB_USER="main"
|
||||
DB_PASSWORD="hHMP8cd^N3SnzGRR"
|
||||
DB_PORT=5432
|
||||
|
||||
git_pull_force() {
|
||||
git reset --hard HEAD
|
||||
git clean -f -d
|
||||
git pull origin main
|
||||
}
|
||||
# Wir gehen davon aus, dass die Änderungen bereits von GitHub gepullt wurden
|
||||
# Dieses Skript ist nur dafür gedacht, von GitHub bei einer Automation
|
||||
# ausgeführt zu werden. Außerdem würde es nicht wirklich Sinn ergeben, wenn das
|
||||
# Build Skript sich die Änderungen am build Skript holen würde...
|
||||
# Wir müssen alle lokalen Pakete verlinken
|
||||
|
||||
# Zuerst müssen wir neue Änderungen von GitHub pullen.
|
||||
cd ~/apps/$APP_NAME
|
||||
git_pull_force;
|
||||
# --------------------------------- Database --------------------------------- #
|
||||
|
||||
# Dann bauen wir das Docker Image unserer Application
|
||||
cd ~/apps/$APP_NAME
|
||||
docker stop $APP_NAME
|
||||
docker rm $APP_NAME
|
||||
docker build -t $APP_NAME .
|
||||
cd ../database
|
||||
bun link
|
||||
bun install
|
||||
|
||||
# SECTION: Startup jobs zu crontab hinzufügen.
|
||||
# Erstmal den cronfile leeren.
|
||||
crontab -r;
|
||||
# ------------------------------------ API ----------------------------------- #
|
||||
|
||||
# Alle builds schlagen fehl wenn die Datenbank nicht da ist, also muss der Container zuerst gebaut werden.
|
||||
(crontab -l ; echo "@reboot sudo ~/database/build.sh &") | crontab -;
|
||||
(crontab -l ; echo "@reboot sudo ~/apps/online-energieausweis/build.sh &") | crontab -;
|
||||
(crontab -l ; echo "@reboot sudo ~/apps/layout-tool/build.sh &") | crontab -;
|
||||
cd ../api
|
||||
bun install
|
||||
bun link @ibcornelsen/database
|
||||
|
||||
# Wir legen ein persistent directory an
|
||||
PERSISTENT_DIR="${HOME}/persistent/online-energieausweis";
|
||||
# ------------------------------------ APP ----------------------------------- #
|
||||
|
||||
cd ../$APP_NAME
|
||||
bun install
|
||||
bun link @ibcornelsen/database
|
||||
|
||||
# Jeder unserer Applikationen hat ein Verzeichnis in dem alle Dateien dauerhaft,
|
||||
# Versionsunabhängig gespeichert werden. Dieses legen wir hier an, falls es noch
|
||||
# nicht existiert.
|
||||
PERSISTENT_DIR="${HOME}/persistent/${APP_NAME}";
|
||||
mkdir -p $PERSISTENT_DIR;
|
||||
|
||||
# Wir legen einen .env file für unsere letsencrypt keys an.
|
||||
rm -f ~/apps/$APP_NAME/.env;
|
||||
touch ~/apps/$APP_NAME/.env;
|
||||
echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/apps/$APP_NAME/.env;
|
||||
echo "CERTIFICATE=$(cat /etc/letsencrypt/live/ibcornelsen.de/fullchain.pem | base64 | tr -d '\n')" >> ~/apps/$APP_NAME/.env;
|
||||
# Wir legen hier die .env Datei an, die die SSL Zertifikate enthält.
|
||||
rm -f ~/$APP_NAME/.env;
|
||||
touch ~/$APP_NAME/.env;
|
||||
echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/online-energieausweis.org/privkey.pem | base64 | tr -d '\n')" >> ~/$APP_NAME/.env;
|
||||
echo "CERTIFICATE=$(cat /etc/letsencrypt/live/online-energieausweis.org/fullchain.pem | base64 | tr -d '\n')" >> ~/$APP_NAME/.env;
|
||||
|
||||
# Und starten unsere App wieder.
|
||||
docker run -d --name $APP_NAME --link $DB_CONTAINER_NAME \
|
||||
-v "${PERSISTENT_DIR}:/persistent" \
|
||||
-p "${APP_PORT}:80" \
|
||||
-e DB_CONNECTION=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_CONTAINER_NAME}:${DB_PORT}/${DB_NAME} \
|
||||
-e DB_PORT=${DB_PORT} \
|
||||
--env-file ~/apps/${APP_NAME}/.env \
|
||||
$APP_NAME;
|
||||
# Wir müssen sichergehen, dass der Database Container läuft, sonst können wir ihn nicht linken.
|
||||
if [ ! $((docker ps | grep $DB_CONTAINER_NAME) | wc -l) -gt 0 ]; then
|
||||
cd ../database;
|
||||
bash build.sh;
|
||||
cd ../$APP_NAME;
|
||||
fi
|
||||
|
||||
# Crontab Updaten
|
||||
cd ~/$APP_NAME
|
||||
crontab .crontab
|
||||
# Auch die API sollte bereits laufen
|
||||
if [ $(pm2 pid api) -eq "0" ]; then
|
||||
cd ../api;
|
||||
make prod;
|
||||
cd ../$APP_NAME;
|
||||
fi
|
||||
|
||||
# Jetzt wo wir alle Vorbereitungen getroffen haben, starten wir das Docker Image und linken es mit der Datenbank.
|
||||
# docker run -d --name $APP_NAME --link $DB_CONTAINER_NAME \
|
||||
# -v "${PERSISTENT_DIR}:/persistent" \
|
||||
# -v "./node_modules/@ibcornelsen/database:/${APP_NAME}/node_modules/@ibcornelsen/database" \
|
||||
# -v "./node_modules/@ibcornelsen/api:/${APP_NAME}/node_modules/@ibcornelsen/api" \
|
||||
# -v "./node_modules/@ibcornelsen/ui:/${APP_NAME}/node_modules/@ibcornelsen/ui" \
|
||||
# -p "${APP_PORT}:3000" \
|
||||
# $APP_NAME;
|
||||
|
||||
make prod
|
||||
@@ -1,17 +1,56 @@
|
||||
import { defineConfig } from "cypress";
|
||||
import dsv from "@rollup/plugin-dsv"
|
||||
import { prisma } from "./src/lib/server/prisma"
|
||||
import { fileURLToPath } from "url";
|
||||
import vitePreprocessor from "cypress-vite";
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: "http://localhost:3000",
|
||||
supportFile: false,
|
||||
viewportHeight: 900,
|
||||
viewportWidth: 1660,
|
||||
},
|
||||
supportFile: fileURLToPath(new URL("./src/cypress/support/commands.ts", import.meta.url)),
|
||||
specPattern: "./src/cypress/e2e/**/*.{ts,js}",
|
||||
setupNodeEvents(on, config) {
|
||||
on("file:preprocessor", vitePreprocessor({
|
||||
optimizeDeps: {
|
||||
exclude: ["@ibcornelsen/database"]
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
".prisma/client/index-browser": fileURLToPath(new URL("./node_modules/.prisma/client/index-browser.js", import.meta.url)),
|
||||
"#": fileURLToPath(new URL("./src", import.meta.url)),
|
||||
"#components": fileURLToPath(new URL("./src/components", import.meta.url)),
|
||||
"#lib": fileURLToPath(new URL("./src/lib", import.meta.url))
|
||||
}
|
||||
},
|
||||
base: fileURLToPath(new URL("./src", import.meta.url)),
|
||||
build: {
|
||||
commonjsOptions: {
|
||||
transformMixedEsModules: false
|
||||
}
|
||||
},
|
||||
plugins: [dsv()]
|
||||
}))
|
||||
on("task", {
|
||||
async verbrauchsausweisWohnen(query) {
|
||||
return await prisma.verbrauchsausweisWohnen.findFirst(query)
|
||||
},
|
||||
async plz() {
|
||||
const total = await prisma.postleitzahlen.count()
|
||||
const result = await prisma.postleitzahlen.findFirst({
|
||||
skip: Math.floor(Math.random() * total)
|
||||
})
|
||||
|
||||
return result?.plz
|
||||
}
|
||||
})
|
||||
},
|
||||
},
|
||||
component: {
|
||||
devServer: {
|
||||
framework: "svelte",
|
||||
bundler: "vite",
|
||||
bundler: "vite"
|
||||
},
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,277 +0,0 @@
|
||||
import fuelList from "#components/Ausweis/brennstoffListe";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import "cypress-file-upload"
|
||||
|
||||
describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
|
||||
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe");
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
|
||||
cy.get("input[name='ausstellgrund']")
|
||||
.should("have.length", Object.values(Enums.Ausstellgrund).length)
|
||||
.eq(
|
||||
faker.number.int({
|
||||
min: 0,
|
||||
max: Object.values(Enums.Ausstellgrund).length - 1,
|
||||
})
|
||||
)
|
||||
.check();
|
||||
|
||||
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
|
||||
cy.get("input[name='baujahr_gebaeude']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(
|
||||
faker.number.int({ min: 1900, max: 2021 }).toString() +
|
||||
"{enter}",
|
||||
{ delay: 50 }
|
||||
);
|
||||
|
||||
// Jetzt Füllen wir das Baujahr der Heizung aus.
|
||||
cy.get("input[name='baujahr_heizung']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(
|
||||
faker.number.int({ min: 1900, max: 2021 }).toString() +
|
||||
"{enter}",
|
||||
{ delay: 50 }
|
||||
);
|
||||
|
||||
// Anzahl Einheiten
|
||||
cy.get("input[name='einheiten']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 1, max: 5 }).toString());
|
||||
|
||||
// Sanierungsstatus
|
||||
cy.get("select[name='saniert']").select(
|
||||
Math.random() > 0.5 ? "true" : "false"
|
||||
);
|
||||
|
||||
// Adresse
|
||||
cy.get("input[name='adresse']").type(faker.location.streetAddress());
|
||||
|
||||
// Postleitzahl
|
||||
cy.get("input[name='plz']").type(
|
||||
faker.location.zipCode({
|
||||
format: "#####",
|
||||
})
|
||||
);
|
||||
|
||||
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
|
||||
|
||||
// Flaeche
|
||||
cy.get("input[name='flaeche']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// Nutzlaeche
|
||||
cy.get("input[name='nutzflaeche']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// Keller
|
||||
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
max: Object.values(Enums.Heizungsstatus).length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
// Dachgeschoss
|
||||
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
max: Object.values(Enums.Heizungsstatus).length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
// Brennstoff und Einheit 1
|
||||
const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
|
||||
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
|
||||
|
||||
// Verbrauchszeitraum
|
||||
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
|
||||
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
|
||||
|
||||
const zusaetzlicheHeizquelle = Math.random() > 0.5;
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
cy.get("input[name='zusaetzliche_heizquelle']").check();
|
||||
|
||||
// Brennstoff und Einheit 2
|
||||
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
|
||||
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
}
|
||||
|
||||
// Gebäudestrom
|
||||
cy.get("input[name='strom_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='strom_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='strom_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
|
||||
// Stromverbrauch Enthält
|
||||
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_heizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_lueftung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_beleuchtung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_kuehlung']").check();
|
||||
|
||||
// Warmwasser enthalten und bekannt
|
||||
const warmwasserEnthalten = Math.random() > 0.5;
|
||||
const anteilBekannt = Math.random() > 0.5;
|
||||
|
||||
if (warmwasserEnthalten) {
|
||||
cy.get("input[name='warmwasser_enthalten']").check();
|
||||
|
||||
if (anteilBekannt) {
|
||||
// Der Anteil ist bekannt, wir müssen ihn also angeben.
|
||||
cy.get("input[name='warmwasser_anteil_bekannt']").check();
|
||||
|
||||
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
|
||||
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Thermische Kühlung enthalten
|
||||
const kuehlungEnthalten = Math.random() > 0.5;
|
||||
|
||||
if (kuehlungEnthalten) {
|
||||
cy.get("input[name='kuehlung_enthalten']").check();
|
||||
|
||||
cy.get("input[name='anteil_kuehlung_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
|
||||
cy.get("input[name='anteil_kuehlung_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
}
|
||||
}
|
||||
|
||||
// Alternative Energieversorgungssysteme
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
|
||||
|
||||
// Gebäudetyp
|
||||
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Gebäudeteil
|
||||
cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Lüftung
|
||||
cy.get("select[name='lueftung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Kühlung
|
||||
cy.get("select[name='kuehlung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Leerstand
|
||||
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
|
||||
|
||||
// Heizungsanlage Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
|
||||
|
||||
// Heizungsanlage Bilder
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Fenster Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
|
||||
|
||||
// Fenster Bilder
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Wärmedämmung Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
|
||||
|
||||
// Wärmedämmung Bilder
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Gebäude Bild
|
||||
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
|
||||
|
||||
// Jetzt können wir den Verbrauchsausweis erstellen.
|
||||
cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
|
||||
|
||||
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
|
||||
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
|
||||
cy.get("button[name='registrieren']").click();
|
||||
|
||||
const email = faker.internet.email();
|
||||
const passwort = faker.internet.password();
|
||||
const vorname = faker.person.firstName();
|
||||
const nachname = faker.person.lastName();
|
||||
|
||||
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
|
||||
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
|
||||
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
|
||||
|
||||
cy.get("form[name='signup'] button[type='submit']").click();
|
||||
|
||||
// Wir sind jetzt registriert und können uns nun einloggen.
|
||||
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
|
||||
cy.get("form[name='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
|
||||
cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
|
||||
cy.get("form[name='login'] button[type='submit']").click();
|
||||
|
||||
// Der Ausweis sollte jetzt schon erstellt worden sein.
|
||||
});
|
||||
});
|
||||
@@ -1,282 +0,0 @@
|
||||
import fuelList from "#components/Ausweis/brennstoffListe";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import "cypress-file-upload"
|
||||
|
||||
describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
|
||||
cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohnen");
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
|
||||
cy.get("input[name='ausstellgrund']")
|
||||
.should("have.length", Object.values(Enums.Ausstellgrund).length)
|
||||
.eq(
|
||||
faker.number.int({
|
||||
min: 0,
|
||||
max: Object.values(Enums.Ausstellgrund).length - 1,
|
||||
})
|
||||
)
|
||||
.check();
|
||||
|
||||
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
|
||||
cy.get("input[name='baujahr_gebaeude']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(
|
||||
faker.number.int({ min: 1900, max: 2021 }).toString() +
|
||||
"{enter}",
|
||||
{ delay: 50 }
|
||||
);
|
||||
|
||||
// Jetzt Füllen wir das Baujahr der Heizung aus.
|
||||
cy.get("input[name='baujahr_heizung']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(
|
||||
faker.number.int({ min: 1900, max: 2021 }).toString() +
|
||||
"{enter}",
|
||||
{ delay: 50 }
|
||||
);
|
||||
|
||||
// Anzahl Einheiten
|
||||
cy.get("input[name='einheiten']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 1, max: 5 }).toString());
|
||||
|
||||
// Sanierungsstatus
|
||||
cy.get("select[name='saniert']").select(
|
||||
Math.random() > 0.5 ? "true" : "false"
|
||||
);
|
||||
|
||||
// Adresse
|
||||
cy.get("input[name='adresse']").type(faker.location.streetAddress());
|
||||
|
||||
// Postleitzahl
|
||||
cy.get("input[name='plz']").type(
|
||||
faker.location.zipCode({
|
||||
format: "#####",
|
||||
})
|
||||
);
|
||||
|
||||
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
|
||||
|
||||
// Flaeche
|
||||
cy.get("input[name='flaeche']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// Nutzflaeche
|
||||
cy.get("input[name='nutzflaeche']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// Keller
|
||||
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
max: Object.values(Enums.Heizungsstatus).length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
// Dachgeschoss
|
||||
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
max: Object.values(Enums.Heizungsstatus).length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
// Brennstoff und Einheit 1
|
||||
const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
|
||||
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
|
||||
|
||||
// Verbrauchszeitraum
|
||||
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
|
||||
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
|
||||
|
||||
const zusaetzlicheHeizquelle = Math.random() > 0.5;
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
cy.get("input[name='zusaetzliche_heizquelle']").check();
|
||||
|
||||
// Brennstoff und Einheit 2
|
||||
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
|
||||
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
}
|
||||
|
||||
// Warmwasser enthalten und bekannt
|
||||
const warmwasserEnthalten = Math.random() > 0.5;
|
||||
const anteilBekannt = Math.random() > 0.5;
|
||||
|
||||
if (warmwasserEnthalten) {
|
||||
cy.get("input[name='warmwasser_enthalten']").check();
|
||||
|
||||
if (anteilBekannt) {
|
||||
// Der Anteil ist bekannt, wir müssen ihn also angeben.
|
||||
cy.get("input[name='warmwasser_anteil_bekannt']").check();
|
||||
|
||||
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
|
||||
cy.get("input[name='anteil_warmwasser_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Alternative Energieversorgungssysteme
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
|
||||
|
||||
// Gebäudetyp
|
||||
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Gebäudeteil
|
||||
cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Lüftung
|
||||
cy.get("select[name='lueftung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Kühlung
|
||||
cy.get("select[name='kuehlung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Leerstand
|
||||
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
|
||||
|
||||
// Heizungsanlage Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
|
||||
|
||||
// Heizungsanlage Bilder
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Fenster Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
|
||||
|
||||
// Fenster Bilder
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Wärmedämmung Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
|
||||
|
||||
// Wärmedämmung Bilder
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Gebäude Bild
|
||||
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
|
||||
|
||||
// Jetzt können wir den Verbrauchsausweis erstellen.
|
||||
cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
|
||||
|
||||
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
|
||||
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
|
||||
cy.get("button[name='registrieren']").click();
|
||||
|
||||
const email = faker.internet.email();
|
||||
const passwort = "test1234";
|
||||
const vorname = faker.person.firstName();
|
||||
const nachname = faker.person.lastName();
|
||||
|
||||
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
|
||||
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
|
||||
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
|
||||
|
||||
cy.get("form[name='signup'] button[type='submit']").click();
|
||||
|
||||
// Wir sind jetzt registriert und können uns nun einloggen.
|
||||
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
|
||||
cy.get("form[name='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
|
||||
cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
|
||||
cy.get("form[name='login'] button[type='submit']").click();
|
||||
|
||||
// Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
|
||||
cy.url().should("contain", "/kundendaten");
|
||||
|
||||
cy.wait(1000)
|
||||
|
||||
// Wir füllen jetzt die Kundendaten aus.
|
||||
cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
|
||||
cy.get("input[name='vorname']").should("contain.value", vorname);
|
||||
cy.get("input[name='name']").should("contain.value", nachname);
|
||||
cy.get("input[name='email']").should("contain.value", email);
|
||||
cy.get("input[name='telefon']").type(faker.phone.number());
|
||||
|
||||
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
|
||||
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
|
||||
// TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
|
||||
cy.get("input[name='rechnung_plz']").type("2103");
|
||||
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
|
||||
cy.get("div[data-test='plz-container']").children().first().click();
|
||||
cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
|
||||
cy.get("input[name='rechnung_email']").type(faker.internet.email());
|
||||
cy.get("button[data-test='paypal']").click();
|
||||
|
||||
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
|
||||
cy.get("input[name='agb-akzeptieren']").check()
|
||||
cy.get("input[name='datenschutz-akzeptieren']").check()
|
||||
cy.get("button[type='submit']").click();
|
||||
|
||||
cy.origin('https://www.mollie.com', () => {
|
||||
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
|
||||
cy.get("input[type='radio'][name='final_state'][value='paid']").check();
|
||||
// Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
|
||||
})
|
||||
});
|
||||
});
|
||||
|
After Width: | Height: | Size: 141 KiB |
@@ -1,37 +0,0 @@
|
||||
/// <reference types="cypress" />
|
||||
// ***********************************************
|
||||
// This example commands.ts shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
//
|
||||
// declare global {
|
||||
// namespace Cypress {
|
||||
// interface Chainable {
|
||||
// login(email: string, password: string): Chainable<void>
|
||||
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@@ -1,26 +1,9 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
ibcornelsen-online-energieausweis:
|
||||
database:
|
||||
build: ./
|
||||
command: bun run dev --host
|
||||
environment:
|
||||
PORT: 3000
|
||||
NODE_ENV: "development"
|
||||
restart: always
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
- ./:/online-energieausweis
|
||||
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
|
||||
- ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database
|
||||
- ./node_modules/@ibcornelsen/api:/online-energieausweis/node_modules/@ibcornelsen/api
|
||||
- ./node_modules/radix-svelte-icons:/online-energieausweis/node_modules/radix-svelte-icons
|
||||
- ../api/persistent:/persistent
|
||||
ibcornelsen-api:
|
||||
extends:
|
||||
file: ../api/docker-compose.yml
|
||||
service: ibcornelsen-api
|
||||
ibcornelsen-database:
|
||||
extends:
|
||||
file: ../database/docker-compose.yml
|
||||
service: ibcornelsen-database
|
||||
- 5432:5432
|
||||
19
notes/ausweis-erstellung.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Ausweis Erstellung
|
||||
|
||||
Wenn ein neuer Nutzer auf unsere Seite kommt und einen Ausweis erstellen möchte muss er sich nicht unbedingt sofort registrieren. Um den Kunden ein reibungsloses Erlebnis zu bieten versuchen wir den Nutzer automatisch anzulegen, allerdings kann es sein, dass der Ausweis nicht weiter bearbeitet wird. In diesem Fall müssen wir den Ausweis nach einer Zeit wieder löschen, damit er nicht für immer in unserer Datenbank bleibt.
|
||||
|
||||
```tefcha
|
||||
Nutzer Kommt auf unsere Seite
|
||||
|
||||
if Nutzer ist eingeloggt
|
||||
Ausweis wird erstellt und Nutzer zugewiesen
|
||||
else
|
||||
Ausweis erstellen
|
||||
-> Schritt 2
|
||||
if Nutzer registriert sich
|
||||
Ausweis wird verknüpft
|
||||
else
|
||||
Ausweis nach einer Woche gelöscht
|
||||
|
||||
usw...
|
||||
```
|
||||
1521
openapi.json
Normal file
134
package.json
@@ -5,82 +5,110 @@
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "bun astro dev",
|
||||
"build": "bun --bun astro build",
|
||||
"preview": "bun --bun astro preview",
|
||||
"build": "bun astro build",
|
||||
"preview": "bun astro preview",
|
||||
"astro": "astro",
|
||||
"test:e2e": "cypress run",
|
||||
"test:unit": "bun test",
|
||||
"format": "prettier --write .",
|
||||
"build:production": "astro build && bun --bun server.js",
|
||||
"build:production": "astro build && bun --bun server.ts",
|
||||
"i18n:generate": "bunx astro-i18next generate",
|
||||
"prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma"
|
||||
"prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma",
|
||||
"openapi:generate": "bun astro-typesafe-api generate"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@astrojs/mdx": "^0.18.4",
|
||||
"@astrojs/node": "^5.1.4",
|
||||
"@astrojs/mdx": "^3.1.9",
|
||||
"@astrojs/node": "^8.3.4",
|
||||
"@astrojs/svelte": "^2.2.0",
|
||||
"@astrojs/tailwind": "^3.1.3",
|
||||
"@ibcornelsen/api": "link:@ibcornelsen/api",
|
||||
"@ibcornelsen/database": "link:@ibcornelsen/database",
|
||||
"@aws-sdk/client-s3": "^3.758.0",
|
||||
"@highlight-run/node": "^3.12.0",
|
||||
"@ibcornelsen/ui": "^0.0.2",
|
||||
"@mollie/api-client": "^3.7.0",
|
||||
"@pdfme/common": "^3.2.3",
|
||||
"@pdfme/generator": "^3.2.3",
|
||||
"@pdfme/ui": "^3.2.3",
|
||||
"@trpc/client": "^10.45.0",
|
||||
"@trpc/server": "^10.45.0",
|
||||
"astro": "^2.5.1",
|
||||
"astro-i18next": "1.0.0-beta.21",
|
||||
"astro-spa": "^1.3.9",
|
||||
"@mollie/api-client": "^4.1.0",
|
||||
"@pdfme/common": "^5.2.16",
|
||||
"@pdfme/generator": "^5.2.16",
|
||||
"@pdfme/ui": "^5.2.16",
|
||||
"@trpc/client": "^10.45.2",
|
||||
"@trpc/server": "^10.45.2",
|
||||
"astro": "^4.16.17",
|
||||
"astro-typesafe-api": "^0.2.4",
|
||||
"body-scroll-lock": "^4.0.0-beta.0",
|
||||
"buffer": "^6.0.3",
|
||||
"bun": "^1.0.2",
|
||||
"cookiejs": "^2.1.2",
|
||||
"bun": "^1.2.5",
|
||||
"csvtojson": "^2.0.10",
|
||||
"esbuild": "^0.18.17",
|
||||
"express": "^4.18.2",
|
||||
"flag-icons": "^6.9.2",
|
||||
"fontkit": "^2.0.2",
|
||||
"i18next": "^23.4.1",
|
||||
"i18next-fs-backend": "^2.1.5",
|
||||
"i18next-http-backend": "^2.2.1",
|
||||
"jimp": "^0.22.8",
|
||||
"express": "^4.21.2",
|
||||
"flag-icons": "^6.15.0",
|
||||
"fontkit": "^2.0.4",
|
||||
"highlight.run": "^9.14.0",
|
||||
"is-base64": "^1.1.0",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jwt-simple": "^0.5.6",
|
||||
"katex": "^0.16.7",
|
||||
"knex": "^2.4.2",
|
||||
"moment": "^2.29.4",
|
||||
"pg": "^8.11.0",
|
||||
"js-interpolate": "^1.3.2",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"mime": "^4.0.6",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.5.46",
|
||||
"nodemailer": "^6.10.0",
|
||||
"pdf-lib": "^1.17.1",
|
||||
"postcss-nested": "^7.0.2",
|
||||
"puppeteer": "^24.7.2",
|
||||
"radix-svelte-icons": "^1.0.0",
|
||||
"sass": "^1.62.1",
|
||||
"svelte": "^3.59.1",
|
||||
"sass": "^1.83.4",
|
||||
"sharp": "^0.33.5",
|
||||
"siema": "^1.5.1",
|
||||
"soap": "^1.1.8",
|
||||
"sqids": "^0.3.0",
|
||||
"ssh2-sftp-client": "^12.0.0",
|
||||
"svelte": "^3.59.2",
|
||||
"svelte-dialogs": "^1.2.2",
|
||||
"svelte-preprocess": "^5.0.3",
|
||||
"svelte-ripple-action": "^1.0.5",
|
||||
"svelte-tabs": "^1.1.0",
|
||||
"tailwindcss": "^3.3.2",
|
||||
"svelte-preprocess": "^5.1.4",
|
||||
"svelte-ripple-action": "^1.0.6",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"trpc-openapi": "^1.2.0",
|
||||
"uuid": "^9.0.0",
|
||||
"vite-tsconfig-paths": "^4.2.0",
|
||||
"zod": "^3.22.4"
|
||||
"uuid": "^9.0.1",
|
||||
"winston": "^3.17.0",
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@faker-js/faker": "^8.3.1",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
"@faker-js/faker": "^8.4.1",
|
||||
"@rollup/plugin-dsv": "^3.0.5",
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"@types/body-scroll-lock": "^3.1.2",
|
||||
"@types/fontkit": "^2.0.6",
|
||||
"@types/bun": "^1.2.2",
|
||||
"@types/express": "^5.0.0",
|
||||
"@types/fontkit": "^2.0.7",
|
||||
"@types/is-base64": "^1.1.3",
|
||||
"@types/js-cookie": "^3.0.6",
|
||||
"@types/uuid": "^9.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
||||
"@typescript-eslint/parser": "^5.59.6",
|
||||
"bun-types": "^1.0.22",
|
||||
"cypress": "^13.6.2",
|
||||
"@types/jsonwebtoken": "^9.0.7",
|
||||
"@types/nodemailer": "^6.4.17",
|
||||
"@types/papaparse": "^5.3.15",
|
||||
"@types/siema": "^1.4.11",
|
||||
"@types/ssh2-sftp-client": "^9.0.4",
|
||||
"@types/uuid": "^9.0.8",
|
||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||
"@typescript-eslint/parser": "^5.62.0",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"bun-types": "^1.1.45",
|
||||
"cypress": "^13.17.0",
|
||||
"cypress-file-upload": "^5.0.8",
|
||||
"daisyui": "^4.6.0",
|
||||
"cypress-vite": "^1.6.0",
|
||||
"eslint": "~8.15.0",
|
||||
"eslint-config-prettier": "8.1.0",
|
||||
"papaparse": "^5.5.2",
|
||||
"postcss": "^8.5.1",
|
||||
"postcss-import": "^16.1.0",
|
||||
"postcss-nesting": "^13.0.1",
|
||||
"prettier": "^2.8.8",
|
||||
"typescript": "^4.9.5"
|
||||
}
|
||||
}
|
||||
"prisma": "6.4.1",
|
||||
"prisma-dbml-generator": "^0.12.0",
|
||||
"prisma-generator-fake-data": "^0.14.3",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "^5.8.3",
|
||||
"zod-prisma": "^0.5.4"
|
||||
},
|
||||
"overrides": {
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"module": "index.ts"
|
||||
}
|
||||
BIN
persistent/images/haken.png
Normal file
|
After Width: | Height: | Size: 256 B |
BIN
persistent/images/img-00114710-09d3-4a60-a7e1-44e651b1e4df.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
persistent/images/img-00a51279-518a-4c93-a7ac-08daffca4fc6.jpg
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-03e4258e-2fb5-422d-b435-2a7129bcabf3.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-06b354f2-1314-4f66-8c6d-b8e4834a6090.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-1017697d-6806-431f-8cb0-083be6851402.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-12cefef0-5406-4fa5-8b47-cbdf5940b2b3.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-1cb30f8a-d662-47a1-8107-d09c0069a023.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-1fc02565-7612-431a-aa6c-59911f5c7a73.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-2944c8e8-6d98-4bed-8392-4f6d0d580aaa.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-29e650e4-c16a-4ad1-b136-967180359809.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-2d2dcc3f-2815-4294-a651-43248ba9585f.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-2d5c83d6-023e-4848-bef1-44fd988098c3.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-2db2d211-3119-4f2a-b6c4-2af1c0a29682.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-2e9e796c-2805-4c3c-b8aa-6fce85a44fc5.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-30288120-6f40-4419-87ba-a0efd59960b8.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-3af4bd33-ae3f-4a62-94f2-c43ffccb2fd1.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-3f384947-1020-41f7-bce0-7f0a496422c7.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-40d15e43-94a3-429c-86be-671f77666094.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-4219127e-38ad-4ef1-bdd7-6aaa1bba15e5.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-425b7b43-c12f-43eb-b20b-5ea23bae2712.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-4387f4e8-4a93-4fc9-9ba4-e5129bb682cc.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-461f1e91-33b3-45a6-93d6-ca4ce423af34.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-486b00ac-5c3a-4f53-90de-8c0a2f9ad486.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-50622919-3829-4e97-b231-e32a32e5342c.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-53cc77f5-940f-4fcb-b21c-fb46e1d6aaaf.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-54ad8b76-c545-4da3-9beb-2838c6f9b37a.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-5771a1f3-64bc-4ccc-8d8b-fd7eb91ab57b.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-61d719ce-8fca-4569-b094-1f23552078c5.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-6475bf75-b46d-4359-bd17-79c4e3593b59.webp
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
persistent/images/img-694ca166-c339-44df-9240-0bb642291459.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-69978803-a0f5-4f1e-97fb-05e7335a0212.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-6d6b2565-56a4-4ebd-a41d-3e41d356c9ab.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-6e61e1ec-b531-45fd-be65-70174cc3c7d3.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-6ea9fadd-975c-4189-be05-5b539b1a7321.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-741ae0ba-9f33-4eb5-adfc-391e29dcdbdc.jpg
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-74790f80-8087-40b2-937e-e05b757672c5.webp
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
persistent/images/img-7541c7d6-c2b3-4501-a671-e53d6bf0a6f2.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-790bb080-9041-4095-82a0-e7c7d8b84d84.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-7a27716e-f935-4677-ac38-e2db8f39e4ff.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-7a4aa035-c9b1-4126-b4ec-e7b5e93be812.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-7b84aae5-c90f-46c2-afd9-41c572b116bf.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-7ba05951-aebd-45e6-bcb7-b70a29fef512.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-7edbdd0b-dca8-4db8-8a82-3df2b451669b.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-85f8a7cd-7351-408f-8576-6d7b9d0ac82b.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
persistent/images/img-87064632-ef07-4fb9-b02c-72521db6ac75.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-88d7a851-b49e-413f-aebd-1f4ca386c44a.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-8bae768b-e642-4672-ba74-88e0de619131.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-8be88072-7bdd-43e2-a5b4-1a716f934762.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-91a8a9df-de56-41f5-80cd-f60852c240d8.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-93040a69-8b48-4749-8c8d-581d76e74cae.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-9528ab28-6588-4703-bbc8-3509e3c97cd3.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-9b941945-bfbe-4ca9-b57b-240abc7ae6d4.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
persistent/images/img-a4e04cf7-9443-4462-9582-3c18b33ef711.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
persistent/images/img-a50b7f82-0add-4e3a-bb42-3f9b2e49936a.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-a5e90e6b-9793-4127-a44c-3129abe91815.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-a6837d4d-87c7-4af5-8956-c2642f652b41.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-ab21f3f6-82c1-44c4-ba01-6d0ea32ba0b9.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
persistent/images/img-ade4310c-ac6c-49e1-9348-57b8ba155cc4.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-ae368fad-72ed-482d-a210-8319f5404b2c.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-af39ffd3-389b-43a4-9afb-5e82020dc5b0.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-b51adbda-0ca2-441e-a40d-b3e6027c23df.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-b5a715ac-38a8-4a2b-86d0-fb1d3b20213f.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-b9e2bf27-2330-45c9-afa1-e97429151eb8.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-bc4f9c3e-b74c-450b-9109-6de7d6023521.webp
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
persistent/images/img-bd5d3046-7f93-485b-8b7b-2f4844144736.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
persistent/images/img-c66402e7-1bc5-4d44-82c8-5d682ef9694e.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-d4c272b1-977c-4ce8-9821-ead67bce7cc4.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
persistent/images/img-e1c07d92-2272-45f6-a7c9-1e94022c5814.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-e2b2f430-4cd8-4042-accb-e4bef9eee68c.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-e7269e2e-de35-491a-b24e-76bde9d88ac0.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
persistent/images/img-e813ba90-fa2d-4de9-85ee-5d9a4e26dfc6.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
persistent/images/img-ea69cea0-813a-469e-b603-2ae68086001a.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |